APL (langage)

Si certains caractères de cet article s’affichent mal (carrés vides, points d'interrogation…), consultez la page Unicode.
Image manquante
Langage_progr.png
image:Langage_progr.png

Cet article fait partie de la série
Langages de programmation
Langages à objets
Ada 95 - C++ - C#
Common Lisp
Delphi - Eiffel - Java
Nice - Oz - Python
Simula - Smalltalk
Visual Basic
Langages impératifs
APL - ASP - Assembleur
BASIC - C - COBOL
Forth - FORTRAN - Logo
Pascal - Perl - PHP
Langages fonctionnels
Erlang - Haskell
ML/OCaml - Oz
Lisp/Common Lisp
Scheme
Langages déclaratifs
Clips - Oz - Prolog
Langages concurrents
Ada 95 - Erlang
Java - Oz
Langages balisés
HTML - SGML - XML
Dialectes XML
S-expressions
Voir aussi
Conception - Codage
Tests - Optimisations

L'APL (initialement A Programming Language, officieusement Array-Processing Language)) est un langage de programmation conçu entre 1957 et 1967 par K. E. Iverson pour décrire commodément des opérations portant globalement sur des tableaux (booléens, numériques ou, dans une moindre mesure, de caractères).

Sommaire

Historique

APL s’est montré particulièrement adapté en son temps 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, par exemple en permettant d’écrire simplement :

MOYENNE X pour (+/X)÷⍴X.

NORMALISER X pour X÷+/X

etc.

Il permet de manipuler aisément des tableaux de 1 à N indices (N variant de 7 à 255 selon l’implémentation considérée) de façon globale. Les opérations puissantes de feuilletage (lamination) ainsi que les opérateurs de réduction, expansion, compression, 'produit intérieur et produit extérieur évitent souvent toute nécessité d’indices de boucle explicite - ainsi d’ailleurs que l’usage de boucles lui-même.

Il utilise de nombreux symboles représentant des opérations utilisables en programmation comme en calcul immédiat à la console, par exemple le « domino » (⌹) qui inverse directement une matrice, ou résout un système d’équations linéaires surdimensionné au sens des moindres carrés.

On estimait dans les années 70-80 qu’une équipe de 5 développeurs APL avait la puissance de développement d’une équipe de 25 programmeurs FORTRAN. L’application APL se montrait toutefois plus gourmande en ressources.

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

Présentation rapide

Image manquante
APL2-AtomicVector-François-Dominique.png
Table des 256 caractères APL2 (alias atomic vector ⎕AV) présenté en forme 16x16; les 32 premiers sont réservés à des fonctions de commande du terminal, dont comme on le voit le retour à la ligne en 14ème position.

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

Image manquante
APL-800x700-François-Dominique.png
Exemple de dialogue APL2 (ici, sous Windows) : une encapsulation (DISPLAY) des tableaux est ici ajoutée pour mettre en évidence leur structure.

Celles-ci se passent de commentaires :

     ⎕←A←2 2⍴⍳4
 

1 2
3 4

     A,5
 

1 2 5
3 4 5 (concaténation de scalaire)

     A,+/A
 

1 2 3
3 4 7 (concaténation de colonne)

     A,[1]+A
 

1 2
3 4
4 6

     A,[1]×⌿A     (concaténation de ligne)
 

1 2
3 4
2 12

     A,[.5]0      
 

1 2
3 4

0 0
0 0 (concaténation sur nouvelle dimension)

Image manquante
APL2-Chrono-Primes1000-François-Dominique.PNG
Chronométrage du calcul de nombres premiers sur un Celeron 2,6 MHz.
Image manquante
APL2-fonction-CHRONO-François-Dominique.PNG
La fonction utilisée pour le chronométrage.
     0,A
 

0 1 2
0 3 4

     A,[1.5]0
 

1 2
0 0

3 4
0 0 (concaténation sur nouvelle dimension)

     ⎕←A←1 2∘.×3 4 5 6 7
 

3 4 5 6 7
6 8 10 12 14 (produit externe alias cartésien)

     (,A)[⍋,A]
 

3 4 5 6 6 7 8 10 12 14 (opérateur 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 » (multiplisation 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.

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 tableau est nommé profondeur (depth).

Espace de travail

Image manquante
APL2-horodatage-François-Dominique.png
Liste des fonctions d’une workspace écrites en 2004; on encapsule en général ce genre de formule dans une fonction à laquelle on donne un nom convivial!

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

Ainsi, 7 5 6 - 4 3 2 <=> 3 2 4, mais 7 5 6 ¯4 3 2 <=>... 7 5 6 ¯4 3 2

Implémentations

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, les CII 10070 et Iris 80, le Burroughs B1700, le Bull SEMS T1600 (ex-Télémécanique Electrique T1600), etc. Ce langage était même directement en ROM dans des ordinateurs personnels du milieu des années 70 comme le MCM-70 ou l’IBM 5110.

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 et même le DOS (une version gratuite nommée TRYAPL2 existe pour le DOS, en version anglaise comme française).

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 mainframe équipés de dizaines de processeurs parallèles depuis la même session.

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

Situation présente du langage

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 comme pour le Macintosh. La généralisation des écrans et des imprimantes à laser ont éliminé l’ancien problème que représentait l’usage de caractères spécifiques. Les caractères APL/APL2 sont d’ailleurs présents dans l’Unicode.

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 et des instruction multimédia (SSE) de l’architecture Intel/AMD.

Il a deux successeurs, le langage A+, et le langage J, ce dernier étant 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)

Pour information, des calculs actuels typiques sur un Celeron 300 MHz 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 (2004), donnant à APL des performances comparables à celle qu’on obtenait il y a quelques années avec un langage compilé.

Image manquante
APL-GRAPHPAK-François-Dominique.PNG
Exemple de session GRAPHPAK. Si GRAPHPAK ne peut prétendre rivaliser avec des logiciels de présentation professionnels, il se montre néanmoins bien utile pour suivre des calculs scientifiques ou effectuer quelques visualisation 3D simples

GRAPHPAK est une des workspaces fournies avec APL 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 cette workpsace, 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).

Caractères APL/APL2 en Unicode

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.

' ( ) + , - . /  :  ; < = >  ? [ ]
\ _ ¨ ¯ × ÷

Tous les caractères APL ne sont pas encore associés à une signification aujourd'hui (2004).

Quelques opinions

Edsger Dijkstra

« 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 essayer 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).

