GNU APL

langage de programmation

GNU APL est une implémentation du langage APL, libre et gratuite, sous licence GNU GPL. Sa version 1.0 avait été annoncée le . Sa version 1.9 le . Cette implémentation est utilisable sous GNU/Linux, MacOS, Cygwin et Windows Subsystem for Linux.

GNU APL

Description de l'image GNU APL.png.
Informations
Développé par Jürgen Sauermann
Dernière version 1.9 ()
Dépôt svn://svn.savannah.gnu.org/apl/trunkVoir et modifier les données sur Wikidata
Écrit en C++Voir et modifier les données sur Wikidata
Système d'exploitation GNU/Linux et BSDVoir et modifier les données sur Wikidata
Type Interprète
Paquet GNUVoir et modifier les données sur Wikidata
Licence GPL
Site web www.gnu.org/software/apl

Appel de GNU APL depuis une console. La police APL n'étant pas encore installée, seuls les caractères accessibles sur un clavier ASCII normal ont été utilisés pour ce test d'installation (pas de , , , , , , , ,÷, ×,, , ...).
GNU APL traite les nombres complexes. Ici, calcul de ei x pi; conforme à la formule d'Euler. 0J1 signifie i : partie réelle 0, partie imaginaire 1.

Elle implémente le standard ISO 13751, "Langage APL étendu", comportant en conséquence les tableaux de tableaux. Les bases du langage lui-même se trouvent dans l'article APL (langage).

Elle gère les nombres complexes et les variables partagées qui permettent à un espace de travail de communiquer facilement avec le monde extérieur. Elle rend même possible à qui le désire d'utiliser APL comme langage de script (sous Linux, par exemple, avec un #! apl ou #! /usr/bin/apl en tête du fichier), ainsi que d'exécuter depuis sa version 1.9 des instructions APL depuis un programme C !

Généralités

modifier

GNU APL comportait, en , 60 000 lignes de code C++[1]. Quelques espaces de travail (workspaces) sont fournis en standard, conservés soit sous forme éditable xml, soit sous forme de dumps binaires (PSYS) bien plus rapides à charger. La commande )LIBS permet d'en avoir la liste. Il est possible aussi de stocker ou de lire un espace de travail en APL Transfer Form (ATF) telle que définie par IBM, au moyen des commandes )OUT et )IN, pour échanger des espaces de travail avec des interpréteurs différents ; toutefois aucun espace de travail n'est fourni au départ sous cette forme.

La gestion des variables partagées (⎕SVO, ⎕SVR, ⎕SVC, ⎕SVS, ⎕SVQ) est implémentée. Deux espaces de travail peuvent ainsi communiquer à condition d'être pour le moment (2016) sur la même machine.

