Un buon test per l'efficienza della traduzione di un compilatore è l'auto-compilazione: quanto tempo impiega un determinato compilatore per compilarsi? Per C ++ ci vuole molto tempo (ore?). In confronto, un compilatore Pascal / Modula-2 / Oberon si compilerebbe in meno di un secondo su una macchina moderna [1].
Go è stato ispirato da queste lingue, ma alcuni dei motivi principali di questa efficienza includono:
Una sintassi chiaramente definita che è matematicamente valida, per un'analisi e un'analisi efficienti.
Un linguaggio sicuro per i tipi e compilato staticamente che utilizza una compilazione separata con dipendenze e verifica dei tipi oltre i confini del modulo, per evitare la rilettura non necessaria dei file di intestazione e la ricompilazione di altri moduli, al contrario della compilazione indipendente come in C / C ++ dove il compilatore non esegue tali controlli tra i moduli (da qui la necessità di rileggere ripetutamente tutti quei file di intestazione, anche per un semplice programma "ciao mondo" di una riga).
Un'implementazione efficiente del compilatore (ad es. Analisi top-down a discesa singola, passiva e ricorsiva), che ovviamente è notevolmente aiutata dai precedenti punti 1 e 2.
Questi principi sono già stati conosciuti e pienamente implementati negli anni '70 e '80 in lingue come Mesa, Ada, Modula-2 / Oberon e molti altri, e solo ora (nel 2010) si stanno facendo strada nelle lingue moderne come Go (Google) , Swift (Apple), C # (Microsoft) e molti altri.
Speriamo che questa sarà presto la norma e non l'eccezione. Per arrivarci, devono accadere due cose:
In primo luogo, i fornitori di piattaforme software come Google, Microsoft e Apple dovrebbero iniziare incoraggiando gli sviluppatori di applicazioni a utilizzare la nuova metodologia di compilazione, consentendo loro di riutilizzare la loro base di codice esistente. Questo è ciò che Apple sta ora cercando di fare con il linguaggio di programmazione Swift, che può coesistere con Objective-C (poiché utilizza lo stesso ambiente di runtime).
In secondo luogo, le stesse piattaforme software sottostanti dovrebbero eventualmente essere riscritte nel tempo usando questi principi, riprogettando contemporaneamente la gerarchia dei moduli nel processo per renderli meno monolitici. Questo è ovviamente un compito mastodontico e potrebbe richiedere la parte migliore di un decennio (se sono abbastanza coraggiosi da farlo effettivamente - cosa che non sono affatto sicuro nel caso di Google).
In ogni caso, è la piattaforma che guida l'adozione della lingua e non viceversa.
Riferimenti:
[1] http://www.inf.ethz.ch/personal/wirth/ProjectOberon/PO.System.pdf , pagina 6: "Il compilatore si compila in circa 3 secondi". Questa citazione è per una scheda di sviluppo FPGA Xilinx Spartan-3 a basso costo con frequenza di clock di 25 MHz e 1 MByte di memoria principale. Da questo si può facilmente estrapolare a "meno di 1 secondo" per un moderno processore in esecuzione con una frequenza di clock ben superiore a 1 GHz e diversi GByte di memoria principale (ovvero diversi ordini di grandezza più potenti della scheda FPGA Xilinx Spartan-3), anche quando si tiene conto delle velocità di I / O. Già nel 1990, quando Oberon era in esecuzione su un processore NS32X32 a 25 MHz con 2-4 MByte di memoria principale, il compilatore si compilò da solo in pochi secondi. L'idea di aspettare davveroper il compilatore terminare un ciclo di compilazione era completamente sconosciuto ai programmatori Oberon anche allora. Per i programmi tipici, è sempre stato necessario più tempo per rimuovere il dito dal pulsante del mouse che ha attivato il comando di compilazione piuttosto che attendere che il compilatore completi la compilazione appena attivata. È stata davvero una gratificazione istantanea, con tempi di attesa quasi nulli. E la qualità del codice prodotto, anche se non sempre alla pari con i migliori compilatori disponibili allora, era straordinariamente buona per la maggior parte delle attività e abbastanza accettabile in generale.