2008/10/03 06:30:35.050 GMT-4

Stroustruppen 2: la vendetta (del C++)

Avevo pensato di realizzare una serie di post che, con la scusa di raccontare le disavventure di un programmatore Python alle prese con un linguaggio alieno, avrebbero dovuto affrontare scherzosamente il tema del confronto tra Python e C++; ed il titolo di tali post avrebbe dovuto iniziare con il nome "Stroustruppen":
un gioco di parole tra il nome dell' ideatore del linguaggio C++ Bjarne Stroustrup ed il fumetto Sturmtruppen.

Poi ho scoperto l'esistenza di un una libreria C++ che rende il confronto tra i due linguaggi una pura speculazione filosofica.

Sto parlando di Boost.Python, che e' una delle componenti che appartengono alla collezione di librerie C++ Boost :
tramite Boost.Python e' possibile realizzare in maniera quasi immediata dei moduli di estensione Python scritti in C++.

Rispetto ad altri metodi per la realizzazione di moduli di estensione di Pyhon, come ad esempio SWIG o SIP, Boost.Python ha una serie di vantaggi:
  • permette in modo molto semplice e veloce l' implementazione di estensioni Python generando automaticamente i necessari wrapper per del codice C++ a partire da una descrizione (apparentemente) sommaria dei metodi e degli attributi delle classi wrappate;
  • tale descrizione, pur essendo del codice C++ perfettamente valido, risulta essere estremamente leggibile (e quindi facilmente generabile e modificabile anche manualmente) oltre ad essere stilisticamente simile piu' ad un frammento di programma Python che non C++;
  • la tipica realizzazione della descrizione di una classe e' sostanzialmente identica all' interfaccia della classe C++;
  • consente di wrappare in maniera semplice librerie C++ le cui API sono basate sull'utilizzo di smart pointers (in particolare l' integrazione con quelli messi a disposizione da Boost e' praticamente banale).
Oltre alla scrittura manuale del wrapper e' anche possibile fare uso di sistemi di generazione automatica nella generazione della descrizione dell' interfaccia come Py++ o di Pyste.

Boost.Python puo' essere anche considerato come una valida alternativa all' uso di CTypes, che spesso si rivela una libreria il cui utilizzo e' piu' complicato di quello che puo' sembrare in un primo momento, nella creazione di classi wrapper di DLL che espongono API in C/C++.

Il segreto che sta alla base della semplicita' di utilizzo di Boost.Python sta nell'utilizzo di una tecnica avanzata di programmazione C++ che va' sotto il nome di Template Metaprogramming, che consiste, sostanzialmente, nello sfruttare le funzionalita' messe a disposizione dai Template, ovvero il mezzo con cui il C++ supporta la programmazione generica,  per ottenere un interprete funzionale che opera a tempo di compilazione.

La cosa e' talmente interessante che ho deciso di approfondire l'argomento comprandomi il libro C++ Template Metaprogramming , anche perche' uno dei due autori, David Abrahams, e' il programmatore che ha realizzato Boost.Python.

L' unico problema di Boost.Python che mi sembra degno di nota e' quello di una scarsa integrazione tra le eccezioni del C++ e quelle del Python:
ogni volta che una eccezione viene generata da un modulo di espansione scritto in C++, se non si e' provveduto a creare un handler specifico, il programma Python riceve un generico messaggio di "Unidentifiable C++ Exception" generato dall' handler di default.

Posted by: swarzy.2008/10/03 06:30:35.050 GMT-4
Tags: boost-python python programmazione template-metaprogramming cpp boost stroustruppen | Permalink

Post a comment





The CAPTCHA image

Please enter the letters shown in the image in the following text box. Provided by Captchas.net