Gibt es eine Sprache, die nach C transpiliert und eine bessere Syntax aufweist? [geschlossen]
19
CoffeeScript ist eine Sprache, die sich in JavaScript umwandelt und eine klare Syntax aufweist, die von Ruby inspiriert ist. Gibt es eine ähnliche Sprache, die nach C transpiliert und lesbareren Code ermöglicht, ohne die Leistung zu beeinträchtigen? Wenn so etwas nicht existiert, gibt es einen guten Grund, es nicht zu schaffen?
Beachten Sie jedoch, dass "Kompilieren in C" nicht mit "so schnell wie die ursprünglichen C-Programme" synonym ist. Wenn etwas in C kompiliert wird, wird häufig Code generiert, der sich (oder vollständig) von dem unterscheidet, was eine normale Person in C schreiben würde. Es kann leicht erheblich langsamer (oder manchmal schneller) sein als das, was Sie normalerweise von Hand schreiben würden.
Jerry Coffin
4
Was ich an keiner dieser Antworten mag, ist, dass sie völlig andere Sprachen wie Vala vorschlagen. Die Sache mit CoffeeScript ist, dass es Javascript ist, aber mit einer anderen Syntax.
Ich wünschte wirklich, "transcompile" (das Wort) würde einfach sterben. Es ist "kompilieren" und "Compiler". Sie brauchen kein neues Wort, nur weil die Ausgabesprache nicht x86 ist (und wenn Sie glauben, dass Sie das tun, verstehen Sie die Compiler nicht).
Leushenko
2
Das Wort transpile bedeutet (oder ist in letzter Zeit dazu gekommen), Code mit der gleichen Semantik in den Quellcode einer anderen Sprache zu übersetzen , normalerweise Anweisung für äquivalente Anweisung (wodurch auch eine Quellzuordnung erstellt werden kann). Niemand behauptet, dass Transpiler etwas anderes als Compiler machen. Transpiler sind eine bestimmte Art von Compiler.
Carl Smith
Antworten:
23
CoffeeScript wird aus einem sehr einfachen Grund mit JavaScript kompiliert. JavaScript ist de facto die clientseitige Sprache, und es ist nicht zu erwarten, dass Browser-Anbieter CoffeeScript nativ unterstützen, wenn nur eine alternative Syntax angeboten wird.
In sehr ähnlicher Weise liegt der Schwerpunkt der Hochsprache für C-Übersetzer in der unmittelbaren Portabilität, da es für fast jede Plattform einen C-Compiler und eine Fülle von C-Bibliotheken gibt. Vala wurde zum Beispiel entwickelt, um :
native ausführbare Dateien erstellen (über den C-Compiler der Maschine),
Referenzzählung automatisieren und
weiterhin für GNOME C-Programmierer zugänglich sein
GNOME ist ein traditionell C-orientiertes Projekt, und GObject ist speziell in C geschrieben. Vala würde wahrscheinlich unter GNOME-Entwicklern keine große Liebe finden, wenn es zu Maschinencode kompiliert würde, unabhängig von seiner freundlicheren Art (und Syntax). Nicht jeder schien die Syntax zu mögen, bis zu dem Punkt, dass eine andere Sprache, Genie , gebaut wurde, um sie zu verbessern.
Für ein C ++ - Beispiel hat Facebook HipHop entwickelt , einen PHP-C ++ - Übersetzer. Sie versuchten, ein sehr spezifisches Problem, die CPU-Auslastung, zu lösen, ohne ihren gesamten PHP-Code ersetzen und ihre Ingenieure neu ausbilden zu müssen (oder, schlimmstenfalls, sie zu ersetzen). Dies ist ein weitaus spezifischeres Beispiel, da Facebook-Skalierbarkeitsprobleme eindeutig sind und der Zugriff auf den C ++ - Zwischencode ebenfalls nützlich sein kann, da PHP-Erweiterungen in C und C ++ geschrieben sind.
Ein Übersetzer von einer höheren Sprache in eine andere ist daher eine gute Idee, vor allem, wenn Sie auf den Zwischencode zugreifen müssen. Für CoffeeScript ist der JavaScript-Code aufgrund seiner breiten Browser-Akzeptanz und für Vala, Genie und HipHop aufgrund der vorhandenen Codebasis erforderlich. Der Zugriff auf den Zwischencode bedeutet natürlich, dass Sie ihn bei Bedarf weiter optimieren können.
Im Allgemeinen wäre es jedoch keine so gute Idee, eine Sprache zu erstellen, die in C oder in eine andere Sprache übersetzt wird, wenn Sie den resultierenden Code nicht verwenden könnten. Es gibt so viele Sprachen, wenn Sie mit C nicht klar kommen, wählen Sie einfach eine andere aus. Zufälligerweise die erste C ++ Compiler von Bjarne Stroustrup geschrieben, Cfront, war ein C mit Klassen zu C - Übersetzer, aber das war hauptsächlich , weil als neue Sprache, es war unmöglich , Bootstrap C mit Klassen.
Ich werde ein paar Punkte behandeln, die Yannis Rizos in seiner ansonsten großartigen Antwort nicht angesprochen hat.
Ja, es gibt viele Sprachen. C ist ein häufiges Ziel für Compiler-Backends, da es unglaublich portabel und stark optimiert ist, obwohl LLVM nicht viel Sinn macht.
Einige Implementierungen, die ich kenne, sind:
C ++ (zumindest in den frühen Tagen)
GHC Haskell (Obwohl der Hauptcodegenerator C-- ist)
Nein, nur weil es C als Zwischensprache verwendet, heißt das nicht, dass Sie seine Geschwindigkeit erreichen werden. Der Grund, warum C schnell ist, liegt in der Methode des Schreibens des Codes, die sich offensichtlich für andere Sprachen unterscheidet. Es ist nur eine tragbare Baugruppe, nichts Besonderes.
Einige Leute denken an C als "High-Level-Assembler". Es ist ziemlich nah an der Maschine, aber es sind natürlich keine Opcodes.
Dstromberg
6
Rock ist ein OOC- Compiler, der C99-Quellcode generiert. Die ooc-lang ist eine Programmiersprache mit Objekten, erstklassigen Funktionen und rosa Einhörnern. Das OOC ist eine dynamische Sprache und geht so weit weg. Es erzeugt dickere und langsamere c-Codes. u müssen mehr geändert werden, um Ihrer Anforderung zu entsprechen. Aber es ist ein guter Ausgangspunkt.
Würde es Ihnen etwas ausmachen, die einzelnen Ressourcen etwas näher zu erläutern, und warum empfehlen Sie diese zur Beantwortung der gestellten Frage? „Link-only Antworten“ sind nicht ganz willkommen bei Stapelaustausch
Würde es Ihnen etwas ausmachen, mehr darüber zu erklären, was es tut, und warum empfehlen Sie es als Antwort auf die gestellte Frage? "Nur-Link-Antworten" sind bei Stack Exchange
Uhr
3
Ich sehe nicht, wie meine Antwort eine "Nur-Link-Antwort" ist. Eigentlich könnte ich den Link entfernen und es wäre immer noch eine gültige Antwort. Die Frage lautet "Gibt es eine Sprache, die X beherrscht" und meine Antwort lautet "Sprache Y beherrscht X". Dieser Kommentar gilt auch für Bilijks Antwort.
Barjak
3
Bjarne Stroustrops ursprünglicher C ++ - Compiler "cfront" kompilierte C ++ zu C, mit dem er dann optional den C-Compiler ausführen würde, um Objektcode zu erzeugen. C ++ ist ungefähr so "nicht-theoretisch" wie Sie nur bekommen können :-)
Die Unix "yacc" und GNU "Bison" Compiler-Compiler übersetzen ihre Eingabesprachen nach C. Viele, viele hochentwickelte Systeme wurden mit ihnen geschrieben.
Antworten:
CoffeeScript wird aus einem sehr einfachen Grund mit JavaScript kompiliert. JavaScript ist de facto die clientseitige Sprache, und es ist nicht zu erwarten, dass Browser-Anbieter CoffeeScript nativ unterstützen, wenn nur eine alternative Syntax angeboten wird.
In sehr ähnlicher Weise liegt der Schwerpunkt der Hochsprache für C-Übersetzer in der unmittelbaren Portabilität, da es für fast jede Plattform einen C-Compiler und eine Fülle von C-Bibliotheken gibt. Vala wurde zum Beispiel entwickelt, um :
GNOME ist ein traditionell C-orientiertes Projekt, und GObject ist speziell in C geschrieben. Vala würde wahrscheinlich unter GNOME-Entwicklern keine große Liebe finden, wenn es zu Maschinencode kompiliert würde, unabhängig von seiner freundlicheren Art (und Syntax). Nicht jeder schien die Syntax zu mögen, bis zu dem Punkt, dass eine andere Sprache, Genie , gebaut wurde, um sie zu verbessern.
Für ein C ++ - Beispiel hat Facebook HipHop entwickelt , einen PHP-C ++ - Übersetzer. Sie versuchten, ein sehr spezifisches Problem, die CPU-Auslastung, zu lösen, ohne ihren gesamten PHP-Code ersetzen und ihre Ingenieure neu ausbilden zu müssen (oder, schlimmstenfalls, sie zu ersetzen). Dies ist ein weitaus spezifischeres Beispiel, da Facebook-Skalierbarkeitsprobleme eindeutig sind und der Zugriff auf den C ++ - Zwischencode ebenfalls nützlich sein kann, da PHP-Erweiterungen in C und C ++ geschrieben sind.
Ein Übersetzer von einer höheren Sprache in eine andere ist daher eine gute Idee, vor allem, wenn Sie auf den Zwischencode zugreifen müssen. Für CoffeeScript ist der JavaScript-Code aufgrund seiner breiten Browser-Akzeptanz und für Vala, Genie und HipHop aufgrund der vorhandenen Codebasis erforderlich. Der Zugriff auf den Zwischencode bedeutet natürlich, dass Sie ihn bei Bedarf weiter optimieren können.
Im Allgemeinen wäre es jedoch keine so gute Idee, eine Sprache zu erstellen, die in C oder in eine andere Sprache übersetzt wird, wenn Sie den resultierenden Code nicht verwenden könnten. Es gibt so viele Sprachen, wenn Sie mit C nicht klar kommen, wählen Sie einfach eine andere aus. Zufälligerweise die erste C ++ Compiler von Bjarne Stroustrup geschrieben, Cfront, war ein C mit Klassen zu C - Übersetzer, aber das war hauptsächlich , weil als neue Sprache, es war unmöglich , Bootstrap C mit Klassen.
quelle
Ich werde ein paar Punkte behandeln, die Yannis Rizos in seiner ansonsten großartigen Antwort nicht angesprochen hat.
Ja, es gibt viele Sprachen. C ist ein häufiges Ziel für Compiler-Backends, da es unglaublich portabel und stark optimiert ist, obwohl LLVM nicht viel Sinn macht.
Einige Implementierungen, die ich kenne, sind:
Nein, nur weil es C als Zwischensprache verwendet, heißt das nicht, dass Sie seine Geschwindigkeit erreichen werden. Der Grund, warum C schnell ist, liegt in der Methode des Schreibens des Codes, die sich offensichtlich für andere Sprachen unterscheidet. Es ist nur eine tragbare Baugruppe, nichts Besonderes.
quelle
Rock ist ein OOC- Compiler, der C99-Quellcode generiert. Die ooc-lang ist eine Programmiersprache mit Objekten, erstklassigen Funktionen und rosa Einhörnern. Das OOC ist eine dynamische Sprache und geht so weit weg. Es erzeugt dickere und langsamere c-Codes. u müssen mehr geändert werden, um Ihrer Anforderung zu entsprechen. Aber es ist ein guter Ausgangspunkt.
quelle
Vala und Genie sind beide Sprachen, die in C kompiliert werden. Haxe kompiliert in C ++, aber ich bin mir nicht sicher, ob Sie das wollen.
quelle
OCaml kann in Bytecode, in systemeigenen Code kompiliert, direkt interpretiert oder in C kompiliert werden .
quelle
quelle