PyPy

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:

Kennt jemand PyPy. Hat jemand schon erfahrung gesammelt. Kann man damit schon was anfangen???

Hört sich sehr interessant an: http://www.wikiservice.at/dse/wiki.cgi?PyPy

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:Kennt jemand PyPy.
Sicher, seitdem sie es in der c't mal vorgestellt haben. Ich habe es noch nicht benutzt, jedoch hat es erst letztens auch noch Fördergelder bekommen (und ich glaube auch paar Google Summer of Code Tasks).

Also für richtige Arbeit ist CPython geeigneter, jedoch soll die "py"-Lib ga nicht schlecht sein.

Die Homepage ist bei codespeak und die Entwickler glaube ich von Stackless her zu kennen ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

Kurze Frage zum Verständnis:
Ich hab mir das mal kurz angeguckt, also das ist ein Python-Interpreter in Python, wenn ich das richtig verstanden habe.
Also nimmt man das "normale" Python, welches dass PyPy ausführt, welches wiederum ein beliebiges Python-Programm interpretiert?!
Was genau bringt das, mal abgesehen von der 2000-fachen Ausführungsdauer?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich denke der clou dabei ist, das man Python-Programme nach LLVM "konvertieren" lassen kann... Aber das scheint noch nicht wirklich fertig zu sein.

Zu LLVM hab ich das gefunden:
http://codespeak.net/pypy/index.cgi?get ... arted#llvm
http://www.golem.de/0505/38143.html

Wie das genau funktioniert weiß ich auch nicht... Ich stell mir da so vor, das PyPy das Python-Programm nach LLVM-Sourcen konvertiert und das man dann mittels LLVM das ganze compiliert zu einem echten Programm...

Angedeutet ist das ganze Verfahren hier: http://codespeak.net/pypy/index.cgi?doc ... l#overview

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:

Ich teste es gerade mal. Hab PyPy runtergeladen und entpackt. Im Hauptverzeichnis von PyPy habe ich folgendes Skript geschrieben:

Code: Alles auswählen

from pypy.translator.translator import Translator


filename = "test.c"


def test():
    print "Ein Test:"
    for i in range(10):
        print "x",i


t = Translator(test)

f = file( filename, "wb" )
f.write( t.c() ) # C translation schreiben
f.close()
Das Übersetzt die Funktion test() nach C... Nun installiere ich mal MingGW und versuche den C code zu compilieren... Bin mal gespannt...

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:

So, habe nun ein Versuch unternommen mit gcc den C-Code zu übersetzten... Aber es hagelt nur von "undefined reference" Fehlern:

Code: Alles auswählen

...
d:\temp/cckpbaaa.o(.text+0x209c):test.c: undefined reference to `_imp__PyObject_CallFunctionObjArgs'
d:\temp/cckpbaaa.o(.text+0x2176):test.c: undefined reference to `_imp__PyObject_GetAttr'
d:\temp/cckpbaaa.o(.text+0x219b):test.c: undefined reference to `_imp__PyErr_ExceptionMatches'
d:\temp/cckpbaaa.o(.text+0x21be):test.c: undefined reference to `_imp__PyErr_Fetch'
d:\temp/cckpbaaa.o(.text+0x21cb):test.c: undefined reference to `_imp___Py_NoneStruct'
d:\temp/cckpbaaa.o(.text+0x21d3):test.c: undefined reference to `_imp___Py_NoneStruct'
d:\temp/cckpbaaa.o(.text+0x226b):test.c: undefined reference to `_imp__PyObject_CallFunctionObjArgs'
d:\temp/cckpbaaa.o(.text+0x228d):test.c: undefined reference to `_imp__PyInstance_Type'
d:\temp/cckpbaaa.o(.text+0x22bc):test.c: undefined reference to `_imp__PyObject_IsSubclass'
d:\temp/cckpbaaa.o(.text+0x22d7):test.c: undefined reference to `_imp__PyBool_FromLong'
d:\temp/cckpbaaa.o(.text+0x22e7):test.c: undefined reference to `_imp__PyObject_IsTrue'
d:\temp/cckpbaaa.o(.text+0x2302):test.c: undefined reference to `_imp__PyBool_FromLong'
d:\temp/cckpbaaa.o(.text+0x230c):test.c: undefined reference to `_imp___Py_ZeroStruct'
...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hast du denn die Python.h eingebunden?

Ab der nächsten Version will sich PyPy ja selbt ausführen können, frag mich nicht wie das gehen soll, so viel Zeit hatte ich bisher nicht miralles genau anzusehen.

Aber seit dem letzten Mal als ich es mir angeschaut habe, ist die Dokumentation um einiges besser geworden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Leonidas hat geschrieben:Hast du denn die Python.h eingebunden?
In CPATH habe ich neben PyPy v0.6.1\pypy\translator\genc auch Python's \include Verzeichnis angegeben. Darin ist die Python.h

Es kommt auch kein Fehler das irgendwelche *.h Dateien nicht gefunden werden...

Hier nochmal die Fehler mit Anfang und Ende:

Code: Alles auswählen

In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
                 from test.c:1:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
d:\temp/ccMzbaaa.o(.text+0x7):test.c: undefined reference to `_imp___Py_NoneStruct'
d:\temp/ccMzbaaa.o(.text+0x2c):test.c: undefined reference to `_imp__PyMethod_New'
d:\temp/ccMzbaaa.o(.text+0x47):test.c: undefined reference to `_imp__PyList_New'
[...]
D:/Programme/tools/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../libmingw32.a(main.o)(.text+0x106):main.c: undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Versuch mal in test.c oder g_include.h noch die Python.h einzubinden. Sowas hat mir ab und zu beim kompilieren von Windows-Binaries geholfen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

