Bagaimana kompiler dapat mengkompilasi dirinya sendiri?

168

Saya sedang meneliti CoffeeScript di situs webnya http://coffeescript.org/ , dan memiliki teks

Kompiler CoffeeScript itu sendiri ditulis dalam CoffeeScript

Bagaimana kompiler dapat mengkompilasi sendiri, atau apa arti pernyataan ini?

AlexanderRD
sumber
14
Istilah lain untuk kompiler yang dapat mengkompilasi sendiri adalah self-hostingkompiler. Lihat programmers.stackexchange.com/q/263651/6221
atau
37
Mengapa kompiler tidak dapat mengkompilasi sendiri?
user253751
48
Setidaknya ada dua salinan dari kompiler yang terlibat. Yang sudah ada mengkompilasi salinan baru. Yang baru mungkin atau mungkin tidak identik dengan yang lama.
bdsl
12
Anda juga mungkin tertarik pada Git: kode sumbernya dilacak, tentu saja, dalam repositori Git.
Greg d'Eon
7
Ini tentang seperti bertanya, "Bagaimana Xerox Printer dapat mencetak skema untuk dirinya sendiri?" Compiler mengkompilasi teks ke kode byte. Jika kompiler dapat mengkompilasi ke kode byte yang dapat digunakan, Anda bisa menulis kode kompiler dalam bahasa masing-masing dan kemudian meneruskan kode melalui kompiler untuk menghasilkan output.
RLH

Jawaban:

219

Edisi pertama sebuah kompiler tidak dapat dihasilkan mesin dari bahasa pemrograman khusus untuk itu; kebingunganmu bisa dimengerti. Versi kompiler yang lebih baru dengan lebih banyak fitur bahasa (dengan sumber ditulis ulang dalam versi pertama bahasa baru) dapat dibangun oleh kompiler pertama. Versi itu kemudian dapat mengkompilasi kompiler berikutnya, dan seterusnya. Ini sebuah contoh:

  1. Kompiler CoffeeScript pertama ditulis dalam Ruby, menghasilkan versi 1 dari CoffeeScript
  2. Kode sumber kompiler CS ditulis ulang dalam CoffeeScript 1
  3. Kompiler CS asli mengkompilasi kode baru (ditulis dalam CS 1) ke dalam versi 2 dari kompiler
  4. Perubahan dilakukan pada kode sumber kompilator untuk menambahkan fitur bahasa baru
  5. Kompiler CS kedua (yang pertama ditulis dalam CS) mengkompilasi kode sumber baru yang direvisi ke dalam versi 3 dari kompiler
  6. Ulangi langkah 4 dan 5 untuk setiap iterasi

Catatan: Saya tidak yakin persis bagaimana versi CoffeeScript diberi nomor, itu hanya contoh.

Proses ini biasanya disebut bootstrap . Contoh lain dari kompiler bootstrap adalah rustc, kompiler untuk bahasa Rust .

Ben N
sumber
5
Rute lain untuk bootstrap kompiler adalah dengan menulis juru bahasa untuk (subset) bahasa Anda.
Aron
Sebagai satu lagi alternatif untuk bootstrap dengan compiler atau interpreter yang ditulis dalam bahasa lain, rute yang sangat kuno adalah merakit sumber kompiler secara manual. Chuck Moore mempelajari cara melakukan ini untuk juru bahasa Forth di bab 9, "Program yang mem-bootstrap", pada akhir Pemrograman Bahasa yang Berorientasi Masalah ( web.archive.org/web/20160327044521/www.colorforth.com/POL .htm ), berdasarkan telah melakukannya dua kali sebelumnya dengan tangan. Entri kode di sini dilakukan melalui panel depan yang memungkinkan penyimpanan nilai langsung ke alamat memori yang dikendalikan oleh sakelar sakelar untuk bit.
Jeremy W. Sherman
59

Dalam makalah Reflection on Trusting Trust , Ken Thompson, salah satu penggagas Unix, menulis ikhtisar yang menarik (dan mudah dibaca) tentang bagaimana kompiler C mengkompilasi dirinya sendiri. Konsep serupa dapat diterapkan ke CoffeeScript atau bahasa lainnya.

Gagasan kompiler yang mengkompilasi kode sendiri samar-samar mirip dengan quine : kode sumber yang, ketika dijalankan, menghasilkan sebagai output kode sumber asli. Ini adalah salah satu contoh quine CoffeeScript. Thompson memberikan contoh ini tentang kuota C:

