Sprachen in andere Sprachen übersetzen

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Hallo, ich frag mich gerade, inwieweit es möglich ist, eine Sprache in eine andere zu übersetzen.
Zum Beispiel einen C-Code in Python oder andersrum.
Ich hab hier auch letztens von RPython gelesen, habe aber eigentlich keine Ahnung davon. Aber so weit ich das verstanden habe, kann man eine kleine Untermenge von Pythoncode in C übersetzen?
Oder hab ich das jetzt falsch verstanden?
Ist es nicht _theoretisch_ möglich, jede Sprache in jede beliebige andere Sprache zu übersetzen?
Wenn ich jetzt C-Code in Python Code übersetzen wollen würde, würde ich einfach jeder Anweisung eine Pythonanweisung zuordnen und das ganze dann abarbeiten. Ist sowas grundlegend nicht möglich oder einfach viel zu aufwändig, oder warum wird sowas nicht gemacht?
Umgekehrt, also von Python nach C (was vermutlich um einiges komplexer wäre) wäre doch sehr sinnvoll, da man die Programme dann in C übersetzen könnte und anschließend kompilieren könnte. Dass es dann nicht das Maximum an effizienz hat, ist klar ;)
Also was ist von der Idee zu halten? Ich denke mir, dass ich sicher nicht der erste bin, der an sowas denkt, also wird es wohl sehr komplex sein. Ich hab aber keine Ahnung von theoretischer Informatik, nur ein wenig von Praktischer (=Programmierkenntnisse usw).
Ich würde nur gerne von euch wissen, _warum_ das ganze nicht so sinnvoll/möglich ist :)
Mein 2. Vorschlag lehnt sich an die natürlichen Sprachen an:
Ich habe mal gehört, dass manche Übersetzerprogramme eine einfache Sprache wie zum Beispiel Esperanto (eine entwickelte Sprache mit einheitlicher Grammatik, ohne Ausnahmen usw konzepiert, um so einfach wie möglich zu sein) als "Zwischensprache" benutzen und alles zuerst auf diese Sprache übersetzen und auf dieser Basis dann die Texte in andere Sprachen zu übersetzen.
Vielleicht wäre ja sowas mit Programmiersprachen möglich. Eine Sprache auf ein einfaches Modell zu reduzieren, in dem die Anweisungen stehen und auf dieser Basis dann in andere Sprachen zu übersetzen.
Wenn ihr ein paar gute Stichwörter und/oder Links dazu habt, wäre ich auch dankbar ;)
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Karl hat geschrieben:Ist es nicht _theoretisch_ möglich, jede Sprache in jede beliebige andere Sprache zu übersetzen?
Ja.
Wenn ich jetzt C-Code in Python Code übersetzen wollen würde, würde ich einfach jeder Anweisung eine Pythonanweisung zuordnen und das ganze dann abarbeiten. Ist sowas grundlegend nicht möglich oder einfach viel zu aufwändig, oder warum wird sowas nicht gemacht?
Weil C 1:1 nach Python zu übersetzen einfach nicht sonderlich schnell wäre. Und in C will auch keiner Scripten.
Umgekehrt, also von Python nach C (was vermutlich um einiges komplexer wäre) wäre doch sehr sinnvoll, da man die Programme dann in C übersetzen könnte und anschließend kompilieren könnte. Dass es dann nicht das Maximum an effizienz hat, ist klar ;)
Würdest du nicht. Wenn du ein Python Programm ein eine Reihe von Python API calls übersetzt wirds genau gleich schnell sein, musst es halt vorher noch kompilieren. Die Dynamic von Python bekommst du nicht weg (das geht nur in RPython) also würde eine "Compilation nach C" nix anderes sein als das was der Python-eval Loop mit dem Bytecode macht.
TUFKAB – the user formerly known as blackbird
BlackJack

@Karl: C nach Python gibt's nicht, weil wohl noch niemand so viel Langeweile hatte C so zu verlangsamen. ;-)

Ausserdem könnte das mit Pointern und Pointer-Arithmethik in Python schwer werden, so dass letztendlich so etwas wie ein C-Interpreter dabei heraus käme. Neben der Sprache C müsste man auch noch die Standardbibliothek von C berücksichtigen.

In die andere Richtung gibt's Pyrex und Cython. Beide decken Python nicht ganz ab, aber es sieht so aus, als wenn Cython auf dem Weg dahin ist. Vorteil ist da aber erst einmal nur, dass man sich die Interpreter-Schleife spart, weil die Bytecodes durch Aufrufe der entsprechenden C-API-Funktionen ersetzt wurden. Der Geschwindigkeitsgewinn ist aber minimal und wird durch das explizite Kompilieren erkauft.

