Come posso implementare le classi nel mio linguaggio di scripting?

4

Supponiamo di avere un file di codice che legge (userò la sintassi Java-ish) e che viene interpretato. Un po 'come un copione rubino.

class A{
    int fieldName = 4;
    A(){...}

    void doSomething(){...}

}

A instanceOfA = new A();
A.fieldName = 7;

Questo è quello che capisco quando si interpreta questo file.

  1. Il file è lessicato e analizzato
  2. AST o Parse tree viene generato
  3. Parse tree è passato per generare codice nel runtime per rappresentare la classe.
  4. Allora cosa succede? Come si trasforma la definizione in un'istanza? E che tipo di rappresentazione interna è necessaria per rappresentare la classe? L'interprete mantiene l'AST della classe in giro per la rielaborazione ogni volta che viene creata un'istanza o viene creato un altro modulo?

Ho seguito gli schemi del libro Modelli di implementazioni linguistiche di Terrence Parr. Penso di capire come costruire la tabella dei simboli e gli oggetti dell'oscilloscopio. Sono solo un po 'confuso su come prendere una struttura come una classe e crearne un'istanza.

    
posta Jeffrey Guenther 12.07.2013 - 20:50
fonte

1 risposta

6

Il passaggio 3 deve essere espanso un po ': l'albero di analisi è percorso per generare codice e metadati . Una delle cose che genera è l'informazione sulla classe A. Questo in genere non viene fatto mantenendo il codice originale o l'albero di analisi, ma memorizzando i dati in una sorta di struttura o oggetto che contiene le informazioni rilevanti.

Per lo meno, è necessario conservare tutte le informazioni necessarie per creare un'istanza di una classe, ad esempio quanto è grande un'istanza, (o cosa conterrà un'istanza predefinita / nuova, se si tratta di una lingua dinamica in cui le istanze di classe non sono a dimensione fissa), che è necessario conoscere per allocare memoria e impostare l'oggetto. Se il linguaggio supporta qualche forma di riflessione, manterrà più di quello in modo che i metadati relativi alla classe siano accessibili in fase di runtime.

In questo caso specifico, avresti bisogno di una struttura di metadati che dica che questa classe ha un singolo campo int e che è inizializzata su 4 come valore predefinito. Esistono diversi modi per implementare la creazione di un'istanza. Eccone uno:

  • Ogni tipo di classe ha una tabella di metadati che fornisce determinate informazioni, inclusa la dimensione dell'istanza e (facoltativamente) una "routine segreta" generata dal compilatore che inizializza l'oggetto.
  • L'operatore new prende il tipo di classe e trova la sua dimensione dell'istanza e ne assegna la memoria.
  • Quindi controlla se la classe ha una routine di inizializzazione e, in tal caso, la chiama. (Questa operazione: imposta il valore di fieldname su 4).
  • Quindi passa attraverso e controlla la classe genitrice della classe per vedere se ha una routine di inizializzazione, e così via fino a quando non ha completato la catena fino alla classe base.
  • Quindi chiama il costruttore con i parametri che hai fornito e restituisce il risultato.
risposta data 12.07.2013 - 20:57
fonte

Leggi altre domande sui tag