Une critique du Lua

Laurent proposait dans l’un de ses articles une critique d’une vingtaine de langages de programmation. Parmi ceux-ci, le Lua était présenté très brièvement. Je propose ici de développer un peu sur ce langage.

Il s’agit donc d’un langage particulièrement léger, qui s’intègre très facilement dans un projet, et qui bénéficie d’une documentation claire et d’une communauté relativement active.

Comme l’indique Laurent, le Lua est multi-paradigme. S’il se présente au premier abord comme un langage impératif, on peut également faire de l’objet (au prix de l’utilisation d’une bibliothèque) et il dispose de plus de tous les outils pour faire du fonctionnel (il me semble juste que l’on ne peut pas faire simplement de curryfication). Du point de vue de la syntaxe, c’est un langage très agréable qui permet d’exprimer les choses de façon très succincte. Ainsi on peut itérer sur un tableau avec un « foreach », on dispose de fonctions locales, il n’y a pas de point-virgule de fin de ligne, pas de parenthèses superflues…

Par contre c’est un langage qui souffre d’un très gros laxisme du point de vue du typage. Il est en effet typé (dynamiquement) dans le sens où l’on peut demander le type d’une variable, mais dans de nombreux cas si l’on utilise une variable d’un type au lieu d’un autre, elle est transtypée sans que cela pose de problème au langage. De plus on ne peut pas imposer le type attendu par une fonction, mais juste le vérifier à l’exécution. Enfin si l’on tente d’accéder à une variable qui n’existe pas, par exemple suite à une faute de frappe, cela ne gène pas le moins du monde le langage, qui renverra « nil » (valeur valide pour une variable). Naturellement c’est source de beaucoup d’erreurs, décelées seulement à l’exécution de la branche erronée.

Autres choix qui ne me plaisent pas : le fait que les variables soient globales sauf contre-indication explicite, et que les opérateurs logiques « or » et « and » qui, contrairement à ce que l’on pourrait attendre d’un langage moderne, ne renvoient pas un booléen mais l’opérande déterminante.

Du côté des outils fournis, le langage se veut doté d’un système de table très puissant, et s’il est vrai qu’il est pratique dans les cas simples, on en trouve très vite les limites. Par exemple on ne dispose pas de reverse-iterator, et en écrire un s’avère laborieux. De même, la fonction permettant de compter les éléments d’une table est en fait une sorte de hack qui ne fonctionne que pour les tables indexées, en renvoyant le plus grand indice consécutif. Si l’on veut une fonction sérieuse pour connaître cette information, on doit donc l’écrire. Le langage se veut également doté d’une gestion de chaînes puissantes. Pourtant la documentation explique que les expressions rationnelles ne sont pas POSIX pour des raisons de quantité de code nécessaire. Au final filtrer des motifs devient vite pénible dès que l’on sort des cas d’école, et l’ajout d’une nouvelle syntaxe maison vient perturber le principe de moindre surprise.

Enfin du point de vue des performances, le langage se place apparemment plutôt bien pour un langage interprété. Il est notamment possible de faire de la compilation just-in-time et d’atteindre ainsi des performances très correctes. Cela dit elles restent plombées apparemment par le typage dynamique. Un simple appel de fonction se révèle être déjà coûteux. Du point de vue de la gestion de la mémoire, il est assez difficile de savoir ce que l’interpréteur fait, mais il semblerait qu’il ne sache pas tirer parti du fait qu’une fonction est souvent appelée pour optimiser l’allocation de ses variables locales. À vérifier cela dit.

En conclusion c’est un langage très pratique, vivant, facilement intégrable, avec une syntaxe relativement agréable, mais qui souffre d’un trop grand manque de rigueur.

Dessine-moi une photo

C’est avec près de deux ans de retard que je viens de découvrir retrievr, un site qui propose de parcourir des photos du site Flickr en dessinant grossièrement ce que l’on cherche.

