Funzionalità di base per una lingua di base? Suggerimenti DSL?


9

Ho finalmente iniziato a capire la complessità dietro la creazione di un interprete e un compilatore. Ho costruito diverse versioni di TinyBasic, 1964 (Dartmouth) Basic, e le mie espansioni su quelle lingue prima di arrivare a questo punto. Il progetto più recente è quello che chiamo Open Source Basic ... perché non riuscivo a pensare ad altre caratteristiche del linguaggio che avrebbero interessato le persone. Essere in grado di aprire la fonte della lingua e capire come vengono fatte alcune cose complesse (come vengono eseguite la scansione, l'analisi, l'interpretazione e la compilazione)

Open Source Basic viene prima interpretato in un linguaggio basato su stack. Quel linguaggio basato su stack viene quindi interpretato ed eseguito immediatamente o trasformato in un eseguibile CLR.

Le mie domande si riducono tutte a questo:

  • Quali sono le caratteristiche / i costrutti di base di un linguaggio basato su Basic? Ho già questi costrutti di base: assegnazioni, espressioni, variabili, alcune funzioni (Casuale, ToUpper, ToLower), Looping (per e do-while / fino), If (block e single-line) Altre decisioni, input basato su console (Input ) e output (Stampa) e sub-routine (senza ancora parametri).
  • Quando ho finito di aggiungere i costrutti di base al mio linguaggio, come devo diramarmi? In quale dominio (i)? In altre parole, quale direzione dovrebbe prendere il mio linguaggio di base open source una volta che tutti i costrutti generici funzionano?

Grazie per il tuo tempo,

Dominick


3
Ho sempre desiderato una lingua che avesse funzionalità AOP integrate e supportate dalla sintassi.
FrustratedWithFormsDesigner,

@Dominick: che ne dici della funzionalità LINQ?
Predator,

@Frustrated ... AOP - Funzionalità di programmazione orientata agli aspetti? Potresti fare un esempio?
Dominick,

5
Non dovresti iniziare a inventare un linguaggio specifico di dominio dalle funzionalità imperative di base. Formalizza prima il tuo dominio, trasforma questa conoscenza in una lingua e solo successivamente aggiungi le funzionalità di base, se necessarie. Probabilmente finiresti anche con un DSL perfetto che non è completo di Turing, ed è una delle migliori proprietà dei DSL.
SK-logic,

1
Sicuramente "goto" è una caratteristica obbligatoria di qualsiasi BASIC?
Perry,

Risposte:


1

La mia esperienza con i primi BASIC sul Commodoro [Vic-20, C-64] mi ha dato l'impressione che i numeri di linea fossero una "caratteristica" fondamentale di BASIC. Sembra che non vengano più utilizzati nelle implementazioni moderne, il che per me è un danno in quanto la mia visione principale di BASIC è come un linguaggio di apprendimento da cui trampolino per qualcos'altro.


1

Sicuramente uno sforzo nobile, ma penso che tu abbia invertito le tue priorità.

La tua prima preoccupazione dovrebbe essere i problemi di "dominio" a cui la tua lingua è indirizzata. Ecco perché in primo luogo viene chiamato un "linguaggio specifico di dominio". Una DSL è tollerabile solo quando è piccola, semplice e molto focalizzata per risolvere particolari problemi come un coltello nel burro.

Dopo aver identificato il dominio e il modo in cui la tua lingua funzionerà nel dominio, puoi stabilire costrutti o caratteristiche specifici.

Infine, potrebbe essere utile considerare se si desidera un DSL interno o esterno .


0

Ho sviluppato un linguaggio di scripting per un'applicazione CAE / FEA e alcune caratteristiche che ho trovato utili per gli utenti finali sono: Variabili locali e globali Matrici con allocazione dinamica ed espansione Funzioni con argomenti e strutture di passaggio di riferimento (tipi definiti dall'utente) Insieme a le funzionalità che hai menzionato dovrebbero creare un linguaggio abbastanza potente per cominciare. Quindi svilupperai in base alla richiesta dell'utente.


È un linguaggio interessante e molto specifico per il dominio (Computer Aided Engineering / Finite Element Analysis). Vedo perché dovresti aver bisogno di matrici. Tutti i tuoi suggerimenti sono abbastanza buoni e li terrò a mente. Grazie.
Dominick,

0

Esistono diverse funzionalità che possono essere aggiunte o estese se già esistenti, ma ...

... linguaggi di programmazione di base, sono molto simili ai linguaggi di script e una caratteristica che molti mancavano o includevano in seguito, era lo spazio dei nomi o i moduli.

C, C ++, PHP, Visual Basic, avviato senza moduli / spazi dei nomi e aggiunto successivamente.

Il prossimo potrebbe essere subroutine (procedure o funzioni che non restituiscono un valore) e funzioni (subroutine che restituiscono un valore speciale).


0

capire come vengono fatte alcune cose complesse (come vengono eseguite la scansione, l'analisi, l'interpretazione e la compilazione)

C'è una bella domanda sul sito Stack Overflow sulle risorse per comprendere i compilatori. Puoi anche dare un'occhiata alla mia classe di compilatori .

Quando ho finito di aggiungere i costrutti di base nella mia lingua, come devo diramarmi?

Date le funzionalità che hai già creato, ti suggerisco di aggiungere tre tipi di dati: int, string, boolean. Dovrai fare tre cose, ognuna un po 'più dura della precedente:

  1. Modifica la grammatica in modo da poter analizzare quelle parole chiave. Test.
  2. Crea (o aggiungi alla tabella dei simboli esistente) in modo da poter includere il tipo di dati insieme al nome della variabile e altre proprietà. Quindi fai un interruttore di debug in modo da poterlo testare e vedere la tabella dei simboli.
  3. Verificare la presenza di tipi compatibili prima della generazione del codice in MsIL o durante l'interpretazione. Testare entrambi i casi di errore e non errore in ciascuna modalità di esecuzione per tutti i tipi.

Se ciò va bene, allora suggerisco di lavorare sull'ambito (locale nelle routine secondarie contro globale). Fammi sapere se vuoi qualche consiglio a riguardo.

In bocca al lupo. E goditelo!

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.