An paar Anmerkungen: Es ist Mythos, dass fehlende statische Typen zwangsläufig langsamere Programme ergeben. Da gibt es ein Paper aus dem Self-Projekt so ca. 1995, das ich aber zu faul bin, jetzt herauszusuchen, welches das Gegenteil zeigt. Dynamisch typisierte Sprachen sind in der Regel langsamer, weil sie ausdrucksstärker als ihre statisch kompilierenden Brüder sind. So bieten die meisten z.B. korrekte Artithmetik ohne Überlauf ins negative, eine automatische Speicherverwaltung oder ein Modell, wo jeder Datentyp gleichartig (als Objekt) behandelt wird. Mehr Features drücken da natürlich auf die mögliche Maximalgeschwindigkeit.
Ein Python-Programm in ein äquivalentes C-Programm zu übersetzen erfordert letztlich, dass in diesem C-Programm ein kompletter Python-Interpreter vorhanden ist, denn z.B. der exec-Befehl müsste ja funktionieren. Man will also in jedem Fall ein Subset von Python in C übersetzen.
Der andere Ansatz wäre, mit dem semantischen Modell von C zu beginnen, dies in eine Python-Syntax einzupacken und dann zu schauen, welche Features, die C nicht bietet aber Python jetzt noch "billig" hinzuzufügen wären.
Der Autor von Galcon ist auch Autor von tinypy und hat dafür einen Python nach C++ Übersetzer gebaut, damit er Spiele wie Galcon (was AFAIK einen Python-Teil hat oder sogar ganz in Python geschrieben ist) in C++ übersetzen und so einfacher für's iPhone entwickeln kann. So weit ich weiß, ist die Calcon-Version für's iPhone dann aber doch direkt in C++ und/oder Objective-C++ geschrieben worden.
Tinypy könnte aber vielleicht auch so schon für embedded Systeme geeignet sein. Aber auch hier gilt: Das ist kein Python gemäß der von GvR erstellten Spezifikation, sondern etwas, das eine ähnliche Syntax hat und mehr oder weniger nahe bei Python gelegen hat.
Ich hatte man angefangen, einen Übersetzer für ein mit Python-Syntax geschriebenes Java-Programm nach Java zu bauen:
http://github.com/sma/dython Damit das funktioniert, braucht man jedoch einen guten Typ-Inferenzer und dazu war ich im May nicht motiviert genug. Statt Java könnte man aber genauso gut auch C-Code erzeugen, müsste dann noch einen GC dazu tun (boehmgc) und ein bisschen Laufzeitbibliothek entwickeln. Ich wollte ja einfach dem Duby^W Mirah-Ansatz folgen und ausschließlich das Laufzeitsystem der Zielsprache einsetzen.
Ich würde übrigens so weit gehen und sagen, JavaScript (ECMAScript 5) kann man prinzipiell schneller ausführen als Python, weil es weniger flexibel ist und weniger Konzepte der Implementierung durchscheinen. Als Beleg würde ich die belang mäßigen (um nicht zu sagen enttäuschenden) Erfolge des Unladen Swallow-Projekts anführen gegenüber dem V8-Projekt und das, obwohl die wirklich wussten, was sie tun und alle State-of-the-Art-Techniken kannten.
Des weiteren würde ich eine Lanze für JavaScript brechen wollen und sagen, dass ich die Sprache nett finde und nur empfehlen kann, Vorurteile abzulegen und sich näher damit zu beschäftigen. Immerhin ist es die am weitesten verbreitetste Sprache und sie wird uns noch viele Jahre erhalten bleiben.
Besser als Lisp (was ich als CommonLisp lesen würde) ist IMHO Scheme, was Reinheit und Klarheit der Konzepte angeht. Diese findet man (bis auf Continuations) auch in JavaScript wieder. Dazu kommt das Objektkonzept von Self, welches sich aus Smalltalk weiterentwickelt hat. Objective-C ist übrigens der Versuch, das Objektmodell von Smalltalk über C zu stülpen. War so eine "das kann doch nicht so schwer sein Idee" von Brad Cox, der 1986 Smalltalk sah, aber lieber C machen wollte und die Idee von Software-Komponenten verfolgte. Der größte Fehler war, die Blöcke zu ignorieren. Kaum 25 Jahre später hat Apple ihn dann korrigiert und eigenmächtig in ihre Version von C, C++ und Objective-C das Konzept von Blöcken integriert. Die selben Blöcke von Smalltalk (traditionell keine Closures wie bei Scheme) machen Ruby übrigens zu einer der mächtigsten Sprachen, was DSLs angeht.
Wo war ich? JavaScript! Ich denke, wo heutzutage C der portable Assembler (wer nicht muss, nutzt diese primitive Sprache doch hoffentlich nicht mehr freiwillig einfach nur so) wird in Zukunft JavaScript im Web-Umfeld diese Rolle übernehmen. 2012, wenn es nach Brendan Eich geht, kommt die nächste EcmaScript-Version, die ein paar weitere Probleme von JS beseitigt, etwa die standardmäßig globalen Variablen oder das Fehlen eines "doesNotUnderstand"-Catchalls. Wie auch immer, CoffeeScript ist ein schönes Beispiel für die JS-ist-portabler-Assembler-für-andere-Sprachen Ansatz.
Lua wäre übrigens anstelle von Python eine IMHO sehr schöne Alternative, wenn es um embedded Systems geht. Gibt es auch einen recht fixen JIT dafür.
Übrigens, Closures sind alles, was man braucht, um Objekte zu realisieren. Daher kann man in Scheme so schön als Fingerübung ein OO-System bauen. Andersherum ginge es auch, ist aber deutlich anstrengender. Wer den Schmerz fühlt, den man hat, wenn man in Java funktional programmieren will, weiß, was ich meine.
Und wer mal "verrückte" (im Sinne von genial) funktionale Programmierung in JavaScript sehen will, schaue sich (fab) (die Klammern gehören zum Produktnamen) (
http://github.com/jed/fab) an, ein funktionales Webrahmenwerk für JavaScript.
Noch was: Wer Io mag (und damit eigentlich auch Self mögen müsste) schaue sich mal Ola Binis Ioke an. Das ist eine ziemlich interessante (experimentelle) Weiterentwicklung an.
Stefan