JS-CTypes - Test Drive

XPCOM è la gioia e dolore di tutti gli sviluppatori della piattaforma Mozilla XULRunner: la porta d'accesso a tutta una serie di servizi privilegiati che il WebContent si sogna :-) ma al tempo stesso è la porta d'accesso ad un inferno in terra :-( Accedere alle interfacce XPCOM fa molto CORBA, anche nei linguaggi ad alto livello come Javascript, Python o Java... realizzare nuove interfacce XPCOM fa ancora più CORBA... anche realizzandole in Javascript... Per non parlare poi dei componenti binari... effettuare il binding di una libreria nativa in una (o più) interfacce XPCOM richiederà la scrittura di un buon numero di linee di codice in C++, composto da una quantità abnorme di macro "semplificative" e stub generati dall'IDL :-( JS-CTypes nasce da una iniziativa di Mark Finkle ed ha lo scopo di fornire al linguaggio di scripting principe della piattaforma Mozilla XULRunner (Javascript) un modo più naturale per effettuare il binding di libreria native attraverso libffi e un API simile a CTypes (che troviamo di serie in Python). Dopo l'introduzione del primo prototipo nel source tree di mozilla-central, nelle versioni >=1.9.3 di gecko/xulrunner (e di conseguenza dalla versione 3.7 di firefox), JS-CTypes sarà presente di serie in tutti i build. E' arrivato quindi il momento di vedere all'opera una feature che potrebbe cambiare il modo di fornire funzionalità native alle applicazioni ed estensioni a base XULRunner. == Test Drive == Per prima cosa occorre procurarsi un nighly build di xulrunner-1.9.3 per la propria piattaforma (Linux nel mio caso) e provare l'API mediante una applicazione xulrunner minimale: * http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly/latest-trunk/ * http://github.com/rpl/xulrunner-jsctypes-testdrive Su MDC (https://developer.mozilla.org/en/JavaScript_code_modules/ctypes.jsm) è già presente una prima bozza di documentazione dell'API di JS-CTypes e alcuni snippet di esempio per Window e MacOSX, allora perchè non contribuire con uno snippet di esempio per Linux? (ottenuto aggiornando alla nuova api ctypes l'esempio contenuto nel post http://analogmountains.blogspot.com/2008/02/having-fun-with) /* import js-ctypes */ Components.utils.import("resource://gre/modules/ctypes.jsm"); /* open a library */ var libc = ctypes.open("libc.so.6"); /* import a function */ var puts = libc.declare("puts", /* function name */ ctypes.default_abi, /* call ABI */ ctypes.int32_t, /* return type */ ctypes.string /* argument type */ ); var ret = puts("Hello World from js-ctypes!"); == Conclusioni == Al momento mancano molte delle feature descritte nella pagina wiki di lavoro (in particolare le strutture, i puntatori e le callback): * https://wiki.mozilla.org/Jsctypes/api Dovremo quindi aspettare di avere un'API un po' piu' completa per poterne saggiare realmente le potenzialità e magari svilupparci qualcosa di simile a ruby-ffi-swig-generator per velocizzare la parte più noiosa e ripetitiva della creazione di un binding ffi. La nuova API JS-CTypes sembra farà il suo ingresso nei build stable per cui le speranze che l'api maturi in fretta sono probabilmente tutt'altro che vane. Have fun, rpl