char s[] = {
    '\t',
    '0',
    '\n',
    '}',
    ';',
    '\n',
    '\n',
    '/',
    '*',
    '\n',
    … 213 lines omitted …
    0
};

/*
 * The string s is a representation of the body
 * of this program from '0'
 * to the end.
 */

main()
{
    int i;

    printf("char\ts[] = {\n");
    for(i = 0; s[i]; i++)
        printf("\t%d,\n", s[i]);
    printf("%s", s);
}

Selanjutnya, Anda mungkin bertanya-tanya bagaimana kompiler diajarkan bahwa urutan melarikan diri seperti '\n'mewakili kode ASCII 10. Jawabannya adalah bahwa di suatu tempat dalam kompiler C, ada rutin yang mengartikan literal karakter, berisi beberapa kondisi seperti ini untuk mengenali urutan backslash:

…
c = next();
if (c != '\\') return c;        /* A normal character */
c = next();
if (c == '\\') return '\\';     /* Two backslashes in the code means one backslash */
if (c == 'r')  return '\r';     /* '\r' is a carriage return */
…

Jadi, kita dapat menambahkan satu syarat ke kode di atas ...

if (c == 'n')  return 10;       /* '\n' is a newline */

... untuk menghasilkan kompiler yang tahu yang '\n'mewakili ASCII 10. Menariknya, kompiler itu, dan semua kompiler berikutnya yang dikompilasi olehnya , "tahu" pemetaan itu, jadi pada generasi berikutnya dari kode sumber, Anda dapat mengubah baris terakhir menjadi

if (c == 'n')  return '\n';

... dan itu akan melakukan hal yang benar! Itu 10berasal dari kompiler, dan tidak perlu lagi didefinisikan secara eksplisit dalam kode sumber kompilator. 1

Itu adalah salah satu contoh fitur bahasa C yang diimplementasikan dalam kode C. Sekarang, ulangi proses itu untuk setiap fitur bahasa tunggal, dan Anda memiliki kompiler "hosting sendiri": kompiler C yang ditulis dalam C.


1 Pelintiran plot yang dijelaskan dalam makalah ini adalah bahwa karena kompiler dapat "diajarkan" fakta-fakta seperti ini, itu juga dapat diajarkan secara salah untuk menghasilkan executable trojan dengan cara yang sulit untuk dideteksi, dan tindakan sabotase semacam itu dapat bertahan di semua kompiler yang diproduksi oleh kompiler tercemar.

200_sukses
sumber
7
Meskipun ini sedikit informasi yang menarik, saya tidak berpikir itu menjawab pertanyaan. Contoh Anda menganggap Anda sudah memiliki kompiler bootstrap, atau dalam bahasa apa kompiler C ditulis?
Arturo Torres Sánchez
9
@ ArturoTorresSánchez Penjelasan berbeda bekerja dengan baik untuk orang yang berbeda. Saya tidak bermaksud mengulangi apa yang telah dikatakan dalam jawaban lain. Sebaliknya, saya menemukan jawaban lain berbicara pada tingkat yang lebih tinggi daripada bagaimana saya suka berpikir. Saya pribadi lebih suka ilustrasi konkret tentang bagaimana satu fitur tunggal ditambahkan, dan membiarkan pembaca mengekstrapolasi dari itu, alih-alih gambaran yang dangkal.
200_sukses
5
Oke, saya mengerti sudut pandang Anda. Hanya saja pertanyaannya lebih "bagaimana kompiler dapat mengkompilasi sendiri jika kompiler untuk mengkompilasi kompiler tidak ada" dan lebih sedikit "bagaimana menambahkan fitur baru ke kompiler bootstrapped".
Arturo Torres Sánchez
17
Pertanyaannya sendiri ambigu dan terbuka. Tampaknya beberapa orang mengartikannya sebagai "bagaimana kompiler CoffeeScript dapat mengkompilasi sendiri?". Respons sembrono, seperti yang diberikan dalam komentar, adalah "mengapa tidak bisa mengkompilasi sendiri, sama seperti itu mengkompilasi kode apa pun?" Saya menafsirkannya berarti "bagaimana kompiler self-hosting muncul?", Dan telah memberikan ilustrasi tentang bagaimana kompiler dapat diajarkan tentang salah satu fitur bahasanya sendiri. Ini menjawab pertanyaan dengan cara yang berbeda, dengan memberikan ilustrasi tingkat rendah bagaimana penerapannya.
200_sukses
1
@ ArturoTorresSánchez: "[I] n bahasa mana yang ditulis oleh kompiler C?" Dahulu saya mempertahankan kompiler C asli yang tercantum dalam lampiran K&R lama (yang untuk IBM 360). Banyak orang tahu bahwa pertama-tama ada BCPL, lalu B, dan bahwa C adalah versi perbaikan dari B. Bahkan, ada banyak bagian dari kompiler lama yang masih ditulis dalam B, dan belum pernah ditulis ulang menjadi C. Variabelnya berupa huruf tunggal / digit, aritmatika pointer tidak dianggap secara otomatis diskalakan, dll. Kode lama itu bersaksi kepada bootstraping dari B ke C. Compiler "C" pertama ditulis dalam B.
Eliyahu Skoczylas
29

