Dengan mengacu pada fitur-fitur dalam bahasa seperti ruby (dan javascript), yang memungkinkan seorang programmer untuk memperluas / menimpa kelas setiap saat setelah mendefinisikannya (termasuk kelas-kelas seperti String), apakah secara teori layak untuk merancang bahasa yang dapat memungkinkan program untuk kemudian memperluas semantiknya.
mis: Ruby tidak mengizinkan multiple inheritance, namun dapatkah saya memperluas / mengganti perilaku bahasa default untuk memungkinkan implementasi multiple inheritance.
Apakah ada bahasa lain yang memungkinkan ini? Apakah ini sebenarnya menjadi perhatian bagi perancang bahasa? Melihat pilihan menggunakan ruby untuk membangun kerangka rel untuk pengembangan aplikasi web, bahasa tersebut mungkin sangat kuat untuk memungkinkan kerangka kerja desain (atau DSL) untuk berbagai aplikasi.
sumber
@Nullable
dan@NonNull
yang digunakan oleh checker eksternal seperti findbugs.Jawaban:
Converge memiliki beberapa fasilitas pemrograman meta yang cukup mengesankan.
yang merupakan langkah maju dari makro higienis Scheme yang memungkinkan definisi makro yang transparan secara referensial.
Mekanisme seperti kuasiliter memungkinkan pembangunan dan perusakan pohon parse dalam bahasa lain, tetapi lebih sering digunakan untuk berinteraksi dengan bahasa khusus domain (DSL) daripada modifikasi diri.
Refleksi Newspeak memungkinkan pengecualian untuk diterapkan sebagai kode perpustakaan.
Perligata: Romana menunjukkan bagaimana sintaks yang sama sekali baru dapat dikuliti ke bahasa.
Diperdebatkan tidak signifikan secara semantik, PyPy adalah generator interpreter untuk bahasa yang semantiknya ditentukan dalam subset Python yang sangat dapat dianalisis secara statis, dan mereka menggunakannya untuk bereksperimen dengan konstruksi bahasa baru dalam Python seperti menambahkan thunks ke dalam bahasa.
Yang juga menarik adalah Ometa .
Disertasi Alex Warth menunjukkan penggunaan Ometa untuk mendefinisikan semantik baru secara signifikan (semantik transaksional via dunia) dalam JavaScript + Ometa.
sumber
"Apakah secara teori layak? *
Bahasa baru mungkin masih berjalan lambat jika model run-time-nya berbeda secara signifikan dari bahasa implementasi. Dalam hal ini, bit dari juru bahasa akan muncul dalam kode yang diterjemahkan dan akan terus berjalan lambat. Namun, jika bahasa baru sebagian besar sama dengan bahasa asli, dengan hanya beberapa tweak, maka harus mungkin untuk menghilangkan sebagian besar bit juru bahasa dalam kode target dengan penyetelan evaluasi parsial yang cermat. Maka kinerja hit akan ada hanya untuk fitur-fitur baru.
Akibatnya, ini adalah teknologi "virtualisasi" untuk bahasa pemrograman.
sumber
Secara historis, Lisp adalah bahasa pemrograman utama pertama yang memperkenalkan fasilitas metaprogramming. Sistem makro Lisp memungkinkan pemrogram untuk menentukan struktur kontrol baru, templat data baru, dll. Misalnya, Sistem Objek Lisp Umum dapat didefinisikan seluruhnya dengan makro di atas bahasa inti yang tidak tahu apa-apa tentang objek atau kelas. Sistem makro juga memungkinkan definisi bahasa khusus domain .
Ruby mendapat banyak inspirasi dari Lisp, termasuk kapasitasnya untuk reflektivitas dan metaprogramming. Banyak bahasa yang diketik secara dinamis telah mengambil inspirasi dari Lisp dalam hal ini. (Pengetikan statis mempersulit hal-hal, karena banyak ekstensi tidak cocok dengan sistem tipe asli.)
sumber
Belum disebutkan dalam jawaban / komentar:
Survei:
Abstrak: Bahasa yang dapat dikembangkan adalah bahasa pemrograman yang memungkinkan pengguna untuk mengubah atau menambahkan sintaksis, dan mengaitkan formulir sintaksis baru dengan semantik. Untuk apa bahasa ini? Jenis fitur apa yang mudah ditambahkan, dan mana yang tidak? Apakah mereka cukup kuat untuk dianggap serius? Dalam survei ini kami akan mencoba menjawab pertanyaan-pertanyaan seperti yang kami anggap sebagai bahasa yang dapat diperluas secara prosedural, berorientasi objek, fungsional, dan tujuan umum. Kami terutama tertarik pada kekuatan ekspresif (reguler, bebas konteks), peringatan terkait (tidak higienis, ambiguitas) dan kemudahan penggunaan berbagai mekanisme.
dan
Abstrak: Kemampuan untuk memperluas bahasa dengan bentuk sintaksis baru adalah alat yang ampuh. Sistem makro yang cukup fleksibel memungkinkan pemrogram untuk membangun dari basis bersama menuju bahasa yang dirancang khusus untuk domain masalah mereka. Namun, fasilitas makro yang terintegrasi, mampu, dan pada saat yang sama cukup sederhana untuk digunakan secara luas telah terbatas pada keluarga bahasa Lisp sampai saat ini. Dalam makalah ini kami memperkenalkan fasilitas makro, yang disebut Java Syntactic Extender (JSE), dengan kekuatan superior dan kemudahan penggunaan sistem makro Lisp, tetapi untuk Java, bahasa dengan sintaks aljabar yang lebih konvensional. ...
sumber