<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.the-asw.com/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>The ASW - Programmation</title>
  <link>http://www.the-asw.com/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Fri, 14 Nov 2008 16:51:08 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Vous avez dit « Coding Style » ?</title>
    <link>http://www.the-asw.com/post/2005/10/14/53-vous-avez-dit-coding-style</link>
    <guid isPermaLink="false">urn:md5:8445457cc3a001a9be8200a20498b574</guid>
    <pubDate>Fri, 14 Oct 2005 18:11:00 +0000</pubDate>
    <dc:creator>cgo2</dc:creator>
        <category>Programmation</category>
            
    <description>Le terme &lt;em&gt;Coding style&lt;/em&gt; (appelé également &lt;em&gt;Coding standard&lt;/em&gt;, ou &lt;em&gt;Code convention&lt;/em&gt;), désigne l'ensemble des règles de mise en forme d'un code (nom des variables, indentation, etc.). Pour la plupart des projets informatiques, le &lt;em&gt;Coding Style&lt;/em&gt; est un document indiquant aux développeurs, de manière plus ou moins exhaustive, comment présenter son code afin que le projet soit homogène et surtout, lisible par tous. Ce document peut-être rédigé par le service Qualité, ou par le chef de projet, ou encore par le geek de service pour les projets libres. Voyons en détails de quoi il s'agit...    &lt;h3&gt;Pourquoi est-ce utile ?&lt;/h3&gt;