Anda sudah mendapatkan jawaban yang sangat bagus, namun saya ingin menawarkan Anda perspektif yang berbeda, yang diharapkan akan mencerahkan Anda. Pertama-tama mari kita buat dua fakta yang bisa kita sepakati bersama:

  1. Kompiler CoffeeScript adalah program yang dapat mengkompilasi program yang ditulis dalam CoffeeScript.
  2. Kompiler CoffeeScript adalah program yang ditulis dalam CoffeeScript.

Saya yakin Anda bisa setuju bahwa # 1 dan # 2 benar. Sekarang, lihat dua pernyataan. Apakah Anda melihat sekarang bahwa itu sepenuhnya normal untuk kompiler CoffeeScript untuk dapat mengkompilasi kompiler CoffeeScript?

Kompiler tidak peduli apa yang dikompilasi. Selama ini adalah program yang ditulis dalam CoffeeScript, ia dapat mengompilasinya. Dan kompiler CoffeeScript sendiri kebetulan merupakan program semacam itu. Kompiler CoffeeScript tidak peduli bahwa itu adalah kompiler CoffeeScript itu sendiri yang dikompilasi. Yang terlihat hanyalah beberapa kode CoffeeScript. Titik.

Bagaimana kompiler dapat mengkompilasi sendiri, atau apa arti pernyataan ini?

Ya, itulah yang dimaksud pernyataan itu, dan saya harap Anda dapat melihat sekarang bagaimana pernyataan itu benar.

Jörg W Mittag
sumber
2
Saya tidak tahu banyak tentang skrip kopi tetapi Anda bisa mengklarifikasi poin 2 dengan menyatakan bahwa itu ditulis dalam skrip kopi tetapi sejak dikompilasi dan kemudian kode mesin. Dan bagaimanapun, bisakah Anda menjelaskan masalah ayam dan telur itu. Jika kompiler ditulis dalam bahasa yang belum dikompilasi oleh kompiler, lalu bagaimana kompilator dapat menjalankan atau dikompilasi?
barlop
6
Pernyataan 2 Anda tidak lengkap / tidak akurat dan sangat menyesatkan. karena sebagai jawaban pertama mengatakan, yang pertama tidak ditulis dalam skrip kopi .. Itu sangat relevan dengan pertanyaannya. Dan seperti "Bagaimana kompiler mengkompilasi sendiri, atau apa arti pernyataan ini?" Anda mengatakan "Ya" Saya kira begitu (meskipun pikiran saya agak kecil), saya melihat itu digunakan untuk mengkompilasi versi sebelumnya sendiri, bukan dirinya sendiri. Tetapi apakah itu digunakan untuk mengkompilasi sendiri juga? Saya kira itu tidak ada gunanya.
barlop
2
@barlop: Ubah pernyataan 2 menjadi " Hari ini , kompiler CoffeeScript adalah program yang ditulis dalam CoffeeScript." Apakah itu membantu Anda memahaminya dengan lebih baik? Kompiler adalah "hanya" sebuah program yang menerjemahkan input (kode) menjadi output (program). Jadi jika Anda memiliki kompiler untuk bahasa Foo, maka tulis kode sumber untuk kompiler Foo dalam bahasa Foo itu sendiri, dan beri makan sumber itu ke kompiler Foo pertama Anda, Anda mendapatkan kompilator Foo kedua sebagai output. Ini dilakukan oleh banyak bahasa (misalnya, semua kompiler C yang saya tahu ditulis dalam ... C).
DarkDust
3
Kompiler tidak dapat mengkompilasi sendiri. File output tidak sama dengan kompiler yang menghasilkan file output. Saya harap Anda dapat melihat sekarang bagaimana pernyataan itu salah.
pabrams
3
@pabrams Mengapa Anda menganggap itu? Outputnya bisa identik dengan kompiler yang digunakan untuk memproduksinya. Misalnya, jika saya mengkompilasi GCC 6.1 dengan GCC 6.1, saya mendapatkan versi GCC 6.1 yang dikompilasi dengan GCC 6.1. Dan kemudian jika saya menggunakannya untuk mengkompilasi GCC 6.1, saya juga mendapatkan versi GCC 6.1 yang dikompilasi dengan GCC 6.1, yang harus identik (mengabaikan hal-hal seperti cap waktu).
user253751
9

