Ist es möglich, eine höhere Sprache für lesbares C ++ zu kompilieren? [geschlossen]

12

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?

MaiaVictor
quelle
3
Warum schreiben Sie Ihren Code nicht in einem Lisp mit Makros, so dass es nur C ++ ist und dann die Funktionen, die Sie möchten, die aber nur schwer sauber zu machen sind, um ein LISP-Makro von einer einfachen Syntax zu dem komplexeren C ++ erweitert werden. Besser noch, Sie könnten Ihren Code einfach in LISP schreiben. :)
Jimmy Hoffa
2
Erwarten Sie, dass die Lisp -> C ++ - Übersetzung sauberen C ++ - Code erzeugt, wenn die (wohl einfachere) C ++ -> Assembly eine unlesbare (Ansichtssache) Assembly erzeugt? Für wen ist das Ziel der Zusammenstellung bestimmt?
1
Irgendwie bin ich nicht ganz davon überzeugt, dass bereits jemand die Makros geschrieben hat, um genau das zu erweitern, was Sie möchten. In der Regel sind Makros jedoch überraschend einfach zu schreiben. Sie sind lediglich Methoden zur Listenverarbeitung. Sie sollten keine großen Schwierigkeiten beim Schreiben haben Alles innerhalb eines einzelnen S-Ausdrucks, den Sie einschränken, wenn der Makro-Expander aufpassen soll. Dann drucken Sie einfach die Liste aus, um Ihren C ++ - Code mit Erweiterung zu erhalten.
Jimmy Hoffa
2
Ich bin damit einverstanden, dass Lisp bestimmte Dinge tun kann, die in C ++ schwierig sind (z. B. Schließungen). Müssen Sie diese Dinge tun? Dann, da sie in C ++ schwer zu tun sind, wird es nicht schön sein, egal wie Sie sie automatisch oder manuell in C ++ einbinden. Mein Vorschlag: Wenn Sie die schwierigen Dinge, die Lisp tun kann, nicht wirklich wirklich wirklich brauchen, verwenden Sie Lisp nicht. Werde gut in C ++. Wenn Sie diese Dinge verwenden müssen, aber in C ++ programmieren müssen, dann finden Sie heraus, wie Sie dies in C ++ tun können. Das unterscheidet die Erwachsenen von den Kindern in diesem Geschäft.
Mike Dunlavey
3
Es gibt mehrere Sprachen mit Compilern, die C-Code ausgeben. Ich verstehe daher nicht, warum dies nicht möglich ist, selbst wenn es sich um C-ähnlichen C ++ - Code handelt. Wenn Ihre Frage lautet "Kann ich kanonischen, bewährten C ++ - Code mit allen verfügbaren Funktionen in C ++ erhalten?", Ist dies möglicherweise etwas schwieriger.
Robert Harvey

Antworten:

13

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_147als input_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.

Sean McSomething
quelle
Ich wünschte, ich könnte meinen Lebenslauf aktualisieren und einen anderen Job finden. Leider ist das bei job = "student" und boss = "professor" nicht so einfach. Und leider soll ich ein Diplom haben. Unabhängig davon gehe ich nicht in den Unterricht, sondern lerne es selbst zu Hause. An der Tatsache, dass ich bereits in der Branche arbeite und mehr Geld verdiene als die meisten Absolventen, die ich kenne. So funktioniert es. Traurig. Glücklicherweise hat mein Professor zugesagt, mich zu überholen, wenn ich etwas Kompliziertes in C ++ schreibe. Ich kenne C ++ bereits. Ich nutze also lieber die Gelegenheit, etwas anderes zu lernen (;
Nebenbei gesagt
@Dokkat: Ich glaube nicht, dass Sie C ++ kennen. Können Sie Vorlagen mit speziellen Implementierungen schreiben, je nachdem, ob der Parameter eine Methode oder Funktion hat? Haben Sie mit Boost.MPL Berechnungen zur Kompilierungszeit durchgeführt? Verstehst du, wie Boost.ForEach funktioniert? Wenn Sie dies in C ++ tun müssen, nutzen Sie diese Gelegenheit, um sich mit fortgeschrittenem C ++ vertraut zu machen. Es wird auch für Ihre Arbeit nützlicher sein.
Jan Hudec
1
Nun, ich habe einige ziemlich komplizierte Vorlagen erstellt, als ich in diesen traurigen Jahren mit C ++ gearbeitet habe. Ja, ich habe Boost.FürJedes Mal habe ich eine Menge Makros definiert, um es nützlicher zu machen. Wie auch immer, ich war ein Kind, das war keine lustige Erfahrung. Ich verstehe es nicht, weiter zu lernen, wenn Lisp ein solideres, weniger schmerzhaftes Makrosystem bereitstellt, das genau die Art von Metaprogrammierung ausführt, für die C ++ Guru-Kenntnisse erfordert.
MaiaVictor
3

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.

Shashank Gupta
quelle
Ich denke, Sie überlesen, was ich mit "lesbar" meine! Es muss nicht wirklich schön sein. Gerade genug, damit Sie es lesen und verstehen können, was los ist. Ich nehme an, ich werde mit einigen Lisp-Makros eine direkte Übersetzung durchführen, wie JimmyHoffa in den Kommentaren vorgeschlagen hat.
MaiaVictor
3

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.

Jan Hudec
quelle
VIM vereinbaren. Es passt wie angegossen für die C-Entwicklung. Ich bin ein Vim-Benutzer, aber für Lisp verwende ich Emacs im Böse-Modus mit SLIME und Paredit. Lisping in vim wird mit einfachen REPL-Hooks zwar unterstützt, kommt aber SLIME nicht sehr nahe.
mike30