PyPy: Was genau kann ich damit machen?

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.
epsilon
User
Beiträge: 71
Registriert: Freitag 20. Juni 2008, 19:48

Freitag 20. Juni 2008, 21:18

Hallo,

bisher hatte ich gedacht, ich würde verstehen was PyPy ist und was man damit machen kann.

Nachdem ich heute allerdings einen Podcast[¹] über PyPy gehört und mich weiter über PyPy informiert habe, bin ich ehrlich gesagt ziemlich verwirrt. Vielleicht kann mir hier jemand auf die Sprünge helfen.

Bisher habe ich folgendes gedacht:

1. mit PyPy werden Compiler erzeugt
2. mit diesen Compilern kann ich syntaktisch eingeschränkten Python-Code (RPython) in z. B. C Code übersetzen
3. den übersetzten Code kann ich dann ganz normal mit dem entsprechenden Compiler/Interpreter kompilieren/ausführen (also z. B. C Code zu Binär-Code übersetzen).

Aber so wie ich das jetzt verstehe stimmt das alles nicht, und ich kann nicht einfach Python-Code in C-Code übersetzen.

Wenn das allerdings stimmt, kapier vermutlich überhaupt nicht um was es bei PyPy geht.

Kann mir hier jemand weiterhelfen? :)


[¹] http://chaosradio.ccc.de/cre088.html
BlackJack

Freitag 20. Juni 2008, 21:31

PyPy ist eine Python-Implementierung. Damit kann man Python-Programme laufen lassen.

Dabei sollte soviel wie möglich von PyPy selbst in Python geschrieben werden und es gibt einen Compiler für eine Untermenge von Python, RPython genannt, für die es einen Compiler mit verschiedenen Backends gibt.

Es soll jedenfalls kein abgespecktes Python sein, das man statisch kompilieren kann. Denn dann wär's kein Python mehr.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Freitag 20. Juni 2008, 22:35

epsilon hat geschrieben:1. mit PyPy werden Compiler erzeugt
Das trifft es ganz gut. PyPy ist mittlerweile ein Ding, dass versucht mit .NET zu konkurrieren.
2. mit diesen Compilern kann ich syntaktisch eingeschränkten Python-Code (RPython) in z. B. C Code übersetzen
Jain. Also es gibt einen RPython Compiler, der kann mit ein wenig Trickserei ein Subset von Python nach C und in andere Sprachen umwandeln. Und der ist in sich selber geschrieben.
3. den übersetzten Code kann ich dann ganz normal mit dem entsprechenden Compiler/Interpreter kompilieren/ausführen (also z. B. C Code zu Binär-Code übersetzen).
Also "user" bekommst du von PyPy nix zu sehen. Long term plan ist, dass PyPy einen neuen Python Interpreter generiert, der CPython ersetzt. Dieses ganze Compiler Framework siehst du als normaler User nicht.
Aber so wie ich das jetzt verstehe stimmt das alles nicht, und ich kann nicht einfach Python-Code in C-Code übersetzen.
Richtig. Das geht nicht und wird auch nicht gehen. Ein Subset ja (RPython) aber Python selber nicht.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Freitag 20. Juni 2008, 22:37

Maaag mir jemand'n Beispiel geben?... So'n Beispiel für Rpython und wie man's dann übersetzt...?
epsilon
User
Beiträge: 71
Registriert: Freitag 20. Juni 2008, 19:48

Freitag 20. Juni 2008, 23:23

Danke. Dann lag ich ja am Anfang gar nicht so falsch ;)

@ BlackVivi: Hier ist ein einfaches Beispiel:
http://radix.twistedmatrix.com/2006/12/ ... art-1.html

Das hier hab ich auch noch gefunden:
http://codespeak.net/pypy/dist/pypy/doc ... -python<br />


Kennt jemand noch weitere RPython-Tutorials bzw. Dokumentation zum Schreiben von RPython-Programmen?

