it-swarm-eu.dev

Warum gibt es keine automatisierten Übersetzer von einer Programmiersprache in eine andere?

Die meisten Programmiersprachen sind Turing vollständig, was bedeutet, dass jede Aufgabe, die in einer Sprache gelöst werden kann, in einer anderen oder sogar auf einer Turing-Maschine gelöst werden kann. Warum gibt es dann keine automatischen Übersetzer, die Programme aus einer bestimmten Sprache in eine andere Sprache konvertieren können? Ich habe einige Versuche für zwei Sprachen gesehen, aber sie funktionieren immer nur mit einer begrenzten Teilmenge einer Sprache und können kaum zum Konvertieren realer Projekte verwendet werden.

Ist es zumindest theoretisch möglich, einen 100% korrekten Übersetzer zwischen allen Sprachen zu schreiben? Was sind die Herausforderungen in der Praxis? Gibt es bereits Übersetzer, die funktionieren?

37
serg

Das größte Problem ist nicht die eigentliche Übersetzung des Programmcodes, sondern die Portierung der Plattform-API.

Betrachten Sie einen Übersetzer von PHP nach Java. Die einzige Möglichkeit, dies zu tun, ohne einen Teil der PHP - Binärdatei einzubetten, besteht darin, alle PHP-Module und APIs in Java erneut zu implementieren. Dies beinhaltet die Implementierung von über 10.000 Funktionen. Im Vergleich dazu ist die eigentliche Übersetzung der Syntax kinderleicht. Und selbst nach all dieser Arbeit hätten Sie keinen Java - Code, sondern eine Art Monstrosität, die zufällig auf der Java - Plattform ausgeführt wird, die jedoch wie PHP aufgebaut ist das Innere.

Aus diesem Grund geht es nur darum, Code zu übersetzen, um ihn bereitzustellen, und nicht, um ihn anschließend zu warten. Googles GWT "kompiliert" Java zu JavaScript. Facebooks HipHop kompiliert PHP in C.

32
Joeri Sebrechts

Wenn Sie ein Zwischenformat haben, können Sie etwas implementieren, das ein Programm in Sprache X übersetzt bis dieses Format und auch von dieses Format in Sprache Y. Implementieren Sie diese Konvertierungen für alle Sprachen, die Sie interessieren, und Sie sind fertig, oder?

Weißt du was? Ein solches Format gibt es bereits: Assembly. Der Compiler führt bereits die Konvertierung von "Sprache X in Assembly" durch und zerlegt die Konvertierung in "Assembly in Sprache Y".

Nun, Assembly ist keine so gute Sprache für die umgekehrte Konvertierung, aber MSIL ist eigentlich nicht so schlecht. Download Reflector und Sie werden sehen, dass es Optionen gibt, um eine .NET-Assembly in eine Reihe verschiedener Sprachen zu zerlegen (und Plugins bieten noch mehr). Es ist also durchaus möglich, ein Programm in C # zu nehmen, es zu einem DLL (dh MSIL)) zu kompilieren und es dann mithilfe des Reflektors in VB, C++/CLI, F # und ein Ganzes zu zerlegen Natürlich funktionieren auch alle anderen Konvertierungsarbeiten. Nehmen Sie eine F # -Datei, kompilieren Sie sie in eine DLL und konvertieren Sie sie mit Reflector in C #.

