Konwerter Python -> C++

0

Witam. Od jakiegoś czasu piszę konwerter j.w. Jeśli ktoś chce to może sobie zerknąć na stronie kod (w repozytorium svn). Kod jest dostępny dla wszystkich na licencji GNU GPL.

Idzie powoli, ale idzie. Jak się pojawi więcej czasu to może tempo wzrośnie. Jeśli ktoś chce coś poprawić/dodać/zmienić to byłbym bardzo wdzięczny.

Jeśli ktoś ma jakieś pytania to do soboty (07/04) południa jestem, później to dopiero od wtorku.

http://sourceforge.net/projects/surukuku
http://www.trac.cz/trac/surukuku

0

Pomysł w sumie ciekawy, tyle że nie jestem do końca pewny czy to ma sens - jeśli w znaczącym stopniu by to przyspieszało działanie programów napisanych w Pythonie to ok, ale jeśli tylko umożliwiałoby to kompilację to raczej bez sensu, już są takie projekty jak np. py2exe ;)

0

py2exe nie jest kompilatorem. W py2exe tworzony jest plik zip ze skryptami pythona i dołączany jest plik exe z interpreterem pythona. Wydajność takiego rozwiązania jest podobna jak samego pythona. To ma służyć jedynie jako ułatwienie w rozprowadzaniu programów pod windows.

Co do wydajności kodu C to zależy od tego co jest tłumaczone. Proste rzeczy bez skomplikowanych i czasochłonnych obliczeń zazwyczaj są 2-4 krotnie szybsze niż w pythonie. Kiedyś robiłem proste testy wydajności. Dla wielu pętli i obliczeń czas wykonania był w C mniejszy o ~212 razy.

Zaletą kodu C jest wydajność, ale także możliwość kompilacji do kodu maszynowego. Skrypty pythona można "skompilowac" do bytecodu, ale tu deassemblacja daje o wiele bardziej czytelny kod. Niektórzy wolą nieujawniać swojego kodu. Dodatkowo po przepisaniu do C nie jest wymagane posiadanie zainstalowanego interpretera.

Można się zapytać po co pisać w pythonie i konwertować na C jak można od razu w C pisać. Pisanie w pythonie trwa kilka razy krócej niż w C (są w sieci dostępne dokumenty na ten temat, głównie po angielsku).

0

Konwersja do modułów C:
Pyrex
SWIG
py2cmod

Jeżeli potrzeba tylko przyspieszyć to:
Psyco

Jeżeli przekonwertować do C, LLVM (a dalej do maszynowego) to:
PyPy

0

@Erihel -> czyli w takim razie pomysł całkiem niezły, jestem ciekaw co z tego wyjdzie ;) W Pythonie (mi przynajmniej) się naprawdę przyjemnie pisze więc każde przyspieszenie się przyda.

@Dryobates -> 3 pierwsze ciekawe, tyle że jak się domyślam program tak czy tak musi ruszyć z interpretera więc nie daje to tyle co 'pełny' translator.
Psyco - nie no fajnie, przyspieszenie za cenę dodatkowego zużycia pamięci. Jakoś mi się to nie widzi ;)
PyPy - to chyba jedyny z całej tej szóstki zgodny z założeniami programu Erihela ;) Tyle że on tłumaczy na C a nie C++, a to robi pewną różnicę.

0

Co z tego wyjdzie możesz już częściowo zobaczyć. Do kodu źródłowego dodanych jest 27 przykładów (16 z nich używa PyOpenGL).

Piszę i testuje pod 64bit Gentoo i nie bardzo mam jak sprawdzić czy się poprawnie kompiluje pod Windows. Jeśli użyjesz gcc pod windows (mingw czy cygwin) to powino ładnie działać.

Dla ścisłości bo niektórzy mają z tym problemy: p2cpp.py to tekstowy konwerter a p2cpp-gtk.py jak nazwa mówi okienkowy ;)

Pozdrawiam i znikam do wtorku, wesołych świąt wszystkim.

0
Ghostek napisał(a)

@Dryobates -> 3 pierwsze ciekawe, tyle że jak się domyślam program tak czy tak musi ruszyć z interpretera więc nie daje to tyle co 'pełny' translator.

True. Chyba, że potem py2exe potraktujesz, ale i tak w środku interpreter będzie siedział.

Psyco - nie no fajnie, przyspieszenie za cenę dodatkowego zużycia pamięci. Jakoś mi się to nie widzi ;)

Te dodatkowe zużycie pamięci najbardziej mnie martwi. Ale ogólnie uważam ideę za bardziej słuszną, niż kompilacja do C. Zachowujemy elastyczność języków dynamicznych, przy okazji optymalizując w locie, to co jest na prawdę istotne.

