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
Sprachen in andere Sprachen übersetzen
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Ja.Karl hat geschrieben:Ist es nicht _theoretisch_ möglich, jede Sprache in jede beliebige andere Sprache zu übersetzen?
Weil C 1:1 nach Python zu übersetzen einfach nicht sonderlich schnell wäre. Und in C will auch keiner Scripten.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?
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.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
TUFKAB – the user formerly known as blackbird
@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.
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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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).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
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
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
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
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.
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
Brauchst du normalerweise auch nicht.Karl hat geschrieben:Was diese ganzen Pythonprojekte angeht blick ich aber eh schon lange nicht mehr durch PyPy, CPython, RPython, JPython, ... Ahhhhh
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 ^^mkallas hat geschrieben:Brauchst du normalerweise auch nicht.Karl hat geschrieben:Was diese ganzen Pythonprojekte angeht blick ich aber eh schon lange nicht mehr durch PyPy, CPython, RPython, JPython, ... Ahhhhh
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:
Naja okay, dann bin ich ja beruhigt