Zajímavé téma, dík za článek.
K ctypes: Na základě čeho předpokládá, že funkce má dva parametry typu int a spadne na příliš velkém argumentu?
U té druhé: Dají se ty hlavičky pro python nějak vygenerovat? int je jednoduchý, ale v případě složitějších typedef to může být náchylné na chyby či problémy s multiplatformností.
hmm ctypes dokaze predavat jen int, string a float - to jsou IMHO jedine typy, kde nedojde k problemum, jinak uz nema ctypes sansi "odhadnout" co a jak predat a musi se specifikovat argtypes. Asi je lepsi zustat u cffi.
ctypes nemá žádné informace o tom, jakého typu mají být parametry. Proto jen předpokládá mapování mezi typy Pythonu a typy v céčku. V praxi to znamená, že vše bude na současných architekturách funkční pro malé inty v Pythonu, pro float, a pro řetězce (a do intů se pochopitelně řadí i True/False).
U ostatných typů parametrů dojde v nejlepším případě k běhové chybě (jak je ukázáno), v horším případě k předání "divné" hodnoty a v nejhorším případě bude vše jakoby funkční, ale v praxi se poruší zásobník (například pokud je funkce volána často nebo v určitém pořadí). I z tohoto důvodu není ctypes (podle mého názoru) vhodné řešení.
Interop je vždy peklo, pokud tedy někdo z donucení neudělá blend dvou jazyků nebo nějaké jiné opičárny (třeba Swift se třemi typy dispatche). Někdejší frameworky jako IBM SOM měly něco do sebe.
to jo, interop je peklíčko.
Ale zase zrovna Python->C je z tohoto pohledu ještě docela rozumné. Protože samotné C nemá v runtime žádné šílenosti typu GC (Python->Go je horší!) a i datové typy jsou +- v pohodě, pokud to opět nejsou nějaké ukazatele na callback funkce atd. A na rozdíl od C++ si nehrajeme na name mangling :)
Navíc není nutné řešit stuby ani na jedné straně (zdravíme JNI) :-p
Já myslel ABI, ale je fakt, že jak je někde GC, tak se to komplikuje ještě více. Go má naštěstí cgo.Handle, ale jinde to bývá horší.
JNI se ještě používá? Když jsem ještě dělal v Javě, měli jsme všude jen JNA.
P.S. To s tím GC by asi vydalo na samostatný článek, například “pin pointer” v .NET je taky šílenost. Nebo interop s GC v JavaScriptCore. A nejvyšší level je asi “toll-free bridging”, kde člověk jen přetypuje pointer a všechno funguje samo podle očekávání.