PyPy - to chyba jedyny z całej tej szóstki zgodny z założeniami programu Erihela ;) Tyle że on tłumaczy na C a nie C++, a to robi pewną różnicę.

Autor stale pisał o C, stąd i to C. Ale akurat nie sądzę, by to była znaczna różnica. Backendy można najróżniejsze tam przyczepić.

@Erihel
Ogólnie to bardzo dobrze, że powstaje taki projekt. Zawsze to coś na + dla społeczności pythona. Dodatkowe narzędzie.

Interesuje mnie bardzo, jak poradzisz sobie z dynamiczną naturą pythona, introspekcją oraz chyba najtrudniejszym do zrealizowania w "kompilowanych językach" zagadnieniem: metaklasy.

Znasz Objective-C? To jeden z niewielu kompilowanych, dynamicznych języków. Myślę, że znajomość jego mechanizmów (szczególnie mechanizmów kompilacji), pomogłaby Ci w pisaniu.

Życzę powodzenia.

0
Dryobates napisał(a)

Te dodatkowe zużycie pamięci najbardziej mnie martwi. Ale ogólnie uważam ideę za bardziej słuszną, niż kompilacja do C. Zachowujemy elastyczność języków dynamicznych, przy okazji optymalizując w locie, to co jest na prawdę istotne.

Nom, problem w tym że takie rozwiązanie raczej musi zużywać dodatkowo pamięć (bo gdzieś musi trzymać te dodatkowe tymczasowe kopie), a najczęściej jak program musi zużywać mało zasobów to wszystkich - czasu, procka, pamięci, itp. ;) Więc chyba jednak warto chyba poświęcić tą elastyczność (a poza tym, przecież raczej nikt by już takiego kodu po 'skompilowaniu' nie ruszał, przecież jak kompiluje się program w C++ to do kodu maszynowego w większości przypadków już nie ma po co zaglądać. Edytowałoby się wysokopoziomowy kod w Pythonie a kod C++ powoli stawałby się dla nowych programistów magicznymi zaklęciami możliwymi do zrozumienia tylko przez profesjonalistów i kompilatory ;) Kto wie, może to jest przyszłość języków programowania...) żeby tych zasobów mniej zużyć ;)

Interesuje mnie bardzo, jak poradzisz sobie z dynamiczną naturą pythona, introspekcją oraz chyba najtrudniejszym do zrealizowania w "kompilowanych językach" zagadnieniem: metaklasy.

Można by spróbować robić to tak jak kompilatory C++ radzą sobie z szablonami - robić tyle kopii danej funkcji/klasy ile razy jest wywoływana z różnymi typami. ;) (albo po prostu użyć szablonów z C++ ;))

0

Wiem, że python jest dynamicznym językiem. Cały czas myślę nad różnymi rozwiązaniami. Obecnie możliwe jest tłumacznie prostych zmiennych, które zmieniają w pythonie typ np.

a = 1 # mamy integer
a = 'jakis tekst' # mamy string

Używam przy pisaniu szablonów i zastanawiam się nad zabraniem za metaprogramowanie. Staram się, aby kod w C++ jak najbardziej przypominał ten z pythona żeby łatwiej było nanosić poprawki na przetłumaczony kod. Do tego celu także pisze nagłówki z różnymi typami i funkcjami (jak np. listy czy pliki).

Jest wiele do zrobienia, ale z czasem coraz więcej rzeczy implementuje. Chcę pare rzeczy uporządkować i zabrać się za słowniki oraz tuple.

Ghostek napisał(a)

W Pythonie (mi przynajmniej) się naprawdę przyjemnie pisze więc każde przyspieszenie się przyda.

To może pomógłbyś mi w testowaniu ? Bo sam to mam dostęp wyłącznie do komputerów z 32/64bit dystrybucjami linuxa.

Ogólnie to zachęcam wszystkich do testowania i ew. wysyłania mi skryptów, które nie działają (na razie najlepiej żeby dodatkowych modułów nie używały lub tylko wbudowanych w interpreter).

Postaram się do końca weekendu dodać na stronie projektu możliwość tłumaczenia skryptów prosto ze strony.

0

Jak mówiłem to daje http://surukuku.sf.net/convert.html . Jest problem i błąd. Jeśli się użyje % to kodu nie przetłumaczy. To wina wysyłania skryptu do cgi. Wysyłany jest na razie metodą GET ponieważ metoda POST nie działa za bardzo (tj. działa tylko kiedy wyśle dane ze skryptu np. pythona, a jak przez przeglądarke to skrypt cgi nie dostaje danych). Poprawiłem także kilka zauważonych błędów z silniku tłumaczącym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0