In g_include.h ist eh ein #include "Python.h" drin...
Habs auch mal in test.c reingepackt... Bringt aber keine Änderung...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Aber eigentlich ist der Sinn von PyPy auch nicht, funktionen in C zu übersetzen sondern ein Python-Interpreter in Python zu sein.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gast

Leonidas hat geschrieben:Aber eigentlich ist der Sinn von PyPy auch nicht, funktionen in C zu übersetzen sondern ein Python-Interpreter in Python zu sein.
Genau da verstehe ich den Sinn nicht. Was bringt mir denn ein Interpreter der selbst interprtiert werden muss und dann ja auch noch praktisch dasselbe macht wie der Interpreter der den Interpreter interpretiert?
(Ui, lustiger Satz)
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

Leonidas hat geschrieben:Hast du denn die Python.h eingebunden?
Würd er wohl haben, sonst würde er keine Linker Fehlermeldungen bekommen, wenn das compilieren fehlschlagen würde. Du musst die Python libs mit einbinden... Am besten du übersetzt dein Programm mit den Python distutils...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Anonymous hat geschrieben:Genau da verstehe ich den Sinn nicht. Was bringt mir denn ein Interpreter der selbst interprtiert werden muss und dann ja auch noch praktisch dasselbe macht wie der Interpreter der den Interpreter interpretiert?
(Ui, lustiger Satz)
Das man ihn in Python schreiben kann? Das ist eine coole Sache, so kannst du viel einfacher die Bugs deines Interpreters fixen oder Features einbauen.

Jens, vielleicht fehlt beim gcc noch das -lpython?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Anonymous hat geschrieben:
Leonidas hat geschrieben:Aber eigentlich ist der Sinn von PyPy auch nicht, funktionen in C zu übersetzen sondern ein Python-Interpreter in Python zu sein.
Genau da verstehe ich den Sinn nicht. Was bringt mir denn ein Interpreter der selbst interprtiert werden muss und dann ja auch noch praktisch dasselbe macht wie der Interpreter der den Interpreter interpretiert?
(Ui, lustiger Satz)
Ein Ziel ist es den C-Anteil im Interpreter auf ein Minimum zu drücken. Damit wird der Interpreter, was die Quelltexte angeht viel kleiner und damit auch besser wartbar und auch leichter zu portieren. Und dann gibt es eine Python-Untermenge, so ähnlich wie Pyrex, die vom Interpreter zur Laufzeit in Machinensprache übersetzt wird. Dieser Code wird dann deutlich schneller ausgeführt als "heutiges" Python. Armin Rigo, der den Psyco JIT-Compiler geschrieben hat, ist mit beim PyPy-Team. Man kann da also durchaus schnellere Programmausführung erwarten, wenn das Projekt weiter fortschreitet.

Momentan liegt der Fokus erstmal darauf PyPy zu Python kompatibel zu machen. Also erstmal den Code zum laufen zu bekommen und ihn dann erst schneller zu machen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Leonidas hat geschrieben:Jens, vielleicht fehlt beim gcc noch das -lpython?
Nein das hatte ich nicht! Das scheind zu funktionieren... Als Ergebnis erhalte ich eine *.o Datei. Es gibt jediglich eine Warnung:

Code: Alles auswählen

/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
Das dürfte aber wohl nicht schlimm sein, was?

Nun versuche ich eine echte Ausführbare Datei mit gcc -I -lpython -o test test.o zu erzeugen. Dabei erhalte ich nun wieder die bekannten undefined reference Fehler:

Code: Alles auswählen

