AccueilđŸ‡«đŸ‡·Chercher

APL (langage)

L'APL (initialement A Programming Language, officieusement Array-Processing Language[1]) est un langage de description de traitement de l'information devenu ensuite langage de programmation conçu entre 1957 et 1967 à Harvard par Kenneth Iverson pour décrire commodément des opérations globales sur des tableaux (booléens, numériques ou, dans une moindre mesure, de caractÚres). Iverson décrivait la grammaire de son langage comme similaire à celle d'un langage naturel (substantifs, verbes, adverbes, conjonctions, copules et ponctuation)[2]. Le langage n'utilise cependant pas de mots, mais beaucoup de signes, chacun correspondant à un concept précis[3] - [4].

APL
Logo.

Date de premiĂšre version 1966
Paradigme matriciel, Fonctionnel, Programmation structurée, tacite
Auteur Kenneth E. Iverson
DĂ©veloppeur Larry Breed, Dick Lathwell, Roger Moore et al.
DerniĂšre version ISO/IEC 13751:2001 ()
Typage dynamique
Influencé par Notation (mathématiques)
A influencé Langage J, Matlab, A+
Implémentations APL\360 APL\1130 APL*Plus Sharp APL APL2 Dyalog APL NARS2000 APLX GNU APL
SystĂšme d'exploitation Multiplate-forme, Windows, GNU/Linux, Mac OS X
Licence propriétaire, GPL
Extensions de fichiers .apl

RĂ©volutionnaire Ă  son lancement (usage du terminal Ă  boule ou Ă  Ă©cran alors que la carte perforĂ©e ou le tĂ©lĂ©type ASR33 (en) restaient encore la rĂ©fĂ©rence, aucune dĂ©claration nĂ©cessaire, typage et dimensionnement des variables inutile, gestion dynamique de mĂ©moire, interactivitĂ© totale, concision par traitement direct des tableaux Ă©vitant l'Ă©criture de boucles, persistance), il connut un succĂšs croissant jusqu'au milieu des annĂ©es 1980, Ă©poque oĂč le tableur le concurrença pour les petits travaux, et des outils comme SAS, puis R pour le travail sur de plus grands volumes de donnĂ©es que ceux des tableurs de 1985.

En 2020, la disponibilité de processeurs trÚs rapides adressant plusieurs gigaoctets de mémoire vive et l'existence d'interpréteurs Open Source peuvent le rendre à nouveau intéressant pour un public de passionnés[5] - [6]. Rob Pike, créateur du langage Go, en parle en 2014 avec enthousiasme[7] et en 2020, il livre au public le code source du langage Ivy, une fondation d'APL en langage Go[8].

Dans sa version GNU APL, il est mĂȘme utilisable comme langage de script.

  • Le langage APL de dĂ©part fait l'objet de la norme ISO 8485 (1989).
  • L'APL Ă©tendu (fondĂ© sur APL2) est fixĂ© par la norme ISO/CEI 13751 (2001).

Note : VĂ©rifiez que votre navigateur accepte bien l’Unicode ; dans le cas contraire, vous verrez s’afficher des rectangles blancs ou des points d’interrogation Ă  la place des caractĂšres APL. Cette question est dĂ©taillĂ©e sur la Toile[9]. Aujourd'hui (2017) les navigateurs sur PC comme Mozilla Firefox ou Microsoft Edge ne posent aucun problĂšme pour afficher les caractĂšres APL en Unicode. Quelques problĂšmes d'affichage rĂ©siduels subsistent encore sur tablettes Android.

Historique

Les exemples sont donnés en double : une forme de copie d'écran dont le rendu sera correct quel que soit le navigateur que vous employez, et une en forme de texte que vous pouvez copier/coller par exemple dans NARS2000 (voir plus bas) pour l'exécuter, éventuellement avec quelques variantes. Le rendu de la page dépendra de votre police et de votre niveau de zoom par défaut. Vous pouvez les modifier, par exemple sur un PC par Ctrl+molette de la souris, en fonction de la résolution de votre écran.

Un historique en anglais d'APL est donné en PDF dans IBM Systems Journal, volume 30, no 4 (1991)[10]. Un décrivant ses progrÚs depuis 1978 existe également[11].

Introduction : exemple d'APL, primitives iota (⍳, suite d'entiers consĂ©cutifs) et rho (⍎, nombre d'Ă©lĂ©ments de), opĂ©rateur / (rĂ©duction, applique l'opĂ©ration qui est Ă  sa gauche entre tous les Ă©lĂ©ments du vecteur)
Fonction domino (âŒč) d'inversion matricielle en APL
Boules Selectric IBM utilisĂ©es avant la gĂ©nĂ©ralisation des Ă©crans. La piĂšce de 2 euros donne l'Ă©chelle.

APL s’est montrĂ© particuliĂšrement adaptĂ© dĂšs ses dĂ©buts aux calculs statistiques, aux ventilations, aux consolidations, aux descriptions fonctionnelles d’architectures comme celle de l’IBM 360, aux graphiques interactifs (GRAPHPAK) et Ă  quelques travaux en combinatoire et en thĂ©orie des graphes. Il a Ă©galement Ă©tĂ© utilisĂ© pour le prototypage d’applications et l’écriture de langages de manipulation simples dans le cadre d’un infocentre en masquant les symboles appropriĂ©s sous des dĂ©nominations commodes et parlantes, par exemple en permettant d’écrire simplement :

MOYENNE X pour (+/X)Ă·âŽX.
"(Somme des éléments de X), divisée par le nombre d'éléments de X)"

NORMALISER X pour XĂ·+/X
"Diviser chaque élément de X par la somme de tous les éléments de X" etc.

Si l'on envisage des tableaux gigantesques, la notion de MapReduce n'est pas loin[12], et de fait plusieurs implĂ©mentations d'APL utilisent, sans que l'utilisateur ait Ă  en coder l'utilisation lui-mĂȘme, le parallĂ©lisme du matĂ©riel (voir plus bas).

Il permet de manipuler aisĂ©ment des tableaux de N dimensions (N variant de 7 Ă  255 selon l’implĂ©mentation considĂ©rĂ©e, avec des tailles de 0 Ă  65000 et plus sur chaque dimension) de façon globale. Les opĂ©rations puissantes, calculs de feuilletage (lamination) ainsi que les opĂ©rateurs de rĂ©duction /, expansion \, produit intĂ©rieur . et produit extĂ©rieur ∘. et les opĂ©rations de compression / Ă©vitent souvent toute nĂ©cessitĂ© d’indices de boucle explicite - ainsi d’ailleurs que l’usage de boucles lui-mĂȘme.

Iverson insistait sur le fait qu'APL était un langage de pensée tout autant qu'un langage de programmation. C'est en effet une notation mathématique rigoureuse et concise[13].

Les symboles APL reprĂ©sentant des opĂ©rations utilisables en programmation comme en calcul immĂ©diat Ă  la console, par exemple le « domino » âŒč qui inverse directement une matrice carrĂ©e, ou rĂ©sout un systĂšme d’équations linĂ©aires surdimensionnĂ© au sens des moindres carrĂ©s si la matrice est rectangulaire :

      a←2 2⍮⍳4
      âŒča
ÂŻ2    1  
 1.5 ÂŻ0.5

On estimait dans les annĂ©es 1970-80 qu’une Ă©quipe de 5 dĂ©veloppeurs APL avait la puissance de dĂ©veloppement d’une Ă©quipe de 25 programmeurs FORTRAN[14]. L’application APL se montrait plus gourmande en ressources matĂ©rielles, mais le prix de celles-ci Ă©tait en constante diminution. En 2013, son adaptation Ă  la programmation agile lui donne un regain d'intĂ©rĂȘt pour toutes les applications Ă  mettre en place ou faire Ă©voluer rapidement, aussi bien que pour les applications Ă  courte durĂ©e de vie. Il a Ă©tĂ© utilisĂ© entre autres[15] par la NASA, British Airways, la Banque de France (Ă©tudes Ă©conomiques Ă©clair), la Direction gĂ©nĂ©rale des Finances publiques française (impact fiscal de lois nouvelles), etc.

AprĂšs avoir connu le creux de la vague en 2009, l'intĂ©rĂȘt pour ce langage remonte significativement depuis[16].

Depuis 2013 également, il est proposé pour la réalisation de servlets[17].

