Wenn etwas generiert werden kann, dann sind das Daten, kein Code.
Insofern Sie später festlegen, dass es sich bei diesem Code um Daten handelt, reduziert sich Ihr Vorschlag auf "Wenn etwas generiert werden kann, ist das Ding kein Code." Würden Sie dann sagen, dass der von einem C-Compiler generierte Assembly-Code kein Code ist? Was passiert, wenn es genau mit dem Assembler-Code übereinstimmt, den ich von Hand schreibe? Du kannst gerne dorthin gehen, wenn du möchtest, aber ich werde nicht mit dir kommen.
Beginnen wir stattdessen mit einer Definition von "Code". Ohne zu technisch zu werden, wäre eine ziemlich gute Definition für die Zwecke dieser Diskussion "maschinell ausführbare Anweisungen zum Durchführen einer Berechnung".
Ist diese Idee der Quellcode-Generierung nicht ein Missverständnis?
Nun ja, Ihr Ausgangspunkt ist, dass Code nicht generiert werden kann, aber ich lehne diesen Vorschlag ab. Wenn Sie meine Definition von "Code" akzeptieren, sollte es im Allgemeinen kein konzeptionelles Problem bei der Codegenerierung geben.
Das heißt, wenn es einen Codegenerator für etwas gibt, warum dann nicht eine ordnungsgemäße Funktion daraus machen, die die erforderlichen Parameter empfangen und die richtige Aktion ausführen kann, die der "erzeugte" Code ausgeführt hätte?
Nun, das ist eine ganz andere Frage, nach dem Grund für die Codegenerierung und nicht nach ihrer Natur. Sie schlagen die Alternative vor, dass anstelle von Schreiben oder Verwenden eines Codegenerators eine Funktion geschrieben wird, die das Ergebnis direkt berechnet. Aber in welcher Sprache? Vorbei sind die Zeiten, in denen irgendjemand direkt in Maschinencode geschrieben hat. Wenn Sie Ihren Code in einer anderen Sprache schreiben, sind Sie auf einen Codegenerator in Form eines Compilers und / oder Assemblers angewiesen, um ein Programm zu erstellen, das tatsächlich ausgeführt wird.
Warum schreibst du dann lieber in Java oder C oder Lisp oder was auch immer? Auch Assembler? Ich behaupte, dass dies zumindest teilweise darauf zurückzuführen ist, dass diese Sprachen Abstraktionen für Daten und Operationen bereitstellen, die es einfacher machen, die Details der durchzuführenden Berechnung auszudrücken.
Gleiches gilt auch für die meisten übergeordneten Codegeneratoren. Die prototypischen Fälle sind wahrscheinlich Scanner- und Parser-Generatoren wie lex
und yacc
. Ja, Sie können einen Scanner und einen Parser direkt in C oder in einer anderen Programmiersprache Ihrer Wahl schreiben (sogar in unformatiertem Maschinencode), und manchmal auch. Bei einem Problem mit erheblicher Komplexität erleichtert die Verwendung einer höheren Sprache für spezielle Zwecke wie Lex oder Yacc das Schreiben, Lesen und Verwalten des handgeschriebenen Codes. Meist auch viel kleiner.
Sie sollten sich auch überlegen, was genau Sie unter "Codegenerator" verstehen. Ich würde C-Vorverarbeitung und die Instanziierung von C ++ - Vorlagen als Übung bei der Codegenerierung betrachten. lehnen Sie diese ab? Wenn nicht, dann müssen Sie einige mentale Gymnastik machen, um zu rationalisieren, dass Sie diese akzeptieren, aber andere Arten der Code-Generierung ablehnen.
Wenn es aus Performancegründen gemacht wird, dann klingt das nach einem Manko des Compilers.
Warum? Sie sind im Grunde genommen der Meinung, dass man ein universelles Programm haben sollte, in das der Benutzer Daten einspeist, von denen einige als "Anweisungen" und andere als "Eingaben" klassifiziert sind und das die Berechnung durchführt und mehr Daten ausgibt, die wir "Ausgaben" nennen. (Unter einem bestimmten Gesichtspunkt könnte man ein solches universelles Programm als "Betriebssystem" bezeichnen.) Aber warum sollte ein Compiler bei der Optimierung eines solchen universellen Programms genauso effektiv sein wie bei der Optimierung eines spezialisierteren Programm? Die beiden Programme haben unterschiedliche Eigenschaften und Fähigkeiten.
Wenn es darum geht, zwei Sprachen zu verbinden, dann klingt das nach einem Mangel an Schnittstellenbibliothek.
Sie sagen, dass eine universelle Schnittstellenbibliothek zwangsläufig eine gute Sache wäre. Vielleicht wäre es so, aber in vielen Fällen wäre eine solche Bibliothek groß und schwierig zu schreiben und zu warten, und vielleicht sogar langsam. Und wenn ein solches Tier tatsächlich nicht existiert, um das jeweilige Problem zu lösen, wer sind Sie dann, um darauf zu bestehen, dass eines erstellt wird, wenn ein Code-Generierungsansatz das Problem viel schneller und einfacher lösen kann?
Vermisse ich hier etwas?
Mehrere Dinge, denke ich.
Ich weiß, dass Code auch Daten sind. Was ich nicht verstehe ist, warum Quellcode generieren? Warum nicht daraus eine Funktion machen, die Parameter akzeptiert und auf diese einwirkt?
Codegeneratoren wandeln in einer Sprache geschriebenen Code in Code in einer anderen, normalerweise niedrigeren Sprache um. Sie fragen sich also, warum die Leute Programme in mehreren Sprachen schreiben möchten und vor allem, warum sie möglicherweise Sprachen mit subjektiv unterschiedlichen Niveaus mischen möchten.
Aber das habe ich schon angesprochen. Man wählt eine Sprache für eine bestimmte Aufgabe zum Teil aufgrund ihrer Klarheit und Aussagekraft für diese Aufgabe. Da kleinerer Code im Durchschnitt weniger Fehler aufweist und einfacher zu warten ist, besteht zumindest bei umfangreichen Arbeiten eine Tendenz zu höheren Sprachen. Ein komplexes Programm beinhaltet jedoch viele Aufgaben, von denen einige in einer Sprache effektiver behandelt werden können, während andere in einer anderen Sprache effektiver oder prägnanter behandelt werden. Das richtige Werkzeug für den Job zu verwenden, bedeutet manchmal, Code zu generieren.