Bien que l’interface soit assez basique, après quelques tests j’ai pu obtenir très rapidement des photos de chat, d’oeil, de coucher de Soleil, d’éclipse solaire, de tournesol, et de bouche. J’avoue par contre avoir peiné à obtenir une photo de paysage de colline verdoyante, et n’avoir trouvé aucune photo de Jupiter. La majorité des images ne correspondent d’ailleurs généralement pas à ce que l’on cherche, mais force est de constater que ce que l’on cherche s’y trouve en quelques coups de pinceau (la recherche se faisant à mesure que l’on dessine). Cela dépend sans doute aussi du talent artistique de chacun. ;-)

Mais outre la facilité à trouver des sujets en particulier, les autres images renvoyées sont souvent très pertinentes. Enfin que le tout fonctionne en temps interactif dans une interface web est impressionnant je trouve.

Apparemment le fonctionnement semble reposer sur une base d’images déjà analysées, mais ce serait vraiment intéressant de voir un tel outil indexer des images au fur et à mesure de leur arrivée par flux de syndication. Le fait de pouvoir (enfin) rechercher des images par apparence plutôt que par tag est en effet vraiment agréable.

En tout cas voilà encore un bon moyen de perdre son temps. :-)

Jeu vidéo de calcul mental

Nintendo se distingue depuis quelques temps en sortant des consoles et des jeux reposant sur des concepts quelque peu nouveaux, dans l’univers très établi du jeu vidéo. Son jeu éducatif, « Programme d’entraînement cérébral du Dr Kawashima » fait partie de cette nouvelle vague de jeux. Très circonspect à priori, j’ai eu par hasard l’occasion de voir un ami jouer à ce fameux jeu, et je suis resté stupéfait.

Une bonne part des exercices proposés tient du calcul mental, comme par exemple calculer aussi vite que possible des sommes, différences, produits et quotients. Et la vitesse à laquelle il donnait les réponses était très nettement supérieure à celle à dont on fait typiquement preuve devant des questions de cet ordre. Après quelques minutes de test, alors que mon niveau est pourtant relativement catastrophique, je commençais déjà à anticiper les opérations, comme s’il s’agissait d’un Tetris.

Finalement, le calcul mental n’est pas différent de Tetris, Quake 3, ou DDR : il suffit de s’entraîner pour atteindre rapidement un niveau impressionnant. Oh bien sûr, c’est défoncer une porte grande ouverte que de dire cela, mais d’avoir constaté à quel point cela peut aller me laisse songeur. Il faudrait que j’y joue plus souvent. :-)

N’ayant cependant pas l’intention de faire l’acquisition d’une DS, je me suis amusé à écrire rapidement ce petit script pour essayer. À tester dans votre shell. ;-)

#!/bin/sh
max=20
operators=("+" "-" "*" "/" "%")
range=`expr 2 * $max + 1`
passed=0
total=0
while true; do
  a=`expr "$RANDOM" % $range - $max`
  b=`expr "$RANDOM" % $range - $max`
  operator=${operators[`expr $RANDOM % 5`]}
  if ( test "$operator" == "/" || test "$operator" == "%" ); then
    while test "$b" -eq 0; do
      b=`expr "$RANDOM" % $range - $max`
    done
  fi
  echo -n "$a $operator $b = "
  read input
  result=`expr "$a" "$operator" "$b"`
  total=`expr $total + 1`
  if test "$input" -eq "$result"; then
    passed=`expr $passed + 1`
    echo "OK ($passed/$total)"
  else
    echo "KO -> $result ($passed/$total)"
  fi
  echo
done

A venir

La fonctionnalité <code> n’aura mis que peu de temps avant de décevoir le nouvel utilisateur de WordPress que je suis : la première tentative d’utilisation aura suffit. Je voulais poster un billet ridiculement court avec quelques lignes de shell, et il n’y a manifestement pas moyen de voir ces lignes sortir un tant soit peu correctement à la publication. Allant probablement vouloir insérer d’autres bouts de code, je me documente donc sur les plugins existants.

La page ci-liée propose une comparaison brève mais efficace de plusieurs d’entre eux, et conseille finalement l’utilisation de ce plugin de coloration syntaxique. Le billet actuellement en file d’attente devrait donc paraître bientôt, le temps que je teste par moi-même. :-)

Trésor d'ergonomie

