Sommaire Carte Index Recherche Nouvelles Archives Liens A propos
[Barre Superieure]
[Barre Inferieure]
[Photo de l'auteur]
par Emre Demiralp

L´auteur:

Je suis étudiant au collège américain Robert d'Istanbul,et en même temps,un des administrateurs du département informatique de la faculté des arts et sciences de l'Université des Techniques d'Istanbul. Le système d'exploitation dominant dans ces départements est LINUX. Centres d'intêrets: PovRay et PostScript,animation,conception de CD,programmation,holographie etc... Utilisateur Linux depuis 1994.


Sommaire:

PostScript II: La pile des opérandes,Manipulations et Opérateurs Mathématiques

[Illustration]

Résumé:

Goutte à goutte,il devient un lac-Proverbe Turc-.
L'auteur décrit la pile des opérandes du langage PostScript. Il présente ici les manipulations de pile et les opérateurs mathématiques. Cet article ne couvre pas toutes les propriétés de la pile; ce sera le sujet des articles suivants.



 

Introduction

Voici le second article de la série consacrée à PostScript. Il sera dédié aux opérations sur la pile. La pile des opérandes est sûrement la partie la plus importante de PostScript. Assignation, opérations mathématiques et arithmétiques, boucles et opérations logiques sont tous traités dans cet partie spécifique de la mémoire. Oui! la pile est une région spéciale de mémoire qui est utilisée par PostScript pour exécuter presque tout ce que nous voulons lui faire faire. La pile conserve l'information dans un ordre tel que les dernières données entrées sont extraites en premier. Vous pouvez imaginer cela comme un tuyau dont une extrémité est fermée. Quand vous mettez quelque chose dans ce tuyau, il faut pousser ce qui y est déjà vers le fond pour pouvoir y entrer le nouvel objet.. De la sorte, le dernier objet entré sera toujours le plus proche de la sortie. Les éléments de la pile peuvent être des chaînes, des constantes numériques, des clés, des blocs...  

Manipulation de la pile

Bien que les éléments soient rangés dans la pile, il existe des opérations qui permettent de la réordonner. Les manipulations sont appliquées à un ou plusieurs éléments de la pile. Les opérateurs, par définition, manipulent les éléments de la pile. S'ils ont besoins de paramètres, ceux-ci doivent d'abord être poussés sur la pile. L'opérateur agit alors en fonction de ces opérandes. On trouvera ici une liste de ces opérateurs accompagnés d'explications ainsi que des exemples destinés à illustrer d'autres détails.

pop: Cet opérateur élimine l'élément supérieur de la pile (le dernier introduit).

exch: Cet opérateur échange les deux éléments supérieurs de la pile.

dup: Cet opérateur crée une copie du dernier élément entré sur la pile et le pousse dessus. En d'autres termes, il duplique l'élément supérieur de la pile.

copy: Cet opérateur nécessite une opérande entière (un paramètre) qui doit être poussé sur la pile auparavant. Si nous choisissonsn comme entier, alors la commande sera n copy. A ce stade, la copie du jeux des n éléments supérieurs sera créée et ajouté au dessus de la pile. Autrement dit, copy est un opérateur de duplication multiple.

index: Cet opérateur nécessite une opérande entière (un paramètre) qui doit être poussé sur la pile auparavant. Si nous choisissonsn comme entier, alors la commande sera n index. A ce stade, la copie du n-ème élément depuis le haut de la pile sera créée et ajouté au dessus de la pile. Autrement dit, index peut sélectionner un élément interne et créer et repérer sa copie dans la pile. L'indexation des éléments commence par le plus élevé avec le numéro 0.

roll: Cet opérateur nécessite deux paramètres entiers qui doivent être poussés sur la pile auparavant. Si nous choisissons m et n comme entiers, alors la commande sera m n roll. Ici m définit combien d'éléments tournerons tandis que n caractérise le nombre de rotations. Une rotation est définie de telle sorte que l'élément supérieur de la pile devienne le m-ème élément tandis que les autres m-1 éléments du dessous se décalent d'une place vers le haut. Cette instruction est valide quand n est égal à 1. S'il valait 2, alors deux rotations consécutives prendraient place. En d'autre termes, m 2 roll est équivalent à m 1 roll m 1 roll. Le paramètre n peut prendre des valeurs négatives. Dans ce cas le mouvement est inversé. Cela signifie aussi que l'effet global de la commande m n roll m -n roll n'a aucun effet sur la pile. L'indexation des éléments commence par le plus élevé avec le numéro 0.

clear: Cet opérateur élimine tous les éléments de la pile.

count: Cet opérateur compte les éléments de la pile. Le résultat est poussé sur la pile et en devient ainsi un nouvel élément. Si vous ne voulez pas de ce nouvel élément, vous pouvez utiliser la commande composite count pstack poppop retire le nouvel élément créé par count après que le résultat ait été affiché par l'action de l'opérateur de fichier pstack.

mark: Cet opérateur met un élément repère (-marktype-) sur la pile. Cet élément peut être utilisé pour diviser un ensemble d'éléments dans la pile. Deux autres opérateurs cleartomark et counttomark recherchent cet élément pour leur propre compte. S'il n'est pas trouvé, alors une erreur est générée.

cleartomark: Cet opérateur supprime tous les éléments depuis le plus élevé jusqu'au premier repère -marktype-. Cet objet -marktype- est aussi supprimé. S'il n'est pas trouvé, alors une erreur est générée.

counttomark: Cet opérateur compte tous les éléments depuis le plus élevé jusqu'au premier repère -marktype-. Le résultat, qui est une valeur entière,est poussé sur la pile et devient le dernier élément. Si aucun repère n'est trouvé, alors une erreur est générée.

Parlons maintenant de la pile. Pour faire fonctionner les opérateurs ci-dessus, il faut d'abord activer l'interpréteur PostScript. Comme indiqué lors du premier article, la communauté Linux utilise un interpréteur public,ghostscript. Ghostscript peut être lancé de plusieurs manières en choisissant des paramètres appropriés sur la ligne de commande. Le plus courant consiste simplement à taper gs dans l'environnement X Window. Parfois, cela peut ne pas marcher à cause de problèmes de configuration X. Un message d'erreur apparaît disant qu'il est impossible de créer une console graphique adaptée. Ces problèmes doivent être résolus ou bien vous pouvez forcer ghostscript à utiliser le pilote x11. Pour cela entrez gs -sDEVICE=x11. Cela, ou simplement gs (si cela marche) crée une fenêtre à fond blanc qui est utilisée pour les affichages à venir pendant la session. Puisque les affichages ne sont pas traités dans notre article, nous n'avons pas besoin de cette fenêtre et il est possible de l'enlever. Pour cela, l'interpréteur ghostscript peut être appelé sans fenêtre en entrant le paramètre -dNODISPLAY sur la ligne de commande après gs ou gs -sDEVICE=x11. Dans ce cas, un entête de copyright est affiché, suivi de l'invite ghostscript GS> au début d'une nouvelle ligne. Arrivé là, ghostscript est prêt à recevoir vos commandes. La pile des opérandes est vide.

Pour voir le contenu de la pile, vous pouvez utiliser l'opérateur de fichier pstack. On l'appelle opérateur de fichier parce qu'il envoie des informations sur le contenu de la pile vers le fichier de sortie standard qui est l'écran par défaut. Si vous entrez cette commande à l'invite, rien n'est affiché et une nouvelle invite GS> apparaît. Cela signifie que la pile est vide.

Pour entrer des éléments dans la pile, vous pouvez le faire depuis l'invite. Par exemple, si vous entrez 1 comme élément, tapez juste 1 à l'invite. Une nouvelle invite apparaît sur la ligne suivante, mais cette fois ce n'est pas GS>. c'est GS<1>. Cette nouvelle forme de l'invite est le reflet du nombre d'éléments dans la pile. Ainsi si vous avez GS<123> à un moment de votre session ghostscript cela veut dire que vous avez 123 éléments dans la pile.

On peut entrer plus d'un élément dans la pile à la fois. Pour cela, tapez tous les éléments à la suite et séparés par un espace. Par exemple, si vous entrez 1 2 3 4 5 6 à l'invite alors les éléments 1, 2, 3, 4, 5, 6, sont poussés sur la pile. Une commande pstack affichera alors les éléments en ordre vertical de telle sorte que le dernier entré soit affiché en premier. Voici l'aspect de l'affichage après ces deux commandes:

GS>1 2 3 4 5 6 
GS<6>pstack
6
5
4
3
2
1
GS<6>
Il est aussi possible d'entrer des données dans la pile et d'en visualiser le contenu en une fois. Tout ce que vous avez à faire est de taper la commande pstack à la suite des éléments entrés, soit:
GS>1 2 3 4 5 6 pstack
6
5
4
3
2
1
GS<6>
Jusqu'à présent, nous avons entré des nombres en tant qu'élément. Mais ce ne sont pas les seuls types d'éléments, il est aussi possible d'en entrer d'autres comme des variables ou des clés, des chaînes, des blocs, etc... Nous les aborderons plus en détails un peu plus tard. Il faut toutefois dire maintenant une chose: si vous essayer d'entrer un seul caractère a ou une chaîne abc, cela générera un message d'erreur parce que PostScript ne comprend pas ces choses. Pour entrer un caractère ou une chaîne, il faut l'encadrer par des (). Nous avons parlé d'un élément spécial appelé marktype. Voici un exemple qui traite ce cas:
GS>1 2 3 mark 4 5 6 pstack
6
5
4
-marktype-
3
2
1
GS<7>
Nous allons maintenant voir des exemples d'opérateurs afin de manipuler des opérandes sur la pile. Cet exemple montre comment agissent les opérateurs et devrait se suffire à lui même pour clore cette section sans plus d'explications:
GS>1 2 3 mark 4 5 6 pstack
6
5
4
-marktype-
3
2
1
GS<7>pop pstack
5
4
-marktype
3 
2
1
GS<6>exch pstack
4
5
-marktype
3
2
1
GS<6>dup pstack
4
4
5
-marktype-
3
2
1
GS<7>2 copy pstack
4
4
4
4
5
-marktype
3
2
1
GS<9>5 index pstack
-marktype-
4
4
4
4
5
-marktype
3
2
1
GS<10>cleartomark cleartomark pstack
3
2
1
GS<3>3 1 roll pstack
2
1
3
GS<3>count pstack
3
2
1
3
GS<4>mark 7 8 pstack
8
7
-marktype-
3
2
1
3
GS<7>counttomark pstack
2
8
7
-marktype-
3
2
1
3
GS<8>clear pstack
GS>
 

Opérateurs Mathématiques

En plus des opérateurs de manipulation de la pile de PostScript, il existe aussi des opérateurs arithmétiques et mathématiques. La liste en est donnée ci-dessous. Nous ne donnerons pas d'exemples. Il est laissé le soin de les expérimenter au lecteur qui devrait maintenant être capable de les créer en se basant sur l'exemple de la session ci-dessus.

add: Cette commande nécessite deux paramètres numériques dont les valeurs sont additionnées. Si ces valeurs sont m et n, alors la commande est m n add. D'abord m puis n sont poussés sur la pile. L'action de l'opérateur add sur les deux éléments supérieurs de la pile constitue l'étape finale. Elle crée un nouvel élément dont la valeur est égale à la somme de m et n. Quand l'opération est terminée, m et n ne sont pas conservés dans la pile. Au lieu de cela, c'est le résultat qui devient l'élément supérieur de la pile.

div: Cette commande nécessite deux paramètres numériques dont les valeurs sont divisées. Si ces valeurs sont m et n, alors la commande est m n div. Le mécanisme de l'opération est le même qu'avec add.L'opération de Division se fait arithmétiquement en virgule flottante.Quand l'opération est terminée, m et n ne sont pas conservés

idiv: Cette commande nécessite deux paramètres numériques dont les valeurs entre dans une opération de division entière. Si ces valeurs sont m et n, alors la commande est m n idiv. Le mécanisme de l'opération est le même qu'avec div hormis le type de division. C'est une division entière. Si les paramètres ne sont pas entiers, cela marche quand même.

mod: Cette commande nécessite deux paramètres numériques.Elle évalue le reste de la division entière du premier paramètre par le second. Si un des deux paramètres n'est pas entier, alors cela ne marchera pas. Le résultat est la seule valeur conservée dans la pile après l'opération.

mul: Tout comme add, div. C'est un opérateur binaire qui nécessite deux paramètres. Le résultat est la multiplication des deux paramètres et il est conservée dans la pile après l'opération.

sub: Tout comme add, div, mul. La seule différence réside dans le type d'opération. Il soustrait la valeur du second paramètre du premier. Les paramètres et le résultat sont des valeurs numériques et le résultat est conservée dans la pile après l'opération.

exp: C'est un opérateur mathématique binaire. Il nécessite deux paramètres. Le premier est la base et le second l'exposant. Il élève la base à la puissance de l'exposant. Les paramètres doivent être dans les limites de l'opération d'exponentiation. Le résultat est un nombre à virgule flottante dont la valeur est conservée dans la pile après l'opération.

atan: C'est un autre opérateur mathématique binaire pour l'évaluation d'un angle. L'angle est donné en degrés entre 0 et 360. Il nécessite deux paramètres. Le rapport du premier sur le second est égal à la tangente de l'angle à évaluer. Les deux paramètres peuvent valoir zéro mais pas simultanément. Le signe des paramètres détermine dans quel cadran est le résultat. Les valeurs positives du premier paramètre correspondent au plan y, tandis que les valeurs positives du second paramètre correspondent au plan x.

abs: C'est un opérateur mathématique à un paramètre. Il n'a besoin que d'un opérateur dont la valeur absolue est le résultat. Tous comme ci-dessus, le résultat est conservé comme un nouvel élément de la pile.

neg: Ceci change le signe de son seul argument.

ceiling: Cet opérateur évalue la valeur entière la plus proche de son argument par excès.

floor: Cet opérateur évalue la valeur entière la plus proche de son argument par défaut.

round: Cet opérateur évalue la valeur entière la plus proche de son argument.

truncate: Cet opérateur supprime la partie fractionnaire de son argument.

sqrt: Cet opérateur évalue la racine carrée de son argument.

cos: Cet opérateur évalue le cosinus de son argument qui est donné en degrés.

sin: Cet opérateur évalue le sinus de son argument qui est donné en degrés.

ln: Cet opérateur évalue le logarithme Néperien de son argument.

log: Cet opérateur évalue le logarithme à base 10 de son argument.

Avant de terminer cet article, voici un dernier détail. Bien que nous l'ayons mentionné ci-dessus, peut être implicitement,les paramètres (opérandes en terminologie PostScript) d'une commande peuvent créer des problèmes déplaisants. La commande (ou opérateur en terminologie PostScript) recherche ses paramètres dans la pile. Ainsi, exécuter une commande, délibérément, ou par erreur, sans lui fournir d'arguments sur la pile causera soit une plainte a propos d'un type erroné, soit la suppression d'éléments supérieurs de la pile. L'utilisateur doit rester très attentif sur ce point.

Nous recommandons aussi aux utilisateurs qui veulent comprendre PostScript d'écrire des programmes plus compliqués et plus aboutis. Dans les futurs articles de cette série, nous donnerons plus de détails sur le langage PostScript. Vos questions et commentaires sont les bienvenus à propos de nos présentations.

Relu par Jorge M. Paulo et Jose Quesada


Site Web maintenu par l´équipe d´édition LinuxFocus
© Emre Demiralp
LinuxFocus 1999
Translation information:
fr -> -- Emre Demiralp
fr -> en John Perr

1999-11-24, generated by lfparser version 0.7