Son interface initiale (bicolore en mode machine à écrire) a inspiré celle de logiciels comme Maple.

Présentation

APL innovait Ă  son lancement par plusieurs aspects conviviaux :

  • pas de dĂ©claration de types ni de rĂ©servations de taille, une variable contenant tout simplement ce qu’on a mis dedans (scalaire ou tableau ; boolĂ©ens, entiers, caractĂšres ou nombres flottants) ;
  • possibilitĂ© d’interrompre un programme, d’interroger et de modifier des variables, et de reprendre l’exĂ©cution ; ou bien de tout stocker en l’état et de reprendre le lendemain en retrouvant les objets de la zone de travail — fonctions, variables et Ă©tats d’exĂ©cution — exactement comme on les avait laissĂ©s (bref, de la persistance avant la lettre
 dĂšs 1969 !) ;
  • gestion dynamique de mĂ©moire automatique ;
  • pas de syntaxe compliquĂ©e pour afficher des rĂ©sultats : quand un rĂ©sultat est calculĂ© sans ĂȘtre envoyĂ© ensuite dans une variable, alors il est affichĂ© simplement au terminal dans le format estimĂ© le plus lisible.

Exemples

Session d'exemple montrant quelques caractéristiques du langage APL : affichage implicite de ce qui n'est pas affecté à une variable, chaßnes de caractÚre, indexation vectorielle et matricielle, somme d'une série de 30 nombres, primitive "iota".

Ainsi pour écrire « Hello, World! » en APL, les choses se passent ainsi :

'Bonjour, le monde !' ⍝ tapĂ© par l’utilisateur

Bonjour, le monde ! ⍝ rĂ©ponse du terminal

2+2 3 5 7 ⍝ donne

4 5 7 9

Il faut y ajouter la possibilitĂ© spectaculaire d’indexer un tableau par un autre tableau. Ainsi :

'LE CHAT'[7 5 2 3 4 6 7] ⍝ donne

THE CAT

Voire :

'LE CHAT'[2 3 ⍎ 7 5 2 4 6 7] ⍝ donne

THE
CAT

Pas de traduction automatique ici ni dans un cas ni dans l'autre : l'indice a simplement été remplacé par ce qui était indicé (ainsi T est le septiÚme caractÚre), ce qui est le propre de l'opération d'indexation. Ce qui est indicé prend également la forme de l'indice (ainsi, une matrice 2x3 dans le second cas)[18].

Grùce à sa priorité de droite à gauche, le langage se lit simplement, comme une langue naturelle : « 1 plus somme des inverses des factorielles des entiers de 1 à 30 » s'écrira :

1++/Ă·!⍳30 ⍝ qui donne

2.718281828

Le mĂȘme rĂ©sultat (c'est-Ă -dire la valeur de e) peut s'obtenir en frappant directement *1, ce qui signifie exponentielle 1.

L'APL des origines ne connaissait que scalaires et tableaux (numĂ©riques ou de caractĂšres). Il gĂšre maintenant des tableaux de tableaux et permet Ă©galement Ă  l'utilisateur de dĂ©finir lui-mĂȘme ses propres « opĂ©rateurs »[19].

Il travaille Ă©galement en nombres complexes automatiquement si les besoins du calcul le demandent. La valeur s'Ă©crit 0J1​ et en consĂ©quence 0J1*2​ donne ÂŻ1J0​. NARS2000 reconnaĂźt pour sa part non seulement les nombres complexes, mais Ă©galement les quaternions[20] - [21] : si l'on Ă©crit 0+1J, le systĂšme l'imprime - et l'interprĂšte - comme 0i0j1k0 et 0i0j1k0*2 vaut bien entendu ÂŻ1i0j0k0. Les octonions sont Ă©galement supportĂ©s (1i2j3k4l5ij6jk7kl8).

Opérations sur tableaux

Le caractùre ⎕ se lit "quad".

Une session de travail APL (NARS2000) annotée. Les zones importantes sont encadrées de vert
⎕←A←2 2⍮⍳4 ⍝ imprime une matrice A de taille 2x2 constituĂ©e des nombres de 1 Ă  4
1 2
3 4
A=2 ⍝ donne une matrice boolĂ©enne indiquant les Ă©lĂ©ments de A Ă©gaux Ă  2
0 1
0 0
A, A ⍝ concatĂšne, horizontalement, la matrice A avec elle-mĂȘme, formant une matrice de 2x4
1 2 1 2
3 4 3 4
A, 5 ⍝ concatùne le scalaire 5 à la matrice A
1 2 5
3 4 5
A, +/A ⍝ concatĂšne verticalement (âȘ) Ă  A un vecteur 'somme de A par colonnes' (+/A)
1 2 3
3 4 7
AâȘ+⌿A ⍝ donne
1 2
3 4
4 6

mĂȘme chose suivant l'autre axe : colonnes

Il faut parfois tĂątonner un peu en APL pour arriver Ă  faire ce que l'on cherche, mais comme le langage est Ă  la fois vectoriel et interactif, il est souvent plus rapide d'essayer quelque chose que de le chercher dans le manuel.
A, [.5]0 ⍝ donne
1 2
3 4

0 0
0 0

concaténation en créant une nouvelle dimension : la matrice devient cube

A, [1.5]0
1 2
0 0

3 4
0 0

Cette opération a créé une nouvelle dimension sur un autre axe.

Le produit externe alias cartésien, crée des tableaux à partir de vecteurs, à la maniÚre d'une table de multiplication :

Calcul de nombres premiers en APL. Le mĂȘme calcul peut s'Ă©crire ⍞0Ï€âł100. L'opĂ©ration π[22] permet Ă©galement de nombreux calculs sur la primalitĂ© : test de primalitĂ©, liste des diviseurs, etc.; ainsi "Combien y a-t-il de nombres premiers entre 1 et 360 000 ?" s'Ă©crit ⍎⍞0Ï€âł360000. Le rĂ©sultat, presque instantanĂ©, est 30757.
      1 2∘.+10 20 30
11 21 31
12 22 32
      ⎕←a←,1 2∘.+10 20 30
11 21 31 12 22 32
      a[⍋a]
11 12 21 22 31 32

La primitive ⍋, que l'on nomme grade-up, fournit la permutation qui classe en ordre croissant les Ă©lĂ©ments d'un vecteur (et non ce vecteur classĂ© lui-mĂȘme). En d'autres termes, a[⍋a] renvoie toujours un vecteur triĂ©, et ⍋a toujours un vecteur de permutation formĂ© des Ă©lĂ©ments de ⍳⍮a permutĂ©s, ce qui constitue un moyen concis et Ă©conomique de crĂ©er et combiner des permutations[23]. De telles permutations s'obtiennent facilement par tirage exhaustif : 52?52 pour un tirage de 52 cartes parmi 52.

Opérations sur les ensembles

Les symboles ensemblistes (∊, âˆȘ, ∩, ⊆, ⊇, ⍊...) existent en APL, et font l'objet d'extensions particuliĂšres permettant de travailler en ensembles simples (dont chaque Ă©lĂ©ment d'apparaĂźt qu'une fois) ou bien multisets dont chaque Ă©lĂ©ment peut apparaĂźtre plusieurs fois, utiles pour les combinaisons de Bose-Einstein[24]

Selon que les éléments de ces ensembles possÚdent une identité propre ou au contraire non (c'est-à-dire sont indiscernables), il existe douze façons bien distinctes (en) de traiter les ensembles.

Opérateurs

De mĂȘme qu'une fonction agit sur une ou plusieurs variables, un opĂ©rateur agit sur une ou plusieurs fonctions (ou opĂ©rations). Pour prendre une comparaison mathĂ©matique, « sigma » et « pi » correspondent Ă  l'opĂ©rateur APL de rĂ©duction (« / ») appliquĂ© aux opĂ©rations « + » et « × ». Sigma (somme de termes) s'Ă©crit +/, « pi » (multiplication entre termes) ×/, « union » (ou logique entre termes) √/, « conjonction » ("et" logique entre termes) ∧/, etc. On parle, dans d'autres langages, de clĂŽture (closure).

Dans la premiĂšre version d’APL, les opĂ©rateurs sont dĂ©finis de façon fixe (rĂ©duction (/), scan (\), produit externe (°.), composition (.)...). En APL2, l’utilisateur peut fabriquer les siens Ă  volontĂ© et leur donner des noms. Un opĂ©rateur peut agir indiffĂ©remment sur des opĂ©rations de base du langage ou sur des fonctions dĂ©finies par l’utilisateur dans son workspace.

APL2 introduit également l'opérateur tréma (š, nommé each), généralisant au niveau de chaque sous-tableau une opération dans les tableaux de tableaux.

APL : opĂ©rateur each (š), primitive disclose (⊃), fonction systĂšme ⎕fmt rĂ©vĂ©lant les structures, primitive domino (âŒč) inversant une matrice, et primitive enquote (⍕) d'affichage.
      ⍳4
1 2 3 4
      ⍳¹⍳4
 1  1 2  1 2 3  1 2 3 4
      ⍝ La fonction systùme ⎕fmt ("quad fmt") affiche cela plus clairement
      ⎕fmt ⍳¹⍳4
┌4──────────────────────────┐
│┌1┐ ┌2──┐ ┌3────┐ ┌4──────┐│
││1│ │1 2│ │1 2 3│ │1 2 3 4││
│└~┘ └~──┘ └~────┘ └~──────┘2
└∊──────────────────────────┘
      ⊃⍳¹⍳5
1 0 0 0 0
1 2 0 0 0
1 2 3 0 0
1 2 3 4 0
1 2 3 4 5
      ⎕fmt ⊃⍳¹⍳5
┌5────────┐
51 0 0 0 0│
│1 2 0 0 0│
│1 2 3 0 0│
│1 2 3 4 0│
│1 2 3 4 5│
└~────────┘
      6 2⍕âŒč⊃⍳¹⍳5
  1.00 ÂŻ0.00  0.00 ÂŻ0.00  0.00
 ÂŻ0.50  0.50 ÂŻ0.00  0.00 ÂŻ0.00
 ÂŻ0.00 ÂŻ0.33  0.33  0.00  0.00
  0.00  0.00 ÂŻ0.25  0.25 ÂŻ0.00
 ÂŻ0.00 ÂŻ0.00  0.00 ÂŻ0.20  0.20

Voir note [25].

Tableaux de tableaux, et fonction ⍎

Une opĂ©ration nommĂ©e enclose (⊂) permet d’encapsuler un tableau qui est alors vu comme un scalaire. Il est dĂšs lors facile de reprĂ©senter des structures complexes sous forme de tableaux ayant pour Ă©lĂ©ments d’autres tableaux. L’existence d’une fonction execute (⍎)[26] permet mĂȘme d’inclure dans ces tableaux de tableaux des dĂ©signateurs de fonction que l’on peut exĂ©cuter Ă  la demande, comme en langage C. Elle permet aussi Ă  un programme d’engendrer lui-mĂȘme un code qu’il exĂ©cutera ensuite, comme en Lisp ou en Haskell : les fonctions sont alors juste des types de variables particuliers. Voir programmation fonctionnelle.

Le nombre d'indices d’un tableau est par convention nommĂ© rang (rank) en APL (Ă  ne pas confondre avec le rang d'une matrice en algĂšbre linĂ©aire) et est toujours retournĂ© par ⍎⍎. Le nombre de niveaux d’un tableau de tableaux est nommĂ© profondeur (depth) et retournĂ© par ≡.

Espace de travail

BibliothĂšques d'espaces de travail fournies en standard avec l'APL2 d'IBM.
Espaces de travail fournis avec Dyalog APL.

L’utilisateur travaille dans un espace de travail (workspace) oĂč il stocke ses fonctions et ses variables. Il peut Ă  tout moment sauvegarder l’ensemble (y compris en Ă©tat d’exĂ©cution suspendue) et reprendre plus tard son travail exactement dans les conditions oĂč il l’avait laissĂ©, y compris dans l'Ă©tat oĂč il aurait interrompu un programme en cours[27]. Des commandes comme )COPY et )PCOPY, et la notion de groupe permettent des transferts aisĂ©s de fonctions et de variables d’un workspace Ă  un autre (un groupe est un nom donnĂ© Ă  un ensemble de fonctions et de variables qui travaillent ensemble, permettant de les importer toutes en mĂȘme temps sans dĂ©tailler leurs noms ni importer tout l'espace de travail).