Natürlich sind die zwei großen Probleme, die Sie finden werden:

  1. Der Code ist grundsätzlich nicht lesbar. MSIL (auch mit Debugging-Informationen) entfernt viele Informationen aus der Originalquelle, sodass die übersetzte Version keine 100% ige Wiedergabetreue aufweist (theoretisch sollte eine C # -> MSIL-> C # -Konvertierung den Originalcode zurückgeben, aber es Gewohnheit).
  2. Viele .NET-Sprachen haben ihre eigenen benutzerdefinierten Bibliotheken (z. B. die VB Laufzeitbibliothek, F # -Bibliothek usw.). Diese müssen bei der Konvertierung ebenfalls einbezogen (oder konvertiert) werden.

Es gibt wirklich nichts, um # 2 zu umgehen, aber Sie könnten wahrscheinlich mit einigen zusätzlichen Anmerkungen in der MSIL (vielleicht über Attribute) um # 1 herumkommen. Das wäre natürlich zusätzliche Arbeit.

20
Dean Harding

Ist es zumindest theoretisch möglich, einen 100% korrekten Übersetzer zwischen allen Sprachen zu schreiben? Was sind die Herausforderungen in der Praxis?

  • Eine Übersetzung von einer strukturierteren Sprache in eine weniger strukturierte Sprache, die noch vollständig ist, ist immer möglich.
    • Diese Behauptung sollte in einem rein technischen Sinne betrachtet werden: Dies bedeutet, dass das übersetzte Programm bei seiner Ausführung genau das gleiche Ergebnis liefert.
    • Über die Lesbarkeit des übersetzten Codes oder die Beibehaltung der ursprünglichen Programmstrukturen wird nichts impliziert.
  • Das Übersetzen von einer weniger strukturierten Sprache in eine stärker strukturierte Sprache ist möglich, der übersetzte Code bleibt jedoch in seiner weniger strukturierten Form erhalten.
20
rwong

Warum sollten Sie ein Programm konvertieren wollen?

Beide Sprachen, die Quell- und die Zielsprache, werden sowieso zu (virtuellem) Maschinencode kompiliert *, sodass aus technischen Gründen kein Compiler für eine andere Hochsprache erforderlich ist.

Sprachen sind für Menschen. Die implizite Anforderung Ihrer Frage lautet also: 'Warum gibt es keinen Übersetzer, der lesbaren Code generiert?' und die Antwort wäre (imho): denn wenn es zwei Sprachen gibt, die ausreichend unterschiedlich sind, unterscheidet sich die Art und Weise, wie 'lesbarer Code' geschrieben wird, in einer Weise, die nicht nur die Übersetzung der Algorithmen erfordert, sondern auch unterschiedliche Algorithmen verwendet.

Vergleichen Sie beispielsweise eine typische Iteration in C und eine in LISP. Oder Pythons "One Best Way" mit idiomatischem Ruby.

Hier treten die gleichen Probleme auf, die Sie in echten Sprachen haben, wie wenn Sie "Es regnet Katzen und Hunde" in etwas mit der Bedeutung "Es gießt wie aus Eimern" übersetzen, wenn Sie vom Englischen ins Deutsche übersetzen, das können Sie nicht übersetze Wort für Wort mehr, aber du musst nach der Bedeutung suchen.

Und 'Bedeutung' ist kein leicht zu bearbeitendes Konzept.

*) Nun, es gibt Coffeescript ...

10
keppla

Es ist theoretisch möglich, aber meistens nutzlos. Fast jede Kombination von Quell- und Zielsprache ist möglich, aber in den meisten Fällen möchte niemand das Ergebnis betrachten oder verwenden.

Eine ganze Reihe von Compilern zielt auf C ab, einfach weil C-Compiler für fast jede existierende Plattform verfügbar sind (und es gibt automatische Compiler-Generatoren, mit denen Sie einen Prozessor entwerfen und automatisch einen C-Compiler generieren können, der auf Ihren neuen Prozessor abzielt). Natürlich gibt es auch eine ganze Reihe von Implementierungen, die auf die Sprachen abzielen, die von verschiedenen virtuellen Maschinen wie .NET, JVM, C-- und LLVM verwendet werden.

Der entscheidende Punkt ist jedoch, dass es wirklich nur dann nützlich ist, wenn Sie das Ziel im Grunde genommen als Assemblersprache behandeln, die nur als Schritt im Kompilierungsprozess verwendet wird. Insbesondere möchten Sie im Allgemeinen nicht, dass ein normaler Programmierer dieses Ergebnis liest oder damit arbeitet. es wird normalerweise nicht sehr lesbar sein.

6
Jerry Coffin

FWIW, es gibt einen Übersetzer von Java nach D. Er heißt TioPort und wurde bei einem ziemlich ernsthaften Versuch verwendet, SWT nach D zu portieren. Das Hauptproblem, auf das er gestoßen ist war, dass es notwendig gewesen wäre, massive Teile der Java Standardbibliothek) zu portieren.

