Je compile tu compiles

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

Ça peut vous intéresser aussi


Roadsend PHP Compiler

Tien pendant que je suis encore là, j’ai testé ...


PHP vs Java

On vient de lever la polémique au taff et du ...


Poste de développement PHP sous Fedora

Linux est un système parfait pour développer. Simple d’installation,...


vim est un IDE PHP

Après pas mal de temps passé sur Eclipse, la lourdeur ...

Merci de m'aider à financer mes services

Si vous avez apprécié cet article, je vous serai reconnaissant de m'aider à me payer une petite bière :)

Si vous voulez en savoir plus sur l'utilisation de flattr sur mon blog, lisez cette page: Ayez pitié de moi

Commentaires

Ajouter un commentaire

Ajouter un commentaire

(*) Votre e-mail ne sera ni revendu, ni rendu public, ni utilisé pour vous proposer des mails commerciaux. Il n'est utilisé que pour vous contacter en cas de souci avec le contenu du commentaire, ou pour vous prévenir d'un nouveau commentaire si vous avez coché la case prévue à cet effet.