Edit:
Ich habe jetzt vor, einen Parser in RPython zu schreiben (genügend Dokumentation vorrausgesetzt). Gibt es irgendetwas dagegen einzuwenden? (abgesehen davon, dass ich sogut wie keine fertige Module verwenden kann)

Edit2: Ein Punkt, der eventuell dagegen spricht (den Parser in RPython zu schreiben) ist, dass ich noch überhaupt keine praktische Erfahrung mit Python habe. Bisher hab ich nur 'byte of python' bis zum 11. Kapitel gelesen (Den Rest müsste ich dann natürlich noch lesen, bevor ich mit meinem Parser anfange). So könnte ich mir ja eventuell einen schlechten Stil angewöhnen. Auf der anderen Seite hab ich bisher sowieso nur Perl benutzt, da kommt's auf sowas dann auch nicht mehr an ;)
Was sagt ihr dazu?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Samstag 21. Juni 2008, 08:27

Unter http://codespeak.net/pypy/dist/pypy/rlib/parsing/ findest du zwei Parsergeneratoren und einen dynamischen Parser, wenn ich das richtig verstehe, die du benutzen kannst. Das ganze ist leider extrem dürftig dokumentiert. Hier ist mein unvollständiger Versuch. Ich habe gar nicht erst versucht, Schnittstellen zu identifizieren. Zum Teil greifen die Module übel ineinander, befürchte ich.

Ein anderes Plätzchen zum Abgucken ist http://codespeak.net/pypy/dist/pypy/lang/. Der Scheme-Interpreter und der JavaScript-Interpreter sehen einigermaßen einfach aus. In dem Versuch, eine VM für Squeak-Smalltalk zu schreiben, wirst du einen Parser finden und Prolog muss man erst mal verstehen, um da mit etwas anfangen zu können, befürchte ich - JavaScript und Scheme-Kenntnisse setze ich mal voraus ;)

Ansonsten sollte es möglich sein, einen in (R)Python geschriebenen Interpreter dann in C, LLVM, JavaScript sowie für die JVM und CLR zu übersetzen. Laut Podcast funktioniert das meiste davon aber wohl nicht zuverlässig.

Wenn's um's ausprobieren geht, sicherlich interessant, aber wirklich überzeugt, dass man das produktiv nutzen kann bin ich nicht. Dazu gibt es IMHO auch zu wenig Dokumentation.

Stefan
BlackJack

Samstag 21. Juni 2008, 14:45

@epsilon: Was ist denn der Grund dafür, dass Du einen Parser in RPython schreiben willst? Einfach interesse an RPython, aber in dem Wissen, dass das wirklich nur Spielerei ist, weil's niemand produktiv einsetzt? Oder wolltest Du einen statisch kompilierten Parser haben, den man auch verwenden kann?

Falls letzteres, solltest Du PyPy den Rücken kehren und mal einen Blick auf Pyrex bzw. Cython werfen. Oder gleich in C schreiben und mit `ctypes` anbinden. :-)
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 21. Juni 2008, 15:53

Kann man mit dem PyPy JavaScript-Interpreter schon was anfangen? Kann man dann aus Python heraus ein JavaScript ablaufen und beobachten lassen?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Samstag 21. Juni 2008, 16:50

jens hat geschrieben:Kann man mit dem PyPy JavaScript-Interpreter schon was anfangen? Kann man dann aus Python heraus ein JavaScript ablaufen und beobachten lassen?
Das würd ich lieber mit dem Spidermonkey Binding machen. Der PyPy Interpreter ist komplizierter zum Laufen zu bekommen weil er PyPy braucht und er kommt mit der virtual semicolon insertion nicht zurecht.
TUFKAB – the user formerly known as blackbird
epsilon
User
Beiträge: 71
Registriert: Freitag 20. Juni 2008, 19:48

Samstag 21. Juni 2008, 19:35

