Saya telah membaca tentang interpreter meta-sirkuler di web (termasuk SICP) dan saya telah melihat ke dalam kode beberapa implementasi (seperti PyPy dan Narcissus).
Saya sudah membaca sedikit tentang dua bahasa yang memanfaatkan evaluasi metacircular, Lisp dan Smalltalk. Sejauh yang saya mengerti Lisp adalah kompiler self-hosting pertama dan Smalltalk memiliki implementasi JIT "benar" pertama.
Satu hal yang belum sepenuhnya saya pahami adalah bagaimana para penerjemah / penyusun itu dapat mencapai kinerja yang begitu baik atau, dengan kata lain, mengapa PyPy lebih cepat daripada CPython? Apakah karena refleksi?
Dan juga, penelitian Smalltalk saya membuat saya percaya bahwa ada hubungan antara JIT, mesin virtual dan refleksi. Mesin Virtual seperti JVM dan CLR memungkinkan banyak jenis introspeksi dan saya percaya mereka memanfaatkannya dalam kompilasi Just-in-Time (dan AOT, saya kira?). Tapi sejauh yang saya tahu, Mesin Virtual seperti CPU, karena mereka memiliki set instruksi dasar. Apakah Mesin Virtual efisien karena mereka memasukkan informasi jenis dan referensi, yang akan memungkinkan refleksi agnostik bahasa?
Saya menanyakan hal ini karena banyak bahasa yang ditafsirkan dan dikompilasi sekarang menggunakan bytecode sebagai target (LLVM, Parrot, YARV, CPython) dan VM tradisional seperti JVM dan CLR telah memperoleh peningkatan kinerja yang luar biasa. Saya telah diberitahu bahwa ini tentang JIT, tetapi sejauh yang saya tahu JIT bukanlah hal yang baru sejak Smalltalk dan Sun sendiri telah melakukannya sebelum Jawa. Saya tidak ingat VMs berkinerja sangat baik di masa lalu, tidak banyak yang non-akademik di luar JVM dan .NET dan kinerja mereka jelas tidak sebagus sekarang (saya berharap saya bisa mendapatkan klaim ini tapi saya berbicara dari pengalaman pribadi).
Lalu tiba-tiba, di akhir tahun 2000-an sesuatu berubah dan banyak VM mulai muncul bahkan untuk bahasa yang sudah mapan, dan dengan kinerja yang sangat baik. Apakah ada sesuatu yang ditemukan tentang implementasi JIT yang memungkinkan hampir setiap VM modern meroket dalam kinerja? Mungkin kertas atau buku?
Jawaban:
2 dari 3: Tidak ada hubungan antara runtime bahasa "meta-circular" dan "high-performance". Meta-circular runtimes yang mencapai kinerja tinggi melakukannya dengan mengkompilasi JIT ke kode asli, dan menjalankan kode asli. Tidak ada alasan mengapa hi-perf Python runtime Anda harus ditulis dalam Python, atau Lisp di Lisp, dll. Tetapi jika Anda berpikir bahwa bahasa Anda lebih kuat, ekspresif, dll. Daripada yang lain, mengapa tidak menggunakannya untuk menulis runtime sendiri? Atau jika Anda tidak berpikir bahwa bahasa Anda entah bagaimana "lebih baik" daripada yang lain, mengapa Anda kesulitan menerapkannya sama sekali?
sumber