Kompilasi bahasa pemrograman dengan dirinya sendiri

10

Saya seorang mahasiswa ilmu komputer. Saya ingin membuat bahasa pemrograman saya sendiri (Bahasa dasar dengan beberapa instruksi).

Saya tahu bagaimana melakukan analisa sintaksis, saya sudah melakukannya di Perl. Dalam sebuah artikel, saya membaca sesuatu tentang kompiler, kompiler dilakukan dengan sendirinya.

Misalnya kompiler C ditulis dalam C. Bagaimana mungkin? Saya dapat membuat bahasa saya sendiri tetapi saya tidak tahu bagaimana saya bisa menjalankannya? Ada ide?

Ini benar-benar pertanyaan yang bagus dan saya bisa menulis proyek blog.

BaptistL
sumber
Orang-orang telah menjelaskan cara mem-bootstrap tetapi mengapa Anda harus melakukannya? Tidak ada alasan Anda tidak dapat mengkompilasi bahasa Anda menggunakan kompiler yang ditulis dalam C, Perl atau apa pun. Tentu, akan lebih baik untuk memiliki kompiler untuk bahasa Anda yang ditulis sendiri tetapi itu akan banyak pekerjaan - Anda harus menulis setidaknya dua kompiler untuk mendapatkan itu (satu di C / Perl / apa pun, satu di bahasa Anda).
David Richerby
Hmm .. Saya pikir saya akan menulis compiler pertama saya di C dan menulis seconde dalam bahasa saya. Sangat menarik untuk membuat sedikit bahasa pemrograman, kita bisa belajar banyak dari ilmu komputer
BaptisteL

Jawaban:

13

Caranya adalah bootstrap . Anda pertama kali menulis kompiler untuk bahasa Anda (atau bagian dari itu) dalam beberapa bahasa lain. Kemudian Anda menulis kompiler untuk bahasa Anda (atau sebagian besar dari yang sudah bisa Anda tangani) dalam bahasa Anda. Anda menggunakan kompilator sebelumnya untuk mengkompilasi kompilator baru, dan kemudian kompilator baru dapat mengkompilasi sendiri.

Yuval Filmus
sumber
Jadi, saya bisa membuat kompiler pertama saya menggunakan C dan lain kali saya akan mengkompilasi v2 kompiler saya dengan v1? Tetapi ada masalah, bagaimana saya bisa tahu kompiler tidak memiliki masalah? Saya perlu mengubah kode sumber saya menjadi assembler? Atau dalam hal lain?
BaptisteL
2
Bagaimana saya bisa tahu kompiler tidak memiliki masalah? Secara umum, Anda menulis sebuah program; bagaimana Anda tahu ia tidak memiliki bug? Kamu tidak. Anda menulis beberapa tes dan berharap yang terbaik. Apakah saya perlu mengubah kode sumber saya menjadi rakitan? Tentu saja tidak. Anda dapat mempercayai kompiler C. Anda melakukan hal yang sama, tetapi dengan perakitan diganti dengan C (atau bahasa lain pilihan Anda).
Yuval Filmus
Oke saya harus percaya pada keahlian saya ^^ Saya ingin bertanya proses melakukan compiler. Saya benar-benar tidak mengerti apa yang dilakukan kompiler, penganalisis sintaksis dan leksikal oke tapi selanjutnya ??
BaptisteL
Kemudian Anda menghasilkan kode. Jika Anda tidak ingin masuk ke detail menghasilkan kode mesin, Anda selalu dapat menghasilkan kode dalam bahasa lain, katakan kode C, dan gunakan kompiler eksternal untuk mengkompilasinya ke dalam kode mesin. (Atau Anda dapat menggunakan bahasa yang ditafsirkan dan menjalankan penerjemah.)
Yuval Filmus
Hummm Tidak, saya lebih suka melakukannya seperti itu: Bahasa Saya di masukkan -> Kode Mesin. Saya tidak ingin mengonversi bahasa saya di tempat lain (sama untuk kompilasi pertama kali) Apakah mungkin?
BaptisteL
2

Kompiler yang dapat mengkompilasi sumbernya sendiri disebut kompilator self-hosting . Kompiler awal ditulis dalam bahasa lain. Sebagai contoh, kompiler C pertama mungkin ditulis dalam assembler. Seluruh trik dalam menggunakan kompiler tingkat bawah yang sebelumnya disebut bootstrap.

Bartosz Przybylski
sumber