C’est lors d’un séjour au Japon que j’ai eu l’occasion de découvrir l’interface qui m’a le plus marqué d’un point de vue ergonomique et même technique d’une façon générale. Cette interface, c’est le distributeur de ticket de train et de métro que l’on trouve en de nombreux exemplaires dans n’importe quelle station JR. Ce système est tout simplement une merveille d’ergonomie, et son cahier des charges ainsi que celui du composteur pourraient tenir sur un simple bout de papier : « Il faut que ça marche ».

Distributeur de ticket de train et métro

Comme on le devine sur la photo, l’écran est tactile. Bien que ce ne soit pas très visible sur ce cliché, il affiche les tarifs disponibles. Au Japon, le prix d’un ticket dépend en effet de la destination. Au dessus des distributeurs se trouve un plan du réseau JR avec la station où l’on se trouve clairement indiquée en rouge, et pour chaque autre station un nombre que l’on comprend aussitôt être le prix pour s’y rendre.

Le problème classique d’ergonomie qui se pose alors généralement est de définir l’ordre des opérations à effectuer pour obtenir son ticket. Sans doute avez-vous déjà vu un distributeur avec des pictogrammes ou des explications numérotées. Rien de tout cela ici : les concepteurs ont décidé de résoudre ce problème de façon cavalière, en permettant aussi bien de choisir d’abord son ticket pour ensuite insérer un moyen de paiement, que d’insérer un moyen de paiement en premier et de choisir le ticket ensuite, auquel cas les boutons deviennent disponibles à mesure que l’on insère de la monnaie. Dans les deux cas, la somme insérée est indiquée clairement par un petit affichage rouge.

Lorsque l’achat est validé, c’est à dire lorsque suffisamment de monnaie a été insérée dans le premier cas, ou lorsqu’un tarif a été indiqué dans le second, le ou les tickets arrivent immédiatement tandis que les fentes pour insérer de l’argent se bloquent et que la monnaie est rendue. Le paiement lui même peut se faire avec de la monnaie, des billets, ou encore d’autres moyens que je n’ai cependant pas eu l’occasion de tester.

Notez la largeur imposante de la fente prévue pour les pièces. Pas question d’insérer les pièces une par une, ce serait faire perdre du temps à l’usager et augmenter les files d’attentes ! J’ai testé avec succès l’insertion simultanée de neuf pièces : la machine n’a pas bronché, même s’il faut reconnaître qu’elle a mis quelques secondes à compter la somme insérée. Je n’ai cependant pas eu l’audace de tester l’insertion simultanée de plusieurs billets, mais je ne serais aucunement surpris que cela fonctionne également.

Notez également les boutons sur la gauche : là non plus je n’ai pas eu l’occasion de tester chacune des fonctionnalités de ce système, mais il est manifestement possible de préciser combien de tickets l’on veut, dans le cas d’un groupe de personnes. C’est un petit rien qui fait gagner un temps précieux.

Pour finir, une parenthèse sur le portique de compostage : cette machine se présente, sans surprise, comme un bloc séparant deux passages, et comporte une fente clairement visible sur le front pour insérer son ticket, et une fente sur le dessus pour le récupérer. Ce qui est plus surprenant déjà est la taille de ces fentes : environ cinq centimètres, alors que le ticket a un format comparable à celui de n’importe ticket de bus ou de métro en France. Cela s’explique simplement par le fait qu’il existe des tickets de plus grande taille (abonnements, etc.), pratiquement au format carte de crédit.

Mais alors comment se comporte cette machine lorsqu’un ticket de petite taille est inséré n’importe comment, dans le chaos des heures de pointe ? Et bien la réponse est simple : elle se comporte de façon étonnamment robuste. Après avoir testé l’insertion du ticket dans un sens et dans l’autre, j’ai également testé l’insertion du ticket de travers, à 45° ou carrément à 90° : absolument aucun problème ! Finalement la seule chose que je n’ai pas testé est l’insertion d’un ticket plié : il ne faut pas abuser non plus. Et en ce qui concerne les groupes, je n’ai pas vérifié mais il semblerait que l’on puisse insérer tous les tickets à la suite et que le portique s’ouvre pour le bon nombre de personnes.

Alors devant une conception aussi soignée et rigoureuse, je suis absolument admiratif, d’autant plus que ma culture technique me laisse entrevoir la quantité de travail que cela représente.