Heutzutage benötigen Sie einen echten C-Compiler, um einen optimierenden Compiler zu sein , insbesondere, weil C keine hardwarenahe Sprache mehr ist, da aktuelle Prozessoren unglaublich komplex sind ( außer Betrieb , Pipeline , superskalar , mit komplexen Caches und TLBs) . daher wird eine Befehlsplanung benötigt , etc ...). Die heutigen x86-Prozessoren sind keine i386-Prozessoren des vorigen Jahrhunderts, auch wenn beide in der Lage sind, denselben Computercode auszuführen. Siehe, das C ist kein Low-Level- Papier (Ihr Computer ist kein schnelles PDP-11) von David Chisnall.
Nur wenige Leute verwenden naive, nicht optimierende C-Compiler wie tinycc oder nwcc , da sie Code erzeugen, der um ein Vielfaches langsamer ist als der, den optimierende Compiler liefern können.
Das Codieren eines optimierenden Compilers ist schwierig. Beachten Sie, dass sowohl GCC als auch Clang eine "quellensprachenneutrale" Codedarstellung optimieren (Gimple für GCC, LLVM für Clang). Die Komplexität eines guten C-Compilers befindet sich nicht in der Analysephase!
Insbesondere ist das Erstellen eines C ++ - Compilers nicht viel schwieriger als das Erstellen eines C-Compilers: Das Parsen von C ++ und das Umwandeln in eine interne Codedarstellung ist komplex (da die C ++ - Spezifikation komplex ist), aber gut verstanden, aber die Optimierungsteile sind noch viel komplexer Komplex (innerhalb von GCC: Die Middle-End-Optimierungen, quellensprachlich und zielprozessorneutral, bilden die Mehrheit des Compilers, wobei der Rest zwischen Frontends für mehrere Sprachen und Backends für mehrere Prozessoren ausgeglichen wird ). Daher sind die meisten optimierenden C-Compiler auch in der Lage, einige andere Sprachen wie C ++, Fortran, D, ... zu kompilieren. Die C ++ - spezifischen Teile von GCC machen etwa 20% des Compilers aus.
Außerdem wird C (oder C ++) so häufig verwendet, dass die Benutzer erwarten, dass ihr Code kompilierbar ist, auch wenn er nicht genau den offiziellen Standards entspricht, die die Semantik der Sprache nicht genau genug definieren (sodass jeder Compiler möglicherweise seine eigene Interpretation hat) davon). Schauen Sie sich auch den von CompCert bewährten C-Compiler und den statischen Analysator Frama-C an , die sich um eine formalere Semantik von C kümmern .
Und Optimierungen sind ein Long-Tail- Phänomen: Ein paar einfache Optimierungen zu implementieren ist einfach, macht einen Compiler jedoch nicht wettbewerbsfähig! Sie müssen viele verschiedene Optimierungen implementieren und sie geschickt organisieren und kombinieren, um einen echten Compiler zu erhalten, der wettbewerbsfähig ist. Mit anderen Worten, ein Compiler zur Optimierung der Realität muss eine komplexe Software sein. Übrigens haben sowohl GCC als auch Clang / LLVM mehrere interne spezialisierte C / C ++ - Codegeneratoren. Und beide sind riesige Bestien (mehrere Millionen Quellcodezeilen, mit einer Wachstumsrate von mehreren Prozent pro Jahr) mit einer großen Entwicklergemeinschaft (einige hundert Personen, die meistens in Vollzeit oder mindestens in Halbzeit arbeiten).
Beachten Sie, dass es (meines Wissens nach) keinen Multithread-C-Compiler gibt, auch wenn einige Teile eines Compilers parallel ausgeführt werden könnten (z. B. prozedurale Optimierung, Registerzuweisung, Befehlsplanung ...). Und paralleles Bauen mit make -j
ist nicht immer ausreichend (besonders bei LTO ).
Außerdem ist es schwierig, einen C-Compiler von Grund auf neu zu programmieren, und ein solcher Aufwand muss mehrere Jahre dauern. Schließlich sind die meisten C- oder C ++ - Compiler heute freie Software (es gibt keinen Markt mehr für neue proprietäre Compiler, die von Startups verkauft werden) oder zumindest monopolistische Produkte (wie Microsoft Visual C ++ ), und für Compiler ist eine freie Software fast erforderlich ( weil sie Beiträge von vielen verschiedenen Organisationen benötigen).
Ich würde mich sehr freuen, wenn ich finanzielle Unterstützung für die Arbeit an einem C-Compiler von Grund auf als freie Software erhalten könnte, aber ich bin nicht naiv genug, um zu glauben, dass dies heute möglich ist!