Interfacer Python et Erlang

by Christophe Romain <cro@tuxfamily.org>

July 19, 2004

1 Interfacer, pouquoi ?

Erlang est réellement une plateforme de développement aux qualités exceptionnelles mais souffre d'un manque certain de composants applicatifs. En effet, bien que complet fonctionnellement, bon nombre d'applications ne sont pas implémentées sour Erlang et réaliser une interface pour chacune s'avère une tâche titanesque.

Python est quant à lui largement répandu, reste dans la phylosophie d'Erlang une plateforme de développement multi-plateforme avec une abstraction de la machine physique et un cycle de développement accéléré. Python est à ”l'orienté objet” ce qu'est Erlang à ”l'orienté processus”. Une multitute d'applications sont implémentées en Python, de la génération de documents PDF à l'interface homme machine (wxWindow, Qt, etc...) en passant par le calcul mathématique ou bien encore les services réseau. Bref beaucoup de choses existent sous Python et sont très bien implémentées.

Pourquoi tout adapter, interfacer ou réecrire sous Erlang ? n'est-il pas plus avantageux de faire dialoguer ensemble des composants logiciels Erlang et Python ? Vous l'aurrez vite compris, la réalité du développement logiciel modulaire que nous connaissons aujourd'hui nous permet d'envisager sérieusement ce genre d'approche. En effet, avec le succes grandissant des logiciels libre et la sensibilisation aux procédés de génie logiciel, les développeurs de qualité respectant un minimum les contraintes de réutilisation de leurs code sont en nombre grandissant. Ils représentent bien la comunauté des développeurs utilisant Python et/ou Erlang.

Le but: mettre facilement en place une architecture N-tiers en interfacant une base Erlang solide avec un vaste panel de composants Python.

1.1 La puissance d'Erlang

Erlang est un langage informatique disposant de nombreuses caractéristiques plus souvent associées à un système d'exploitation qu'à un langage de développement: concurrence des processus, arbitrage entre les processus et planification, gestion de la mémoire, distribution, gestion transparente du réseau, etc. Le langage propose les caractéristiques suivantes:

1.2 Les avantages de Python

Python est un langage de programmation objet interprété et multi-plateforme. Le langage peut être étendu par l'ajout de nouveaux modules écris en Python ou même dans un langage compilé comme C ou C++. Ces modules peuvent définir de nouvelles fonctions et variables comme de nouveaux objets.

Python possède une gestion complète des chaines de caractères avec gestion des expressions rationnelles. Cela dégage l'utilisateur de la gestion mémoire abituellement associée à ce genre de tâche. Ces fonctionnalités comme tant d'autres font de Python un langage idéal pour le prototypage par exemple.

Python permet également d'écrire des programmes importants et n'est donc pas limité au prototypage. Un programme peut utiliser plusieurs modules, chaque module ayant son propre espace mémoire, et chaque objets pouvant en encapsuler d'autres. De plus, une gestion des exceptions permet des récupérer les erreurs lorsque et où cela est nécessaire, sans parsemmer le code de vérifications d'erreurs.

Un très large nombre de modules sont disponibles en Python. Certains font partie de la bibliothèque standard de Python, utilisables dans tous programmes Python. D'autres sont plus spécialisés ou spécifiques et doivent alors être importés dans l'interpreteur Python au préalable.

Python permet également la sérialisation des objets, ce qui permet un partage de ceux-ci dans le câdre d'un environnement distribué.

2 Méthodes d'interactions

Erlang et Python fonctionnent à la base grâce à une machine virtuelle. Celle-ci offrant les diverses fonctionnalités propre à chaque langage, elle est le passage obligatoire d'une interraction entre une application Python ou Erlang avec la machine physique. Ainsi, pour interfacer un programme écris en Python ou en Erlang sans écrire toute une API ou sans mettre en place un système client serveur au niveau socket, il est possible d'utiliser les différentes interfaces de ces machines virtuelles, offrant bien souvent tous les mécanismes nécessaire à l'intégration d'extension au langage.

2.1 Interfaces d'Erlang

La machine Erlang peut s'interfacer de différentes manières. Chacune d'entre elle pose des avantages et des inconvénients. Le choix d'une d'entre elles dépend essentiellement des fonctionnalitées désirées.

2.2 Interfaces de Python

Les possibilités d'interface et d'extension de Python sont très variée:

2.3 Intéraction Erlang/Python

L'idée est d'utiliser des programmes Python depuis depuis Erlang et réciproquement. Il serai ainsi possible d'utiliser au sein d'une application Erlang, les nombreux modules Python existant et permettant d'étendre à un champs très vaste l'ensemble des fonctionnalités disponibles. Il serai également possible d'utiliser des processus Erlang (ou des tâches spécifiques pour lesquelles Erlang permet une implémentation simple et rapide) au sein d'applications Python. Enfin, l'interraction Erlang/Python permettrai par exemple d'intégrer des applications Erlang au sein d'un système basé sur Zope.

Nous constatons vite qu'il y à quatre solutions au problème:

La première solution est générique mais pas très performante et demande une maintenance double pour deux serveurs. Il est claire que la seconde solution reste la plus simple, la plus souple et la plus pratique à mettre en oeuvre. Celle-ci peut être adoptée dans un grand nombre de situations lorsque les dialogues entre Python et Erlang ne sont pas trop encombrés de données volumineuses. La troisième solution est plus compliquée à mettre en oeuvre mais permet un partage de données importantes entre Python et Erlang ainsi qu'une mutualisation des services offerts par des bibliothèques système existantes. La quatrième solution n'apporte pas de réelle plus value par rapport aux deux précédentes.

3 Conclusion

Différents logiciels sont disponibles. Beaucoup n'ont jamais aboutis, et ne sont pas utilisables directement. Parmis eux, nottons idx-spyerl et python_erlang qui peuvent éventuellement servir de base de travail mais ne sont pas réellement utilisables. La plus aboutie des solutions existante est incontestablement py_interface qui met en oeuvre la solution la plus simple, la plus souple et la plus pratique qui consiste en un noeud Erlang implémenté en Python.

Cette solution, entièrement écrite en Python, est utilisable sur toute machine et toute architecture sans compilation particulière. Les messages Erlang peuvent être envoyés de Python vers Erlang et réciproquement. Python peut également utiliser les rpc pour lancer des fonctions Erlang. Cette solution est donc très complète et permet déjà un vaste domaine d'utilisation.

Dans des cas très particuliers (passage importants de données volumineuses, adhérance forte aux couches basses du système, utilisation partagée d'une bibliothèque système existante, interface avec un logiciel existant implémenté dans un langage type C ou C++, etc...), on lui préfèrera une solution réalisée en C dont l'implémentation propose une extension Python ainsi qu'un driver Erlang partageant des ressources système partagées (gestion d'une mémoire partagée, interaction diverses avec des bibliothèques, passages de données plus optimisés via les couches basses du système d'exploitation, etc...). Dans ce cas, tout reste à faire.

4 Remerciements

Je tiends à remercier tout particulièrement Mickael Rémond et Thierry Mallard pour leurs actions autour d'Erlang en France. Je souhaite remercier également la société Ericsson pour avoir pensé et investit dans un projet comme on aimerais en voir d'aventage de la part de ceux qui ont les moyen de réaliser de tels choses. Bravo!