2010-10-13 12 views
13

Ho bisogno di implementare un interprete per un linguaggio di programmazione come parte di un progetto su cui sto lavorando. Non credo che i dettagli di questo progetto siano troppo rilevanti, tranne che mi richiede di implementare un interprete da zero, non posso usare un linguaggio di programmazione esistente (i requisiti includono il supporto delle continuazioni delimitate portatili e la possibilità di scrivere un interprete per esso in Javascript e anche in Java).Quali linguaggi di programmazione hanno gli interpreti più facilmente implementabili?

Ovviamente preferirei davvero evitare di inventare un nuovo linguaggio di programmazione, quindi spero che ci sia un linguaggio molto semplice da copiare, o almeno trarre ispirazione da.

Il mio primo pensiero era Forth o un linguaggio rudimentale simile al Lisp, tuttavia preferirei che la lingua avesse una sintassi più vicina ai linguaggi di programmazione più popolari come Java, Python o Ruby. In particolare, ciò significa supportare gli operatori infissi (a + b) e anche a = b l'assegnazione di variabili.

Per dirla in un altro modo, mi piacerebbe che questo linguaggio fosse ragionevolmente familiare alle persone che programmano in PHP oggi, e non credo che né Forth né Lisp soddisfino questi criteri.

Qualcuno può offrire qualche suggerimento per tale lingua?

+5

-1 per voler fare un PHP allo stesso modo;) Schiacciarlo sul nascere. – ocodo

+1

Non voglio fare lo stesso PHP, voglio solo fare qualcosa di abbastanza familiare alle persone che programmano in PHP. – sanity

risposta

10

Sembra un lavoro per Lua.

  • E 'un piccolo linguaggio, progettato per essere semplice da implementare
  • ci sono già diverse implementations in Java e almeno lavori in corso per il Javascript.
  • La sintassi soddisfa i requisiti dell'utente (assegnazioni, operatori infissi).

Il lavoro che avresti dovuto è implementare continuazioni delimitate, ma lo sapevi già quando hai escluso Lisp/Scheme.

14

Penso che Lisp e Forth abbiano alcuni degli interpreti ingenui più facili.

È possibile scegliere un linguaggio dinamico semplice, e la parte più difficile sarebbe costruire il parser. Ad esempio, un sottoinsieme di JavaScript potrebbe funzionare. L'interprete sta fondamentalmente attraversando il AST e sta eseguendo le operazioni di ciascun nodo.

In ogni caso, ricercare i linguaggi di scripting esistenti che possono essere incorporati nell'ambiente di sviluppo ed evitare di eseguire il rollover a tutti i costi. Implementare i compilatori (in senso lato) è molto divertente da fare, ma può essere costoso mantenerlo a lungo termine.

+0

Ho già escluso il mio e il mio sfortunatamente, per le ragioni descritte nella mia domanda. – sanity

+2

perché non creare una liff con la sintassi infix? che non è davvero difficile. – nickik

3

Brainfuck? Voglio dire che ha solo 8 comandi, ognuno dei quali corrisponde a un singolo personaggio.

+0

Uno di quelli un paio di settimane fa ... è stato divertente.Ci sono un paio di estensioni come pbrain che si aggiungono al progetto. Ho pensato che sarebbe stato interessante scrivere un compilatore JIT ottimizzato, ma poi sono stato distratto dal lavoro ... –

+0

Sì, suppongo che non risponda completamente alla domanda quando si considera il "tentativo di progettare un linguaggio per le persone per utilizzare effettivamente "porzione;) –

+0

@sanity, non lo è. È progettato per consentire il più piccolo compilatore possibile per un linguaggio di programmazione completo di Turing. –

2

Creare prima un interprete LISP, questo sarà relativamente relativamente semplice.

Otterrai molta esperienza nell'analisi del linguaggio, senza essere ostacolato da requisiti di funzionalità aggiuntivi.

+0

Ho già escluso Lisp per le ragioni spiegate nella mia domanda. – sanity

+2

Lo so, tuttavia voglio ancora incoraggiarvi a farlo, poiché presumo che questo sarà il vostro primo interprete di lingua, e penso che ci sia molto altro da guadagnare dalla costruzione di un linguaggio che è relativamente facile da analizzare, invece di una lingua che vuoi che altre persone usino. Non preoccuparti di questo in questa fase, costruisci qualcosa da cui puoi imparare. Per non parlare del fatto che un rapido colpo su Reddit e YCombinator rivela che il Lisp non è al momento impopolare. – ocodo