D:\Python\PyPy v0.6.1>gcc -I -lpython -o test test.o
test.o(.text+0x7):test.c: undefined reference to `_imp___Py_NoneStruct'
test.o(.text+0x2c):test.c: undefined reference to `_imp__PyMethod_New'
test.o(.text+0x47):test.c: undefined reference to `_imp__PyList_New'
test.o(.text+0xb6):test.c: undefined reference to `_imp__PyDict_New'
test.o(.text+0x10e):test.c: undefined reference to `_imp__PyDict_SetItem'
test.o(.text+0x173):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x17a):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x18c):test.c: undefined reference to `_imp__PyType_IsSubtype'
test.o(.text+0x1b3):test.c: undefined reference to `_imp__PyInt_Type'
test.o(.text+0x1ba):test.c: undefined reference to `_imp__PyInt_Type'

...
Laut der Doku http://www.mingw.org/docs.shtml#compilingandbuilding soll es auch direkt gehen... Also versuche ich es mit gcc -I -lpython -o test test.c Obwohl ich hier ja das -lpython angegeben hab, kommen wieder diese "undefined reference"-Fehler...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich vermute mal, dass dein MinGW libpython24.a oder python24.lib nicht finden kann. Klappen den Kompilationen von normalen Distutils-Modulen?
Du musst warscheinlich noch den Pfad dazu über -L/pfad/zu/den/libs angeben.

Bei PyPy wird doch auch die Python Stdlib neu in Python geschrieben (also das was noch nicht in Python ist)? Somit könnte man diese doch auch in IronPython nutzen, oder gibt es da irgendwelche größeren Probleme?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ProgChild
User
Beiträge: 210
Registriert: Samstag 9. April 2005, 10:58
Kontaktdaten:

jens hat geschrieben:Nun versuche ich eine echte Ausführbare Datei mit gcc -I -lpython -o test test.o zu erzeugen. Dabei erhalte ich nun wieder die bekannten undefined reference Fehler:

Code: Alles auswählen

D:\Python\PyPy v0.6.1>gcc -I -lpython -o test test.o
test.o(.text+0x7):test.c: undefined reference to `_imp___Py_NoneStruct'
test.o(.text+0x2c):test.c: undefined reference to `_imp__PyMethod_New'
test.o(.text+0x47):test.c: undefined reference to `_imp__PyList_New'
test.o(.text+0xb6):test.c: undefined reference to `_imp__PyDict_New'
test.o(.text+0x10e):test.c: undefined reference to `_imp__PyDict_SetItem'
test.o(.text+0x173):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x17a):test.c: undefined reference to `_imp__PyTuple_Type'
test.o(.text+0x18c):test.c: undefined reference to `_imp__PyType_IsSubtype'
test.o(.text+0x1b3):test.c: undefined reference to `_imp__PyInt_Type'
test.o(.text+0x1ba):test.c: undefined reference to `_imp__PyInt_Type'

...
Sag mal irre ich mich, oder ist PyPy nicht dafür da, Python Module zu erzeugen? Du kannst da so keine Ausführbaren Dateien draus machen... Du musst die datei als .DLL oder .SO linken, damit du sie dann in Python importieren kannst.

Ich würde dir wirklich empfehlen die Distutils zu benutzen. Wie das geht, steht hier.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Leonidas hat geschrieben:Ich vermute mal, dass dein MinGW libpython24.a oder python24.lib nicht finden kann.
Ich hab nun beide angegeben... Tut's auch nicht:
gcc -I -l \Python\Python24\libs\python24.lib \Python\Python24\libs\libpython24.a -o test test.c

Code: Alles auswählen

In file included from /Python/PyPy v0.6.1/pypy/translator/genc/g_include.h:18,
                 from test.c:2:
/Python/PyPy v0.6.1/pypy/translator/genc/int_include.h:200:2: warning: no newline at end of file
d:\temp/ccsvaaaa.o(.text+0x7):test.c: undefined reference to `_imp___Py_NoneStruct'
d:\temp/ccsvaaaa.o(.text+0x2c):test.c: undefined reference to `_imp__PyMethod_New'
d:\temp/ccsvaaaa.o(.text+0x47):test.c: undefined reference to `_imp__PyList_New'
d:\temp/ccsvaaaa.o(.text+0xb6):test.c: undefined reference to `_imp__PyDict_New'

...
ProgChild hat geschrieben:Sag mal irre ich mich, oder ist PyPy nicht dafür da, Python Module zu erzeugen? Du kannst da so keine Ausführbaren Dateien draus machen...
Tja, ich weiß nicht... Ich wollte es einfach mal versuchen... Hab aber keine Erfahrung mit gcc & Co :oops:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nein, jens, die Option ist -L nicht -l. -l gibt an gegen welche Bibliotheken du linkst und -L in welchem Ordner die Bibliotheken sind. Du musst sowohl bei -L den Ordner angeben als auch -lpython bzw. -lpython24.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten