Pertanyaan tentang Membuat Bahasa Scripting

12

Katakan, misalnya, saya ingin membayar seseorang untuk membuat bahasa pemrograman atau bahasa scripting untuk saya. Apa jenis dokumen yang akan mereka butuhkan, untuk sepenuhnya memahami apa sebenarnya yang saya inginkan.

Maksud saya, apakah ada dokumen standar yang menjelaskan bahasa pemrograman / scripting baru yang dimaksud?

JTS
sumber
karena ini tentang pemrograman, bukan programmer, ini mungkin lebih cocok untuk StackOverflow.
Muad'Dib
14
Saya tidak setuju dengan Muad'Dib. Saya pikir ini adalah tempat yang bagus untuk pertanyaan ini.
Chris
5
Saya pikir daripada menciptakan bahasa skrip Anda sendiri, dengan biaya banyak pekerjaan untuk Anda dan pengguna Anda harus belajar bahasa baru, Anda lebih baik menanamkan bahasa skrip yang ada. Beberapa bahasa, misalnya Python, Javascript / ECMAScript, dirancang sehingga dapat disematkan ke kerangka kerja yang lebih besar. Singkatnya, Anda hanya perlu merancang API dan mencari cara untuk menanamkan juru bahasa skrip ke dalam program Anda sendiri.
Lie Ryan
1
Ada keuntungan dalam melakukan ini jika bahasa digunakan untuk menjadi DSL. untuk bahasa umum tidak begitu banyak. Tentu saja beberapa bahasa umum adalah basis yang sangat baik untuk DSL misalnya Lisp atau TCL
jk.

Jawaban:

16

Apa yang perlu Anda tulis disebut spesifikasi bahasa .

Ini harus berisi deskripsi tata bahasa (lebih disukai dalam Extended Backus-Naur-Form ) dan semantiknya.

Untuk bagian terakhir Anda bisa menulis deskripsi dengan kata-kata Anda sendiri (tapi berhati-hatilah) atau semantik formal .

sepp2k
sumber
1
BNF hanya berguna untuk tata bahasa bebas konten, bahasa scripting tidak selalu bebas konteks misalnya TCL (meskipun saya pikir Anda masih bisa berdebat itu lebih disukai untuk memiliki bahasa bebas konteks dalam banyak kasus)
jk.
@jk. Saya tidak akan mengatakan BNF sepenuhnya tidak berguna untuk bahasa bebas non-konteks. Bergantung pada bagaimana non-konteks membebaskan sintaks, masih masuk akal untuk menentukannya dalam EBNF dan kemudian menyelesaikan ambiguitas dalam kata-kata. Itulah yang dilakukan standar C ++ misalnya. Dalam kebanyakan kasus saya membayangkan itu masih lebih jelas daripada menjelaskan segala sesuatu dalam kata-kata atau menspesifikasikannya menggunakan tata bahasa konteks-sensitif atau tidak terbatas.
sepp2k
benar, maksud saya lebih ada bahasa seperti lisp, tcl atau sebagainya (yang sebenarnya sangat baik untuk mendefinisikan DSL) yang memiliki sintaks yang memburuk sehingga BNF memberitahu Anda sangat sedikit
jk.
@jk. Tentu, tetapi dalam hal itu segala cara lain untuk menggambarkan sintaks akan memberi tahu Anda sedikit, hanya karena ada begitu sedikit untuk diceritakan. Itu hanya berarti bahwa bagian sintaks dari spesifikasi akan sangat pendek.
sepp2k
13

Anda membutuhkan yang berikut:

  • Alasan untuk membuat bahasa baru
  • Sebuah Filsafat
  • Definisi Semantik
  • Deskripsi leksikal token Anda
  • Definisi Analisis Sintaks

Bagaimana bahasa Anda akan berbeda? Apa misinya? Apakah ini fungsional? Apakah itu berorientasi objek? Apakah ini bahasa meta? Apa saja fitur uniknya? Apa yang akan ia berikan kepada dunia yang tidak ada (atau ada dengan cara yang jelek)? Bagaimana Anda ingin mengubah sesuatu? Apakah ini dikompilasi atau ditafsirkan? DSL atau bahasa tujuan umum? Ini adalah filosofi Anda dan menentukan banyak tentang desain bahasa Anda.

