C ++ ist in vielerlei Hinsicht eine großartige Sprache, aber einige Dinge sind ohne eine IDE nur schwer zu schreiben. Als VIM-Benutzer wäre es sehr interessant, wenn ich Zugang zu einer höheren Sprache hätte, die es mir ermöglicht, C ++ mit S-Expressions und möglicherweise mit Lisp-ähnlichen Makros zu schreiben, um sauberen Code zu generieren, ohne dieselben Muster neu zu schreiben wieder und wieder.
Ich habe bei freenode nachgefragt und verschiedene Ideen getestet, wie zum Beispiel das Kompilieren von Lisp-> C mit Compilern wie ECL und Bigloo, aber keine davon hat besonders sauberen C-Code erzeugt.
Gibt es Arbeiten zu diesem Thema?
Antworten:
Das Kompilieren von höheren zu niedrigeren Sprachen ist ein Kinderspiel. Es gibt unzählige Beispiele dafür. Wir können auf frühe C ++ - Compiler verweisen, die bis zu C kompiliert wurden, ohne dass wir uns auf eine Tangente festlegen müssen.
Wenn Sie anfangen, "sauber" und "lesbar" in die Mischung zu werfen, werden die Dinge jedoch sehr schwierig. Sauberer, lesbarer Code drückt die Bedeutung und Absicht des Geschriebenen aus. Computer sind notorisch schlecht darin, Bedeutung zu interpretieren und zu schaffen. Es ist wahrscheinlicher, dass Sie mit Variablen namens enden
int_147
alsinput_buffer_length
. Wenn Sie dieses Projekt wirklich zum Laufen bringen möchten, könnten Sie sich auf ein riesiges KI-Projekt einlassen, um Ihr Lisp in eine anständig lesbare C ++ - Version umzuwandeln .Wichtiger als die Schwierigkeit, C ++ aus einem Lisp zu generieren, ist der Nutzen davon. Welchen Zweck hätte es, wenn das generierte C ++ lesbar wäre? Wenn das Lisp Ihr Quellcode ist, sollten Zwischenrepräsentationen irrelevant sein. Wenn Sie in der Lage sein möchten, C ++ an Programmierer weiterzugeben, die Ihr ursprüngliches Lisp nicht verstehen, haben Sie jetzt ein anderes Problem. Was passiert, wenn sie Ihr generiertes C ++ ändern möchten? Was passiert, wenn sie Dinge in C ++ schreiben, die sich nicht sauber in Ihr Lisp übersetzen lassen?
Nehmen wir an, wir haben das gelöst. Es ist ein Jahrzehnt später und nachdem wir Hunderte von Millionen Dollar an DoD-Zuschüssen aufgebraucht haben, haben wir diese massive, komplexe (aber fehlerfreie) Sprachübersetzungs-Engine entwickelt, die Lisp in idiomatisches C ++ verwandeln kann und umgekehrt. Was haben wir wirklich erreicht, das nicht besser erreicht werden könnte, wenn wir den Leuten entweder eine neue Programmiersprache beibringen oder nur einen neuen Compiler entwickeln, mit dem wir die beiden Sprachen verbinden können?
Oh, richtig. Ihr Chef möchte, dass Sie C ++ schreiben, und Sie möchten es lieber nicht. Aktualisieren Sie Ihren Lebenslauf und finden Sie einen neuen Job.
quelle
Kurze Antwort: Momentan gibt es nichts, was Sie bei der Konvertierung von Lisp nach READABLE C ++ unterstützen könnte. Natürlich können Sie alles in C ++ oder C konvertieren, aber lesbarer Code wird von Menschen geschrieben, nicht von Programmen. Sicher können Sie C ++ - Code mit der richtigen Formatierung, Einrückungen, schönen Klassennamen ausgeben und vielleicht sogar irgendwie eine perfekte Übersetzung von Lisp-Klassenobjekten in C ++ - Klassen erhalten. Vielleicht können Sie Ihre Bibliotheksabhängigkeiten genau richtig verknüpfen, und vielleicht können Sie Binärdateien kompilieren, die sehr nahe an dem liegen, was die C-Sprache hervorgebracht hätte, wenn Sie das Ganze in C geschrieben hätten. Aber letztendlich ist lesbarer Code eine Schönheit, die nicht verstanden wird von jedermann, zumindest noch nicht, und möglicherweise nie in Betracht gezogen, dass der Begriff lesbar ist ist anfangs ziemlich subjektiv und was unter einer Gruppe von Entwicklern als lesbar angesehen werden kann, wird von anderen als grausam empfunden.
Um C ++ lesbar zu machen, müssen Sie in C ++ schreiben, nicht in Lisp. Sie müssen auch in der Lage sein, Ihren Codierungsstil zu ändern, je nachdem, was die Personen, die Ihren Code lesen, am besten verstehen. Genau wie Bücher sind Programme für ein bestimmtes Publikum geschrieben und können schön und berührend sein, wenn sie gut geschrieben sind, und wenn nicht, verschleiert und langweilig. Und wenn wir uns kein Programm einfallen lassen, um schöne Romane für uns zu schreiben, können wir uns nichts einfallen lassen, um es in lesbares C ++ umzuwandeln.
quelle
ViM ist eine großartige IDE für C ++. Es hat die beste Vervollständigung, die ich je gesehen habe, auch wenn es ein bisschen langsam wird, wenn man viele Überschriften einfügt, ist das Klirren vollständig . Und zum Kompilieren habe ich festgestellt, dass alle IDEs ohnehin fehlen; Am Ende schreiben Sie ein Build-System in CMake oder so. Und ich habe nichts gesehen zu bieten jede für Lisp Hilfe, period.
Zwar gibt es in C ++ keine Makros im Lisp-Stil, aber Vorlagen können alle hygienischen Makros des Schemas und noch einige mehr ausführen, da Sie sie je nach Typ und Funktionalität unterschiedlich implementieren können. Das Fehlen von Garbage Collector macht die Schließung zwar etwas langweiliger, aber die für das Ressourcenmanagement verwendete RAII-Sprache hat stattdessen ihre eigenen Vorteile und interessanten Eigenschaften.
Kennen Sie als Student wirklich alle fortgeschrittenen C ++ - Funktionen? Von der Algorithmusbibliothek über das Schreiben von Vorlagen mit alternativen Implementierungen auf der Grundlage von Eigenschaften von Argumenttypen bis hin zur Kompilierung von Zeitberechnungen mithilfe von Vorlagen-Metaprogrammierung (unter Verwendung von Boost.MPL), um zu verstehen, wie Boost unter der Haube funktioniert? Wenn nicht, empfehle ich, dies als Gelegenheit zu nutzen, um etwas fortgeschrittenes C ++ zu lernen. Die Schulzuordnung muss nicht gepflegt werden, sodass Sie mit der Sprache spielen können, um zu sehen, was die Funktionen wert sind, und wo Sie im Produktionscode auf Lesbarkeit achten müssen.
Und um die letzte direkte Frage zu beantworten: C ++ hat so viele weitere Redewendungen, dass es keine Möglichkeit gibt, aus irgendetwas idiomatisches C ++ zu generieren. Einfach, weil es keine Möglichkeit gibt, die meisten dieser Redewendungen in irgendetwas anderem auszudrücken. Ausgehend von der Tatsache, dass eine Garbage Collection alles auf dem Heap zuordnen wird, während es in C ++ idiomatisch ist, den Stack zu nutzen.
quelle