Bisakah bahasa program cukup lunak untuk memungkinkan program memperluas semantik bahasa

15

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.

sandeepkunkunuru
sumber
2
Apakah Anda dihitung sebagai ekstensi semantik makro higienis Skema atau refleksi dari penuturan koran yang memungkinkan pengecualian untuk diterapkan sebagai kode perpustakaan? Bagaimana dengan ekstensi sintaksis seperti Perligata: Romana ?
Ini tampaknya menjadi pertanyaan yang menanyakan daftar bahasa daripada konsep. Suntingan yang tertunda mengubah arah pertanyaan, saya hampir memilih untuk menutup sebagai offtopic.
Raphael
Jika saya ingat dengan benar, bahkan Java akan mendapatkan fitur yang memungkinkan program untuk memperluas sistem tipe.
Raphael
1
@ Raphael, apakah Anda memikirkan JSR 305 ? Anotasi Java dirancang (sebagian) oleh Gilad Bracha yang mendesain Newspeak yang saya tautkan dalam jawaban saya di bawah ini dan juga memperjuangkan sistem tipe pluggable . JSR 305 menyediakan anotasi sistem jenis suka @Nullabledan @NonNullyang digunakan oleh checker eksternal seperti findbugs.
Mike Samuel
Tidak jelas apa yang dimaksud dengan "memperluas semantiknya". Jika saya melihat Boost.Spirit , yang sudah melewati ambang pribadi saya "extending semantic" sudah: Operator matematika C ++ digunakan untuk menggambarkan sintaks bahasa sebagai gantinya, yang kemudian kompiler berubah menjadi parser untuk bahasa tersebut. Saya tahu ini bukan apa yang dimaksud dengan "memperluas semantik bahasa" oleh tikus lab, tapi saya pikir ini cukup mengesankan.
DevSolar

Jawaban:

12

Converge memiliki beberapa fasilitas pemrograman meta yang cukup mengesankan.

Pada tingkat yang sederhana, ini dapat dilihat sebagai fasilitas seperti makro, meskipun lebih kuat daripada kebanyakan fasilitas makro yang ada karena kode arbitrer dapat dijalankan pada waktu kompilasi. Dengan menggunakan ini, seseorang dapat berinteraksi dengan kompiler, dan menghasilkan kode dengan aman dan mudah sebagai ITrees (alias pohon sintaksis abstrak).

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.

7.6 Penanganan Pengecualian

Karena Newspeak menyediakan akses reflektif (7.2) ke catatan aktivasi (3.6), penanganan pengecualian adalah murni masalah perpustakaan. Platform akan menyediakan perpustakaan standar yang mendukung pengecualian melempar, menangkap, dan melanjutkan kembali, seperti halnya di Smalltalk.


Perligata: Romana menunjukkan bagaimana sintaks yang sama sekali baru dapat dikuliti ke bahasa.

Makalah ini menjelaskan modul Perl - Lingua :: Romana :: Perligata - yang memungkinkan untuk menulis program Perl dalam bahasa Latin.


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 ini berfokus pada eksperimen dalam ilmu komputer. Secara khusus, saya akan menunjukkan bahwa bahasa dan konstruksi pemrograman baru yang dirancang khusus untuk mendukung eksperimen dapat secara substansial menyederhanakan pekerjaan para peneliti dan programmer.

Saya menyajikan karya yang membahas dua jenis eksperimen yang sangat berbeda. Yang pertama bertujuan untuk membantu para peneliti bahasa pemrograman bereksperimen dengan ide-ide mereka, dengan membuatnya lebih mudah bagi mereka untuk membuat prototipe bahasa pemrograman baru dan ekstensi untuk bahasa yang ada. Yang lain menyelidiki eksperimen sebagai paradigma pemrograman, dengan memungkinkan program itu sendiri bereksperimen dengan berbagai tindakan dan kemungkinan — dengan kata lain, ini merupakan upaya untuk memberikan dukungan bahasa untuk bagaimana jika ...? atau kemungkinan alasan dunia.

Disertasi Alex Warth menunjukkan penggunaan Ometa untuk mendefinisikan semantik baru secara signifikan (semantik transaksional via dunia) dalam JavaScript + Ometa.

Mike Samuel
sumber
8

"Apakah secara teori layak? *

L.S

L.

SL.

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.

Uday Reddy
sumber
6

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.)

Gilles 'SO- berhenti menjadi jahat'
sumber
4

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. ...

Vor
sumber
1
Silakan tulis satu atau dua kalimat ringkasan untuk setiap referensi; koleksi tautan murni hampir tidak pernah merupakan jawaban "baik".
Raphael