GAZETTE N°26: Le langage Yorick

Le langage Yorick

Par Cary O'Brien.

Adaptation française : David Chemouil


Précédent Suivant Table des Matières

5. Le langage Yorick

5.1 Introduction

Linux comporte une quantité importante de logiciels académiques, qui sont soit des portages simples de paquetages existant sous Unix, soit, de plus en plus souvent, des logiciels directement prêts à être utilisés sous Linux.

Yorick en est un exemple, et cet article a pour but d'en présenter brièvement quelques fonctionnalités. Yorick n'est pas un n-ième outil de calcul : la syntaxe lisible, la notation sous forme de tableaux, et des capacités puissantes au niveau du graphisme et des entrées-sorties font de lui un must dans le domaine de l'analyse numérique. Les entrées-sorties indépendantes de la machine et conformes au standard de format de fichiers NetCDF simplifient grandement le portage des applications entre des architectures différentes.

Yorick est un langage interprété pour l'analyse numérique, développé aux Livermore Labs par David H. Munro. Implémenté en C, il est librement distribuable, et bénéficie d'un copyright ouvert. Yorick est présent sur un grand nombre de machines, allant d'un PC 486SX tournant sous Linux aux super-calculateurs Cray YMP. La majorité de ses utilisateurs est composée de physiciens ayant accès aux plus puissants ordinateurs du monde. Des applications spécifiques concernent la recherche en astrophysique, astronomie, neurosciences, imagerie médicale et fusion nucléaire.

Cet article présentera les bases de Yorick, décrira les opérations de base sur les tableaux et, brièvement, présentera les opérations avancées de manipulation de tableaux et de graphismes.

5.2 Opérations de base

Lancé sans arguments, Yorick présente une interface typique en ligne de commande. Les expressions sont évaluées immédiatemenet et le résultat est affiché. Les types de base sont les entiers, les nombres en virgule flottante, les chaînes de caractères, et toutes les constantes et fonctions prédéfinies généralement existantes.

Les noms de variables sont libres --- pas de $ en début de mot par exemple ---, et n'ont pas besoin d'être pré-déclarés. Les commentaires à la C sont supportés.

Tableaux

Le lecteur pourrait penser qu'un langage interprété ne se prête pas à l'analyse numérique, et ce serait effectivement le cas si les tableaux n'étaient pas internes au langage. Ce sont, en fait, des objets de base qui peuvent être manipulés par des opérations simples. Comme la machine virtuelle comprend les tableaux, elle peut appliquer des routines compilées et optimisées pour les opérations sur les tableaux, rattrapant de ce fait le handicap de vitesse de l'interpréteur.

Les tableaux peuvent être déclarés explicitement:

> a1 = [ 1.1, 1.2, 1.3, 1.4, 1.5 ]

Leurs éléments peuvent être accédés individuellement ou comme des sous-ensembles, 1 étant considéré comme l'indice de départ. Les parenthèses indiquent l'opération d'indexation, et un index seul ou un domaine peuvent être spécifiés.

> a1 = [ 1.1, 1.2, 1.3, 1.4, 1.5 ]
> a1(2)
1.2
> a1(1:3)
[1.1,1.2,1.3]

Comme les opérations sur les tableaux sont directement intégrées au langage, les fonctions qui leur sont appliquées le sont automatiquement à tous leurs éléments d'un coup.

> sqrt(a1)
[1.04881,1.09545,1.14018,1.18322,1.23607]

