Seite 1 von 2

PyPy

Verfasst: Samstag 6. August 2005, 19:28
von jens
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

Re: PyPy

Verfasst: Samstag 6. August 2005, 20:25
von Leonidas
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 ;)

Verfasst: Sonntag 7. August 2005, 12:30
von 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?

Verfasst: Sonntag 7. August 2005, 12:34
von jens
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

Verfasst: Sonntag 7. August 2005, 13:25
von jens
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...

Verfasst: Sonntag 7. August 2005, 14:04
von jens
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'
...

Verfasst: Sonntag 7. August 2005, 14:12
von Leonidas
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.

Verfasst: Sonntag 7. August 2005, 14:21
von jens
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

Verfasst: Sonntag 7. August 2005, 14:24
von Leonidas
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.

Verfasst: Sonntag 7. August 2005, 14:27
von jens
In g_include.h ist eh ein #include "Python.h" drin...
Habs auch mal in test.c reingepackt... Bringt aber keine Änderung...

Verfasst: Sonntag 7. August 2005, 14:39
von Leonidas
Aber eigentlich ist der Sinn von PyPy auch nicht, funktionen in C zu übersetzen sondern ein Python-Interpreter in Python zu sein.

Verfasst: Sonntag 7. August 2005, 15:12
von 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)

Verfasst: Sonntag 7. August 2005, 15:50
von ProgChild
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...

Verfasst: Sonntag 7. August 2005, 15:55
von Leonidas
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?

Verfasst: Sonntag 7. August 2005, 21:15
von 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.

Verfasst: Montag 8. August 2005, 06:39
von jens
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...

Verfasst: Montag 8. August 2005, 09:55
von Leonidas
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?

Verfasst: Montag 8. August 2005, 11:27
von ProgChild
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.

Verfasst: Montag 8. August 2005, 12:03
von jens
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:

Verfasst: Montag 8. August 2005, 12:12
von Leonidas
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.