Wed Apr 07 2010

C++

c++, standard

2 comments

Un point sur les C++0x Core Language Features

Le Visual C++ Team Blog vient de publier une table listant les features de C++0x C++11 qui seront disponibles dans Visual Studio 2010.

Le site de GCC met à disposition un document similaire pour son compilateur. Le wiki d'Apache propose également un tableau mettant en concurrence divers compilos.

Les variadic templates (pdf) ne seront donc pas supportées dans VS2010. C'est fort dommage, car elles font partie des features incontournables, et j'oserai même dire emblématiques, du prochain standard C++.

Naïf, peut être, candide, surement, gros noob (aussi), j'avais espéré que Microsoft finisse par les implémenter à temps pour la release de leur produit. Après tout, si on regarde la liste, VS2010 fournira une bonne part des grosses nouveautés, celles qui sont vraiment catchy, à commencer par les lambda expressions (pdf), les rvalue references ou encore, le must, les right angle brackets ;)

Fri Mar 19 2010

C++, Programming

boost, c++, json, r8t, spirit, template, v8, variant

2 comments

r8t, un moteur de template pour C++ à base de javascript

L'idée de base, mais vraiment de base, consiste à clamer à qui veut bien l'entendre que JSON est un format idéal pour passer des données à un système de Vue, comprendre View, dans un MVC. Ce format a tout ce qu'il faut: simple, compact, expressif et connu de tous, ou presque.

Le constat de base, mais vraiment de base (oui vous savez), c'est qu'il y a très peu de systèmes de template pour C++ qui ont un penchant web, c'est à dire principalement orientés génération de HTML. Je ne sais pas pourquoi, peut être parce que tout le monde s'en fout ? ;) Toujours est-il que lorsque je me suis mis en recherche d'un tel système de template, pour des besoins perso, je n'ai rien trouvé d'autre que Clearsilver et google-ctemplate. Il me fallait un truc standalone et léger. J'aurai pu chercher un peu plus, mais je me suis arrêté là, pas vraiment convaincu.

C'est là que je me suis souvenu de l'idée de base: JSON. En fait ça tombait bien puisque j'utilisais déjà le moteur javascript V8 dans mon projet. Cet engine, initialement conçu par google pour le navigateur Chrome, est open source et son API est en C++. L'idée qui a commencé à émerger est la suivante:

  • On balance du "JSON" au système de template
  • La logique de présentation est controllée par javascript
  • Le système crache du text en retour (principalement du HTML)

Sympa. Reste plus qu'à implémenter ça.

Le JSON, expédié avec une technique à base de Boost.Variant récursif que j'ai présenté dans ce billet Simple modélisation de JSON en C++.

Le javascript qui controle la logique de présentation est embarqué dans les templates sous une forme proche d'un mix de Django et de la syntaxe alternative de php.

{% for (i in posts) : %}
  <div class="post">
    <h2>{%= posts[i].title %}</h2>
    ...
  </div>
{% end %}

Le principe c'est que tout ce qui est entre {% ... %} est grosso modo du javascript qui sera inchangé avant de le donner au moteur js. Une phase de parsing transforme le fichier de template (ou n'importe quel text) en une forme intermédiaire qui sera consumée par V8. Pour l'exemple ci-dessus, cela donne quelque chose proche de ceci:

for (i in posts) {__pr('  <div class="post">\n    <h2>');
__p(posts[i].title);__pr('</h2>\n    ...\n  </div>\n');};

Le parser est écrit avec la librairie Boost.Spirit Classic. __p() pour "print" et __pr() pour "print raw" sont des fonctions javascript dont l'implémentation est en C++ et qui permettent de controller la sortie textuelle finale, par exemple en appliquant des filtres d'échappement automatique pour du HTML. Ces filtres sont inspirés des modifiers de google-ctemplate. Du genre {%:h:s= comment %} pour un filtre h qui échappe du HTML et un autre s qui permet de wrapper des snippets entre des éléments <pre>.

Ce qui est sympathique c'est qu'il est possible de transformer des sources javascript textuelles en un byte code propre à V8. C'est dans l'API. On peut donc mettre en cache des templates pre compilées, un peu comme le fait APC pour php, mais ça dépote encore plus! J'avais effectué quelques benchmarks qui laissaient penser que ce moteur de template à base de V8 était plus véloce que php+APC. Il faudrait que je mesure ça plus sérieusement.

A vrai dire ce projet de système de template a été codé à l'arrache courant novembre 2009. Un simple proof of concept à l'origine. Les dernières librairies de Boost notamment Spirit 2 (ça tue!), Phoenix 2 et Fusion 2 (OK, beaucoup de 2) m'ont donné envie de réécrire un tel système. J'héberge le truc sur github. Je lui ai donné le joli nom de r8t, réunion de rat et V8. Pour l'instant, c'est succinct. Pourquoi rat? Parce que ;)

Thu Feb 25 2010

PHP

hiphop, php

9 comments

HipHop, 32-bit et github