Les tableaux ne sont pas limités en dimension. Le rang (nombre d'indices) d'un tableau n'est pas limité à un (un vecteur), ou deux (une matrice), mais peut être aussi élévé qu'on le souhaite. Des tableaux de rang 3 peuvent être utilisés pour représenter la distribution d'un paramètre au sein d'un volume, et un tableau de rang 4 pourrait modéliser cette distribution au cours du temps.

Aide en ligne

Yorick dispose aussi d'un système d'aide simple mais efficace. La commande help décrit l'aide en ligne. Exécuter cette commande avec le nom d'une instruction en argument fournira de l'aide concernant cette instruction.

5.3 Programmation

Yorick est langage de programmation complet qui ressemble beaucoup au C au niveau des instructions de contrôle, des expressions et de l'utilisation des variables. Par exemple,

> for(i=1;i<10;i++) { print,1<<i; }
imprime les puissances de 2 comme on s'y attend, et les déclarations de fonctions, effectuées au moyen du mot-clé func fonctionnent également.
> func csc(x) {
>   return 1/sin(x);
> }

Il y a des différences --- les variables n'ont pas besoin d'être déclarées, et les tableaux sont beaucoup plus puissants qu'en C. La différence majeure réside dans l'appel de fonction. Passer les arguments d'une fonction entre parenthèses entraîne l'évaluation de la fonction et l'affichage de son résultat, tandis que le passage des arguments uniquement séparés par des virgules n'implique que l'évaluation de la fonction et ne renvoie pas le résultat. Dans de nombreux cas, les résultats intermédiaires ne sont pas utiles, ce qui explique que beaucoup de scripts contiennent principalement des appels de la forme f,x,y plutôt que la forme plus familière f(x,y).

Disposer d'un langage de programmation proche du C permet une migration facile d'un prototype en Yorick à une implantation finale en C. Cependant, de nombreux utilisateurs ont indiqué que la migration vers le C n'est pas nécessaire, les programmes en Yorick étant assez rapides pour faire leur travail avec un minimum d'effort de programmation.

Si des extensions en C sont nécessaires, il est possible d'étendre le langage de commandes Yorick avec n'importe quelle opération requise.

5.4 Opérations avancées sur les tableaux

C'est maintenant que les choses deviennent intéressantes. Yorick dispose d'un mécanisme compact et sophistiqué pour décrire l'indexation de tableaux et les opérations. Ce mécanisme est utilisé pour spécifier précisément l'opération désirée à l'interpréteur.

Indexation

On s'en souvient, appliquer une opération à un tableau applique, en fait, l'opération à chaque élément du tableau. Par exemple,

> a = [ 1, 2, 3, 4, 5 ]
> sqrt(a)
[1,1.141421,1.73205,2,2.23607]

Mais, qu'en est-il de la multiplication de deux vecteurs ? Par défaut, la multiplication est effectuée élément par élément.

> b = [ 2, 4, 6, 8, 10 ]
> a*b
[ 2, 8, 18, 32, 50 ]

Mais ceux qui se remémorent leurs cours de physique ou d'algèbre linéaire doivent se souvenir des produits interne et externe. Le produit interne est en fait le produit scalaire:

> a(+)*b(+)
110

Et le produit externe crée une matrice à partir de toutes les multiplications possibles:

> a(-,)*b(,-)
[[2,4,6,8,10],
 [4,8,12,16,20],
 [6,12,18,24,30],
 [8,16,24,32,40],
 [10,20,30,40,50]]

Les opérateurs + et - utilisés à la place d'un indice sont appelés indices spéciaux, et permettent un contrôle précis de l'exécution des opérations sur les tableaux.

Le + est le pseudo-indice de multiplication matricielle, qui indique à Yorick le long de quelle dimension la partie addition d'un multiplication matricielle doit être effectuée.

Le - est un pseudo-indice créant un indice où il n'y en avait pas auparavant.

Opérateurs de réduction de rang

Les opérateurs sum, min, max et avg (« moyenne ») peuvent être utilisés à la place des indices.

> a(max)
5
> b(avg)
6

On peut se demander pourquoi ces opérateurs sont nécessaires, alors que des fonctions équivalentes (i.e min() ou avg()) existent. La raison en est que, pour les matrices de rang supérieur à un, les opérateurs de réduction de rang permettent de spécifier exactement comment effectuer l'opération. Par exemple, étant donné un tableau 3x3, veut-on la moyenne le long des lignes, des colonnes, ou du tableau entier ?

> c = [[1,2,3],[4,5,6],[7,8,9]]
> dimsof(c)
[2,3,3]
> avg(c)
5
> c(avg,avg)
5
> c(avg,)
[2,5,8]
> c(,avg)
[4,5,6]

Nous avons aussi introduit l'opérateur dimsof() qui renvoie les dimensions de l'argument. Dans cet exemple, le résultat nous apprend que c est un tableau de rang 2 qui contient trois éléments dans chaque direction.

5.5 Graphisme

Sous Linux, Yorick est lié au système graphique GIST, permettant ainsi un affichage immédiat de graphes et de diagrammes. Les graphes sont interactifs, autorisant l'utilisateur à zoomer, étirer les axes et parcourir les affichages en utilisant la souris. Yorick peut afficher des séquences de graphes au cours du temps comme une animation. Pour cette raison, la commande pour préparer une nouvelle image est fma ou frmae advance.

Pour afficher les valeurs d'une fonction à des points situés à distance égale, il faut d'abord créer les abscisses :

> x = span( 0, 10, 256 )
> dimsof(x)
[1,256]

Maintenant, x est un tableau de 256 éléments dont les valeurs vont de 0 à 10.

La fonction plg affiche un graphe à partir d'un tableau pour les abscisses et d'un autre pour les ordonnées.

> plg, sin(x^2), x

Le résultat apparaît à la figure 1. Notez que les arguments sont fournis dans l'ordre ordonnée, abscisse et non pas l'inverse. Ceci permet à Yorick de fournir un tableau par défaut pour les abscisses (allant de 1 au nombre de points des ordonnées) si nécessaire.

Figure 1 : une fonction simple

Les courbes paramétriques sont aussi supportées. Par exemple,

> window, style="vgbox.gs"
> a = span(0, 20, 256)
> x = a * sin(a)
> y = a * cos(a)
> plg, y ,x

Cette séquence d'instructions produit la spirale dans la figure 2. Le style d'affichage a aussi été modifié.

Figure 2 : une courbe paramétrée

Les affichages de surface sont aussi possibles, soit en wireframe (« grille ») :

> #include "plwf.i"
> orient3
> x = span( -pi, pi, 32)(,-:1:32)
> y = transpose(x)
> fma
> plwf, sin(x)*cos(x)

Figure 3 : affichage en wireframe

... soit en rendu de surface :

> fma
> plwf, sin(x)*cos(x), shade=1, edges=0

Figure 4 : rendu de surface

Un ensemble d'options graphiques avancées est utilisé dans les programmes de démonstration distribués avec Yorick, et la dernière version de la documentation décrit de manière exhaustive toutes les possibilités graphiques. De plus, des librairies pour lire, écrire et afficher des images au format PNM sont fournies.

5.6 Pour finir

Yorick est un environnement particulièrement riche pour l'analyse numérique. De nombreuses possibilités comme les entrées-sorties sur fichiers, le déboguage, l'animation et le calcul distribué (utilisant MPY) n'ont pas été décrites. Si vous êtes intéressé, prenez le temps de lire la documentation et les programmes d'exemple. Vous ne le regretterez pas.

5.7 Ressources

La homepage de Yorick:

ftp://ftp-icf.llnl.gov/pub/Yorick/yorick-ad.html

Archives Yorick:

ftp://sunsite.unc.edu/pub/Linux/apps/math/matrix/yorick-1.4.src.tar.gz

Logiciels Linux pour les scientifiques et les curieux:

http://www-ocean.tamu.edu/~baum/linuxlist.html

Applications scientifques sous Linux:

http://SAL.KachineTech.COM


Précédent Suivant Table des Matières

Écrit par Cary O'Brien -- Paru dans le N°26 de la Linux Gazette.

Adaptation française : David Chemouil