Présentation du langage J
par Chris Burke
(Strand Software Systems Inc.)
I - LA
PRÉSENTATION
Chris a présenté J comme une version moderne d’APL, écrite par Ken Iverson et Roger Hui en un système complètement redéveloppé à partir de rien en 1989. Les premières versions furent distribuées en 1990 et la commercialisation débuta en 1994. A la question « Pourquoi J ? » Chris répondait en s’appuyant sur un transparent où on lisait:
J garde les meilleurs caractéristiques d’APL
J résout les problèmes d’APL
- le problème du jeu de caractères
- les fautes du langage
- un environnement de développement impropre
- l’isolation par rapport aux autres systèmes
- la difficulté d’y ajouter des nouveautés
suivi d’un autre comparant J et APL: Plus simple et plus cohérent Un environnement standard de programmation
- les programmes sont développés dans des fichiers « texte » ordinaires
-Utilise n’importe quel éditeur et système de commandes
- Accès aisé par les autres logiciels
Des nouveautés puissantes
- amélioration des primitives APL
- rang des fonctions
- programmation fonctionnelle
- structures de contrôle et espaces locaux
Chris a annoncé la version J3 aux performances supérieures à APL incluant les commandes WIN95 et le support OLE2 (J comme objet OLE, accès OLE à Excel, Word...)
Enfin Chris a
insisté sur l’intérêt qu’il y a à envisager J comme un serveur de calcul pour Visual Basic, Delphi, Excel, etc.
II - LES EXEMPLES
La présentation du langage J a eu pour but de donner aux APListes présents une idée des immenses possibilités du langage à partir de deux exemples simples : trier les mots d’une chaîne de caractères et concaténer une matrice à un vecteur.
1 - Tri de mots
L’affectation se fait en J à l’aide du signe =.
texte =.’’’’’’’'jules
marie henri anne gilbert'’
La fonction ;: prends les éléments (token) d’une chaîne de caractères et les enclôt.
lesmots =. ;: NB. définition d’une fonction
lesmots texte
jules |
marie |
henri |
anne |
gilbert |
Le nombre d’éléments du résultat est cinq (5 mots enclos).
Le tri est une fonction dyadique /: telle que x /: y trie x selon les indices donnés par le tri monadique /: y. Une fourche avec «déclore» (>) fait le reste sachant que la composition par fourche (g h) x signifie x g (h x).
tri=: /: >
tri les mots texte
anne |
gilbert |
henri |
jules |
marie |
On voit ainsi la différence entre (tri lesmots texte) et (tri texte)
tri texte
‘’’’
aaaabeeeghijlmmnnrrrrstyy
Définissons la conjonction «puissance» telle que (f puissance n) applique n fois la fonction f et définissons la conjonction «inverse» qui est «puissance moins un»:
puissance =. ^:
inverse =. puissance _1
«inverse» appliqué à «lesmots» crée la fonction qui déclot et remet en liste les éléments:
(lesmots inverse) lesmots texte
jules marie henri anne gilbert
On peut créer la fonction correspondante:
enliste =. lesmots inverse
enliste lesmots texte
jules marie henri anne gilbert
On peut, à l’aide d’une conjonction (opérateur), effectuer une fonction f1 sous une autre fonction f2, en ce sens qu’on applique d’abord f2, puis f1 au résultat, puis l’inverse de f2 au résultat final. Par exemple, raccorder deux fils électriques, c’est : dénuder les fils (f2), torsader le cuivre (f1) et remettre l’isolant (inverse de f2). On a torsadé le cuivre sous sa mise à nu : on a effectué f1 sous f2. Cette conjonction se note &. en J.
sous=: &.
trilesmots=. tri sous lesmots
trilesmots texte
anne gilbert henri jules marie
En synthèse, on montre ci-dessous comment on définit un tri alphabétique sur un vecteur de caractères et comment on le transforme en un tri sur les mots.
tri=. /: >
trilesmots=. tri &. ;:
texte =.’’’’’’’'jules
marie henri anne gilbert'
tri texte
‘’’’ aaaabeeeghijlmmnnrrrrstyy ‘’’’
trilesmots texte
anne gilbert henri jules marie
Incidemment, la conjonction « puissance » (introduite pour créer la conjonction « inverse ») peut être aussi exploitée sur des fonctions arithmétiques, y compris avec des arguments vectoriels. J offre la fonction « double » (notée +:) qui rend de nombreux services.
double=. +:
double 1
2
double double 1
4
double double double 1
8
double puissance (3) 1
8
double puissance (0) 1
1
double puissance (0 1 2 3 4 5 6 7 8 9) 1
1 2 4 8 16 32 64 128 256 512
double puissance(i. 10) 1 (i. est iota en ŒIO„0)
1 2 4 8 16 32 64 128 256 512
(Puissance moins 1) ou (puissance inverse) donne l’inverse de « double » qui est la fonction « moitié ».
double puissance (_1) 1
0.5
double inverse 1
0.5
« moitié » existe aussi et se note ( -: ) en J.
-: 1
0.5
2 - Concaténation d’une matrice et d’un vecteur
Prenons une
matrice x et un vecteur y et concaténons les de toutes les manières possibles
avec la conjonction de rang.
x y
1 2
3 10 20 30
4 5 6
7 8 9
La matrice x est un objet de rang 2 qui peut être vu comme tel ou, au rang 1 comme un vecteur de lignes ou, au rang 0, comme un tableau de scalaires. Le vecteur y est un objet de rang 1 qui peut être vu comme tel ou, au rang 0, comme une liste de scalaires.
Ces trois vues pour x et ces deux vues pour y peuvent conduisent à six concaténations différentes. En utilisant l’opérateur de rang ", on peut en effet avoir les six concaténations présentées dans le tableau ci-dessous.
x,"2 1 y
x,"1 1 y
x,"0 1 y
x,"2 0 y
x,"1 0 y
x,"0 0 y
Les six autres possibilités de base se déduisent en prenant l’ordre y,x au lieu de x,y. Enfin, on démultiplie encore les possibilité en effectuant ses concaténations sous (&.) «transpose» (|:).
x,"2 1 y 1 2 3 4 5 6 7 8 9 10 20 30 |
x,"1 1 y 1 2 3 10 20 30 4 5 6 10 20 30 7 8 9 10 20 30 |
x,"0 1 y 1 10 20 30 2 10 20 30 3 10 20 30
4 10 20 30 5 10 20 30 6 10 20 30
7 10 20 30 8 10 20 30 9 10 20 30
|
x,"2 0 y 1 2 3 4 5 6 7 8 9 10 10 10
1 2 3 4 5 6 7 8 9 20 20 20
1 2 3 4 5 6 7 8 9 30 30 30
|
x,"1 0 y 1 2 3 10 4 5 6 20 7 8 9 30
|
x,"0 0 y 1 10 2 10 3 10
4 20 5 20 6 20
7 30 8 30 9 30 |
Chris Burke en est resté à ces exemples et a ensuite répondu aux questions de l’auditoire touchant essentiellement à la forme tacite de l’écriture des fonctions et aux interfaçages avec WINDOWS.