Ja, eigentlich wollte ich das ganze dann produktiv nutzen @ sma und BlackJack.

Pyrex bzw. Cython sieht aber auch extrem interessant aus!

Macht es Sinn das Pyrex-Tutorial¹ zu lesen, wenn ich am Ende sowieso nur Cython verwenden will?


Hier² steht ich kann einfach normalen Python-Code schreiben und dann im Nachhinein optimieren. Dann könnte ich ja eigentlich ein vorhandenes Python-Modul verwenden, welches ich dann einfach am Ende entsprechend abändere. Kennt jemand einen einfachen Lexer in Python? Bisher hab ich nur ganze Parser gefunden (z.B. die Liste hier²). Ich würde allerdings etwas alleinstehendes, wie z. B. HOP::Lexer³ (Perl-Modul), bevorzugen. So hätte ich dann getrennten Code und Dokumentation, was die Sache imho vereinfacht.

Edit:
Ich hab PyLexer* gefunden. Weiß jemand, ob der Lexer einigermaßen gescheit ist?

¹ http://wiki.cython.org/quickstart
² http://nedbatchelder.com/text/python-parsers.html
³ http://search.cpan.org/~ovid/HOP-Lexer- ... P/Lexer.pm
* http://margolis-yateley.org.uk/python/various/index.php
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 22. Juni 2008, 10:27

Ich tendiere dazu, Ansätze wie PEGs oder Combinator-Parser gut zu finden, die keinen getrennten Scanner bzw. Lexer benötigen. Auch ANTLR verzichtet als "klassischer" LL(*)-Ggenerator inzwischen auf einen getrennten Scanner. Warum willst du das trennen?

Bislang halte ich es eigentlich nur für nötig, wenn der Scanner nicht kontextfrei ist, wie etwa bei Python, wo er Einrückungen zählen muss oder bei Ruby oder C++, wo gar nichts einfach ist.

Wenn es darum geht, einen Parser in etwas anderem als C zu schreiben, dennoch aber "genauso schnell wie C" zu sein: Warum Python? Java böte sich da IMHO an, vielleicht auch Scheme (Bigloo, das große Klo, hat AFAIK ebenfalls nach C, JVM, CLR und LLVM kompilieren) oder noch exotischer OCaml. C# ginge natürlich auch, da kenne ich aber keine Parser-Generatoren und würde in der Sparte "traditionelle Sprache" eher Java wählen.

Stefan
epsilon
User
Beiträge: 71
Registriert: Freitag 20. Juni 2008, 19:48

Sonntag 22. Juni 2008, 16:12

Warum willst du das trennen?
Im Prinzip brauche ich keinen vollständigen Parser, sondern nur 'nen Lexer. Vielleicht beschreibe ich einfach mal was ich machen will:

Als input hab' ich einen deutschen Text. Den Text zerlege ich mit dem Lexer in kleinere Teile (Wörter, Satzendezeichen, restliche Satzzeichen, whitespaces). Über die Wörter möchte ich dann weitere Information raus finden, indem ich verschiedene Datenbanken abfrage (z.B. das Geschlecht des Wortes, die Wortart, Synonymen des Wortes). Die Daten zum Wort werden dann in einem dict. mit dem Wort als Key und als value einem weiteren dict. mit den Infos gespeichert. Das war's.

Da das ganze wohl ziemlich lange Dauer wird, wenn ich größere Textmengen verarbeite, wollte ich das Ganze möglichst effizient machen. Allerdings möchte ich dafür jetzt nicht gleich wieder eine neue Sprache lernen. Zur Not hätte ich es auch in Perl geschrieben, was ja scheinbar sogar langsamer als das "normale" Python ist (also z. B. ohne Psyco).


Als Lexer werde ich wohl den HOP::Lexer nehmen und nach Python portieren. Das sind nur ein paar Teilen¹ und so kann ich leichter Funktionen hinzufügen, da ich bereits den Quelltext gut kenne.

