cracki hat geschrieben:mit skin meine ich wie der code aussieht. mit AST meine ich die semantik des codes. der gleiche code kann in php so aussehen, in js anders und in python wieder ganz anders. so verstaendlich?
Das funktioniert aber nicht wirklich, weil eine Sprache nicht nur aus Syntax, sondern eben auch aus Semantik besteht. Und die lässt sich bei unterschiedlichen Sprachen vielleicht noch in einen gemeinsamen Bytecode übersetzen, aber die Rücktransformierung in eine andere Sprache ist nicht immer möglich.
Wie übersetzt man zum Beispiel Bytecode oder AST mit dynamischem Scope (REXX oder Perl) in eine Sprache die nur lexikografischen Scope kennt, wie Python oder Java.
muss noch was loswerden. wenn man in einer sprache ausdruecken koennte, dass die argumente vor dem call nicht evaluiert werden sollen, sondern als callable oder AST, dann koennte man sowas machen:
Code: Alles auswählen
# macro() nimmt ne funktion, macht ein macro draus
while = macro( (condition, block) {
loop = {
if (condition()) {
block()
loop()
}
}
loop()
})
a = 0
while(a < 10,
print a**2
a += 1
)
das bringt natuerlich wieder ganz andere probleme mit sich (bloecke muessten dann expressions sein, usw), ich weiss. waere aber ne ueberlegung wert, hm?
Solche Sprachen gibt's. Neben der Übergabe von Codeblöcken die erst in der aufgerufenen Funktion ausgewertet werden, kann man das auch per Metaprogrammierung lösen, also wirklich ein Makro das bei der Übersetzung ausgeführt und ersetzt wird. Mit Lisp oder Scheme kann man so etwas machen. Und bei D mit Templates oder dem ``lazy`` Schlüsselwort bei in der Argumentliste. Bei Nemerle ginge eine Makrolösung. Und in Io sieht die `while`-Schleife fast genau so aus. Io hat unheimlich wenige Schlüsselworte, alle Flusskontrollstukturen sind Methoden, die auf dem "Ur-Objekt" definiert sind. Hier ist die `while`-Schleife selbst implementiert:
Code: Alles auswählen
myWhile := method(
loop(
call evalArgAt(0) ifFalse(break)
call evalArgAt(1)
)
)
a := 0
myWhile(a < 10,
a pow(2) linePrint
a = a + 1
)
Jetzt möchte ich mal sehen wie das in einen AST übersetzt und dann in Python "rückübersetzt" aussehen soll!?