GNU Compiler Collection (biasanya disingkat GCC) adalah kompilator sistem yang dihasilkan oleh Proyek GNU mendukung berbagai bahasa pemrograman . GCC adalah komponen kunci dari GNU toolchain . Selain sebagai kompilator resmi yang belum selesai GNU sistem operasi, GCC telah diadopsi sebagai standar oleh sebagian besar kompiler modern lainnya seperti Unix- komputer sistem operasi , termasuk GNULinux , yang BSD keluarga dan Mac OS X . GCC telah porting untuk berbagai arsitektur prosesor , dan banyak digunakan sebagai alat dalam komersial, eksklusif dan perangkat lunak sumber tertutup pembangunan lingkungan. GCC juga tersedia untuk sebagian besar embedded platform, misalnya Symbian[2] AMCC dan FreescalePower Arsitektur berbasis-chip. Compiler dapat menargetkan berbagai platform, termasuk video game konsol seperti PlayStation 2dan Dreamcast . Beberapa perusahaan  membuat bisnis dari penyediaan dan mendukung port gcc untuk berbagai platform, dan produsen chip sekarang menganggap port GCC hampir penting bagi keberhasilan arsitektur.

Awalnya bernama GNU C Compiler, karena hanya menangani bahasa pemrograman C , GCC 1.0 dirilis pada tahun 1987, dan compiler diperpanjang untuk mengkompilasi C + + pada bulan Desember tahun itu. Front berakhir kemudian dikembangkan untuk FortranPascalObjective-CJava , dan Ada , antara lain.

The Free Software Foundation (FSF) mendistribusikan GCC di bawah GNU General Public License (GNU GPL). GCC adalah luas dianggap sebagai contoh yang kuat dari perangkat lunak bebas .

Sejarah

Richard Stallman mulai GCC pada tahun 1985. Dia mengulurkan sebuah compiler yang ada untuk mengkompilasi C. Compiler awalnya dikompilasi Pastel , sebuah nonportable, dialek diperpanjang dariPascal , dan ditulis dalam Pastel. Saat itu ditulis ulang di C oleh Len Tower dan Stallman, dan dirilis pada tahun 1987 sebagai compiler untuk proyek GNU, untuk memiliki compiler yang tersedia yang perangkat lunak bebas . pengembangannya diawasi oleh Free Software Foundation (FSF).

Pada 1991, 1.x GCC telah mencapai titik stabilitas, tapi keterbatasan arsitektur dicegah banyak perbaikan yang diinginkan, sehingga FSF mulai bekerja pada GCC 2.x.

Sebagai GCC merupakan perangkat lunak bebas, programer yang ingin bekerja di lain terutama yang menulis interface-arah untuk bahasa lain selain C -orang bebas untuk mengembangkan sendirigarpu dari compiler. Beberapa garpu terbukti tidak efisien dan berat, bagaimanapun, dan kesulitan dalam mendapatkan pekerjaan diterima oleh proyek GCC resmi sangat frustrasi bagi banyak orang.FSF terus kontrol yang begitu dekat pada apa yang telah ditambahkan ke versi resmi dari GCC GCC 2.x yang digunakan sebagai salah satu contoh dari katedral “model pembangunan” di Eric S. Raymond esai s ‘ Katedral dan Bazar .

Dengan rilis 4.4BSD pada tahun 1994, GCC menjadi compiler default untuk sistem BSD.

Garpu EGCS

Pada tahun 1997, sekelompok pengembang dibentuk EGCS (Experimental / Enhanced GNU Compiler System), [11] untuk menggabungkan beberapa eksperimen garpu ke dalam sebuah proyek tunggal. Dasar dari merger adalah pengembangan GCC snapshot diambil antara 2,7 dan 2,81 rilis. Proyek bergabung termasuk G77 ( Fortran ), PGCC ( Pentium -dioptimalkan GCC), banyak C + +perbaikan, dan arsitektur baru yang banyak dan sistem operasi varian. [12] [13]

