Apakah ada bahasa pemrograman yang dapat disesuaikan yang dapat Anda gunakan untuk mengonversi ke yang lain?


13

Apakah ada bahasa pemrograman di mana Anda dapat mengatur konfigurasi sintaks Anda sendiri dan itu akan mengubah kode ke bahasa yang Anda pilih?

Misalnya, Anda akan memilih konfigurasi spesifik seperti "blok terindeks Python", [a,b,c]menginisialisasi array, ^untuk eksponensial dan lainnya. Sebuah skrip akan mengubahnya menjadi setara dengan bahasa pilihan Anda.


1
Saya harap tidak. TIMTOWTDI bisa dibilang buruk, tetapi "menemukan sebanyak mungkin cara yang tidak sesuai yang Anda inginkan" pasti akan memiliki kelemahan yang sama kali ratusan, dan bahkan menjadi kurang berguna. DSL kadang-kadang sepadan, tetapi mendefinisikan ulang setengah dari sintaks (atau lebih buruk - bertukar dua operator, memberikan kompabilitas yang jelas tetapi semantik yang berbeda) hanya untuk itu saja ...

Saya menanyakan hal ini karena secara khusus saya memprogram tentang javascript dan akan sangat, sangat ingin dapat mengatur beberapa sintaks gula pada kode saya tetapi bahasa tidak akan mengizinkannya. Bahkan overloading operator tidak dimungkinkan.
Dokkat

2
Untuk tingkat tertentu, apa yang Anda gambarkan terdengar seperti macro preprocessor . Sekarang seandainya saja kita dapat memiliki fitur serupa untuk perl ...
yannis

5
@Dokkat: Harap perbarui pertanyaan untuk secara spesifik menyatakan bahwa ini tentang JavaScript. Pertanyaannya - sebagaimana ditanyakan - adalah pemeliharaan dan dukungan mimpi buruk. Menambahkan sintaks baru ke bahasa yang ada (atau menggunakan pra-prosesor untuk mengubah bahasa pribadi Anda ke bahasa publik) benar-benar mengerikan. Namun. Jika Anda mendaftar masalah gula sintaksis spesifik JavaScript, Anda mungkin mendapatkan bantuan khusus .
S.Lott

3
"Bahasa pemrograman yang dipersonalisasi" ini biasanya disebut "bahasa khusus domain" atau DSL.
Michael Dillon

Jawaban:


14

Ya, tapi mungkin tidak dengan cara Anda berpikir.

Lisp dan kerabatnya memiliki sistem makro yang kuat yang memungkinkan Anda melakukan transformasi sewenang-wenang pada sumber Anda, jadi pada prinsipnya Anda dapat menggunakan makro (dan makro pembaca, di tingkat karakter) untuk membuat hampir semua ekstensi yang Anda suka. Bahasa konkatatif (dan bahasa oleh penulis di bidang terkait) memiliki potensi untuk kekuatan pemrograman yang serupa . Contoh yang baik dari ini adalah Forth , di mana banyak konstruksi sintaksis (seperti komentar) dapat didefinisikan pengguna. Untuk contoh kontemporer dan non-esoterik, ada upaya untuk memberikan dukungan Perl 6 yang lebih baik daripada Perl 5 untuk sintaks yang ditentukan pengguna juga.


8
Saya entah bagaimana tahu Perl akan menjadi bagian dari jawabannya. Saya kira macro preprocessor C juga cocok dengan deskripsi, untuk perluasan kecil.
yannis

Operator overloading di C ++ juga bagus. Contoh halo dunia terlintas dalam pikiran. cout << "Hai";
Lord Tydus

@ LordTydus: Memang, dan bahkan hanya operator yang berlebihan membuat Anda bisa melakukan sedikit keajaiban di balik antarmuka yang waras. Akan lebih baik jika C ++ memiliki kemampuan overloading yang lebih umum, katakanlah, overloading operator[]untuk beberapa argumen, atau memperkenalkan operator baru seperti di Haskell; tapi saya ragu komite akan melihat melewati masalah parsing.
Jon Purdy

3

Kedengarannya seperti pemrograman konsep .

Saya tidak terbiasa dengan itu, tetapi XL adalah bahasa yang dirancang khusus untuk itu.

