Mi scuso in anticipo per il vago titolo. Non volevo renderlo eccessivamente prolisso, quindi permettimi di spiegarlo più approfonditamente qui sotto:
Attualmente sto sviluppando un linguaggio strong, tipizzato staticamente, che compila fino al codice C ++ (11). Utilizzando le risposte da come la raccolta di dati inutili funziona in lingue che sono compilate in modo nativo? come guida, ho sviluppato un semplice sistema di runtime (scritto in C ++ ovviamente) per il mio linguaggio che consiste essenzialmente in un garbage collector.
Il modo in cui ho progettato il sistema GC è che ho creato per la prima volta un oggetto base che tutti gli altri oggetti che rappresentano specifici tipi di dati nella mia lingua (che attualmente includono solo int
egers e bool
eans) erediterebbero da. Il GC stesso utilizza un algoritmo di conteggio dei riferimenti di base, che accede al campo che contiene il numero di riferimenti forniti da ciascun oggetto dalla classe base sopra menzionata.
Lo sviluppo del sistema di runtime è andato benissimo. Tuttavia, ho appena realizzato un po 'di problemi. Perché devo avvolgere tutti i tipi di dati dalla mia lingua nei loro rispettivi oggetti, questo rende il codice C ++ che ho generato estremamente prolisso e goffo per qualcosa di più grande delle semplici espressioni. Ad esempio, supponiamo di avere l'espressione 1 + 2 * (4 - 5) - 6 / (7 + 8)
. Questo sarebbe più o meno transpilato al seguente codice C ++ dal mio compilatore:
*new Integer(1) + *new Integer(2) * (*new Integer(4) - *new Integer(5)) - *new Integer(6) / (*new Integer(7) - *new Integer(8));
Come si può chiaramente vedere, il codice C ++ che è stato generato è estremamente prolisso rispetto all'espressione originale scritta nella mia lingua. Potresti immaginare quanto peggio sarebbe cercare espressioni ancora più complesse.
La mia domanda è: come dovrebbe essere affrontato un problema come questo? Questo è semplicemente un problema creato dalla mia inesperienza nella creazione di un sistema runtime, o è qualcosa che normalmente si verifica durante la compilazione? Ovviamente questo non è un "problema" nel senso che mi sta impedendo di continuare a sviluppare il mio compilatore, ma dal momento che voglio che il mio compilatore generi codice read-able C ++, questo dovrebbe essere qualcosa che è risolto.
Una soluzione che ho pensato a questo problema è utilizzare un metodo come codice indirizzo tre per rompere grandi espressioni in parti gestibili, ma prima di implementarlo vorrei capire se questo problema ha una soluzione migliore.