Implementare un primo interprete di base: cosa dovrei imparare prima? [duplicare]

0

Sto per implementare il mio linguaggio di programmazione molto semplice e un interprete per eseguire codice in quella lingua.

La lingua sarà molto semplice. Codice di esempio:

var x = 3
if x > 2 print x
if x < 2 print "hello"

La lingua non presenterebbe nulla di più complesso delle istruzioni di riga singola if . Questo perché è la prima volta che cerco qualcosa di simile, quindi sto iniziando in piccolo.

L'interprete verrà scritto in Java e quindi eseguirà il codice con le operazioni Java.

La mia domanda è questa:

So che l'argomento della creazione di compilatori e interpreti è molto complesso. Ma dal momento che sono nuovo a questo, credo che dovrei iniziare con tecniche e approcci di base.

Che cosa dovrei imparare prima di iniziare a lavorare su questo progetto? Soprattutto quale tipo di conoscenza riguardo l'analisi e l'interpretazione dovrei imparare prima di iniziare?

Basta semplicemente "scomporre il testo in sottostringhe e quindi più sottostringhe" oppure dovrei imparare tecniche più avanzate e applicarle?

La conoscenza e l'esperienza che acquisisco hanno lo scopo di consentirmi di sviluppare più conoscenze su di esso quando continuo a imparare e implementare interpreti. Ma non dovrebbe essere "troppo" per un primo tentativo.

    
posta Aviv Cohn 01.05.2014 - 18:15
fonte

2 risposte

2

Dipenderà un po 'dal percorso che intraprendi per il tuo interprete. Ma la prima cosa che dovresti provare a creare è un semplice valutatore di espressioni matematiche, perché alla fine può costituire il nucleo di un interprete. Calcolo di dichiarazioni come (8 * 4) + 10 e ((10 + 2) * (11 / 5)) . Ciò ti esporrà al codice di analisi, suddividendo tutto in token, stack e altri concetti senza farti del tutto sopraffare.

Una volta che lavori con espressioni matematiche, estendi con le funzioni.

(8 * 4) + max( 5, 10)

Quindi tipi di dati

"this" + "that"

Questo è un progetto abbastanza ampio e dovrebbe farti sentire bene per tutto ciò che è coinvolto.

Per cominciare, guarda l' Algoritmo dello Shunting Yard

    
risposta data 01.05.2014 - 18:36
fonte
0

Penso che devi imparare almeno due concetti principali per implementare con successo il tuo interprete di base: elaborazione del linguaggio e valutazione dell'espressione.

Potresti essere in grado di ottenere da qualche parte operazioni manuali con le stringhe, ma sarà noioso e probabilmente avrà limitazioni o bug gravi. Il modo corretto per farlo è usare una libreria di elaborazione del linguaggio. Lo scopo di questo tipo di software è di trasformare il codice sorgente in una rappresentazione di memoria facile da usare chiamata Abstract Syntax Tree. Ad esempio 3 * (5 + 1) sarà trasformato in un albero come questo:

     *
    / \
   3   +
      / \
     5   1

C'è un po 'di teoria da capire per implementare con successo questa trasformazione. Ma l'abilità sarà riutilizzabile per linguaggi complessi o linguaggi specifici di un dominio completo. Per Java, ANTLR è una libreria abbastanza comune per il riconoscimento della lingua, dovresti verificarlo: link

La seconda abilità riguarderà la valutazione dell'AST. È necessario conoscere le strutture di dati ad albero e come lavorare con loro. Ciò consentirà di valutare l'AST e ottenere il risultato ed eseguire le azioni richieste dal programma. Ecco un esempio molto semplice di tipo di codice che dovrai scrivere per valutare l'AST sopra:

def evaluate(tree):
    if tree.label == "*":
        return evaluate(tree.left) * evaluate(tree.right)
    elif tree.label == "+":
        return evaluate(tree.left) + evaluate(tree.right)
    else:
        return int(tree.label)

Per andare oltre, puoi anche provare a scrivere un compilatore invece di un interprete. Il primo passo è lo stesso, ma invece di valutare i nodi dell'albero, dovrai produrre una sorta di codice macchina che farà il lavoro in seguito. L'assemblaggio hardware reale può essere difficile, ma il bytecode JVM è piuttosto semplice e ha prestazioni decenti. Ci sono librerie in grado di gestirne l'aspetto binario. Ad esempio ASM: link Ecco come funzionano le lingue JVM in generale.

Buona fortuna!

    
risposta data 01.05.2014 - 22:35
fonte

Leggi altre domande sui tag