Saya telah membuat kompiler dalam C (menggunakan Lex & Bison) untuk bahasa pemrograman tipe dinamis yang mendukung loop, deklarasi fungsi di dalam fungsi, panggilan rekursif, dll. Saya juga membuat mesin virtual yang menjalankan kode perantara yang dibuat oleh kompilator.
Saya berpikir untuk mengkompilasinya ke bytecode Java daripada kode perantara saya sendiri.
Saya melihat bahwa pertanyaan tentang membuat bahasa JVM telah diajukan , tetapi saya tidak menemukan jawabannya sangat informatif.
Jadi inilah pertanyaanku:
- Saya kira untuk membuat bahasa untuk JVM yang harus adalah membaca buku spesifikasi JVM , buku lain apa yang bisa Anda sarankan (kecuali Buku Naga tentunya)? Saya sangat memperhatikan buku atau tutorial tentang cara membuat bahasa JVM, bukan kompiler pada umumnya.
- Ada banyak library Java untuk membaca, menulis, dan mengubah
.class
file seperti jclasslib , bcel , gnu bytecode , dll. Mana yang akan Anda sarankan? Juga, apakah Anda mengetahui pustaka C yang melakukan pekerjaan yang sama? - Saya berpikir untuk melihat mungkin bahasa lain yang menargetkan JVM seperti Clojure, Jython atau JRuby. Tetapi semua bahasa ini memiliki level yang sangat tinggi dan rumit (untuk membuat kompiler untuk mereka). Saya mencari bahasa pemrograman yang lebih sederhana (saya tidak keberatan jika tidak diketahui atau tidak digunakan) yang menargetkan JVM dan kompilernya adalah open source. Ada ide?
Semester lalu saya telah mengikuti kursus "Konstruksi Penyusun". Proyek kami persis seperti yang ingin Anda lakukan.
Bahasa yang saya gunakan untuk menulis bahasa saya adalah Scala . Ini berjalan pada JVM tetapi mendukung banyak fitur lanjutan yang tidak dimiliki Java (masih sepenuhnya kompatibel dengan Java JVM murni).
Untuk mengeluarkan java bytecode saya telah menggunakan library Scala CAFEBABE . Didokumentasikan dengan baik dan Anda tidak perlu masuk jauh ke dalam kelas java untuk memahami apa yang harus dilakukan.
Selain buku, saya rasa Anda bisa menemukan banyak info dengan menelusuri lab yang telah kami lakukan selama kursus.
sumber
ASM dapat menjadi solusi untuk menghasilkan bytecode. Untuk memulai, periksa topik tentang menghasilkan elemen dari manual .
sumber
Saran: Bisa lihat di Lua Programming Language , ada implementasi JVM nya seperti LuaJ .
(Jangan bingung dengan LuaJava yang menggunakan lib asli dengan pendekatan JNI.)
sumber
Akhir pekan lalu, saya bertanya pada diri sendiri pertanyaan yang sama untuk memindahkan bahasa mainan saya ke JVM.
Saya hanya menghabiskan beberapa jam mencari informasi, jadi ambillah referensi ini dengan sebutir garam.
Pola Implementasi Bahasa . Saya benci antlr tetapi buku ini terlihat sangat bagus. Jika Anda juga tidak suka antlr, ada baiknya menguraikan "Teknik Parsing. Panduan Praktis."
Bab 10 mencakup 30 halaman (untuk IMO cepat) topik ini. Namun ada chapter lain yang mungkin menarik bagi Anda.
Implementasi Lua 5.0 Ini adalah makalah yang bagus tentang mesin bytecode berbasis register. Bacalah bahkan demi itu.
Lisp dalam Potongan Kecil. Buku ini mengajarkan bagaimana menulis 2 schme compailers yang mengkompilasi ke C. Begitu banyak pelajaran yang bisa dipetik dari buku ini. Saya memiliki salinan dari buku ini dan sangat bagus untuk siapa pun yang menarik adalah cadel, tapi mungkin bukan secangkir teh Anda.
http://www.amazon.com/Lisp-Small-Pieces-Christian-Queinnec/dp/0521562473
Periksa VM Dalvik7, VM berbasis register. DVM beroperasi pada bytecode yang diubah dari file Java Class yang dikompilasi oleh compiler Java.
Ada milis tentang topik, bahasa-jvm.
Apakah Anda berencana untuk mengunggah kode ke sembarang tempat? Saya ingin melihatnya.
sumber
Are you planning to upload the code to anyplace?
Saya tidak bangga dengan kode itu :( ... Saya mungkin akan menulis ulang semuanya. Bagaimanapun, jika saya melakukannya, saya akan memberi tahu Anda. Terima kasih banyak atas saran Anda.Saya akan merekomendasikan agar Anda terlebih dahulu mempelajari cara kerja perakitan JVM, jika Anda belum mengetahuinya.
Banyak petunjuk memiliki bentuk
?name
, di mana?
adalahi
jika instruksi bekerja pada dengan tipe integer dana
jika bekerja dengan tipe referensi.Pada dasarnya, JVM adalah mesin stack tanpa register, jadi semua instruksi bekerja dengan data secara langsung di stack. Anda dapat mendorong / memunculkan data dengan
?push/?pop
dan memindahkan data antara variabel lokal (lokasi tumpukan yang direferensikan oleh offset) dan bagian atas tumpukan menggunakan?store/?load
. Beberapa instruksi penting lainnya adalahinvoke???
danif_???
.Untuk kursus kompiler universitas saya, kami menggunakan Jasmin untuk merakit program. Saya tidak tahu apakah ini cara terbaik, tetapi setidaknya ini adalah tempat yang mudah untuk memulai.
Berikut adalah referensi instruksi untuk versi lama JVM, yang mungkin berisi instruksi lebih sedikit daripada yang baru.
sumber
Pertama saya akan mundur, memodifikasi kompiler saya untuk menghasilkan Java yang sebenarnya daripada kode byte Java (yang berarti membuat lebih banyak penerjemah daripada kompiler), dan mengkompilasi output Java dengan lingkungan Java apa pun yang nyaman (yang mungkin akan menghasilkan kode objek yang lebih baik dari kompiler saya sendiri).
Anda dapat menggunakan teknik yang sama (misalnya, mengkompilasi ke C #) untuk menghasilkan kode byte CLI, atau mengkompilasi ke Pascal untuk menghasilkan kode-P, dll.
Tidak jelas mengapa Anda mempertimbangkan kode Java daripada menggunakan VM Anda sendiri, tetapi jika itu untuk kinerja maka tentu saja Anda juga harus mempertimbangkan untuk mengkompilasi ke kode mesin yang sebenarnya.
sumber
Tentu sekali bisa menggunakan Java untuk menulis bahasa baru. Dengan API refleksi Java Anda bisa mendapatkan llot. Jika kecepatan tidak terlalu penting, saya akan memberikan Java preferensi daripada ASM. Pemrograman lebih mudah dan tidak terlalu rawan kesalahan di Java (IMHO) . Lihatlah bahasa RPN ke-7 . Itu seluruhnya ditulis di Jawa.
sumber