5
dsimcha

Obwohl es sich nicht um eine Codeübersetzung an sich handelt, zeigt das Konzept von Sprachwerkbänke , wie etwas implementiert werden kann, das einem 100% korrekten Übersetzer zwischen allen Sprachen ähnelt.

In unserem aktuellen Ansatz wird der Quellcode in einem Textformat gespeichert. Während der Kompilierung werden diese für Menschen lesbaren Textdateien in eine abstrakte Syntaxbaumdarstellung analysiert, die wiederum zum Generieren von Bytecode oder Maschinencode verwendet wird. Diese abstrakte Darstellung ist jedoch temporär und für den Compiler intern.

Beim Ansatz der Sprachworkbench ist eine ähnliche abstrakte Syntaxbaumdarstellung das permanente, gespeicherte Artefakt. Basierend auf dieser abstrakten Darstellung werden sowohl der Maschinencode als auch der textuelle Quellcode generiert. Eine der Konsequenzen einer solchen Methode ist, dass die abstrakte Darstellung des Programms tatsächlich sprachunabhängig ist und zum Generieren von Textcode in jeder implementierten Sprache verwendet werden kann. Dies bedeutet, dass eine Person frei an verschiedenen Aspekten des Systems arbeiten kann, indem sie die Sprache verwendet, die sie für am besten geeignet hält, oder dass jedes Mitglied des Teams an dem gemeinsam genutzten Projekt in der Sprache arbeiten kann, mit der es am besten vertraut ist.

Soweit ich weiß, ist die Technologie noch weit davon entfernt, in der Mainstream-Entwicklung verwendet zu werden, es gibt jedoch mehrere Gruppen, die unabhängig voneinander daran arbeiten. Es ist schwer zu sagen, ob einer von ihnen seine Versprechen einhalten wird, aber es wäre interessant zu sehen, dass dies geschieht.

4
scrwtp

Es gibt sind einige automatische Übersetzer. Wenn Ihr Ziel darin besteht, kompilierbaren Code anstelle von lesbarem Code zu erstellen, ist dies durchaus möglich und gelegentlich nützlich, nur nicht sehr oft. Bekanntlich war der erste C++ - Compiler eigentlich kein Compiler, sondern übersetzte C++ in eine (wirklich komplizierte) C-Quelle, die dann vom C-Compiler kompiliert wurde. Viele Compiler können auf Anfrage Assembly-Code generieren. Anstatt jedoch Assembly-Text auszuspucken und ihn dann in Maschinencode zu übersetzen, können sie normalerweise direkt Maschinencode generieren.

Bei einer vollständigen Spezifikation von Sprache A ist es im Prinzip nicht so schwer, ein Programm zu schreiben, das seine Anweisungen in einer Sprache B ausdrückt. Normalerweise wählt jedoch jeder, der sich die Mühe macht, eine wirklich niedrige Stufe für "Sprache B": Maschinencode , oder heutzutage Bytecode: Jython ist eine Implementierung von python, die Java Bytecode generiert, der vom Java) interpretiert wird = VM. Keine Notwendigkeit zum Schreiben und Kompilieren Java Klassenhierarchien!

4
alexis

Dies geschieht ständig.

Jeder Compiler übersetzt die "Primärsprache" wie C++ in die native Assemblersprache des Computers oder den architekturunabhängigen Bytecode bei interpretierten Sprachen.

Ich kann mir vorstellen, dass Sie nicht darüber sprechen. Sie möchten wahrscheinlich einen Übersetzer, der C++ in etwas wie Java oder Python) konvertiert. Worum geht es jedoch? Im besten Fall hat das Endergebnis genau die gleiche Effizienz wie die ursprüngliche Quelle. ( Praktisch wird es viel schlimmer sein.)