pembangunan EGCS terbukti jauh lebih kuat dari pengembangan GCC, begitu banyak sehingga FSF resmi menghentikan pengembangan 2.x kompiler GCC mereka, “diberkati” EGCS sebagai versi resmi dari GCC dan proyek EGCS ditunjuk sebagai pengembang GCC pada bulan April 1999. Selain itu, proyek ini secara eksplisit telah mengadopsi “bazar” model atas model “katedral”. Dengan rilis GCC 2,95 pada bulan Juli 1999, dua proyek sekali lagi bersatu.

GCC dapat dipertahankan oleh sekelompok bervariasi programmer dari seluruh dunia. Telah porting ke lebih banyak jenis prosesor dan sistem operasi dibanding compiler lain.

Penggunaan

GCC compiler sering pilihan untuk mengembangkan perangkat lunak yang diperlukan untuk mengeksekusi pada berbagai hardware dan / atau sistem operasi. Sistem compiler-spesifik disediakan oleh perangkat keras atau vendor OS dapat berbeda secara substansial, rumit sumber baik perangkat lunak kode dan skrip yang memanggil compiler untuk membangunnya. Dengan GCC, sebagian besar kompiler adalah sama pada seluruh platform, sehingga hanya kode yang secara eksplisit menggunakan fitur platform-spesifik harus ditulis ulang sistem masing-masing.

Sekarang rilis GCC

Rilis stabil saat ini adalah GCC 4.5, dan dirilis pada tanggal 14 April 2010. Ini membawa beberapa fitur baru yang besar:

  • link-waktu optimasi (masing-masing sumber kompilasi menghasilkan, di samping instruksi mesin dalam file objek, suatu serialisasi dari beberapa Gimple representasi–termasuk dalam objek file; pada saat link, kompilator dijalankan lagi dan mampu mengoptimalkan kode di antara beberapa objek file)
  • plugin (compiler GCC dapat diperpanjang dan disesuaikan dengan kebutuhan tertentu dengan kode eksternal dimuat sebagai plugin). Beberapa plugins GCC muncul, terutama TreeHydra untuk membantu pada pengembangan kode Mozilla, DragonEgg untuk menggunakan GCC front-end dengan LLVM , dan MENCAIRNYA untuk kode ekstensi GCC di tingkat yang lebih tinggi lispy -bahasa domain spesifik memberikan kuat Pola pencocokan , dan MILEPOST CTuning untuk menggunakan mesin belajar teknik untuk tune compiler. Plugins dapat menginstal (menambah, mengganti, atau bahkan menghapus) lewat tengah-end baru, terutama yang beroperasi pada representasi Gimple.
  • lain yang harus dicapai (target baru, dialek bahasa baru).

Bahasa

Rilis compiler standar 4,3 mencakup berakhir depan untuk C (gcc), C + +g + + ), Jawagcj ), Adanyamuk ), Objective-Cgobjc ), Objective-C + +gobjc + + ), dan Fortrangfortran ). Juga tersedia, tapi tidak dalam standar adalah Modula-2Modula-3PascalGPC ), PL / IDGDC ), MerkuriusVHDLghdl ). [15] Sebuah bahasa paralel ekstensi populer, OpenMP , juga didukung.GCC komite pengarah baru saja mengumumkan bahwa mereka juga akan mendukung Go bahasa pemrograman di GCC 4.5 atau lebih baru. [16]

Akhir Fortran depan adalah G77 sebelum versi 4.0, yang hanya mendukung Fortran 77. Dalam versi yang lebih baru, G77 dijatuhkan mendukung baru GFortran ujung depan yang mendukung Fortran 95 dan bagian Fortran 2003 . Front-end untuk dingin dijatuhkan karena kurangnya pemeliharaan.

Sebuah cabang beberapa percobaan ada untuk mendukung bahasa tambahan, seperti GCC UPC compiler [18] untuk Paralel C Unified .

Struktur

