Saya telah membuat beberapa kompiler tulisan tangan untuk bahasa yang sangat sederhana, tetapi sekarang saya ingin mencoba mengembangkan bahasa yang dinamis, mirip dengan Python atau Ruby yang disederhanakan. Namun, mudah bagi saya untuk membungkus kepala saya di sekitar bagaimana kompiler bekerja. Kompiler primitif baru saja menerjemahkan. Tetapi saya tidak bisa melakukan ini jika bahasanya dinamis. Saya harus menulis penerjemah atau VM yang melacak informasi saat runtime dan memberikan lebih banyak pekerjaan pada saya.
Singkatnya, apakah ada sumber daya yang harus saya periksa mengingat saya tahu bagaimana kompiler bekerja tetapi ingin bermigrasi untuk membuat juru bahasa? Ada beberapa VM di luar sana untuk bahasa dinamis, tapi saya tidak punya masalah dengan menggulirkan saya sendiri. Ini semua hanya untuk pengalaman pribadi saya.
Saya mencari informasi tentang cara beralih dari kompiler ke juru bahasa. Jika saya sudah membuat kompiler untuk bahasa X tapi sekarang apa yang harus ditulis juru bahasa, apa yang perlu dilakukan dan apakah ada sumber daya yang melewati proses?
Saya tidak ingin sumber daya yang luas atau abstrak yang membahas bagaimana kompiler atau mesin virtual bekerja. Saya punya banyak buku pelajaran tentang masalah ini. Semua sumber yang saya temukan online mengasumsikan Anda memiliki pengalaman 0 dan dengan demikian memulai Anda dengan analisis leksikal atau sintaksis atau mereka sangat abstrak. Saya memiliki kompiler yang berfungsi, tetapi sekarang saya ingin mengubahnya menjadi penerjemah dan menambahkan fitur dinamis ke bahasa.
Saya tidak dapat menemukan sumber daya pada proses ini, mungkin cakupannya terlalu terbatas, atau sumber daya pada "bagian belakang" seorang penerjemah tanpa menjadi terlalu teoretis, itulah sebabnya saya diposting di sini.
sumber
Jawaban:
Pertama-tama pelajari tentang menerapkan juru bahasa. Saya merekomendasikan PLAI (Bahasa Pemrograman: Aplikasi dan Interpretasi) . Itu sampai ke daging interpretasi dengan cepat tanpa tinggal terlalu lama pada sintaks.
Untuk bahasa Anda, Anda akan dapat menggunakan kembali front-end kompiler (parser, kebanyakan) dan run-time library (GC, struktur data, operasi primitif, dll).
Tentu saja, Anda juga dapat mengimplementasikan bahasa dinamis dengan kompiler yang menghasilkan kode yang memanipulasi (sebagian) struktur data yang sama yang akan Anda gunakan dalam juru bahasa. Misalnya, dalam juru bahasa Anda bisa mengimplementasikan variabel global sebagai tabel hash yang diindeks-string. Di kompiler, Anda akan mengkompilasi referensi variabel global ke dalam kode yang melakukan pencarian menggunakan tabel yang sama. Sebaliknya, Anda bisa mengkompilasi variabel leksikal menjadi representasi yang lebih efisien (argumen "asli" dan referensi struktur penutupan).
sumber
Jika Anda ingin mempelajari dasar-dasar penerapan juru bahasa untuk bahasa yang dinamis, saya tidak bisa membayangkan tempat yang lebih baik untuk memulai daripada asal-usul bahasa pemrograman pertama yang ditafsirkan secara dinamis: Lisp.
Dalam makalah aslinya tahun 1960 , John McCarthy mendefinisikan 5 fungsi primitif yang diperlukan untuk seorang Lisp. Tentu saja, McCarthy hanya bermaksud makalahnya tentang Lisp sebagai latihan akademis; itu adalah seorang mahasiswa pascasarjana yang terlibat
eval
dalam perakitan dan menciptakan juru bahasa Lisp pertama. Paul Graham mengidentifikasi tujuh primitif : kutipan, atom, persamaan, kontra, mobil, cdr, dan kond.Masalahnya, Anda benar-benar dapat mengimplementasikan Lisp dalam bahasa apa pun; begitu Anda menerapkan
eval
, mudah untuk membuat REPL, dan Anda memiliki juru bahasa interaktif . Orang-orang sudah bosan atau cukup ingin tahu untuk mengimplementasikan Lisps dalam bahasa C, Java, Ruby, Python, dan banyak lainnya. Dan tidak selalu dengan sengaja; Penting untuk diingat Aturan Kesepuluh Greenspun :Saya tidak mengatakan tujuan akhir Anda harus menjadi implementasi Lisp; tetapi homoiconicity memiliki manfaat ketika belajar menerapkan bahasa yang dinamis; mengapa berurusan dengan masalah sintaks ketika Anda bisa belajar pada bahasa di mana sintaksis idiom identik dengan AST bahasa yang menggunakan lexer / parser?
Bagaimanapun ... hanya saran. Tetapi dengan alasan yang kuat bahwa sebagian besar bahasa pemrograman yang bagus sejak C memiliki setidaknya sedikit sifat Lisp.
sumber
Saya telah meletakkan ini (~ 600 baris C #) di domain publik, yang mendukung kutipan / daftar / terapkan / eval / test / dll, dan memungkinkan untuk mengkustomisasi sintaks seperti Lisp dan / atau builtin semantik dengan mudah:
https://repl.it/CdjV/3
Misalnya:
'HTH,
sumber
Dengan asumsi Anda tahu sedikit Skema (misalnya telah membaca SICP ) atau Lisp, saya merekomendasikan buku Lisp In Small Pieces karya Queinnec . Ini menjelaskan beberapa varian interpreter & kompiler mirip Lisp (termasuk ke bytecode atau ke C).
Juga, baca Scott's Programming Language Pragmatics , Buku Naga terbaru , buku pegangan GC , Jenis - jenis Pierce & bahasa pemrograman .
Kemudian, evaluasi parsial (& proyeksi Futamura) dan gaya kelanjutan dapat menjadi relevan.
sumber