Selanjutnya, bekerja pada mencoret sintaks kasar dan semantik di atas kertas. Ini akan menjadi definisi semantik Anda ... menulis kode palsu adalah cara yang bagus untuk mengembangkan pemikiran Anda. Baca "Bahasa Pemrograman C" untuk contoh yang sangat baik tentang bagaimana hal ini dilakukan. Main dengannya.

Anda kemudian perlu mendefinisikan token dan sintaks Anda dalam beberapa cara. Program kemudian mengolahnya menjadi automata yang mampu membaca dalam string dan memproses sintaksis. Yacc dan Bison menggunakan Ekspresi Reguler dan sintaks gaya BNF masing-masing untuk analisis leksikal dan sintaksis. Ada juga Yacc dan Bison seperti alat untuk bahasa lain.

Anda juga akan memerlukan landasan dalam teori / kompiler bahasa untuk mengetahui apa yang TIDAK harus dilakukan. Contohnya termasuk tata bahasa yang ambigu, generasi AST dan masalah manipulasi dan umumnya bagaimana membuat hidup sederhana untuk diri sendiri. Mengetahui teori itu sangat penting. Saya akan mempertimbangkan untuk memulai yang berikut ini:

Compiler: Prinsip, Teknik dan Peralatan (Buku Naga)
Implementasi Kompiler Modern di C atau Implementasi Kompiler Modern di Jawa

Aiden Bell
sumber
1
+1 untuk filosofi, untuk DSL Anda jelas ingin mengidentifikasi domain di sini
jk.
8

99,9% dari waktu membuat bahasa baru sama sekali tidak perlu. Pengembalian investasi kemungkinan besar akan sangat kecil, dan Anda hanya akan membuang-buang waktu.

Kemungkinan besar Anda dapat menggunakan Javascript sebagai bahasa skrip yang rentan, dan sudah ada parser untuk sebagian besar bahasa. Anda juga dapat menggunakan bahasa skrip lain yang Anda suka jika Anda dapat menemukan parser yang cocok untuk mereka. Menerapkannya ke dalam program Anda akan membutuhkan lebih sedikit pekerjaan dan memiliki pengembalian yang lebih besar. Orang tidak harus belajar bahasa lain, mereka hanya perlu mempelajari API Anda. Ini solusi yang jauh lebih baik.

Membuat bahasa baru hampir selalu buruk.

TheLQ
sumber
9
Kecuali untuk banyak waktu ketika itu tidak buruk. Membuat DSL sederhana Anda sendiri bisa sangat berguna. Sekarang menciptakan bahasa tujuan umum Anda sendiri akan lebih sesuai dengan apa yang jawaban Anda katakan.
ChaosPandion
@ChaosPandion tetapi banyak bahasa sudah unggul dalam menciptakan DSL yang menggunakan kode dari bahasa itu (yaitu ruby ​​pandai dalam hal ini)
alternatif
2
Saya setuju dengan jawaban Anda tetapi saya yakin ini bukan jawaban yang tepat untuk pertanyaan ini. Saya percaya si penanya melihat generalisasi membuat bahasa scripting bukan untuk pro / kontra dari menciptakannya.
Tim Murphy
Membuat bahasa baru hampir selalu merupakan solusi terbaik. en.wikipedia.org/wiki/Language-oriented_programming
SK-logic
3

Anda dapat menggambarkan tata bahasa Anda di BNF .

Sebagai contoh, ini adalah tata bahasa Python .

grokus
sumber
6
Tata bahasanya dengan sendirinya tidak cukup informasi untuk mengimplementasikan suatu bahasa. Dia juga harus menentukan semantik dengan satu atau lain cara.
sepp2k
0

jika Anda menggunakan .NET, berikut adalah sesuatu yang saya temukan beberapa waktu lalu. Aku hanya meliriknya dengan rasa ingin tahu, tapi mungkin itu akan berguna bagimu: ironi .

Irony adalah kit pengembangan untuk mengimplementasikan bahasa pada platform .NET.

DevSolo
sumber