Ein guter Test für die Übersetzungseffizienz eines Compilers ist die Selbstkompilierung: Wie lange dauert es, bis ein bestimmter Compiler sich selbst kompiliert? Für C ++ dauert es sehr lange (Stunden?). Im Vergleich dazu würde sich ein Pascal / Modula-2 / Oberon-Compiler in weniger als einem kompilieren auf einer modernen Maschine Sekunde [1].
Go wurde von diesen Sprachen inspiriert, aber einige der Hauptgründe für diese Effizienz sind:
Eine klar definierte, mathematisch fundierte Syntax für effizientes Scannen und Parsen.
Eine typsichere und statisch kompilierte Sprache, die eine separate Kompilierung mit Abhängigkeits- und Typprüfung über Modulgrenzen hinweg verwendet, um unnötiges erneutes Lesen von Header-Dateien und erneutes Kompilieren anderer Module zu vermeiden - im Gegensatz zur unabhängigen Kompilierung wie in C / C ++, wo Der Compiler führt keine derartigen modulübergreifenden Überprüfungen durch (daher müssen alle Header-Dateien auch bei einem einfachen einzeiligen "Hallo Welt" -Programm immer wieder neu gelesen werden).
Eine effiziente Compiler-Implementierung (z. B. Top-Down-Analyse mit rekursivem Abstieg in einem Durchgang) - was natürlich durch die obigen Punkte 1 und 2 erheblich unterstützt wird.
Diese Prinzipien sind bereits in den 1970er und 1980er Jahren in Sprachen wie Mesa, Ada, Modula-2 / Oberon und mehreren anderen bekannt und vollständig umgesetzt worden und finden erst jetzt (in den 2010er Jahren) Eingang in moderne Sprachen wie Go (Google). , Swift (Apple), C # (Microsoft) und einige andere.
Hoffen wir, dass dies bald die Norm und nicht die Ausnahme sein wird. Um dorthin zu gelangen, müssen zwei Dinge passieren:
Zunächst sollten Anbieter von Softwareplattformen wie Google, Microsoft und Apple Anwendungsentwickler dazu ermutigen , die neue Kompilierungsmethode zu verwenden, und ihnen gleichzeitig ermöglichen, ihre vorhandene Codebasis wiederzuverwenden. Dies versucht Apple jetzt mit der Programmiersprache Swift zu tun, die mit Objective-C koexistieren kann (da dieselbe Laufzeitumgebung verwendet wird).
Zweitens sollten die zugrunde liegenden Softwareplattformen selbst im Laufe der Zeit unter Verwendung dieser Prinzipien neu geschrieben werden, während gleichzeitig die Modulhierarchie neu gestaltet wird, um sie weniger monolithisch zu machen. Dies ist natürlich eine Mammutaufgabe und kann den größten Teil eines Jahrzehnts in Anspruch nehmen (wenn sie mutig genug sind, dies tatsächlich zu tun - was ich bei Google überhaupt nicht sicher bin).
In jedem Fall ist es die Plattform, die die Sprachakzeptanz vorantreibt, und nicht umgekehrt.
Verweise:
[1] http://www.inf.ethz.ch/personal/wirth/ProjectOberon/PO.System.pdf , Seite 6: "Der Compiler kompiliert sich in ca. 3 Sekunden selbst". Dieses Angebot gilt für eine kostengünstige Xilinx Spartan-3-FPGA-Entwicklungsplatine, die mit einer Taktfrequenz von 25 MHz und 1 MByte Hauptspeicher betrieben wird. Von hier aus kann man auf "weniger als 1 Sekunde" für einen modernen Prozessor extrapolieren, der mit einer Taktfrequenz weit über 1 GHz und mehreren GByte Hauptspeicher läuft (dh mehrere Größenordnungen leistungsstärker als die Xilinx Spartan-3 FPGA-Karte). auch unter Berücksichtigung der E / A-Geschwindigkeiten. Bereits 1990, als Oberon auf einem 25-MHz-NS32X32-Prozessor mit 2-4 MByte Hauptspeicher ausgeführt wurde, kompilierte sich der Compiler in wenigen Sekunden. Der Gedanke, tatsächlich zu warten dem Compiler leicht einen Kompilierungszyklus beenden, der Oberon-Programmierern schon damals völlig unbekannt war. Für typische Programme ist es immer so dauerte länger, den Finger von der Maustaste zu entfernen, die den Kompilierungsbefehl ausgelöst hat, als darauf zu warten, dass der Compiler die gerade ausgelöste Kompilierung abgeschlossen hat. Es war wirklich eine sofortige Befriedigung mit Wartezeiten nahe Null. Und die Qualität des produzierten Codes war für die meisten Aufgaben bemerkenswert gut und im Allgemeinen durchaus akzeptabel, obwohl sie nicht immer mit den besten damals verfügbaren Compilern vergleichbar war.