Jacques Arsac

« Je ne recommanderais pas de mettre rapidement APL entre les mains des étudiants ».

Lacune d’APL

APL n’a jamais officiellement permis d’indexer un tableau avec autre chose que des valeurs entières. On ne peut pas par exemple y écrire

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

ou, pour rester dans le vectoriel,

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

ce qui est regrettable, car :

  1. une telle extension ne demanderait que très peu de modification de syntaxe, et n'en demanderait aucune des programmes existants
  2. tous les langages modernes permettent l'indexation par des chaînes de caractères (par exemple les hashs en Perl permettent d’écrire $capitale{'France'}='Paris';
  3. Très 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 de façon fort naturelle vers d’autres langages répondant mieux à ses besoins.

APL, langage cryptique ?

Image manquante
APL-est-il-cryptique-François-Dominique.png
APL est-il cryptique ?. Cliquez sur cette copie de fenêtre pour en juger par vous-même.
Parce qu’il épargne l’usage des indices, APL permet d’écrire de façon concise et rapide des expressions qui seraient bien plus longues avec un langage classique. Pour cette raison, il a été parfois qualifié de langage cryptique. Cet avis est-il fondé ? À vous d’en juger :
Image manquante
APL2-ObjectEditor-FFT-FDA.PNG
Codage d’une transformée de Fourier rapide en nombres complexes en APL2 (fournie en standard avec le langage en compagnie de quelques autres fonctions mathématiques)


Liens externes

Interpréteurs gratuits pour PC

FAQ et intro en HTML

Documentations en format PDF

Divers

See also: APL (langage), 1957, 1967, 1969, 1990, AIX, Active server pages, Ada (langage)