Les processeurs auxiliaires AP100 (envoi de commandes système à l'hôte et lecture des réponses) et AP210 (lecture et écriture de fichiers) sont fournis avec leurs sources (en C) à titre d'exemple. L'utilisateur peut également étendre facilement GNU APL avec ses propres fonctions externes écrites en C.

Dans cette implémentation, les entiers comme les réels sont représentés sur 64 bits. Cela permet de travailler sans problème avec des entiers de 19 chiffres et correspond pour les réels à la double précision habituelle des calculs sur stations de travail scientifiques.

La version 1.4 (2014) a permis de communiquer avec des bases des données MySQL et PostgreSQL.

La version 1.5 (2015) utilise de plus le parallélisme des microprocesseurs multi-cœur.

La version courante est la 1.9 (2024) qui permet d'exécuter des instructions APL depuis un programme C, en construisant l'interpréteur comme une bibliothèque libapl. Voici un exemple fourni avec le package :

#include "apl/libapl.h"
int main(int argc, char * argv[])
{
   init_libapl(argv[0], 0);
   return apl_exec("⎕←2 3⍴⍳6");
}

Ce programme, nommé par exemple essai.c se compilera avec cc essai.c -lapl ... et donnera ceci à l'exécution :

./essai
1 2 3
4 5 6

La version 1.9 est fournie avec une importante documentation dont : APL Communication Cookbook, APL on Macintosh, GNU APL Designers Guide, GNU APL Memory Management, GNU APL Performance, Parallel APL, Quad GTK, fournie dans des formats ASCII, HTML et PDF.

Auteur et mainteneur

modifier

L'auteur et mainteneur de GNU APL se nomme Jürgen Sauermann. La documentation de GNU APL en anglais est par ailleurs très détaillée : https://www.gnu.org/software/apl/apl.html

Mise en place

modifier

La mise en place depuis la version 1.8 est très facile : on télécharge depuis un miroir GNU le fichier apl-1.8.tar.gz depuis le répertoire APL, et on l'extrait sur sa machine dans un répertoire nommé par exemple apl. Depuis ce répertoire, il suffit de frapper :

./configure
make
sh-install

et ensuite apl lorsqu'on a la main au bout de quelques secondes ou minutes.

Une option de configuration de la version 1.9 est --with-libapl qui construit la bibliothèque libapl (fichiers apl.h et apl.lib) pour les exécutions d'instructions APL depuis un programme C, permettant de combiner par exemple la concision d'écriture et la puissance de traitement matriciel d'APL avec les fonctions graphiques 3D dynamiques et performantes d'OpenGL.

Glyphes et clavier APL

modifier
 
Polices APL installées par Synaptic depuis les dépôts Ubuntu

(Vous pouvez ne pas lire cette section si la gestion des polices de caractères et du clavier ne vous passionne pas dans un premier temps)

Glyphes

modifier
 
Police Unifont-APL8x16 pour utilisation avec GNU APL en mode texte (pixels), dans le répertoire approprié.

Depuis une console en mode texte

modifier

Pour utiliser GNU APL depuis une console en mode texte pur (donc pas sous X-Window), la police Unifont-APL8x16.psf est disponible par exemple dans les dépôts d'Ubuntu (paquet psf-unifont, chargeable par Synaptic) ou d'autres distributions. Chargée dans /usr/share/consolefonts/, elle comporte 512 glyphes dont, outre les caractères APL, non seulement les caractères accentués français, mais également les ligatures.

Depuis une console dans une fenêtre graphique

modifier

Pour usage sous X-Window, la police TrueType ttf-unifont, également présente dans les dépôts et elle aussi chargeable par Synaptic, contient les caractères nécessaires et présente le mérite de pouvoir être mise à toutes les échelles souhaitées. Le rendu de cette police est optimal dans le corps 12, qui est celui où elle a été conçue.

Clavier

modifier
 
Clavier GNU APL pour les États-Unis (QWERTY) fourni par défaut avec GNU APL. Le clavier français AZERTY permute essentiellement Q et A, Z et W, déplace le M à droite du L passe les chiffres en haut de casse, etc.
 
Clavier GNU APL français obtenu en passant la commande setxkbmap -layout "fr,apl". Cette commande crée les tables gérant le clavier, mais pas ce fichier, qui a été réalisé à la main.

Sous Linux, l'interpréteur, qui utilise les caractères Unicode, s'utilise dans une session de terminal que l'on ouvre en l'associant à une page de code appropriée. Cela est simple à imposer au niveau de tout le serveur X, mais peut aussi avec quelques précautions faire l'objet d'une convention différente pour chaque fenêtre, que celle-ci contienne un terminal ou non.

Une image du clavier proposé par défaut (USA) se trouve dans /etc/gnu-apl.d/keyboard1.txt. Il appartient à l'utilisateur de le modifier, au moyen d'un éditeur de texte, en fonction de sa propre configuration de clavier nationale. Depuis une session GNU APL, on peut l'afficher par ]KEYB (commençant par un ] et non un ), puisqu'il s'agit de l'appel d'un simple programme en C compilé appelé depuis GNU APL).

En NARS2000 et en Dyalog, les caractères APL s'obtiennent par combinaison d'une touche d'altération (Alt en NARS2000, Ctrl en Dyalog) et d'un caractère du clavier. En GNU APL, on peut utiliser une combinaison de touches pour basculer entre clavier texte et clavier APL.

Global pour toutes les fenêtres sur ce serveur X

modifier

On peut utiliser l'utilitaire setxkbmap : setxkbmap apl rendra les caractères APL accessibles au clavier si ttf-unifont a été installée, mais le fera pour tous les terminaux ouverts en même temps et la police APL remplacera la police par défaut (rendant alors problématique le retour à la normale par un setxkbmap fr). Cependant, setxkbmap peut être aussi utilisé pour ajouter des caractères plutôt que les remplacer; la commande est alors setxkbmap -model "pc105" -layout "fr,apl" -option "grp:alt_caps_toggle" : une fois cette commande passée, chaque fois que l'on presse Alt-CapsLock, on bascule alors entre les claviers français et APL[2],[3].

Sélectif pour chaque fenêtre

modifier

Des méthodes d'entrée existent aussi pour les principales langues, dont le français avec ses touches mortes. Il est facile - bien que fastidieux dès que l'on dépasse dix touches à modifier - de changer la configuration en fonction de ses préférences (clavier IBM APL2 ou NARS2000), de ses besoins, ou de ses contraintes (par exemple combinaisons de touches pouvant être interceptées par le système en amont de la session APL).

Akt : APL Keyboard Tool

modifier

Sur github existe un outil permettant d'associer automatiquement une série de glyphes APL à des touches du claviers altérées par la touche Alt : https://github.com/TieDyedDevil/akt à condition de désactiver les altérations déjà définies s'il en existait (raccourcis clavier, par exemple).

Versions 1.8 (2020) et 1.9 (2024)

modifier

La version 1.8 est accompagnée, outre du fichier INSTALL traditionnel, de 9 fichiers dont l'un indique comment configurer le clavier et installer les polices, et un autre comment mettre en œuvre l'exécution multicœur. L'installation en est facilitée d'autant.

Différences entre les version 1.8 et 1.9

Appel et utilisation de l'interpréteur

modifier
 
Exemple de session GNU APL

Après avoir installé GNU APL et mis en place comme indiqué plus haut la reconnaissance du clavier étendu français + APL, il suffit de frapper apl depuis une console et on se retrouve sous l'interpréteur. On en sortira en frappant )off.

L'absence d'éditeur plein écran (contrairement à NARS2000) peut être gênante pour écrire des fonctions. Il est cependant toujours possible de les préparer dans une autre fenêtre et de les copier/coller dans la session GNU APL, ce qui constitue le principal intérêt de l'Unicode.

Depuis la version 1.8 est fourni un fichier de colorisation syntaxique pour vim.

Commandes système

modifier
  • )libs interroge les bibliothèques présentes. Sont marquées "missing" celles dont le répertoire n'existe pas encore. Il faudra le créer par un mkdir -p depuis une console.
  • )lib liste les espaces de travail contenus dans une bibliothèque.
  • )load charge un espace de travail en mémoire. )save le sauvegarde sur disque.
  • )fns et )vars listent les fonctions et les variables présentes dans l'espace de travail.
  • )history liste les dernières lignes saisies au clavier (instructions ou commandes APL en général).

Fonctions système spécifiques

modifier
  • ⎕cr affiche bien la représentation canonique d'une fonction, mais c'est 4 ⎕cr qui correspond au ⎕fmt de NARS2000 qui affiche en boites les données qui sont à sa droite.
  • ⎕FIO effectue des entrées/sorties de caractères sur fichiers.
  • ⎕PLOT affiche la courbe des valeurs qui sont à sa droite.

Nouveautés de la version 1.8

modifier
  • ⎕FFT (transformée de Fourier rapide, en nombres réels comme complexes).
  • ⎕GTK (appel des fonctions de Gimp en APL).
  • ⎕RE (expressions régulières).
  • Commandes système définissables par l'utilisateur en APL.
  • Interface entre Python et GNU APL, donnant accès aux fonctions vectorielles d'APL en Python.

Bibliothèques disponibles

modifier

Le site exercism permet d'échanger des exercices de GNU APL : https://exercism.io/tracks/gnu-apl/

Des workspaces APL comme utl contenant des fonctions APL utiles et téléchargeables se trouvent ici : https://sourceforge.net/projects/apl-library/

Essayer GNU APL sans l'installer

modifier
 
Utilisation de GNU APL.js par un navigateur sur le site http://baruchel.hd.free.fr/apps/apl/ sans installation.
 
Essai de GNU APL (ici, version 1.7) mise à disposition par Junger Sauermann

GNU APL a été porté en Javascript par Th. Baruchel et est accessible sous cette forme sur le site à l'adresse http://baruchel.hd.free.fr/apps/apl/ (voir illustration de gauche). Junger Sauermann propose également sa propre version d'essais interactifs http://juergen-sauermann.de/try-GNU-APL, à droite :

Extension au standard

modifier

Le standard APL indique ce qui doit être supporté a minima, mais n'interdit pas pour autant les extensions. Jürgen Sauermann a introduit la possibilité de transmettre une valeur entre crochets comme argument supplémentaire d'une fonction, en particulier pour généraliser la notion d'opération sur un axe comme dans ,[1] ou +/[1] tout en mettant en garde sur le fait que cette extension peut nuire à la compatibilité des programmes GNU APL avec les autres systèmes, si ceux-ci ne l'adoptent pas. Il fournit l'exemple suivant :

∇z←moyenne[axe] a
 Z←(+/[axe]a) ÷ (⍴a)[axe]
∇

      moyenne[1] 5 5⍴⍳25
11 12 13 14 15

      moyenne[2] 5 5⍴⍳25
3 8 13 18 23

Liens externes

modifier

Notes et références

modifier
  1. devenues plus de 75000 en juin 2016, plus de 80000 en juillet 2017 et plus de 100 000 en 2020 : https://www.gnu.org/software/apl/
  2. Plusieurs caractères comme ? ou ! sont disponibles depuis les deux claviers, bien qu'à des emplacements différents sur chacun.
  3. Pour choisir une autre combinaison de changement de clavier, voir ici : http://pastebin.com/a2MTnXqg