Antarmuka eksternal’s GCC umumnya standar untuk UNIX compiler. Pengguna memanggil program driver bernama gcc , yang menafsirkan argumen perintah, memutuskan kompiler bahasa yang digunakan untuk setiap file input, menjalankan assembler pada output mereka, dan kemudian mungkin menjalankan linker untuk menghasilkan executable biner lengkap.

Setiap kompiler bahasa adalah program terpisah yang masukan kode sumber dan kode output perakitan. Semua memiliki struktur internal umum. A per-bahasa front end mem-parsing kode sumber dalam bahasa itu dan menghasilkan pohon sintaks abstrak (“pohon” untuk pendek).

Ini adalah, jika perlu, dikonversi ke-masukan yang akhir representasi tengah, disebut GENERIC formulir; akhir-tengah kemudian secara bertahap mengubah program menuju bentuk akhirnya. optimasi Compiler dan kode analisis statis teknik (seperti FORTIFY_SOURCE, compiler langsung dalam upaya untuk menemukan beberapa buffer overflows ) akan diterapkan pada kode. Ini bekerja pada beberapa representasi, kebanyakan arsitektur-independen GIMPLE representasi dan arsitektur-tergantung RTL representasi. Akhirnya, bahasa assembly yang dihasilkan menggunakan arsitektur-spesifik pencocokan pola awalnya berdasarkan algoritma Jack Davidson dan Chris Fraser .

GCC ditulis terutama di C kecuali untuk bagian Ada front end. distribusi termasuk perpustakaan standar untuk Ada, C + + , dan Java yang kode ini sebagian besar ditulis dalam bahasa-bahasa. Pada beberapa platform, distribusi juga mencakup tingkat runtime perpustakaan-rendah, libgcc, ditulis dalam sebuah kombinasi dari mesin-independen C dan bahasa assembly yang spesifik-prosesor, dirancang terutama untuk menangani operasi aritmatika bahwa target prosesor tidak dapat melakukan secara langsung.

Front-berakhir

Frontends bervariasi secara internal, karena untuk menghasilkan pohon yang dapat ditangani oleh backend. Saat ini, parser semua tangan-kode parser keturunan rekursif , meskipun tidak ada alasan mengapa sebuah generator parser tidak dapat digunakan untuk baru-depan berakhir di masa depan (versi 2 dari kompiler C menggunakan banteng berdasarkan tata bahasa).

Sampai saat ini, representasi pohon program ini tidak sepenuhnya independen dari prosesor yang sedang ditargetkan.

Arti pohon agak berbeda untuk bahasa yang berbeda-depan berakhir, dan berakhir depan bisa memberikan kode mereka sendiri pohon. Ini disederhanakan dengan pengenalan GENERIC dan GIMPLE, dua bentuk baru dari pohon bahasa-independen yang diperkenalkan dengan munculnya GCC 4.0. GENERIC semakin kompleks, berdasarkan representasi antara GCC 3.x Jawa front-end itu. GIMPLE adalah GENERIC disederhanakan, di mana berbagai konstruksi diturunkan menjadi petunjuk beberapa GIMPLE. The CC + + dan Java depan menghasilkan GENERIC langsung berakhir di ujung depan. depan lainnya telah berakhir, bukan parsing representasi intermediate yang berbeda setelah dan mengkonversi ke GENERIC.

Dalam kedua kasus tersebut, yang disebut “gimplifier-begitu” kemudian menurunkan bentuk yang lebih kompleks ini menjadi lebih sederhana SSA GIMPLE bentuk dasar-yang merupakan bahasa umum untuk sejumlah besar bahasa baru yang kuat-arsitektur-independen global (fungsi ruang lingkup dan) optimasi.

GENERIC dan GIMPLE

GENERIC adalah representasi antara bahasa yang digunakan sebagai tengah-end “” saat kompilasi kode sumber ke binari dieksekusi. Sebuah subset, disebut GIMPLE, ditargetkan oleh semua-ujung depan GCC.

