APL (langage) - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Présentation rapide

APL innovait à son époque par plusieurs aspects conviviaux : pas de déclaration de types ni de tailles, une variable contenant tout simplement ce qu’on a mis dedans (scalaire ou tableau) ; 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 quelque chose est calculé et que le résultat n’est pas mémorisé dans une variable, alors on l’affiche simplement au terminal dans le format estimé le plus lisible. Ainsi pour écrire « Hello, World! » en APL, les choses se passent ainsi :

  • 'Hello, World!' (tapé par l’utilisateur)
  • Hello, World! (réponse du terminal)
  • 2+2 3 5 7
  • 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]
  • THE CAT

Voire :

  • 'LE CHAT'[2 3⍴7 5 2 4 6 7]
  • THE
  • CAT

Grâce à sa priorité de gauche à droite, le langage se lit simplement, comme un langage naturel :

« 1 plus somme des inverses des factorielles des entiers de 1 à 30 » :

  • 1++/÷!⍳30
  • 2.718281828

Une extension d'APL, nommée APL2, gère quant à elle des tableaux de tableaux, et permet à l'utilisateur de définir lui-même ses propres « opérateurs ». Elle travaille également en nombres complexes automatiquement si les besoins du calcul le demandent.

Opérations sur tableaux

⎕←A←2 2⍴1 2 3 4
1 2
3 4
(crée un matrice de 2 lignes et 2 colonnes et la remplit avec les nombres 1 2 3 4)
A=2
0 1
0 0
(le résultat est une matrice booléenne indiquant les éléments égaux à 2)
A, A
1 2 1 2
3 4 3 4
(concaténation de la matrice à elle-même : le résultat est une matrice de 2 lignes et 4 colonnes)
A, 5
1 2 5
3 4 5
(concaténation du scalaire 5 à la matrice)
A, +/A
1 2 3
3 4 7
(concaténation d'un vecteur : la somme des lignes)
A⍪+⌿A
1 2
3 4
4 6
(même chose suivant l'autre axe : colonnes)
A, [.5]0
1 2
3 4

0 0
0 0
(concaténation en créant une nouvelle dimension : matrice devient cube)

A, [1.5]0
1 2
0 0

3 4
0 0
(concaténation en créant une nouvelle dimension sur un autre axe)

⎕←A←1 2∘.×3 4 5 6 7
3 4 5 6 7
6 8 10 12 14
(produit externe alias cartésien alias table de multiplication)
(, A)[⍋, A] 3 4 5 6 6 7 8 10 12 14
(fonction de tri)

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) ∨/, 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 sa 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.

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 (⍎) 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.

Le nombre d'indices d’un tableau est par convention nommé rang (rank) en APL. Le nombre de niveaux d’un tableau de tableaux est nommé profondeur (depth).

Espace de travail

L’utilisateur travaille dans un espace de travail 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é. 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.

Horodatage automatique

Chaque objet APL2 (variable, fonction ou opérateur) est horodaté dans la workspace, ce qui en permet une gestion plus aisée sur le long terme. Le type et la date des objets sont retournées par la fonction système ⎕AT (=ATtributes). Couplé aux opérateurs de tri ⍋ (grade-up) et ⍒ (grade-down), cet horodatage des objets facilite beaucoup le processus de développement.

Éléments anecdotiques

  • APL travaillant sur des vecteurs, il doit distinguer l’opération « - » (moins), qui désigne l'opération de soustraction entre deux variables numériques ou le changement de signe d'une variable numérique d'une part, du signe négatif qui ne porte que sur la valeur numérique qui le suit immédiatement, d'autre part. Celui-ci est noté par une barre supérieure « ¯ ».
Ainsi, 7 5 6 - 4 3 2 ⇔ 3 2 4, mais 7 5 6 ¯4 3 2 ⇔... 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 « \ » qui 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 vu le créneau spécifique de cette machine)
Page générée en 0.094 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise