Je compile tu compiles

Publié le 16/07/2009

Lorsque l’on travaille sur Linux ou Unix en général, on aime utiliser des scripts pour travailler rapidement sur certaines tâches d’administration ou de développement. Mais ces langages de scripts sont de plus en plus utilisés pour développer de vraies applications complexes et complètes. Lorsque la limite de l’interpréteur entre en jeux (PHP, Perl, Python) et ce malgré leur optimisations qui rendent très rapide l’exécution, on est en droit de vouloir compiler un programme en binaire natif.

D’autres langages comme Java utilisent des VM ou Virtual Machine, comprenez “machine virtuelle”. Cela est certes très portable mais beaucoup se plaignent de lenteurs et surtout d’être esclave de la VM.

Justement, j’utilise au moins deux langages qui sont soit interprété soit compilé pour une VM, j’ai nommé PHP et Java. Les deux langages ont un compilateur. Cela implique donc que ces langages peuvent bénéficier de compilation en binaire natif avec tout ce que cela comporte. Performance, portage mais compilation collé à l’architecture.

En effet, un programme compilé sur Linux ne fonctionnera pas sur Windows et inversement. Il faudra dans tous les cas recompiler les sources pour en faire un binaire compatible pour la plateforme cible.

Cela n’enlève rien au charme de la compilation. Commençons par Java.

Java compilé avec GCJ

Java fonctionne essentiellement avec des classes. Alors que vous compiliez avec javac vos fichier .java vers des .class et que vous demandiez ensuite à Java de les exécuter, ici vous aller faire un binaire natif avec GCJ.

Imaginons une classe simple: class Hello { public static void main (String argv[]){ System.out.println("Hello you") } }

Ce fichier nommé “hello.java” contient une classe “Hello” et une méthode “main” qui peut servir de fonction principale. Il suffit de dire à gcj quel est la classe à utiliser en principal:

gcj --main=Hello hello.java -o test

Cela génère un exécutable nommé “test” qui peut être directement exécuté. Ce binaire est lié à la librairie libgcj. Sachez que GCJ arrive avec un sdk assez important, GNUClasspath, qui peut vous permettre d’aller assez loin.

GCJ sait utiliser des .class déjà compilé pour java, et inversement il sait utiliser des .class pour se lier à votre application.

PHP compilé avec PCC

Roadsend PCC est un compilateur PHP extrêmement bien fait. Il permet de créer des biniares natifs mais aussi des FastCGI ou des microserveurs. Notes que je serai présent au JDLL à Lyon le 17 octobre pour présenter une conférence sur ce sujet.

PCC est compatible (sur Linux/Unix) PHP 5, et PHP 4 sur Windows… un nouveau projet du même auteur est en train de voir le jour: Raven ou RPHP. C’est un compilateur développé en C/C++ au lieu de Scheme pour Roadsend PCC.

La compilation est simple comme bonjour:

pcc fichier.php -o exectuable

Cela génère le binaire “executable”.

Attention

Pour les deux solutions que je vous propose, ce sont des **implémentations différentes**. Cela signifie que la langage est le même mais le fonctionnement peut différer. Je tiens vraiment à ce que vous compreniez cela. En effet, par exemple pour PHP, les extensions du moteur Zend n’existent pas. De ce fait certaine extensions ont été réécrites, d’autres sont absentes car illogiques pour un binaire (par exemple APC).

Et les autres ?

Python, Perl ? oui on peut ou on pouvait compiler… mais les solutions ont soit disparut, soit ne proposent pas un réel intérêt.

Je prend l’exemple de Perl. Le module “B” permettait de créer un ELF ou directement du C… mais pour la version 5.10 de perl ce module est cassé.

Python bénéficiait de Py2exe sur Windows, ou CX_Freeze sur Linux et Windows… Seulement la seule chose que cx_Freeze fait est de paqueter votre application avec les librairies + la librairie Python. Il n’y a pas d’intérêt à part pour la distribution de votre application.

Python 2.6 voit un bytecompiler apparaitre, mais toujours pas de sortie ELF en place. Mais comme dirait l’autre: laissons les scripts être des scripts :) même si je suis partisan de la compilation PHP, Java, Perl… etc :)

Sources

-http://gcc.gnu.org/java/ - GCJ -http://www.roadsend.com/ - RoadSend PCC PHP Compiler -http://cx-freeze.sourceforge.net/ - CXFreeze -http://search.cpan.org/~nwclark/perl-5.8.9/ext/B/B.pm B Perl Compiler

comments powered by Disqus