Bagaimana kompiler dapat mengkompilasi sendiri, atau apa arti pernyataan ini?

Artinya persis seperti itu. Pertama-tama, beberapa hal yang perlu dipertimbangkan. Ada empat objek yang perlu kita perhatikan:

  • Kode sumber program CoffeScript sembarang
  • Perakitan (yang dihasilkan) dari sembarang program CoffeScript
  • Kode sumber dari kompiler CoffeScript
  • Rakitan (yang dihasilkan) dari kompiler CoffeScript

Sekarang, harus jelas bahwa Anda dapat menggunakan rakitan yang dihasilkan - yang dapat dieksekusi - dari kompiler CoffeScript untuk mengkompilasi sembarang program CoffeScript, dan menghasilkan rakitan untuk program tersebut.

Sekarang, kompiler CoffeScript itu sendiri hanyalah sebuah program CoffeScript sewenang-wenang, dan karenanya, dapat dikompilasi oleh kompiler CoffeScript.

Tampaknya kebingungan Anda berasal dari kenyataan bahwa ketika Anda membuat bahasa baru Anda sendiri, Anda belum memiliki kompiler namun dapat Anda gunakan untuk mengkompilasi kompiler Anda. Ini pasti terlihat seperti masalah telur ayam , kan?

Perkenalkan proses yang disebut bootstrap .

  1. Anda menulis kompiler dalam bahasa yang sudah ada (dalam kasus CoffeScript, kompiler asli ditulis dalam Ruby) yang dapat mengkompilasi bagian dari bahasa baru
  2. Anda menulis kompiler yang dapat mengkompilasi bagian dari bahasa baru dalam bahasa baru itu sendiri. Anda hanya dapat menggunakan fitur bahasa yang dikompilasi oleh kompilator dari langkah di atas.
  3. Anda menggunakan kompiler dari langkah 1 untuk mengkompilasi kompiler dari langkah 2. Ini membuat Anda dengan rakitan yang awalnya ditulis dalam subset dari bahasa baru, dan yang mampu mengkompilasi subset dari bahasa baru.

Sekarang Anda perlu menambahkan fitur baru. Katakanlah Anda hanya menerapkan while-loops, tetapi juga ingin for-loops. Ini bukan masalah, karena Anda dapat menulis ulang setiap for-loop sedemikian rupa sehingga while-loop. Ini berarti Anda hanya dapat menggunakan while-lompatan dalam kode sumber kompiler Anda, karena rakitan yang Anda miliki hanya dapat mengkompilasi itu. Tetapi Anda dapat membuat fungsi di dalam kompiler Anda yang dapat membuat dan mengkompilasi for-loops dengannya. Kemudian Anda menggunakan perakitan yang sudah Anda miliki, dan kompilasi versi kompiler baru. Dan sekarang Anda memiliki perakitan kompiler yang juga dapat menguraikan dan mengkompilasi for-loops! Anda sekarang dapat kembali ke file sumber kompiler Anda, dan menulis ulang while-loops yang tidak Anda inginkan ke for-loops.

Bilas dan ulangi sampai semua fitur bahasa yang diinginkan dapat dikompilasi dengan kompiler.

whiledan forjelas hanya contoh, tetapi ini berfungsi untuk fitur bahasa baru yang Anda inginkan. Dan kemudian Anda berada dalam situasi CoffeScript sekarang: Kompiler mengkompilasi dirinya sendiri.

Ada banyak literatur di luar sana. Refleksi Kepercayaan Kepercayaan adalah klasik yang setiap orang tertarik pada topik itu harus membaca setidaknya sekali.

