YAML. Son nom est l’acronyme de la phrase auto-référente « YAML Ain’t Markup Language ». Truc de geeks, donc. Mais il ne faut pas s’arrêter à ça !
Définition
YAML se définit comme « un standard de sérialisation de données pour tous les langages, facile à utiliser pour les humains ».
— standard : signifie qu’il n’y a pas d’approximation ou d’hésitation à avoir sur le contenu écrit en YAML.
— sérialisation de données : consiste à transformer une structure de données simple ou complexe en un fichier texte. Qu’il s’agisse d’une chaîne de caractères, d’un tableau, d’une liste de tableaux, d’un objet... toute variable peut être écrite sous forme d’un document YAML.
— tous les langages : YAML existe déjà en C, Java, Python, Ruby, Perl, Javascript, etc. Son implémentation en PHP est cependant encore relativement faible.
— human-friendly : c’est le plus important à mes yeux. Une structure de données transposée en YAML est très agréable à lire, facile à comprendre, et surtout facile à éditer.
Comparaison sur un exemple
Grâce à son incomparable API, le site per.sonn.es
propose plusieurs affichages possibles du profil de ses membres, ce qui va nous permettre de les comparer :
XML est la reine des formats de sérialisation. Un fichier XML, ça fait pro. Mais ses désavantages sont nombreux : c’est verbeux (chaque bloc ouvert doit être fermé), fragile (si on l’édite à la main, on a toutes les chances de le rendre invalide), complexe (ajouter un élément relève de la pratique divinatoire). Voici le profil de Jean Valjean dans la syntaxe XML/RDF : http://per.sonn.es/Jean+Valjean.rdf
JSON est la représentation des données sous forme de variable javascript. Elle est beaucoup plus légère que XML, et a l’avantage de se traiter de façon très simple en... javascript, ce qui en a fait la star des mashups du Web 2.0. Inconvénients : les commentaires sont formellement interdits ; les caractères accentués se codent sous la forme
\u00e9
; un array
transcodé en JSON puis décodé peut devenir un object
. http://per.sonn.es/Jean+Valjean.json
YAML pour sa part est lisible, voire même esthétique, tout en étant concis et facile à éditer à la main. Un bon dessin valant mieux qu’un long discours, voici : http://per.sonn.es/Jean+Valjean.yaml
Utilisations possibles
YAML est parfois présenté comme un format de choix pour enregistrer des fichiers de configuration. Par exemple, pour configurer deux connexions à des serveurs SQL, on peut écrire le YAML suivant :
# dev server
development:
adapter: mysql
database: 125moz
username: root
password: x0089
socket: /tmp/mysql.sock
# prod server
production:
adapter: mysql
database: 178moz
username: root
password: x672323
socket: /var/run/mysqld/mysqld.sock
Il n’est pas besoin d’une expérience informatique très profonde pour voir tout de suite que ce texte comporte des commentaires (cachés derrière le symbole #
), et deux listes de propriétés, l’une nommée development
, l’autre nommée production
.
YAML peut aussi servir de format d’échange de données entre deux programmes : l’API de per.sonn.es
en montre un exemple.
YAML est aussi un format à envisager pour la sauvegarde de données, destinée par exemple à une édition hors-ligne. Si per.sonn.es
proposait de modifier un profil, il suffirait à Jean Valjean d’enregistrer la page http://per.sonn.es/Jean+Valjean.yaml, de l’éditer, puis, une fois son C.V. peaufiné, de renvoyer le texte édité au format YAML vers le site, pour faire la mise à jour de son profil.
Expressivité
Bien que très simple à lire, YAML offre une expressivité très complète. Il est en effet possible d’exprimer, toujours avec la même simplicité, des choses qui sont souvent complexes, voire impossibles, à réaliser dans les autres formats : données « binaires » tels que des images (penser à l’horrible
<![CDATA[ ... ]]>
de XML) ; adressage d’une donnée par référence (voir l’écriture
&id001 / *id001
sur le fichier http://pygments.org/demo/1513/ ; les objets se sérialisent aussi bien que les listes et tableaux.
Références Web
Le site officiel : http://yaml.org/
YAML 1.2, spécification complète (avec des exemples) : http://www.yaml.org/spec/1.2/spec.html
tutoriel rapide : “Can You Learn YAML in Five Minutes ?” http://yaml.kwiki.org/?YamlInFiveMinutes
Reference Card, tout YAML en une page (elle-même écrite en YAML) : http://yaml.org/refcard.html
Implémentation PHP
Utilisant beaucoup PHP je me suis tourné vers l’implémentation de YAML faite par Fabien Potencier pour Symfony : elle est facile à installer et, bien que n’implémentant pas toutes les spécifications, semble fonctionner raisonnablement bien pour des structures simples (des tableaux de chaînes de caractères, par exemple), à condition que le fichier ne soit pas trop gros.
Le site Symfony YAML permet de télécharger ce composant indépendamment du reste de Symfony : http://components.symfony-project.o....
Pour charger en mémoire une structure sérialisée dans un fichier il suffit de deux lignes de code :
require_once('/chemin/vers/lib/yaml/sfYaml.class.php');
$conf = sfYaml::load('conf.yaml');
Pour faire l’opération inverse (bien pratique pour convertir des données qu’on vient de lire depuis un autre format) :
require_once('/chemin/vers/lib/yaml/sfYaml.class.php');
$text = sfYaml::dump($conf);
fwrite(..., $text);
Je viens aussi de packager cette librairie sous la forme d’un plugin SPIP qui fournit deux fonctions : yaml_encode()
et yaml_decode()
.
Conclusion
Avec tous ces avantages, YAML est désormais mon format de prédilection pour tout ce que je faisais alors avec des « petits fichiers texte ad hoc ».
Pour modérer cet enthousiasme, il faut toutefois reconnaître deux faiblesses : l’absence de documentation en français, et le support médiocre de YAML en PHP. Deux points qui pourraient être améliorés rapidement.
5 Messages de forum