Journal À propos du langage APL et portage de TapTempo en bonus

Posté par (page perso) . Licence CC by-sa
Tags :
21
11
mar.
2018

Sommaire

Cher Nal,

Connais-tu le langage APL ? Il s'agit d'un langage, ou plutôt d'une notation Unicode, inventée par Kenneth Iverson et permettant d'effectuer facilement des calculs globaux sur des tableaux (à une ou plusieurs dimensions).

Introduction

L'idée d'effectuer des calculs globaux sur des tableaux n'est pas si différente de ce que l'on peut trouver dans R ou autres langages similaires plus connus des statisticiens, mais elle est poussée à son extrême dans APL. Là ou Scheme représente un effort pour tout construire à partir de briques de base manipulant des listes à la Lisp, APL représente un effort pour tout construire à partir de briques travaillant sur les tableaux multi-dimensionels. D'autres efforts similaires (ultérieurs) existent, comme le langage J inventé par la même personne (j'avais fait un journal il y a quelques années), ou le langage K pour lequel il existe une implémentation libre (assez basique). Ces langages, contrairement à APL, n'utilisent que des caractères ASCII, ce qui les rend à la fois plus faciles à écrire, mais moins lisibles, intuitifs et mnémotechniques ; il y a d'autres différences plus techniques également, comme la programmation tacite en J (parfois très — trop — dense).

Malgré le fait que le langage ait une cinquantaine d'années, il n'a, me semble-t-il, pas beaucoup percé en dehors de quelques niches (finance), sans doute pour diverses raisons : pas d'implémentation libre pendant longtemps, langage pas assez généraliste, utilisant lourdement l'Unicode, paradigme très éloigné des langages courants, etc. Ça veut dire, entre autres, une absence assez frappante de bibliothèques, donc assez inutilisable pour beaucoup d'applications. Ceci dit, APL reste quand même au minimum un super calculette, et facilement disponible grâce à l'implémentation libre GNU APL, relativement jeune, mais qui semble assez mûre et s'intègre bien dans notre environnement plus unixien (mieux que les implémentations libres de J et K, je dirais).

APL est un langage à la fois impératif et fonctionnel sur certains aspects. Impératif, car on fait un usage intensif de variables dont le contenu peut changer, et c'est également un langage très dynamique (même si typé fortement). Mais c'est aussi un langage fonctionnel, car on retrouve dans les primitives du langage des opérateurs pour fold, map, etc. — sous une forme assez particulière — et que toutes les primitives sont pensées d'une façon fonctionnelle : elles prennent des tableaux en entrée et en renvoient des nouveaux, sans modifier les originaux.

Quelques exemples

Le langage est pensé pour être utilisé facilement de façon interactive et dispose d'une invite de commande. Par exemple, la commande suivante, utilisant la fonction iota ι crée un tableau de dix éléments de 1 à 10.

      ι 10
1 2 3 4 5 6 7 8 9 10

Il est possible d'effectuer des opérations sur ce tableau. Par exemple, multiplier tous les éléments par 2 (map implicite).

      2 × ι 10
2 4 6 8 10 12 14 16 18 20

On peut également faire la somme de ces éléments en utilisant l'opérateur de réduction (fold) / appliqué à la fonction + :

      +/ 2 × ι10
110

Ce genre de calculs ne surprendra pas les utilisateurs de R ou Octave (à part la façon avec laquelle on applique la fonction d'ordre supérieur fold). Mais APL a d'autres atouts dans la manche. Par exemple, la commande suivante calcule une table de multiplication pour les nombres entre 1 et 4 en utilisant l'opérateur de produit extérieur.

      { ⍵ ∘.× ⍵ } ⍳ 4
1 2  3  4
2 4  6  8
3 6  9 12
4 8 12 16

Les accolades permettent de construire une fonction anonyme comme dans d'autres langages (Ruby, Perl6). La lettre omega par contre est le nom par défaut de l'argument de la fonction.

Voilà par exemple un aide mémoire sur la plupart des commandes que l'on peut trouver dans APL. On trouvera donc, en particulier, un grand nombre de fonctions permettant d'effectuer des transpositions, rotations, partitions, etc., mais aussi un certain nombre d'opérateurs d'ordre supérieur (c'est-à-dire qui prennent une fonction en paramètre).

TapTempo

Nous allons maintenant donner un vrai exemple pour résoudre un problème éxotique assez méconnu par ici :)

En fait, les fonctionnalités d'APL ne sont pas particulièrement mises en avant dans cet exemple, mais c'est intéressant également, car ça montre comment se dépatouiller avec GNU APL avec un problème pas trop mathématique. Comme APL utilise des symboles assez peu courants, il est très probable qu'avec une police normale certains caractères ne s'affichent pas correctement, je mets ça donc en image !

TapTempo

Voilà le fichier source du script aussi, pour pouvoir tester plus facilement (apl -f taptempo.apl ou ./taptempo.apl). Le programme ne gère pas d'options en ligne de commande (il est possible d'accéder aux arguments avec GNU APL, mais il ne semble pas y avoir de bibliothèque pour les options). Par ailleurs, je ne sais pas comment s'y prendrait un vrai programmeur APL, mais sans doute mieux, ça fait à peine quelques jours que j'apprends un peu APL :)

  • # Didactique

    Posté par (page perso) . Évalué à 3. Dernière modification le 11/03/18 à 22:36.

    Merci pour cette version très didactique. J'ai testé avec GNU APL et ça a l'air de bien fonctionner !

    Avec tous ces caractères Unicode j'ai l'impression de jouer à Dwarf Fortress ;-)

    [Au passage, il y a quelques phrases marrantes sur la page Wikipédia à la rubrique Quelques_opinions.]

    • [^] # Re: Didactique

      Posté par (page perso) . Évalué à 3. Dernière modification le 12/03/18 à 09:03.

      Avec tous ces caractères Unicode j'ai l'impression de jouer à Dwarf Fortress ;-)

      Maintenant que tu le dis, ça me fait penser à Brogue :)

      Au passage, il y a quelques phrases marrantes sur la page Wikipédia à la rubrique Quelques_opinions.

      Celle de Dijkstra est marrante, mais c'est pas trop surprenant venant de lui, il avait l'habitude de sortir des phrases comme ça sur tout et n'importe quoi. Entre autres, il y a aussi FORTRAN, Cobol, la programmation objets, etc. qui prennent cher :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.