Polygnome
sumber
5
(Kalimat "Kompiler CoffeeScript itu sendiri ditulis dalam CoffeeScript", benar, tetapi "Kompiler dapat mengkompilasi dirinya sendiri" adalah salah.)
pabrams
4
Tidak, itu sepenuhnya benar. Kompilator dapat mengkompilasi sendiri. Itu tidak masuk akal. Katakanlah Anda memiliki executable yang dapat mengkompilasi Versi X bahasa. Anda menulis kompiler yang dapat mengkompilasi Versi X + 1, dan kompilasi dengan kompiler yang Anda miliki (yaitu versi X). Anda berakhir dengan executable yang dapat mengkompilasi versi X + 1 bahasa. Sekarang Anda bisa pergi dan menggunakan executable baru itu untuk mengkompilasi ulang kompiler. Tetapi untuk tujuan apa? Anda sudah memiliki executable yang melakukan apa yang Anda inginkan. Kompilator dapat mengkompilasi program apa pun yang valid, sehingga sepenuhnya dapat mengkompilasi sendiri!
Polygnome
1
Memang bukan tidak pernah terdengar untuk membangun beberapa kali, iirc freepascal modern membangun kompiler sebanyak 5 kali.
plugwash
1
@pabrams Menulis "Jangan sentuh" ​​dan "Objek panas. Jangan sentuh" ​​tidak ada bedanya dengan pesan frasa yang dimaksud. Selama audiens yang dituju dari pesan (Programmer) memahami pesan yang dimaksud dari frasa (Membangun kompilator dapat mengkompilasi sumbernya) terlepas dari bagaimana itu ditulis, diskusi ini tidak ada gunanya. Seperti yang ada sekarang, argumen Anda tidak valid. Kecuali jika Anda dapat menunjukkan bahwa audiens yang dituju dari pesan tersebut adalah non-programer, maka, dan hanya kemudian, Anda benar.
DarkDestry
2
@pabrams 'Bahasa Inggris yang baik' adalah bahasa Inggris yang mengkomunikasikan ide dengan jelas kepada audiens yang dituju, dan dengan cara yang dimaksudkan oleh penulis atau pembicara. Jika audiens yang dimaksud adalah pemrogram, dan pemrogram memahaminya, itu adalah bahasa Inggris yang baik. Mengatakan "Cahaya ada sebagai partikel dan gelombang" secara fundamental setara dengan "Cahaya ada sebagai foton dan gelombang elektromagnetik". Bagi seorang ahli fisika, mereka secara harfiah berarti hal yang sama. Apakah itu berarti kita harus selalu menggunakan kalimat yang lebih panjang dan lebih jelas? Tidak! Karena itu menyulitkan membaca ketika artinya sudah jelas bagi audiens yang dituju.
DarkDestry
7

Klarifikasi kecil tapi penting

Di sini istilah compiler mengungkap fakta bahwa ada dua file yang terlibat. Satu adalah file yang dapat dieksekusi yang mengambil file input yang ditulis dalam CoffeScript dan menghasilkan sebagai file output file yang dapat dieksekusi, file objek yang dapat ditautkan, atau pustaka bersama. Yang lainnya adalah file sumber CoffeeScript yang kebetulan menggambarkan prosedur untuk mengkompilasi CoffeeScript.

Anda menerapkan file pertama ke yang kedua, menghasilkan yang ketiga yang mampu melakukan tindakan kompilasi yang sama seperti yang pertama (mungkin lebih, jika file kedua mendefinisikan fitur yang tidak diterapkan oleh yang pertama), dan dengan demikian dapat mengganti yang pertama jika Anda jadi keinginan.

nbro
sumber
4
  1. Kompiler CoffeeScript pertama kali ditulis dalam Ruby.
  2. Kompiler CoffeeScript kemudian ditulis ulang dalam CoffeeScript.

Karena versi Ruby dari kompiler CoffeeScript sudah ada, itu digunakan untuk membuat versi CoffeeScript dari kompiler CoffeeScript.

masukkan deskripsi gambar di sini Ini dikenal sebagai kompiler hosting mandiri .

Ini sangat umum, dan biasanya hasil dari keinginan penulis untuk menggunakan bahasa mereka sendiri untuk mempertahankan pertumbuhan bahasa itu.

Trevor Hickey
sumber
3

Ini bukan masalah kompiler di sini, tetapi masalah ekspresi bahasa, karena kompiler hanyalah sebuah program yang ditulis dalam beberapa bahasa.

