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
PyPy: Was genau kann ich damit machen?
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.
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.
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Das trifft es ganz gut. PyPy ist mittlerweile ein Ding, dass versucht mit .NET zu konkurrieren.epsilon hat geschrieben:1. mit PyPy werden Compiler erzeugt
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.2. mit diesen Compilern kann ich syntaktisch eingeschränkten Python-Code (RPython) in z. B. C 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.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).
Richtig. Das geht nicht und wird auch nicht gehen. Ein Subset ja (RPython) aber Python selber nicht.Aber so wie ich das jetzt verstehe stimmt das alles nicht, und ich kann nicht einfach Python-Code in C-Code übersetzen.
TUFKAB – the user formerly known as blackbird
Maaag mir jemand'n Beispiel geben?... So'n Beispiel für Rpython und wie man's dann übersetzt...?
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?
@ 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?
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
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
@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.
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.
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
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.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?
TUFKAB – the user formerly known as blackbird
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
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
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
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
Im Prinzip brauche ich keinen vollständigen Parser, sondern nur 'nen Lexer. Vielleicht beschreibe ich einfach mal was ich machen will:Warum willst du das trennen?
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/
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.
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.
Ja, ich weiß “Vorzeitige Optimierung ist die Wurzel allen Übels”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.
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
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: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.
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 ).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.
Aber was genau meinst du denn damit, dass ich es mit Klassen lösen kann. Kannst du mal ein kurzes Beispiel posten?
Wenn extrem tief verschachtelte Datenstrukturen für Dich kein Problem sind, dann bleib halt dabei.
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.
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.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hierbei wird IMHO nicht das zerlegen des Textes oder das speichern der Meta Informationen der Flaschenhals sein. Sondern die Abfrage anderer Datenbanken nach den Informationen. Möchtest du dabei externe Datenbanken im Web nutzten?epsilon hat geschrieben: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).
Also momentan hab ich die Daten in relativ großen Text-Dateien auf meiner Festplatte. In was für einem Format ich die Daten dann weiterverarbeiten soll, weiß ich noch nicht genau. 'ne "richtige" SQL-Datenbank brauche ich allerdings nicht, denke ich. Vielleicht lass ich die Daten im Text-Format und benutz' etwas wie xapian¹. Das muss ich dann testen (Hat jemand Erfahrung mit sowas?).jens hat geschrieben:Hierbei wird IMHO nicht das zerlegen des Textes oder das speichern der Meta Informationen der Flaschenhals sein. Sondern die Abfrage anderer Datenbanken nach den Informationen. Möchtest du dabei externe Datenbanken im Web nutzten?
¹ http://xapian.org/