JS/Python -ein rudimentärer Python-Interpreter in JavaScript

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
flosch
User
Beiträge: 4
Registriert: Mittwoch 10. Mai 2006, 18:50

Hallo,

ich möchte euch kurz meine letzte, kleine Entwicklung JS/Python vorstellen:

http://dl.dropbox.com/u/92987/jspy/index.html

(Link mit weiteren Diskussionen auf reddit: http://www.reddit.com/r/Python/comments ... preter_in/)

Zuvor ein Disclaimer: Das Projekt verfolgte bislang kein ernsthaftes Ziel; es war für mich hauptsächlich ein just for fun und Übungsprojekt - vor allem interessierte mich, ob und wie gut sich mein Vorhaben realisieren ließe. Die Frage nach dem "wieso?" erübrigt sich daher. :-)

Zu dem Projekt:

Wie der Titel schon sagt, handelt es sich bei JS/Python um einen Python-Interpreter - vollständig in JavaScript geschrieben. Er implementiert nicht, wie z. B. skulpt, die Sprache an sich (Syntax, etc. - enthält daher auch keinen Lexer und Parser), sondern interpretiert kompilierten Python-Bytecode und führt diesen aus. Nachdem ich einige grundlegenden Datentypen (Strings, Booleans, Integers) und Operationen implementiert hatte, ließen sich schon einige kleine Anwendungen (siehe meine beispielhafte Programmauswahl auf der Projektseite) ausführen. JS/Python mangelt es jedoch noch an allen Ecken und Kanten; so sind einige Datentypen (longs, floats) oder auch einige Operanden noch nicht vollständig implementiert. Das werde ich im Laufe der Zeit nachholen.

Über ein kleines Modulsystem in JS/Python können Packages/Module (builtins oder auch zB. time, math, etc.) integriert und über das Python-Programm aufgerufen werden. Besonders interessant hierbei ist die Integration und Interaktion mit dem Browser und den dort zur Verfügung stehenden Mitteln (Cookies, Sockets, etc.).

So habe ich ein kleines Modul "webby" Python-Programmen zur Verfügung gestellt, das ein paar einfache Interaktionen mit dem User ermöglicht (JavaScript ausführen, Meldungen ausgeben (alert), Eingaben anfordern (prompt), Fragen stellen (confirm)..) sowie ein kleines Modul geschrieben ("webstorage"), das HTML5s Web Storage API Python-Programmen bereitstellt. Beispiele für die Nutzung könnt ihr auf der Projektseite unter "JS from Python" und "Storage" euch anschauen. Den jeweiligen Programmquellcode (.py) findet ihr dazu passend zum Download.

Die Modulimplementationen könnt ihr euch hier anschauen: http://dl.dropbox.com/u/92987/jspy/modules.js

Wer einen GitHub-Account hat, kann gerne (dem frisch angelegten und daher noch leeren Repository) folgen: https://github.com/flosch/jspy. Mit der Zeit werde ich es füllen.

Ich freue mich auf euer Feedback oder eure Rückfragen.

Viele Grüße
flosch

Edit: GitHub-Repository ergänzt.
Zuletzt geändert von flosch am Sonntag 19. Juni 2011, 16:18, insgesamt 1-mal geändert.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Spannend. Noch findet sich auf Github nur eine vor 2 minuten leer angelegte README-Datei, ich glaube, ich bin da zu schnell :)

Ich hatte mal einen Python-Bytecode-Interpreter in Python (ebenfalls nur so just for fun) geschrieben. Auf einen Blick in den C-Quelltext habe ich dabei verzichtet und eigentlich nur das "dis"-Modul von Python benutzt, um zu sehen, wie was übersetzt wird. Ich meine, darüber hatte ich hier auch irgendwann mal "gebloggt".

Implementierst du die komplette Semantik von Python mit allen "__"-Methoden, zum Beispiel bei den mathematischen Operationen? Das empfand ich als ziemlich aufwendig. Wie hast du Generator-Funktionen implementiert? Ich wollte das durch einen "stackless"-Interpreter lösen, doch dabei hat sich dann regelmäßig mein Hirn verknotet und ich habe letztlich an dieser Stelle aufgegeben.

Stefan
flosch
User
Beiträge: 4
Registriert: Mittwoch 10. Mai 2006, 18:50

sma hat geschrieben:Spannend. Noch findet sich auf Github nur eine vor 2 minuten leer angelegte README-Datei, ich glaube, ich bin da zu schnell :)
Jup, da warst du in der tat ziemlich flott. :) Ich werde auf GitHub zunächst insbesondere nur die JavaScript-Dateien zur Erweiterung von JS/Python online stellen; also insbesondere modules.js. Den Interpreter an sich werde ich erst später online stellen, wenn ich ihn ausreichend von Fehlern bereinigt, nachvollziehbar für andere kommentiert und ausreichend implementiert habe. In der Zwischenzeit kann aber gerne an der Erweiterung durch Module/Packages etc. gewerkelt werden. :)
sma hat geschrieben: Ich hatte mal einen Python-Bytecode-Interpreter in Python (ebenfalls nur so just for fun) geschrieben. Auf einen Blick in den C-Quelltext habe ich dabei verzichtet und eigentlich nur das "dis"-Modul von Python benutzt, um zu sehen, wie was übersetzt wird. Ich meine, darüber hatte ich hier auch irgendwann mal "gebloggt".
[/blog]