Oder hat irgendjemand einen besser Vorschlag?

¹ http://ubuntuusers.de/paste/351926/
BlackJack

Sonntag 22. Juni 2008, 16:53

Der erste Vorschlag wäre keine Vermutungen an zu stellen, sondern es erst einmal zu implementieren und dann nach zu messen ob es *wirklich* zu langsam ist, und sich der Aufwand einer Implementierung in einer anderen Sprache lohnt.

Ich wäre für die erste Näherung einer Lösung wahrscheinlich sogar zu faul selber einen Lexer zu schreiben, denn PyParsing lässt sich auch prima als Lexer verwenden.

Bei Dictionaries, die als Werte wieder Dictionaries mit Informationen haben, sollte man vielleicht auch schon mal über Klassen nachdenken. Spätestens bei der dritten verschachtelten Ebene werden Indexzugriffe nämlich in der Regel umständlich und unübersichtlich.
epsilon
User
Beiträge: 71
Registriert: Freitag 20. Juni 2008, 19:48

Sonntag 22. Juni 2008, 17:26

BlackJack hat geschrieben:Der erste Vorschlag wäre keine Vermutungen an zu stellen, sondern es erst einmal zu implementieren und dann nach zu messen ob es *wirklich* zu langsam ist, und sich der Aufwand einer Implementierung in einer anderen Sprache lohnt.
Ja, ich weiß “Vorzeitige Optimierung ist die Wurzel allen Übels” ;)

Im Prinzip ist das auch gar nicht mein Plan (mittlerweile).

Mein Plan ist:
- HOP::Lexer in Python nachschreiben
- Mein Programm mit dem HOP::Lexer-Clone schreiben
- Testen, ob das Ganze mit Psyco schnell genug ist
- wenn nicht: Versuchen das Ganze mit Cython zu optimieren
BlackJack hat geschrieben:Ich wäre für die erste Näherung einer Lösung wahrscheinlich sogar zu faul selber einen Lexer zu schreiben, denn PyParsing lässt sich auch prima als Lexer verwenden.
Mir geht es darum, dass ich so einfacher Erweiterungen einbauen kann (zum Beispiel wäre es manchmal praktisch n Token zurück oder vor zu blicken). Außerdem kenne ich den Quelltext dann schon einigermaßen gut, wenn ich den Lexer später in Cython neuschreiben sollte. Und zu guter Letzt ist HOP::Lexer sowieso nur 60 Zeilen lang.
BlackJack hat geschrieben:Bei Dictionaries, die als Werte wieder Dictionaries mit Informationen haben, sollte man vielleicht auch schon mal über Klassen nachdenken. Spätestens bei der dritten verschachtelten Ebene werden Indexzugriffe nämlich in der Regel umständlich und unübersichtlich.
Das sollte eigentlich kein Problem sein. In Perl arbeite ich sogut wie immer mit extrem tiefen Datenstrukturen. Außerdem ist das Referenzieren bzw. Dereferenzieren in Python eine Traum (Im Vergleich zu Perl ;) ).

Aber was genau meinst du denn damit, dass ich es mit Klassen lösen kann. Kannst du mal ein kurzes Beispiel posten?
BlackJack

Sonntag 22. Juni 2008, 19:12

Wenn extrem tief verschachtelte Datenstrukturen für Dich kein Problem sind, dann bleib halt dabei. :-P

Beispiel kann ich nicht geben, weil das ja problemspezifisch ist und die Funktionen an die Objekte gebunden werden. Da ich nicht weiss was Du an Daten und Funktionen hast...

Die Idee ist jedenfalls, dass man keine Funktionen schreibt, die auf drei oder mehr Ebenen tief in die Datenstruktur eingreifen, sondern Methoden die man auf der äussersten Ebene aufruft, und die dann ihrerseits die entsprechenden Methoden auf tieferen Ebenen verwenden.
Antworten