Domande sul design del compilatore / interprete [chiuso]

2

Sto implementando un linguaggio di programmazione, per divertimento, in C. Ho fatto la maggior parte del codice di analisi e anche l'AST pronto. Una volta ho scritto un runtime per questo linguaggio qualche tempo fa, ma ho avuto qualche problema con il garbage collector. Poi ho capito che avevo bisogno di studiare un po 'di più e che la mia precedente implementazione del walker AST era davvero scarsa.

Ora lo sto riavviando, e ho scelto di compilare AST in bytecode e poi eseguirlo su una VM basata su stack piuttosto semplice. Ho esaminato altri linguaggi compilatori e macchine virtuali e ho imparato molto, ma le mie ricerche non erano ancora sufficienti per rispondermi.

Durante la compilazione, dovrei mantenere un array per ogni tipo di costanti "base" come stringhe, numeri, booleani, ecc ... E poi compilarlo anche in bytecode, o un singolo array di costanti ma già avvolto da un struttura personalizzata? E se faccio questo, come dovrei passare questi oggetti alla VM? Compilare il suo indirizzo in memoria come void * o creare il riferimento proprio della VM a questa matrice di oggetti e passare gli indici come argomento dell'istruzione? Inoltre, il Garbage Collector dovrebbe conoscere immediatamente questi oggetti o solo quando vengono messi in pila? Mi sembra sbagliato l'approccio successivo, perché se avessi un grande programma, allocherebbe una quantità molto grande di memoria prima di eseguire qualsiasi cosa. Tuttavia, questo è il modo in cui ho visto alcune implementazioni linguistiche a farlo.

Per riassumere, dovrei compilare i valori "grezzi" o mantenere un riferimento agli oggetti linguaggio attraverso il processo di Compilazione-Esecuzione?

    
posta Guilherme Nemeth 23.10.2015 - 18:33
fonte

1 risposta

0

Ci sono molti compromessi sul design da valutare. I fattori che potrebbero influenzare il miglior design includono se si desidera mantenere bytecode su un file, se il proprio vm ha tipi primitivi su cui opera direttamente o se si è passati ad un approccio orientato agli oggetti puro e il bytecode non lo fa operare a un livello intero / float / ecc. Inoltre, molto dipende dal tipo di gc che stai utilizzando. Con un raccoglitore di copie, avere oggetti vivi nel pool costante ha meno senso di quello con mark & sweep, per esempio.

L'approccio migliore è probabilmente quello di esaminare alcuni sistemi con design simili ai tuoi, e osservare cosa hanno fatto e perché.

    
risposta data 24.10.2015 - 11:46
fonte

Leggi altre domande sui tag