Da der Bytecode nicht sonderlich gut dokumentiert ist (und ich daher auch viel im C-Code verbringe), wäre ich an deinem Blogeintrag interessiert. Hast du da noch eine Adresse oder hast du andere interessante Seiten, die sich dem Thema widmen?
sma hat geschrieben: Implementierst du die komplette Semantik von Python mit allen "__"-Methoden, zum Beispiel bei den mathematischen Operationen? Das empfand ich als ziemlich aufwendig. Wie hast du Generator-Funktionen implementiert? Ich wollte das durch einen "stackless"-Interpreter lösen, doch dabei hat sich dann regelmäßig mein Hirn verknotet und ich habe letztlich an dieser Stelle aufgegeben.
Welche "__"-Methoden bei mathematischen Operationen meinst du (meinst du z. B. __mul__ vom integer object für's Multiplizieren?)? Bislang habe ich da noch nichts implementiert; das haben die Operanden übernommen (z. B. BINARY_MULTIPLY). Ich versuche mich auch möglichst im Interpreter auf den Core zu konzentrieren und die Operands zu implementieren; alles andere (builtins, objects etc.) sollten später, natürlich nur wenn möglich, von "außerhalb" in den Interpreter geladen werden können (so wie ich es mit den Modulen aus modules.js bereits mache).

Um Generator-Funktionen habe ich mir auch noch keine großen Gedanken gemacht; das muss ich noch (wenngleich es schon eine sehr kleine Implementation gibt; aber das muss sicher noch verfeinert werden. Für den Ausdruck range(my_list) z. B. erzeugt Python die Operanden GET_ITER und FOR_ITER; bei GET_ITER erzeuge ich ein eigenes JSPyIter, das auch eine next()-Methode enthält. Bei jedem FOR_ITER wird next() aufgerufen und ein Pointer um 1 inkrementiert. Wenn ich das richtige sehe, haben Generator-Funktionen nur noch einen zusätzlichen Operanden YIELD_VALUE - vom Verhalten/Benutzung aber ansonsten ja ähnlich zu solchen Iterationen. Mal schauen, wie man das am besten kombiniert/handled.).

Wie geschrieben, handelt es sich bislang um eine sehr abgespeckte, eher für Demonstrationszwecken geeignete Version eines Python-Interpreters. Ich werde ihn im Laufe der Zeit weiter entwickeln; vielleicht springt ja dann sogar das ein oder andere mal ein sinnvoller Anwendungszweck für den Einsatz im Netz heraus. Aber das steht nicht im Mittelpunkt. Ich halte euch hier gerne im Thread über den Fortschritt auf dem Laufenden und nehme dann auch noch einmal Stellung dazu, wie ich das ein oder andere Problem gelöst habe.

Wer einen GitHub-Account hat, kann auch gerne dem von mir vor kurzem angelegten Repository (habe ich auch nochmal im Ursprungspost verlinkt) folgen: https://github.com/flosch/jspy

Viele Grüße

Edit: Beitrag etwas ergänzt und korrigiert.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

btw. sollte man nicht mit PyPy das machen können?

@flosch: Release early, release often ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

@jens: PyPy kann z.B. JavaScript Code in Python-Code umwandeln, während JSPY den Python-Code in JavaScript Code umwandelt.
Theoretisch hat flosch eine einheitliche API zwischen Python-Code und JavaScript-Code geschaffen.

So kann man normal in Python schreiben und man lässt eine Binärdatei(*.pyc) anlegen. Diese kann man JSPY vorwerfen, diese generiert daraus dann das entsprechende JavaScript.
LG Maik
flosch
User
Beiträge: 4
Registriert: Mittwoch 10. Mai 2006, 18:50

Genau, JSPY interpretiert ("evaluiert") letztlich den binären Bytecode (.pyc), also das, was CPython genauso macht, wenn man in der Kommandozeile eine .pyc-Datei übergibt ("python primes.pyc"). Einzig weggefallen ist das erzeugen dieses Bytecodes, was CPython natürlich auch kann und macht.

Ich werde in Kürze den Source online stellen und die Weboberfläche um HTML5s Drag&Drop-Funktionalität erweitern, sodass man einfacher mit dem Interpreter spielen und eigene Software (.pyc) laden kann (indem man einfach das pyc vom Computer in den Browser zieht).

@sma: Ich habe mir mittlerweile etwas intensiver die Generator-Funktionen angeschaut. Ich bin mir aber noch nicht schlüssig, ob ich eher stack oder stackless dies implementiere. Beides wäre möglich, und erscheint mir nicht all zu schwer. Ich muss noch ausloten, was performancemäßig in JS besser ist.

Grüße
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

daemonTutorials hat geschrieben:@jens: PyPy kann z.B. JavaScript Code in Python-Code umwandeln, [...]
Das muss irgendwie an mir vorbeigegangen sein. Hast du mal einen Link dazu?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

/me hat geschrieben:
daemonTutorials hat geschrieben:@jens: PyPy kann z.B. JavaScript Code in Python-Code umwandeln, [...]
Das muss irgendwie an mir vorbeigegangen sein. Hast du mal einen Link dazu?
Er meinte es wohl anders herum. Ein JS-nach-Python-Übersetzer wäre mir neu.

Stefan
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab was gefunden: http://codespeak.net/svn/pypy/lang/java ... preter.txt :
JS-PyPy is a Javascript interpreter written in pyton by Leonardo Santagada

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
flosch
User
Beiträge: 4
Registriert: Mittwoch 10. Mai 2006, 18:50

jens hat geschrieben:Hab was gefunden: http://codespeak.net/svn/pypy/lang/java ... preter.txt :
JS-PyPy is a Javascript interpreter written in pyton by Leonardo Santagada
Das wäre dann genau der umgekehrte Weg; JavaScript in Python, statt Python in JavaScript.

Gruß
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ja genau... Und an dem PyPy JavaScript Backend wird IMHO gearbeitet: https://bitbucket.org/pypy/lang-js

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten