PyPy.js

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also wenn das nicht mal abgefahren ist: Man nehme PyPy und LLVM und generiere eine PyPy.js Datei... Die ist dann zwar ~140MB groß (die komprimierte Version schrumpft allerdings auf ~14MB), aber es funktioniert, siehe die DEMO: http://pypyjs.org/demo/

Details: https://www.rfk.id.au/blog/entry/pypy-js-first-steps/

Projekt Webseite: https://github.com/rfk/pypyjs

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wow. Das ist echt cool 8)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Schade ist, das die DEMO Seite die kleinere/komprimierte "pypy.vm.js" Datei, per XMLHttpRequest() zieht. Keine Ahnung warum...

So kann man nicht einfach hingehen und die HTML Demo Seite "komplett" speichern, um damit Lokal ein wenig zu spielen :(

Hab dafür mal ein Ticket gemacht: https://github.com/rfk/pypyjs/issues/25

Würde mich ja reizten, darin dann mein DragonPy Emulator laufen zu lassen. Nicht mit TkInter GUI, sondern eine Konsolen-Version...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Es gibt da noch so einige andere Versuche:

In-Browser Implementationen:

http://www.brython.info/ bzw. https://github.com/brython-dev/brython
http://www.skulpt.org/ bzw. https://github.com/skulpt/skulpt

JS compiler:
https://github.com/PythonJS/PythonJS
https://github.com/chrivers/pyjaco
Pyjamas bzw. Pyjs: http://pyjs.org/

Wahrscheinlich gibt es noch ein paar mehr...

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

@jens: Wobei zumindest Brython und Skulpt nicht so wirklich kompatibel sind, und bei Brython das auch nicht angestrebt wird. PyPy ist halt ”echtes” Python. Und nicht nur etwas sehr ähnliches.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hast recht... Aber https://github.com/replit/empythoned nicht:
Empythoned

Empythoned is a build script that uses Emscripten to compile CPython for use in a browser. It attempts to compile the main interpreter as a single small executable and the whole standard library as dynamically loaded libraries.

The project is in its infancy. Right now the core interpreter works very well, but many of the libraries either don't work at all or contain various bugs.
Letzte Änderungen sind allerdings von 2012... Also nur ein Versuch, mehr nicht?

DEMO hier: http://repl.it/languages/Python



Nun kommt mir spontan eine andere Idee: Kann man Cython nehmen, C generieren und dann über Emscripten JS generieren?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Habe mal https://github.com/rfk/pypyjs genommen und nur den DEMO Teil extrahiert... Denn das original Repro ist echt sehr groß...

-> https://github.com/jedie/pypyjs-standalone

Darin ist auch der Bugfix, das es lokal läuft, siehe: https://github.com/jedie/pypyjs-standal ... 484b75bc74

Und hier findet sich auch mein "throttled_html_server.py" wieder (noch nicht verbessert), damit man die Ladezeit einschätzten kann: https://github.com/jedie/pypyjs-standal ... _server.py Siehe auch: http://www.python-forum.de/viewtopic.php?f=11&t=34726



Nun Frage ich mich, wie man die Ladezeit noch optimieren kann... Dazu ist mir eingefallen, das es LZMA implementierungen in JavaScript gibt, wie z.B.: https://github.com/nmrugg/LZMA-JS/

Darauf hin hab ich mal eben die 13,7MB große "pypy.vm.js" mit 7-Zip komprimiert. Die schrumpft auf 1MB... Das wäre doch eine Idee, oder?
Dazu kommt, das man nicht nur diese, sondern auch eine reihe anderer, nötige Dateien einpacken könnte...
Die gepackte LZMA Datei müßte man auch per JavaScript als Binäredaten vom Server abrufen können, siehe https://github.com/jDataView/jDataView bzw. https://developer.mozilla.org/en-US/doc ... inary_data

Hat jemand sowas schon mal gemacht?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Dieses emscripten ist eines der Projekte, wo einem schnell mal die Kinnlade runterklappt ;)
jens hat geschrieben:Hat jemand sowas schon mal gemacht?
Was erreichst Du denn mit "normaler" gzip-Auslieferung? Dann könnten Server und Browser das transparent vornehmen. Die Binärsache ist ansonsten kein Hexenwerk, Du nimmst einfach den Binärstring aus dem Response und arbeitest damit weiter (in Deinem Fall halt entpacken usw.)
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@jens: Du solltest nicht die ungepackte Variante mit der LZMA-gepackten vergleichen, sondern die gzippte Version, und dann ist der Unterschied nur noch 1.85 zu 1.14 Megabytes. Da bringt es wirklich nicht mehr viel, dem Browser ein neues Packverfahren beizubringen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hm. Ja stimmt, das mach nicht mehr so viel aus...

Hab wärenddessen mal ein wenig an der Ausgabe geschraubt... Sieht dann so aus:
Init PyPy.js, it's big, so this might take a while...

Request: 'pypy.vm.js' ...
2.0 MBytes loaded
3.9 MBytes loaded
5.9 MBytes loaded
8.2 MBytes loaded
10.2 MBytes loaded
12.5 MBytes loaded
100% loaded (13.7 MBytes)
Request: 'pypy.vm.js', done (status:200)
Request: 'modules/index.json' ...
evaluating asmjs code...
run() called, but dependencies remain, so not running
evaluating asmjs, done.
488.5 kBytes loaded
100% loaded (488.5 kBytes)
Request: 'modules/index.json', done (status:200)
initialising the vm...
loading module index...
pypy.js is ready.

Python v2.7.6 (?, Sep 18 2014, 09:21:40)
[PyPy 2.3.1]
>>>
-> https://github.com/jedie/pypyjs-standal ... 70b8a066e8


Zum selbst ausprobieren: http://jedie.github.io/pypyjs-standalone/

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab das Projekt wieder entdeckt und gesehen, das es noch aktiv ist.

Gibt eine neue Webseite zum probieren: http://pypyjs.org/
Startet direkt den Python Interpreter ;)

Ich arbeite gerade an Selenium tests: https://github.com/rfk/pypyjs/pull/96
Stoße aber noch auf einige Probleme...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Gerade gesehen, gibt einen recht Aktuellen Vortrag vom Autor "Ryan Kelly" auf der PyCon 2015:

https://www.youtube.com/watch?v=PiBfOFqDIAI

EDIT: Hier die Pläsentation: https://speakerdeck.com/nzpug/ryan-kell ... at-how-why

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Nu hab ich auch noch eine kleine Editor Seite gemacht: https://github.com/rfk/pypyjs/pull/102

Sieht so aus:
Bild

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

WIP: https://jedie.github.io/pypyjs-examples ... anced.html :lol:

Rendert selbst auf meinem alten S3 Handy :wink:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Bild

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Es tut sich was...

Nun gibt es: https://github.com/pypyjs

Und mein "Editor" ist online: http://pypyjs.org/editor.html

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mein "mandelbrot" mit PyPyJS ist auch aktualisiert:

mit JIT: https://jedie.github.io/pypyjs-examples ... anced.html
ohne JIT: https://jedie.github.io/pypyjs-examples ... nojit.html

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ein großes Problem sind die Ladezeiten... Alleine zum "init" sind zwei Dateien zu ziehen, die zusammen 19,2MB groß sind.

Nun hatte ich die Idee LZMA zu verwenden. Denn damit bleiben von den 19,2MB nur noch 2,88MB über!

Details dazu hier: https://github.com/pypyjs/pypyjs.github.io/issues/4 :D


EDIT: Achja, das hier:
jens hat geschrieben:Mein "mandelbrot" mit PyPyJS ist auch aktualisiert:

mit JIT: https://jedie.github.io/pypyjs-examples ... anced.html
ohne JIT: https://jedie.github.io/pypyjs-examples ... nojit.html
Ist nun auch unter https://github.com/pypyjs/ zu finden:

https://github.com/pypyjs/pypyjs-examples

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