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?