3 Stimmen

Welche Schritte sind erforderlich, um neue Funktionen zu C hinzuzufügen?

Angenommen, ich möchte eine neue Programmiersprache schaffen, indem ich nur eine neue primitiv Datentyp in C, sagen wir boolean . Was wäre dafür erforderlich?

EDIT : Ich habe mich hier nicht klar ausgedrückt. Ich möchte eine neue Sprache entwickeln, deren Syntax genau wie die von C ist, aber mit einer Reihe von neuen primitiven Datentypen. Diese Sprache sollte C-Code ausgeben und ich würde dann GCC verwenden, um die ausführbaren Dateien/Objektdateien zu kompilieren.

5voto

Jonathan Leffler Punkte 694013

In den Kommentaren sagen Sie, dass die von Ihnen vorgeschlagene Sprache (ich nenne sie Ext-C, für Extended C) eine DSL ist, die für ein begrenztes Publikum gedacht ist (Sie selbst, Ihre Studenten), dann werden Sie das auch tun müssen:

  • Schreiben Sie einen Code zum Parsen von Ext-C, der erkennt, welche Teile reines C und welche Teile Ext-C sind.
  • Schreiben Sie den C-Code-Generator, der die Übersetzung von Ext-C in C darstellt.
  • Bauen Sie ihn zu einem Präprozessor zusammen, der Ext-C-Quelldateien liest und C-Quelldateien schreibt.
  • Schreiben Sie ein Compiler-Skript (oder ein Programm), das das Parsen von Argumenten und die Ausführung des Ext-C-Präprozessors auf den Ext-C-Dateien übernimmt, bevor der C-Compiler für den Rest der Übersetzung ausgeführt wird.

をご覧ください。 Cfront als eine mögliche Quelle für Ideen.

Es gibt ein Skript "esql", das die Kompilierung steuert, und einen Präprozessor "esqlc", der die ESQL/C-Quellen analysiert und den entsprechenden C-Code erzeugt. Programmierer führen das Skript 'esql' aus, um ESQL/C-Programme zu kompilieren; sie führen das Programm 'esqlc' nicht manuell aus, es sei denn, sie haben eine ungewöhnlich perverse und masochistische Ader.

Beachten Sie, dass die Integration mit einem Debugger eine der schwierigsten Aufgaben einer DSL ist. Sie können Ihren Präprozessor veranlassen, ' #line Richtlinien', was manchmal hilfreich und manchmal hinderlich ist. (In meinem Arsenal von Skripten habe ich eines, das auskommentiert #line Direktiven; ich verwende sie, wenn ich den C-Zwischencode debuggen muss, aber dennoch auf den ursprünglichen Quellcode zurückgreifen kann). Sie können auch sehen, wie lex und yacc (und Varianten) dies in ihrer Ausgabe handhaben. Es ist auch eine gute Idee, den Präprozessor die Zwischendatei standardmäßig aufräumen zu lassen (bei erfolgreicher Kompilierung), aber eine Option anzubieten, so dass die Zwischendatei zur Überprüfung verfügbar bleibt. Beachten Sie, dass wenn Ihr Präprozessor nicht garantiert, dass die gesamte Ausgabe gültiges C ist - weil er nur Teile der Eingabe in die Ausgabe kopiert, ohne sie zu validieren, wie es ein C-Compiler tun würde - dann müssen Sie sicherstellen, dass die Benutzer (Programmierer) erkennen können, wo der Fehler in der Originaldatei liegt, selbst wenn der Fehler vom C-Compiler und nicht vom Ext-C-Compiler entdeckt wird.

Die IBM Informix 4GL-Programmiersprache ist eine vollständige Sprache, die von ihrem primären Compiler vollständig geparst wird, der dann (etwas stark vereinfachend) C-Code erzeugt. Es gibt ein Skript c4gl zur Kontrolle der Kompilierung und Verknüpfung sowie einen Präprozessor/Compiler i4glc1 (und, weil ich zu sehr vereinfacht habe, i4glc2 , i4glc3 y i4glc4 auch). Wenn der generierte C-Code nicht kompiliert werden kann, ist das ein Fehler im I4GL-Compiler - es ist nicht die Schuld des Benutzers.

2voto

Bojangles Punkte 95745

Ich denke, Sie könnten ein Shell-Skript oder einen Präprozessor zwischen Ihrer neuen Sprache und GCC schreiben, um die kleinen Bits, die Sie hinzufügen, in normale C-Syntax zu konvertieren. Betrachten Sie es als eine Schicht, genau wie den Präprozessor von GCC.

Sie können den Parser in jeder beliebigen Sprache schreiben, sogar in C selbst - in jeder Sprache, die eine Textdatei aufnehmen, verändern und ausgeben kann, entweder in eine andere Datei oder nach stdout, damit GCC sie einlesen und kompilieren kann.

Ich hoffe, das hilft

James

1voto

jay.lee Punkte 18530

Zu Ihrem Beispiel mit den Datentypen: Sie können nicht einfach jeden beliebigen Datentyp in C übersetzen. Boolesch können Sie, weil es einfacher ist als bestehende Typen und leicht durch einen beliebigen Ganzzahltyp dargestellt werden kann (wie es allgemein üblich ist #define d zu sowieso). Aber sagen wir, Sie wollten etwas wie eine 256 Bit lange Ganzzahl, nennen wir sie superlang . Diese superlang Typ kann niemals direkt in C-Code übersetzt werden, da es in C keinen entsprechenden Datentyp gibt.

Aber wenn Sie nur einfache Dinge in C übersetzen wollen, klingt es so, als ob es viel einfacher wäre, den C-Präprozessor zu verwenden.

0voto

Chris Punkte 1293

Wenn Sie wollen, dass es breit unterstützt wird, müssen Sie die ISO davon überzeugen, es in ihre nächste Norm aufzunehmen. Soweit ich das beurteilen kann, gibt es im Moment nicht wirklich eine große Dynamik für die Überarbeitung von C. Alle interessanten Dinge passieren in C++, wie C++0x.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X