+0

Pensi che forse Paul Graham potrebbe avere qualcosa a che fare con i LISPers che si riuniscono attorno a YCombinator? = P –

2

Presumo che ciò è tanto un esercizio per la vostra edificazione come desiderio di un prodotto finale utile.

In tal caso, devo essere d'accordo con gli altri che hanno consigliato le varianti su lingue simili al Lisp, almeno per il primo passaggio, specialmente se non lo hai fatto prima.

Lua è un linguaggio di scripting piuttosto popolare per questo genere di cose che richiede script utente piccoli, non particolarmente performanti.

Si può anche considerare se javascript stesso (o un sottoinsieme) soddisfa i propri requisiti.

consultare anche l'elenco qui: http://en.wikipedia.org/wiki/Continuation#Programming_language_support

0

vi consiglio di iniziare con un sottoinsieme di Lisp - fondamentalmente auto, cdr, contro, e preventivo.Assicurati di avere uno scanner di base che gestisca caratteri non validi, e quindi tipi non validi (come i contro richiede 2 arg, il secondo deve essere una lista). È possibile ottenere questo risultato con una conoscenza delle strutture di dati di base (solo le liste collegate potrebbero farlo, ma doppiamente collegate o circolari sono molto meglio).

8

Tcl. La sintassi è semplice quanto Lisp e ha un proc expr per l'aritmetica infissa. Utilizza anche lo {} per i blocchi, quindi se si strizzano gli occhi si può dire alle persone che si tratta di un linguaggio simile a C.

Non ha assegnamento di prefisso a=b, ma una volta che si inizia a seguire la notazione generale di infissi, le lingue diventano davvero complesse molto velocemente, quindi non sono sicuro di come sia compatibile con le altre richieste.

+1

Voglio fare +1 su una risposta TCL, ma scrivere un interprete TCL completo non è davvero così semplice. È possibile ottenere un semplice nucleo della lingua piuttosto semplicemente, ma TCL contiene molti sottolinguaggi, ad esempio il comando expr che hai citato. qualsiasi programma reale deve supportare expr, perché appare nel comando if, quindi in realtà devi implementare un linguaggio simile a C sulla parte superiore della shell come il linguaggio che è il endokalog TCL – SingleNegationElimination

+0

Beh, ha detto "o almeno disegnare ispirazione da ", e la compatibilità Tcl non era un requisito difficile. Inoltre, dal momento che 'expr' sembra praticamente uguale a qualsiasi altro proc, non ha bisogno di essere pienamente implementato immediatamente, come nella maggior parte delle lingue (più complicate). Penso che potresti persino scriverlo in Tcl e condividerlo tra i due interpreti che ha bisogno di scrivere! – Ken

+0

@Token: aggiungerò anche che questi in lingua sono specifici per i comandi in questione. Implementare un parser/interprete per la lingua è facile. Implementare tutti i comandi principali ... meno così. Però, se guardi sul wiki, puoi probabilmente trovare le implementazioni di molti dei comandi usando altri comandi più semplici. – RHSeeger

4

Il logo è un semplice linguaggio simile a Lisp senza parentesi e alcune centinaia di implementazioni.

Logo information on Wikipedia.

Vedere questo PDF per informazioni sulle implementazioni: Logo tree.

0

È possibile utilizzare un sottoinsieme Lisp e hanno ancora una notazione più naturale se si utilizza dolci espressioni, o almeno ricci-infisso notazione:

  • Riccio-infisso aggiunge infisso , leggendo {a + b} come (+ ab) e supporta la notazione funzionale tradizionale come f (x). Vedi di più su SRFI-105.

  • Le espressioni dolci si basano su ricci-infisso e aggiungono indentazione sintatticamente rilevante. Vedi di più qui in SRFI-110. Il suo URL è http://srfi.schemers.org/srfi-110/ (per SRFI-105, basta sostituire "110" con "105").

Entrambe sono state attuate dalle leggibile Lisp S-espressioni del progetto: http://readable.sourceforge.net/

godere!

Problemi correlati