C−−
C−− | |
---|---|
Paradigmen: | imperativ |
Erscheinungsjahr: | 1997 |
Entwickler: | Simon Peyton Jones; Norman Ramsey |
Typisierung: | statisch, schwach |
Beeinflusst von: | C |
C−− (C minus minus) ist eine sehr C-ähnliche Programmiersprache bzw. Zwischensprache zur Erzeugung durch Compiler. Die Erfinder von C−−, Simon Peyton Jones und Norman Ramsey, beide Forscher auf dem Gebiet der funktionalen Programmierung, erfanden C−− mehr zur Verwendung als Zwischensprache zum Maschinencode für Compiler von Höchstsprachen denn als normal programmierte Sprache. Anders als andere Zwischensprachen besteht C−− aus ASCII-Text, nicht Bytecode (z. B. der Zwischencode von Java) oder anderen Binärformaten.
Design und Geschichte
C−− wird als eine portable Assemblersprache genutzt, die dafür bestimmt ist, die Implementierung eines Compilers, der sehr guten Maschinencode erzeugen soll, zu vereinfachen, indem der Compiler einfach C−−-Code erzeugt und die Low-Level-Optimierung und -Umsetzung einem C−−-Compiler überlässt.
Die Arbeit an C−− begann Ende der 1990er. Da das Schreiben eines Codegenerators selbst schon schwierig ist, und die Compiler-Backends, die damals den Forschern offen verfügbar waren, komplex und schlecht dokumentiert waren, schrieben viele Projekte Compiler, die C-Code erzeugten (der originale Modula-3-Compiler funktionierte so, ebenso frühe Versionen des GHC). C ist jedoch eine schlechte Sprachwahl als Zwischensprache für funktionale Sprachen; zum Beispiel besitzt C von Haus aus weder Garbage Collection noch eine effiziente Ausnahmebehandlung. C−− ist eine einfachere, straffer standardisierte Sprache als C, die alle diese Features besitzt. Die größte Besonderheit an C−− ist ein Runtime-Interface, was das Schreiben beispielsweise von portablen Garbage Collectors, Ausnahmebehandlungssystemen und anderen Laufzeit-Erweiterungen ermöglicht, die mit jedem C−−-Compiler laufen.
Die Syntax von C−− lehnt sich stark an die von C an. Jedoch sind in der Syntax einige C-Eigenschaften entfernt oder geändert, wie zum Beispiel variadische Funktionen, Zeiger-Syntax, und Aspekte des Typsystems von C, da diese bestimmte grundlegende Eigenschaften von C−− stören, sowie die einfache Erzeugbarkeit durch Compiler und Code-Generatoren erschweren.
Der Name C−− ist im Grunde ein Insiderscherz (++ und −− dienen in C-ähnlichen Sprachen zum In- bzw. Dekrementieren): C++ ist eine auf C basierende Sprache mit im Vergleich zu C erweiterten Funktionen, also ist C−− die Sprache C mit reduziertem Funktionsumfang.
C−− ist eine Zielsprache des Glasgow Haskell Compiler, eine Anpassung der Sprache könnte die Haupt-Zielsprache werden. Einige C−−-Entwickler, darunter Simon P. Jones, João Dias und Norman Ramsey haben schon am Glasgow Haskell Compiler mitgearbeitet.
Typsystem
Wie in vielen Assemblersprachen wird jedwede höhere Typunterscheidung, beispielsweise zwischen signed
, unsigned
, float
, Zeigern etc. erst durch die Operatoren und anderen Sprachkonstrukte eingeführt.
Das Typsystem von C−− ist absichtlich so gestaltet, dass es die Einschränkungen der Hardware eher wiedergibt als die Typsysteme höherer Sprachen. In C−− kann ein Wert, der in einem Register oder einer Speicherzelle gespeichert ist, nur einen Typ haben, nämlich den eines Bitvektors. Ein Bitvektor ist ein polymorpher Typ und kann in verschiedenen Wortbreiten vorkommen, z. B. bits8
, bits32
oder bits64
. Neben dem Bitvektor besitzt C−− auch den booleschen Typen bool
, der zwar bei Ausdrücken als Lösung vorkommen und für die Kontrolle des Programmflusses eingesetzt werden kann, jedoch nicht in einem Register oder im Speicher gespeichert werden kann.
Sphinx C−−
Der Name C−− wurde schon für eine frühere Programmiersprache genutzt, die in den 1990ern von Peter Cellik für x86-Computer entworfen wurde. Sphinx C−− integriert x86-Assemblerelemente in C.