2015-03-22 12 views
5

Aus Gründen der Vertraulichkeit kann ich vielleicht nicht in Details zu den Punkten beschreiben, aber hier ist das Szenario.Wie fange ich an einen transpiler zu schreiben? Ist es überhaupt möglich?

Verschiedene Geräte mit Streaming-Apps haben verschiedene Sprachen mit unterschiedlichen APIs, obwohl sie dasselbe erreichen. Wenn Sie also eine Streaming-App für eine Plattform schreiben möchten, müssen Sie von vorne beginnen, während Sie dieselbe App für andere Plattformen kopieren, die redundante Logik schreiben. Ich möchte einen TransPiler entwickeln, der Code in einer Sprache aufnimmt und Code für alle Muttersprachen erstellt, von 1 bis zu vielen, aber ich bin nicht sicher, wie ich anfangen soll und kann nicht genug Referenzen im Internet finden. Ist es überhaupt machbar? Die Zielsprachen umfassen Varianten von Javascript und hauptsächlich Java.

+0

Sie schreiben einen transpiler, indem Sie einen Parser für die Ausgangssprache erstellen, einen Syntaxbaum erstellen und ihn dann in Code in der Zielsprache konvertieren. Abhängig von Ihrer Aufgabe kann es einfacher sein, einen transpiler nicht zu schreiben, sondern einfach die Vorlagen-basierte Code-Generierung zu verwenden, um Code für mehrere Plattformen zu erstellen. – yole

+0

Hi yole, könnten Sie bitte einen Link zu einem Arbeitsbeispiel für eine Sprache bereitstellen? –

+0

[CoffeeScript] (http://coffeescript.org/) ist ein TransPiler, der JavaScript generiert. Sieh dir seine kommentierte Quelle an. Das sollte ziemlich einfach zu verstehen sein. – yole

Antwort

2

Möglicherweise möchten Sie ein Open-Source-Compiler-Projekt wie Haxe betrachten (oder sogar beitreten). Es kann bereits von Haxe Quellcode zu Java, JavaScript, C#, C++, NekoVM, Flash und Python (experimentell) kompilieren.

Weitere Informationen:

4

Eine Möglichkeit, dies zu tun, ist die Verwendung von Infrastruktur zum Erstellen von Übersetzern.

Viele Leute denken, dies bedeutet "ein Parser-Generator"; das ist eigentlich naiv. Ein guter Übersetzer muss die Sprache parsen, klar, aber die Übersetzung muss auch verfolgen, welche Symbole bedeuten, dass das, was gesagt wird, kein Quatsch ist, der Code generiert und optimiert. Sie brauchen viel mehr Maschinen als nur einen Parser (Generator), um das gut zu machen. Siehe Life After Parsing.

Unsere DMS Software Reengineering Toolkit ist eine Reihe von Tools zum Erstellen von Programmanalysatoren und -übersetzer, einschließlich als nur ein Element ein sehr starker Parser-Generator.

DMS enthält auch eine program transformation engine, die es ermöglicht, Übersetzungsregeln in Bezug auf die zu übersetzenden Sprachen zu schreiben, if you see this, transform it to that. Das Schreiben von Übersetzungsregeln direkt in die Oberflächensyntax der Sprachen von Interesse macht es einfacher zu schreiben, zu inspizieren, zu debuggen und zu warten.

Das heißt, das Schreiben eines solchen Übersetzers ist keine leichte Aufgabe; Sie müssen den vollständigen Satz von Syntaxkonstrukten mit impliziter Semantik aufzählen und herausfinden, wie Sie dies einer Kombination aus Zielsprachesyntax und zusätzlichen Bibliotheken zuordnen können, die Sie möglicherweise auf der Zielseite erstellen. Dies dauert mehrere Monate, sogar für Experten, pro Übersetzer.

DMS ist agnostisch über welche Programmiersprachen es sich handelt. Sie müssen die Sprachen definieren, die für Sie interessant sind. Es hat eine große Anzahl von Sprachdefinitionen (nützlich als Quellen oder Ziele, Ihre Wahl) für Standardsprachen wie Java und JavaScript. Dieser verfügbare stabile Wert hilft, den Entwicklungszyklus zu verkürzen, aber es sind im Allgemeinen nicht die dominierenden Kosten.

Es gibt einen heiligen Gral des Aufbaus eines "Universalübersetzers", in dem man einen Satz Regeln schreibt und alles danach Pfirsich ist. Diese Idee ist eine Fantasie. Es lohnt sich zu verstehen, dass ein Satz von Übersetzungsregeln von Sprache A nach B nicht wirklich nützlich ist, um Sprache C in D zu übersetzen, weil die Regeln Wissen über spezifische Syntax und implizierte Semantik kombinieren. Nichtsdestoweniger, wenn Sie mehrere "transpilers" bauen, ist es ein enormer Gewinn in Bezug auf Lernkurve und langfristige Wartbarkeit, dies auf einer gemeinsamen Grundlage zu tun.

Mit Tools wie DMS kann man extremely accurate translators. schreiben.

+2

Es ist eine Schande, dass SO so Deletionist ist. Dieses Thema wurde erst kürzlich behandelt und dann gelöscht, unter http://stackoverflow.com/questions/28968161/transcompiling-to-another-language/28970385#28970385, wenn SO Ihnen die Seite anzeigt. –

+0

Dieses Thema wurde zum Glück wiederhergestellt. :) –

+0

Gut. Jetzt sollten wir es offen legen (SO, wenn Sie die andere Antwort mögen, wählen Sie, um "es zu schließen"). –

1

Ja, das ist möglich, und Compiler geschrieben werden oft auf diese Weise.

Die allgemeine Idee ist es, eine „Zwischensprache“ zu schaffen, dann mehrere Einweg Übersetzer schreiben:

C#   => intermediate 
    JavaScript => intermediate 

    intermediate => C# 
    intermediate => JavaScript 

die Ausgabe von einem Einlochen, in die nächste, können Sie von einer Sprache in die andere übersetzen:

C#   => intermediate => JavaScript 
    JavaScript => intermediate => C# 

Leider wird der generierte Code wahrscheinlich nicht menschenfreundlich sein.