Domanda sulla creazione di un linguaggio di scripting


12

Supponiamo, ad esempio, che volessi pagare qualcuno per creare un linguaggio di programmazione o un linguaggio di scripting per me. Di quale tipo di documento avrebbero bisogno, al fine di comprendere appieno ciò che voglio esattamente.

Voglio dire, ci sono documenti standard che descrivono il nuovo linguaggio di programmazione / scripting in questione?


poiché si tratta di programmazione, non di programmatori, è probabilmente la soluzione migliore per StackOverflow.
Muad'Dib,

14
Non sono d'accordo con Muad'Dib. Penso che questo sia un buon posto per questa domanda.
Chris,

5
Penso che piuttosto che inventare il tuo linguaggio di scripting, a costo di un'enorme quantità di lavoro per te e il tuo utente deve imparare una nuova lingua, incorporeresti meglio un linguaggio di scripting esistente. Alcuni linguaggi, ad esempio Python, Javascript / ECMAScript, sono progettati in modo da poter essere incorporati in un framework più grande. In breve, dovrai solo progettare l'API e trovare un modo per incorporare l'interprete di script nel tuo programma.
Lie Ryan,

1
È vantaggioso farlo se la lingua è goint come DSL. per una lingua generale non tanto. Naturalmente alcune lingue generali sono ottime basi per DSL, ad esempio Lisp o TCL
jk.

Risposte:


16

Quello che devi scrivere è chiamato una specifica del linguaggio .

Dovrebbe contenere una descrizione della grammatica della lingua (preferibilmente in Extended Backus-Naur-Form ) e la sua semantica.

Per l'ultima parte potresti scrivere una descrizione con parole tue (ma fai attenzione per essere precisi) o una semantica formale .


1
BNF è utile solo per grammatiche senza contenuto, i linguaggi di scripting non sono sempre privi di contesto, ad esempio TCL (anche se penso che tu possa ancora sostenere che è preferibile avere un linguaggio senza contesto nella maggior parte dei casi)
jk.

@jk. Non direi che BNF sia del tutto inutile per linguaggi senza contesto. A seconda di quanto la sintassi sia libera da contesto, può comunque avere senso specificarla in EBNF e quindi risolvere le ambiguità in parole. Questo è quello che fa lo standard C ++ per esempio. Nella maggior parte dei casi immagino che sia ancora più chiaro che spiegare tutto a parole o specificarlo usando una grammatica sensibile al contesto o senza restrizioni.
sepp2k,

vero, il mio punto era più che ci sono linguaggi come lisp, tcl o avanti (che in realtà sono molto buoni per la definizione di DSL) che hanno sintassi degeneri e quindi il BNF ti dice molto poco
jk.

@jk. Certo, ma in tal caso qualsiasi altro modo per descrivere la sintassi ti dirà altrettanto poco, semplicemente perché c'è così poco da dire. Ciò significa solo che la parte della sintassi della specifica sarà molto breve.
sepp2k,

13

Avrai bisogno di quanto segue:

  • Un motivo per creare una nuova lingua
  • Una filosofia
  • Una definizione semantica
  • Una descrizione lessicale dei tuoi token
  • Una definizione di analisi di sintassi

Come sarà diversa la tua lingua? Qual è la sua missione? È funzionale? È orientato agli oggetti? È una meta-lingua? Quali sono le sue caratteristiche uniche? Cosa darà al mondo che non esiste (o esiste in modo brutto)? Come vuoi cambiare le cose? È compilato o interpretato? Un linguaggio DSL o generico? Questa è la tua filosofia e detta molto sul design della tua lingua.

Quindi, lavora per grattare la sintassi e la semantica su carta. Questa sarà la tua definizione semantica ... scrivere codice falso è un ottimo modo per sviluppare i tuoi pensieri. Leggi "Il linguaggio di programmazione C" per un eccellente esempio di come farlo. Giocaci.

Sarà quindi necessario definire i token e la sintassi in qualche modo. I programmi quindi li elaborano in automi in grado di leggere stringhe ed elaborare la sintassi. Yacc e Bison usano le espressioni regolari e una sintassi in stile BNF rispettivamente per l'analisi lessicale e sintattica. Esistono anche strumenti simili a Yacc e Bison per altre lingue.

Avrai anche bisogno di una base nella teoria del linguaggio / compilatori per sapere cosa NON fare. Gli esempi includono grammatiche ambigue, generazione di AST e problemi di manipolazione e in generale come semplificare la vita. Conoscere la teoria è molto importante. Vorrei prendere in considerazione l'avvio di quanto segue:

Compilatori: principi, tecniche e strumenti (libro del drago)
Implementazione moderna del compilatore in C o implementazione moderna del compilatore in Java


1
+1 per la filosofia, per DSL chiaramente vuoi identificare il dominio qui
jk.

8

Il 99,9% delle volte la creazione di una nuova lingua è completamente inutile. Il ritorno sull'investimento sarebbe molto probabilmente piccolo e avresti semplicemente perso tempo.

Molto probabilmente puoi usare Javascript come linguaggio di scripting sensibile e ci sono già parser disponibili per la maggior parte delle lingue. Puoi anche usare altri linguaggi di script che ti piacciono se riesci a trovare un parser adatto a loro. L'implementazione di questi nel tuo programma richiederebbe molto meno lavoro e avrebbe un ritorno maggiore. Le persone non devono imparare un'altra lingua, devono solo imparare la tua API. È una soluzione molto migliore.

La creazione di una nuova lingua è quasi sempre negativa.


9
Tranne la moltitudine di volte in cui non è male. La creazione di DSL semplici può essere molto utile. Ora creare la tua lingua per scopi generali sarebbe più in linea con ciò che dice la tua risposta.
ChaosPandion,

@ChaosPandion ma molte lingue già eccellono nella creazione di un DSL che utilizza il codice di quella lingua (cioè ruby ​​è bravo in questo)
alternativa

2
Sono d'accordo con la tua risposta ma credo che non sia la risposta giusta per questa domanda. Credo che chi chiede sta osservando le generalità della creazione di un linguaggio di scripting non per i pro / contro della creazione di uno.
Tim Murphy,

Creare una nuova lingua è quasi sempre la soluzione migliore. it.wikipedia.org/wiki/Language-oriented_programming
SK-logic

3

Puoi descrivere la grammatica della tua lingua in BNF .

Ad esempio, questa è la grammatica di Python .


6
La grammatica di per sé non è abbastanza informazione per implementare una lingua però. Dovrà anche specificare la semantica in un modo o nell'altro.
sepp2k,

0

se stai usando .NET, ecco qualcosa che mi sono imbattuto in qualche tempo fa. L'ho solo dato uno sguardo curioso, ma forse ti sarebbe utile: ironia .

Irony è un kit di sviluppo per l'implementazione di linguaggi su piattaforma .NET.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.