Ketika kita mengatakan bahwa "suatu bahasa ditulis / diimplementasikan" kita sebenarnya berarti bahwa kompiler atau penerjemah untuk bahasa tersebut diimplementasikan. Ada bahasa pemrograman di mana Anda dapat menulis program yang mengimplementasikan bahasa (adalah kompiler / juru bahasa untuk bahasa yang sama). Bahasa-bahasa ini disebut bahasa universal .

Agar dapat memahami hal ini, pikirkan tentang bubut logam. Ini adalah alat yang digunakan untuk membentuk logam. Mungkin saja, hanya menggunakan alat itu, untuk membuat alat lain yang identik, dengan membuat bagian-bagiannya. Dengan demikian, alat itu adalah mesin universal. Tentu saja, yang pertama dibuat menggunakan cara lain (alat lain), dan mungkin kualitasnya lebih rendah. Tetapi yang pertama digunakan untuk membangun yang baru dengan presisi lebih tinggi.

Printer 3D hampir merupakan mesin universal. Anda dapat mencetak seluruh printer 3D menggunakan printer 3D (Anda tidak dapat membuat ujung yang melelehkan plastik).

Paul92
sumber
Saya suka analogi mesin bubut. Berbeda dengan analogi bubut, meskipun, ketidaksempurnaan dalam iterasi kompiler pertama diteruskan ke semua kompiler berikutnya. Sebagai contoh, jawaban di atas menyebutkan menambahkan fitur untuk-loop di mana kompiler asli hanya menggunakan saat loop. Output mengerti for-loop, tetapi implementasinya dengan while loop. Jika implementasi sementara asli loop cacat atau tidak efisien, maka selalu akan!
@ Fisika-Hitung yang benar-benar salah. Dengan tidak adanya cacat kedengkian biasanya tidak menyebar ketika mengkompilasi kompiler.
plugwash
Terjemahan majelis tentu diteruskan dari iterasi ke iterasi sampai terjemahan majelis diperbaiki. Fitur baru yang membangun fitur lama tidak mengubah implementasi yang mendasarinya. Pikirkan sebentar.
@plugwash Lihat "Refleksi Kepercayaan Kepercayaan" oleh Ken Thompson - ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf
3

Bukti dengan induksi

Langkah induktif

Versi n + 1 dari kompiler ditulis dalam X.

Dengan demikian dapat dikompilasi oleh versi ke-9 dari kompiler (juga ditulis dalam X).

Kasing dasar

Tetapi versi pertama dari kompiler yang ditulis dalam X harus dikompilasi oleh kompiler untuk X yang ditulis dalam bahasa selain X. Langkah ini disebut bootstrap the compiler.

Guy Argo
sumber
1
Kompiler kompiler pertama untuk bahasa X dapat dengan mudah ditulis dalam X. Cara yang memungkinkan adalah bahwa kompiler pertama ini dapat ditafsirkan . (Oleh penerjemah X yang ditulis dalam bahasa selain X).
Kaz
0

Compiler mengambil spesifikasi tingkat tinggi dan mengubahnya menjadi implementasi tingkat rendah, seperti dapat dieksekusi pada perangkat keras. Oleh karena itu tidak ada hubungan antara format spesifikasi dan eksekusi yang sebenarnya selain semantik bahasa yang ditargetkan.

Kompiler lintas pindah dari satu sistem ke sistem lain, kompiler lintas bahasa mengkompilasi satu spesifikasi bahasa ke spesifikasi bahasa lain.

Kompilasi pada dasarnya adalah terjemahan yang adil, dan levelnya biasanya tingkat bahasa yang lebih tinggi ke tingkat bahasa yang lebih rendah, tetapi ada banyak varian.

Kompiler bootstrap adalah yang paling membingungkan, tentu saja, karena mereka mengkompilasi bahasa mereka. Jangan lupa langkah awal dalam bootstrap yang memerlukan setidaknya versi minimal yang ada yang dapat dieksekusi. Banyak kompiler bootstrap bekerja pada fitur minimal bahasa pemrograman terlebih dahulu dan menambahkan fitur bahasa tambahan yang kompleks ke depan asalkan fitur baru dapat diekspresikan menggunakan fitur sebelumnya. Jika bukan itu masalahnya maka bagian "kompiler" harus dikembangkan dalam bahasa lain terlebih dahulu.

nbro
sumber