URL: https://linuxfr.org/users/serge_ss_paille/journaux/pythran-c-pour-les-serpents Title: Pythran : C++ pour les serpents Authors: serge_sans_paille Date: 2012年12月05日T11:10:22+01:00 License: CC By-SA Tags: pythran, python et c Score: 26 Salut à toi, mon petit journal Ça fait bien longtemps que je ne t'ai pas parlé de mon petit bébé cybernétique, [Pythran](https://github.com/serge-sans-paille/pythran). Tu te rappelles de lui ? C'est un convertisseur d'un sous ensemble du langage Python vers C++11. L'idée est de mutiler légèrement le langage Python (hop, plus de classes) et d'ajouter des contraintes de typage statique pour générer un module natif optimisé à partir d'un module écrit en Python. Sommaire ======== * Résumé des épisodes Précédents * Optimisations statiques * Projet Euler * Liens en folie Résumé des épisodes Précédents ============================== Pour ceux qui ont profité de leurs vacances, j'avais écrit quelques journaux sur le sujet, et les commentaires m'ont pas mal aidés, alors hop, les liens * http://linuxfr.org/users/serge_ss_paille/journaux/pythran-python-c * http://linuxfr.org/users/serge_ss_paille/journaux/pythran-rampe * http://linuxfr.org/users/serge_ss_paille/journaux/pythran-prepare-sa-mue * http://linuxfr.org/users/serge_ss_paille/journaux/pyth-on-ran-openmp Vous noterez les tentatives désespérées pour avoir des titres originaux. Hop une petite [nimage](http://ridee.enstb.org/sguelton/cxx-for-snakes.png) de ma patte pour justifier le titre de celui-ci. Optimisations statiques ======================= Python, c'est tout dynamique et on peut pas faire grand chose en analyse statique dans le cas général (pensez donc, un zozo peux évaluer votre module dans un contexte différent en changeant les globales pour que l'identifiant `int` pointe sur l'intrinsèque `float`, ce qui va pas arranger nos histoires). Si on fige un peu les choses (comprendre on limite l'usage des modules à `import` ou `__import__` et on oublie `execfile` et autres `eval`) on commence à pouvoir faire des choses intéressantes. La plus grosse réalisation de Pythran dans ce domaine, c'est d'être capable de calculer si une fonction est pure (sans effet de bord, ni sur des globales ni sur les paramètres), ce qui a plein de conséquences amusantes. Par exemple ```python def fibo(n): return n if n <2 else (fibo(n-1) + fibo(n-2) ``` est pure, mais ```python def obif(n,l): if n> 0: l.append(n) ``` ne l'est pas. Mais que faire de cette précieuse info ? On peut * décider si un `map` peut s'exécuter en parallèle (même si ce n'est pas toujours profitable) * faire profiter g++ de cette information [précieuse](http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html#index-g_t_0040code_007bpure_007d-function-attribute-2634) * faire de l'évaluation partielle, du genre python``` fibo(42) # on peut évaluer ça à la compilation, mais attention au temps de compil :-) ``` Projet Euler ============ À la recherche de cas test, je suis tombé (sans me faire trop mal) sur http://www.s-anand.net/euler.html qui a la bonne idée de lister pleins de petits algos en python pour répondre à pleins de petits problèmes matheux. Déjà ça montre que Python c'est bien pour faire des algos tranquillou, et puis avec quelques modifs, on a pu gonfler la base de tests :-) Liens en Folie ============== Y a pleins de trucs qui se passe en Python autour des modules natifs, alors pour les curieux, voilà le résultat de ma dernière pêche (attention, quelques liens sont un peu vieux, mais je les trouve tous intéressants) * Une [bafouille](http://nuitka.net/posts/letting-go-of-c11.html) du dev de Nuitka qui démonte le choix de C++11 par rapport C++03 comme back-end * un (long) [fil](http://mail.python.org/pipermail/cython-devel/2011-March/000173.html) sur la mliste de Cython concernant le support OpenMP * le [projet](https://bitbucket.org/haypo/astoptimizer) de Haypo pour faire du _constant folding_ de façon générique. Les problèmes rencontrés sont très instructifs ssssssssssssssss fait le serpent