Wenn Sie nur möchten, dass Code übersetzt wird, damit Sie ihn als eine Sprache lesen können, die Sie verstehen, hat ein solcher Übersetzer das Gegenteil des gewünschten Effekts. Sie werden mit einer Menge kryptischen, nicht intuitiven und unlesbaren Codes zurückbleiben.

Dies liegt daran, dass nur die trivialsten Dinge direkt von einer Sprache in eine andere übersetzt werden. Was in einer Sprache einfach ist, erfordert häufig umfangreiche Bibliotheken für eine andere - oder ist möglicherweise überhaupt nicht möglich. Deshalb:

  1. Wenn das Programm trivial ist, erhalten Sie möglicherweise ein anständiges Ergebnis. Aber wenn es so einfach ist, was bringt es dann überhaupt, es durch einen Übersetzer zu führen?
  2. Wenn das Programm nicht trivial ist, ist der Code von geringer Qualität.

Am Ende die einzige Möglichkeit, guten Code zu schreiben, besteht darin, ihn tatsächlich zu schreiben. Computer können Menschen in Fragen der Lesbarkeit, der Best Practices und der eleganten Lösungen einfach nicht - zumindest noch nicht - mit Menschen vergleichen.

Kurz gesagt, es lohnt sich einfach nicht.

3
Maxpm

Es gibt keine Sprachübersetzer für Programmiersprachen, da Programmiersprachen unglaublich komplex sind. Während es hypothetisch möglich ist, gibt es viele Herausforderungen.

Die erste Herausforderung besteht lediglich in den akzeptablen Praktiken der Sprache. Das Konvertieren zwischen zwei objektorientierten Sprachen wie Java und C++ ist unglaublich komplex und beide basieren auf C). Das Übersetzerprogramm müsste die Standardbibliotheken für beide Sprachen perfekt kennen und in der Lage sein Kennen Sie die Unterschiede im Verhalten. Sie müssten ein umfangreiches Wörterbuch erstellen, und selbst dann würden die Unterschiede in den Programmierstilen von Programmierer zu Programmierer bedeuten, dass Sie raten müssten, wie einige Änderungen vorgenommen werden sollen.

Sobald Sie die Syntaxübersetzung festgelegt haben, müssen Sie herausfinden, wie Sie ein Konstrukt in der ersten Sprache in ein Konstrukt in der zweiten Sprache konvertieren. Dies ist in Ordnung, wenn Sie ein Objekt in C++ zu einem Objekt in Java (das ist vergleichsweise einfach)) verschieben, aber was machen Sie mit Ihren C++ - Strukturen oder den Funktionen außerhalb der C++ - Klassen Die Entscheidung, wie damit umgegangen werden soll, kann schwierig sein, da dies zu einem anderen Problem führen kann, nämlich der Erstellung eines Blob-Objekts. Der Blob ist ein Antimuster, das häufig genug ist.

Dies ist keine vollständige Liste der Probleme, aber das sind nur zwei und sie sind groß. Einer meiner Professoren erwähnte, dass jemand seinen Arbeitgeber davon überzeugt habe, dass er in den 80er Jahren einen von Maschinencode zu C machen könne, aber das hat damals nicht funktioniert. Ich bezweifle, dass es jemals eine geben wird, die voll funktioniert.

1
indyK1ng

Beim Kompilieren geht es darum, etwas Nützliches für den Computer zu erhalten. dh etwas, das laufen kann. Warum zu etwas kompilieren, das möglicherweise sogar höher ist als das, in dem Sie es geschrieben haben?

Mir gefällt die Strategie von .NET besser. Kompilieren Sie alles in einer gemeinsamen Sprache. Dies bietet den Vorteil, dass die Sprachen kommunizieren können, ohne (N ^ 2) -N sprachübergreifende Compiler erstellen zu müssen.

Wenn Sie beispielsweise 10 Programmiersprachen hätten, müssten Sie nur 10 Compiler unter dem .NET-Modell schreiben, und alle könnten miteinander kommunizieren. Wenn Sie alle möglichen sprachübergreifenden Compiler erstellt hätten, müssten Sie 90 Compiler schreiben. Das ist viel zusätzliche Arbeit für wenig Nutzen.

1
mike30