Fare una lingua, hanno bisogno di un buon back-end
-
05-09-2019 - |
Domanda
Voglio fare un linguaggio compilato. Attualmente sto valutando backend. Finora mi sto guardando C a causa della sua velocità di esecuzione, la compilazione, e un piccolo, facile da usare compilatore chiamata TCC.
Dopo aver letto le discussioni qui di usarlo come un linguaggio intermedio, sto cercando di pensare a come renderlo compatibile con la raccolta dei rifiuti e la gestione delle eccezioni. Finora, penso di poter risolvere entrambi, ma con molta testa.
Ecco alcuni dei miei pensieri sugli altri backend possibili:
- Assembly:. Portabile e un dolore totale di programmare in
- NET: Si sente molto lento. 5 secondi per avviare e 5 secondi per valutare 1 + 2 su IronPython e Boo. Impossibile correre senza grande biblioteca.
- JVM: Si sente un po 'lento. Nessun accesso alle librerie binarie. Impossibile correre senza grande biblioteca.
- LLVM: Nessun supporto di Windows. Ho sentito che la dimensione eseguibile compilato è di 16 MB +
- C--: sembra poco sviluppato .
- C ++: forse. Non riesci a trovare un bel piccolo uno libero posso riunire con.
Qualcuno di voi può cambiare idea o di avere altro da aggiungere a questa lista?
Modifica
Ho avuto modo di sperimentare con LLVM di recente. Ho scoperto che essi hanno binari precompilati e che è possibile compilare al montaggio nativo.
Ecco i passaggi:
- Esegui LLVM-come su LLVM Assemblea, che produce un file bytecode LLVM.
- Esegui llc sul file bytecode LLVM per produrre un file di assiemi.
- Esegui un assemblatore sul file di assieme per produrre un file oggetto. (Esegue llvm-ld che sembra dipendere da un compilatore c installata esternamente)
- Compila per eseguibile con gcc ecc.
Soluzione
Avete pensato di scrivere un frontend per GCC ? Dico questo per completezza solo - per quanto ne so l'interfaccia di backend è piuttosto complicato e la base di codice è enorme e difficile da comprendere
.D'altra parte, il GCC è un prodotto maturo con molti programmatori esperti lavorare su di esso. Per lo meno, probabilmente fornisce la base più solida di tutte le alternative.
Personalmente, preferirei LLVM (architettura emozionante) o IL di .NET: molto, molto facile da usare, ha un grande strumento di supporto ( Reflector , Cecil , Reflexil e, ultimo ma non meno importante, l'API .NET riflessione) e due implementazioni molto efficiente (vale a dire l'attuazione canonica di Microsoft e Mono ).
Ma non posso pretendere competenza su una fra le architetture in modo da prendere questa risposta con un grano di sale.
Altri suggerimenti
In questo caso LLVM è probabilmente una scelta migliore.
LLVM ha il supporto di Windows, ci vuole solo un po 'di tempo per compilare
C ++ non vi darà molto, usare C invece. Ma se si vuole lingua da utilizzare nel Web, l'uso di .NET o Java, che essi lento a caricare, ma quando lo sono, il più velocemente C.
SmartEiffel usiamo C come back-end.
TCC è una buona opzione per sviluppo- anche se non per rilascio finale (prodotti oggetto è equivalente a gcc -O0)
Un altro da aggiungere alla lista: Slava recentemente implementato Smalltalk su un Factor backend . Non ho provato io stesso, ma ho la sensazione che offrirebbe più delle caratteristiche desiderate da quelli di più alto livello con più come la dimensione / prestazioni da quelli di livello inferiore.
TCC è la scelta migliore. È portatile ed ha una libreria in modo che possa essere facilmente utilizzato come back-end che si chiama libtcc. Gli eseguibili sono più piccoli di gcc ed è ANSI C.