Apakah kompiler gcc C ditulis dalam C itu sendiri?

87

Apakah kompiler gcc C ditulis dalam C itu sendiri? Atau apakah itu tertulis dalam Assembly? Jika kompilator ditulis dalam C, lalu apa kompilator yang digunakan untuk mengkompilasi kode kompilator?

euforia83
sumber
12
Ya itu (kebanyakan). Tentu saja, seseorang membutuhkan kompiler C untuk mengkompilasi C sehingga, seperti kebanyakan kompiler, ada serangkaian fase "boot-strap". Ide umumnya tercakup di Memasang GCC: Membangun dan Memasang GCC - LFS .
2
Stasiun kerja merek yang berbeda di tahun 1980-an dan awal 90-an memiliki lingkungan unix-like mereka sendiri dengan compiler c, alat, dll ... yang sedikit berbeda satu sama lain. Dengan sumber GCC, Anda dapat melakukan kompilasi awal gcc pada salah satu platform ini, lalu mengompilasi gcc dengan dirinya sendiri beberapa kali untuk memeriksa titik tetap.
Paul

Jawaban:

100

Riwayat khusus untuk gcc diberikan di GCC Wiki . Poin yang lebih umum adalah bahwa kompiler pada umumnya pada awalnya dikompilasi dengan beberapa kompilator lain sampai mereka cukup kuat untuk mengkompilasi sendiri. Sebagai alternatif, dimungkinkan untuk menulis kompilator dasar yang dapat menangani subset fitur Anda di assembler, dan membangun dari sana. Tetapi sekali lagi, ini hampir tidak pernah dibutuhkan lagi. Ada banyak kompiler yang tersedia, dalam berbagai bahasa. Bahkan ketika Stephen Johnson sedang menulis pcc (salah satu kompiler C pertama), ada kompiler untuk B yang tersedia, bersama dengan banyak bahasa lainnya. gcc memiliki beberapa kompiler yang dapat dipilih untuk membangunnya secara asli, dan RMS mengatakan bahwa dia menggunakan kompiler Pastel setidaknya selama pengembangan awalnya.

Ingat, tidak ada persyaratan bahwa kompiler C harus ditulis dalam C. Anda dapat menulisnya di Perl jika Anda mau. Tidak ada persyaratan bahwa kompiler untuk platform tertentu harus aslinya ditulis pada platform itu (sistem tertanam hampir selalu dikompilasi pada sistem lain). Jadi ada banyak cara untuk membuat diri Anda bootstrap.

Pertanyaan ini memiliki beberapa seluk-beluk menarik terkait dengan contoh pertama bootstrap kompilator. Jika Anda sangat pintar, Anda dapat menggunakan bootstrap itu untuk melakukan sesuatu yang luar biasa, brilian, dan menakutkan .

Rob Napier
sumber
Woah, artikel kedua yang Anda tautkan itu sangat pintar.
Ponkadoodle
1
Terima kasih untuk tautan bootstrap yang bagus. Saya berasumsi bahwa kompiler selalu ditulis dalam bahasa sederhana semua kembali cara untuk kode mesin untuk semacam alasan ini. (Misalnya, bagaimana jika Anda menyadari bahwa biner untuk kompilator Anda mengandung kesalahan? Ini memberikan contoh yang lebih kuat tentunya.) Jadi apa keuntungan menulis kompilator dalam bahasanya sendiri? Apakah orang yang sangat paranoid mengkhawatirkan hal ini dan membuat kompiler mereka tanpa bootstrap "sendiri"?
RoG
4
Beberapa kelompok bahasa menganggap kemampuan mengkompilasi diri mereka sendiri merupakan suatu kehormatan. Go baru-baru ini membuat dorongan besar ke arah ini. Swift, di sisi lain, saat ini tidak memiliki rencana untuk menulis ulang compiler mereka di Swift. Namun perlu dicatat, bahwa GCC selalu ditulis dalam C. Itu hanya dikompilasi dengan kompiler lain. Tetapi jika semua kompiler C ditulis dalam BCPL, itu tidak akan memperbaiki apapun tentang paranoia. Itu hanya memindahkan masalah ke belakang satu langkah. (Anda akan mendapatkan manfaat paranoia yang sama hanya dengan menyusun GCC tanpa dentang.)
Rob Napier
Perhatikan bahwa gcc memiliki kebijakan bahwa gcc versi mayor X selalu dapat dikompilasi dengan gcc mayor versi X-1, jadi fitur baru apa pun yang ditambahkan ke kompiler di X hanya dapat digunakan di sumber gcc itu sendiri dari X + 1. misalnya, Anda harus dapat mengkompilasi gcc versi 9 apa pun, berapa pun nomor versi minornya, dengan gcc 8 apa pun, sekali lagi apa pun versi minornya.
Baruch
51

Awalnya itu ditulis dalam beberapa bahasa assembly kemudian mulai menjadi makanan anjing itu sendiri.

Daniel A. White
sumber
2
Saya belum melihat referensi ke RMS menggunakan assembler untuk bootstrap asli. Apa sumber Anda untuk itu? Dia memiliki beberapa kompiler lain untuk bootstrap, jadi sepertinya banyak pekerjaan.
Rob Napier
19
Saya pikir istilah itu bootstrap.
Martin York
7
hahaha Saya membaca ini beberapa minggu yang lalu dan mengira Anda gila dengan ekspresi itu, tidak menyadari itu standar. Good Show Pak! en.wikipedia.org/wiki/Eating_your_own_dog_food
3

Meskipun ini jelas hanya indikator yang sangat kasar, saya menemukan daftar singkat ini digcc-5.1.0-src/gcc/ direktori menarik. Direktori ini berisi sumber utama GCC itu sendiri (kecuali untuk pustaka waktu proses).

Berikut adalah jumlah file teratas (lebih dari 100) yang dikelompokkan berdasarkan ekstensi yang didominasi oleh file C dan C ++.

Harap dicatat bahwa saat ini GCCmengacu pada Koleksi Kompilator GNU, bukan hanya Kompilator GNU C.

6.3 Subdirektori gcc

Direktori gcc berisi banyak file yang merupakan bagian dari C sumber GCC, file lain yang digunakan sebagai bagian dari konfigurasi dan proses build, dan subdirektori termasuk dokumentasi dan testsuite.

Referensi: https://gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

oo_miguel
sumber