Molte persone hanno difficoltà o frustrazioni con i linguaggi di programmazione che usano ogni giorno. Alcuni vogliono che le cose vengano gestite in modo più astratto, mentre altri non amano implementare funzionalità che vorrebbero essere "standard". Che tu sia un professionista IT o solo un hobbista, molte volte potresti trovarti a voler creare un nuovo linguaggio di programmazione.
Passi
Passaggio 1. Acquisire familiarità con la tecnologia
Non puoi creare un linguaggio di programmazione se non sai usare un computer.
Passaggio 2. Acquisire familiarità con la terminologia
Gli scrittori di compilatori usano spesso una terminologia sconosciuta. Leggere sui compilatori prima di procedere. Assicurati di sapere tutto ciò che devi sapere.
Passaggio 3. Decidi quale problema risolve la tua lingua
Sta affrontando un problema specifico del dominio o è un linguaggio generico?
Passaggio 4. Pensa alla semantica della tua lingua e ai suoi concetti
- Consentire l'accesso diretto al puntatore o no?
- Quali sono i tipi di dati della tua lingua?
- È un linguaggio statico o dinamico?
- Qual è il tuo modello di memoria? Utilizzerai un garbage collector o la gestione manuale della memoria? (Se usi un netturbino, preparati a scriverne uno o ad adattarne uno esistente alla tua lingua.)
- Come gestirai la concorrenza? Utilizzerai un semplice modello di threading/locking o qualcosa di più complesso come Linda o il modello dell'attore? (Dal momento che al giorno d'oggi i computer hanno più core.)
- Ci sono funzioni primitive incorporate nel linguaggio o tutto proverrà da una libreria?
- Qual è il paradigma oi paradigmi della tua lingua? Funzionale? Orientato agli oggetti? Prototipo (come JavaScript)? Orientato all'aspetto? Orientato al modello? O qualcosa di completamente nuovo?
- Come si interfaccia la tua lingua con le librerie e i linguaggi esistenti (principalmente C)? Questo punto è importante se stai creando un linguaggio specifico del dominio.
- Infine, alcune delle risposte a queste domande riceveranno risposta nel secondo passaggio e ti aiuteranno a rispondere al passaggio successivo.
Passaggio 5. Pensa ad alcune attività specifiche che qualcuno vorrebbe essere in grado di svolgere con la tua lingua
Ad esempio, "potrebbero voler indicare a un robot di seguire una linea" o "potrebbero voler creare programmi desktop relativamente portatili al suo interno" o "potrebbero voler creare applicazioni Web con esso".
Passaggio 6. Sperimenta con le idee sintattiche (il testo della lingua) per gli esempi precedenti
Fai attenzione a mantenere la tua lingua nella categoria delle lingue senza contesto o qualcosa al suo interno. Il tuo generatore di parser e lo apprezzerai in seguito
Passaggio 7. Scrivi una grammatica formale per la sintassi
Passaggio 8. Decidere se la lingua verrà interpretata o compilata
Ciò significa che nel mondo interpretato il tuo utente in genere modificherà il tuo programma in un editor e lo eseguirà direttamente sull'interprete; mentre nel mondo compilato, il tuo utente modificherà il tuo programma, lo compilerà, salverà l'eseguibile risultante da qualche parte e lo eseguirà.
Passaggio 9. Scrivi lo scanner e il parser front-end o trova uno strumento che ti aiuti in questo
Inoltre, pensa a come il tuo compilatore/interprete avviserà l'utente di programmi errati ed errori di sintassi
Passaggio 10. Utilizzare le informazioni del parser per scrivere il codice oggetto o una rappresentazione intermedia
Chiedi al parser di creare un AST, quindi crea il tuo codice oggetto dall'AST utilizzando tre codici di indirizzo o il suo fratello maggiore SSA, quindi crea una tabella dei simboli per definire le tue funzioni, variabili globali, ecc.
Inoltre, a seconda della tua lingua, potresti anche voler creare tabelle puntatori virtuali o tabelle informative per le tue classi (per supportare la riflessione o RTTI)
Passaggio 11. Scrivere l'executor o il generatore di codice che legherà tutto insieme
Passaggio 12. Scrivi molti programmi di prova per testare la lingua
Vuoi creare programmi che sottolineino i fardelli della tua grammatica formale per vedere che il tuo compilatore accetta tutto ciò che è all'interno della tua definizione e rifiuta tutto ciò che è al di fuori di essa
Passaggio 13. Considera come l'utente eseguirà il debug dei propri programmi
Passaggio 14. Se la tua lingua utilizza una libreria standard, vorrai scriverla
Insieme a un garbage collector o ad altre funzionalità di runtime se ne hai bisogno.
In particolare, se si scrive un compilatore, sarà necessario il codice che il sistema operativo eseguirà per avviare l'esecuzione del codice utente (ad esempio, allocare tutte le variabili globali)
Passaggio 15. Pubblica la tua lingua, insieme alle specifiche e ad alcuni esempi di ciò che puoi fare in essa
Non dimenticare di documentare come puoi integrarti con le librerie, i linguaggi esistenti e come utilizzare le funzionalità di runtime e/o la libreria standard
Video - Utilizzando questo servizio, alcune informazioni potrebbero essere condivise con YouTube
Suggerimenti
- Inizia progettando la tua lingua e non scrivere alcun codice, finché non sei soddisfatto e hai risposto a tutte (o alla maggior parte) delle domande o dei problemi relativi al tuo design poiché è più facile modificare il design prima che dopo.
- Conosci la tua piattaforma di destinazione (sistema operativo e librerie) per il tuo compilatore/interprete, dopo tutto, la userai e la manipolerai.
Avvertenze
- Pensa se hai davvero bisogno di una nuova lingua e cosa ha di nuovo la tua lingua che altre lingue non hanno (potrebbe essere una combinazione di funzionalità o una singola funzionalità).
- Scrivere lingue è difficile se non sai cosa stai facendo. Ci vuole anche molta pratica.
- Preparati a dedicare un po' di tempo alla progettazione del linguaggio, poiché non avrai la possibilità di cambiare la lingua una volta che hai scritto il compilatore e superato il punto di progettazione.
- Non cercare di basare le tue caratteristiche in un'unione di più lingue, come dire che la tua lingua sarà un'unione della lingua X, della lingua Y e della lingua Z. La storia ci ha dimostrato che le lingue create in questo modo non avranno mai successo, o tutti starebbero programmando PL/1 invece di qualcosa basato su C.