HipHop sur github, ca se présente plutôt pas mal. Une petite communauté de forkers travaille à rendre la chose compilable et surtout utilisable par le plus grand nombre (pour le bien de l'humanité?). Scott MacVicar, un des responsables du projet et commiter en chef sur github, semble bien disposé à appliquer les patches et suggestions qui gravitent autour du truc. Ca le fait.

A propos de fork, je viens de mettre le mien à jour. Sans vouloir jouer les caïds (loin de moi cette idée saugrenue ;) je pense que c'est celui qu'il faut puller si vous souhaitez installer le matos sur une machine 32-bit. Car, je le répète, HipHop est 64-bit only, au moins pour un certain temps. De plus, je n'ai rien ajouté ou modifié à l'artillerie de CMake par rapport au code de facebook pour que le wiki officiel concernant la partie installation reste pertinent.

Un conseil: Installer les dépendances à la main, c'est à dire en récupérant les tarballs sur leurs sites respectifs. Ensuite, procédez aux installations avec un --prefix=$HOME/hiphopdep (ou un truc du genre). Le principe est de placer ces dépendances dans un répertoire isolé et ne rentrant pas en conflit avec quelque système de packages que ce soit. De toute manière il vous faut patcher libcurl et libevent, on n'y coupera pas. Une fois que tout est soigneusement installé, bien penser à mettre $HOME/hiphopdep/bin dans votre PATH (si vous avez installé des programmes tels que re2c ou flex) et faire un export CMAKE_PREFIX_PATH=$HOME/hiphopdep avant de lancer CMake. Normalement, ça devrait bien se passer.

Maintenant, à part compiler le bordel, compiler du php et lancer des servers ou des daemons, je n'ai pas encore eu le temps de vraiment me pencher sur ce que fait HipHop et comment ça marche, autre que les généralités librement disponibles.

Avec un peu de chance, je devrai avoir du temps dans les prochains jours pour m'adonner à l'un de mes hobbies, à savoir glandouiller devant des lignes de codes et attendre qu'une idée ou une illumination surgisse comme par enchantement. Elle est pas belle la vie ? ;)

Sun Feb 21 2010

PHP

hiphop, php, slackware

0 comment

Compiler HipHop sur du 32-bit

Je rentre du taff (oui je bossais ce samedi), et que vois-je, les sources de HipHop sont dispo sur github! C'est cool. J'ai donc entrepris de tester la bête mais ce ne fut pas sans embuches...

A la base ma machine de jeux est un Macbook Pro 13" avec OSX 10.6. Ayant parcouru le wiki ces jours précédents, je savais que je n'allais pas tenter d'installer le bordel sur OSX à cause de libcap. En effet, imposible d'installer cette lib qui est trop linux-centric. Par contre, sous le coude j'ai un server qui tourne sous Slackware en 32-bit. Un des avantages de Slackware est que si ça merde, alors c'est de notre faute. Cette distrib est très archaïque et c'est la raison pour laquelle je l'ai choisi: j'aime bien quand ça merde ;)

Et ça a merdé quand même pas mal.

Pour les dépendances, pas de problèmes. Bien penser à patcher libcurl et libevent avec les diffs fournis dans le source tree de HipHop. Le plus gros problème a consisté à trouver le lien pour choper les sources de Intel® Threading Building Blocks (Intel® TBB). Un sacré paquet de ®, désolé. Et bien le lien le voila. Prendre le .src.tgz.

Ensuite, il suffit de suivre le wiki, puis on arrive au moment où on lance cmake. Si ça commence à déconner chez vous à partir de là, ne pas hésiter à modifier les fichiers concernés dans le répertoire CMake pour que le système puisse correctement trouver vos librairies. Au préalable, bien penser à définir CMAKE_PREFIX_PATH comme stipulé dans le wiki.

Ensuite, make. Là bison 2.4 générait des erreurs pour cause de grammaires mal formées. Il y a plusieurs oublis de ";" dans divers fichiers y. Les lignes concernées sont indiquées dans les messages.

Le gros du travail ensuite a été de fixer de manière incrémentale (make, erreur, fix, make, ok, erreur, fix, make...) toutes les parties du code qui concerne le 64-bit parce que, en fait, HipHop est 64-bit only à l'heure actuelle. Franchement j'ai passé 3 heures à faire ça. Relancer make à chaque fois. Ca m'a tellement gonflé que de une, mes corrections sont plus qu'hasardeuses, et de deux, je n'ai pas pris soin de glisser des #ifdef/#endif pour conserver le code original et pouvoir jouer avec des defines. Au début, trop optimiste probablement, j'ai pensé que seul util/hash.h était concerné. Une grossière erreur ;) Pour info, une bonne partie des fixes consiste à ajouter le suffix ll aux literals, ainsi que de transformer des ssize_t en long int [1].

Finalement, et là je peux vous dire que je balisais, le linker a paqueté tout ça sans encombre. J'en avais plein le cul. J'ai pushé sur github mes modifs temporaires et d'ailleurs au moment où je rédige ce billet, d'autres forks pour 32-bit sont en cours d'élaborations.

Un echo "hello world, bastard\n" vaut mieux qu'un long discours:

Hello world from HipHop

[1]: J'ai repris mes modifs et wrappé les parties concernées entre #ifdef/#endif. C'est censé compiler indifféremment sur 32 ou 64-bit. Mon fork a été mis à jour.

« newer older »