Dobrym sprawdzianem wydajności tłumaczenia kompilatora jest samokompilacja: jak długo kompiluje się dany kompilator? W przypadku C ++ zajmuje to bardzo dużo czasu (godziny?). Dla porównania, kompilator Pascal / Modula-2 / Oberon by opracować się w ciągu mniej niż jednej sekundy na nowoczesne maszyny [1].
Języki Go zostały zainspirowane tymi językami, ale niektóre z głównych przyczyn tej wydajności obejmują:
Jasno zdefiniowana składnia, która jest matematycznie poprawna, dla wydajnego skanowania i analizowania.
Bezpieczny i statycznie skompilowany język, który wykorzystuje osobną kompilację z kontrolą zależności i typu między granicami modułów, aby uniknąć niepotrzebnego ponownego odczytu plików nagłówkowych i ponownej kompilacji innych modułów - w przeciwieństwie do niezależnej kompilacji, takiej jak w C / C ++, gdzie kompilator nie przeprowadza takich kontroli między modułami (stąd potrzeba ponownego czytania wszystkich plików nagłówkowych w kółko, nawet w przypadku prostego, jednoliniowego programu „hello world”).
Wydajna implementacja kompilatora (np. Parsowanie z góry na dół w trybie pojedynczego przejścia, z rekurencyjnym opadaniem) - co oczywiście w dużym stopniu pomaga punkt 1 i 2 powyżej.
Zasady te były już znane i w pełni wdrożone w latach 70. i 80. XX wieku w językach takich jak Mesa, Ada, Modula-2 / Oberon i kilka innych, a dopiero teraz (w 2010 r.) Trafiają do nowoczesnych języków, takich jak Go (Google) , Swift (Apple), C # (Microsoft) i kilka innych.
Miejmy nadzieję, że wkrótce będzie to norma, a nie wyjątek. Aby się tam dostać, muszą się zdarzyć dwie rzeczy:
Po pierwsze, dostawcy platform oprogramowania, tacy jak Google, Microsoft i Apple, powinni zacząć od zachęcania twórców aplikacji do korzystania z nowej metodologii kompilacji, jednocześnie umożliwiając im ponowne wykorzystanie istniejącej bazy kodu. Właśnie to Apple próbuje teraz zrobić z językiem programowania Swift, który może współistnieć z Objective-C (ponieważ używa tego samego środowiska wykonawczego).
Po drugie, same platformy oprogramowania powinny ostatecznie zostać z czasem przepisane przy użyciu tych zasad, jednocześnie przeprojektowując hierarchię modułów w tym procesie, aby stały się mniej monolityczne. Jest to oczywiście ogromne zadanie i może zająć większą część dekady (jeśli są wystarczająco odważni, by to zrobić - czego wcale nie jestem pewien w przypadku Google).
W każdym razie to platforma napędza adopcję języka, a nie na odwrót.
Bibliografia:
[1] http://www.inf.ethz.ch/personal/wirth/ProjectOberon/PO.System.pdf , strona 6: „Kompilator kompiluje się w około 3 sekundy”. Ten cytat dotyczy taniej płytki rozwojowej FPGA Xilinx Spartan-3 działającej na częstotliwości taktowania 25 MHz i posiadającej 1 MB pamięci głównej. Z tego można łatwo ekstrapolować na „mniej niż 1 sekundę” dla nowoczesnego procesora pracującego na częstotliwości taktowania znacznie powyżej 1 GHz i kilku GB głównej pamięci (tj. Kilka rzędów wielkości większej mocy niż karta FPGA Xilinx Spartan-3), nawet biorąc pod uwagę prędkości we / wy. Już w 1990 r., Kiedy Oberon był uruchomiony na procesorze NS32X32 25 MHz z 2-4 MB pamięci głównej, kompilator skompilował się w kilka sekund. Pojęcie faktycznego czekaniakompilator kończący cykl kompilacji był zupełnie nieznany programistom Oberona już wtedy. W przypadku typowych programów usuwanie palca z przycisku myszy, który wywołał polecenie kompilacji , zawsze trwało dłużej niż oczekiwanie na zakończenie kompilacji. To była naprawdę natychmiastowa satysfakcja z niemal zerowym czasem oczekiwania. A jakość wytworzonego kodu, choć nie zawsze w pełni porównywalna z najlepszymi dostępnymi wówczas kompilatorami, była wyjątkowo dobra dla większości zadań i ogólnie akceptowalna.