Tengah-akhir GCC, dimulai dengan representasi GENERIC dan berakhir setelah ekspansi ke Register Transfer Language , berisi semua optimisers dan analisa bekerja secara independen dari bahasa dikompilasi dan mandiri arsitektur target. Representasi GENERIC hanya berisi subset dari imperatif pemrograman konstruksi dioptimalkan pada akhir-tengah.

Dalam mengubah kode sumber untuk GIMPLE, kompleks ekspresi dibagi menjadi kode alamat tiga menggunakan variabel sementara . Representasi ini diilhami oleh representasi SEDERHANA diusulkan dalam McCAT compiler [24] oleh Laurie J. Hendren [25] untuk menyederhanakan analisis dan optimasi dari program imperatif .

Optimasi

Optimasi dapat terjadi dalam setiap tahap kompilasi, namun sebagian besar optimisasi dilakukan setelah analisis sintaks dan semantik akhir-depan dan sebelum kode generasi back-end, sehingga yang umum, meskipun agak bertentangan, nama ini bagian dari kompiler adalah “akhir tengah.”

Set optimasi yang tepat dari GCC bervariasi dari rilis ke rilis karena berkembang, tetapi mencakup algoritma standar, seperti optimasi loopmelompat threadingpenghapusan umumpenjadwalan instruksi , dan sebagainya. Para RTL optimasi yang kurang penting dengan penambahan optimasi SSA berbasis global GIMPLE pohon, sebagai optimasi RTL memiliki lingkup lebih terbatas banyak, dan memiliki informasi tinggi tingkat kurang.

Beberapa optimasi yang dilakukan pada tingkat ini meliputi penghapusan kode matieliminasi redundansi parsialnilai global penomorankonstanta propagasi bersyarat tipis , dan penggantian skalar agregat . Array optimasi berbasis ketergantungan seperti vektorisasi otomatis dan otomatis paralelisasi juga dilakukan. -petunjuk Profil optimasi juga mungkin seperti yang ditunjukkan di sini:http://gcc.gnu.org/install/build.html # TOC4

Back-end

Perilaku back end’s GCC sebagian ditentukan oleh preprocessor macro dan fungsi spesifik untuk arsitektur target, misalnya untuk menentukan endianneskata ukuran , dan konvensi menelepon .Bagian depan bagian belakang menggunakan ini untuk membantu memutuskan generasi RTL, sehingga meskipun GCC’s RTL adalah nominal prosesor-independen, urutan instruksi abstrak awal sudah disesuaikan dengan target. Setiap saat, dengan RTL sebenarnya membentuk representasi instruksi program harus sesuai dengan deskripsi mesin arsitektur target.

Menjelang akhir kompilasi, RTL yang berlaku kemudian dikurangi menjadi bentuk yang ketat di mana setiap instruksi mengacu pada register mesin yang nyata dan petunjuk yang nyata dari target set instruksi . RTL ketat Membentuk adalah tugas yang sangat rumit, kebanyakan dilakukan oleh alokasi pertama, tetapi diselesaikan hanya dengan “terpisah Refresh” fase yang harus menjelaskan semua keanehan yang target GCC.

Tahap terakhir adalah antiklimaks agak, karena pola untuk mencocokkan umumnya dipilih selama reload, dan kode perakitan hanya dibangun dengan menjalankan substitusi dari register dan alamat ke dalam string menetapkan petunjuk.

Kompatibel IDE

Kebanyakan lingkungan pengembangan terintegrasi yang ditulis untuk GNU / Linux dan beberapa sistem operasi lain untuk mendukung GCC. Ini termasuk:

Debugging program GCC

Alat utama yang digunakan untuk debug kode GCC adalah GNU Debugger (gdb). Di antara alat khusus lebih Valgrind , untuk menemukan kesalahan dan kebocoran memori, dan grafik profiler ( gprof ) yang dapat menentukan seberapa banyak waktu yang dihabiskan di mana rutinitas, dan seberapa sering mereka dipanggil; ini memerlukan program yang akan dikompilasi dengan profil pilihan.

Sumber ; http://en.wikipedia.org