&lt;p&gt;D'abord, quel est l'interet de mettre en forme son code ? La lisibilité ! Un code bien mis en forme est plus facile à lire, à comprendre, et donc à maintenir.&lt;/p&gt;
&lt;p&gt;Ensuite, quel est l'interet d'avoir une même convention pour tout un projet ? Encore la lisibilité ! Si chaque développeur présente son code comme il l'entend, l'intégration risque de se faire dans la douleur. Les différents morceaux seront difficiles à lire, les noms des variables seront surement incohérents (avec risque de doublons), etc.&lt;/p&gt;
&lt;p&gt;Enfin, quel est l'interet de rédiger un document ? Pouvoir entrer dans les détails. En effet, si on peut se mettre d'accord sur les grandes lignes (indentation notamment) par oral, cela devient plus difficile dès qu'on décide d'entrer dans les détails ; et croyez moi, certains &lt;em&gt;Coding style&lt;/em&gt; sont tellement détaillés qu'ils vous imposeraient presque la couleur du caleçon...&lt;/p&gt;
&lt;p&gt;Voyons maintenant les points essentiels de toute bonne convention de codage qui se respecte.&lt;/p&gt;
&lt;h3&gt;Conventions de nommage&lt;/h3&gt;
&lt;p&gt;La façon de nommer les variables et les fonctions (&lt;em&gt;identifiers&lt;/em&gt; en anglais) est sans aucun doute le point le plus important d'un projet - et pourtant pas le plus médiatique. En effet, de bonnes règles de nommage permettront la plupart du temps de connaitre en un seul coup d'oeil certaines caractéristiques (au choix : type, portée (globale, locale, publique, privée, ...), appartenance, dépendance, etc.) et de savoir à coup sûr comment nommer une variable selon le contexte. A l'inverse, aucune règle amenera immenquablement à des noms de variables sans aucune logique (&lt;code&gt;toto&lt;/code&gt;, &lt;code&gt;tata&lt;/code&gt; et compagnie), et provoquera à coup sûr des erreurs parfois difficiles à detecter (exemple : &lt;q&gt;Ah merde, je suis en train de détruire une variable globale là !&lt;/q&gt;).&lt;/p&gt;
&lt;p&gt;Sur la mise en forme seule, il existe un grand nombre de possibilités, revelant plus du goût qu'autre chose :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jouer sur la &lt;a href=&quot;http://www.linux-france.org/prj/jargonf/C/casse.html&quot; hreflang=&quot;fr&quot;&gt;casse&lt;/a&gt; (&lt;em&gt;Case&lt;/em&gt; en anglais) :
&lt;code&gt;miniscules&lt;/code&gt;, &lt;code&gt;MAJUSCULES&lt;/code&gt;, &lt;code&gt;MixedCase&lt;/code&gt; ou &lt;code&gt;mixedCase&lt;/code&gt; ; et quid des abrévations, faut-il écrire &lt;code&gt;trainSNCF&lt;/code&gt; ou &lt;code&gt;trainSncf&lt;/code&gt; ? (désolé pour la SNCF, c'est le seul exemple qui m'est venu à l'esprit :)&lt;/li&gt;
&lt;li&gt;Utiliser le caractère &lt;em&gt;underscore&lt;/em&gt; «&amp;nbsp;_&amp;nbsp;» : &lt;code&gt;liste_double&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Retirer les voyelles, ou les espaces : &lt;code&gt;lst&lt;/code&gt; (liste)&lt;/li&gt;
&lt;li&gt;Plus généralement, utiliser des variables courtes, &lt;code&gt;cptList&lt;/code&gt;, ou &lt;code&gt;des_variables_explicites&lt;/code&gt; ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Là où ça devient interressant, c'est d'associer une mise en forme à un contexte. Par exemple, voici les conventions que j'utilise pour un projet de C++ :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les variables globales et les macros en &lt;code&gt;MAJUSCULES&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Les variables locales en &lt;code&gt;minuscules_avec_des_underscores&lt;/code&gt; et un nom explicite.&lt;/li&gt;
&lt;li&gt;Les variables internes à une classe finissent par un &lt;code&gt;underscore_&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Les variables statiques dans une classe commencent par un &lt;code&gt;_underscore&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Les fonctions membre d'une classe sont &lt;code&gt;enMixedCase&lt;/code&gt; avec une minuscule au départ. Les abréviations sont également en minuscule (sauf la première lettre si besoin).&lt;/li&gt;
&lt;li&gt;Les fonctions non-membres sont précédée du nom du modules si aucun namespace, et en mixed case, comme ça : &lt;code&gt;module_mixedCase&lt;/code&gt; ou &lt;code&gt;namespace::mixedCase&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Les classes sont en &lt;code&gt;MixedCase&lt;/code&gt; avec une majuscule au départ.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Quelques styles célèbres&lt;/h4&gt;
&lt;p&gt;A vrai dire, le seul style que je connaisse qui porte un nom est le style hongrois (&lt;a href=&quot;http://en.wikipedia.org/wiki/Hungarian_notation&quot; hreflang=&quot;en&quot;&gt;Hungarian notation&lt;/a&gt;) qui consiste à préfixer les variables par des lettres indentifiant leur type. Par exemple : &lt;code&gt;ulToto&lt;/code&gt; est une variable de type &lt;code&gt;unsigned long (int)&lt;/code&gt;. Même si la démarche peut sembler interessante, elle s'avère à l'usage peut pratique et peut lisible. Personnellement je la déconseille.&lt;/p&gt;
&lt;h4&gt;Quelques liens :&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Une page &lt;a href=&quot;http://dept-info.labri.u-bordeaux.fr/%7Estrandh/Teaching/MTP/Common/Strandh-Tutorial/naming.html&quot; hreflang=&quot;en&quot;&gt;présentant différents style de nommage&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;La &lt;a href=&quot;http://en.wikipedia.org/wiki/Identifier_naming_convention&quot; hreflang=&quot;en&quot;&gt;page wikipedia&lt;/a&gt; sur les conventions de nommage.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Indentation&lt;/h3&gt;
&lt;dl&gt;
&lt;dt&gt;Indentation&lt;/dt&gt;
&lt;dd&gt;Disposition particulière du texte d'un programme faisant apparaître des décalages de la marge dans l'écriture des divers blocs d'instructions.(source : Le Petit Robert)&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;L'indentation concerne non seulement la manière de décaler les blocs d'instructions, mais aussi le placement des accolades (ou autre élément délimiteur de bloc). Autant pour le nommage des variables il est facile de faire un peu ce qu'on veut et d'être spécifique à chaque type de programme, autant là, il vaut mieux se rallier à un camp existant ; d'une part parceque tout a déjà été inventé, et d'autre part parceque ça demande moins de temps d'adaption aux nouveaux développeurs.&lt;/p&gt;
&lt;p&gt;Attention, l'indentation est un sujet extrêmement trollifère, et il est difficile d'en parler déclancher une guerre de religion. D'ailleurs, je ne vais pas m'en priver !&lt;/p&gt;
&lt;h4&gt;Quelques styles célèbres&lt;/h4&gt;
&lt;p&gt;Le &lt;strong&gt;K&amp;amp;R&lt;/strong&gt;, est le style de Brian Kernighan et Dennis Ritchie, les inventeurs du langage C. C'est de loin le plus utilisé et le plus connus (et généralement celui qu'un débutant adopte naturellement). Il est notamment utilisé (avec quelques petites améliorations) pour le kernel Linux. Je ne vais pas y aller par 4 chemins : c'est mon style préféré.&lt;/p&gt;
&lt;pre&gt;void truc()&lt;br /&gt;{&lt;br /&gt;	if (x &amp;gt; y) {&lt;br /&gt;		faire_un_truc();&lt;br /&gt;	}&lt;br /&gt;	fin();&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Le &lt;em&gt;Linux Kernel Coding Style&lt;/em&gt; est disponible dans les sources du noyau linux (dans &lt;code&gt;Documentation/CodingStyle&lt;/code&gt;). Vous pouvez consulter la version disponible dans les sources du &lt;a href=&quot;http://www.the-asw.com/files/programmation/CodingStyle&quot;&gt;kernel 2.6.12.2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Le &lt;strong&gt;style GNU&lt;/strong&gt;, est utilisé (de gré ou de force) pour tous les projets GNU. Dans mon environnement, c'est le deuxième et le seul autre style que je côtoie souvent.&lt;/p&gt;
&lt;pre&gt;void&lt;br /&gt;truc()&lt;br /&gt;{&lt;br /&gt;  if (x &amp;gt; y)&lt;br /&gt;    {&lt;br /&gt;      faire_un_truc ();&lt;br /&gt;    }&lt;br /&gt;  fin();&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Voir le &lt;a href=&quot;http://www.gnu.org/prep/standards/html_node/Formatting.html&quot; hreflang=&quot;en&quot;&gt;&lt;em&gt;Gnu Coding Style&lt;/em&gt;&lt;/a&gt;, section &lt;em&gt;Formatting&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Pour plus d'informations sur les différents styles d'indentation, ainsi que les arguments pour et contre chacun, je vous conseille &lt;a href=&quot;http://en.wikipedia.org/wiki/Indent_style&quot; hreflang=&quot;en&quot;&gt;la page Wikipedia&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;tabs&quot;&gt;Trollons un peu : pourquoi utiliser des tabs ?&lt;/h4&gt;
&lt;p&gt;Pour mettre en retrait du texte, il y a deux écoles : les pro-espaces qui prônent l'utilisation de séquences d'espaces et les pro-tabs qui militent pour l'utisation du caractère «&amp;nbsp;tabulation&amp;nbsp;». Et la guerre entre les deux fait rage depuis des années. Par exemple, taper les deux mots «&amp;nbsp;indentation tabs&amp;nbsp;» dans Google renvoie plus de 360 000 réponses, avec en des titres comme &lt;em&gt;Tabs versus Spaces&lt;/em&gt;, &lt;em&gt;Why I prefer no tabs in source code&lt;/em&gt;, &lt;em&gt;Indentation wars end here&lt;/em&gt;, &lt;em&gt;Space indentation is morally wrong&lt;/em&gt;, etc. Bref, tout un programme ! En ce qui me concerne, j'ai choisi mon camp, celui des tabulations, et je vais vous expliquer pourquoi.&lt;/p&gt;
&lt;p&gt;A l'origine (c'est-à-dire au temps des machines à écrire), le caractère tabulation permet de déplacer le curseur jusqu'à un point d'arret marqué sur une réglette (&lt;em&gt;tabstop&lt;/em&gt; en anglais). Cela évitait à l'opérateur d'avoir à taper une série d'espace pour aligner des éléments. Tiens donc, «&amp;nbsp;aligner des éléments&amp;nbsp;» ça ne vous rappelle rien ? Aujourd'hui, on retrouve le principe des réglettes et des &lt;em&gt;tabstop&lt;/em&gt; dans les logiciels de traitement de texte tels que Microsoft Word ou OpenOffice Writer. La tab (parceque c'est &lt;em&gt;une&lt;/em&gt; tabulation) permet par exemple de faire un retrait au début d'un paragraphe.&lt;/p&gt;
&lt;p&gt;De manière plus générale, dans tout éditeur de texte moderne, il est possible de choisir la taille des tabs. Concrètement, vous pouvez définir qu'une tab fera 2 caractères ou 4 ou 8 ou autant que vous voulez ! Un seul caractère ASCII permet donc non seulement de remplacer efficacement une série d'espaces (et ainsi d'avoir un fichier plus petit), mais aussi de laisser celui qui consulte le fichier la possibilité de modifier son apparence visuelle par simple réglagle de son éditeur ! Exemple : vous avez un grand écran avec une grande résolution et vous préferez les tabs de 8 caractères ? Pas de problème. Vous passez le fichier à un ami qui a un tout petit écran et préfére des tabs de 2 caractères ? Pas besoin de toucher la moindre ligne du fichier, un simple réglage suffit.&lt;/p&gt;
&lt;p&gt;Pour en savoir plus, voici quelques liens très utiles :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.jwz.org/doc/tabs-vs-spaces.html&quot; hreflang=&quot;en&quot;&gt;Tabs versus Spaces: An Eternal Holy War&lt;/a&gt; : L'auteur est pro-espaces, mais le rappel historique du caractère tabulation est très pertinent.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Tab&quot; hreflang=&quot;en&quot;&gt;La page wikipedia&lt;/a&gt; sur le caractère tab.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.movementarian.org/docs/whytabs/&quot; hreflang=&quot;en&quot;&gt;Use Tabs in Source Code&lt;/a&gt;, ou pourquoi les tabs c'est mieux.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.students.uni-mainz.de/bauec002/indentation.html&quot; hreflang=&quot;en&quot;&gt;Tab-size independent source code formatting&lt;/a&gt; : Technique ultime d'indentation à base de tab permettant d'être complètement indépendant de la taille paramétrée.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Trollons un peu plus : pourquoi le GNU Coding Style est-il une erreur de la nature ?&lt;/h4&gt;
&lt;p&gt;Je n'aime pas &lt;a href=&quot;http://fr.wikipedia.org/wiki/Richard_Stallman&quot; hreflang=&quot;fr&quot;&gt;Richard M. Stallman&lt;/a&gt; (RMS). Certes, il a fait énormement pour le libre (c'est l'inventeur de gcc, de la GPL, etc.), mais c'est un intégriste borné qui ne voit malheureusement pas plus loin que le bout de son clavier et qui se permet de donner son avis sur tout et n'importe quoi (oui, comme RAGE2000, &lt;acronym title=&quot;Comprenne Qui Pourra&quot;&gt;cqp&lt;/acronym&gt;). A chaque fois que j'en entend parler, il a encore sorti une connerie plus grosse que lui. Tiens par exemple, la dernière fois il ordonnait à ses fidèles de &lt;a href=&quot;http://linuxfr.org/%7Eakauffmann/18900.html&quot; hreflang=&quot;fr&quot;&gt;ne pas acheter les livres Harry Potter&lt;/a&gt; (à quand une &lt;em&gt;intifada&lt;/em&gt; ?). Et la fois d'avant, il se permettait de &lt;a href=&quot;http://linuxfr.org/%7EHoubaa/19010.html&quot; hreflang=&quot;fr&quot;&gt;juger le projet de Constitution Européenne&lt;/a&gt; et d'affirmer que c'était une bonne chose d'avoir voter «&amp;nbsp;non&amp;nbsp;» (c'est un américain, qu'est-ce qu'il y connait&amp;nbsp;?). Et parmi toute les idioties de RMS, celle qui me pourri le plus la vie au quotidien est son &lt;em&gt;GNU Coding Style&lt;/em&gt;...&lt;/p&gt;
&lt;p&gt;Première chose : déclarer les fonctions sur deux lignes (ou plus !). Les ayatollah affirment que ça permet de retrouver facilement l'implémentation d'une fonction parmis des centaines de milliers de lignes de code. Explication&amp;nbsp;: il leur suffit de rechercher la ligne commençant directement par le nom de la fonction recherchée. En effet, si on cherche le nom de la fonction simplement, on va tomber, non seulement sur la déclaration, mais également sur tous les appels à ladite fonction. Cet argument est valable, certes, mais on peut tout à fait trouver une astuce similaire pour un autre style, par exemple avec le K&amp;amp;R il suffit de rechercher une ligne contenant le nom de la fonction et aucun caractère «&amp;nbsp;;&amp;nbsp;», ou bien une ligne contenant le nom de la fonction directement suivie d'une ligne débutant par une accolade... Une autre solution est d'utiliser un &lt;acronym title=&quot;Integrated
Development Environment&quot;&gt;IDE&lt;/acronym&gt; moderne, qui permet de se rendre directement à l'implémentation par simple clic. Ah oui, mais ça, contraire à la religion des GNUistes, qui doivent utiliser GNU emacs.&lt;/p&gt;
&lt;p&gt;Deuxième chose : les «&amp;nbsp;demi-niveaux&amp;nbsp;» d'indentation ; c'est-à-dire le placement des accolades à mi-chemin entre les deux blocs, comme ceci :&lt;/p&gt;
&lt;pre&gt;if (x &amp;gt; y)&lt;br /&gt;  {&lt;br /&gt;     faire_un_truc ();&lt;br /&gt;  }&lt;/pre&gt;
&lt;p&gt;Ce que j'en pense, c'est qu'en plus d'être illisible, ça n'a pas grand interet. Mais bon, je veux bien admettre qu'il s'agit là d'une notion tout à fait subjective ; comme dirait ma grand-mère : &lt;q&gt;Les goûts et les couleurs...&lt;/q&gt;. Alors discutons sur des choses objectives.&lt;/p&gt;
&lt;p&gt;Premièrement, est-ce bien moral de «&amp;nbsp;couper&amp;nbsp;» l'indentation en deux, et de créer ainsi ces «&amp;nbsp;demi-niveaux&amp;nbsp;» ? Je ne crois pas. Ca casse l'imbrication et ça perturbe la lecture : la notion de «&amp;nbsp;demi&amp;nbsp;» n'est pas naturelle et on a l'impression que le bloc est en fait 2 niveaux en dessous.&lt;/p&gt;
&lt;p&gt;Deuxièmement, la façon d'indenter. Pour créer ces «&amp;nbsp;demi-niveaux&amp;nbsp;», il faut impérativement utiliser des espaces au lieu des tabulations (voir &lt;a href=&quot;http://www.the-asw.com/post/2005/10/14/#tabs&quot;&gt;ci-dessus&lt;/a&gt;). Cela à 2 inconvenients majeurs :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Il faut plusieurs caractères «&amp;nbsp;espace&amp;nbsp;» pour imiter un seul caractère «&amp;nbsp;tabulation&amp;nbsp;» ; ça prend plus de place pour le stockage (essayez avec un fichier de quelques centaines de lignes pour voir, la perte peut très vite se compter en kilo-octets), et donc rend la compilation un poil plus longue (parceque fichier plus gros à parser), ainsi que les &lt;em&gt;commits&lt;/em&gt; et autre manipulation.&lt;/li&gt;
&lt;li&gt;Les développeurs ne peuvent pas modifier la valeur de l'indentation selon leur goûts (2, 4, 8, ...)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour conclure ce petit troll, je vais citer Linus Torvalds (le papa du noyau Linux) : &lt;q&gt;First off, I'd suggest printing out a copy of the GNU coding standards, and NOT read it. Burn them, it's a great symbolic gesture.&lt;/q&gt; («&amp;nbsp;Avant tout, je vous suggère d'imprimer une copie du GNU Coding style, et de NE PAS le lire. Brulez-le, c'est un grand geste symbolique.&amp;nbsp;»).&lt;/p&gt;
&lt;h3&gt;Encore plus loin...&lt;/h3&gt;
&lt;p&gt;Même si ces deux notions (nommage et indentation) sont les plus importantes (et les plus celèbres), il y a bien d'autres point à préciser si on veut rédiger un coding style complet. Parmi celles-ci :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les &lt;strong&gt;espacements&lt;/strong&gt;. Faut-il écrire : &lt;code&gt;m = moyenne(a,b);&lt;/code&gt; ou &lt;code&gt;m=moyenne(a,b);&lt;/code&gt; ou encore &lt;code&gt;m = moyenne(a, b);&lt;/code&gt; ?&lt;/li&gt;
&lt;li&gt;Les &lt;strong&gt;noms de fichiers&lt;/strong&gt;, et &lt;strong&gt;l'arborescence&lt;/strong&gt; du projet. Les noms de fichiers doivent-ils être en miniscules uniquement ? Faut-il faire une classe par fichier ?&lt;/li&gt;
&lt;li&gt;On peut aller encore plus loin, en imposant par exemple un nombre de lignes limite pour les fonctions, un nombre de variable maximum, ou, comme je le disais en introduction, la couleur du caleçon à porter pour coder !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bref, comme vous avez pu le constater, les standards de codage forment un sujet très vaste et particulièrement... délicat. Les guerres sont nombreuses, très nombreuses, à tel point qu'il est difficile d'en parler sans que ça dégénère (essayer de poser une question sur un forum de geek en postant un morceau de code : à tous les coups quelqu'un va venir vous dire que votre &lt;em&gt;coding style&lt;/em&gt; n'est pas bon !). Et encore, là je n'ai survolé que les points les plus connus...&lt;/p&gt;
&lt;p&gt;Note : Saviez-vous que, lorsqu'on parle de typographie, on dit &lt;em&gt;une&lt;/em&gt; espace ?&lt;/p&gt;</description>
    
    
    
          <comments>http://www.the-asw.com/post/2005/10/14/53-vous-avez-dit-coding-style#comment-form</comments>
      <wfw:comment>http://www.the-asw.com/post/2005/10/14/53-vous-avez-dit-coding-style#comment-form</wfw:comment>
      <wfw:commentRss>http://www.the-asw.com/feed/rss2/comments/54</wfw:commentRss>
      </item>
    
  <item>
    <title>Mon premier programme C/PHP</title>
    <link>http://www.the-asw.com/post/2005/05/02/7-mon-premier-programme-c-php</link>
    <guid isPermaLink="false">urn:md5:0dbfb0fefe8e05542a5efebbd97b18ff</guid>
    <pubDate>Mon, 02 May 2005 11:16:00 +0000</pubDate>
    <dc:creator>cgo2</dc:creator>
        <category>Programmation</category>
        <category>c</category><category>php</category>    
    <description>Comment embarquer PHP dans un programme C de la manière la plus basique possible.    &lt;h3&gt;Hello world&lt;/h3&gt;

	
	&lt;p&gt;En guise d'&quot;Hello World&quot;, nous allons essayer d'executer la commande &lt;code&gt;phpinfo()&lt;/code&gt;.&lt;/p&gt;
	
	&lt;p&gt;Avant tout, il faut initialiser le module php embed. Tout ceci n'étant absolument pas documenté, je ne saurais dire à quoi correspondent les paramètres.&lt;/p&gt;
&lt;pre&gt;
static char *argv[2] = {&quot;monboprog&quot;, NULL};

if ( php_embed_init(1, argv PTSRMLS_CC) == FAILURE ) {
	puts (&quot;Impossible d'initialiser PHP&quot;);
	return -1;
}
&lt;/pre&gt;

	&lt;p&gt;Maintenant on peut executer une commande. On utilise &lt;code&gt;zend_eval_string&lt;/code&gt; qui prend comme premier paramètre la commande à executer. Je ne sais pas à quoi correspond le deuxième (je laisse &lt;code&gt;NULL&lt;/code&gt;). Quant au dernier, apparement on peut mettre n'importe quoi... Allez comprendre !&lt;/p&gt;

	&lt;p&gt;Zend (le parseur php) fournis des macros imitant le try-catch du C++, permettant de recuperer les erreurs de php. Il n'y a donc qu'à les utiliser. Et voila ce que ça donne :&lt;/p&gt;
&lt;pre&gt;
zend_first_try {                                                                                                                   
	if ( zend_eval_string(&quot;phpinfo();&quot;, NULL, &quot;php embed roulez&quot;) == SUCCESS )
		puts(&quot;Commande executée avec succès&quot;);
	else    
		puts(&quot;Impossible d'executer la commande&quot;);
} zend_catch {
	printf (&quot;Exception %d&quot;, EG(exit_status));
} zend_end_try();
&lt;/pre&gt;

	&lt;p&gt;Enfin, on arrette php avec la commande suivante :&lt;/p&gt;
&lt;pre&gt;php_embed_shutdown(TSRMLS_C);&lt;/pre&gt;

	&lt;p&gt;Il ne manque plus qu'à inclure &lt;code&gt;php_embed.h&lt;/code&gt;, et on peut essayer de le compiler. Le programme complet d'exemple est disponible &lt;a href=&quot;http://www.the-asw.com/post/2005/05/02/articles/prog/phpembed1/main.c&quot;&gt;par ici&lt;/a&gt;&lt;/p&gt;

	
	&lt;h3&gt;Compilation&lt;/h3&gt;
	&lt;p&gt;Ca c'est la partie la plus galère, surtout quand rien n'est documenté. Je tiens d'ailleurs à remercier kermit, une star du Makefile, sans qui je ne serais sans doute jamais arrivé à compiler cette saloperie de programme.&lt;/p&gt;
	&lt;p&gt;En fait, &lt;code&gt;php_embed.h&lt;/code&gt; demande pleins d'autres fichiers d'entetes, situés un peu partout dans les sources de PHP. Il faut donc rajouter un paquet de paramètres d'inclusion à &lt;code&gt;gcc&lt;/code&gt;. Dans un makefile, ça donne :&lt;/p&gt;
&lt;pre&gt;
# chemin des sources de php
PHPPATH=/home/cgo2/documents/prog/php/php-5.0.2
PHPFLAGS=-I$(PHPPATH) -I$(PHPPATH)/Zend -I$(PHPPATH)/TSRM -I$(PHPPATH)/sapi/embed
&lt;/pre&gt;

	&lt;p&gt;Pour le linkage, il faut utiliser la lib que l'on a compilé :&lt;/p&gt;
&lt;pre&gt;
LDFLAGS=-L$(PHPPATH)/libs
LIBS=-lphp5
&lt;/pre&gt;

	&lt;p&gt;Le &lt;a href=&quot;http://www.the-asw.com/post/2005/05/02/articles/prog/phpembed1/Makefile&quot;&gt;makefile&lt;/a&gt; pour ce programme d'exemple n'est pas encore parfait, puisque trop de paramètres sont hardcodés, mais bon...&lt;/p&gt;
	
	&lt;h3&gt;Execution&lt;/h3&gt;
	&lt;p&gt;Premier test :&lt;/p&gt;

&lt;pre&gt;
$ ./monboprog
./monboprog: error while loading shared libraries: libphp5.so: cannot open shared object file: No such file or directory
&lt;/pre&gt;
	&lt;p&gt;Pas grave, il suffit d'ajouter le chemin de la libs dans la variable d'environnement qui va bien :&lt;/p&gt;
&lt;pre&gt;
$ export LD_LIBRARY_PATH=~/documents/prog/php/php-5.0.2/libs/
&lt;/pre&gt;
	&lt;p&gt;Et voila :)&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Il reste encore beaucoup à faire pour pouvoir embarquer facilement php : faciliter la compilation et le linkage (tout le monde n'a pas les sources de php sous la main), et également l'execution. Quant au code, dans un premier temps un découpage en fonctions permettant d'eviter de manipuler Zend directement s'impose. Il faut ensuite voir comment inclure des fichiers php, exporter des fonctions C pour les utiliser dans les scripts, etc... Mais au moins avec cet exemple vous pourrez dire : &quot;moi aussi j'ai réussi à embarquer php&quot; !&lt;/p&gt;

&lt;h3&gt;Quelques liens&lt;/h3&gt;
&lt;ul&gt;
			&lt;li&gt;LE programme sans lequel on aurait rien reussi : le
module php-irssi qui permet de script irssi avec php. Malheureusement
il n'y a aucun site officiel, et le projet semble mort. On peut encore
recuprer les sources sur le &lt;a href=&quot;http://cvs.php.net/embed/&quot;&gt;CVS de php&lt;/a&gt;&lt;/li&gt;
			&lt;li&gt;Un &lt;a href=&quot;http://www.phpconference.de/2003/slides/internals_track/wez_embedding-php.pdf&quot;&gt;PDF interressant&lt;/a&gt; par l'auteur de php-irssi
		&lt;/li&gt;&lt;/ul&gt;</description>
    
    
    
          <comments>http://www.the-asw.com/post/2005/05/02/7-mon-premier-programme-c-php#comment-form</comments>
      <wfw:comment>http://www.the-asw.com/post/2005/05/02/7-mon-premier-programme-c-php#comment-form</wfw:comment>
      <wfw:commentRss>http://www.the-asw.com/feed/rss2/comments/4</wfw:commentRss>
      </item>
    
  <item>
    <title>Compiler PHP avec le support embed</title>
    <link>http://www.the-asw.com/post/2005/04/02/6-compiler-php-avec-le-support-embed</link>
    <guid isPermaLink="false">urn:md5:64557adf05786537fa2f4fb1aa0ab6bf</guid>
    <pubDate>Sat, 02 Apr 2005 11:13:00 +0000</pubDate>
    <dc:creator>cgo2</dc:creator>
        <category>Programmation</category>
        <category>ligne de commande</category><category>php</category>    
    <description>Etant donné l'absence complete de documentation sur le module &quot;embed&quot; de php, les articles ont tous été écrit à partir d'un travail de reverse engeenering effectué par kermit et moi-même (cgo2), et donc peuvent se reveler incorrects et/ou incomplets. Evidemment, tout ceci est fait sous Linux.    &lt;p&gt;Première chose, nous allons recuperer les sources de PHP. A l'heure où j'écris cet article, la version la plus récente est la 5.0.2, disponible par ici : &lt;a href=&quot;http://www.php.net/downloads.php&quot;&gt;http://www.php.net/downloads.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Après avoir décompressé l'archive, il faut configurer PHP avant la compilation. Pour l'instant on ne compile que la base avec le module &quot;embed&quot; (pour les autres modules, je vous conseille d'aller lire la doc)&lt;/p&gt;
&lt;pre&gt;$ ./configure --disable-all --enable-embed&lt;br /&gt;$ make&lt;/pre&gt;
&lt;p&gt;La lib &lt;code&gt;libphp5&lt;/code&gt; (&lt;code&gt;.so&lt;/code&gt; et &lt;code&gt;.la&lt;/code&gt;) est placé dans le repertoire &lt;code&gt;libs/&lt;/code&gt;, nous en aurons besoin par la suite pour le linkage.&lt;/p&gt;
&lt;p&gt;Mais il va falloir également beaucoup de headers pour la compilation, gardons donc les sources de php intactes pour l'instant.&lt;/p&gt;
&lt;p&gt;Tout est pret pour écrire notre premier programme C/PHP&lt;/p&gt;</description>
    
    
    
          <comments>http://www.the-asw.com/post/2005/04/02/6-compiler-php-avec-le-support-embed#comment-form</comments>
      <wfw:comment>http://www.the-asw.com/post/2005/04/02/6-compiler-php-avec-le-support-embed#comment-form</wfw:comment>
      <wfw:commentRss>http://www.the-asw.com/feed/rss2/comments/3</wfw:commentRss>
      </item>
    
</channel>
</rss>