XL menghadirkan sintaks dan semantik yang dapat diprogram ulang oleh programmer. Plug-in kompiler dapat digunakan untuk menambahkan fitur baru ke bahasa.

Lisp dan Forth juga mendukung pemrograman konsep, meskipun kurang dari XL. Saya menyarankan Lisp karena sangat praktis dan efektif. Yang paling penting adalah sintaks yang jelas dan fleksibel, bukan notasi, yang disediakan Lisp.


Misalnya, Anda akan memilih konfigurasi spesifik seperti "blok diindeks Python", "[a, b, c]" menginisialisasi array, "^" untuk eksponensial dan lainnya.

Anda mungkin tertarik pada bahasa seperti Haskell yang memiliki sintaks yang sangat fleksibel namun seragam.


Ini yang saya cari.
Dokkat

2

Tidak sepengetahuan saya.

Saya tidak berpikir itu akan menjadi ide yang sangat baik juga - salah satu manfaat utama dari sintaks bahasa standar adalah bahwa banyak orang dapat membacanya, dan jika semua orang menemukan sintaks mereka sendiri maka tidak ada yang akan dapat memahami kode orang lain. .... jadi bahasa ini mungkin menyenangkan bagi penggemar tetapi tidak banyak berguna untuk hal praktis.

Hal terdekat yang ada mungkin adalah Lisp, di mana sistem makro memungkinkan Anda menulis konstruksi bahasa Anda sendiri dengan cara yang sangat fleksibel. Biasanya Anda akan tetap menggunakan sintaks Lisp, tetapi Anda dapat secara efektif mendefinisikan kembali semuanya jika Anda benar-benar menginginkannya.

Akibatnya, Lisps cenderung sangat populer untuk menerapkan DSL. Contoh yang bagus adalah akses data ini DSL di Clojure (Korma) yang menangani semua kode boilerplate yang diperlukan untuk akses database.


2

Scala sering digunakan dengan cara ini untuk membuat DSL, Bahasa Khusus Domain.

Terutama ini karena Scala tidak memiliki operator, dan metode scala yang memanggil sintaksis dapat disingkat. Contohnya:

5 adalah objek Integer. Untuk menghitung 5 ditambah 7 Anda bisa menulis

val ans = 5.add (7) kecuali bahwa metode penambahan sebenarnya bernama "+" sehingga Anda akan menulis:

val ans = 5. + (7) tetapi dalam Scala, Anda tidak perlu memasukkan "." dalam pemanggilan metode atau tanda kurung "()" di sekitar argumen sehingga untuk memanggil metode + pada objek 5, Anda akan menulis

val ans = 5 + 7 yang bekerja dengan sempurna karena Scala tidak memiliki operator untuk mengganggu skema penamaan metode pintar Anda. Sekarang perluas gagasan itu ke kelas dan objek Anda sendiri, termasuk fakta bahwa Anda dapat "mengganti" metode seperti + serta membuat metode Anda sendiri bernama >>> atau ::! atau @ * @ atau hanya nama teks biasa seperti fancify.


Ini luar biasa. Saya akan lihat scala.
Dokkat

1

Tidak mengatakan Anda harus menggunakannya karena sebagian besar masih eksperimental, tetapi satu paradigma pemrograman baru yang menarik adalah Pemrograman Berorientasi Bahasa (LOP).

Konsep Pemrograman Berorientasi Bahasa mengambil pendekatan untuk menangkap persyaratan dalam istilah pengguna, dan kemudian mencoba untuk membuat bahasa implementasi sebagai isomorfik mungkin dengan deskripsi pengguna, sehingga pemetaan antara persyaratan dan implementasi adalah selurus mungkin.

Sergey Dmitriev menjelaskannya secara lebih rinci .

Itulah ideologi itu, tetapi praktis itu memanas yang mendukung perilaku yang Anda minta. Kamu bisa:

  • Perpanjang bahasa yang ada.
  • Tulis bahasa yang berbeda.
  • Gunakan 'bahasa transformasi' yang ada untuk mengonversi kata kunci Anda yang baru didefinisikan ke bahasa dasar.

Paling pemrograman aktif lingkungan saya tahu berikut paradigma ini adalah gratis Meta Pemrograman Sistem (MPS) oleh JetBrains.