Les APL commerciaux sont fournis avec plusieurs bibliothÚques d'espaces de travail d'exemples, exécutables et modifiables. En APL2 d'IBM, ces bibliothÚques portent des numéros )LIB 1, )LIB 2, etc. (voir figure de gauche).

Horodatage automatique

Usage de ⎕AT pour documenter les fonctions d'un espace de travail

Chaque objet APL2 (variable, fonction ou opĂ©rateur) est automatiquement horodatĂ© dans l'espace de travail (workspace), ce qui facilite sa gestion sur le long terme. Le type et la date des objets sont retournĂ©es par la fonction systĂšme ⎕AT (=ATtributes). CouplĂ© aux opĂ©rations de tri ⍋ (grade-up) et ⍒ (grade-down), cet horodatage des objets facilite beaucoup le processus de dĂ©veloppement.

En NARS2000, la fonction systĂšme ⎕vr liste une fonction avec ses numĂ©ros de ligne, la derniĂšre ligne contenant son horodatage.

⎕NL (=Name List) ramĂšne la liste des Ă©lĂ©ments de la zone de travail, ⎕NL 3 ramĂšne la liste de ses seules fonctions. Comme on le voit, la concatĂ©nation horizontale de tableaux de nature diffĂ©rente juste par une virgule rend aisĂ©s les affichages.

En NARS2000, la fonction systĂšme ⎕vr liste de plus une fonction avec ses numĂ©ros de ligne, la derniĂšre ligne contenant son horodatage. Le rĂ©sultat est un simple vecteur de caractĂšres contenant quelques caractĂšres de retour ligne, la colorisation standard des caractĂšres Ă©tant effectuĂ©e par le systĂšme

ÉlĂ©ments historiques

  • APL travaillant sur des vecteurs, il devait distinguer l’opĂ©ration « - » (moins), dĂ©signant l'opĂ©ration de soustraction d'un opĂ©rande numĂ©rique (dimensionnĂ© ou non) ou son changement de signe du simple signe nĂ©gatif qui ne porte que sur le scalaire qui le suit immĂ©diatement, d'autre part. Celui-ci est notĂ© par une barre supĂ©rieure « ÂŻ ».
