APL (langage) 91480 31061103 2008-06-27T09:36:00Z Thesupermat 135489 /* Présentation rapide */ typo {{voir homonymes|APL}} {{Unicode}} <small>(la police "Arial Unicode" conviendra parfaitement)</small> L''''APL''' (initialement ''A Programming Language'', officieusement ''Array-Processing Language'') est un [[langage de programmation]] conçu entre [[1957]] et [[1967]] par [[Kenneth 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). == 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 et 370|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 (mathématiques)|matrice]], ou résout un système d’[[équations linéaires]] surdimensionné au sens des [[Méthode des moindres carrés|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]]<ref>TECHNIP : Description de l'équipe informatique</ref>. L’application APL se montrait plus gourmande en ressources, mais le prix de celles-ci était en constante diminution. Son interface initiale (bicolore en mode machine à écrire) a inspiré celle de logiciels comme [[Maple]]. == 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 (informatique)|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<br /> 3 4<br /> (crée un matrice de 2 lignes et 2 colonnes et la remplit avec les nombres 1 2 3 4) A=2 0 1<br /> 0 0<br /> (le résultat est une matrice booléenne indiquant les éléments égaux à 2) A,A 1 2 1 2<br /> 3 4 3 4<br /> (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'''<br /> 3 4 '''5'''<br /> (concaténation du scalaire 5 à la matrice) A,+/A 1 2 '''3'''<br /> 3 4 '''7'''<br /> (concaténation d'un vecteur : la somme des lignes) A⍪+⌿A 1 2<br /> 3 4<br /> '''4 6'''<br /> (même chose suivant l'autre axe : colonnes) A,[.5]0 1 2<br /> 3 4<br /> <br /> '''0 0'''<br /> '''0 0'''<br /> (concaténation en créant une nouvelle dimension : matrice devient cube) A,[1.5]0 1 2<br /> '''0 0'''<br /> <br /> 3 4<br /> '''0 0'''<br /> (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<br /> 6 8 10 12 14<br /> (produit externe alias cartésien alias table de multiplication) (,A)[⍋,A] 3 4 5 6 6 7 8 10 12 14<br /> (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 » (multiplisation entre termes) ''×/'', « Union » (''ou'' logique entre termes) ∨''/'', etc. On parle, dans d'autres langages, de [[Clôture (mathématiques)|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 tableau 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é<ref>Cette notion a été reprise ensuite dans d'autres langages ([[Forth (langage)|FORTH]], [[Smalltalk]], [[C++]]) sous le nom de [[persistance (informatique)|]]</ref>. 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'' (=''AT''tributes). 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 s’applique à un vecteur, du ''signe négatif'' qui ne porte que sur la valeur numérique qui le suit immédiatement. 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) == Implémentations == === Architectures matérielles === Des interpréteurs APL ont existé pour l’[[IBM 7090]], les [[IBM 360 et 370|IBM 360 à zSeries]] (sous [[Time Sharing Option|TSO]], [[VM/CMS]] et même [[Customer Information Control System|CICS]]!), l’[[IBM 1130 et 1800|IBM 1130]], le ''Xerox XDS Sigma 7'' alias [[CII 10070]], et le [[Compagnie internationale pour l'informatique|CII]] [[Iris 80]], le [[Bull DPS-7]], le [[Burroughs B1700]], le [[T1600|Bull SEMS T1600]] (ex-''Télémécanique Électrique T1600''), la série des Mitra, etc. Ce langage était même directement en [[Mémoire morte|ROM]] dans des ordinateurs personnels du milieu des années 70 comme le ''MCM-70'' ou l’[[IBM 5100 et 5110|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 (informatique)|Solaris]], [[Linux]], [[Microsoft Windows|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). La société [[Microsoft]] elle-même considérait l'[[APL (langage)|APL]] comme le successeur naturel de son [[BASIC]] et avait entrepris deux implémentations du langage sur [[8080]] et [[6800]], comme le montre un extrait de lettre de [[Bill Gates]] aux utilisateurs de l'[[Altair BASIC]]. Le succès de [[DOS]], de [[Windows]] et surtout des [[tableur]]s [[Multiplan]] et [[Excel]] fit en fin de compte abandonner ce projet, qui s'adressait à un marché potentiel bien plus restreint. === Environnements informatiques === 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 System|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 [[Compatible PC|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 (informatique)|pipeline]] des processeurs modernes. Elles utilisent extensivement les possibilités vectorielles du [[IBM 360 et 370|S/390 (zSeries)]], de l’architecture [[PowerPC]] et des instruction multimédia ([[Streaming SIMD Extensions|SSE]]) de l’architecture Intel/AMD. Il a deux successeurs, le langage [[A plus (langage)|A+]], et le langage [[J (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''). 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 et 370|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 [[compilateur|compilé]]. [[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. <big> {| |- align=center |' || ( || ) || + ||, || - || . || / || : || ; || &lt; || = || &gt; || ? || [ || ] |- align=center | \ || _ ||¨ || ¯ || × || ÷ || ← || ↑ || → || ↓ ||∆ || ∇ || ∘ || ∣ || ∧ || ∨ |- align=center | ∩ || ∪ || ∼ || ≠ || ≤ || ≥ || ≬ || ⊂ || ⊃ || ⌈ ||⌊ || ⊤ || ⊥ || ⋆ || ⌶ || ⌷ |- align=center | ⌸ || ⌹ || ⌺ || ⌻ || ⌼ || ⌽ || ⌾ || ⌿ || ⍀ || ⍁ || ⍂||⍃ || ⍄ || ⍅ || ⍆ || ⍇ |- align=center | ⍈ || ⍉ || ⍊ || ⍋ || ⍌ || ⍍ || ⍎ || ⍏ || ⍐ || ⍑ || ⍒ ||⍓ || ⍔ || ⍕ || ⍖ || ⍗ |- align=center | ⍘ || ⍙ || ⍚ || ⍛ || ⍜ || ⍝ || ⍞ || ⍟ || ⍠ || ⍡ || ⍢ ||⍣ || ⍤ || ⍥ || ⍦ || ⍧ |- align=center | ⍨ || ⍩ || ⍪ || ⍫ || ⍬ || ⍭ || ⍮ || ⍯ || ⍰ || ⍱ || ⍲ ||⍳ || ⍴ || ⍵ || ⍶ || ⍷ |-align=center | ⍸ || ⍹ || ⍺ || ⎕ || ○ |} </big> 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 ».<br /> ''« 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). === [[Jacques Arsac]] === « Je ne recommanderais pas de mettre rapidement APL entre les mains des étudiants »<ref>Interview, ''01 Hebdo''</ref>. Les anglosaxons n'ont pas d'état d'âme quant à l'utilisation des langages informatiques Pour eux , c'est l'efficacité et la productivité qui comptent Pour les anciens et les étudiants, il faut visiter le site de la socièté DYALOG LTD www.dyalog.com pour en savoir plus sur l'évolution d'APL qui tourne actuellement sur toutes les plateformes du POCKET PC au SUPERCALCULATEUR tournant sous UNIX Pour les Universités et les grandes écoles, le langage APL de cette société est gratuit. == 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 : # une telle extension ne demanderait que très peu de modification de syntaxe, et n'en demanderait ''aucune'' des programmes existants # tous les langages modernes permettent l'indexation par des chaînes de caractères (par exemple les ''hashs'' en [[Perl (langage)|Perl]] permettent d’écrire ''$capitale{'France'}='Paris';'' # 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. Il est peu ergonomique de contourner cette lacune au prix de variables supplémentaires, comme 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 (langage)|Perl]], 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 supplémentaires ainsi ''surajoutées'' dans le programme. == APL, langage cryptique ? == [[Image:APL-est-il-cryptique-François-Dominique.png|thumbnail|right|440px|'''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:APL2-ObjectEditor-FFT-FDA.PNG|thumbnail|left|440px|'''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)]] <br clear="all" /> Etant donné la compacité et la puissance du langage, certains puristes considéraient 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'[[Association for Computing Machinery|ACM]] ''APL Quote-Quad'' étaient les ancêtres des ''deulignes'' de ce qui sera plus tard [[Hebdogiciel]]. == Références == <references /> == Voir aussi == * [[Scilab]] ==liens externes== {{trop de liens}} === FAQ et intro en HTML === * [http://www.math.uwaterloo.ca/apl_archives/apl/faq.html FAQ APL] (en anglais, avec liens) === Documentations en format PDF === * [http://www-306.ibm.com/software/awdtools/apl/library.html Documentation APL gratuite en format PDF] * [http://www.microapl.co.uk/APL/aplx_docs.html Documentation APLX] (PDF, anglais, contient une très bonne introduction à APL aussi) === Divers === * {{en}} [http://www.aplusdev.org/ Langage A+] {{Portail|programmation informatique}} [[Catégorie:Langage de programmation|Apl (Language)]] [[Catégorie:Langage impératif|Apl (Language)]] [[an:APL]] [[da:APL]] [[de:APL (Programmiersprache)]] [[en:APL (programming language)]] [[eo:APL]] [[es:APL]] [[fi:APL (ohjelmointikieli)]] [[gl:APL]] [[hu:APL]] [[it:APL]] [[ja:APL]] [[ms:Bahasa pengaturcaraan APL]] [[nl:APL]] [[no:APL]] [[pl:APL (język programowania)]] [[pt:APL]] [[ru:АПЛ (язык программирования)]] [[sv:APL]] [[tg:АПЛ (забони барноманависӣ)]] [[zh:APL語言]]