C, SWIG, Python
Ostatnie dni upłynęły mi na tłumaczeniu kodu z Pythona na C oraz na poznawaniu nowych narzędzi służących do łączenia kodu napisanego w tych językach.
W większości udało mi się już zrobić to, co chciałem, w czystym C. Problem "podpięcia" tego pod Pythona rozwiązałem przy pomocy Swiga, który okazał się być zdecydowanie przyjemniejszy, niż API Pythona dla rozszerzeń w C/C++.
Cały problem mógłbym przedstawić następująco: można wykorzystać API Pythona dla rozszerzeń C/C++ i pisać w taki sposób, że cała konwersja pomiędzy typami danych stosowanymi w Pythonie i w C będzie pisana w C. W takim przypadku trzeba jednak używać tego niezbyt wygodnego API.
Korzystając ze Swiga sytuacja zostaje odwrócona - w Pythonie można łatwo tworzyć typy danych stosowane później przez funkcje napisane w C. Konwersja z tych typów na typy stosowane w Pythonie odbywa się jednak w czystym Pythonie, czyli jest to zdecydowanie łatwiej napisać, niż w C.
Użycie Swiga nie wyklucza oczywiście zastosowania distutils. Korzystanie ze Swiga sprowadza się do wygenerowania przez ten program jednego pliku w C, takiego "wrappera" dla właściwego kodu w C. Kod ten trzeba po prostu skompilować (czyli trzeba distutils powiedzieć, że ma skompilować kod z tego pliku) - i tyle.
Napotkałem jednak spore problemy przy korzystaniu z GLiba pod Swigiem. Ostatecznie zdecydowałem się nie używać w interfejsie tworzonego rozszerzenia żadnych danych z GLiba, a jedynie użyć tych typów danych z GLiba wewnętrznie w module. W ten sposób cały interfejs sprowadził się do czystego C, zaś moduł wykorzystuje listy i tablice z GLiba w sposób "niewidoczny" dla Swiga. Trzeba oczywiście pamiętać o odpowiednim zlinkowaniu skompilowanego modułu z tą biblioteką.
Tylko jak by to działało pod Windows? Tam użycie dzielonych bibliotek chyba nie jest tak powszechne, jak pod GNU/Linuksem... Kiedyś będę się musiał o tym przekonać. (Zresztą - póki co i tak nikogo nie obchodzi to, nad czym pracuję, więc mogę się spokojnie ograniczyć do systemów z rodziny GNU/Linuksa.)
W najbliższych dniach wykonam jeszcze testy na prędkość tych modułów napisanych w C (tłumaczyłem kod z Pythona i chcę zobaczyć, ile zyskałem), po czym wreszcie uruchomię kolejny eksperyment. Już nie mogę się doczekać!
A potem czeka mnie wreszcie powrót do czystego Pythona. Cóż za ulga po tworzeniu kodu w C, gdzie musiałem *ręcznie* utworzyć każdy obiekt w pamięci i zwolnić później tę pamięć, wyłowić w programie parę wycieków pamięci... Ech - nie ma to jak Python.