Ainsi, 7 5 6 - 4 3 2 produit 3 2 4, mais 7 5 6 ¯4 3 2 produit
 7 5 6 ¯4 3 2
  • Lorsqu’APL tourne sur un systĂšme, par exemple le RS/6000, on s’écarte de la tradition en le nommant non pas APL/6000, mais bien APL\6000. Pourquoi ? Parce que « / » est un opĂ©rateur de rĂ©duction et que « \ » est l’opĂ©rateur d'expansion. Logique.
  • APL Ă©tait au dĂ©part utilisĂ© uniquement en interne par IBM, sans plan de commercialisation. Selon Yves Le Borgne, la NASA fit toutefois pression pour que ce langage fĂ»t mis Ă  sa disposition, menaçant de changer de constructeur si elle n’obtenait pas satisfaction. Le langage fut mis timidement au catalogue en 1969 Ă  titre de produit complĂ©mentaire, puis en quelques annĂ©es prit le statut de langage stratĂ©gique, qu’il garda jusqu’en 1990 (Ă  partir de cette date, ne pouvait plus ĂȘtre considĂ©rĂ© comme stratĂ©gique un langage ne tournant pas sur toutes les plateformes, et porter APL sur l’AS/400 ne prĂ©sentait pas d’intĂ©rĂȘt pour le crĂ©neau spĂ©cifique de cette machine, essentiellement les besoins de gestion d'entreprises de taille moyenne).

Idiomes APL

Exemple d'usage de TRYAPL2 dans une DOSBox

Les tournures idiomatiques APL les plus utiles furent collationnées dans les universités au moins depuis 1977[28] et leur liste reste mise à jour sur un wiki[29] en Unicode.

Quelques-unes de ces tournures concernent le premier APL, qui ne possĂ©dait pas les tableaux de tableaux; elles restent valides aujourd'hui, bien qu'APL2 permette d'en simplifier plusieurs. IBM met Ă  disposition une version adaptĂ©e Ă  APL2[30], dont les exemples peuvent ĂȘtre copiĂ©s/collĂ©s dans un interprĂ©teur, ainsi que l'espace de travail IDIOMS dans son TRYAPL2 gratuit destinĂ© au DOS ou Ă  une DOSBox quelconque. Dyalog APL met Ă  disposition sa propre liste[31]. Les consulter est utile pour se familiariser avec le mode de pensĂ©e propre Ă  APL et dĂ©couvrir concrĂštement l'usage de ses primitives et opĂ©rateurs.

Stanley Jordan a présenté à l'ACM une communication sur l'usage de phrases APL pour assister la composition musicale[32]

Enfin, le site rosettacode donne plusieurs exemples de petits problÚmes avec leur résolution en APL ainsi que (de façon en général moins concise) dans d'autres langages : https://rosettacode.org/wiki/Category:APL

Implémentations

Gratuites

Quatre grandes implémentations en Open Source d'APL sont téléchargeables gratuitement :

A+ : Exemple d'affichage de caractÚres APL dans un navigateur une fois la police KAPL installée
  • A+, dialecte d'APL disponible dans les dĂ©pĂŽts standards de plusieurs distributions Linux, dont Ubuntu, sous le nom de aplus-fsf. Ce langage A+[33] ne doit pas ĂȘtre confondu avec la certification A+ de connaissances de base en usage de l'informatique. Intensivement utilisĂ© chez Morgan Stanley[34] - [35], il conserve des primitives APL comme le ⍳, mais remplace par exemple le ⍎ par #. Il possĂšde aussi un mode de reprĂ©sentation ASCII oĂč on Ă©crit juste iota, rho, take, each, etc.
  • GNU APL[36] directement utilisable sous Linux, ainsi que sous Windows au moyen de Cygwin. Le soin de charger une des polices de caractĂšres APL dans la fenĂȘtre correspondante est laissĂ© cette fois-ci Ă  l'utilisateur et celui-ci doit modifier son clavier soit avec setxkbmap soit avec xmodmap.
  • MVT for APL est un portage de l'APL\360 sur beaucoup d'autres plateformes y compris le Raspberry Pi[37], avec une trentaine d'espaces de travail (workspaces) dont une, PLOT, pour tracer des semigraphiques, le tout pour un usage strictement privĂ©. Il utilise l'Ă©mulateur Hercules[38], livrĂ© avec l'ensemble.
Nars2000, implémentation Open Source d'APL sous Windows, ici utilisée depuis Wine sous le systÚme d'exploitation Ubuntu
Nars2000, implémentation Open Source d'APL sous Windows, ici utilisée depuis Wine sous le systÚme d'exploitation Ubuntu
Exemple de prĂ©cision Ă  la demande : maximale d'affichage avec ⎕pp, de prĂ©cision de calcul flottant avec ⎕fpc
  • NARS2000[39], muni d'un installeur pour Windows, et disponible en versions 32 et 64 bits[40]. La version 0.4.5.68 a montrĂ© fonctionner Ă©galement depuis Wine sous Linux[41] (voir illustration ci-contre)[42]. Historiquement, NARS est issu de travaux de la sociĂ©tĂ© STSC, Scientific Time-Sharing Corporation[43]. La version 0.5.8.8 disponible en dĂ©cembre 2018 passe automatiquement si besoin les calculs sur entiers en entiers de prĂ©cision illimitĂ©e par dĂ©faut, en lieu et place d'une reprĂ©sentation flottante (par exemple !508, factorielle 508; dont le rĂ©sultat comporte 1156 chiffres). Les quotients de tels entiers gĂ©ants sont conservĂ©s en interne sous forme de rationnels avec un numĂ©rateur et un dĂ©nominateur de prĂ©cisions illimitĂ©es Ă©galement. La version 0.5.19.0 de juillet 2019 autorise les espaces soulignĂ©s dans l'Ă©criture des nombres (exemple 1_000_000) et introduit une nouvelle commande )BOX. )BOX OFF est le fonctionnement normal. )BOX ON rĂ©alise un ⎕fmt automatique pour chaque sortie.
La demande de calculs en prĂ©cision illimitĂ©e[44] se fait en faisant suivre les constantes d'un suffixe x qui est propagĂ© ensuite automatiquement dans tous les calculs oĂč elles interviennent. Les variables ⎕pp (prĂ©cision d'affichage) et ⎕fpc (prĂ©cision des flottants) permettent de limiter la taille des affichages et la prĂ©cision des flottants Ă©tendus Ă  ce qui est jugĂ© strictement nĂ©cessaire.
En 2020, la version alpha de NARS2000 permet le type de variable "intervalle"signalé par le suffixe ±, qui se propage à tous les calculs et fournit de ce fait la précision du résultat
En 2020, la version alpha de NARS2000 permet le type de variable "intervalle"signalé par le suffixe ±, qui se propage à tous les calculs et fournit de ce fait la précision du résultat
En 2020, la version alpha de NARS2000 permet le type de variable "intervalle"signalé par le suffixe ±, qui se propage à tous les calculs et fournit de ce fait la précision du résultat
Orienté recherche, NARS2000 se munit dans sa branche alpha (2020) de l'arithmétique d'intervalles en nombres entiers et son extension aux calculs matriciels avec des hypercomplexes en flottants de précision numérique arbitraire[45]ce qui permet de donner des résultats ± quelque chose dÚs lors que ce suffixe accompagne l'une des constantes du calcul. Chaque résultat est alors accompagné de sa fourchette de signification tenant compte des lacunes de la représentation flottante, et propagée dans tout calcul :
      (√2±)*2
2v±2.4E¯38v 
       ⎕fpc←200
       (√2±)*2
2v±5E¯60v 
      âŒč2 2⍮⍳4±
 ¯2v±6.6E¯60v    1v±3.7E¯60v
1.5v±4E¯60v   ¯0.5v±1.7E¯60v
      aâŒča←2 2⍮⍳4±
              1v±3.3E¯60v 0v±5E¯60v  
9.334522963E¯61v±1.4E¯60v 1v±3.7E¯60v

Commerciales avec cas de gratuité

  • Dyalog laisse son APL - et les espaces de travail qu'il y a associĂ©s - en libre tĂ©lĂ©chargement sous rĂ©serve d'un engagement sur l'honneur de ne pas l'utiliser Ă  des fins commerciales et de ne pas le transmettre directement, afin sans doute de permettre une traçabilitĂ© fiable de ces tĂ©lĂ©chargements[47] Cette sociĂ©tĂ© se montre par ailleurs trĂšs coopĂ©rative avec les enthousiastes d'APL, engageant parfois de brefs dialogues par courriel avec certains d'entre eux. Google lui a rĂ©servĂ© une place dans une de ses confĂ©rences annuelles[48].
  • IBM, premiĂšre sociĂ©tĂ© Ă  avoir produit un APL, propose une version tĂ©lĂ©chargeable d'essai gratuite de son APL2 limitĂ©e Ă  5 heures de temps CPU, ce qui avec les processeurs de 2016 permet de six mois Ă  un an d'essais personnels pour explorer le langage et les workspaces qui l'accompagnent. Cette version inclut un grand nombre d'espaces de travail qui rendent opĂ©rationnel rapidement, en particulier sur la crĂ©ation de graphiques vectoriels 2D et 3D (particuliĂšrement aisĂ©s Ă  reprĂ©senter sous forme de matrices APL) avec Graphpak. Attention : sa rĂ©partition de clavier, aussi bien en AZERTY qu'en QWERTY, lui est propre et diffĂšre lĂ©gĂšrement des autres implĂ©mentations.
  • MicroAPL fournissait une version gratuite de son produit APLX, limitĂ©e Ă  30 jours pour Ă©valuation. La version Linux est cependant utilisable indĂ©finiment pour usages non-commerciaux[49]. La version Windows comportait un installeur[50]. En , MicroAPL arrĂȘte ses activitĂ©s et confie Ă  Dyalog le soin de les proposer avec un statut semblable Ă  l'abandonware[51].

Diverses

Des interprĂ©teurs APL ont existĂ© pour l’IBM 7090, les IBM 360 Ă  zSeries (sous TSO, VM/CMS et mĂȘme CICS!), l’IBM 1130, le Xerox XDS Sigma 7 alias CII 10070, et le CII Iris 80, le Bull DPS-7, le Burroughs B5500, le Bull SEMS T1600 (ex-TĂ©lĂ©mĂ©canique Électrique T1600), la sĂ©rie des Mitra, etc.

La Sligos avait écrit en 1976 un APL pour Iris 80 (CII) afin d'offrir ce langage en service de télétraitement. Le projet fut abandonné quelques mois aprÚs sa réalisation pour des raisons de performances insuffisantes lors de la montée en charge. Les espaces de travail destinés à la migration du 370 vers l'Iris 80 furent légÚrement modifiés pour permettre la migration inverse.

APL Ă©tait aussi fourni directement en ROM dans des ordinateurs personnels du dĂ©but des annĂ©es 1970 (avant Apple, donc) comme le MCM-70, qui possĂ©dait un affichage d'une ligne[52], ou l’IBM 5110 modĂšles A et C.

Des versions station de travail et ordinateur personnel en ont aussi Ă©tĂ© commercialisĂ©es ou rĂ©alisĂ©es gratuitement pour AIX, Solaris, Linux, Windows, Mac OS, OS/2. Il en existe mĂȘme pour le DOS (version gratuite nommĂ©e TRYAPL2, en version anglaise comme française; la francisation a Ă©tĂ© rĂ©alisĂ©e par l'AFAPL[53])... ainsi que pour Android[54] !

La sociĂ©tĂ© Microsoft avait entrepris deux implĂ©mentations du langage sur 8080 et 6800, d'aprĂšs une lettre de Bill Gates aux utilisateurs de l'Altair BASIC[55]. Le succĂšs de DOS, de Windows et surtout des tableurs Multiplan et Excel fit abandonner ce projet, qui aurait eu un public potentiel bien plus restreint : le trĂšs grand public rĂ©clamait alors des applications clĂ©s en main (Ă  l'exemple de VisiCalc sur Apple II) et non des langages pour les programmer eux-mĂȘmes.

Environnements informatiques

Exemple d'interactivité des versions actuelles du langage : le jeu TETRIS fourni avec Dyalog APL.

Le mĂ©canisme d’échange dit des processeurs auxiliaires permet Ă  des workspaces APL de communiquer avec le monde extĂ©rieur : fichiers, SQL/DB2, TCP/IP, X-window, OpenGL, ainsi qu'autres workspaces APL et consoles du rĂ©seau actives au mĂȘme moment si celles-ci en donnent l’autorisation. On peut ainsi commencer Ă  mettre au point un calcul sur un PC, puis une fois qu’il est au point l’exĂ©cuter Ă  distance sur un ordinateur central Ă©quipĂ©s de dizaines de processeurs parallĂšles depuis la mĂȘme session sur PC.

Les processeurs auxiliaires permettent mĂȘme Ă  des sessions de station de travail de communiquer efficacement avec des sessions du mĂȘme langage sur mainframe, ou encore entre elles. Des calculs matriciels de trĂšs grande taille peuvent ainsi ĂȘtre distribuĂ©s en rĂ©seau.

Les processeurs auxiliaires se codent le plus souvent en langage C.

Quelques-uns livrés avec IBM APL2[56] sont AP124 (adressage direct de l'écran, genre curses), AP127 et AP227 (resp. accÚs aux bases de données DB2 et ODBC), AP144 et AP145 (resp. adressages X-Window et Windows), AP200 (coordinations de sessions APL distinctes), AP207 (processeur de graphiques interactifs, utilisé par GRAPHPAK).

Glyphes

'()+,-./ : ;<=> ?[]
\_ÂšÂŻĂ—Ă·â†â†‘â†’â†“âˆ†âˆ‡âˆ˜âˆŁâˆ§âˆš
∩âˆȘâˆŒâ‰ â‰€â‰„â‰ŹâŠ‚âŠƒâŒˆâŒŠâŠ€âŠ„â‹†âŒ¶âŒ·
⌾âŒčâŒșâŒ»âŒŒâŒœâŒŸâŒżâ€ââ‚âƒâ„â…â†â‡
⍈⍉⍊⍋⍌⍍⍎⍏⍐⍑⍒⍓⍔⍕⍖⍗
â˜â™âšâ›âœââžâŸâ âĄâąâŁâ€â„âŠâ§
⍚⍩âȘâ«âŹâ­âźâŻâ°â±âČâłâŽâ”â¶â·
⍞âčâș⎕○

Tous les caractĂšres APL ne sont pas encore associĂ©s Ă  une signification aujourd'hui (2020). GNU APL, Dyalog APL et NARS2000 en utilisent trois : âș et ⍔, qui dĂ©signent le premier et le dernier argument d'une fonction, et λ qui en dĂ©signe le rĂ©sultat. Exemple :

      )FNS
SUM
      ∇SUM[⎕]∇
[0] λ←âș SUM ⍔
[1] λ← âș + ⍔ 

La dĂ©finition de cette fonction se ferait par SUM ← { âș + ⍔ }. Celle de moyenne se ferait de mĂȘme par moyenne←{(+/⍔)Ă·âŽâ”}. Il s'agit bien de programmation fonctionnelle.

⍝ Surface d'un polygone en Dyalog APL
surface←{÷∘2⊱-/{+⌿×/⍔}š(0 1)(1 0)⊖š⊂⍔} ⍝ dĂ©finit la fonction "surface"
surface↑⌜(0 3)(3 0)(0 0)               ⍝ applique cette fonction Ă  un triangle donnĂ©
4.5

âș et ⍔ reprĂ©sentent ci-dessus les opĂ©randes d’une fonction. De mĂȘme et par convention âșâș et ⍔⍔ reprĂ©sentent les fonctions sur lesquelles s’applique un opĂ©rateur.

Quelques implémentations comme NARS2000 proposent des utilisations mathématiquement puissantes d'autres symboles[57].

Polices APL existantes

SĂ©lection de caractĂšres APL
SĂ©lection de caractĂšres APL (ici en KDE) et position du ⍎ (rho) et du ⍞ (quote-quad) en Unicode

En , les principales polices APL téléchargeables depuis l'Internet sont les suivantes[58] :

Exemple de saisie de texte combiné à des expressions issues d'une session APL dans LibreOffice Writer.
  • APL385 Unicode (Dyalog APL)[59]
  • APX Upright (MicroAPL APLX)
  • Courier APL2 Unicode (IBM APL2)
  • SImPL (NARS2000)

Les caractÚres Unicode APL2 sont définis dans l'un des plans de la police Arial[60], et permettent donc de copier/coller directement de l'APL depuis une session de calcul (voire une page web) dans un traitement de texte ou l'inverse, ce qui était impossible commodément avant l'Unicode.

L'Unicode APL, encodé en UTF-8, permet de :

  • copier/coller des expressions et programmes APL depuis des pages web.
  • les imprimer sous toutes les imprimantes actuelles
  • se connecter par telnet ou ssh Ă  des serveurs offrant un service APL
  • rediriger (piping) des flots UTF-8 vers l'interprĂ©teur APL, ce qui permet d'utiliser APL pour des scripts
  • Ă©changer des programmes avec des interprĂ©teurs ou des utilisateurs APL utilisant d'autres APL.
  • copier du code APL dans des documents.

Les navigateurs Web honorent depuis 2010 l'affichage des caractĂšres APL. Beaucoup de tablettes en sont capables en 2015.

Clavier

Exemple de clavier GNU APL français.
Clavier M d'IBM, version française, modÚle équipé de capots de touches texte et APL (les caractÚres APL sont en rouge). Fabrication IBM UK, S/N 1391402, utilisé ici sur un mini-PC avec NARS2000

La disposition du clavier APL d'origine pour les États-Unis avait Ă©tĂ© choisie pour des considĂ©rations mnĂ©motechniques, par exemple ? associĂ© au Q (Question mark) ⍎ (rho) au R, etc. Une question a Ă©tĂ© de savoir si le clavier APL français devait associer un caractĂšre Ă  la touche elle-mĂȘme (? serait alors associe au A et non plus au Q) ou Ă  sa signification (ce qui aurait eu pour effet de combiner les spĂ©cificitĂ©s francophones aux spĂ©cificitĂ©s d'APL.

  • APL/APL2, d'IBM, a retenu la premiĂšre solution.
  • Dyalog APL propose ce clavier français. Les caractĂšres APL s'obtiennent par composition avec la touche Ctrl. Quand on dĂ©sire restaurer les comportements standards de Ctrl-X, Ctrl-Z, etc., cliquer sur le bouton FRA en bas Ă  droite de la barre de tĂąches de Windows permet de commuter entre clavier français et clavier APL.
  • GNU APL laisse le spĂ©cialiste X-window dĂ©cider, s'il en a la compĂ©tence, des questions d'interface. Quelques configurations de clavier sont cependant fournies avec lui. Le basculement du clavier entre APL et français par la combinaison de touches Alt-CapsLock est expliquĂ© dans l'article GNU APL.
  • NARS2000 permet de configurer de façon graphique et interactive son clavier Ă  la demande si on le dĂ©sire, Ă  partir d'un des modĂšles de dispositions fournis. Sa configuration de base du clavier français utilise les caractĂšres existants et permet d'obtenir les autres par la touche Alt (Alt-i pour ⍳ (iota), Alt-r pour ⍎ (rho), etc. Seuls les crochets exigent l'usage du caractĂšre de composition Ctrl).

La question est moins futile qu'elle ne le semblerait : l'usage d'APL demande beaucoup de concentration. Si lors des frappes de caractÚres cette concentration est interrompue par une interrogation sur la touche à frapper sur le clavier et/ou le modificateur à enfoncer (Shift, Alt ou Ctrl), l'usage de ce langage deviendra inefficace quelles que soient ses qualités au départ.

On peut aussi se créer une disposition de clavier sur mesures, que ce soit en Windows[61] ou en X-Window (setxkbmap -layout us,apl -variant ,dyalog -option grp:lswitch, au détriment cependant de l'interopérabilité si on vient à utiliser d'autres machines que la sienne.

Ce document de 5 pages détaille une implémentation possible de clavier APL sous Linux :

Autour du langage

Situation présente

Exemple de session NARS2000, similaire à celle illustrée dans l'article sur GNU APL.

L’apparition du tableur, plus intuitif et plus facile Ă  manier, a fait disparaĂźtre une partie de l’intĂ©rĂȘt du langage. Cela n’enlĂšve rien pour autant Ă  sa puissance d’expression et Ă  sa concision, et plusieurs interprĂ©teurs APL sont tĂ©lĂ©chargeables gratuitement sur Internet, pour le PC (Linux ou Windows) comme pour le Macintosh. Les caractĂšres APL/APL2 sont prĂ©sents dans l’Unicode[62].

APL traitant globalement les tableaux, ses implĂ©mentations tirent aisĂ©ment parti des possibilitĂ©s de calcul parallĂšle ou de pipeline des processeurs modernes. Elles utilisent extensivement les possibilitĂ©s vectorielles du S/390 (zSeries), de l’architecture PowerPC (pipeline optimisĂ© d'instructions similaires) et des instructions multimĂ©dia (SSE) de l’architecture Intel/AMD. Dans la mesure oĂč APL traite globalement les tableaux sans imposer le dĂ©tail du traitement, plusieurs de ses primitives et opĂ©rateurs peuvent ĂȘtre implĂ©mentĂ©s en calcul parallĂšle CUDA, voire en calcul quantique[63], local ou distant si des circuits de calcul de ce type deviennent disponibles.

L'opĂ©rateur ∘ permet d'exprimer le produit cartĂ©sien entre deux vecteurs de donnĂ©es, donc toutes les combinaisons de leurs opĂ©randes (opĂ©ration en N^2) et ensuite l'opĂ©rateur / d'en comprimer le rĂ©sultat selon une autre opĂ©ration. L'ensemble exprime le calcul combinatoire demandĂ© Ă  ce calculateur, de mĂȘme qu'une requĂȘte SQL exprime ce qui est demande Ă  une base de donnĂ©es, sans avoir Ă  rentrer dans le dĂ©tail du calcul.

La version 17.0 de l'APL de Dyalog () utilise automatiquement les instructions vectorielles des architectures x64, POWER et ARM[64].

Deux successeurs d'APL sont le langage A+, et le langage J, ce dernier ayant Ă©tĂ© promu par K. E. Iverson lui-mĂȘme, et ne nĂ©cessitant pas l’usage de caractĂšres spĂ©ciaux. APL possĂšde toutefois une lisibilitĂ© supĂ©rieure, Ă  condition de disposer de la police de caractĂšres appropriĂ©e. La mise Ă  disposition du langage lui-mĂȘme n’aurait pas Ă©tĂ© possible dĂšs 1969 sans les terminaux IBM Ă  boule Ă©galement nommĂ©s Selectric (par exemple le 2741). Sur les terminaux purement alphanumĂ©riques 2260, il fallait utiliser des mots-clĂ©s peu lisibles. Les terminaux 3270, dĂšs le 3277, ont permis par la suite les jeux de caractĂšres APL ainsi que les minuscules latines.

Pour information, des calculs sur un Celeron 300 MHz de 2004 s’effectuent Ă  peu prĂšs en un dixiĂšme du temps de calcul qu’ils prenaient en 1970 sur un IBM 360/91. Le cƓur de l’interprĂ©teur tient entiĂšrement dans le cache d'instructions d’un microprocesseur contemporain (2020)[65], donnant Ă  APL des performances en exĂ©cution comparables Ă  celles de langages compilĂ©s, comme dans cet exemple :

      ⎕cr 'test'
test;s       
⎕ts          
s←+/Ă·âł1000000
⎕ts          
      test
2016 5 7 14 20 52 301 
2016 5 7 14 20 52 350

On voit ici que le calcul du nombre harmonique H1000000 prend 49ms (350 - 301) dans le time stamp[66]. Ce calcul a Ă©tĂ© rĂ©alisĂ© sur un Core i7 4500U, passmark de 3800 environ[67]. Il prend 36ms sur un Core i7 4790 au passmark de 10000 (Ă  comparer, sur cette seconde machine, avec 13ms pour le mĂȘme calcul en langage C et, curieusement, 13ms aussi en Dyalog APL 64 bits version 15).

Graphpak est un des espaces de travail fournis avec l'APL d'IBM et combinable avec toute autre application de l’utilisateur pour lui donner des possibilitĂ©s d’entrĂ©e-sortie graphiques 2D comme 3D. La structure des appels du langage (pas de nĂ©cessitĂ© de parenthĂšses pour les appels de fonctions et de sous-programmes) permet de donner des ordres ayant une vague allure de langage naturel. Les Ă©lĂ©ments IBM et AP, fournis avec ce workspace, sont simplement des matrices contenant des coordonnĂ©es de points respectivement en 2D et en 3D, la premiĂšre colonne spĂ©cifiant une indication de tracĂ© (couleur et style), les autres les coordonnĂ©es en x, y et Ă©ventuellement z. Des fonctions permettent Ă©galement les entrĂ©es graphiques avec la souris ou le trackpad.

Quelques opinions

« APL is a mistake, carried through to perfection. It is the language of the future for the programming techniques of the past: it creates a new generation of coding bums ».
« APL est une erreur, poussĂ©e jusqu'Ă  la perfection. C’est le langage de l’avenir pour les techniques de programmation du passĂ© : il crĂ©e une nouvelle gĂ©nĂ©ration de fainĂ©ants du codage».
  • Roy Keir
« APL is a write-only language. I can write programs in APL, but I can’t read any of them ».
« APL est un langage en écriture seule. Je peux écrire des programmes en APL, mais je ne peux en lire aucun. »
  • Joel Moses
« APL is like a diamond. It has a beautiful crystal structure; all of its parts are related in a uniform and elegant way. But if you try to extend this structure in any way - even by adding another diamond - you get an ugly kludge ».
« APL est comme un diamant. Il a une superbe structure cristalline ; toutes ses parties sont en correspondance d’une façon uniforme et Ă©lĂ©gante. Mais si vous essayez d’étendre cette structure de quelque façon que ce soit — mĂȘme en y ajoutant un autre diamant — vous obtenez un bricolage hideux ». (Allusion au passage d’APL Ă  APL2).
« Je ne recommanderais pas de mettre rapidement APL entre les mains des étudiants[68] ».
Le professeur Arsac insiste en 1978 sur le fait qu'il ne remet nullement en cause l'intĂ©rĂȘt du langage lui-mĂȘme)[69]

Lisibilité

Exemple de constitution d'un triangle de Pascal en APL.

Épargnant l’usage des indices et des boucles en multipliant les opĂ©rateurs, APL permet l'Ă©criture rapide et concise d'expressions ou de programmes qui seraient bien plus longs avec un langage classique. Vu la compacitĂ© et la puissance du langage, quelques puristes ont considĂ©rĂ© un temps que pour ĂȘtre « Ă©lĂ©gant », un programme APL ne devait pas dĂ©passer une ligne de code. Ces programmes, nommĂ©s one-liners dans la revue de l'ACM APL Quote-Quad Ă©taient les ancĂȘtres des deulignes[70] de ce qui sera plus tard Hebdogiciel.

Quelques problĂšme rĂ©crĂ©atifs Ă©taient parfois posĂ©s. Par exemple « comment effectuer la somme des Ă©lĂ©ments d'un tableau A (en principe +/A) quand les touches + et / ne fonctionnent pas ? ». Une rĂ©ponse possible Ă©tait 1⊄A (Ă©valuation de A comme un nombre exprimĂ© en base 1 !). Un autre Ă©tait : "trouver la façon la plus concise de calculer la moyenne d'un vecteur V (ordinairement notĂ© (+/V)Ă·âŽV) avec pour rĂ©ponse VâŒčV=V.

Cependant, la multiplicité des glyphes, leur usage unaire ou binaire, les superpositions de caractÚres censées les exprimer à l'époque des terminaux électromécaniques[71] ont fait qualifier ce langage de cryptique. L'absence de mécanismes conditionnels amenait par ailleurs chacun à employer diverses astuces nuisant à la lisibilité et à la maintenance des applications, sauf à introduire des fonctions au nom aussi parlant que possible.

           ⎕cr 'if'
z←a if b
z←b/a   
      'bonjour' if 1<0
      'bonjour' if 1<3
bonjour

Questions de sémantique

Dyalog APL interprÚte différemment, mais les parenthÚses permettent de préciser ce qui est désiré.
L'interprétation de NARS2000 est de considérer l'indexation comme portant sur l'élément le plus proche.
L'interprĂ©tation de GNU APL est la mĂȘme que celle de NARS2000.

Quelques cas trÚs particuliers de sémantique partagÚrent les différents éditeurs. Ainsi, si A, B et C sont trois vecteurs de trois éléments, doit-on comprendre l'expression A B C[2] comme un vecteur de vecteurs ayant pour éléments le vecteur A, le vecteur B et le scalaire C[2] ? Tel est le choix d'interprétation de NARS2000. C'est également celui de GNU APL, comme celui d'IBM pour son APL2.

Dyalog, premier Ă  introduire les tableaux de tableaux dans un APL commercial, avait alors fait le choix inverse et considĂ©rait l'expression comme Ă©quivalente Ă  B. Bien qu'il suffise d'utiliser des parenthĂšses pour Ă©viter toute ambiguĂŻtĂ©, cet Ă©diteur qui ne souhaitait pas introduire de problĂšmes de portage introduisit une variable systĂšme nouvelle, ⎕ML (migration level). Si cette variable est Ă  0, l'interprĂ©tation Dyalog s'applique. Sinon, c'est l'interprĂ©tation gĂ©nĂ©rale. Par ailleurs, la valeur de cette variable systĂšme peut ĂȘtre diffĂ©rente dans des fonctions diffĂ©rentes qui lui donnent une valeur locale (dans un Ă©cosystĂšme de fonctions, par exemple), ce qui permet une interopĂ©rabilitĂ© souple.

Adressage associatif

APL n’a jamais officiellement connu les tables associatives, indexant un tableau avec autre chose que des valeurs entiĂšres, incorporĂ©es dans d'autres langages interprĂ©tĂ©s (Perl, Javascript, PHP...). On ne peut donc pas Ă©crire :

CAPITALE[⊂'FRANCE']←⊂'PARIS'

ou, pour rester dans le vectoriel,

CAPITALE['FRANCE' 'ESPAGNE' 'ITALIE']←'PARIS' 'MADRID' 'ROME'

ce qui est contraignant, car :

  1. une telle extension ne demanderait que trĂšs peu de modification de syntaxe, et n'en demanderait aucune des programmes existants ;
  2. les langages modernes permettent l'indexation par des chaĂźnes de caractĂšres (soit l'indexation des tableaux comme en PHP qui autorise Ă  Ă©crire $capitale['France']='Paris';, soit via des objets voisins comme les tableaux associatifs en Perl[72]) ;
  3. rares sont les applications oĂč il ne faille pas gĂ©rer des accĂšs par symboles plutĂŽt que par numĂ©ros. Si APL ne le permet pas de façon immĂ©diate, l’utilisateur se tourne naturellement vers d’autres langages rĂ©pondant mieux Ă  ses besoins.

Il est peu ergonomique de contourner cette lacune au prix de variables supplĂ©mentaires, par exemple : FRANCE←32 (dĂšs lors, CAPITALE[FRANCE]←⊂"PARIS". Si le pays provient d'une saisie, l'indice peut ĂȘtre retrouvĂ© par "execute" : ⍎"FRANCE" qui rend 32, mais l'application perd en robustesse et on encombre inutilement la table des symboles (APL/X contourne la difficultĂ© par des namespaces).

Une autre maniĂšre est de dĂ©finir un vecteur des noms de pays : PAYS ←'BELGIQUE' 'FRANCE' , l'instruction devenant alors : CAPITALE[PAYS⍳⊂'FRANCE']←⊂'PARIS'

Mais en ce cas, indépendamment de la lisibilité plus faible, le temps d'accÚs n'a plus le moindre rapport avec un accÚs direct de type « hash » en Perl ou PHP, surtout si s'il y a des centaines de noms. Non seulement la lisibilité des programmes n'y gagne rien, mais leur facilité de maintenance s'effondre compte tenu des variables surajoutées au programme.

Ce besoin est pris en compte dans les objectifs du projet NARS[73]. Dyalog APL permet de le contourner par son mécanisme non-standard des espaces de noms (namespaces)[74].

Approche objet et programmation fonctionnelle

Exemple de programmation fonctionnelle en APL : l'affectation Ă  l'identificateur somme de l'expression +/ associe cet identificateur Ă  la fonction effectuant la somme selon le dernier indice de ce qui se trouve Ă  sa droite. Les opĂ©rateurs et primitives sont donc utilisables comme opĂ©randes au mĂȘme titre que les vecteurs.

Dyalog propose quelques espaces de travail et documentations PDF sur l'approche objet en APL, ainsi que sur la programmation fonctionnelle. Un exposé particuliÚrement clair sur APL en tant que notation algébrique rendue plus cohérente qu'en algÚbre classique, et incluant des éléments de programmation fonctionnelle et effectué chez Google par Morten Kromberg est visible ici.

Essayer APL

Utilisation de la page TryAPL.
Exemple de session de travail avec la version gratuite (32 bits) de Dyalog APL
L'ancĂȘtre de toutes les versions d'essai gratuites d'APL : TRYAPL2.EXE d'IBM, ici sous DOSBox, qui disposait du mĂȘme session manager que les versions mainframe

Sans avoir besoin d'installer APL, on peut l'essayer sur cette page : http://tryapl.org/ pour frapper quelques expressions, les exécuter et en examiner le résultat (illustration de gauche).

Pour inclure dans la ligne de test les caractĂšres APL de son choix, on les clique dans la partie de gauche de l'Ă©cran (onglet "Primer"). La variable systĂšme ⎕PP (printing precision) spĂ©cifie le nombre de dĂ©cimales Ă  afficher. D'autres variables sont ⎕IO (index origin, 0 ou 1), ⎕TS (time stamp, horodatage), etc. Des suggestions d'expression Ă  exĂ©cuter sont proposĂ©es lorsque le pointeur de la souris passe au-dessus de tel ou tel caractĂšre, entre autres les opĂ©rateurs de tri croissant et dĂ©croissant, ⍋ (grade up et ⍒ (grade down). La ligne frappĂ©e est exĂ©cutĂ©e lorsqu'on presse la touche Envoi (retour ligne), Ă  la suite de quoi le rĂ©sultat de l'exĂ©cution s'affiche et une nouvelle expression peut ĂȘtre introduite.

Cette page TryAPL est proposée par une société, Dyalog, qui autorise à télécharger gratuitement une version complÚte de son interpréteur (version 32 bits ou 64 bits) pour des usages personnels et non commerciaux. Chaque version gratuite est "tatouée" par un numéro de série attribué à titre personnel au demandeur. Pour les usages autres que personnels existent aussi des licences d'entreprise.

Documentation

Français

Anglais

Vidéos

Usage du langage

  • S. Pommier, Introduction Ă  A.P.L., Dunod, (ISBN 2-04-010402-X)
    (Nom collectif d'une Ă©quipe de l'École nationale supĂ©rieure des mines de Saint-Étienne : Jean-Jacques Girardot, Serge Guibout-Ribaut, Bertrand Jullien, François Mireaux et Michel Nakache[75])
  • Bernard Robinet, Le langage APL, Éditions TECHNIP,
  • Robert Caillibot, Marcel Dupras et Claire Girard, Programmation en langage APL, Les Presses de l'UniversitĂ© Laval,
  • (en) Sandra Pakin et James A. Brown, APL 2 at a Glance, Prentice-Hall, (ISBN 978-0-13-038670-0)

Fondements du langage

  • (en) Federico Biancuzzi et Shane Warden, Masterminds of Programming, Conversations with the Creators of Major Programming Languages, O'Reilly, 2009. [chapitre Trois : entretien avec Adin Falkoff]
  • (en) Kenneth Iverson, A Programming Language, John Wiley and Sons, (1962), lisible Ă©galement en ligne.

Gestion des objets en interne

Bibliographie

Articles connexes

Liens externes

Notes et références

  1. Également anglais : Array Programming Language
  2. Kenneth Iverson sur APL
  3. Clavier APL : cliquer un symbole renseigne sur sa signification
  4. "La vraie puissance d'APL réside dans sa capacité à exprimer simplement une idée simple" (Dyalog)
  5. APL revit-il ?
  6. Un passionné décrit Dyalog APL avec enthousiasme
  7. « Implementing a bignum calculator - Rob Pike - golang-syd November 2014 » [vidéo], sur YouTube (consulté le ).
  8. « Robpike/ivy », sur GitHub (consulté le ).
  9. « APL in Unicode », sur sudleyplace.com (consulté le ).
  10. (en) [PDF] Historique d'APL, par Adin Falkoff (IBM)
  11. (en) [PDF] APL since 1978 (ACM, 2020)
  12. The Hadoop Ecosystem diapo 5 et suivantes
  13. Iverson appelait au début son langage IBM (Iverson's Better Maths)
  14. TECHNIP : Description de l'Ă©quipe informatique
  15. L'OFFRE APL
  16. recherches concernant le langage APL sur Google. En 2017, on constate sur la carte fournie par Google que l'Iran et l'IndonĂ©sie semblent porter un intĂ©rĂȘt particulier Ă  ce langage/
  17. APL: la technologie
  18. Cet exemple était présenté par Claude Hans dans une brochure interne du centre scientifique IBM de Grenoble. Il fut repris par Bernard Robinet dans son ouvrage sur le langage.
  19. De mĂȘme qu'une primitive agit sur des opĂ©randes, un opĂ©rateur agit sur des primitives. Ainsi l'opĂ©rateur / (reduction) compose la primitive qui le prĂ©cĂšde sur la totalitĂ© d'un vecteur. Par exemple +/X effectue la somme de tous les Ă©lĂ©ments de X, x/X leur produit, etc., ce qui correspond en algĂšbre aux signes sigma et pi.
  20. (en) [PDF] Nombres hypercomplexes en APL
  21. (fr) Quaternions en APL
  22. Primes
  23. Exemple : la puissante expression ((ρL)ρ⍋⍋LÎčL,R)Îč(ρR)ρ⍋⍋LÎčR,L
  24. Opérateur combinatoires sur les ensembles
  25. La commande systĂšme )box on permet en NARS2000 d'effectuer un ⎕fmt automatique chaque fois que nĂ©cessaire, ce qui facilite l'apprentissage d'APL (Les boĂźtes s'affichent correctement avec la police SimPL, utilisable dans LibreOffice mais pas encore dans WikipĂ©dia).
  26. Parfois nommĂ©e unquote, puisqu'inverse de la fonction de mise en forme quote (⍕)
  27. Cette notion a été reprise ensuite dans d'autres langages (FORTH, Smalltalk, C++) sous le nom de persistance.
  28. The APL idiom list, Yale, 1977
  29. The FinnAPL Idiom Library
  30. APL2 idioms library, IBM Endicott
  31. DyalogAPL : idioms cheat sheet
  32. Toward a lexicon of musical APL2 phrases, Stanley Jordan, 1991
  33. http://c2.com/cgi/wiki?AplusLanguage
  34. http://www.aplusdev.org/About/index.html
  35. Exemple de session en A+
  36. https://www.gnu.org/software/apl/
  37. http://wotho.ethz.ch/mvt4apl-2.00/
  38. http://www.rogerbowler.fr/hercules.htm
  39. http://wiki.nars2000.org/
  40. http://www.nars2000.org/download/Download-body.php
  41. http://wiki.nars2000.org/index.php?title=Platforms
  42. Wine ne supporte pas encore officiellement le 64 bits en 2014.
  43. Histoire détaillée d'APL
  44. Joris van der Hoeven, « Ball arithmetic », sur researchgate.net, unknown, (consulté le ).
  45. http://wiki.nars2000.org/index.php/Ball_Arithmetic
  46. OpenAPL sur SourceForge
  47. Depuis le 30 juin 2016, la gratuitĂ© pour l'usage strictement personnel et non-commercial s'Ă©tend mĂȘme Ă  la version 64 bits, hormis pour le Raspberry Pi qui reste en 32 bits.
  48. Morten Kromberg, CTO, Dyalog Ltd. talks at Google
  49. Gratuité d'APLX sous Linux en usage personnel
  50. APLX, de MicroAPL.
  51. APLX toutes versions téléchargeable dorénavant sans frais.
  52. Le MCM-70. On remarque les deux unités de cassettes intégrées, qui étaient optionnelles.
  53. http://www.afapl.asso.fr/
  54. TryAPL2 pour Android, avec un clavier virtuel tactile dans le Play Store https://play.google.com/store/apps/details?id=gemesys.keybrd
  55. An Open Letter to Hobbyists
  56. APL2 version 2
  57. http://wiki.nars2000.org/index.php/Language_Features
  58. http://aplwiki.com/AplCharacters#The_.22APL385_Unicode.22_Font
  59. Il s'agit d'une police en chasse fixe. Une police APL333 en chasse proportionnelle est Ă©galement fournie.
  60. Les caractÚres soulignés n'y étant cependant pas représentés en tant que tels
  61. RĂ©affecter les touches d'un clavier Windows, Microsoft
  62. Symboles 2336 Ă  237A.
  63. Par exemple la métaphore de Thierry Breton sur l'appel d'offres instantané dans la section citée décrit exactement la primitive APL de compression "/".
  64. Spécifications techniques de Dyalog APL version 17.0
  65. L'interpréteur entier occupe dans les 8 Mio, ce qui est la taille du cache d'un simple Intel 8565U
  66. / La fonction systĂšme ⎕ts ramĂšne le temps sous la forme d'un vecteur contenant annĂ©e, mois, jour, heure, minute, seconde et millisecondes. La fonction systĂšme ⎕t ramĂšne juste un nombre de secondes avec dĂ©cimales, Ă©valuĂ© Ă  la prĂ©cision de l'horloge interne de l'ordinateur
  67. 45ms avec la version 0.4.14.28 de mai 2016
  68. Interview, 01 Hebdo
  69. Jacques Arsac Ă  propos d'APL
  70. Les « deulignes » d'Hebdogiciel.
  71. Sur un terminal Selectric Ă  boule du type IBM 2741, les caractĂšres ⍟âŒč⍱âČ⍋⍒⌿⍞⍕⍝, pour ne citer qu'eux, devaient s'Ă©crire par superposition de ○*⎕∹~∧∆∣∇/-⎕'⊀∘⊄∩, ce qui Ă©tait fastidieux et tueur de concentration. MĂȘme le ! demandait une superposition du ' et du . !
  72. $capitale{'France'}='Paris';
  73. http://wiki.nars2000.org/index.php/Associative_indexing
  74. Espaces de noms en Dyalog APL
  75. Annales des mines, Compagnie française d'éditions, 1980)
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.