Das Problem bei der Idee mit der einfachen Zwischensprache ist, dass man zwar leicht komplexere Sprachen in so eine Zwischensprache übersetzen kann, aber der umgekehrte Weg nicht mehr so einfach ist. Bei Übersetzern von einer Hochsprache in eine Andere kommt deshalb in der Regel kein idiomatischer Quelltext bei rum. Normalerweise nicht einmal etwas was geeignet ist, um von einem Menschen gelesen und verstanden zu werden.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Karl hat geschrieben:Ich habe mal gehört, dass manche Übersetzerprogramme eine einfache Sprache wie zum Beispiel Esperanto (eine entwickelte Sprache mit einheitlicher Grammatik, ohne Ausnahmen usw konzepiert, um so einfach wie möglich zu sein) als "Zwischensprache" benutzen und alles zuerst auf diese Sprache übersetzen und auf dieser Basis dann die Texte in andere Sprachen zu übersetzen.
Vielleicht wäre ja sowas mit Programmiersprachen möglich. Eine Sprache auf ein einfaches Modell zu reduzieren, in dem die Anweisungen stehen und auf dieser Basis dann in andere Sprachen zu übersetzen.
Wenn ihr ein paar gute Stichwörter und/oder Links dazu habt, wäre ich auch dankbar ;)
Das was du meinst ist schon seit Jahren im Compilerbau so praktiziert, nennt sich Intermediate Language, die werden von den meisten Compilern verwendet. Wenn du den GCC verwendest dann wandelt er deine C-Programme (und auch die anderen Sprachen die er so unterstützt) in seine eigenen Zwischensprachen (unter anderem eben GIMPLE und GENERIC) um, weil die Umwandlung in die "Endsprache" dann nur 1:n Kombinationen bietet (1 Zwischensprache zu n Endsprachen) statt m:n (m Frontendsprachen zu n Endsprachen).
Wenn man etwas hoher gehen will ist dies auch möglich. Etwa Java Bytecode, CIL oder Python-Bytecode, die dann vom Interpreter ausgeführt werden. Aber es ist kein besonders großes Problem andere Sprachen wie Python in Java Bytecode (Jython) oder CIL (IronPython) zu konvertieren. Natürlich programmiert keiner direkt in Java Bytecode - wobei das mittels Assembler nicht einmal so problematisch ist.
Wir können aber auch eine Stufe höher gehen, Neko ist sowohl die Sprache in der man programmieren kann als auch als Zwischensprache zur Ausführung gedacht, die von der NekoVM verarbeitet wird. Viele Scheme-Compiler (Gambit, Bigloo und Chicken) generieren C-Code, der dann vom C-Compiler dann wieder kompiliert wird.

Was eine Zwischensprache ist, ist etwas Definitionssache; aber ich hoffe es kam rüber dass das oft genau so gemacht wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Okay danke für die Antworten ich glaube ich habe das Thema jetzt besser verstanden ;)
Also ist C zum Beispiel eine häufig genutzte Zwischensprache?
Dass bei HochspracheA->Zwischensprache->HochspracheB kein sauberer, schöner, optimierter Code rauskommt, ist eigentlich auch klar. Vielleicht wenn's mal ne gute KI gibt :)
Und jetzt leuchtet mir auch ein, warum man nicht einfach Python Programme in C übersetzt und dann kompiliert.
Was diese ganzen Pythonprojekte angeht blick ich aber eh schon lange nicht mehr durch PyPy, CPython, RPython, JPython, ... Ahhhhh :D
BlackJack

C wird relativ oft als Zwischensprache verwendet, weil es sehr verbreitet ist, und im Grunde so etwas wie ein plattformunabhängiger Makroassembler. Eine Stufe tiefer wäre man also schon bei Assembler angelangt, aber das ist dann ja nicht portabel.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Karl hat geschrieben:Was diese ganzen Pythonprojekte angeht blick ich aber eh schon lange nicht mehr durch PyPy, CPython, RPython, JPython, ... Ahhhhh :D
Brauchst du normalerweise auch nicht. :)
Standardmäßig laufen deine Programme in der in C implementierten Python-Version, die deshalb auch CPython genannt wird.
Alles andere sind spezielle Implementationen, die nur bei Einsatz in einem bestimmten Feld (z.B. Java per Python skripten -> Jython) interessant sind.
EDIT: :)
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

mkallas hat geschrieben:
Karl hat geschrieben:Was diese ganzen Pythonprojekte angeht blick ich aber eh schon lange nicht mehr durch PyPy, CPython, RPython, JPython, ... Ahhhhh :D
Brauchst du normalerweise auch nicht. :)
Standardmäßig laufen deine Programme in der in C implementierten Python-Version, die deshalb auch CPython genannt wird.
Alles andere sind spezielle Implementationen, die nur bei Einsatz in einem bestimmten Feld (z.B. Java per Python skripten -> Jython) interessant sind.
EDIT: :)
Nice edit ^^
Naja okay, dann bin ich ja beruhigt :)
Antworten