Ich bin dabei, ein Nebenprojekt zu starten, dessen Ziel es ist, Code von einer Programmiersprache in eine andere zu übersetzen. Die Sprachen, mit denen ich anfange, sind PHP und Python (Python zu PHP sollte am Anfang einfacher sein), aber idealerweise wäre ich in der Lage, andere Sprachen mit (relativer) Leichtigkeit hinzuzufügen. Der Plan ist:
-
Dies ist auf die Webentwicklung ausgerichtet. Der ursprüngliche und der Zielcode werden auf Frameworks aufsetzen (die ich ebenfalls schreiben muss). Diese Frameworks werden ein MVC-Entwurfsmuster verwenden und strengen Kodierungskonventionen folgen. Das sollte die Übersetzung etwas einfacher machen.
-
Ich beschäftige mich auch mit IOC und Dependency Injection, da sie den Übersetzungsprozess einfacher und weniger fehleranfällig machen könnten.
-
Ich benutze Pythons Parser-Modul die es mir ermöglicht, mit dem abstrakten Syntaxbaum zu spielen. Das, was ich mit PHP am ehesten erreichen kann, ist anscheinend token_get_all() Das ist ein Anfang.
-
Von da an kann ich die AST, die Symboltabellen und den Kontrollfluss erstellen.
Dann glaube ich, dass ich mit der Ausgabe von Code beginnen kann. Ich brauche keine perfekte Übersetzung . Ich werde den generierten Code noch überprüfen und Probleme beheben müssen. Idealerweise sollte der Übersetzer problematische Übersetzungen kennzeichnen.
Bevor Sie fragen: "Was zum Teufel soll das?" Die Antwort ist... Es wird eine interessante Lernerfahrung sein. Wenn Sie wissen, wie man das Ganze weniger entmutigend gestalten kann, lassen Sie es mich bitte wissen.
EDITAR:
Ich bin mehr daran interessiert zu wissen, welche Arten von Mustern ich dem Code aufzwingen könnte, um die Übersetzung zu erleichtern (z. B. IoC, SOA ?), als daran, wie ich die Übersetzung durchführe.
6 Stimmen
Haben Sie sich Systeme wie die .NET CLR oder Parrot von Perl6 angesehen? Sie kompilieren eine Reihe von Sprachen in eine Zwischendarstellung, die von einem gemeinsamen Interpreter ausgeführt werden kann. Wenn man von der Zwischendarstellung zurück zu einer Sprache gehen kann, hat man einen Übersetzer.
1 Stimmen
@Borealid AFAIK ist die .NET CIL (relativ) einfach zu kompilieren in aber viel Glück dabei, lesbaren Code zurückzubekommen. Ich schaue mir jetzt Parrot an.
0 Stimmen
Es gibt ähnliche Projekte für andere Sprachen; ich bin nicht sicher, wie reich deren Autoren sind. Und ich schränke mich hier tatsächlich sehr ein, indem ich ein Gerüst brauche und mich an strenge Programmierkonventionen halte.
2 Stimmen
Ich kann kein spezifisches Wissen beisteuern, aber haben Sie sich Pyjamas angesehen ( pyjs.org ), insbesondere translator.py? Dies ist ein Python zu Javascript Compiler.
0 Stimmen
@stephan Ich liebe den Namen (Pyjama). Danke für den Link. Ich glaube, Python hat es dank des Parser-Moduls wirklich einfach gemacht, diese Übersetzungen zu machen. Deshalb gibt es auch einen Python-zu-Perl-Übersetzer, aber nicht andersherum.
0 Stimmen
Werfen Sie einen Blick auf phpqatools.org für einige Tools, die eine AST- und Opcode-basierte Analyse von PHP-Code ermöglichen.
0 Stimmen
@NullUserException Als Antwort auf "AFAIK ist die .NET CIL (relativ) einfach zu kompilieren, aber viel Glück dabei, lesbaren Code daraus zu erhalten." Nun, das ist genau das, was Reflector tut!
0 Stimmen
@NullUserException Reflector leistet in der Tat perfekte Arbeit. Denken Sie immer an pdbs :)
3 Stimmen
Re EDIT: Wenn Sie die Kontrolle über den zu übersetzenden Code haben, ist es am naheliegendsten, schwer zu übersetzende Konstrukte zu vermeiden! C lässt sich zum Beispiel viel leichter nach Java übersetzen, wenn es keine Zeigerarithmetik gibt. Bei Python würde ich mich wahrscheinlich von Closures fernhalten. Eine andere Möglichkeit ist, den Quellcode so zu schreiben, dass schwierig zu übersetzende Teile immer idiomatisch kodiert sind, so dass sie leichter zu erkennen sind und Sonderfälle besser behandelt werden können.
0 Stimmen
Ich kann hier keine Frage finden.
0 Stimmen
Ein Llvm-Frontend schreiben