Bộ trình dịch GNU ( - thường được viết tắt thành GCC) là một tập hợp các trình biên dịch được thiết kế cho nhiều ngôn ngữ lập trình khác nhau. GCC là một thành phần quan trọng của GNU toolchain, và được hầu hết các hệ điều hành giống Unix, như Linux và Mac OS X chọn làm trình dịch tiêu chuẩn. Các dòng hệ điều hành BSD đa phần đều sử dụng GCC, dù một số dòng như FreeBSD và OpenBSD lại sử dụng Clang làm trình biên dịch chuẩn. Các phiên bản sau đó của GCC cũng hỗ trợ trên cả Microsoft Windows và một số hệ điều hành khác. GCC cũng có thể biên dịch chương trình cho cả Android và iOS.
Tên gốc của GCC là GNU C Compiler (Trình biên dịch C của GNU), do ban đầu nó chỉ hỗ trợ dịch ngôn ngữ lập trình C, GCC 1.0 được phát hành vào năm 1987, sau đó được mở rộng hỗ trợ dịch C++ vào tháng 12 cùng năm đó. Các thành phần đầu vào của trình biên dịch (front end) sau đó cũng được phát triển cho các ngôn ngữ lập trình Fortran, Pascal, Objective C, Java, Ada, Go và một số ngôn ngữ khác.
GCC đã tương thích với rất nhiều nền tảng kiến trúc máy tính đa dạng, và được sử dụng rộng rãi như một công cụ làm môi trường phát triển các phần mềm thương mại, có bản quyền và nguồn đóng. GCC cũng có thể dùng trong hầu hết các hệ thống nhúng (embedded system), như Symbian (gọi là gcce), kiến trúc ARM, AMCC, Freescale Power Architecture trên chip (Freescale Power ISA-based chips), và nhiều hệ thống nhúng khác. GCC cũng được phát triển cho nhiều nền tảng khác, bao gồm cả những nền tảng video game như Playstation 2, Cell SPE of PlayStation 3 và Sega Dreamcast.
Quỹ Phần mềm Tự do (Free Software Foundation, viết tắt là FSF) phân phối GCC dưới giấy phép công cộng GNU (GNU GPL) và giấy phép công cộng cấp thấp GNU (GNU LGPL). GCC cũng đóng một vai trò quan trọng trong lịch sử phát triển của phần mềm tự do. Những công ty như CodeSourcery kinh doanh bằng cách hỗ trợ và phát triển tính tương thích của GCC với đa dạng các nền tảng, còn các nhà sản xuất chip ngày nay thì cho rằng một kiến trúc thành công thì phải có yếu tố cần thiết là sự tương thích với GCC.
Lịch sử phát triển
Richard Stallman bắt đầu phát triển GCC từ năm 1985. Ông đã mở rộng một trình dịch có sẵn để dịch ngôn ngữ C. Trình dịch nguyên dùng để dịch ngôn ngữ Pastel, một phần mở rộng và không tương thích với ngôn ngữ Pascal, và được viết bằng Pastel. Nó đã được Len Tower và Stallman viết lại bằng ngôn ngữ C, và được cho ra mắt năm 1987 trong vai trò là trình dịch cho dự án GNU, nhằm mục đích tạo ra một trình dịch miễn phí. Quá trình phát triển GCC được giám sát bởi quỹ phần mềm tự do Chi tiết về các lịch trình công bố của GCC được đăng tại: http://gcc.gnu.org/releases.html
EGCS
Đến năm 1991, GCC 1.x đã đạt đến độ ổn định, nhưng những hạn chế trong thiết kế đã cản trở nhiều đòi hỏi cải thiện, do đó quỹ phần mềm tự do (FSF) đã bắt đầu phát triển phiên bản 2.x. Nhưng suốt những năm giữa thập kỷ 90, FSF không công khai những gì được đưa thêm vào phiên bản chính thức của GCC 2.x, đến nỗi GCC đã được Eric S. Raymond đưa vào bài luận The Cathedral and the Bazaar của ông - một bài luận về kỹ nghệ phần mềm - như một ví dụ cho mô hình phát triển "cathedral".
Do GCC là phần mềm tự do, nhiều nhà lập trình muốn sử dụng nó để phát triển các ứng dụng dùng ngôn ngữ khác ngôn ngữ C, đã tự do phát triển trình dịch này thành các nhánh khác nhau của riêng mình. Quá nhiều bản phân phối dẫn đến việc khó sử dụng và thiếu hiệu quả, tuy nhiên, phiên bản chính thức thì cũng không làm hài lòng nhiều người do không đáp ứng được nhu cầu sử dụng của họ.
Đến năm 1997, một nhóm các nhà phát triển lấy tên EGCS, đã hợp nhất nhiều nhánh của trình dịch này thành một dự án duy nhất. Quá trình hợp nhất cơ bản được tiến hành ở giữa hai phiên bản 2.7 và 2.81. Các dự án được hợp nhất có cả g77 của Fortran, PGCC (tối ưu GCC), các cải thiện về C++, và nhiều nhánh trên các kiến trúc và hệ điều hành khác nhau.
Quá trình phát triển EGCS đã chứng tỏ sự vượt bậc đáng kể hơn so với sự phát triển của GCC, do đó FSF đã chính thức tạm dừng chương trình phát triển GCC 2.x của họ, phiên bản EGCS trở thành bản phân phối chính thức của GCC còn dự án EGCS được bổ nhiệm làm nhiệm vụ bảo trì và phát triển GCC từ tháng 4 năm 1999. Ngoài ra, dự án quyết định chọn mô hình phát triển "bazaar" thay cho mô hình "cathedral". Với phiên bản GCC 2.95 được công bố vào tháng 7 năm 1999, hai dự án một lần nữa đã hợp nhất.
Sử dụng
GCC thường được lựa chọn làm trình dịch để phát triển các sản phẩm phần mềm yêu cầu phải chạy trên nhiều nền tảng phần cứng đa dạng. Sự khác biệt trong các trình dịch địa phương (chỉ dùng cho nền tảng đó) dẫn đến việc phát triển các đoạn mã để có thể dịch chính xác ở tất cả các trình dịch hay xây dựng các lệnh có thể chạy ở tất cả các nền tảng là hết sức khó khăn. Trong khi nếu dùng GCC, cùng một cú pháp có thể được dùng cho mọi nền tảng, do đó nếu đoạn mã có thể dịch chính xác ở một trong các nền tảng, cơ hội dịch chính xác ở các nền tảng khác sẽ cao hơn nhiều.
GCC hiện nay được bảo trì bởi rất nhiều nhóm phát triển trên khắp thế giới. Nó đã trở nên tương thích với nhiều loại CPU và hệ điều hành hơn bất cứ trình dịch nào khác.
Ngôn ngữ
Phiên bản tiêu chuẩn 4.3 bao gồm hỗ trợ đầu vào cho: C, C++ (G++), Java (GCJ), Ada (GNAT), Objective-C, Objective-C++, và Fortran (GFortran). Các ngôn ngữ có hỗ trợ, nhưng không thuộc tiêu chuẩn bao gồm: Modula-2, Modula-3, Pascal, PL/I, D (gdc), Mercury, VHDL (GHDL). Một ngôn ngữ mở rộng khá phổ biến là OpenMP cũng được hỗ trợ.
Các kiến trúc
GCC phiên bản 4.3 tương thích với các vi xử lý:
- Alpha
- ARM
- Atmel AVR
- Blackfin
- HC12
- H8/300
- IA-32 (x86)
- x86-64
- IA-64
- Motorola 68000
- MIPS
- PA-RISC
- PDP-11
- PowerPC
- R8C/M16C/M32C
- SPU
- System/390/zSeries
- SuperH
- SPARC
- VAX
Các vi xử lý ít thông dụng được phiên bản tiêu chuẩn hỗ trợ gồm có:
- A29K
- ARC
- ETRAX CRIS
- D30V
- DSP16xx
- FR-30
- FR-V
- Intel i960
- IP2000
- M32R
- 68HC11
- MCORE
- MMIX
- MN10200
- MN10300
- Motorola 88000
- NS32K
- ROMP
- Stormy16
- V850
- Xtensa
- AVR32
Các vi xử lý được hỗ trợ bởi các phiên bản GCC do FSF phát triển riêng gồm có:
- D10V
- LatticeMico32
- MeP
- Motorola 6809
- MicroBlaze
- MSP430
- Nios II và Nios
- PDP-10
- TIGCC (m68k variant)
- Z8000
- PIC24/dsPIC
Cấu trúc
Giao diện ngoài của GCC nhìn chung là tiêu chuẩn cho một trình dịch của Unix. Người dùng sẽ gọi đến một chương trình điều khiển có tên là gcc
, có nhiệm vụ thông dịch các lệnh và đối số, và đưa ra quyết định trình dịch cho ngôn ngữ nào sẽ được chọn đối với từng tập tin đầu vào, chạy chương trình dịch mã máy ở đầu ra quá trình này, sau đó sẽ liên kết mã nguồn để tạo ra chương trình mã nhị phân thực thi.
Mỗi trình dịch của một ngôn ngữ là một chương trình tách biệt đưa vào đầu vào mã nguồn và đưa ra mã hợp ngữ. Tất cả đều có một cấu trúc thông thường bên trong.
Gần như toàn bộ GCC được viết bằng ngôn ngữ C ngoại trừ chương trình khởi tạo cho Ada; rất nhiều phần của trình khởi tạo cho Ada được viết bằng chính ngôn ngữ Ada.
Gỡ lỗi các chương trình với GCC
Công cụ cơ bản để sửa lỗi các đoạn mã GCC là trình gỡ lỗi GNU (gdb). Ngoài ra cũng có các công cụ chuyên dụng hơn như Valgrind dùng để tìm lỗi bộ nhớ và các lỗ hổng. Chương trình GNU Profiler (gprof) có thể cho biết thời gian dùng để chạy chương trình, cũng như tần suất được gọi đến của hàm có thường xuyên hay không; điều này đòi hỏi các chương trình phải được dịch với các tùy chọn profiling.
Bản quyền
"GCC 4.2.1 là phiên bản cuối cùng được phân phối bằng giấy phép công cộng GNU phiên bản 2. Tất cả những phiên bản tiếp theo sẽ được phân phối bởi giấy phép cùng loại phiên bản 3."
👁️
2 | 🔗 | 💖 | ✨ | 🌍 | ⌚
**Bộ trình dịch GNU** ( - thường được viết tắt thành **GCC**) là một tập hợp các trình biên dịch được thiết kế cho nhiều ngôn ngữ lập trình khác nhau. GCC là một thành
**Pascal** là một ngôn ngữ lập trình cho máy tính thuộc dạng mệnh lệnh và thủ tục, được Niklaus Wirth phát triển vào năm 1970. Pascal là ngôn ngữ lập trình đặc biệt thích hợp
nhỏ|phải|Logo GPLv3 Biểu trưng "Heckert" của GNU **Giấy phép Công cộng GNU** (tiếng Anh: _GNU General Public License_, viết tắt **GNU GPL** hay chỉ **GPL**) là giấy phép phần mềm tự do được sử dụng
**Clang** là một front-end trình biên dịch (_compiler front end_) cho các ngôn ngữ lập trình C, C ++, Objective-C , cũng như khung OpenMP, OpenCL, RenderScript và CUDA. Nó sử dụng cơ sở
**Dev-C++** là một môi trường phát triển tích hợp (IDE) đầy đủ tính năng miễn phí được phân phối theo Giấy phép Công cộng GNU để lập trình trong C và C++. Ban đầu nó
**C** là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó, ngôn ngữ này đã lan rộng ra nhiều
phải|Biểu đồ hoạt động của một trình biên dịch lý tưởng. **Trình biên dịch** () hay **phần mềm biên dịch** là một chương trình máy tính làm công việc dịch một chuỗi các câu lệnh
nhỏ|Ảnh chụp màn hình tài liệu [[API web viết bởi NASA]] Một **giao diện lập trình ứng dụng** (, viết tắt: _API_) là một giao diện mà một hệ thống máy tính hay ứng dụng
**Ngôn ngữ biên dịch** (tiếng Anh: _compiled language_) là ngôn ngữ lập trình có triển khai thường là trình biên dịch (bộ dịch tạo ra mã máy từ mã nguồn), chứ không phải trình thông
**Phần mềm tự do nguồn mở** (Tiếng Anh: _Free and open-source software_ (Viết tắt là F/OSS, FOSS) hoặc _Free/Libre/open-source software_ (Viết tắt là FLOSS)) là loại phần mềm được bao gồm Phần mềm tự do
**Giấy phép Công cộng GNU Hạn chế** (tiếng Anh: _GNU Lesser General Public License_, viết tắt **LGPL**) là một giấy phép phần mềm tự do nguồn mở được phát hành bởi Quỹ Phần mềm Tự
thế=|nhỏ|300x300px|[[Giao diện nhân Linux|Linux API được cấu thành từ System Call Interface của nhân Linux, GNU C Library (của GNU), libdrm, libalsa và libevdev (củafreedesktop.org).]] thế=|nhỏ|300x300px|GNU C Library là một trình bao bọc xung quanh
nhỏ|235x235px| Logo GNU nhỏ|235x235px| Richard M. Stallman (ảnh bìa cho cuốn sách của [[O'Reilly Media _Free as in Freedom_) ]] **_Tuyên ngôn GNU_** được Richard Stallman viết và xuất bản vào tháng 3 năm 1985
Chương trình **GNU Privacy Guard** (GnuPG hay là GPG) là một phần mềm tự do được viết nhằm mục đích thay thế bộ phần mềm mật mã hóa PGP và được phổ biến với giấy
**Java** (phiên âm Tiếng Việt: "_Gia-va_") là một ngôn ngữ lập trình hướng đối tượng, dựa trên lớp được thiết kế để có càng ít phụ thuộc thực thi càng tốt. Nó là ngôn ngữ
**R** là một ngôn ngữ lập trình và môi trường phần mềm dành cho tính toán và đồ họa thống kê. Đây là một bản hiện thực ngôn ngữ lập trình S với ngữ nghĩa
**Vim** (; viết tắt của **Vi IMproved**) là một trình soạn thảo văn bản miễn phí và mã nguồn mở. Đó là một bản sao cải tiến của vi của Bill Joy cho Unix. Nó
thumb|upright|Biểu đồ dòng thời gian cho thấy sự phát triển của các [[bản phân phối Linux, với mỗi nhánh rẽ trong sơ đồ được gọi là "một fork".]] Trong phát triển phần mềm, **fork** ()
**Cú pháp ngôn ngữ (lập trình) C** là tập hợp các quy tắc nhằm xác định cách thức để viết và dịch trong ngôn ngữ lập trình C. :Thí dụ:
// Dòng này sẽ
Một "trình biên dịch của trình biên dịch" hay "chương trình sinh trình biên dịch" (tiếng Anh: compiler-compiler) là một công cụ tạo ra bộ phân tích cú pháp, trình thông dịch hoặc trình biên
**RISC-V** (phát âm là "risk-five") là một kiến trúc tập lệnh (ISA) mã nguồn mở dựa trên kiến trúc tập lệnh _máy tính với tập lệnh đơn giản hóa_ (RISC). Dự án bắt đầu từ
**ESP8266**, hay gọi đầy đủ là **ESP8266EX** là một vi mạch Wi-Fi giá rẻ, có hỗ trợ bộ giao thức TCP/IP và có thể tích hợp vào thành phần của vi điều khiển, được sản
**Sarge** là tên mã của bản phân phối Debian GNU/Linux phiên bản 3.1. Nó được đặt theo tên của nhân vật Sarge trong phim hoạt hình _Toy Story_, và hầu hết tên mã của các
**Gecko** là một bộ máy trình bày được phát triển bởi Mozilla. Nó được sử dụng trong trình duyệt Firefox, email client Thunderbird và nhiều dự án khác Gecko được thiết kế để hỗ trợ
[[KDE 3.5]] [[GNOME 2.12.0]] Trong khoa học máy tính, **Hệ thống X Window** (còn được gọi tắt là **X11** hay **X**) là một windowing system dùng để hiển thị đồ họa bitmap. Nó cung ứng
**Richard Matthew Stallman** (thường được viết tắt là RMS) (sinh 16 tháng 3 năm 1953), là một nhà hoạt động vì phần mềm tự do, một hacker (hiểu theo nghĩa tốt của từ này -
Trong khoa học máy tính, **hàm nội tuyến** (tiếng Anh: _inline function_) là một cấu trúc trong ngôn ngữ lập trình được sử dụng để đề nghị với chương trình biên dịch rằng một hàm
**Linh dương đầu bò xanh** (tiếng Anh: **blue wildebeest**; danh pháp hai phần: _Connochaetes taurinus_), cũng được gọi là _linh dương đầu bò thông thường_ (common wildebeest), _linh dương đầu bò râu trắng_ (white-bearded wildebeest)
Trong lập trình máy tính, **Hợp ngữ** (hay **assembly**) thường được viết tắt là **asm** là bất kỳ ngôn ngữ lập trình cấp thấp nào có sự tương ứng rất mạnh giữa các tập lệnh
**WebKit** là một engine trình duyệt nguồn mở cung cấp các thành phần cần thiết để xây dựng một trình duyệt web. WebKit được Apple Inc. chính thức nhận từ thư viện phần mềm KHTML
**translatewiki.net** là một ứng dụng dịch thuật trên nền web, được hỗ trợ bởi tiện ích biên dịch mở rộng cho MediaWiki, nó là công cụ hỗ trợ MediaWiki trong việc dịch thuật nhiều ngôn
**Bộ công cụ phát triển phần mềm** (tiếng Anh: **software development kit**, viết tắt là **SDK**) là một gói các công cụ phát triển phần mềm (software development) trong một gói có thể cài đặt.
nhỏ|Linux API, Linux ABI, API và ABI trong nhân **Nhân Linux** cung cấp một số giao diện cho các ứng dụng ở không gian người dùng sử dụng cho các mục đích khác nhau và
**Object Pascal** chỉ đến một nhánh của phát sinh hướng đối tượng của Pascal, được biết đến chủ yếu với vai trò ngôn ngữ lập trình chính của Delphi. ## Lịch sử ban đầu tại
**Gnutella** (không liên quan đến Dự án GNU, tên có thể được bắt nguồn từ sự tương tự với Dự án GNU) là một mạng ngang hàng lớn. Đó là mạng ngang hàng phi tập
**GNOME** () - là bộ phần mềm cung cấp môi trường màn hình nền dễ dùng cho hệ điều hành Linux cũng như cho các hệ điều hành khác. GNOME từng là tên viết tắt
:_Bài này nói về trình soạn thảo văn bản. Về kiểu máy tính của Apple Macintosh, xem eMac._ **Emacs** là trình soạn thảo văn bản đa chức năng. Đây là phần mềm tự do, chạy
**Free Pascal Compiler** (**FPC**) là một trình biên dịch cho các ngôn ngữ lập trình có liên quan chặt chẽ, Pascal và Object Pascal. Nó là phần mềm tự do được phát hành theo Giấy
Persistence of Vision Raytracer (**POV-Ray**, tạm dịch: **Chương trình dò tia thị giác**) là một chương trình dò tia khả dụng cho nhiều nền tảng hệ điều hành khác nhau. Nguồn gốc phát triển là
Cygwin chạy trên Windows; trên đó ta thấy hai cửa sổ chạy [[mintty của Cygwin.]] **Cygwin** là môi trường *nix trong Windows bằng cách tạo một lớp tương thích. Thông qua đó người dùng Windows
**Vuze** (trước đây có tên **Azureus**) là một trình khách BitTorrent tự do dùng để trao đổi tập tin thông qua giao thức BitTorrent. Vuze được viết bằng Java, và sử dụng Bộ máy Azureus.
nhỏ|100x100px|Logo Virtualbox từ năm 2010-2025 nhỏ|64x64px|Logo của VirtualBox OSE, 2007–2010 **Oracle VM VirtualBox** (Trước đây là **Sun VirtualBox**, **Sun xVM VirtualBox** và **Innotek VirtualBox**) là một hosted hypervisor tự do nguồn mở phát triền bởi
nhỏ| Một sơ đồ cho thấy cách người dùng tương tác với [[phần mềm ứng dụng trên một máy tính để bàn thông thường. Lớp phần mềm ứng dụng giao tiếp với hệ điều hành,
**Symbian** là một hệ điều hành đã ngừng phát triển được viết và sử dụng phổ biến cho hầu như điện thoại di động của những năm 90 và đầu thế kỉ 21. Symbian ban
phải|nhỏ|Một hình ảnh tạo bởi YafaRay mô tả các phần của [[động cơ pit-tông tạo mô hình trong Blender.]] **YafaRay** (gốc là **YafRay**, **Y**et **A**nother **F**ree **Ray**tracer - lại một chương trình dò tia miễn
thumb|right|Một _hệ thống nhúng_ trên thẻ trình cắm có bộ xử lý, bộ nhớ, nguồn điện và giao diện bên ngoài **Hệ thống nhúng** () là một thuật ngữ để chỉ một hệ thống có
**LaTeX** ( hoặc ), cách điệu trong hệ thống là là một hệ thống phần mềm để soạn thảo tài liệu. Khi viết, người viết sử dụng văn bản thuần túy, thay vì văn bản
**Skype** (IPA: /'skaɪp/) là một mạng điện thoại Internet ngang hàng được thành lập bởi Niklas Zennström và Janus Friis, cũng là những người thành lập ra ứng dụng chia sẻ tập tin Kazaa và
**cp** là lệnh Unix dùng để sao chép tập tin và thư mục. Lệnh có 3 chế độ hoạt động tùy theo đối số truyền vào: sao chép tập tin sang tập tin khác, sao
nhỏ|300x300px| So sánh cấp cao các API và ABI trong nhân-không gian người dùng và nội bộ nhân nhỏ|300x300px| [[Hạt nhân Linux|Nhân Linux và Thư viện GNU C định nghĩa API Linux. Sau khi biên