Ini sebenarnya mulai digunakan dalam perangkat lunak komersial juga, jadi mungkin itu mulai keluar dari fase 'eksperimental':

  • Realaxy adalah editor tindakan yang dibangun sepenuhnya di atas MPS. Dengan menggunakan kekuatan LOP mereka dapat menerapkan mis penutupan untuk AS3.
  • mbeddr C adalah bahasa C yang dapat dikembangkan berdasarkan MPS.

1

Bahasa khusus domain cukup umum digunakan dalam komunitas Tcl. Misalnya, sama sekali tidak umum untuk melihat program Tcl yang berisi C dan SQL sebagai DSL yang disematkan (melalui paket Critcl dan Sqlite). Tentang satu-satunya batasan pada DSL tertanam adalah bahwa itu jauh lebih baik jika bahasa tertanam menyeimbangkan kurung kurawal, dan yang ternyata menjadi persyaratan yang benar-benar tidak berat dalam praktek!

Bahasa lain yang membuat DSL mudah adalah Standar ML, yang memungkinkan Anda memiliki akses ke token mentah dari tokenizer sistem generik (dari sebelum titik di mana pengidentifikasi dikonversi menjadi kata kunci). Hal ini membuat melakukan berbagai kelas DSL menjadi mudah - asalkan mereka mematuhi beberapa aturan sintaksis dasar SML, terutama dalam kaitannya dengan komentar, string dan batas token - dan pada kenyataannya banyak digunakan dalam sejumlah aplikasi penggerak utama untuk bahasa tersebut. (pembuktian teorema, dll.)

Tidak semua bahasa membuatnya mudah. Secara khusus, bahasa yang secara otomatis mem-parsing isi dari istilah yang diperkuat (banyak dari mereka!) Tidak dapat melakukan ini, sehingga mereka membutuhkan DSL untuk dibangun oleh operator utama, dengan menempatkan sub-bahasa ke dalam string, atau dengan menggunakan pra-prosesor yang menulis ulang DSL menjadi sesuatu yang dapat ditangani di dalam bahasa host.


0

AFAIU Anda mencari bahasa yang dapat membantu Anda menulis DSL Anda sendiri (Bahasa Khusus Domain). Ada banyak kandidat yang bagus. Secara pribadi saya akan merekomendasikan Ruby atau Io, karena mereka menawarkan 1) overloading operator mudah, 2) meta-pemrograman, dan 3) mekanisme fallback seperti method_missingyang dapat Anda gunakan untuk membuat API Anda sendiri. Misalnya, lihat dalam sqldsl , DSL yang ditulis dalam Ruby yang menghasilkan SQL dengan membaca kode Ruby.


0

Saya belum benar-benar menggunakannya , tetapi jika saya ingat dengan benar, TXL dirancang khusus untuk menerjemahkan kode sumber. Karena itu, Anda harus dapat menggunakannya untuk menentukan cara menerjemahkan dari bahasa Anda dan / atau ekstensi bahasa ke bahasa target apa pun.

Tampaknya ada tata bahasa yang tersedia untuk Javascript. Tapi, belum pernah menggunakannya sebelumnya, saya tidak yakin bagaimana itu akan membantu Anda.


0

Ada preprosesor yang bagus di luar sana yang disebut PPWizard, cukup kuat. Setelah Anda mempelajari sintaksnya, Anda dapat membuat defs makro untuk menargetkan berbagai bahasa - bukan karena hal itu sangat mudah atau menyenangkan, tetapi ini adalah alat yang berguna.


di sini beberapa tautan: ISI PPWIZARD (dokumen resmi), PPWizard - EDM2 ( referensi eksternal). Alat ini sangat kuat, tetapi dokumentasinya tidak mudah dibaca (mungkin karena kekuatannya).
Wolf


0

Salah satu cara umum untuk mempersonalisasi sebagian bahasa pemrograman adalah dengan menggunakan pra-prosesor makro. Misalnya Anda bisa menjalankan "dokkat-lang" melalui preprosesor C sebelum meletakkan hasilnya di mana beberapa lingkungan javascript akan mengunduhnya.

Seberapa banyak yang dapat Anda lakukan tergantung pada kecanggihan preprosesor Anda. Perhatikan bahwa versi awal C ++, Objective C, dan berbagai bahasa eksperimental dilakukan dengan preprocessing kode sumber sebelum mengumpankan ke rantai alat kompiler C persediaan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.