139
UNIVERSITÉ DU QUÉBEC À MONTRÉAL CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE DESCRIPTION DE DIAGRAMMES DE MATHÉMATIQUES DISCRÈTES ET D'INFORMATIQUE THÉORIQUE MÉMOIRE PRÉSENTÉ COMME EXIGENCE PARTIELLE DE LA MAÎTRISE EN MATHÉMATIQUES PAR MATHIEU BOURGEOIS DÉCEMBRE 2011

Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux

UNIVERSITEacute DU QUEacuteBEC Agrave MONTREacuteAL

CONCEPTION ET IMPLEacuteMENTATION DUN LANGAGE DE

DESCRIPTION DE DIAGRAMMES DE MATHEacuteMATIQUES DISCREgraveTES

ET DINFORMATIQUE THEacuteORIQUE

MEacuteMOIRE

PREacuteSENTEacute

COMME EXIGENCE PARTIELLE

DE LA MAIcircTRISE EN MATHEacuteMATIQUES

PAR

MATHIEU BOURGEOIS

DEacuteCEMBRE 2011

UNIVERSITEacute DU QUEacuteBEC Agrave MONTREacuteAL Service des bibliothegraveques

Avertissement

La diffusion de ce meacutemoire se fait dans lei respect des droits de son auteur qui a signeacute le formulaire Autorisation de reproduire et de diffuser un travail de recherche de cycles supeacuterieurs (SDU-522 - Reacutev01-2006) Cetle autorisation stipule que laquoconformeacutementagrave larticle 11 du Regraveglement no 8 des eacutetudes de cycles supeacuterieurs [lauteur] concegravede agrave lUniversiteacute du Queacutebec agrave Montreacuteal une licence non exclusive dutilisation et de publication qe la totaliteacute ou dune partie importante de (son] travail de recherche pour des fins peacutedagogiques et non commerciales Plus preacuteciseacutement (lauteur] autorise lUniversiteacute du Queacutebec agrave Montreacuteal agrave reproduire diffuser precircter distribuer ou vendre des copies de (son] travail de recherche agrave des fins non commerciales sur quelque support que ce soit y compris lInternet Cetle licence et cetle autorisation nentraicircnent pas une renonciation de (la] part [de lauteur] agrave (ses] droits moraux ni agrave (ses] droits de proprieacuteteacute intellectuelle Sauf entente contraire [lauteur] conserve la liberteacute de diffuser et de commercialiser ou non ce travail dont [il] possegravede un exemplaireraquo

REMERCIEMENTS

Un projet dune telle envergure naurait pas eacuteteacute possible sans un soutien constant

Je ne peux donc suffisamment remercier mon directeur M Roger Villemaire pour le

support quil ma fourni pendant ces trois anneacutees Ce meacutemoire ne serait pas entre vos

mains sans son aide

Je voudrais aussi remercier M Eacutetienne Cagnon pour ses nombreuses ideacutees qui ont

faccedilonneacute SDDL de maniegravere significative ainsi que pour les nombreuses gaffes concepshy

tuelles quil ma empecirccheacute de commettre

Je ne peux eacutevidemment passer sous silence les membres de la communauteacute 01EX

particuliegraverement ceux de la confeacuterence TUC 2010 qui mont accueilli malgreacute mon inshy

expeacuterience et qui mont fourni de preacutecieux commentaires et suggestions en rapport avec

mon projet Je voudrais remercier John Bowman pour son travail sur Asymptote ainsi

que Karl Berry pour linteacuterecirct deacutemontreacute envers mon projet et pour ses suggestions pour

mon article Eacutevidemment il est impossible de remercier les membres de 01EX sans

remercier au passage le grand gourou Donald Knuth sans qui ce meacutemoire serait difficishy

lement preacutesentable

Je remercie vivement la fondation de lUniversiteacute du Queacutebec agrave Montreacuteal ainsi que

le Fonds Queacutebecois de la Recherche sur la Nature et les Technologies pour leur support

financier durant les diffeacuterentes phases de mon projet Merci davoir cru en mon projet

ainsi quen moi-mecircme

Finalement je voudrais remercier mes parents Suzie et Yves ainsi que ma conjointe

Annie pour leur support inconditionnel ainsi que pour laide incroyable quils mont

fournie sans neacutecessairement sen rendre compte

TABLE DES MATIEgraveRES

LISTE DES FIGURES IX

REacuteSUMEacute XI

INTRODUCTION 1

CHAPITRE 1 PROBLEacuteMATIQUE ET OBJECTIFS 7

11 Description de la probleacutematique 7

111 Les notes de cours une mise en contexte 7

112 Domaine dapplication eacutelargi 8

12 Description des objectifs rechercheacutes 9

121 Inteacutegration avec JbTEX 9

122 Description de structures 10

123 Hieacuterarchie solide et extensible 10

124 Objectifs moindres 10

13 Analyse des solutions existantes 11

131 Paquets JbTEX standards 12

132 XY-pic 13

133 Metapost 14

134 Asymptote 15

135 Conclusion de lanalyse 17

14 Diagrammes repreacutesentatifs du domaine 18

141 Lapproche de Knuth 19

142 Description des exemples et des concepts preacutesents dans les diagrammes 20

CHAPITRE II STRUCTURE ET SOLUTION INFORMATIQUE 21

21 Objectifs dune structure dans une solution informatique 21

211 Les diffeacuterentes composantes dune solution informatique 21

vi

212 Consideacuterations pour une meacutethodologie de deacuteveloppement 23

22 La programmation orienteacutee-objet 24

221 Concepts de bases 24

222 Diffeacuterence avec la programmation baseacutee-objet 25

23 Meacutethode pour la conceptualisation dune hieacuterarchie 25

231 Origine de la meacutethode 26

232 Les diffeacuterentes eacutetapes de conceptualisation 26

24 Deacuteveloppement de la hieacuterarchie 27

241 Extraction des diffeacuterents concepts 27

242 Eacuteleacutements particuliers 27

CHAPITRE III EacuteLEacuteMENTS GRAPHIQUES 31

31 Courbes et segments en informatique 31

32 Courbes de Beacutezier 32

321 Deacutefinition 32

322 Deacutefinition alternative 33

323 Proprieacuteteacutes dune courbe de Beacutezier- 34

324 Deacutesavantages des courbes de Beacutezier 36

33 Splines cubiques 36

34 Le cas dun cercle 38

35 Structures informatiques dans les solutions deacutejagrave existantes 41

351 Postscript et PDF 42

352 Asymptote 43

CHAPITRE IV THEacuteORIE DES LANGAGES INFORMATIQUES 45

41 Theacuteorie des langages et automates 45

411 Les eacuteleacutement rie base dun langage (Aho Sethi et Ullman 1986) 46

412 Expressions reacuteguliegraveres 46

413 Automates 48

414 Lien entre langage reacutegulier et automate fini 51

vii

42 Grammaires 52

421 Deacutefinition dune grammaire formelle 52

422 Hieacuterarchie de Chomsky 54

423 Utiliteacute dans les langages de programmation 55

43 SableCC 56

431 Quest-ce que SabieCC 56

432 Avantages de SabieCC 56

44 Langage reacuteflexif 57

441 Deacutefinition dun langage reacuteflexif 57

442 Avantages 57

443 Deacutesavantages 58

CHAPITRE V MISE EN OEUVRE DE LA SOLUTION 59

51 Eacuteleacutements de langage en SDDL 59

511 Impleacutementation de la hieacuterarchie 59

512 Grammaire 60

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage 61

52 Reacutealisation en Java 63

521 Traverseacutee de larbre grammatical et exeacutecution 63

522 Deacutefinition dobjets quelconques 64

523 Gestion des erreurs 65

524 Structures de support 66

53 Accegraves agrave Postscript PDF et gTEX 66

531 Postscript 66

532 PDF 67

533 g1EX- 68

534 Geacuteneacuteration du code Asymptote 68

CHAPITRE VI REacuteALISATION DES DIAGRAMMES EN SDDL 71

61 Analyse du code des diagrammes existants 71

Vlll

611 Rappel des objectifs cruciaux agrave observer

612 Diagramme de compilation

613 Diagramme de tableau

614 Diagramme de Venn

62 Preacutesentation du produit final

621 Statistiques et documentation

622 Preacutesentation

623 Site web

63 Conclusion de notre analyse

CONCLUSION

APPENDICE A PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

APPENDICE B PREacuteSENTATION DE LA GRAMMAIRE DE SOOL

APPENDICE C PREacuteSENTATION DE LA HIEacuteRARCHIE

APPENDICE D PREacuteSENTATION DES DIAGRAMMES CHOISIS

BIBLIOGRAPHIE

72

73

75

78

79

80

80

81

81

83

85

91

97

105 shy

127

LISTE DES FIGURES

Figure Page

11 Code XY-pic pour un diagramme 14

12 Diagramme reacutesultant du code XY-pic 14

13 Code Metapost pour dessiner un triangle 15

14 Diagramme reacutesultant du code Metapost 15

15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin 16

16 Diagramme reacutesultant du code Asymptote 16

31 Courbes de Beacutezier lineacuteaire quadratique et cubique 34

32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier 38

33 Quart de cercle approximeacute par une courbe de Beacutezier 39

34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence 41

41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b 49

51 Extrait de la grammaire de SDDL pour une instruction 61

52 Code Java et SDDL pour calculer une combinaison lineacuteaire 63

53 Code reacuteflexif pour creacuteer une forme quelconque 65

54 Code pour geacuteneacuterer du code Asymptote pour un cercle 69

61 Diagramme dautomate de compilation 73

62 Code pour le diagramme dautomate 74

63 Diagramme de tableau 76

64 Code pour le diagramme de tableau 77

65 Diagramme de Venn 78

x

66 Code du diagramme de Venn 79

REacuteSUMEacute

Dans ce meacutemoire nous analysons la description de diagrammes structureacutes dans le domaine des matheacutematiques discregravetes et de linformatique theacuteorique Cette analyse seffectue agrave partir de meacutethodes eacutetablies du geacutenie logiciel Nous trouvons un ensemble de proprieacuteteacutes que nous recherchons dans une solution informatique nous permettant de creacuteer ces diagrammes Nous analysons aussi les outils classiques agrave partir des proprieacuteteacutes preacuteceacutedentes qui nous permettent de reacutealiser ces diagrammes dans un environnement I51EX Nous observons que ces outils ne sont pas aussi puissants quils le pourraient en fonction des proprieacuteteacutes eacutetablies par notre analyse

Par la suite en nous basant sur les meacutethodes de repreacutesentation graphique des courbes et sur la theacuteorie des langages informatiques nous jetons les bases dun lanshyguage de description Nous preacutesentons aussi un outil deacuteveloppeacute en Java qui nous pershymet de deacutecrire aiseacutement nos diagrammes dinformatique theacuteorique et de matheacutematiques discregravetes agrave partir dune hieacuterarchie dobjets claire et extensible Nous avons impleacutementeacute les eacuteleacutements essentiels de notre langage en SDDL (Structured Diagram Description Lanshyguage) Nous lavons aussi valideacute agrave laide dexemples repreacutesentatifs tireacutes de sources daushytoriteacute Nous avons finalement preacutesenteacute notre solution dans le cadre de la confeacuterence TUG 2010 Nous lavons aussi preacutesenteacute avec un article dans la revue du TeX Users Groups TUG

Mots cleacutes diagrammes informatique theacuteorique matheacutematiques discregravetes langage

INTRODUCTION

Le logiciel de mise en page de document U1EX est devenu llne reacutefeacuterence pour la creacuteation

de documents matheacutematiques (American Mathematical Society 2008) Plusieurs raisons

suscitent cet inteacuterecirct une structure naturelle permettant de repreacutesenter clairement ses

ideacutees le formatage automatique de qualiteacute et un reacutesultat final de qualiteacute professionnelle

agrave un coucirct moindre

Un traiteacute matheacutematique peut contenir plusieurs types dobjets textes formules grashy

phiques diagrammes etc Dans le cas preacutesent nous nous inteacuteressons principalement agrave

la repreacutesentation de diagrammes Par diagramme on entend un dessin qui possegravede une

structure discregravete sous-jacente (souvent combinatoire mais pas obligatoirement) Un

exemple simple serait un graphe ou un arbre

Agrave partir du moment ougrave nous nous inteacuteressons agrave ces diagrammes et agrave leur repreacutesentation

il devient inteacuteressant de voir ce que U1EX nous fournit afin de geacuteneacuterer des structures

de qualiteacute En effet les diagrammes sont essentiels agrave la transmission effective des ideacutees

et des reacutesultats en informatique et en matheacutematiques discregravetes De plus la consistance

nous oblige agrave chercher agrave faire nos diagrammes agrave partir dun modegravele coheacuterent Entre

autres il nous faut conserver la mecircme police dans les diagrammes et dans le texte

en plus davoir accegraves aux symboles matheacutematiques Nous pourrions aussi importer des

diagrammes exteacuterieurs agrave U1EX mais les reacutesultats obtenus ne serait pas consistant avec

le texte Nous devons donc chercher agrave obtenir une meacutethode de repreacutesentation adeacutequate

pour nos diagrammes

Bien sucircr il existe deacutejagrave plusieurs solutions agrave ce problegraveme Il nous faut donc les analyser

avec soin avec des critegraveres formels Cela implique de reacutepertorier les diffeacuterents paquets

U1EX permettant de faire du dessin avec leurs diffeacuterentes proprieacuteteacutes Il faut ensuite

2

ajouter les logiciels qui utilisent JbTEX indirectement donc qui nen font pas partie

mais sen servent tout de mecircme Cela nous donne une vue densemble complegravete des

solutions deacutejagrave existantes agrave notre problegraveme

Ensuite avant de penser agrave analyser ces solutions nous devons deacuteterminer ce que nous

voulons exactement Agrave cette fin nous avons analyseacute le processus qua utiliseacute Donald

Knuth creacuteateur de TEX agrave la base de Jb1EX afin de mateacuterialiser son logiciel de formatage

Nous devons aussi utiliser un ensemble de contraintes agrave soumettre agrave nos diffeacuterentes

solutions Il eacutetait essentiel dutiliser Jb1EX pour le formatage du texte mais aussi pour

la clarteacute deacutecriture la qualiteacute de la documentation et la capaciteacute de creacuteer aiseacutement des

structures Par la suite il devient aiseacute et tregraves formel danalyser chacunes des diffeacuterentes

solutions proposeacutees

Malheureusement cette analyse nous a permis de constater quaucune solution neacutetait

suffisamment bonne pour satisfaire nos besoins La plupart des paquets eacutetaient trop

simples alors que plusieurs eacutetaieentiernt composeacutes de macros rendant la veacuterification de

code quasi impossible Quelques solutions (telles que XY-Pic (Rose 2008) Metapost

(TeX Users Group 2009) et Asymptote (Hammerlindl Bowman- et Prince 2010a))

fournissaient de nombreuses ideacutees inteacuteressantes mais aucune ne convenait parfaitement

agrave nos besoins Nous en sommes donc venus agrave la conclusion que la meilleure solution

serait de creacuteer notre propre solution tout en reacuteutilisant les ideacutees deacuteveloppeacutees par les

solutions preacuteceacutedentes

Afin de creacuteer une solution robuste nous avons deacutecideacute de creacuteer une hieacuterarchie orienteacutee obshy

jet afin de repreacutesenter les diffeacuterentes structures du domaine des matheacutematiques discregravetes

et de linformatique theacuteorique Cela se justifie par le fait que les hieacuterarchies objets aushy

delagrave de leurs avantages possegravedent des meacutethodes de conceptualisation formelles et bien

deacutefinies Nous avons utiliseacute la meacutethode favoriseacutee par James Rumbaugh (Rumbaugh

et al 1991) un des creacuteateurs de UML (Object Management Group 2009)

Ce processus demande en tout premier lieu une analyse du domaine afin dobtenir les

structures principales Par la suite les liens entre les diffeacuterentes classes sont analyseacutes en

3

fonction des besoins respectifs Finalement apregraves plusieurs iteacuterations et simplifications

cette meacutethode foumit une hieacuterarchie complegravete Par contre elle doit par la suite ecirctre

adapteacutee aux speacutecificiteacutes du langage dimpleacutementation

Notre hieacuterarchie a eacuteteacute deacuteveloppeacutee autour de plusieurs concepts importants Certains

sont naturellement lieacutes au domaine dutilisation Par exemple un point est une structure

naturelle pour la description de positions dans un diagramme Le mecircme raisonnement

sapplique pour des formes geacuteomeacutetriques de base comme le cercle le carreacute et lellipse

Certains objets sont des simplifications de concepts communs Par exemple un point

abstrait est un point qui peut ecirctre deacutetermineacute de maniegravere absolue ou relative Une forme

est une classe de base repreacutesentant lensemble des objets qui peuvent ecirctre dessineacutes Il

existe aussi un dessin qui repreacutesente une forme agrave un endroit particulier

Bien que cela pourrait deacuteterminer complegravetement notre domaine afin davoir une hieacuteshy

rarchie complegravete il faut inclure certains eacuteleacutements de structure Par exemple bien que

nous puissions deacuteterminer assez aiseacutement ce quest un cercle la maniegravere de le deacutecrire

pour ecirctre dessineacute nest pas aussi simple Il en est de mecircme pour des formes courbes

plus complexes ainsi que des courbes de maniegravere geacuteneacuterale car un ordinateur ne peut pas

repreacutesenter aiseacutement toutes formes de chemin Nous pouvons creacuteer un concept geacuteneacuteral

de chemin mais celui-ci doit se ramener agrave la reacutealiteacute dun ordinateur

Cela est deacutetermineacute en analysant deux choses le format de document PDF et la desshy

cription de chemin dAsymptote Le premier utilise des splines cubiques comme eacuteleacutement

de base pour deacutecrire les courbes dans un document Cest inteacuteressant mais limitatif

Asymptote de son cocircteacute prend une description complexe mais preacutecise dune courbe et

en deacuteduit un ensemble de splines cubiques quil est possible de placer dans un docushy

ment PDF ensuite Nous en concluons que le bon chemin agrave prendre est probablement

dimpleacutementer comme structure de base des chemins tels que deacutecrits par Asymptote

avec une structure de splines cubiques

Par contre certaines questions theacuteoriques surviennent lors de cette analyse Le grand

problegraveme relegraveve de la puissance dexpression des splines cubiques En effet nous verrons

4

que les splines cubiques sont puissantes mais pas suffisamment puissantes pour deacutecrire

un cercle une forme geacuteomeacutetrique pourtant extrecircmement simple Nous verrons par contre

par la suite quil est possible de deacutecrire ce mecircme cercle avec des splines cubiques avec

une preacutecision acceptable pour la creacuteation de documents papier malgreacute son inexactitude

Afin dadapter la hieacuterarchie un langage dimpleacutementation a ducirc ecirctre choisi Eacutetant donneacute

les contraintes de temps il fucirct deacutecideacute de reacuteutiliser un langage de description de diashy

grammes deacutejagrave existant Asymptote Lutilisation de ce langage nous permet dobtenir

des primitives simples et un accegraves agrave Jb1EX deacutejagrave deacutetermineacute ce qui diminue de beaucoup la

charge de travail De plus Asymptote nous permet de creacuteer nos images reacutesultantes dans

les formats Postscript (Adobe Systems Incorporated 2010a) et PDF (Adobe Systems

Incorporated 2010b) sans avoir agrave reacutealiser nous-mecircmes du code de tregraves bas niveau

Eacutevidemment si Asymptote fournissait tout ce dont nous avions besoin nous naurions

pas besoin dutiliser autre chose Par contre cest un langage baseacute sur les structures

(Hammerlindl Bowman et Prince 201Ob) au lieu des objets Cela implique que notre

hieacuterarchie ne peut ecirctre construite agrave laide de lheacuteritage objet Eacutetant donneacute la complexiteacute

que cela engendrerait un langage suppleacutementaire doit-ecirctre utiliseacute pour-la creacuteation de

la hieacuterarchie Cela nous amegravene donc agrave choisir Java (Oracle 2010) Une recherche de la

compagnie TIOBE considegravere Java comme eacutetant le langage le plus utiliseacute au moment de

la preacutesente reacutedaction (TIOBE Software 2008)

Avant de consideacuterer le deacuteveloppement dun nouveau langage la premiegravere chose agrave faire

consiste agrave consideacuterer ce agrave quoi nous voulons quil ressemble Afin de reacutealiser cette eacutetape

nous avons analyseacute notre base de diagrammes en donnant une description la plus proche

possible dun langage de programmation En simplifiant chaque description autant que

possible nous avons pu extraire quelques concepts de base importants pour la descripshy

tion de nos diagrammes De plus certaines contraintes suppleacutementaires peuvent ecirctre

ajouteacutees qui deacutependent plus de limpleacutementation que de la theacuteorie En quelque sorte

il faut pour reacutealiser notre projet nous baser sur des technologies qui ont fait leurs

preuves

5

Afin de deacutevelopper notre langage il nous faut des concepts pour le deacutecrire Cela sefshy

fectue agrave laide de la theacuteorie des langages et des automates Plus particuliegraverement nous

utiliserons les grammaires afin de faccedilonner un langage qui convient agrave nos besoins tout en

eacutetant simple agrave analyser par un programme informatique agrave laide dun logiciel speacutecialiseacute

SabieCC (Gagnon 1998) Nous verrons que les grammaires nous permettent de deacutecrire

complegravetement notre langage afin decirctre analyseacute par ordinateur

Une fois que nous avons notre langage final il ne reste plus quagrave veacuterifier les reacutesultats

obtenus Afin de boucler la boucle nous avons reacutealiseacute la programmation de chacun des

diagrammes que nous avions choisis au deacutepart pour notre base de tests Une fois ceuxshy

ci reacutealiseacutes il ne restait plus quagrave analyser les diffeacuterences entre les deux et voir si les

reacutesultats obtenus eacutetaient satisfaisants Cela nous permet de deacutemontrer quil sagit dune

solution naturelle et efficace eacutetant donneacute que nous pouvons creacuteer les objets de notre

domaine pour produire des diagrammes de grande qualiteacute

Le reste de ce meacutemoire est structureacute comme suit Le chapitre 1 expose la probleacutematique

et les objectifs rechercheacutes Le chapitre 2 introduit la creacuteation de notre solution inforshy

matique et plus speacutecifiquement de la hieacuterarchie objet Le chapitre 3 deacutecrit la theacuteorie

matheacutematique derriegravere la description de courbes et segments par ordinateur Le chapitre

4 expose les dessous de la theacuteorie des langages que nous utilisons afin de creacuteer SOOL

Le chapitre 5 expose la creacuteation du langage au-dessus de la hieacuterarchie Finalement le

chapitre 6 analyse le reacutesultat final afin de voir si le tout reacutepond aux objectifs deacutefinis au

deacutepart

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CHAPITRE l

PROBLEacuteMATIQUE ET OBJECTIFS

Dans ce chapitre nous nous eacutetendrons sm une deacutefinition correcte et complegravete de la

probleacutematique ainsi que sur les objectifs que nous souhaitons atteindre Nous verrons

aussi une analyse des solutions qui existent deacutejagrave et les raisons qui nous poussent agrave

deacutevelopper notre propre solution Finalement nous deacutefinirons une base de diagrammes

aptes agrave repreacutesenter adeacutequatement nos objectifs

11 Description de la probleacutematique

111 Les notes de cours une mise en contexte

Ce projet fut motiveacute principalement par la reacutedaction de notes de cours En effet

dans un milieu universitaire (particuliegraverement pour les eacutetudiants au baccalaureacuteat mais

eacutegalement pour les eacutelegraveves de cycles supeacuterieurs) il est extrecircmement utile de pouvoir

utiliser des notes de cours de quali teacute

La creacuteation de notes de cours adapteacutees vient tout de mecircme avec quelques problegravemes

Premiegraverement surtout en informatique la plupart des livres sont eacutecrits en anglais Cela

implique souvent de devoir eacutecrire nos propres versions sous la forme de notes de cours

De plus linformatique est un domaine qui eacutevolue agrave un rythme fulgurant Cela implique

que des notes adeacutequates et adapteacutees doivent ecirctre agrave jour Comme certains eacuteleacutements en

informatique peuvent eacutevoluer agrave chaque anneacutee voire plus vite il faut ecirctre capable deacutecrire

extrecircmement rapidement des textes si nous souhaitons quils soient utiles un tant soit

8

peu

Cela nous amegravene agrave notre probleacutematique principale plusieurs cours neacutecessitent un supshy

port plus complexe que simplement des mots agrave savoir des dessins et des diagrammes

voire des animations Cela est requis dans plusieurs cours en informatique theacuteorique

particuliegraverement dans leacutetude des structures de donneacutees et des algorithmes Il nous faut

donc une meacutethode rapide et efficace pour creacuteer des diagrammes agrave placer dans nos notes

de cours

112 Domaine dapplication eacutelargi

Bien eacutevidemment cibler purement les notes de cours et les structures de donneacutees nest

quun point de deacutepart Nous pouvons eacutelargir notre domaine dapplication agrave des diashy

grammes structureacutes cest-agrave-dire un dessin qui possegravede une structure sous-jacente crushy

ciale au point de pouvoir necirctre deacutecrit quagrave partir de cette structure Par exemple

un graphe est un ensemble de sommets eacutetiqueteacutes relieacutes ensemble par des flegraveches Tout

dessin de graphe est donc un dagramm~ selon notye deacutefiniton Dun_autre cocirct~ une

peinture possegravede parfois une structure mais celle-ci est largement insuffisante pour

deacutecrire loeuvre Par exemple pertgtonne noserait deacutecrire un Picasso comme eacutetant un

amas de cercles et de carreacutes de diffeacuterentes couleurs

Lensemble des structures que nous visons se rapporte donc essentiellement agrave deux

domaines linformatique theacuteorique et les matheacutematiques discregravetes Linformatique

theacuteorique est surtout deacutefinie par les structures de donneacutees et les algorithmes (et tout

sujet sy reliant) Les matheacutematiques discregravetes sont surtout deacutefinies par la theacuteorie des

graphes et la combinatoire Nous neacutegligeons ici volontairement les matheacutematiques contishy

nues pour deux raisons La premiegravere est quune structure de taille infinie peut souvent

ecirctre repreacutesenteacutee par une structure finie (donc discregravete) La seconde est que les besoins

en matheacutematiques continues sont largement diffeacuterents des besoins en matheacutematiques

discregravetes En effet dessiner le graphe dune fonction de deux variables est un sujet comshy

plexe mais totalement diffeacuterent de creacuteer un graphe Afin de rendre nos besoins plus

9

speacutecifiques nous eacuteviterons ce genre de dessins qui possegravedent deacutejagrave de nombreux logiciels

pour les reacutealiser (entre autres Maple) (Maplesoft 2010)

12 Description des objectifs rechercheacutes

La premiegravere partie de notre travail consiste agrave deacutecrire les objectifs que nous souhaitons

atteindre dans notre creacuteation de diagrammes En effet plusieurs paramegravetres importants

peuvent ecirctre utiliseacutes Il est donc important de ne pas perdre de vue lensemble tout en

donnant la prioriteacute agrave certains eacuteleacutements

121 Inteacutegration avec ~IEX

Ib1EX est un langage de description de documents texte Creacuteeacute agrave lorigine sous la forme

de TEX par Donald Knuth (Knuth 1984) puis modifieacute par Leslie Lamport (Lamport

et Bibby 1986) celui-ci est rapidement devenu un standard dans la reacutedaction darticles

scientifiques dans plusieurs domaines Bien quutiliseacute surtout pour la reacutedaction darticles

il a eacuteteacute preacutevu au deacutepart pour la reacutedaction de livres Il se distingue par sa capaciteacute agrave

creacuteer aiseacutement du contenu matheacutematique et le fait de soccuper du contenu en laissant

le logiciel soccuper de la mise en page du texte Il est si populaire que de nombreux

meacutemoires incluant celui-ci sont eacutecrits agrave partir de Ib1EX

Eacutetant donneacute que le monde des matheacutematiques et de linformatique theacuteorique utilise

abondamment Ib1EX il est important quun logiciel de creacuteation de diagrammes pershy

mette de lutiliser En effet si notre objectif est de creacuteer du contenu de qualiteacute professhy

sionnelle il faut que les polices soient constantes au travers de notre article (ou de nos

notes de cours) Naturellement plusieurs diagrammes vont contenir du texte Il faut

donc pour ecirctre consistant geacuteneacuterer ce texte avec Ib1EX afin davoir une forme standard

pour lensemble du document De plus il est tout agrave fait possible de vouloir mettre des

symboles matheacutematiques dans un diagramme (par exemple un symbole dinteacutegrale) Si

le texte est geacuteneacutereacute avec Ib1EX cela vient automatiquement Sinon il devient tregraves difficile

dobtenir un texte de belle qualiteacute Il sagit donc dun besoin primordial

10

122 Description de structures

Un autre eacuteleacutement extrecircmement important que nous recherchons est de pouvoir faire

adeacutequatement la description de diffeacuterentes structures Eacutetant donneacute que les diagrammes

sont composeacutes de structures il faut pouvoir en creacuteer aiseacutement et les relier de maniegravere

aiseacutee Cela implique quelques petites contraintes entre autres de pouvoir utiliser des

variables pour conserver les structures en question Ideacutealement la solution la plus solide

en terme de description de structures utiliserait lorienteacute-objet Une des composantes

les plus importantes dune solution orienteacutee objet est la preacutesence dune hieacuterarchie de

classes dobjets

123 Hieacuterarchie solide et extensible

Un objectif que nous recherchons est que le langage nous fournisse une hieacuterarchie dobshy

jets (ou de structures) de qualiteacute afin de pouvoir creacuteer une grande quantiteacute de diashy

grammes agrave partir deacuteleacutements de cette hieacuterarchie Une hieacuterarchie peut ecirctre deacutecrite comme

eacutetant une structure permettant dinteacutegrer facilemen~ de nouveau~ aspects sans_avoir agrave

dupliquer inutilement du code Il serait aussi important quelle puisse ecirctre eacutetendue si cershy

tains eacuteleacutements suppleacutementaires sont neacutecessaires Par exemple il pourrait ecirctre inteacuteressant

pour des gens en geacutenie eacutelectrique de pouvoir faire des diagrammes eacutelectriques malgreacute

le fait que cela ne fait pas partie de nos contraintes de deacutepart Cela pourrait ecirctre ajouteacute

par extension du systegraveme

124 Objectifs moindres

Gestion des erreurs

Dans des notes de cours il est freacutequent davoir des diagrammes Par contre eacutecrire

un diagramme peut saveacuterer plus compliqueacute que deacutecrire du texte Comme plusieurs

utilisateurs potentiels ne seront pas des experts du systegraveme il faut que les erreurs soient

deacutetecteacutees et traiteacutees de maniegravere adeacutequate Cela assure agrave lutilisateur final une expeacuterience

11

plaisante en speacutecifiant les erreurs quil commet et des meacutethodes pour les reacuteparer Sil

faut que lutilisateur cherche pendant des heures pour trouver la petite erreur quil a

commise il va tout simplement cesser dutiliser le logiciel

Langage fluide et clair

Bien que moins important le fait davoir un langage clair est excellent pour attirer les

utilisateurs vers ce systegraveme En effet si le langage est un gribouillis incompreacutehensible il

sera fort probablement dur dapprentissage et difficile agrave aborder Par fluide et clair nous

entendons que le langage soit jusquagrave un certain point compreacutehensible pour quelquun

qui ne connaicirct pas le systegraveme

Qualiteacute de la documentation et courbe dapprentissage

Finalement il faut quune documentation existe et quelle soit complegravete De preacutefeacuterence

une bonne documentation contiendra un reacutepertoire de toutes les fonctionnaliteacutes mais

aussi des tutoriels avec des exemples codeacutes de cas standards Cela incite les utilisateurs

agrave essayer le logiciel en prenant un exemple et en ladaptant agrave leurs besoins Cela amegravene

(avec les autres objectifs) agrave un langage simple dapprentissage mais tout de mecircme

puissant Comme notre objectif est de trouver une solution simple il faut que nimporte

qui puisse commencer agrave sen servir rapidement sans avoir besoin de lire lensemble de

la documentation

13 Analyse des solutions existantes

Naturellement une fois que nous savons ce que nous recherchons il nous faut analyser

toutes les solutions qui existent deacutejagrave Cela nous permettra didentifier une solution qui

est deacutejagrave fonctionnelle ou au mieux une qui pourra ecirctre eacutetendue ou utiliseacutee afin de

simplifier le travail de creacuteation si besoin est Au minimum nous pourrons extraire les

concepts inteacuteressants de chaque solution et voir sil est possible de les inteacutegrer agrave notre

solution

12

131 Paquets f1TEX standards

Eacutetant donneacute limportance de lutilisation de JbIEX les premiegraveres solutions sont celles

disponibles agrave linteacuterieur mecircme de fbIEX Celles-ci sont appeleacutees des paquets Plusieurs

paquets diffeacuterents existent et bon nombre dentre eux sont des solutions bricoleacutees et

donc incomplegravetes

Dans les solutions inteacuteressantes on note premiegraverement la preacutesence de la commande

picture Celle-ci a eacuteteacute ajouteacutee dans TEX par Donald Knuth comme tme solution agrave tout

oubli potentiel dans son systegraveme Cette commande prend du texte quelconque et le passe

par la suite au pilote qui compile le document Cela permet entre autres de transfeacuterer

des informations au pilote qui compile en Postscript et permet donc lutilisation de toute

la force de Postscript dans la reacutedaction de dessin Un gros problegraveme de cette solution

est que le texte agrave eacutecrire deacutepend du pilote utiliseacute limitant de beaucoup son utilisation

Il est tout de mecircme devenu la base de nombreux paquets qui se servent de Postscript

Plusieurs solutions ont aussi eacuteteacute deacuteveloppeacutees pour toutes sortes de domaines On retrouve

entre autres des-diagrammes de-Peynmann et deuml Lewis (feyn et-lewis) des dia-grammes

de flots (nassflow) et des arbres linguistiques (xyling rst qtree et lingtrees)

Naturellement ces solutions ne conviennent pas car elles sont pour des domaines trop

speacutecifiques par rapport agrave notre objectif

Une solution dun domaine plus geacuteneacuteral qui se deacutemarque est le paquet PSTricks (Van

Zandt 1993a) Creacuteeacute en 1993 par le professeur Timothy Van Zandt celui-ci est devenu

tregraves populaire au fil des anneacutees eacutetant donneacute les nombreuses possibiliteacutes qui existent en

Postscript Un des grands avantages est sa documentation qui est tregraves prolifique et tregraves

claire (Van Zandt 1993b)

Cela est bien inteacuteressant mais malheureusement PSTricks souffre du mecircme problegraveme

que chaque paquet interne agrave JbTEXmiddot Il est fait agrave partir de macros En effet TEX a eacuteteacute eacutecrit

complegravetement agrave partir de macros Il sagit dlm meacutecanisme de remplacement textuel ougrave

lon deacutefinit une entreacutee et toutes les occurrences de cette entreacutee sont remplaceacutees par une

13

sortie bien speacutecifique Comme une macro est toujours remplaceacutee par son contenu avant

decirctre analyseacutee plus en deacutetail toute forme derreur se retrouve agrave un niveau extrecircmement

bas Cela fait que nimporte quelle erreur est quasi impossible agrave cerner correctement

rendant le travail de lutilisateur qui souhaite apprendre tregraves complexe De plus le fait

de fournir le Postscript directement agrave lutilisateur rend celui-ci tregraves puissant mais tregraves

dangereux Finalement bien que de nombreuses formes soient disponibles il nexiste

pas de hieacuterarchie en tant que telle dans PSTricks ce qui le rend impossible agrave eacutetendre

132 )(J(-pic

Une autre solution inteacuteressante peut ecirctre retrouveacutee agrave linteacuterieur de gTEX Il sagit

de XV-pic un paquet eacutecrit par Kristoffer H Rose (Rose et al 2010) Ce paquet

a eacuteteacute creacuteeacute speacutecifiquement pour la description de diagrammes agrave linteacuterieur de gTEX

et possegravede une documentation exhaustive Malheureusement cette documentation est

extrecircmement complexe mecircme pour un utilisateur avanceacute XV-pic utilise principalement

des boicirctes gTEX positionneacutees agrave diffeacuterents endroits afin de creacuteer les diagrammes Ceuxshy

ci sont par la suite relieacutes par diffeacuterents objets puis deacutecoreacutes Cela fournit un reacutesultat

final de qualiteacute XV-pic possegravede entre autres un mode pour creacuteer des diagrammes en

positionnant les eacuteleacutements dans une matrice Cela rend les dessins plus simples concepshy

tuellement mais pas toujours positionneacutes adeacutequatement XV-pic permet aussi de faire

du positionnement relatif agrave dautres objets ce qui peut ecirctre tregraves pratique Comme nous

pouvons le voir dans lexemple suivant XV-pic est tregraves pratique dans les reacutesultats quil

nous permet dobtenir mais sa syntaxe laisse de beaucoup agrave deacutesirer

Par contre les deacutefauts de XV-pic sont extrecircmement visibles En premier lieu la syntaxe

du langage est extrecircmement difficile agrave comprendre car elle est baseacutee sur la composition

de nombreux caractegraveres speacuteciaux De plus comme il sagit dun paquet gTEX le tout

est impleacutementeacute agrave laide de macros et rend donc la recherche derreur laborieuse (surshy

tout lorsquon prend en compte la syntaxe deacutejagrave difficile agrave utiliser) Cela rend XV-pic

inapte agrave lutilisation par quelquun qui ne souhaite pas investir trop de temps dans son

apprentissage Finalement les nombreux modes de dessins sont souvent incompatibles

14

xymatrix U ar_[ddr]_y ar-[drr]-x

argt[dr] I-(xy) amp X times_Z y ar[d]-q ar[r]_p amp X ar[d]_f amp y ar[r]-g

amp Z

Figure 11 Code XY-pic pour un diagramme

Figure 12 Diagramme reacutesultant du code XY-pic

entre eux et ne peuvent souvent pas ecirctre utiliseacutes dans un mecircme dessin

133 Metapost

Eacutetant donneacute le problegraveme commun agrave tous les paquets agrave linteacuterieur de JgEX la solution la

plus logique serait dessayer den sortir Cela a donneacute le logiciel Metapost (Hobby 1992)

Celui-ci a eacuteteacute inspireacute de Metafont (Knuth 1986) que Knuth a utiliseacute pour dessiner des

polices pour EX Une des grandes avanceacutees du langage est la description de courbes

Celui-ci reacuteutilise un algorithme de Knuth qui permet de deacutecrire des courbes tout en

en controcirclant les diffeacuterents paramegravetres De plus comme le logiciel nest pas reacutedigeacute en

macros il permet de deacutetecter de maniegravere adeacutequate les erreurs de lusager Nous pouvons

deacutejagrave voir dans le code fourni en exemple quil sagit dun langage beaucoup plus clair

que XV-pic

15

beginfig(l)

pair A B C A=(OO) B=(lcmO) C=(Olcm) draw A--B--C--cycle

endfig

Figure 13 Code Metapost pour dessiner un triangle

Figure 14 Diagramme reacutesultant du code Metapost

Par contre quelques problegravemes se deacutegagent de Metapost Premiegraverement le langage ne

permet pas limpleacutementation dune hieacuterarchie solide Cela ne serait pas un problegraveme sil

en existait deacutejagrave une mais ce nest pas le cas En effet les diagrammes ont fait lobjet

dune extension du langage mais rien de tregraves deacuteveloppeacute Il est donc faisable de faire

des diagrammes mais il ne sagit pas neacutecessairement dune solution agrave toute eacutepreuve

De plus comme toutes les coordonneacutees du langage sont donneacutees en valeur absolue cela

limite les possibiliteacutes du langage (entre autres en ne pouvant utiliser des points deacutefinis

par des objets)

134 Asymptote

Une autre possibiliteacute se retrouve dans le logiciel Asymptote qui se deacutefinit comme eacutetant

Wl langage inspireacute de Metapost (Hammerlindl Bowman et Prince 2010b) Il est donc

aussi externe agrave g1EX mais aussi inspireacute du langage de programmation CH Cela lui

confegravere la creacuteation de structures avanceacutees et la creacuteation de fonctions complexes De

plus une documentation exhaustive et un traitement des erreurs de qualiteacute en font une

solution robuste

Malheureusement comme Metapost Asymptote pose quelques problegravemes En effet ce

16

size(3cm) draw(unitsquare) labelC l $A$ (00) SW)

labelC $B$ Cl 0) SE) label ($C$ Cl 1) NE)

label ($0$ (01) NW)

Figure 15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin

( )

il

Figure 16 Diagramme reacutesultant du code Asymptote

logiciel fut eacutecrit avec les matheacutematiques continues et la geacuteomeacutetrie comme domaine

dutilisation Ce nest pas Lill problegraveme en tant que tel (Asymptote le fait tregraves bien)

mais cela fait que la- creacuteation de diagrammes discrets nest pas vraiment deacuteveloppeacutee

Il faudrait donc ecirctre capable de creacuteer une hieacuterarchie de structures pour la creacuteation de

diagrammes Eacutetant donneacute le support des structures posseacutedant des fonctions internes il

devrait ecirctre possible dajouter cette possibiliteacute agrave Asymptote

Malheureusement ce nest pas preacutesentement reacutealisable agrave linteacuterieur du langage En efshy

fet Asymptote est un langage baseacute objet Cela signifie quil possegravede des structures qui

ressemblent agrave une description typique dun objet mais pas toutes les proprieacuteteacutes imshy

portantes qui se rattachent agrave un langage agrave objets standard comme Java ou C++ Plus

particuliegraverement cest labsence de polymorphisme qui cause problegraveme En effet la

creacuteation dune hieacuterarchie implique de creacuteer des liens entre les diffeacuterentes structures Par

exemple un cercle un triangle et un nuage sont toutes des formes avec certaines proshy

prieacuteteacutes similaires Il nous faut donc avoir des fonctions qui prennent des formes comme

paramegravetres Si nous avons une fonction f qui prend une forme nous souhaiterions eacutecrire

une seule fonction

17

fCforme)

Malheureusement en Asymptote il faudrait eacutecrire une fonction pour chaque forme

distincte comme cela

fCcercle)

fCcarre)

fCnuage)

Cela rend la creacuteation dune hieacuterarchie extrecircmement difficile car pour chaque fonction

utilisant un objet plus geacuteneacuteral il nous faut eacutecrire plusieurs fois cette fonction De plus

cela rend lexpansion par lusager de la hieacuterarchie essentiellement impossible car il doit

rajouter des cas pour chaque fonction deacutefinie preacuteceacutedemment en plus dajouter son nouvel

objet dans la hieacuterarchie Cela est difficilement souhaitable

135 Conclusion de lanalyse

Afin den venir agrave une conclusion adeacutequate il faut se ramener aux objectifs rechercheacutes

Cela nous permet de rapidement eacuteliminer les solutions internes agrave Ib-TEX eacutetant donneacute

la complexiteacute de la gestion des erreurs (et indirectement la courbe dapprentissage du

langage) Cela nous laisse comme solution Metapost et Asymptote Naturellement le

langage Asymptote est plus eacutevolueacute que celui de Metapost et fournit des eacuteleacutements de

programmation plus inteacuteressants Cela implique donc quil nous permet plus aiseacutement

de construire nos structures tant deacutesireacutees

Par contre Asymptote ne fournit pas une solution suffisante eacutetant donneacute quil ne possegravede

pas une hieacuterarchie dobjets adapteacutee aux diagrammes De plus eacutetant donneacute que le langage

est baseacute objet il sera beaucoup trop compliqueacute dy implanter une hieacuterarchie Nous en

venons donc agrave la conclusion que le mieux serait dutiliser Asymptote qui nous fournit un

ensemble de services complexes (impleacutementation des chemins liens avec Ib-TEX etc )

et de limpleacutementer avec un langage de plus haut niveau

18

Java devient un choix inteacuteressant pour cette tacircche En effet cest un langage connu dans

lindustrie et simple dapprentissage Il sagit dun langage de programmation objet qui

nous permettra agrave coup sucircr dimpleacutementer une hieacuterarchie solide Par contre ce langage

possegravede quelqu~s petits problegravemes comme un tregraves haut niveau de verbositeacute et beaucoup

deacuteleacutements non requis pour la description de diagrammes

Nous en sommes donc venus agrave la conclusion que la meilleure solution serait dutiliser

Java mais dimpleacutementer par-dessus celui-ci un langage deacutedieacute qui eacuteliminerait tout ce

qui nest pas requis pour la description des diagrammes Nous appellerons ce langage

SDDL pour Structured Diagram Description Language

Concepts inteacuteressants agrave conserver

Avant de penser agrave concevoir notre logiciel il serait bon de voir quels eacuteleacutements nous

souhaitons conserver des solutions existantes Agrave cette fin leacuteleacutement le plus inteacuteressant

provient de XV-Pic En effet il permet de relier des objets entre eux par des flegraveches

dune maniegravere relativement simple Il serait donc inteacuteressant de pouvoir permettre de

deacutecrire des liens entre diffeacuterents objets par des points speacutecifiques agrave chacun dentre eux

De plus lalgorithme de description de chemins utiliseacute par Metapost et Asymptote est

extrecircmement efficace et utile et pourrait donc ecirctre utiliseacute directement par notre langage

Cela sera simple agrave impleacutementer eacutetant donneacute que nous souhaitons utiliser Asymptote pour

compiler vers Postscript

14 Diagrammes repreacutesentatifs du domaine

Finalement avant de pouvoir commencer agrave deacutefinir les besoins de notre hieacuterarchie il

nous faut obtenir une deacutefinition valide et complegravete de notre domaine Naturellement

il nest pas eacutevident de trouver une deacutefinition concregravete et objective dun diagramme en

informatique theacuteorique Nous devons donc nous rabattre sur une autre solution qui doit

tout de mecircme ecirctre la plus formelle possible

19

141 Lapproche de Knuth

Pour trouver une ideacutee nous nous ramegravenerons agrave la meacutethode que Donald Knuth a utiliseacutee

lorsquil a creacuteeacute TEX En effet il souhaitait creacuteer un logiciel qui ferait de laquo beauxraquo doshy

cuments Cela eacutetant un terme tregraves subjectif Knuth deacutecida de se deacutefinir un ensemble

de journaux scientifiques dont les publications eacutetaient du plus haut standard de qualiteacute

pour leacutepoque (Knuth 1999) Apregraves avoir obtenu ces diffeacuterents exemples il put saffairer

agrave essayer de reproduire une solution de cette qualiteacute Il devient donc eacutevident agrave la fin

du cycle de deacuteveloppement du logiciel que sa solution eacutetait coheacuterente et valide car elle

permettait dobtenir un reacutesultat de qualiteacute en comparaison agrave ce que nous pourrions

deacutejagrave deacutefinir comme eacutetant de qualiteacute

Nous pouvons donc chercher agrave suivre la mecircme meacutethode Afin de la respecter nous devons

trouver quelques livres dun haut niveau de qualiteacute et prendre certains diagrammes

que lon retrouve agrave linteacuterieur Cela nous permettra de retrouver les eacuteleacutements les plus

cruciaux de notre domaine

Plusieurs livres inteacuteressants soffrent agrave nous nous utiliserons entre autres laquo The Art

of Computer Programming raquo de Donald Knuth (Knuth 1968) Il est naturel quun des

livres les plus connus en informatique eacutecrit par Knuth de surcroicirct possegravede un haut

standard de qualiteacute Un autre livre important est le laquo livre du dragonraquo (Aho Sethi et

Ullman 1986) qui eacutetudie la theacuteorie de la compilation et est extrecircmement connu dans

son domaine De plus celui-ci renferme leacutetude de nombreuses structures de donneacutees ce

qui nous fournit de nombreux diagrammes de qualiteacute Finalement il existe aussi un livre

tregraves connu dans leacutetude des algorithmes (ce qui est aussi extrecircmement lieacute agrave leacutetude des

structures de donneacutees) qui sappelle laquo Introduction to Algorithmsraquo (Cormen et al

2001) Ces trois livres forment une base extrecircmement connue et de qualiteacute pour nos

diagrammes Nous avons extrait quinze (15) diffeacuterents diagrammes de ces livres

20

142 Description des exemples et des concepts preacutesents dans les diagrammes

Les diffeacuterents diagrammes que nous avons seacutelectionneacutes repreacutesentent diffeacuterentes strucshy

tures de donneacutees On y retrouve plusieurs arbres et graphes Les graphes sont de plushy

sieurs types allant dun graphe standard agrave des graphes dexeacutecution De plus certaines

structures preacutesentes plus rarement se retrouvent dans notre ensemble Entre autres on

retrouve un diagramme de Venn qui bien que conceptuellement simple est toujours

relativement complexe lorsque nous souhaitons le reacutealiser avec un logiciel On retrouve

aussi des arbres linguistiques qui ne sont pas neacutecessairement complexes mais surtout

longs agrave reacutealiser

Cet ensemble de diagrammes nous permet de couvrir lensemble des structures de

donneacutees importantes en informatique theacuteorique et en matheacutematiques discregravetes Il existe

dautres structures de donneacutees mais celles-ci peuvent toujours ecirctre impleacutementeacutees seacutepashy

reacutement eacutetant donneacute que nous souhaitons faire une hieacuterarchie aiseacutement extensible Nous

remarquons surtout dans nos exemples quun des eacuteleacutements les plus importants est de

pouvoir r~lier convenablement les_diffeacuterents eacuteleacutements (dans un graphe par exemple)

Comme il sagit de quelque chose qui est toujours preacutesent il sagira dun des points les

plus importants agrave deacutevelopper pour notre hieacuterarchie

CHAPITRE II

STRUCTURE ET SOLUTION INFORMATIQUE

Afin de deacutevelopper un produit qui convient agrave nos besoins nous aurons besoin quil soit

structureacute adeacutequatement Cela implique principalement la construction de la hieacuterarchie

dobjets du domaine Il faut deacuteterminer quels sont les eacuteleacutements rechercheacutes dans notre

solution trouver une meacutethode de deacuteveloppement formelle et adeacutequate puis la reacutealiser

correctement Cela assurera une solution de qualiteacute

21 Objectifs dune structure dans une solution informatique

En premier lieu il nous faut justifier le besoin dune meacutethode de deacuteveloppement forshy

melle et solide En effet lin logiciel en informatique est tregraves diffeacuterent dun problegraveme

matheacutematique standard Une deacutemarche matheacutematique se ramegravene agrave un concept bien

connu la preuve Cela reurond la reacutesolution du problegraveme creacutedible agrave condition que la

preuve soit bonne Par contre nous verrons quun problegraveme informatique ne peut ecirctre

reacutesolu agrave laide dune simple preuve

211 Les diffeacuterentes composantes dune solution informatique

Une solution agrave un problegraveme informatique possegravede diffeacuterents eacuteleacutements Chacun dentre

eux possegravedent un certain degreacute de formalisme qui affecte lensemble de la solution

22

Algorithmes

Les algorithmes sont les eacuteleacutements les plus formels dune solution informatique On peut

dire quils se ramegravenent agrave la partie matheacutematique dun problegraveme informatique en quelque

sorte Composeacute dune seacuterie dopeacuterations aux comportements bien deacutefinis le reacutesultat dun

algorithme est preacutevisible Eacutetant donneacute la possibiliteacute de preacutevoir le comportement dun

algorithme agrave partir de ses entreacutees il est possible de deacutemontrer que lalgorithme fournit

exactement les reacutesultats rechercheacutes Il suffit en effet de prouver que agrave chaque entreacutee

possible on obtient la sortie qui serait logiquement attendue de lalgorithme On peut

penser par exemple agrave un algorithme de tri qui pour chaque ensemble de nombres

retourne les nombres en ordre croissant

Malgreacute tout un algorithme en informatique nest pas parfait En effet si le temps

dexeacutecution dun algorithme pour des entreacutees standards est beaucoup trop eacuteleveacute il ne

sera pas utiliseacute peu importe quil donne le bon reacutesultat Le temps dopeacuteration et la

quantiteacute despace meacutemoire sont les deux principales contraintes qui entrent en ligne de

compte pour les diffeacuterents algorithmes dune solution informatique

Solutions technologiques

Lautre partie extrecircmement importante de tout logiciel informatique est le choix des

technologies utiliseacutees En effet les programmes informatiques ne sont pas directement

creacuteeacutes agrave partir de circuit eacutelectriques Chaque couche dabstraction suppleacutementaire (cirshy

cuits logiques code assembleur programmation de haut niveau) limite les possibiliteacutes

du programmeur et vient avec certains avantages et certains inconveacutenients Le fait de

ne pas utiliser une solution deacutejagrave existante peut permettre une solution plus puissante

mais agrave un coucirct de deacuteveloppement potentiellement beaucoup plus eacuteleveacute Il est aussi posshy

sible avec un certain ensemble de choix technologiques de ne pas pouvoir obtenir un

effet rechercheacute dans une solution Cela explique pourquoi nous avons deacutecideacute dutiliser

Asymptote Il nous fournit un accegraves agrave JbTEX deacutejagrave codeacute ainsi quune traduction comshy

plexe vers un fichier image Postscript La reacutealisation de ces diffeacuterents eacuteleacutements de

23

code aurait significativement augmenteacute la complexiteacute de notre tacircche

Imperfection de toute solution informatique

Eacutetant donneacute les limitations des outils technologiques agrave notre disposition nous sommes

obligeacutes de constater que toute solution informatique est imparfaite De plus plusieurs

contraintes donneacutees agrave des systegravemes informatiques sont geacuteneacuteralement vagues et peuvent

ecirctre interpreacuteteacutees diffeacuteremment en fonction de lutilisateur Par exemple nous souhaitons

reacutealiser un outil simple dutilisation mais puissant et extensible Naturellement plus

un langage est puissant plus il devient complexe Un utilisateur peut trouver un outil

tregraves simple alors quun autre le trouvera incompreacutehensible Dautres points comme la

qualiteacute de documentation la courbe dapprentissage et lagestion aiseacutee des erreurs sont

des critegraveres qui possegravedent une bonne part de subjectiviteacute Ce ne sont toutefois pas

neacutecegravessairement de mauvais critegraveres Il faut simplement chercher selon une deacutefinition la

plus proche possible dun utilisateur moyen agrave maximiser les diffeacuterents paramegravetres

Ce genre de contraintes relegraveve geacuteneacuteralement du geacutenie logiciel Bien que ce meacutemoire ne

constitue pas un travail de geacutenie logiciel nous sommes obligeacutes demprunter quelques

eacuteleacutements agrave ce domaine afin dobtenir un reacutesultat adeacutequat

212 Consideacuterations pour une meacutethodologie de deacuteveloppement

Avant de choisir notre meacutethodologie il est bon de veacuterifier les objectifs rechercheacutes dans

lutilisation dune telle meacutethode de deacuteveloppement Cela nous permettra de deacutegager les

eacuteleacutements importants agrave garder en tecircte tout au long du deacuteveloppement de la hieacuterarchie

Un des eacuteleacutements les plus importants est dobtenir une structure efficace pour deacutecrire

nos diagrammes Lautre eacuteleacutement crucial est dobtenir une hieacuterarchie qui repreacutesente

adeacutequatement le domaine De preacutefeacuterence elle doit ecirctre complegravete et dun usage naturel

On entend par lagrave que les eacuteleacutements sont suffisamment preacutecis et proches deacuteleacutements stanshy

dards et connus du domaine que toutes les opeacuterations soient laquo naturellesraquo pour une

personne qui ne connaicirct pas le langage Il nexiste malheureusement pas de mesure pour

24

deacuteterminer si une hieacuterarchie est naturelle ou non Toutefois si chaque section est reacutefleacutechie

de maniegravere formelle le reacutesultat final devrait ecirctre naturel Certaines consideacuterations mishy

neures peuvent ecirctre plus ou moins mesureacutees comme la longueur du code et les noms

adeacutequats de fonctions

22 La programmation orienteacutee-objet

La programmation orienteacutee-objet est un des pheacutenomegravenes tregraves importants en informashy

tique Depuis sa creacuteation elle est devenue de plus en plus populaire eacutetant donneacute la faciliteacute

de deacuteveloppement dans une telle meacutethode Le fait dutiliser une solution orienteacutee-objet

(au contraire de Metapost ou Asymptote) ne sest pas fait de faccedilon arbitraire Il est

donc de mise dexposer les diffeacuterents avantages qui nous ont pousseacutes agrave choisir un tel

paradigme pour notre logiciel

221 Concepts de bases

La structure de base en programmation orienteacutee-objet est naturellement lobjet Celuishy

ci est deacutefini comme eacutetant une structure de donneacutees qui regroupe des donneacutees et des

meacutethodes (Saunders 1989) Bien quil ne sagit pas dun critegravere obligatoire la plushy

part des langages de programmation creacuteent les objets agrave partir dune classe qui deacutefinit

les diffeacuterents champs et meacutethodes preacutesents et leurs effets Les objets forment donc le

minimum requis pour avoir un langage objet

En tant que tel cet ensemble de concepts est assez minimaliste Il existe plusieurs autres

eacuteleacutements qui sont preacutesents agrave un degreacute plus ou moins grand dans les langages agrave objets

Ceux-ci forment donc en quelque sorte la base de la programmation orienteacutee-objet

(Pierce 2002)

- Lencapsulation des donneacutees cest-agrave-dire camoufler les donneacutees dans une structure

speacutecifique (lobjet)

- Lheacuteritage qui permet de deacutefinir un objet comme eacutetant une installce speacutecifique dun

autre objet On peut appliquer le mecircme raisonnement agrave deux classes On dit alors

25

quune classe heacuterite dune classe de base Celle-ci possegravede exactement le mecircme corps

que sa classe de base mais peut rajouter ou modifier certaines proprieacuteteacutes Il sagit

dun des aspects les plus importants dans le deacuteveloppement dune hieacuterarchie

- Le polymorphisme qui nous permet de creacuteer des proprieacuteteacutes qui varient en fonction

des sous-classes Par exemple une classe Nombre pourrait avoir une meacutethode daddishy

tion alors que ses sous-classes Entiegraveres et Reacuteelles redeacutefiniraient cette meacutethode en

fonction de leur impleacutementation speacutecifique Cela nous permet par la suite de prendre

deux nombres et de les additionner peu importe quil sagisse de reacuteels ou dentiers

222 Diffeacuterence avec la programmation baseacutee-objet

Les diffeacuterentes prioriteacutes eacutenumeacutereacutees ci-haut sont les eacuteleacutements de base qui nous permettent

de creacuteer une hieacuterarchie de qualiteacute Il sagit de la raison principale justifiant de ne pas

utiliser Asymptote pour creacuteer la hieacuterarchie En effet celui-ci est un langage baseacute-objet

La diffeacuterence principale est quun langage baseacute-objet ne neacutecessite pas limpleacutementation

de lheacuteritage ou du polymorphisme (Saunders 1989) Asymptote de son cocircteacute possegravede un

heacuteritage de structure minimal mais pas de polymorphisme Cette diffeacuterence est cruciale

car cet eacuteleacutement est neacutecessaire pour la creacuteation dune hieacuterarchie dans des contraintes

acceptables

En effet une chose importante est dajouter des objets dans les diagrammes Par

exemple supposons que nous avons une classe Conteneur Celui-ci doit pouvoir conteshy

nir des Cercles des Carreacutes des Triangles etc Sil fallait eacutecrire une fonction pour

ajouter chacune des formes le travail deviendrait eacutenormeacutement complexe et impossible

agrave eacutetendre pour lusager final Avec le polymorphisme il suffit deacutecrire une fonction qui

permet dajouter une Forme quelconque

23 Meacutethode pour la conceptualisation dune hieacuterarchie

Nous deacutecrirons ici la meacutethode que nous avons utiliseacute Il sagit de DMT (pour Dbj ect

Modeling Technique)

26

231 Origine de la meacutethode

Cette meacutethode fut deacuteveloppeacutee principalement par James Rumbaugh (mais avec laide de

plusieurs personnes) (Rumbaugh et al 1991) en 1991 Celui-ci est principalement connu

comme eacutetant un des auteurs de la norme UML qui est devenu le scheacutema de modeacutelisation

objet standard et utiliseacute par tous les programmeurs objets (Group 1999) Il est agrave noter

que cette meacutethode est une meacutethode danalyse complegravete pour toute la dureacutee de vie du

logiciel Nous naurons par contre besoin que de la partie analyse de cette meacutethode

232 Les diffeacuterentes eacutetapes de conceptualisation

La premiegravere partie de cette meacutethode a deacutejagrave eacuteteacute effectueacutee implicitement lorsque nous

avons rechercheacute nos diagrammes relatifs du domaine Habituellement il est suggeacutereacute

deacutecrire un texte reacutesumant lensemble du domaine mais dans notre cas il est plus

approprieacute de reacutesumer notre domaine avec des diagrammes Par la suite il faut prendre

le temps de faire ressortir les diffeacuterentes classes dobjets qui font parties du domaine et

prendre le temps de bien les deacutefini~middot On eacuteliminera les classes vagues ou redondantes par

la suite

La prochaine eacutetape consiste agrave deacutefinir les diffeacuterentes associations entre les classes Par

exemple une classe Employeacute et une classe Compagnie seraient lieacutees par lassociation

travaille pour Par la suite on identifie les attributs (ou les champs) des diffeacuterentes

classes en eacutevitant les attributs dimpleacutementation Finalement on raffine le modegravele en

ajoutant lheacuteritage des classes Cela permet de simplifier significativement la hieacuterarchie

Cela fournit une hieacuterarchie complegravete de notre domaine Par contre rien ne deacutemontre

quelle est correcte Afin de la veacuterifier il suffit danalyser les diffeacuterents cas typiques de

notre problegraveme regarder le reacutesultat obtenu et relever toute erreur Dans notre cas il

sagit de coder (seulement en terme de la hieacuterarchie) les diffeacuterents diagrammes et veacuterifier

si nous consideacuterons le tout satisfaisant Par la suite nous pourrons reacuteiteacuterer le mecircme

proceacutedeacute jusquagrave obtenir satisfaction Nous serons ainsi assureacutes davoir une hieacuterarchie

27

adapteacutee agrave notre domaine et complegravete

24 Deacuteveloppement de la hieacuterarchie

Maintenant que nous avons une meacutethodologie correcte nous pouvons creacuteer notre hieacutershy

archie Le fait de sassurer de sa compleacutetude nous permettra de ne pas rencontrer de

problegravemes complexes lors de la phase dimpleacutementation du logiciel

241 Extraction des diffeacuterents concepts

Les concepts du domaine (qui se ramegravenent agrave des classes) se divisent en plusieurs cateacuteshy

gories Une des principales est le domaine des formes Une forme peut ecirctre un carreacute

un cercle etc Une autre cateacutegorie importante est formeacutee des points qui peuvent ecirctre

deacutefinis de plusieurs maniegraveres diffeacuterentes Finalement une autre section importante est

formeacutee des structures de conteneurs incluant les Canvas (pour contenir des objets) et

des Drawing (pour reacutefeacuterencer des objets)

Eacutetant donneacute le nombre relativement faible de formes distinctes il ne nous est pas apparu

utile de faire plusieurs cateacutegories de formes distinctes En effet une seacuteparation entre les

courbes fermeacutees et ouvertes peut nous permettre de factoriser un ou deux eacuteleacutements de

code sans toutefois ecirctre significatif ou reacuteellement utile (eacutetant donneacute quil nexiste pas

vraiment de forme standard deacutefinie par une courbe ouverte)

242 Eacuteleacutements particuliers

Plusieurs eacuteleacutements particuliers se sont reacuteveacuteleacutes complexes agrave modeacuteliser dans notre hieacuterarshy

chie Nous abordons ici les principales difficulteacutes rencontreacutees ainsi que les solutions pour

les reacutegler

28

Creacuteation et placement dobjets

Leacuteleacutement le plus important de notre hieacuterarchie est de pouvoir structurer les objets

que nous souhaitons positionner Nous avons donc creacuteeacute une classe Canvas Le nom est

inspireacute du mot canevas en peinture eacutetant donneacute que nous avons apposeacute des restrictions

similaires agrave ce domaine En effet nous avons deacutecideacute que lorsquun objet est placeacute dans

un canevas il ne peut ecirctre enleveacute ou modifieacute Cela nous permettra plus tard de faire

des calculs pour les points de reacutefeacuterence plus aiseacutement De plus un canevas doit pouvoir

posseacuteder des sous-canevas Pour cela il nous faut une classe geacuteneacuterale qui deacutecrit tout

eacuteleacutement pouvant ecirctre ajouteacute dans un canevas

Cela est reacutesolu avec lintroduction dune classe Shape Celle-ci repreacutesente toute forme

qui peut ecirctre dessineacutee quelle soit simple ou complexe Un Canvas est une forme afin

de sassurer de pouvoir positionner des sous-canevas Une implication particuliegravere de

notre choix est quune Shape ne possegravede pas de position Il sagit dune forme abstraite

qui peut ecirctre positionneacutee agrave un certain endroit Cela implique aussi quil est possible de

prendre une Shape et de la placer agrave plusieurs end_roits distincts Lorsquelle est ajouteacutee

dans un Canvas une Shape est copieacutee ce qui empecircche toute modification subseacutequente

de la forme

Objets multiples

Lorsquil sagit de creacuteer des diagrammes freacutequemment il est tregraves probable que plusieurs

eacuteleacutements soient similaires Par exemple si nous creacuteons un arbre avec des cercles comme

sommets il sagit toujours en quelque sorte du mecircme cercle De plus si nous creacuteons

un sous-canevas et que nous le positionnons agrave plusieurs endroits certaines formes deshy

viennent automatiquement deacutedoubleacutes Il devient donc primordial pour nous de pouvoir

reacuteutiliser un eacuteleacutement que nous avons deacutejagrave deacutefini afin deacuteviter la creacuteation agrave reacutepeacutetition

dobjets

Or nous avons deacutejagrave speacutecifieacute quil eacutetait possible de positionner plusieurs fois le mecircme

29

objet Cela est vrai mais il y a une limitation En effet ces objets ne peuvent pas ecirctre

reacutefeacuterenceacutes Si nous souhaitons connaicirctre un objet celui-ci doit pouvoir ecirctre distingueacute

dun autre Il nous faut donc une classe qui repreacutesente une forme agrave un endroit preacutecis

Pour cela nous avons creacuteeacute la classe Drawing Celle-ci permet de repreacutesenter une Shape

agrave un endroit bien preacutecis dans un canevas Cela fait toutefois que les eacuteleacutements dans un

sous-canevas multiple restent identiques Nous verrons bientocirct la solution agrave ce problegraveme

Points de reacutefeacuterence

Un des eacuteleacutements les plus complexes relevait du fait de fournir des points de reacutefeacuterence

En effet faire de simples chemins entre des coordonneacutees en valeurs absolues neacutetait pas

suffisant mecircme sil est possible dadditionner ses points La solution souhaiteacutee eacutetait de

permettre de deacutefinir des points de reacutefeacuterence ceux-ci pouvant ecirctre obtenus agrave partir de

lobjet lui-mecircme Par exemple un cercle pourrait retourner son point nord

Un eacuteleacutement fondamental causait problegraveme la fonction pour acceacuteder au point doit ecirctre

deacutefinie dans la forme (par exemple dans la classe Circle) Par contre une forme en

tant que telle ne possegravede pas de position speacutecifique Par conseacutequent son point nest

pas deacutefini non plus Pour cela il faudrait obtenir un Drawing Par contre un Drawing

ne peut pas posseacuteder la deacutefinition de chaque fonction daccegraves agrave un point pour chaque

forme Cela est contre-intuitif Il faut donc demander agrave la forme lorsquon appelle pour

obtenir un point de prendre le Drawing suppleacutementaire en paramegravetre Notre intention

est lorsque nous eacutecrirons un langage au-dessus de la hieacuterarchie de pouvoir reacutegler ce

problegraveme

Chemins de reacutefeacuterence

Finalement il nous reste un leacuteger problegraveme Nous pouvons maintenant faire une reacutefeacuteshy

rence agrave un objet disons a et obtenir un point speacutecifique de cet objet Par contre cela

nest pas suffisant dans un cas bien preacutecis Disons que a est dans le canevas b Ensuite b

est placeacute agrave deux reprises dans le canevas c obtenant deux Drawing diffeacuterents cl et c2

30

Nous ne pouvons pas acceacuteder agrave a car il est repreacutesenteacute seulement en fonction de b Pour

reacutegler le problegraveme il faut faire un chemin de reacutefeacuterence (disons cl b a dans le langage

final) Pour cela nous fournirons la possibiliteacute de partir dun Drawing et den obtenir

un autre (agrave condition quil sagisse dun Canvas naturellement) Cela va mettre agrave jour

la position relative de lobjet par rapport agrave un niveau de profondeur suppleacutementaire

En acceacutedant agrave cette fonction aussi souvent que neacutecessaire il est possible de reacutefeacuterencer

un objet peu importe son degreacute de profondeur reacuteel Cela nous permet donc de faire

des liens complexes entre nimporte quel objet (voire mecircme des objets de profondeur

diffeacuterentes)

31

CHAPITRE III

EacuteLEacuteMENTS GRAPHIQUES

Dans ce chapitre nous deacutefinissons les eacuteleacutements graphiques requis pour faire des dessins

informatiques dont les courbes de Beacutezier ainsi que les splines cubiques Les proprieacuteteacutes

importantes de ces courbes sont deacutemontreacutees De plus une preuve est fournie de la

possibiliteacute dapproximer adeacutequatement un cercle avec des splines cubiques Finalement

nous discuterons du fonctionnement des diffeacuterentes solutions informatiques en terme de

structure telles que PDF et Asymptote

Courbes et segments en informatique

Naturellement les eacuteleacutements les plus importants dans des dessins informatiques sont les

segments et les courbes Pour des besoins de simpliciteacute nous essaierons de les inteacutegrer

dans la mecircme deacutefinition en traitant les segments comme un cas particulier des courbes

Nous donnons agrave cette courbe geacuteneacuterale le nom de chemin

Le premier problegraveme lorsque nous voulons faire des courbes en informatique est la

meacutethode pour les repreacutesenter Lecirctre humain peut tracer une infiniteacute de courbes disshy

tinctes sans avoir besoin de la deacutecrire avec preacutecision Par contre lorsquon entre dans le

domaine de linformatique il faut non seulement ecirctre capable den faire une description

mais celle-ci doit ecirctre la plus petite possible

Une des meacutethodes de repreacutesentation est sous la forme de pixels (JI et Kelley 2007)

Cette meacutethode implique de repreacutesenter un plan continu par un ensemble de points disshy

32

crets appeleacutes pixels Cela permet de repreacutesenter plusieurs formes de dessins extrecircmement

complexes et est utiliseacute dans certains logiciels dimages

Une autre meacutethode est la meacutethode vectorielle Cest la plus populaire Au lieu de

repreacutesenter directement le dessin tel quil apparaicirct on fournit une description du dessin

agrave partir de quelques concepts tregraves simples (points segments et cercles par exemple)

Lorsque lutilisateur souhaite voir le dessin un logiciel traduit la description en pixels

pour leacutecran

La derniegravere meacutethode possegravede plusieurs avantages La description dun dessin est souvent

beaucoup plus compacte que si on deacutecrit le dessin pixel par pixel De plus la description

conserve la preacutecision du dessin peu importe la reacutesolution agrave laquelle il est preacutesenteacute Par

exemple si nous prenons un ensemble de pixels et quon lagrandit plusieurs fois il est

tregraves probable que nous ayons perdu beaucoup dinformations Il nous faut par contre

veacuterifier la puissance reacuteelle dune telle meacutethode Nous devons donc introduire une des

structures utiliseacutees pour la description vectorielle

32 Courbes de Beacutezier

Une courbe de Beacutezier est un concept relativement simple deacuteveloppeacute indeacutependamment

par Paul de Casteljau et Pierre Beacutezier entre 1959 et 1962 Ces deux personnes avaient

pour objectif de creacuteer des repreacutesentations par ordinateur de voitures pour les compagnies

Citroen et Renault respectivement (Jr et Kelley 2007)

321 Deacutefinition

Soit Po Pl P2 Pn E 1R2 un ensemble de points dans un plan carteacutesien typique

Ceux-ci sont appeleacutes des points de controcircle Soit t E IR et 0 lt t 1 La courbe de

Beacutezier de degreacute n des points Po agrave Pn est deacutefinie par la formule suivante

B t - n ( n

) 1 - t n-ttt

pPohmiddotPn ( ) - ~ i ( ) t (31) t=O

33

Le chemin est deacutefini pour les valeurs entre 0 et 1 de t Cette formule peut sembler

leacutegegraverement arbitraire et complexe pour une forme supposeacutement simple Une seconde

deacutefinition reacutecursive cette fois-ci simplifie beaucoup la formule

322 Deacutefinition alternative

Bp =p (32)

BpOPl Pn(t) = (1 - t)BpOPl Pn-l (t) + tBplhPn (33)

Cette deacutefinition alternative se ramegravene agrave dire quune courbe de Beacutezier est une intershy

polation lineacuteaire entre deux courbes de Beacutezier de degreacute infeacuterieur La deacutemonstration se

ramegravene agrave quelques manipulations bien simples et est laisseacutee en exercice au lecteur

Nous pouvons analyser les formules pour diffeacuterents degreacutes Par exemple une formule de

Beacutezier de degreacute 1 nest quune droite

BPoPl (t) = (1 - t)Po + tP] (34)

Alors quune courbe de degreacute 2 se ramegravene agrave une parabole

(35)

Finalement une courbe de Beacutezier cubique (de degreacute 3) fournit une courbe relativement

complexe qui commence agrave Po et termine agrave P3

--- ---

34

P P

0

P

Po - ____ _ - - P2

Po - - - - - - - - - - - - - - - - - - - - - - - shyPo P2 P3

(a) lineacuteaire (b) quadratique (c) cubique

Figure 31 Courbes de Beacutezier lineacuteaire quadratique et cubique

Eacutevidemment il ny a pas davantages significatifs agrave utiliser une courbe de Beacutezier lineacuteaire

Les courbes de Beacutezier quadratique sont quant agrave elles utiliseacutees lors de la geacuteneacuteration

de police TrueType (Apple Computer Inc 1996) Finalement les courbes de Beacutezier

cubiques sont utiliseacutees dans Postscript (Adobe Systems Incorporated 2010a) et dans la

plupart des produits Jb1EX tel que Metafont (Knuth 1986) Ces logiciels utilisent en

fait une combinaison de courbes de Beacutezier appeleacutees splines que nous verrons dans la

section suivante

323 Proprieacuteteacutes dune courbe de Beacutezier

En regardant les diffeacuterentes courbes nous pouvons aiseacutement voir quelques proprieacuteteacutes

Entre autres il y a interpolation des points de deacutepart et de fin Cela peut se deacutemontrer

aiseacutement en calculant B(uuml) et B(l) qui donne respectivement Po et Pn De plus les

autres points ne semblent pas ecirctre interpoleacutes Il sagit ici dun cas geacuteneacuteral (les points

peuvent ecirctre interpoleacutes sils sont colineacuteaires)

Une autre proprieacuteteacute inteacuteressante des courbes de Beacutezier est son invariance par transforshy

mation affine Cela se ramegravene au theacuteoregraveme suivant Dans le cadre de ce theacuteoregraveme nous

devrons transformer les coordonneacutees des points de controcircles des courbes de Beacutezier en

coordonneacutees projectives homogegravenes Ceci se ramegravene agrave rajouter un axe agrave chacun de nos

points dont la valeur sera toujours 1

35

Theacuteoregraveme dinvariance affine

Soit BpOPl Pn(t) une courbe de Beacutezier Soit M une matrice 3 par 3 repTeacutesentant une

transformation affine Alors on a que la courbe est invari(Lnte par lapplication de M

cest-agrave-dire MBpoPlPn(t) = BMPolvIPl lvIPn(t)

Pour le prouver il suffit de deacutevelopper la formule

NI BpoP1Pn (t) = M t (~) (1 - tt-ieuml Pi 1=0

= tM(~) (1- tt-itiPi 1=0

= t (~) (1- t)n-iti(MPi ) 1=0

Ce theacuteoregraveme implique que pour transformer une courbe de 8eacutezier il suffit dappliquer la

transformation agrave chaque point de controcircle et de calculer une nouvelle courbe de 8eacutezier

Donc une courbe de Beacutezier est entiegraverement deacutefinie par ses points de controcircle Cela fait

quelle est tregraves pratique en informatique car elle ne requiert que peu despace pour la

deacutefinir (ie seulement les n + 1 points de controcircle) De plus il est tregraves simple de geacuteneacuterer

une courbe de Beacutezier car il suffit dutiliser la formule pour autant de valeurs de t que

nous avons besoin de preacutecision dans la courbe En conservant linformation avec cette

meacutethode nous conservons une courbe sans aucune perte dinformation Cela signifie que

nous pouvons agrandir la reacutesolution de la courbe autant que nous le souhaitons et il

sagira toujours dune belle ligne courbe Cette proprieacuteteacute est extrecircmement inteacuteressante

en informatique

36

324 Deacutesavantages des courbes de Beacutezier

Les courbes de Beacutezier sont utiliseacutees dans beaucoup de domaines Par contre elles

possegravedent quelques deacutesavantages peu inteacuteressants Le plus important est probablement

labsence de controcircle local Cela sexprime par le fait que degraves que lon souhaite modifier

une courbe de Beacutezier agrave un endroit particulier tout le reste de la courbe est modifieacute au

passage Cela se deacutemontre par le fait que si 0 lt t lt 1 on a alors que

Cela implique que chaque point de controcircle de la courbe de Beacutezier a une influence (aussi

minime soit-elle) sur lensemble de la courbe Le reacutesultat est que les courbes de Beacutezier

seules sont difficiles agrave utiliser et longues agrave eacutevaluer si on utilise trop de points de controcircle

33 Splines cubiques

La solution agrave ce problegraveme est lutilisation de splines cubiques Lideacutee de base dune spline

est que si une seule courbe cause trop de problegravemes il est probablement mieux dutiliser

plusieurs courbes mais qui fonctionnent seulement dans un domaine plus petit Plus

formellement une spline cubique (aussi appeleacute B-spline cubique) est composeacute de

- un ensemble de valeurs ti pour 0 S i S m - 1 ougrave m repreacutesente le nombre de noeuds

On appelle aussi ces valeurs le vecteur de noeud Les t forment une suite monotone

croissante et sont tous des valeurs reacuteelles entre 0 et l

- L + l points de controcircle

- Une valeur entiegravere n qui repreacutesente lordre de la fonction B-sp1ine Une spline doit

respecter la condition n S m - 2

On deacutefinit une spline par la fonction suivante

37

m-n-2

S(t) = L Pibin(t) tE [01] i=O

ou dans le cas speacutecifique dune spline de degreacute 3

3

S(t) = L Pi bi 3(t) tE [01] i=O

Les bin repreacutesentent les bases de la B-spline (pour Basis Spline) Celles-ci sont deacutefinies

par la fonction reacutecursive suivante

bjoU) ~ sinon

Il sagit dune eacutequation complexe et nous ne nous y attarderons pas trop Quelques

deacutetails sont inteacuteressants agrave noter Entre autre il est inteacuteressant de constater que si lon

utilise n + 1 points de controcircle et que les noeuds sont n noeuds valant zeacutero et n noeuds

valant 1 le B-spline deacutegeacutenegravere en une courbe de Beurozier Il sagit donc dune extension

des capaciteacutes des courbes de Beacutezier

Le problegraveme principal eacutevoqueacute par les courbes de Beacutezier est que lutilisateur lors de

la creacuteation dune courbe manquait de controcircle local Il serait donc inteacuteressant que les

B-splines nous permettent de reacutegler ce problegraveme Lorsquon regarde la deacutefinition de la

base bi on remarque que celle-ci se ramegravene toujours au cas de base qui peut ecirctre aou

1 selon que nous sommes dans un domaine restreint ou non Comme il sagit du seul

facteur de Pi il est naturel daffirmer que le controcirc~e est plus localiseacute quavant Dautres

proprieacuteteacutes inteacuteressantes sont

- Pour tout t la somme de tout les bi(t) est 1

38

C5 C4 C3 -----~---- ----~-----

-----~---- ----~-----

Cg ClO Cn

Figure 32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier

- Un B-spline dordre m sera neacutecessairement Cm - 2 cest-agrave-dire quelle possegravede 2 ordres

de deacuteriyeacutees continues pour son domaine de deacutefinition _

- Tout comme les courbes de Beacutezier les B-splines sont invariants par transformation

affine On peut donc appliquer une courbe en appliquant tout simplement la transshy

formation sur les points de controcircle et en calculant le nouveau B-spline

34 Le cas dun cercle

Avec les outils que nous posseacutedons nous ne sommes pas en capaciteacute de dessiner un

cercle exact Cela nest pas grave eacutetant donneacute que nous pouvons tout de mecircme tenter de

lapproximer Pour ce faire nous utiliserons une spline cubique posseacutedant quatre points

(est nord ouest et sud respectivement) Chaque courbe de Beacute7i~r sera donc identique

aux autres agrave une rotation pregraves Il reste donc agrave deacuteterminer les points de controcircle agrave utiliser

Pour cela prenons le premier quadrant du cercle Nous passons du point Cl (10) agrave

C4 (0 1) Il nous faut deacuteterminer deux points de controcircle C2 et C3 Pour commencer

39

nous pouvons supposer de maniegravere tout agrave fait arbitraire que C2 se situe sur la tangente

de Cl et C3 sur la tangente de C4 Cela nous donne donc le scheacutema suivant

C4 C3 ----- ----~-----

1

1

1

1

TC2 1

1

1

i

Figure 33 Quart de cercle approximeacute par une courbe de Beacutezier

On a donc C2(1 k) et C3(k 1) ougrave k est une variable agrave deacuteterminer Afin de la deacuteterminer

nous devons donner une information suppleacutementaire Par exemple nous pouvons preacuteshy

supposer que le point agrave 45 degreacutes C(O5) doit ecirctre eacutevalueacute exactement par la courbe de

Beacutezier cest-agrave-dire C(O5) = (1 1) Nous obtenons donc la restriction

C(uuml5) = (1 - t)3CI + 3(1 - t)2tC2 + 3(1 - t)t2C3 + t3C4

1 3 3 1 = -Cl + -C2 + -C3 + -C4

8 8 8 8

ce qui nous permet dobtenir leacutegaliteacute

v2v2 1 3 3 1 (- -) = -Cl + -C2 + -C3 + -C4 (37)22 8 8 8 8

ce qui nous fournit apregraves substitution des valeurs des points deux fois leacutequation

v2 1 3k-=-+- (38)2 2 8

40

ce qui nous fournit apregraves reacutesolution

k = ~(J2 - 1) 0552285

Cela nous fournit donc une courbe de Beacutezier qui approxime notre cercle Il reste agrave voir

la preacutecision de cette approximation

Pour ce faire nous devrons comparer larc de cercle que nous venons de creacuteer agrave un cercle

reacuteel Afin dy arriver nous consideacutererons chaque valeur de notre arc comme eacutetant un

vecteur dont nous devrons calculer la longueur Plus cette longueur est proche de 1

plus nous avons une estimation reacutealiste Nous calculons donc

Par la suite une analyse des deacuteriveacutees nous permet de conclure que cette fonction dans

lintervalle t E [01] possegravede des m(iximu_ms agrave _t = 0 agrave tr~is reprises _(au deacutebut et agrave la

fin eacutetant donneacute la proprieacuteteacute naturelle des courbes de Beacutezier celle au milieu est due agrave

notre contrainte) Finalement elle possegravede deux (2) minimums agrave t = 0211 et t = 0789

et lerreur avec un cercle standard est de 0000273 Une telle variation sur un cercle

de rayon 1 est minime Il sagit dune variation maximale infeacuterieure agrave 003 Cela

signifie donc pour un cercle posseacutedant un rayon de 4000 pixels il y aura une variation

maximale de 12 pixels ce qui est indeacutetectable pour la taille du cercle Cela en fait une

bonne estimation pour cette section du cercle Nous pouvons naturellement suivre le

mecircme raisonnement pour les sections restantes

Il est aussi agrave noter que notre estimation nest pas la meilleure Notre choix de demander

leacutegaliteacute agrave 45 degreacutes est arbitraire et toute lerreur se retrouve dans le cocircteacute neacutegatif De

meilleures estimations ont eacuteteacute effectueacutees (Riskus 2006) avec des reacutesultats amenant une

preacutecision jusquagrave 25 plus grande (Lancaster 2005)

41

0--------------r--7T-----------------rl 08 (1

-000005

-000010

-000015

-000020

-000025

Figure 34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence

35 Structures informatiques dans les solutions deacutejagrave existantes

Maintenant que nous savons comment fonctionne les diffeacuterents modes de repreacutesentation

des dessins en informatique il faut analyser plus en deacutetail comment fonctionne les

logiciels dont nous allons nous servir En effet il nous faudra adapter nos structures de

bas niveau agrave celles disponibles dans les langages dont nous nous servirons Pour cela

nous allons analyser deux parties distinctes un format de fichier (PDF) ainsi quun

42

langage intermeacutediaire (Asymptote)

351 Postscript et PDF

En premier lieu il convient de comprendre comment fonctionne le format de fichier final

que nous utiliserons ]1EX permet de geacuteneacuterer plusieurs formats de fichier diffeacuterents

Pendant longtemps le plus populaire aura eacuteteacute Postscript creacuteeacute par Adobe Systems Cela

eacutetait principalement lieacute aux imprimantes qui fonctionnaient directement avec ce format

De nos jours le format PDF est beaucoup plus populaire bien quayant une base tregraves

proche de celle de Postscript

Postscript a eacuteteacute inventeacute par John Warnock et Charles Geschke en 1982 (Adobe Systems

Incorporated 1994) Lorsquil a eacuteteacute creacuteeacute il servait agrave faire la description de pages pour

impression Il se distingue comme eacutetant un langage de programmation complet mais

rarement utiliseacute directement En effet Postscript est difficile agrave utiliser car il utilise la

notation polonaise inverse Par exemple on exprime lappel de fonction j(a b c) de la

faccedilon suivante

abc f

Cette meacutethode rend lanalyse dun programme extrecircmement rapide et convivial pour

le logiciel qui linterpregravete car celui-ci est directement lieacute agrave la structure dune pile

dexeacutecution Par contre lanalyse dun tel programme par un humain est complexe

La plupart du temps Postscript eacutetait donc utiliseacute comme un langage de description

final pour un fichier

Il existait deux types de structures utiliseacutes en Postscript pour mettre des dessins sur une

page Le premier eacutetait lajout de texte Cela est intrinsegravequement lieacute agrave la description des

polices qui deacutepasse le cadre de ce meacutemoire Par contre pour faire un dessin quelconque

le format utilisait les chemins qui sont deacutecrits soit par des segments soit par des courbes

de Beacutezier cubiques On note donc le deacutesavantage de lutilisation dune courbe de Beacutezier

soit labsence de controcircle local

43

Quant agrave lui PDF a eacuteteacute creacuteeacute en 1993 (Adobe Systems Incorporated 2010b) Agrave travers les

gains de populariteacute le format PDF est devenue en 2008 un standard ISO (International

Organization for Standardization 2008) Cela en fait donc un format de document

standard extrecircmement inteacuteressant Alors que Postscript a eacuteteacute creacuteeacute pour des documents

qui devaient ecirctre imprimeacutes PDF a eacuteteacute conccedilu pour la description de documents plus

dynamiques cest-agrave-dire la possibiliteacute dajouter des eacuteleacutements multimeacutedias au document

Aussi il est possible de deacutecrire chaque page indeacutependamment des suivantes En effet

comme Postscript deacutecrivait des documents dimpression il est normal de connaicirctre la

page de deacutepart avant dimprimer la suivante En PDF chaque page est totalement

indeacutependante du reste du document

Pour la description deacuteleacutements graphiques les structures de base sont essentiellement

les mecircmes que Postscript Quelques eacuteleacutements comme la transparence cest-agrave-dire quun

eacuteleacutement cacheacute par un autre eacuteleacutement contribue au reacutesultat final ont eacuteteacute ajouteacutes mais les

eacuteleacutements graphiques de bas niveau sont identiques

352 Asymptote

Comme nous lavons dit preacuteceacutedemment tout ramener agrave des courbes de Beacutezier creacutee un

problegraveme de controcircle local des courbes Il faut donc utiliser une meacutethode pour donner

du controcircle agrave lutilisateur Pour cela nous utiliserons Asymptote Les structures de

bas niveau de Asymptote sont identiques agrave celles de PDF eacutetant donneacute quil convertit

directement les chemins Asymptote en chemins PDF Par contre Asymptote impleacutemente

un algorithme (Bowman 2007) originellement deacuteveloppeacute par Donald Knuth qui permet

de deacutecrire un chemin en fonction des points par lesquels il passe Asymptote utilise donc

des splines cubiques (qui ne sont pas neacutecessairement des B-splines toutefois)

Cet algorithme est complexe et en dehors du cadre de ce meacutemoire mais peut ecirctre

reacutesumeacute comme eacutetant un algorithme de choix des points de controcircle En effet une courbe

de Beacutezier cubique est deacutefinie par 4 points Le premier et le dernier sont interpoleacutes de

maniegravere exacte Ce que lalgorithme fait est quil prend un ensemble de points qui

44

seront tous interpoleacutes disons Pl P2 P3 P4 Ensuite pour chaque paire conseacutecutive de

points (donc (Pl P2 ) (P2 P3) et (P3 P4)) il geacuteneacuterera une courbe de Beacutezier cubique

La partie la plus importante de lalgorithme consiste agrave prendre toutes les informations

fournies par lutilisateur (les points de controcircle ainsi que des options qui deacutefinissent la

courbe comme les deacuteriveacutees agrave certains endroits ou des informations comme la tension qui

laisse lalgorithme calculer lui-mecircme les deacuteriveacutees agrave partir dun indice reacuteel simple) afin de

calculer pour chaque courbe de Beacutezier cubique les deux points de controcircle manquants

En laissant agrave lutilisateur le pouvoir de deacutecider seulement les points ougrave la courbe passe

le travail est simplifieacute mais permet tout de mecircme de terminer avec un ensemble de

courbes de Beacutezier

CHAPITRE IV

THEacuteORIE DES LANGAGES INFORMATIQUES

La creacuteation dun langage de programmation nest pas une mince tacircche Il faut donc

sassurer de le construire sur des bases theacuteoriques solides Nous preacutesenterons ici les

eacuteleacutements theacuteoriques importants de la theacuteorie des langages ainsi que leurs applications

dans le domaine de la compilation Nous preacutesenterons aussi loutil SableCC que nous

avons utiliseacute dans le cadre de notre langage ainsi quun bref exposeacute sur les langages

reacuteflexifs

La theacuteorie des langages est un sujet vaste et extrecircmement complexe Un meacutemoire comshy

plet pourrait ecirctre reacutedigeacute seulement sur les aspects theacuteoriques des automates reacuteguliers

Afin de compresser tout ce contenu dans un seul chapitre les eacuteleacutements seront mentionneacutes

sans preuve Nous recommandons toutefois au lecteur curieux et assidu de consulter les

reacutefeacuterences de ce chapitre pour des preuves et une couverture plus complegravete du sujet

41 Theacuteorie des langages et automates

Dans un premier temps nous devrons deacuteterminer ce quest formellement un langage

Par la suite nous analyserons une structure de donneacutees qui est intimement lieacutee agrave ce

sujet les automates

46

411 Les eacuteleacutements de base dun langage (Aho Sethi et Ullman 1986)

Alphabet et lettre

Un alphabet est un ensemble (au sens matheacutematique du mot) de symboles appeleacutes

lettres Un alphabet est fini et non-vide Par exemple lalphabet latin standard ainsi

que lensemble O I constituent des alphabets

Mot

Un mot dun alphabet A peut ecirctre un des trois cas suivants

- le mot vide euro formeacute daucune lettre

- une lettre de lalphabet A

- Toute suite finie de lettres aOal an ougrave chaque ai fait partie de lalphabet A

Il est agrave noter que les deux premiers sont en fait des cas speacutecifiques du dernier bien quils

sont souvent seacutepareacutes pour raison de clarteacute Dans le dernier cas on dit que les caractegraveres

sont lieacutes par lopeacuteration de concateacutenation

Langage

Un langage au sens le plus geacuteneacuteral possible est un ensemble de mots Celui-ci peut ecirctre

fini ou infini La plupart des exemples inteacuteressants (un langage de programmation par

exemple) est un langage infini En effet il existe une infiniteacute de programmes diffeacuterents

tout comme il existe une infiniteacute de nombres binaires

412 Exp esson reacutegnli r

Les expressions reacuteguliegraveres forment un outil de travail extrecircmement important en inshy

formatique De nombreux outils ainsi que certains langages (grep perl ) leurs sont

consacreacutes

47

On peut reacutesumer les expressions reacuteguliegraveres comme eacutetant une meacutethode afin de deacutecrire

un langage infini par une expression fini On utilisera dans la construction certaines

opeacuterations qui nous donneront des proprieacuteteacutes inteacuteressantes pour le langage final Tout

mot qui peut ecirctre construit agrave partir de ces regravegles fait automatiquement partie du langage

Constantes

Leacuteleacutement de base dune expression reacuteguliegravere est une constante Celle-ci est deacutefinie agrave

partir dune lettre de lalphabet et deacutefinit un seul mot la constante elle-mecircme Par

conseacutequent lexpression reacuteguliegravere a de lalphabet ab repreacutesente le langage a Il est

agrave noter que nous pouvons aussi utiliser le mot vide comme une constante repreacutesentant

lensemble vide

Concateacutenation

Lopeacuteration de concateacutenation est une opeacuteration sur les mots qui permet de creacuteer des

expressions reacuteguliegraveres plus longues agrave partir de deux expressions reacuteguliegraveres valides Le

reacutesultat de lexpression reacuteguliegravere A concateacuteneacutee agrave B est donc nimporte quel mot de A

concateacuteneacute agrave nimporte quel mot de B Par exemple ab est une expression reacuteguliegravere qui

repreacutesente un langage agrave un mot ab

Union

Lunion des expressions reacuteguliegraveres est une opeacuteration qui correspond agrave lunion ensemshy

bliste Lors de lunion de A et de B (deacutefini comme (AIB)) nous pouvons choisir nimshy

porte quel eacuteleacutement de A ou de B comme un mot valide Par exemple (alb)b repreacutesente

le langage contenant deux mots ab bb

Fermeture de Kleene

La fermeture de Kleene est une opeacuteration beaucoup plus inteacuteressante Celle-ci utilise

une expression reacuteguliegravere A Le reacutesultat de la fermeture noteacute A est la concateacutenation

48

dun nombre fini deacuteleacutements de A avec possibiliteacute de reacutepeacutetitions Par exemples pour

ab toute chaicircne de a finie possiblement de longueur zeacutero suivie dun b fait partie du

langage Lexpression reacuteguliegravere (alb) repreacutesente nimporte quelle chaicircne finie de a ou de

b

Les langages que nous pouvons geacuteneacuterer avec des expressions reacuteguliegraveres sont assez riches

bien quinsuffisants pour geacuteneacuterer un langage de programmation (Aho Sethi et Ullman

1986)

413 Automates

Avant de pouvoir expliquer agrave quoi servent les expressions reacuteguliegraveres nous devons discuter

des automates une structure dune importance cruciale en informatique

Automate fini

yn automate fini (Ullman Hopcroft et Motwani 1~79) est un quintuplet composeacute de

cinq eacuteleacutements

- Un ensemble fini deacutetats E

- Un alphabet fini A

- Un ou plusieurs eacutetats de deacutepart d (selon que lautomate est deacuteterministe ou non)

- Un ensemble deacutetats dit finaux F

- Une relation de transition T ccedil E x A x E Cela deacutefinit une maniegravere de passer dun

eacutetat agrave un autre lors de lapparition dun symbole speacutecifique

On repreacutesente en geacuteneacuteral un automate par un graphe avec des flegraveches nommeacutees Les

flegraveches repreacutesentent la relation de transition alors que les sommets repreacutesentent les

eacutetats dans E On repreacutesente un eacutetat initial par une flegraveche qui ne part pas dun eacutetat

Finalement on repreacutesente un eacutetat final par un cercle double Par exemple lautomate

suivant accepte lensemble des mots qui sont composeacutes dune seacuterie de a (possiblement

nulle) suivi dun b Donc les mots b ab et aab serait des mots valides par rapport agrave

49

cet automate

Figure 41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b

Lensemble T peut prendre plusieurs formes en fonction du deacuteterminisme de lautomate

comme nous allons maintenant le voir

Automate non-deacuteterministe

Un automate non-deacuteterministe peut posseacuteder plusieurs eacutetats de deacutepart De plus son

ensemble de transitions T est quelconque Il peut donc exister pour un eacutetat e et un

symbole a plusieurs eacutetats e tels que (e a e) E T

Un automate non-deacuteterministe peut ecirctre vu comme une forme de graphe dans lequel on

peut se promener en utilisant certaines transitions La suite des symboles des transitions

que nous utilisons forment un mot Lensemble des mots obtenus par une suite de transhy

sitions allant dun eacutetat initial agrave un eacutetat final constitue le langage de lautomate Dans

un automate non-deacuteterministe il peut neacuteanmoins exister pour le mecircme mot plusieurs

chemins diffeacuterents deacutebutant dans un eacutetat initial Il est important de noter quun mot

est accepteacute degraves quun de ces chemins se termine dans un eacutetat final

Automate deacuteterministe

Un automate non-deacuteterministe nous permet de creacuteer des langages mais le fait davoir

plus dun choix pour le mecircme symbole peut sembler inquieacutetant surtout lorsquil sagit

dinformatique Nous pouvons donc deacutefinir un automate deacuteterministe plus simple Celuishy

50

ci possegravede un seul eacutetat de deacutepart et son ensemble de transitions T assure que pour

chaque symbole il ny a quun seul eacutetat suivant possible Il ny a donc pour chaque mot

quun seul chemin possible agrave partir de leacutetat initial Plus formellement lautomate sera

deacuteterministe si pour tout e E E et a E A il y a un seul e E E tel que (e a e) ET

Le reacuteflexe naturel serait de croire quen enlevant le non-deacuteterminisme dun automate

celui-ci devient beaucoup moins puissant permettant de repreacutesenter beaucoup moins

de langages Or il nen est rien Il a eacuteteacute prouveacute (malheureusement en trop de pages

pour ce meacutemoire) que nimporte quel automate non-deacuteterministe peut ecirctre rameneacute agrave

un automate deacuteterministe quitte agrave voir le nombre deacutetats de lautomate augmenter

exponentiellement Nous pouvons donc toujours creacuteer un automate non-deacuteterministe et

laisser la tacircche agrave un ordinateur de creacuteer un automate deacuteterministe agrave partir de celui-ci

(Ullman Hopcroft et Motwani 1979)

Exeacutecution dun automate et contraintes temporelles

La meacutethode dexeacutecution dun automate deacuteterministe est assez simple Nous lui fournisshy

sons un mot dune certaine longueur disons n Nous deacutemarrons de leacutetat initial et chaque

lettre repreacutesente un choix agrave faire dans lautomate Comme lautomate est deacuteterministe

il ny a quune possibiliteacute agrave explorer Si nous ne pouvons plus avancer avant la fin du

mot celui-ci ne fait pas partie du langage de lautomate Si nous parvenons agrave avancer

jusquau bout et que nous ne sommes pas dans un eacutetat final il nen fait pas partie non

plus Par contre si leacutetat est final nous avons trouveacute un mot du langage Co me le mot

possegravede n lettres nous aurons au maximum n choix agrave faire rendant lalgorithme dapshy

partenance agrave un temps dexeacutecution lineacuteaire Un algorithme lineacuteaire est naturellement

extrecircmement inteacuteressant en informatique car nous voulons un programme qui sexeacutecute

dans un temps raisonnable

51

414 Lien entre langage reacutegulier et automate fini

Nous connaissons donc maintenant deux meacutethodes pour creacuteer un langage Les expresshy

sions reacuteguliegraveres ainsi que les automates Un automate est difficile agrave concevoir pour un

ecirctre humain mais extrecircmement rapide dutilisation par un ordinateur Une expression

reacuteguliegravere est complexe pour un ordinateur mais aiseacutee agrave concevoir par un ecirctre humain Il

nous faut donc voir si nous pouvons obtenir des proprieacuteteacutes communes agrave ces deux outils

Le lien

Il existe en effet un lien qui unit ces deux structures Celui-ci est extrecircmement fort

lensemble des langages quil est possible de geacuteneacuterer avec des expressions reacuteguliegraveres est

exactement le mecircme ensemble que ceux qui peuvent ecirctre geacuteneacutereacutes par un automate fini

deacuteterministe Cela implique que pour chaque expression reacuteguliegravere nous pouvons troushy

ver un automate qui repreacutesente le mecircme langage Cela est vrai aussi en sens inverse

Par contre il ne sagit pas dune bijection car plusieurs expressions reacuteguliegraveres peuvent

correspondre au mecircme automate (par exemple a et aamiddot) Il existe un algorithme permetshy

tant de transformer une expression reacuteguliegravere en automate mais celui-ci est complexe et

deacutepasse le cadre de ce meacutemoire Nous pouvons toutefois mentionner que cet algorithme

est relativement lent (sexeacutecute en O(2m ) ou m est la longueur de lexpression reacuteguliegravere)

mais permet par la suite de trouver si un mot fait partie dun langage en temps lineacuteaire

(McNaughton et Yamada 1960)

Importance dun tel lien

Ce lien est un eacuteleacutement crucial dans la capaciteacute dun ordinateur agrave travailler avec des lanshy

gages de programmation En effet cela permet aux creacuteateurs de langages de deacutecrire des

mots agrave partir dexpressions reacuteguliegraveres (quils comprennent) et de laisser un programme

creacuteer des automates qui peuvent reconnaicirctre ces symboles (un if ou un for mais aussi

des variables) dans des programmes Cela permet donc de creacuteer une partie importante

dun langage quon appelle lanalyse lexicale Cela permet agrave partir de lutilisation de

52

lautomate creacuteeacute par des expressions reacuteguliegraveres de transformer un texte en une suite de

symboles plus speacutecifiques Par exemple le texte

if a 1 then true else faIse

pourrait ecirctre traduit par la suite de symboles suivants

IF VAR EQ NUM THEN BD DL ELSE BDDL FININSTR

Cette eacutetape lanalyse lexicale est cruciale agrave la suite de lanalyse dun programme Les

automates nous sont toutefois utiles non seulement pour les mots cleacutes mais aussi pour

des eacuteleacutements plus complexes comme des variables Une variable est souvent identifieacutee

comme eacutetant une lettre suivie dune suite de caractegraveres quelconques (sauf exception tel

quun espace)

Malgreacute tout il existe certains eacuteleacutements quun automate ne peut reconnaicirctre Un exemple

classique est le parentheacutesage eacutequilibreacute (une suite de parenthegraveses telle que c~aque pashy

renthegravese ouvrante est associeacute agrave une parenthegravese fermante et agrave nimporte quel moment il

nexiste pas plus de fermantes que douvrantes) Il est en effet impossible aux automates

de faire le lien entre les deux types de parenthegraveses (Ullman Hopcroft et Motwani 1979)

Pour cela il nous faudra utiliser des structures plus complexes

42 Grammaires

Ces structures sont les grammaires Il est possible de les voir comme eacutetant une forme

beaucoup plus geacuteneacuterale des expressions reacuteguliegraveres Avec cette structure nous pourrons

nous assurer quun programme est bien formeacute cest-agrave-dire creacuteer un arbre repreacutesentant

la structure dun programme un peu comme la structure dune phrase

421 Deacutefinition dune grammaire formelle

Une grammaire est constitueacutee de quatre eacuteleacutements

53

- Un ensemble fini de terminaux Ceux-ci sont des symboles repreacutesentant les lettres

dun langage Par conseacutequent on peut aussi appeler les terminaux lalphabet dune

grammaire

- Un ensemble fini de non-terminaux Habituellement repreacutesenteacute par des majuscules

(par des symboles diffeacuterents des terminaux) pour des raisons de clarteacute ceux-ci repreacuteshy

sentent des eacutetats intermeacutediaires de la grammaire

- Un non-terminal de deacutepart parmi lensemble deacutecrit plus haut

- Un ensemble de regravegles de production Celles-ci vont varier selon la cateacutegorie de langage

choisie mais de maniegravere geacuteneacuterale une regravegle de production est une paire ordonneacutee

dont chaque eacuteleacutement est composeacute dune suite de terminaux et de non-terminaux (par

exemple aB -t aAa)

Le fait de repreacutesenter une regravegle de production avec une flegraveche permet den expliciter le

rocircle transformer une suite de caractegraveres en une autre Lutilisation dune grammaire

consiste donc agrave deacutemarrer avec le non-terminal de deacutepart puis dappliquer une suite de

regravegles de production pour modifier le non-termina Lorsquon obtient un mot formeacute

uniquement de terminaux il sagit dun mot du langage repreacutesenteacute par la grammaire

Par exemple

S -gt aA

A -gt b

repreacutesente un langage contenant le seul mot ab On applique doEn effet unc un proceacutedeacute

de deacuterivation (en appliquant chaque regravegle) Par exemple une deacuterivation possible du mot

ab dans ce contexte (la seule dailleurs) est la suite suivante

S (deacutepart)

S -gt aA (application de S -gt aA)

aA -gt ab (application de A -gt b)

54

422 Hieacuterarchie de Chomsky

La deacutefinition que nOlis avons donneacutee preacuteceacutedemment dun langage est beaucoup trop

geacuteneacuterale pour nous fournir des proprieacuteteacutes inteacuteressantes Afin de deacutegager des proprieacuteteacutes

inteacuteressantes nous deacutefinissons plusieurs cateacutegories Plusieurs noms sont utiliseacutes pour

chaque cateacutegorie mais nous nous limiterons agrave utiliser ceux deacutefinis par le linguiste Noam

Chomsky (Chomsky 1956) Chacune de ces cateacutegories sera deacutecrite par les proprieacuteteacutes de

sa grammaire Il est agrave noter que nous avons neacutegligeacute certaines cateacutegories de langages qui

ne sont pas lieacutees au domaine

Langage reacutegulier

Un langage reacutegulier est eacutequivalent aux expressions reacuteguliegraveres Les regravegles de production

de la grammaire doivent ecirctre de la forme

A -) Ba

A -) a

ou

A -) aB

A -) a

avec A et B des non-terminaux et a un termina Il est agrave noter que toutes les regravegles

dune grammaire doivent ecirctre soit du premier cas soit du deuxiegraveme cas On les appelle

reacutecursives agrave gauche ou agrave droite respectivement

Langage non-contextuel

Un langage non-contextuel est un peu plus complexe quun langage reacutegulier Les regravegles

de production de la grammaire doivent ecirctre de la forme

55

A -) B

avec A un non-terminal et B une suite de terminaux et de non-terminaux Le deacutetail

le plus important est de noter que les langages non-contextuels permettent de creacuteer un

systegraveme de parenthegraveses eacutequilibreacutees En effet voici une grammaire qui accepte seulement

un parentheacutesage eacutequilibreacute

P -) pp

P -) CP)

P -)

Il est eacutevident quune grammaire reacuteguliegravere ne peut geacuteneacuterer ce genre de langage Par contre

un parentheacutesage eacutequilibreacute est extrecircmement important dans le domaine de la compilashy

tion afin dexprimer clairement les ideacutees dun programmeur et plus speacutecifiquement

permettre deacutecrire des formules matheacutematiques complexes compreacutehensibles par lOlmiddotdishy

nateur

Langage contextuel

Les langages contextuels ne sont pas utiliseacutes en geacuteneacuteral en compilation car ils sont

beaucoup plus lents Les regravegles de production de la grammaire doivent ecirctre de la forme

ABC -) ADC

ougrave B est un non-terminal A et C sont des non-terminaux ou le mot vide et D est un

non-terminal (mais pas le mot vide) On voit clairement ici dougrave vient le nom de ce type

de langage B est transformeacute en fonction de ce qui est autour de lui (son contexte)

423 Utiliteacute dans les langages de programmation

La prochaine tacircche dans la creacuteation dun langage est danalyser la structure de notre

programme Pour effectuer cette tacircche nous pouvons utiliser une grammaire non-conshy

56

textuelle Agrave cette fin nous pouvons nous assurer que les eacutequations sont correctement

formeacutees que les instructions sont valides etc

Dans un autre ordre dideacutee la hieacuterarchie de Chomsky possegravede aussi des liens avec les

machines de Turing qui sont elles-mecircmes intimement lieacutees agrave la theacuteorie de la complexiteacute

(Davis Sigal et Weyuker 1994) Ce domaine est extrecircmement vaste et le lecteur pourra

trouver dans les reacutefeacuterences plusieurs excellents ouvrages pour sinitier agrave ce domaine (Dhu

et Ko 2000)

43 SableCC

Bien quil est tregraves inteacuteressant deacutetudier les algorithmes de compilation limpleacutementation

de chacun de ces algorithmes deacutepasse largement le cadre de ce meacutemoire Il nous faut

donc trouver une meacutethode afin de creacuteer notre langage de programmation Plusieurs

outils soffrent agrave nous mais notre choix sarrecirctera sur SableCC

431 Quest-ce que S~bleCC

SabieCC est ce quon appelle un compilateur de compilateurs (Gagnon 1998) Un comshy

pilateur de compilateurs est un programme qui permet agrave partir dune deacutefinition absshy

traite dun langage de programmation dobtenir un compilateur pour ce langage Plus

speacutecifiquement le programme reacutesultant nous permettra dobtenir larbre syntaxique

dun programme ce qui nous permettra de lanalyser reacutecursivement et de lexeacutecuter (ou

bien de le transformer dans un langage diffeacuterent selon le cas) Les formes abstraites que

requiert un compilateur de compilateurs sont justement les expressions reacuteguliegraveres (pour

deacutecouvrir les symboles) et les grammaires non-contextuelles (pour lanalyse syntaxique

des symboles obtenus preacuteceacutedemment)

432 Avantages de SableCC

Bien que SabieCC nest pas le compilateur de compilateurs le plus connu il possegravede

plusieurs aspects inteacuteressants Premiegraverement comparativement agrave ses compeacutetiteurs plus

57

acircgeacutes SabieCC est eacutecrit dans un paradigme orienteacute-objet Cela rend le compilateur beaushy

coup plus simple agrave utiliser De plus le logiciel geacutenegravere automatiquement un ensemble de

classes (dans un choix de plusieurs langages) qui permet de traiter aiseacutement et claishy

rement avec des concepts modernes les arbres syntaxiques reacutesultant de lanalyse du

programme

44 Langage reacuteflexif

Finalement une fois que nous avons obtenu un arbre syntaxique et que nous savons que

notre langage est bien formeacute il nous reste la reacuteflexiviteacute agrave prendre en compte En effet

nous ne voulons pas reacuteeacutecrire inutilement dans notre langage chaque fonction qui existe

deacutejagrave en Java Nous pourrons les utiliser avec un langage reacuteflexif Une autre possibiliteacute

dun langage reacuteflexif est de deacuteleacuteguer agrave SDDL la creacuteation de classes Cela permet agrave lutilishy

sateur de reacutefeacuterencer nimporte quelle classe Java sans avoir agrave changer le code de SDDL

lui-mecircme Cela serait impossible sans un langage reacuteflexif

441 Deacutefinition dun langage reacuteflexif

Un langage reacuteflexif (Sobel et Friedman 1996) est un langage qui est capable soit de

- Examiner son eacutetat cette proprieacuteteacute est appeleacutee introspection

- Modifier son eacutetat cette proprieacuteteacute est appeleacutee intercession

Lintrospection permet agrave un langage de connaicirctre entre autres les classes quil utilise

ainsi que les meacutethodes et les paramegravetres Lintercession beaucoup plus puissante pershy

mettrait par exemple cie rajouter modifier ou supprimer des classes etou meacutethodes

Pour nos besoins nous sommes naturellement inteacuteresseacutes par lintercession

442 Avantages

Lavantage le plus clair de lutilisation de la reacuteflexiviteacute est la reacuteutilisation du code En

effet toutes les fonctionnaliteacutes du langage infeacuterieur (Java dans ce cas-ci) peuvent ecirctre

58

automatiquement passeacutees au langage supeacuterieur Cela eacutevite davoir agrave reacuteeacutecrire du code

pour chaque nouvel eacuteleacutement agrave ajouter

Un autre avantage assez explicite est de permettre agrave des utilisateurs un peu plus aguerri

de lier du code des deux niveaux de langage ensemble En effet si un utilisateur creacutee

une structure de donneacutees en Java il peut toujours se servir exactement de la mecircme

classe dans le langage supeacuterieur sans avoir agrave faire la moindre modification au langage

supeacuterieur lui-mecircme Il est donc clair quun langage qui utilise la reacuteflexiviteacute peut devenir

tregraves puissant

443 Deacutesavantages

Certains deacutesavantages accompagnent aussi la reacuteflexiviteacute Un des plus importants est la

contrainte de seacutecuriteacute En effet si un utilisateur peut appeler nimporte quelle classe

Java agrave partir du langage supeacuterieur il peut tregraves aiseacutement appeler des fonctions qui cassent

le programme si un controcircle suffisamment important nest pas effectueacute par le logiciel Il

peut aussi sans causer d~s problegravem_es de seacutec~riteacute confondre un usager en provoquant

des effets de bord sur leacutetat du logiciel cest-agrave-dire modifier des proprieacuteteacutes du reste du

programme sans neacutecessairement que cela paraisse

Un autre deacutesavantage eacutevident est quun utilisateur qui souhaite utilicirc3er les fonctions du

langage infeacuterieur doit en quelque sorte connaicirctre celui-ci Cela implique donc lapprenshy

tissage dun deuxiegraveme langage ce qui en soit peut paraicirctre trop pour des utilisateurs

plus traditionnels

Lorsquon analyse froidement les avantages et les inconveacutenients on voit que les avanshy

tages sont beaucoup plus importants En effet le projet eacutetant limiteacute dans le temps et

dans le personnel il est en quelque sorte impossible de fournir des librairies de foncshy

tions suffisamment complegravetes pour les utilisateurs Se brancher sur les librairies Java

fournit automatiquement tout ce dont nous avons besoin et donne accegraves agrave une quantiteacute

innombrable de projets deacutejagrave creacuteeacutes dans ce langage

CHAPITRE V

MISE EN OEUVRE DE LA SOLUTION

Maintenant que nous avons des bases theacuteoriques solides ainsi quune hieacuterarchie bien

adapteacutee agrave nos besoins nous pouyons commencer agrave impleacutementer notre solution Cela

implique premiegraverement la creacuteation de notre hieacuterarchie objet en Java Deuxiegravemement

nous devons impleacutementer une grammaire afin de deacutecrire SDDL Finalement il faut

ajouter du code afin dimpleacutementer certaines proprieacuteteacutes voulues pour notre langage Il

est agrave noter que nous avons inclus en annexe un diagramme de notre hieacuterarchie ainsi que

la grammaire complegravete de SDDL

51 Eacuteleacutements de langage en SDDL

511 Impleacutementation de la hieacuterarchie

Limpleacutementation de la hieacuterarchie eacutetant seacutepareacutee du reste du langage il est normal de

commencer avec celle-ci eacutetant donneacute quelle repreacutesente le module le plus important de

notre projet Cela nous permet de le tester au fur et agrave mesure avant de commencer agrave

creacuteer un langage de plus haut niveau qui lutilise

Un des problegravemes les plus importants du deacuteveloppement de la hieacuterarchie fut de deacuteveshy

lopper correctement la deacutefinition et laccegraves agrave des points speacutecifiques de certains objets

Comme lideacutee eacutetait de permettre dobtenir une quantiteacute essentiellement illimiteacutee de

points diffeacuterents il fallait une meacutethode robuste et efficace

60

Notre meacutethode implique de fournir des informations par rapport au dessin englobant agrave

chaque sous-dessin Cela est requis car un objet preacutesent agrave plusieurs endroits diffeacuterents

auquel on demande un point speacutecifique se bute agrave une ambiguiumlteacute Mecircme en utilisant

seulement un Drawing qui est techniquement une instance unique dune forme il faut

faire attention En effet si on a un Drawing dun cercle qui est agrave linteacuterieur dune

ellipse par exemple nous pourrions deacutecider de placer cette ellipse agrave plusieurs endroits

Nous aurions donc le mecircme problegraveme dambiguiumlteacute du positionnement des points Afin

de remeacutedier agrave ce problegraveme nous avons fourni au Drawing sa position agrave linteacuterieur du

diagramme Lorsquil est copieacute nous navons quagrave changer linformation pour que le

positionnement soit correct

512 Grammaire

Le deacuteveloppement de la grammaire fut naturellement une section cruciale du deacutevelopshy

pement de SDDL Comme nous avions deacutejagrave deacuteveloppeacute des objectifs speacutecifiques pour la

forme du langage la creacuteation fut relativement directe Quelques eacuteleacutements importants

ont toutefois ducirc ecirctre ajouteacutes en cours de route En particulier des eacuteleacutements seacuteparateurs

ont eacuteteacute dune importance cruciale Il aurait donc pu ecirctre souhaitable de diminuer la

verbositeacute en enlevant des parenthegraveses ou des virgules mais cela cause (dans la plupart

des cas) des problegravemes au niveau de lambiguiumlteacute de la grammaire (tel que nous lavons

vu preacuteceacutedemment)

Nous avons aussi deacutecideacute de deacutecreacuteter quune expression geacuteneacuterale est une instruction Cela

peut sembler contre-intuitif car une expression (comme 2 + 2) ne semble pas ecirctre une

instruction La raison derriegravere ce changement est le dessin de chemin En effet nous

pouvons deacuteterminer un chemin (Path) comme nimporte quel autre objet Par contre

cela implique de lajouter par la suite seacutepareacutement agrave un canevas Cela semble contreshy

intuitif nous voyons souvent les liens entre les objets comme eacutetant des liens de niveau

supeacuterieur (bref faits dans le canevas principal) Pour lier a et b il semble plus logique

deacutecrire

61

a--b

que

lien = a--b

put lien in main

Afin de reacutegler ce problegraveme nous avons deacutecideacute de laisser les expressions ecirctre des insshy

tructions Cela fait que deacutefinir une ligne (comme a--b) devient automatiquement une

instruction valide Celle-ci sera traiteacutee comme un cas speacutecial afin decirctre placeacutee direcshy

tement au centre du canevas principal Cela implique aussi comme nous le verrons

plus tard de rajouter du code afin de sassurer que les expressions qui ne sont pas des

instructions soient refuseacutees par le programme

stm = exp exp sc 1 assign id assign exp sc 1 while while_kwd exp do_kwd (stms] stm end_kwd sc 1 if if_kwd exp then_kwd (stms] stm else_part end_kwd sc 1 for for_kwd id from~kwd (low_bound] exp to_kwd (up_bound] exp

do_kwd (stms] stm end_kwd sc 1 return return_kwd exp sc

Figure 51 Extrait de la grammaire de SDDL pour une instruction

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage

Plusieurs proprieacuteteacutes de SDDL ne venaient pas directement avec la grammaire Celles-ci

ont neacutecessiteacute un traitement bien particulier en fonction de la proprieacuteteacute rechercheacutee

Typage

La grammaire de SDDL indique clairement que le langage est agrave typage dynamique eacutetant

donneacute que les creacuteations de variables ne permettent pas de donner un type Le mecircme

62

pheacutenomegravene est preacutesent dans la deacutefinition des fonctions Par contre le fait de souhaiter

un typage dynamique implique lajout dune large section de code deacutedieacutee agrave la veacuterification

de type Chaque opeacuteration ne peut ecirctre appliqueacutee quagrave certains types deacuteleacutements et donc

avant deffectuer lopeacuteration il faut veacuterifier si le type est valide

Eacuteleacutements objets

Impleacutementer tous les principes dun langage orienteacute-objet est un travail de longue hashy

leine Par contre eacutetant donneacute que notre objectif eacutetait de simplifier le langage de desshy

cription final nous avons deacutecideacute de ne pas permettre la creacuteation de nouvelles classes

agrave linteacuterieur de SDDL Cela implique que nous pouvons releacuteguer la creacuteation de classes

uniquement au langage Java Cela a donc grandement faciliteacute la tacircche car nous navions

pas besoin dimpleacutementer la tregraves grande majoriteacute des concepts objets que nous laquo emshy

pruntons raquo agrave Java

Eacutelimination de la verbositeacute

Une bonne partie de leacutelimination de la verbositeacute vient de la conception mecircme du lanshy

gage En effet le fait de releacuteguer la deacutefinition des classes agrave Java ainsi que de creacuteer le

typage dynamique ont purement par choix eacutelimineacute une bonne partie de la verbositeacute

Quelques eacuteleacutements suppleacutementaires ont permis deacuteliminer un excegraves de verbositeacute On

note entre autres le fait de deacutefinir la description du diagramme sans le speacutecifier dans le

cadre dune fonction Un autre pheacutenomegravene important est davoir deacutecideacute de promouvoir

les points et certaines fonctions relieacutees agrave leacutetat de primitive naturelle du langage En

effet une addition entre un point a et b seffectue

c = a + b

au lieu de en Java

AbstractPoint c aadd(b)

63

Cela peut sembler comme un maigre gain mais lorsquappliqueacute agrave un calcul complexe

impliquant des points (par exemple le calcul dune combinaison lineacuteaire) les gains

combineacutes rendent le code extrecircmement clair

AbstractPoint c = amultiply(1030)add(bmultiply(2030))

c = (a 30 + 20 b 30)

Figure 52 Code Java et SDDL pour calculer une combinaison lineacuteaire

52 Reacutealisation en Java

Afin de reacutealiser SDDL il a bien sucircr fallu eacutecrire une grammaire mais beaucoup de code

autour sert agrave inteacutegrer la grammaire au restant des fonctionnaliteacutes de notre hieacuterarchie

Ce code fut complegravetement eacutecrit en Java et remplit plusieurs fonctions

521 Traverseacutee de larbre grammatical et exeacutecution

La grande majoriteacute du code Java suppleacutementaire eacutecrit a servi agrave permettre la traverseacutee

de larbre grammatical creacuteeacute par notre grammaire Cette traverseacutee permet en quelque

sorte lexeacutecution du code SDDL et est donc cruciale Pour la plupart il sagit dune trashy

verseacutee en profondeur relativement classique Quelques petits deacutetails retiennent toutefois

lattention

- Certains morceaux de code ne doivent pas ecirctre exeacutecuteacutes et ont donc un comportement

speacutecial Cest le cas des deacutefinitions de fonctions qui ne sont exeacutecuteacutees quagrave lappel On

meacutemorise donc en quelque sorte une partie de larbre grammatical et lors dun appel

on transfegravere le controcircle dexeacutecution agrave cette partie Eacutevidemment lors de la lecture de

la deacutefinition de la fonction il faut stocker quelques informations sur nos fonctions

dans une structure deacutefinie agrave cet effet (un Methodlnf0)

- Certaines opeacuterations ont plusieurs sens distincts qui ne peuvent ecirctre speacutecifieacutes dans la

grammaire La seacutemantique dune telle opeacuteration napparaicirct clairement quau moment

de la lecture de lopeacuteration (dans notre cas agrave lexeacutecut ion) Un exemple serait le

64

symbole daddition Bien que sa grammaire soit tregraves claire il peut sagir dune addition

de nombres mais aussi dune addition de points ou dune concateacutenation de chaicircnes

de caractegraveres Il est donc neacutecessaire agrave lexeacutecution de veacuterifier la classe de chaque objet

requis par lopeacuteration afin de trouver la bonne seacutemantique pour lopeacuteration si une

telle seacutemantique existe Si aucune nest trouveacutee on peut alors soulever une erreur

selon le meacutecanisme standard (par exemple additionner un point et une chaicircne de

caractegraveres)

- Certaines expressions grammaticalement correctes ne sont valides que sous certaines

conditions Par exemple nimporte quelle expression (exp) est accepteacutee comme eacutetant

une instruction (stm) grammaticalement valide Par exemple linstruction 2 + 2 va

ecirctre accepteacutee par la grammaire Par contre elle na pas de sens car elle naccomplit rien

du tout Il faut donc sassurer de veacuterifier dans la traverseacutee que lexeacutecution est leacutegale

Dans ce cas-ci il faut sassurer que lexpression de niveau supeacuterieur (une addition)

est valide pour ecirctre une instruction Dans un tel cas une erreur serait souleveacutee encore

selon le meacutecanisme standard

522 Deacutefinition dobjets quelconques

Une partie moins grande du code est consacreacutee agrave linteacutegration de la hieacuterarchie de SDDL

dans la deacutefinition du langage Comme nous souhaitions utiliser des classes quelconques

nous avons utiliseacute la reacuteflexiviteacute Java telle que nous le deacutecrivions plus tocirct Cela implique

de reacutecupeacuterer les noms des fonctions et des classes lors de leurs utilisations Toutes les

veacuterifications seffectuent agrave lexeacutecution Nous savons donc seulement si une classe A existe

bel et bien lorsque nous essayons de creacuteer un objet agrave partir de celle-ci De plus chaque

fonction appeleacutee sur un objet de classe A nest veacuterifieacutee que lors de son utilisation

Habituellement la solution aurait eacuteteacute de veacuterifier avant lexeacutecution lexistence de chaque

classe ainsi que les fonctions de chaque classe pour sassurer que lexeacutecution soit correcte

Dans notre cas la veacuterification agrave lexeacutecution est suffisante car les programmes sont tregraves

courts

De plus quelques contraintes ont ducirc ecirctre ajouteacutees afin de sassurer Clue seules les parties

65

Override public void caseADrawingTermCADrawingTerm node)

String className = nodegetClassName() getText()

try

thiscurrentExpressionClass ClassforName(sddlhierarchy + className)

thiscurrentExpressionValue = thiscurrentExpressionClassgetConstructor() newlnstance()

catch(NoSuchMethodException e)

throw new InterpreterException( cl ass Il + className + is ill-defined (no base constructor) nodegetClassName())

catch(Exception e)

throw new InterpreterException(unable to load + className +

Il class (maybe it does not exist) nodegetClassName())

Figure 53 Code reacuteflexif pour creacuteer une forme quelconque

requises de Java sont exposeacutees agrave lutilisateur final La restriction principale est de ne

creacuteer que des objets qui font partie du paquet sddl hierarchy Il est toutefois agrave

noter que cela nisole pas totalement le reste de Java car il est tout agrave fait possible de

creacuteer une classe qui permet dacceacuteder agrave Java complegravetement

523 Gestion des erreurs

La gestion des erreurs seffectue au travers des meacutecanismes deacutejagrave mis en place par Java

cest-agrave-dire les exceptions Une classe speacutecifique aux exceptions de linterpreacuteteur a eacuteteacute

creacuteeacutee qui permet de speacutecifier non seulement un message mais aussi un noeud bien

speacutecifique dans larbre grammatical afin didentifier lendroit ougrave lerreur a eacuteteacute deacutecouverte

66

Cela est extrecircmement utile afin de permettre agrave lutilisateur de corriger la majoriteacute de

ses erreurs

De plus une partie du code de gestion derreurs sert agrave repreacutesenter la pile dexeacutecution

En effet afin didentifier la source dun problegraveme il est important de pouvoir savoir

quelles fonctions sont impliqueacutees Nous pouvons donc identifier la ligne de chaque appel

au moment ougrave lerreur sest produite et ainsi identifier des problegravemes entre autres dans

le cas des fonctions reacutecursives

524 Structures de support

Dimportances mineures la plupart de ces structures servent agrave geacuterer lexeacutecution des

meacutethodes

- La classe Frame repreacutesente le cadre dexeacutecution dune fonction Cette classe permet

dobtenir des fonctions reacutecursives car on peut imbriquer un Frame dans un autre

- La classe Methodlnfo repreacutesente une fonction deacutefinie agrave linteacuterieur de SDDL Elle

permet de transfeacuterer lexeacutecution agrave la deacutefinition fournie par lutilisateur et regroupe

les informations geacuteneacuteralement utiles agrave la veacuterification seacutemantique (nom paramegravetres

etc)

- La classe PrimitiveMethodlnfo repreacutesente une fonction de Java accessible par la

reacuteflexiviteacute Elle fournit aussi quelques informations pour la veacuterification seacutemantique

- La classe MethodTable fournit une table pour geacuterer lensemble des fonctions afin

dacceacuteder directement agrave une fonction agrave partir de son nom

53 Accegraves agrave Postscript PDP et B-1EX

531 Postscript

Afin de reacutealiser correctement notre langage nous avions besoin dacceacuteder agrave diffeacuterentes

technologies Eacutetant donneacute que nous voulons terminer avec des dessins en format Postshy

script il devient important de pouvoir fournir aiseacutement du code dans ce format Il

67

sagit toutefois dun format relativement complexe et il devient donc long et complexe

de fournir une traduction valide pour chacun de nos diffeacuterents concepts

Le problegraveme principal de Postscript est quil possegravede un ensemble de primitives de tregraves

bas niveau En effet afin de dessiner une courbe la seule meacutethode possible est lutishy

lisation de courbes de Beacutezier avec des points de controcircle qui doivent ecirctre fournis agrave

lavance Comme nous lavons vu preacuteceacutedemment les courbes de Beacutezier sont tregraves prashy

tiques pour lordinateur mais peu pratique pour [utilisateur car la speacutecification de

points de controcircles qui ne sont pas interpoleacutes est peu intuitive De plus afin de faire

des courbes quelconques il faut les seacuteparer en plusieurs courbes de Beacutezier de tailles

infeacuterieures

Il existe des algorithmes qui permettent de prendre des courbes et de les seacuteparer en

sections adeacutequates Un de ces algorithmes est impleacutementeacute en Asymptote (Bowman

2007) Il est donc naturel afin deacuteviter davoir agrave reacuteimpleacutementer un algorithme aussi

complexe dutiliser Asymptote pour obtenir nos courbes de faccedilon systeacutematique

532 PDF

Le format PDF possegravede lavantage dinteacutegrer plusieurs fonctions multimeacutedias telles que

les liens les videacuteos les formulaires (Adobe Systems Incorporated 2006) etc Malgreacute

tout PDF outre les quelques ajouts nommeacutes ci-haut est essentiellement similaire agrave

Postscript Eacutevidemment les nombreuses possibiliteacutes fournies par le format PDF sont

deacutesirables (inteacutegrer des videacuteos agrave des notes de cours par exemple) Il existe toutefois

de nombreux convertisseurs qui peuvent prendre un fichier Postscript et le mettre au

format PDF Par contre cette conversion ne permet pas dajouter les fonctionnaliteacutes

PDF qui nous inteacuteressent Il devient donc crucial dobtenir une meacutethode pour fournir

des images directement au format PDF Encore lagrave le fait de passer par Asymptote

nous donne une solution rapide et eacuteleacutegante car le fait de fournir du PDF est inclus

dans le logiciel En geacuteneacuterant directement du Asymptote nous pourrions donc obtenir

automatiquement le format rechercheacute

68

533 ~1lE)C

Leacuteleacutement le plus crucial du langage que nous recherchions au deacutebut eacutetait de pouvoir

utiliser du texte tel que mis en forme par UTEX dans nos diagrammes Un tel besoin

implique plusieurs problegravemes

Premiegraverement un texte UTEX est conserveacute sous la forme dune chaicircne de caractegraveres

standard Par contre apregraves avoir eacuteteacute traiteacute le reacutesultat obtenu est une boicircte contenant

le texte mis en forme La taille de cette boicircte est deacutetermineacutee lors de la mise en page

et ne peut donc pas ecirctre deacutetermineacutee directement par notre programme Or si nous ne

connaissons pas la taille exacte de notre boicircte de texte il est impossible de positionner

un texte par une position autre que son coin supeacuterieur gauche Cela est un comportement

peu inteacuteressant eacutetant donneacute que dans de nombreux graphes on place le texte au centre

dun sommet (donc par exemple le centre de la boicircte sera placeacute au centre dune ellipse)

Afin de pallier agrave ce problegraveme il faudrait demander agrave UTEX de creacuteer les boicirctes une

premiegravere fois et de nous fournir les tailles des boicirctes Par la suite il faudrait geacuteneacuterer

une page UTEX de la bonne taille avec nos dessins puis dire agrave UIEX de geacuteneacuterer les

boicirctes de textes aux endroits que nous aurons calculeacute entre temps Bien que viable

cette meacutethode implique beaucoup de code et de cas diffeacuterents (laccegraves agrave IbIEX par un

programme externe va varier dun systegraveme dexploitation agrave lautre entre autres) Eacutetant

donneacute quAsymptote fournit deacutejagrave un accegraves agrave I5IEX agrave linteacuterieur du logiciel le travail

requis pour lutilisation de I5TEX est de beaucoup diminueacute

534 Geacuteneacuteration du code Asymptote

Afin davoir une solution valide il ne reste donc pl s quagrave nnecter not e so ution agrave

Asymptote Pour le faire nous devons premiegraverement geacuteneacuterer un fichier de code Asympshy

tote valide pour par la suite le faire valider en appelant le programme de maniegravere

externe Eacutetant donneacute que le projet a eacuteteacute eacutecrit speacutecifiquement pour fournir du code

Asymptote une solution simple a eacuteteacute utiliseacutee afin deacutecrire le code le canevas principal

69

public void draw(AbstractPoint location PrintWriter out)

AbstractPoint pl locationadd(new Point (radius 00)) AbstractPoint p2 locationadd(new Point(OO radius)) AbstractPoint p3 locationadd(new Pointe-radius 00)) AbstractPoint p4 locationadd(new Point(OO -radius))

outprintln(draw( + p1so1veO + + p2solveO + + p3solveO + + p4solveO + cycle))

Figure 54 Code pour geacuteneacuterer du code Asymptote pour un cercle

sera appeleacute agrave ecirctre dessineacute qui appellera reacutecursivement chacun de ses sous-canevas

La geacuteneacuteration du code Asymptote a eacuteteacute reacuteserveacutee dans une fonction draw speacutecifique agrave

chaque forme (Shape) qui eacutecrit dans un fichier ouvert fourni en paramegravetre Un exemple

dune telle meacutethode pour la classe Circle est illustreacute agrave la figure 54

Une telle meacutethode est simple mais suffisante pour nos besoins Bien sucircr agrave long terme

une solution plus robuste devrait simposer En effet comme leacutecriture du fichier est

faite directement lors de lexeacutecution les objets doivent ecirctre appeleacutes exactement dans

lordre dont ils sont deacutependants Par exemple un segment dessineacute entre deux cercles

doit ecirctre dessineacute apregraves les cercles car sinon les reacutefeacuterences seront absentes Dans ce cas-ci

le segment va toujours ecirctre deacutefinie par la suite Par contre si nous voulions rajouter

la possibiliteacute dutiliser des extensions dAsymptote cela impliquerait de les eacutecrire au

deacutebut du fichier Il est impossible de le faire avec cette solution

Une solution plus robuste serait dutiliser un outil lieacute agrave SabieCC qui est ObjectMacro

(Gagnon 2009) Cette extension nous permet de simplifier la geacuteneacuteration de code et

deacutecrire agrave des endroits arbitraires dans un fichier agrave laide de macros et de programmation

objet Cela nous permettrait aussi deacutetendre la geacuteneacuteration de code agrave plusieurs formats

diffeacuterents par exemple geacuteneacuterer directement du code PDF au lieu de geacuteneacuterer du code

70

Asymptote

61

CHAPITRE VI

REacuteALISATION DES DIAGRAMMES EN SDDL

Maintenant que nous avons notre programme complet et fonctionnel il faut veacuterifier son

efficaciteacute Nous proceacutedons en deux temps Premiegraverement il faut revenir agrave nos dessins

de base et les coder avec notre logiciel Par la suite il faut aussi les analyser en fonction

des diffeacuterents facteurs cruciaux que nous avons eacutenumeacutereacutes dans les chapitres preacuteceacutedents

Nous pourrons donc agrave partir de cela conclure si le logiciel savegravere efficace pour nos

besoins ou si certains problegravemes lempecircchent de fonctionner adeacutequatement

Naturellement nous avons pris le temps dappliquer cette analyse agrave chacun des dessins

dans notre base de diagrammes du domaine Par manque despace nous nanalyserons

dans ce chapitre que trois dessins Une attention particuliegravere a eacuteteacute porteacutee au choix de

ces dessins afin de repreacutesenter un eacuteventail assez large des capaciteacutes du logiciel et des

diffeacuterents eacuteleacutements cruciaux agrave obtenir dans la description dun diagramme Tous les

diagrammes sont disponibles en annexe avec code sans analyse deacutetailleacutee toutefois

Analyse du code des diagrammes existants

Pour faire notre analyse nous devons premiegraverement obtenir chaque dessin Dans ce cas

nous utiliserons un diagramme tireacute du domaine de la compilation Cela nous fournit un

graphe relativement standard avec un niveau de complexiteacute inteacuteressant sans toutefois

ecirctre trop complexe Par la suite nOlis analyserons un diagramme repreacutesentant une strucshy

ture de tableau Cela montre la capaciteacute du logiciel de travailler avec des structures de

72

donneacutees geacuteneacuterales Finalement nous effectuerons lanalyse dun diagramme de Venn qui

nest a priori pas supporteacute par le logiciel afin de voir la complexiteacute dun diagramme

totalement geacuteneacuteral et qui sort des conventions preacute-eacutetablies par le logiciel

611 Rappel des objectifs cruciaux agrave observer

Naturellement afin de faire une analyse rationnelle de notre solution il faut se remeacuteshy

morer les diffeacuterents objectifs que nous nous eacutetions fixeacutes Les plus importants eacutetaient les

suivants

- Inteacutegration avec Jb1EX Eacutetant donneacute le design de notre solution ce point est naturelshy

lement reacutealiseacute dans tous les diagrammes

- Description de structures Il nous faut pouvoir deacutecrire une structure de maniegravere aiseacutee

Le fait decirctre aiseacute est naturellement subjectif mais nous pouvons ramener le tout au

fait quil soit plus simple de deacutecrire dans notre logiciel Wle structure que dutiliser les

primitives de base du langage Par exemple il est plus aiseacute de deacutecrire une structure

en parlant de boicirctes et de liens quen parlant de lignes et de courbes

- Hieacuterarchie solide et extensible Nous ne testerons pas lextensibiliteacute de la solution car

elle a deacutejagrave eacuteteacute deacutemontreacutee Toutefois les diffeacuterents codes nous permettront danalyser

agrave quel point nous utilisons la hieacuterarchie que nous avons construite et agrave quel point elle

est reacuteellement pratique

Nous avions aussi dautres objectifs de moindre importance

- Gestion des erreurs Il nest pas possible avec du code compleacuteteacute de tester la gestion des

erreurs Lauteur peut toutefois garantir que sans la gestion des erreurs une grande

quantiteacute de temps aurait eacuteteacute perdu dans la reacutedaction du code des diagrammes et ce

malgreacute la connaissance profonde du langage sous-jacent

- Langage fluide et clair Cela peut ecirctre testeacute par le lecteur en regardant le code Si

une analyse rapide lui permet de comprendre le sens du code alors celui-ci est clair

Naturellement lauteur ne peut effectuer cette analyse par lui-mecircme Bien que nous

ne puissions en faire une analyse scientifique en inspectant le code reacutesultant nous

73

sommes confiants que la syntaxe que nous avons choisie est claire et permet dexprimer

clairement les concepts sous-jacents au langage

- Qualiteacute de la documentation et courbe dapprentissage Il sagit ici dun autre eacuteleacutement

que nous pouvons difficilement aborder par nous-mecircmes Cela ne sera pas pris en

compte dans notre analyse

Selon ces diffeacuterents facteurs nous voyons que nous devrons surtout nous concentrer sur

la structure geacuteneacuterale du code ainsi que sur sa complexiteacute Le code doit ecirctre facile agrave

lire tout en permettant de compacter un maximum dinformation dans un minimum

despace

612 Diagramme de compilation

Notre premier dessin est tireacute dun livre de compilation Il sagit dun automate assez

standard et repreacutesente donc un bon diagramme moyen afin de voir les capaciteacutes de

notre logiciel

Figure 61 Diagramme dautomate de compilation

Quelques points importants sont agrave noter dans ce dessin Premiegraverement on note la

creacuteation dune structure sous-jacente (composeacutee dune ellipse et deux cercles) Par la

74

circlel Circle with [radius = 100] circle2 Circ le with [radius = 120] ellipse Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (1000 500) in main d3 put form at (1000 -500) in main put Text with [text $N(p_l)$] at (1000 1000) in main put Text with [text $N(p_2)$] at (1000 500) in main put Text with [text dotsJ at (100000) in main put Text with [text I$N(p_n)$J at (1000 -500) in main

put Text with [text = $s_O$J at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt(coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt(coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt(coord of anglePoint(1800) in maind3circle)

Figure 62 Code pour le diagramme dautomate

suite cette forme est appliqueacutee agrave plusieurs reprises dans le dessin Cela deacutemontre que

dans ce cas-ci il est possible de creacuteer et dutiliser des structures dun certain degreacute de

complexiteacute

On note aussi lutilisation des variables pour reacutecupeacuterer les dessins afin de pouvoir les

reacutefeacuterencer plus tard Cette eacutetape est aussi simple que lassignation agrave une variable Par

la suite on peut noter les flegraveches qui sont traceacutees agrave partir de points deacutefinis agrave partir de

certains cercles La structure mecircme est extrecircmement explicite dans ce cas et rend la

compreacutehension du dessin tregraves simple On reacutecupegravere aussi finalement les points formeacutes agrave

un certain angle dun cercle

75

La complexiteacute du diagramme est beaucoup plus simple quelle ne le serait avec des

primitives de base En effet les seuls dessins explicites que nous devons effectuer par

points sont les flegraveches De plus ces flegraveches sont relativement simples puisque nous navons

rien agrave speacutecifier pour le bout de flegraveche seulement les extreacutemiteacutes Pour le reste les formes

sont soient deacutefinies agrave partir de notre hieacuterarchie (comme les cercles ou les ellipses) ou

bien par un collage de formes plus simples (comme pour la forme form) Les points sont

obtenus par des accegraves structureacutes et fournissent donc des valeurs exactes rendant ces

opeacuterations extrecircmement rapides agrave eacutecrire pour lusager

On note toutefois quil existe certains eacuteleacutements dans le code qui auraient pu ecirctre simshy

plifieacutes afin de rendre le code encore plus compact En effet nous remarquons la preacutesence

de beaucoup de valeurs explicites alors quil aurait eacuteteacute possible de les remplacer par des

variables afin de rendre le tout plus clair

Un eacuteleacutement qui aurait pu amener une touche de simplification aurait eacuteteacute dutiliser des

listes ou des boucles afin dinseacuterer plus aiseacutement les objets Par exemple la structure

complexe aurait pu ecirctre ajouteacutee plusieurs fois par une boucle for avec des positions

calculeacutees en fonction de lindex Nous sommes toutefois davis que malgreacute lameacutelioration

possible que cela fournit au code il est peu probable que les utilisateurs finaux prennent

le temps de faire ce genre de modification et utiliseront fort probablement plus des

positions relatives avec une seacuterie dappels sauf si le nombre dobjets agrave positionner

devenait grand (par exemple une dizaine dobjets)

En geacuteneacuteral nous pouvons toutefois consideacuterer que ce diagramme est simplifieacute de beaushy

coup par lutilisation de notre solution La grande part du code est explicite et la strucshy

ture est tregraves simple agrave observer en regardant uniquement le code Mecircme si tout nest pas

parfait il y a clairement avantage agrave utiliser le logiciel pour coder cet automate

613 Diagramme de tableau

Notre second dessin est tireacute dun livre sur les structures de donneacutees Il repreacutesente

leacutevolution dune structure de donneacutee simple (un tableau) agrave travers certaines modifishy

76

cations

a ab 1 0 2 8 (lime

1 -10

3 7

iuml

Figure 63 Diagramme de tableau

Un des points les plus inteacuteressants de ce dessin est lutilisation dune fonction Elle place

une forme dans un canevas agrave plusieurs endroits speacutecifiques en fonction dune position de

deacutepart et dun vecteur de translation Cela nous permet de placer une forme identique

(un carreacute) plusieurs fois de suite ce qui nous donne limpression quil sagit en reacutealiteacute

dun tableau

Un autre point qui est tregraves important dans ce dessin est que les nombreux carreacutes sont

en fait tous des instances du mecircme deacutefini au deacutebut Cela permet de modifier lensemble

des carreacutes aiseacutement en ne modifiant que les proprieacuteteacutes de celui de base Pour le reste du

dessin il sagit surtout dun ensemble de flegraveches et de textes positionneacutes agrave des endroits

speacutecifiques

En analysant le code on voit une ameacutelioration claire provoqueacutee par le fait dutilishy

ser une fonction pour placer les carreacutes Cela nous permet de simplifier de beaucoup

les appels et les reacutepeacutetitions Nous pouvons toutefois noter que quelques ameacuteliorations

suppleacutementaires pourraient ecirctre apporteacutees En effet une classe aurait pu ecirctre eacutecrite en

Java pour repreacutesenter un tableau agrave lhorizontale ou agrave la verticale Cela aurait pu simshy

plifier significativement le code du dessin en combinant dans la structure le texte et

les carreacutes utiliseacutes pour repreacutesenter le tableau lui-mecircme De plus les flegraveches auraient pu

ecirctre deacutetermineacutees agrave partir de points obtenus du tableau lui-mecircme (par exemple le coin

supeacuterieur droit ou supeacuterieur gauche) auxquels nous aurions ajouteacute un vecentierteur de

deacuteplacement

77

fun dropMany(f n s v c) for i from 1 to n do

put f at (s + (i - 1) v) in c end

square = Square with [length = 200] changeVec = (00 -200) dropMany (square 4 (00 00) changeVec main)

dropMany(square 3 (500 00) changeVec main) dropMany(square 1 (1000 00) changeVec main)

dropMany (square 1 (1500 00) changeVec main) put Text with [text=O] at (00 00) in main

put Text with [text=l] at (00 -200) in main put Text with [text=3] at (00 -400) in main

put Text with [text=7] at (00 -600) in main put Text with [text=bf a] at (500200) in main put Text with [text=2] at (500 00) in main

put Text with [text=4] at (500 -200) in main put Text with [text=7] at (500 -400) in main

put Text with [text=7] at 0000 00) in main put Text with [text=bf $a-b-+$] at 0500 200) in main

put Text with [text=8] at 0500 00) in main put Text with [text=none] at (2000 00) in main

020 100)-gt(380 100) (620 100)-gt(880 100)

(1120 100)-gt0380100) 0620 100)-gt0880100)

Figure 64 Code pour le diagramme de tableau

Avec ces changements le code aurait pu ecirctre beaucoup plus compact Bien que cette

option soit reacutealisable nous ne lavons pas impleacutementeacutee car il eacutetait important de limiter

ce quun usager peut creacuteer sans lutilisation de Java Cela est ducirc au fait que notre objectif

est que seulles utilisateurs experts se servent de Java afin dameacuteliorer le logiciel Le code

est tout de mecircme significativement meilleur que de placer tout agrave la main ce qui nous

permet de conclure agrave lefficaciteacute de notre logiciel dans le cas dune structure geacuteneacuterale

78

614 Diagramme de Venn

Notre dernier dessin est une structure qui ressemble beaucoup plus agrave un dessin geacuteneacuteral

cest-agrave-dire un diagramme de Venn La forme dun tel diagramme fait quil est extrecircmeshy

ment complexe deacutecrire une classe qui permet de dessiner automatiquement ce type de

structure et quil vaut mieux creacuteer les formes une par une comme on le ferait agrave la main

Cela nous permettra danalyser si les choses simples agrave dessiner agrave la main demeurent

facile agrave reacutealiser avec notre logiciel

A

Figure 65 Diagramme de Venn

Ce dessin ne possegravede pas beaucoup de grands points dinteacuterecirct En effet la structure ne

peut pas vraiment ecirctre geacuteneacutereacutee automatiquement par un algorithme alors elle est entreacutee

manuellement On remarque tout de mecircme lutilisation de plusieurs sous-canevas afin

de simplifier le placement des objets qui sont agrave linteacuterieur dautres

Naturellement eacutetant donneacute que la structure doit ecirctre deacutecrite manuellement le code

nest pas plus court que lutilisation de primitives de base Par contre cela est comshy

penseacute par un niveau de clarteacute supeacuterieur eacutetant donneacute lutilisation des canevas afin de

regrouper les eacuteleacutements dans des ensembles respectifs Cfla permet de positionner tous

les eacuteleacutements en valeurs relatives au lieu dabsolues ce qui simplifie de beaucoup le travail

de positionnement

De plus le fait de pouvoir stocker les eacuteleacutements dans des variables nous permet de les

identifier par diffeacuterents noms significatifs ce que des primitives de base comme celles

79

circle = Circle with [radius = 100] bigcircle = Circ le with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvas1 put circle at 050 150) in canvas1 put Text with [text = H] at 050 150) in canvas1 put circle at (-150 150) in canvas1 put Text with [text J] at (-150 150) in canvas1 put Text with [text = B] at (00 -150) in canvas1

put bigcircle in canvas2 put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = F] at 050 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = E] ac (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvas1 at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = A] at (00 -300) in main put bigellipse in main

Figure 66 Code du diagramme de Venn

de PDF ne nous permet pas de faiTe Nous pouvons donc en conclure que mecircme pour

les structures difficiles agrave repreacutesenter notre logiciel fournit tout de mecircme un nombre

significatif davantages

Preacutesentation du produit final

Une fois que nous avons pu confirmer que notre logiciel eacutetait efficace il ne restait plus

quagrave le faire connaicirctre Nous preacutesentons donc ici un reacutesumeacute des efforts qui ont eacuteteacute

effectueacutes afin damener le logiciel agrave la connaissance de la communauteacute gIEX

62

80

621 Statistiques et documentation

En premier lieu avant de pouvoir preacutesenter notre solution il nous fallait la documenter

correctement En effet leffort de deacuteveloppement nous aura permis de deacutevelopper un

produit de tregraves grande taille La taille totale du travail se limite agrave environ 10 megs mais

cela implique plus de 6300 lignes de code deacuteveloppeacutees speacutecifiquement pour le projet

(cela incluant les commentaires mais excluant tout le code geacuteneacutereacute par SableCC qui est

tregraves exhaustif) Avec une taille aussi significative il est tout simplement impensable de

sattendre agrave ce quun utilisateur analyse le code afin de trouver ce qui va reacutepondre agrave ses

besoins

Pour cela nous avons pris le temps de reacutediger une documentation interne Elle consiste agrave

documenter chaque classe de notre hieacuterarchie ainsi que chaque fonction disponibles Cela

fournit des renseignements complets pour quelquun qui cherche un eacuteleacutement speacutecifique

du langage

622 Preacutesentation

Par la suite nous avons reacutedigeacute une preacutesentation pour la confeacuterence TUG 2010 que nous

avons preacutesenteacutee le 28 juin 2010 agrave San Francisco devant des membres tregraves influents de

la communauteacute JbTEX dont Donald Knuth le creacuteateur original de TEX La confeacuterence

nous a permis de nous mettre au pouls des besoins de la communauteacute et de linteacuterecirct

quils portent agrave un tel projet La reacuteponse se voulait enthousiaste particuliegraverement de

la part du preacutesentateur dAsymptote John Bowman La confeacuterence est disponible sur

le site de River Valley (Bourgeois 2010) (malheureusement sans videacuteo eacutetant donneacute un

problegraveme dopeacutemt ur)

Bien quil sagisse dun eacuteleacutement tregraves important dans la preacutesentation dun projet une

confeacuterence ne rejoint pas beaucoup de monde Pour combler ce besoin nous avons aussi

reacutedigeacute un article pour la revue TUGBoat (Bourgeois et Villemaire 2010a) qui est la

revue principale de la communauteacute JbTEX Nous avons inclus larticle en annexe Cela

81

nous a permis de rejoindre un public beaucoup plus grand quune simple preacutesentation

devant public

623 Site web

Finalement afin de faciliter la distribution de notre logiciel nous avons deacuteveloppeacute un site

web (Bourgeois et Villemaire 2uuml1uumlb) pour accompagner la preacutesentation et permettre le

teacuteleacutechargement Le site contient aussi toute notre documentation ainsi que les contenus

des preacutesentations et articles que nous avons mentionneacutes plus haut Nous avons aussi pris

le temps de fournir quelques exemples suppleacutementaires afin de montrer lattrait direct

de SDDL

63 Conclusion de notre analyse

Nous concluons que notre solution est efficace et quelle respecte agrave diffeacuterents niveaux

les critegraveres que nous nous eacutetions fixeacutes au deacutepart Il sagit dune hieacuterarchie dobjets facile

et extensible accompagneacutee dune syntaxe claire et fluide Avec lajout de la gestion des

erreurs et sa capaciteacute agrave deacutecrire plusieurs formes de structures notre logiciel permet de

simplifier la repreacutesentation des diagrammes classiques du domaine Nous en venons donc

agrave la conclusion que notre solution respecte les diffeacuterents critegraveres et nous pouvons donc

consideacuterer notre solution comme eacutetant valide

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CONCLUSIOK

La creacuteation de diagrammes structureacutes comme nous avons pu le constater tout au long

de ce meacutemoire est un sujet tregraves complexe Bien quil puisse de prime abord necirctre vu

que comme la capaciteacute de faire des petits dessins simples nous remarquons rapidement

que les deacutecrire tels que nous les voyons est beaucoup plus difficile quil y parait

Entre autres nous avons pu constater que les diagrammes sont penseacutes de maniegravere

extrecircmement abstraites En effet dans un arbre nous ne voyons pas une seacuterie de somshy

mets relieacutes par des points mais bel et bien un arbre seulement Cette capaciteacute agrave abstraire

la forme du contenu est extrecircmement pratique pour un ecirctre humain mais pas tregraves utile

pour un ordinateur Il est extrecircmement difficile dessayer de saffranchir du besoin de

speacutecifier la forme lorsquon veut creacuteer un diagramme

Il en est de mecircme avec IbTEX duquel nous nous sommes inspireacute Bien que le logiciel

puisse faire la forme de maniegravere adeacutequate dans plusieurs cas ces derniers savegraverent tregraves

speacutecifiques et plus souvent quautrement la possibiliteacute dobtenir un niveau accru de

controcircle sur la forme est souhaitable Dautre part la question du positionnement dun

texte scientifique dans une page a eacuteteacute abondamment eacutetudieacute (entre autre par la creacuteation

de TEX) alors que le bon positionnement dun diagramme la eacuteteacute beaucoup moins Il

est donc probleacutematique de se deacutebarrasser de cet eacuteleacutement de forme dans nimporte quel

logiciel de creacuteation de diagrammes

Cela nous amegravene donc agrave la question naturelle de savoir si notre logiciel savegravere une solushy

tion valide agrave notre probleacutematique initiale En effet bien que notre analyse deacutemontre que

la creacuteation de dessins devient plus simple nous ne pouvons affirmer que nous eacutecrivons

ce que nous pensons du diagramme

- -

84

Or comme la question est de veacuterifier la validiteacute de notre solution nous reacutepondrons par

laffirmative Mecircme si elle nest pas parfaite un degreacute de complexiteacute se trouve eacutelimineacute

malgreacute tout Il est tout de mecircme possible pour un utilisateur de penser en des termes plus

abstraits mecircme sil ne sagit pas du niveau dabstraction optimal De plus eacutetant donneacute

que nous avons creacuteeacute notre solution pour ecirctre extensible il est possible daugmenter le

niveau dabstraction avec la contribution de la communauteacute Bien que la solution ne soit

pas parfaite et aurait pu jouir dameacuteliorations subseacutequentes lobjectif principal eacutetait de

deacutevelopper un langage qui simplifiait la description de diagrammes structureacutes et cela

fut atteint

Naturellement eacutetant donneacute les limites de temps et de complexiteacute plusieurs pistes de

deacuteveloppements suppleacutementaires nont pu ecirctre utiliseacutees En effet nous nous sommes

limiteacutes agrave la description dune image statique Il est toutefois tregraves utile de pouvoir creacuteer

des images dynamiques La possibiliteacute de creacuteer des seacutequences de mouvements agrave linteacuterieur

dun diagramme aurait pu rendre notre outil plus inteacuteressant De plus lUl outil de

geacuteneacuteration automatique de graphes ou darbres mecircme imparfait pourrait fournir des

choix suppleacutementaires agrave un utilisateur qui souhaite obtenir un reacutesultat rapidement sans

toutefois rechercher un reacutesultat parfait

Il est toutefois bon de noter que bien quil soit long et complexe deffectuer de tels

ajouts notre logiciel a eacuteteacute penseacute en fonction de pouvoir ecirctre eacutetendu par lutilisateur Il

est donc tout agrave fait possible de pouvoir eacuteventuellement fournir de telles fonctionnaliteacutes

dans une version future du programme Dici lagrave celui-ci suffira amplement agrave la creacuteation

de diagrammes simples

APPENDICE A

PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

Nous incluons ici larticle complet que nous avons reacutedigeacute agrave propos de notre logiciel

afin den faire la promotion aupregraves de la communauteacute TEX et JbTEX Cet article qui fut

preacutesenteacute dans Tugboat la revue du TEX Users Group tel que mentionneacute preacuteceacutedemment

compleacutemente la preacutesentation qui fut effectueacutee lors de la confeacuterence du mecircme groupe

agrave San Francisco Larticle est essentiellement une introduction pragmatique pour un

utilisateur final et fournit donc plusieurs exemples inteacuteressants dutilisation tout en

deacutecrivant briegravevement les diffeacuterents concepts importants qui ont meneacutes le deacuteveloppement

de SDDL Il sagit de la version finale tel que Jarticle apparait dans le numeacutero de Tugboat

206

Drawing structured diagrams with SDDL

Mathieu Bourgeois and Roger Villemaire

Abstract

We present SOOL a Structured Diagram Description Language aimed at producing graphical representashytions for discrete mathematics and computer science SDDL allows combining graphical objects (circles lines arrows ) and lbTEX boxes to produce diashygrams representing discrete structures such as graphs trees etc with an easy-to-use domain specific lanshyguage

1 What is SDDL

SDDL Structured Diagram Description Language is a high-level domain specific language tailored for diagrams that have an inherent structure Examples of these might be trees graphs and automata Any diagram that is naturally structured can be described in SDOL However it was designed especially for data structures appearing in computer science and discrete mathematics

The main objective of this language is to realize drawings in a natural and structured way Mainly one describes a drawing in SOOL in a way that is simishylar to drawing on a blackboard For example specific shapes (like circles ellipses texts boxes) are drawn at positions that can be either absolute or relative to specific points on already placed shapes Since we aim at mathematical drawings text is handled through lbTEX

Since exhibiting the structure of a diagram is esshysential to our purpose SOOL uses an object-oriented hierarchy completely written in Java under our high-levellanguage Having shapes as objects makes structuring of diagrams easier and more intuitive since most shapes are explicitly represented by a class Furthermore extension by the end user is quite feasible since Java is a well-known language

At the lower level SDDL uses another graphishycal description language for lbTEX namely Asympshytote [1] Our tool produces Asymptote code which is finally converted to an encapsulated PostScript (eps) vector file

2 Canvas and shapes

A diagram in SDDL is defined by a main Canvas It is just like a standard painting canvas in the sense that we can place (or paint) different things on it as much as we like The things we can place inside a Canvas are Shapes Thus for creating a Hello world diagram we would use the following

put Text with [text = Hello worldJ in main

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

resulting in

Hello world

In this example Text is a Shape and it posshysesses a property text which is the JbTEX string used to render the text Each Shape defines a cershytain number of such properties

SDDL permits the definition of variables It is a dynamically typed language so variables dont have to be declared before being used Variables make it possible to reuse the same Shape at multiple locations For example

a = Circle with [radius = 100] put a at (-75 00) in main put a at (75 00) in main

m In this example we specify the location where we want our Shape to be If a location is not specified with the at clause the Shape will be placed at the point of origin of the current Canvas which is its center

One important thing to note is that once a Shape has been put in a Canvas it is immutable It cannot be modified or removed A Shape can be modified alter it has been drawn on a Canvas but this will have an effect only on later use of this object and will not modify the actual Canvas in any way a Shape always appears in a Canvas as it was at the moment it was added

When a Shape is created every property specishyfied by the user is set in the given order It is not necessary to specify ail properties at once nor to set ail of them Most of the properties have appropriate default values However sorne properties if not set will yield strange results For example a circle with no radius property set will have a defaul radius of O Usually property order is irrelevant For instance giving for an ellipse the radius along the x-axis or the y-axis first will yield exactly the saille result

a = Ellipse a = a with [xradius 200] a = a with [yradius 100] put a in main

o 3 Structuring multiple canvases

Every diagram consists of a main Canvas However we can define other Canvas objects if we wish An additional Canvas can be introduced using a typical variable assignment However when a put command is used SODL checks to see if the canvas variable is

4

207 TUGboat Volume 31 (2010) No 2

already defined If it isnt it automatically creates an empty Canvas for use

One of the main reasons to use other Canvases is to create an explicit structure in our diagram Since a Canvas is a Shape once a sub-Canvas has been created it can be placed inside the main Canvas or any other one for that matter This will ensure that everything that is defined inside our sub-Canvas will be placed at the proper position in the final diagram However any Canvas that has been defined but is not linked directly or indirectly with the main Canvas will not be drawn in the final diagram

As an example lets say we want to make a diagram that consists of two identical eyes Instead of defining two identical objects we will create one in a Canvas named form and put it at different positions inside our main Canvas Our eye consists of a circle and an ellipse both with the same center Ali we need to do for this is place them at the default position of the Canvas Finally we can take this subshyCanvas and place it at the two positions required a ~ Circle with [radius~100]

b ~ Ellipse with [xradius~200 yradius~100]

put a in form put b in form put form at (-200 00) in main put form at (200 00) in main

Paths

SDDL offers support for the description of paths The way in which they are described is similar in syntax with MetaPost and Asymptote though with sorne variations A Path shape is described by linking points together with specific linking symbols To draw a line between two points the line symbol - shycan be used To link sorne points using a curve use the curved line symbol - which will use Asymptotes positioning algorithms to create a nice-looking curve which passes through those points For the moment user control over the curve is limited to beginning and ending tangents but could be expanded

pl ~ a--b--c p2 ~ a-b-c

One of the other things you may want to do with a Path is to create an Arrow out of it SDDL defines symbols for forward backward and bidirectional arshyrows for both linear and curved lines Right now however support is restricted to forward arrows

pl ~ alt-b--c-gtd p2 alt-b-c-gtd p3 alt-gtb p4 aCgtb

Once a Path is defined it can be used as any other Shape However one of the main things that you want ta do is ta put your Path somewhere For this you can write something Iike this p ~ (00 00) -- (100 100) put p in main

This is the standard way to add Shapes ta a Canvas However since Paths are usually used to link different Shapes together in the main Canvas special handling is done in SDDL Namely a Path that is not explicitly assigned to a variable will be automatically placed in the main Canvas Therefore the Path will be directly placed in main without any explicit put expression Thus linking has its own special syntax which is more natural and convenient As an example this program (00 00) -- (100 100)

yields exactly the same result as the one just above Furthermore points can be added and multiplied by a scalar (as vectors) Using a dot to locate the origin of the drawing we can use the SDDL syntax ta create this example a ~ (100 100) a--20a-gt(300 00) a-(-10)a-(300 00)

ocirc Finally as we will now see Shapes also usually

define specifie points

5 Drawing and linking shapes together

Ta draw a diagram usually sorne shapes with a specific structure are first laid down Once that is done those objects are linked together with lines curves and arrows However these links must be made between specific positions usually derived from one or more specifie Shapes For example we may want to link the northwestern point of a rectangle with the point on a circle at an angle of 45 degrees These points could obviously be computed in advance However this becomes quite problematic when points are at peculiar angles or more complex relationships between points and Shapes are needed Worst of ail if the position or any other property of a Shape is changed ail computations will have to be redone

To ease object linking SDDL provides so-called reference points A reference point is a point that has no static value unlike points defined by a pair of two real numbers Instead a reference point is defined by its relationship to a specifie Shape appearing at a particular location As a matter of fact ail reference

Drawing structured diagrams with SDDL

208

points are defined along with the Shape because they are a natural part of it This ensures that we always have nice-looking lines at exactly the positions we want them to be

However a reference points exact position in a Canvas will depend on the Shapes position Worse since the same Shape can appears at multiple locashytions in the same Canvas we have to know which occurrence we are talking about

Therefore SDDL introcluces a feature called a Drawing A Drawing is an object that represents a Shape at a particular position Le a specifie occurshyrence of a Shape in a Canvas Whenever a Shape is put inside a Canvas a Drawing is returned and can be assigned to a variable This gives a way to uniquely identify every occurrence of a Shape apshypearing in a Canvas If the same Shape is placed twice two different Drawings will be returned each referring to a different occurrence of the same Shape

a = Circle with [radius = 100] dl = put a at (-100 00) in main d2 = put a at (100 00) in main

Once a drawing has been defined a way to access its points is needed SDDL defines a syntax for extracting points from drawings

coord of (coord) ( (args) ) in (drawing)

Here one specifies the kind of point to use (( coord) ) and any particular arguments required to obtain it The available points are Shape specifie so only those kinds of points which make sense for the particular Shape can be used For instance one can get a point at a particular angle on a Circle This is also an example where an additional argument is needed For instance anglePoint(450) will give the point at 45 degrees

Finally to reference the drawing from which we take the point its clrawing Path (a dot separatecl path) from the main diagram must be given

a = Circle with [radius = 100] dl = put a at (-75 00) in main d2 = put a at (75 00) in main (coord of anglePoint(OO) in maindl)

(coord of anglePoint(1800) in maind2)

m In this example a line between two identical circles is drawn The drawing Paths are simple here since both drawings are made directly in main Thus only main followed by the drawing name is needed

Simply giving a Drawing is not sufficient in order to make reference points non-ambiguous complete drawing Paths are required as we will now show Lets go back to the two eyes we drew previously

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

The eye was defined by a circle and an ellipse both put inside a sub-Canvas Now lets say we want to draw a line between the two circles Each of those circles is defined in the sub-Canvas and they are as a matter of fact the same Drawing a Adding a link between a and itself wauld add a link between the sub-Canvas circle and itself (what could this mean) Adding the sub-Canvas to the main Canvas twice as we did before would just duplicate this structure inside the main Canvas

But since a Canvas is a Shape we get a drawing when we put the sub-Canvas inside main We can therefore identify each inner circle by listing the drawings required to access them as shown in the following SDDL example Thus we can always link together Shapes that are deeply nested inside a subshyCanvas a = Circ le with [radius=100] b = Ellipse with [xradius=200 yradius=100] c = put a in form put b in form fl = put form at (-200 00) in main f2 = put form at (200 00) in main (coord of anglePoint(1800) in mainflc) -gt

(coord of anglePoint(OO) in mainf2c)

6 Programming constructs and lists

SDDL also defines typical programming constructs For instance Iists are created and elements accessed in a syntax similar to most other dynamic languages Since the content of a list is a general Java Dbject you can create a list of objects that are not of the same type Thus an assignment like l = [20 (00 00) [] a--b]

is perfectly legal even if not typically very useful A more typical use of Iists would be list = [(00 00) (100 100)] 1= list[O] 12 = list [1]

1--12

Lists are nice but to use them properly adeshyquate programming canstructs are needed such as for and while loops SODL defines those permitting us to draw arrays of Shapes or riAfine points through a simple list

The ability to use loops significantly simplifies many diagrams in computer science In this example we first define a Iist of points Afterward using a for loop we link those points into a linear Path a = [(100 100) (200 100)

(200 200) (100 200)] for i from 0 to 2 do

209 TUGboat Volume 31 (2010) No 2

a[i]--a[H1)

end

Alternatively we coulcl get the same result using the following while loop i = 0 hile i 1= 3 do

a [il --a [i+1] i = i + 1

end

7 Functions

SDDL also permits the creation of functiolli inside the code Those must be written before the diagram description A SDDL function is defined with the keyword fun The list of arguments does not need to be typed only named The return type (if it exists) does not need to be specified either To cali the function in the resulting code a typical C-like cali is used fun dropManyCs i v n c)

for j from 1 to n do put s at i + jv in c

end

circle = Circ le vith [radius = 50] dropManyCcircle COO 00)

C50 00) 100 main)

(rtttt3JJJ) In this case we define a function that drops

many instances of a Shape s at different positions on a Canvas c The positions of the Shape are detershymined by an initial point i and a translation vector v Finally the number of Shapes placed is also given as a parameter n Each Shape is then placed at the initial point translated by the translation vector a certain number of times This permits us to create many circles along one line

One important point is the parameter for the Canvas in which we place the Shapes However we pass main as our parameter The reason for this is that SDDL does not possess global variables A function can only access its parameters and variables that have been defined inside the function Thus trying to place something in main From inside a funcshytion will yield an errer message saying the variable main is unknown

8 Primitives

SDDL as mentioned before is written in Java One of the nice features of Java is its libraries Many classes have been written for any number of different tasks and the number of functions and algorithms implemented is astonishing To rewrite libraries that are already defined in Java or to link them one by

one in SDDL seemed pointless It is much nicer to directly use those functions since theyre already there

Since Java is a reftexive language in the sense that the program knows about itself and can modify itself at will functions can be dynamically accessed at runtime We already use this feature to simplify the definition of the SDDL interpreter the interpreter doesnt have to know every possible type of Shape in order to work Using these same mechanisms permits loading classes at runtime and gives the user the power to cali From inside SDDL any Java function

This is done through so-called primitives which are defined using the keyword primitive followed by the name of the function as it will appear in SDDL Following that two strings are given one for the package in which the function is defined and one for the name of the function as it was defined in Java Any primitive declaration must be made prior to any function definition

Lets look at an example One of the main things a diagram description language would require is sorne basic mathematics and geometry libraries Java possesses a nice java lang math package which we would like to use especially the sin and cos funcshytions For this we will need to define two primitives primitive static sin javalangMath sin primitive static cos javalangMath cos

Once they are defined they can be called just like any other SDDL functions In this case we will use those functions to place circles around an invisible circle for i from 1 to 6 do

put Circle vith [radius = 50] at C200 cos(i 314 30) 200 sin(i 314 30raquo

in main end

00 o 0 00

9 A concrete example

Now that we have ail our tools lets use SDDL to describe a simple diagram of an automaton This is the complete code along with the resulting image circlel Circle vith [radius = 100] circle2 Circle vith [radius = 120] ellipse Ellipse vith [xradius = 500

yradius = 200] circle = put circlel at (-300 00) in form put circlel at C300 00) in form put circle2 at (300 00) in form

Drawing structured diagrams with SDDL

210

put ellipse in form

dl = put form at (1000 1000) in main d2 = put form at (1000 500) in main d3 = put form at (1000 -500) in main put Text with [text=$N(p_1)$]

at (1000 1000) in main put Text with [text=$N(p_2)$]

at (1000 500) in main put Text with [text=dots]

at (100000) in main put Text with [text=$N(p_n)$]

at (1000 -500) in main

put Text with [text = $s_O$] at (00 200) in main

d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle) (coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle) (coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

10 Modifying the hierarchy by adding shapes

Using what has been described above most diagrams can be created However many simplifications can be made and sorne domains may find it relevant to add classes specifie to their trade SDDL eases the modification of the Java hierarchy underneath the language by using reftexivity Any user who respects sorne basic guidelines will be able to have its class work automatica11y in SDDL without any specifie linking required

To do this every class must possess a certain number of properties Those properties are defined through setters and getters For instance for the

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

radius of a circle these are called setRadius and getRadius Any property that follows this rule will be accessible

Furthermore an empty constructor must also be defined that sets as much as possible default values for a11 properties of the defined Shape There are also sorne small functions to be defined like the draw and obtainPath functions Any reference points must also be defined with a function to obtain them

As an example lets say we would like to add a class to represent a cloud A cloud will have a number of spikes and a size The class definition (without function definition) that we would require would be the following

public class Cloud extends Shape double size int numberOfSpikes public Cloud() public void setSize(double size) public double getSize() public void setNumberOfSpikes(int n) public int getNumberOfSpikes() public void draw(AbstractPoint a

PrintWriter w) public Path obtainPath()

11 Future additions and availability

SDDL is available now at httpwwwinfo2uqam cal -villemaire_rReChereacuteheSDDL It is funcshytional though not by any means complete Many additional Shapes couid be added (in particular tree and graph classes) and options could be added to existing classes Development of the application conshytinues for the time being and a more thorough version will be made available

References

[1] John C Bowman and Andy Hammerlindl Asymptote A vector graphies language TUGboat The Communications of the TEX Users Group 29288-294 2008

o Mathieu Bourgeois Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada bourgeois dot mathieu dot 2 (at)

courrier dot uqam dot ca

o Roger Villemaire Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada villemaire dot roger (at) uqam dot ca httpintrainfouqamca

personnelsMembersvillemaire_r

APPENDICE B

PREacuteSENTATION DE LA GRAMMAIRE DE SDDL

Nous preacutesentons ici le contenu entier de la grammaire de SDDL tel que reacutealiseacute avec

SableCC Tous les eacuteleacutements du langage sont lagrave agrave lexception de la reacuteflexiviteacute dont les

deacutetails de code sont situeacutes dans la partie Java de notre projet

Package sddlsyntax

Helpers

any [O Oxffff]

tab 9 li 10 cr = 13

upper [ A 2 ]

lower [ a z]

digit [ 0 9]

name char = upper 1 lower 1 digit -

string_char = [[32 126] - ]

= J bulldot

not star = [any-] not_star_not_slash = [not_star - l]

Tokens

92

put_kwd = put at_kwd = at in_kwd = in fit_kwd = fit around_kwd = around if_kwd = if

while_kwd = while true_kwd = true false_kwd = false then_kwd = then else_kwd = else for_kwd = for from_kwd = from end_kwd = end to kwd to by_kwd = by do_kwd = do with_kwd = with and_kwd = and or_kwd = or fun_kwd = fun return_kwd = return primitive_kwd = primitive call_kwd = call static_kwd = static coord_kwd = coord of _kwd = of get_kwd = get

scaled_kwd = scaled slanted_kwd = slanted rotated_kwd = rotated translated_kwd = translated

straight_line_kwd = -- curved_line_kwd = - straight_fwd_arrow_kwd = -gt curved_fwd_arrow_kwd = -gt straight_bwd_arrow_kwd = (- curved_bwd_arrow_kwd = (- straight_bidir_arrow_kwd = (-gt curved_bidir_arrow_kwd = (-gt

93

plus = + minus = -

mult = div =

eq = == neq = = lt lt gt = gt leq lt= geq gt= not assign = =

dot = dot

l br = - r br ( l _par = ) r_par =

l cr = [ )

-r_cr = J

sc = comma =

id = lower name_char class_name = upper name_char

integer = (-) digit+ real = (-) digit+ dot digit+

) ) Il J )Ilstring string_char

blank = 1 tab 1 cr 1 If 1 cr If comment not_star ( (not_star_not_slash not_star))

Ignored Tokens

blank comment

Productions

file = [primitives] primitive [functions] function [stms] stm

94

primitive =

primitive_kwd static_kwd id [class_name] string [func_name] string signature sc

signature = l_par type_list r_par

type_li st = string [additional_types] additional_type

additional_type comma string

function = fun_kwd id l_par id_list r_par l_br [stms]stm r_br

id_list =

id [additional_ids] additional_id

additional id comma id

stm = exp exp sc 1

assign id assign exp sc 1

while while_kwd exp do_kwd [stms] stm end_kwd sc Il if if_kwd exp then_kwd [stms] stm else_part end_kwd sc 1

for for_kwd id from_kwd [low_bound] exp to_kwd [up_bound] exp do_kwd [stms] stm end_kwd sc 1

return return_kwd exp sc

else_part = else_kwd [stms] stm

exp = or exp or_kwd and_exp simple and_exp

and_exp = and and_exp and_kwd line_exp 1

simple line_exp

line_exp line line_exp line_op eq_exp with_part 1

95

1

1

simple eq_exp

line_op =

straight_Iine straight_line_kwd 1

curved_line curved_Iine_kwd 1

straight_fwd_arrow straight_fwd_arrow_kwd curved_fwd_arrow curved_fwd_arrow_kwd 1

straight_bwd_arrow straight_bwd_arrow_kwd curved_bwd_arrow curved_bwd_arrow_kwd 1

straight_bidir_arrow straight_bidir_arrow_kwd curved_bidir_arrow curved_bidir_arrow_kwd

eq_exp = eq [left] cmp_exp eq [right] cmp_exp 1

neq [left] cmp_exp neq [right] cmp_exp simple cmp_exp

cmp_exp = lt [left] add_exp lt [right] add_exp 1

gt [left] add_exp gt [right] add_exp 1

leq [left] add_exp leq [right] add_exp geq [left] add_exp geq [right] add_exp simple add_exp

add_exp = add add_exp plus mul_exp 1

minus add_exp minus mul_exp simple mul_exp

mul_exp =

mult mul_exp mult left_unary_exp div mul_exp div left_unary_exp simple left_unary_exp

left_unary_exp = not not left_unary_exp get get_kwd id from_kwd left_unary_exp put put_kwd exp at_part in_kwd left_unary_exp fit fit_kwd class_Dame around_kwd left_uoary_exp coord coord_kwd of_kwd id l_par

arg_Iist r_par in_kwd left_unary_exp 1

simple right_exp

96

right_exp = calI right_exp dot id l_par arg_Iist r_par 1

index right_exp l_cr exp r_cr 1

scaled right_exp scaled_kwd l_par eq_exp r_par slanted right_exp slanted_kwd l_par

[xslant] exp comma [yslant] eq_exp r_par rotated right_exp rotated_kwd l_par eq_exp r_par 1

translated right_exp translated_kwd l_par [xtranslate] term comma [ytranslate] eq_exp r_par 1

simple term

term =

par l_par exp r_par 1

point l_par [x_value] exp comma [y_value] exp r_par 1

drawing class_name with_part 1

var id 1

int integer 1

real real 1

true true_kwd 1

false false_kwd string string 1

list l_cr arg_Iist r_cr 1

static_call id l_par arg_Iist r_par

arg_Iist = exp [additional_args] additional_arg

additional_arg comma exp

with_part = with_kwd l cr options r_cr

options = option [additional_options] additional_option

additional_option comma option

option = id assign exp

APPENDICE C

PREacuteSENTATION DE LA HIEacuteRARCHIE

Nous preacutesentons ici la description complegravete de notre hieacuterarchie objet en Java Le tout est

deacutecrit agrave laide dun diagramme UML Toutefois afin de faciliter le formatage nous avons

seacutepareacute le tout en deux sections Le premier diagramme contient les noms des classes ainsi

que leurs relations dheacuteritage Par apregraves tous les diagrammes suivants repreacutesentent le

contenu speacutecifique de chaque classe sans les relations entre classes Ceci nous permet

dobtenir une vue densemble des classes tout en obtenant des deacutetails cruciaux sur

limpleacutementation de chaque classe

98

l -llill Pa aj f1 1 Sh middotisVIsible boolampan

+draw(locaton AbstractPoint oot PniltWriBl) void

+lsVlsigtle() boolean +copyO Shape +obtalnPathO Path

Drawlna

-numberOIDrawinm int =0 middotdrawingNumber (nt -dependendes DrawingD middotpointsDellned AbsttactPolntD middothasBeenDrawn booLean middotshape Shape dmWingName string middotdrowingPositlon AbstractPoint -position AbstnldPolnt

+Orawlog(s Shape) +Shape(s S~ location AbsbaclPoint) +setPositlcn(positlon AbslradPoinl) void +seIDraloVingName(nsme slJfng) void +gelName() string +geISUbDrawlng(name string) ~ Drawlng +re~~Jri~)slring

+addDeflO8dPoint(point AbstractPolnl) Int +hasBeenDraWn() booIean +lsDrawn() booIean +canBeDlBWn() booIean +getShape() Shape fdraw(Jocafion AbslraclPolnt out PrlnlWriler) void +obtainPathO Path -tdp(other Orawilg) AbslractPoilt

uare length double

+Squate() ~s ( ~ le)

ell-eoatMength double) void +getlongthO bulldouble +dmw(locabmiddotoo AbstrampctPoint out PrnMYler) void +obtainPath() Path ffOPY() Shape

99

Rectangle

-lengIh double -wldth double -100 KI boeacuteIean

+Rectangle() +Rectangle(length double wldth double) +selleogth~ength double) void +setWldth(Width double) void +seIRound(rlaquo)Ulld booIegravean) void +getlengtb( doubIe +getMdth() double +getRound() booIeao +getNorth(d Dmwlog) RefPoint lttget5outh(d Drawlng) RefPolnl +getwest(d DlaWlng) RefPoint +gelEaat(d Drawlng) RefPoinl +gelNorthwest(d Drawllg) RefPoInt +gelNortheast(d Drawlng) R1tfPolnt lttgetSou1hwe$(d Drawlng) RefPoInt +get5outheast(d Drawilg) RefPoklt +dl8wlocalion Absl18ctPoiIt Ougravet ~Mhl81 void ii)blainPathO ~ Path

CIrcIe

middotradlus double

+Clœ() +Clrcle(radlus double)

+COPYO Shape +setRadlus(radius ~ double) void +getRadius() double +getAnglePolnt(d Omwilg angle double) RefPoInt +dmwlocation AbstradPoirlt our AiltKtler) VOiCI iOblailPath() Path

ElIID8e

middotxradlus double middotyradlus double

+Ellpse() +copyO bullShape +setXRadlus(r double) void +setYRadIus(r doublrt) void -gelXRadlus() double +geIYRadius() double +draw(txalJon AbstractPomt out PrinMbl8l) IIOIumld iOblainPathO Path

100

Lino point1 AbslractPoln1 middotpoint2 AbstractPoint

+L1oe() +Llne(point1 AbstractPoint poill2 AbstractPolnt) +COPYO Shape +dmw(locaIJon AbsIroctPoinl out PrnIWril9f) void +selPolnt1 (poInl1 AbsttactPoint) void +seIPoill2(poinl2 AbslractPoinl) void +getPolnl1 () AbslraclPoinl tiJotPolnl2() AbstraclPolntn_~

EqTrtanale middotsim double

-EqTriangleQ +EqTrlangle(size double) +cOPYO Shape +setSlze(slze double) void +gets1ze() double +d18W(Jocolion AbstTadPoinl out Ptil1Wfit8f) void +oblalllPalhll Path

middotpath Path bulltext string middotposIlIon double -dir Poilt middotabsohJle boolean middothasTexl boolean

+Arrav(path Palh) +copyO Shape TCl(( ex s n~ U blo dn 010 aosolute boolean) void seISlartingTangcnl(dlr Poinl) void

seIEndflgTangenl(dir Potnt) void tgelPalhO Palh +obtalnPath Path

101

cany -canvasLlst Carwas(J -canvasPontLIsl AbstractPoinllJ daWVigUsl DrawingD dlawilgPolnlUst AbsJaCtPolntO middotIsMaIn booean canvasPosltion bullAbstmetPoint

+CsnYaS() copYO Shape +seteanvasPositIoR(posllon AbslraclPotnt) VOId +setMaln() void +f8Mai1() booIean +addShape(S Shapeloca1ion AbstradPoItit) Drawilg l+a~pe(S Shape IocagravetJon AllstraclPolnl name slring) DraNklg +getOtawiDg(I Inl) D1awlng ~elDtawfng(namamp string) bull Drawilg tgelOl8WIngiocal1on(namo stlllllJ) AbsllaclPoilt ~olDmwlngOrNull(name string) Drawilg tgelOrawinglocation(l int) AbslractPolnt o+getNumberOfDrawlngs() int +dl8w(location AbstrodPonr oui PrintwrllerJ void +dmwMain(oul PrinlWrllGr) void +drawCanvaa(locatlon AbSlractPoinl remalnlllQDraws Drawlna Il out Prlntwriter) void

Path -Bst AbstractPolnllJ middothasASIartilgTangent boolean -hasAEndhlgTangent booIean -startiogTangent Point middotendingTangent Point middot1sU1ear boolean

+PathO Psth(Ust AbstraclPoint 0) +Path(Dst Ab~tPolnt Q startingTangent Polnt endlngTangenl Point) +cOPYO Sh8p6 +addPoinl(poiumlnl Abstl8ClPoint) void +seIUnear() void +IsUnearO booloao +getPolnt(l Inl) AbsIraclPcInl +getPolnts() AbsIlaCPoht 0 o+getNumberOlPolnts() Rt +cyc1B() void -thasASI8rthgTangent() boolean +hasAEndingTangentO booIoan +getStattilgTangenlO PoiIl +getEndlngTangent() Polnl 4uumllSlartingTangenl(stllllngTangent Peint) w1d +seIEndIllQTangent(encliigTangenl ~nt) void +psthValue() strilg +dmwJocalion AbslradPoItlI oot FilMtJrer) void

102

Text

-told slfng

ImiddotTexl() +Texl(lext string) +sotText(tegravext string) void iil8tTeld() string +draw(Jocalion AbstroctPoJnl oof PrinWriter) void ~btalnPath() Path +CODV(J ShsD9

AbsctPolnl +altfd(second AbstraclPoinl) AbslractPolnt -tmulliply(multipier double) AbstraclPolnt +eombine(perœntage double second AbstraclPolnl) AbstractPoint +solvfJ() slrillg +COfNIJ AbslradPoinl

Point -x double y doub19

+POIcirclIO +POIOI(x double y double) +solvo() slting -+IoSlflngO string~ n bull

RefPolnt -mf8teflœDrawlng Drawlng -poIntNumbef Int

+RefPoint(referenceDrawing DraYIing poiolNu ber Illl) +SoNe() stmg +COPYO AbstroctPDAcirclf

lnauudJonPoint p Path

-q Palh

+lnlCfSecllonPoint(p Palh q Path) +COPYO AbstrampcfPoitlt +soIve() string

103

Un Point -point AbsbaclPoint -pIampStmg string -endStrlng string -value double

+UnaryMapPolnl(poInt AbstradPoInt) +ScW9() string +setMapTypeMultlpIy(vallJe double) void +c Abslr8ctPoinI

Bln oint frstPoint Absll8clPoinl secoodPoInt AbstrootPoint -pceSIring string -middIeSlrIng Itlfno -endString string

+8ilatyMapPolnt(fkstPoiIt Abstmc1Po1nt secondPolnt AbslraetPointl +cOPYO bull AbstraetPOOI +soAte() string +selMapTypeAddO void

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

APPENDICE D

PREacuteSENTATION DES DIAGRAMMES CHOISIS

Cet annexe comprend lensemble des quinze (15) diagrammes que nous avons choisis

comme base de qualiteacute pour notre projet Tel que mentionneacute preacuteceacutedemment nous avons

inclus agrave la fois le code de chaque diagramme en SDDL ainsi que le diagramme reacutesultant

Aucune analyse nest effectueacute pour ces dessins agrave lexception de ceux deacutejagrave analyseacutes au

chapitre 6

Start box triangle = EqTriangle with [size = 400J put triangle at (00 -100) in main put Text with [text = StartJ at (00 -50) in main

El box rectanglePos = (00 -500) rectangle = Rectangle with [length = 1600 width = 300J put rectangle at rectanglePos in main put Text with [text El J at rectanglePos - (600 00) in main put Text with [text $a leftarrow O$J

at rectanglePos + (-300 50) in main put Text with [text $b leftarrow l$J

at rectanglePos + (-300 -50) in main put Text with [text $a leftarrow l$J

at rectanglePos + (100 50) in main put Text with [text $b leftarrow O$J

at rectanglePos + (100 -50) in main put Text with [text $c leftarrow m$J

at rectanglePos + (500 50) in main put Text with [text $d leftarrow n$J

106

at rectanglePos + (500 -50) in main

1 E2 box 1 rectangle2Pos = (00 -1000) put rectangle at rectangle2Pos in main put Text with [text = E2 ] at rectangle2Pos (600 00) in main put Text with [text = $q leftarrow quotient(c div d)$]

at rectangle2Pos + (100 50) in main put Text with [text = $r leftarrow remainderCc div d)$]

at rectangle2Pos + (100 -50) in main

1 Round E3 box 1 rectangle3Pos = (00 -1500) roundRectangle = Rectangle with [length = 800 width 250

round = true] put roundRectangle at rectangle3Pos in main put Text with [text = E3 $r = O$] at rectangle3Pos in main

1 Stop box 1 stopPos = (1500 -1700) put triangle at stopPos in main put Text with [text = Stop] at stopPos + (00 50) in main

1 E4 box 1 rectangle4Pos = (00 -2000) put Rectangle with [length = 1600 width = 400]

at rectangle4Pos in main put Text with [text = E4] at rectangle4Pos + (-700 00) in main put Text with [text = $c leftarrow d d leftarrow r$]

at rectangle4Pos + (100 120) in main put Text with

[text = $t leftarrow a a leftarrow a a leftarrow t - qa$] at rectangle4Pos + (100 00) in main

put Text with [text = $t leftarrow b b leftarrow b b leftarrow t - qb$ ] at rectangle4Pos + (100 -120) in main

(00 -100) -) rectanglePos + (00 150) rectanglePos + (00 -150) -) rectangle2Pos + (00150) rectangle2Pos + (00 -150) -) rectangle3Pos + (00125) rectangle3Pos + (00 -125) -) rectangle4Pos + (00200) rectangle4Pos + (00 -200) -- rectangle4Pos + (00 -500)

rectangle4Pos + (-1000 -500) -- rectangle2Pos + (-1000 00) -) rectangle2Pos + (-800 00)

107

rectangle3Pos + (400 00) -gt rectangle3Pos + (1410 00) put Text with [text Yes] at rectangle3Pos + (480 -50) in main put Text with [text = No] at rectangle3Pos + (-80 -175) in main

Placing text notes put Text with [text Al $m gt 0 n gt 0$] at (3000 00) in main put Text with [text A2 $c=mgtO d=ngtO$] at (3000 -340) in main put Text with [text $a=b=O a=b=l$] at (3000 -460) in main put Text with [text A3 $am + bn = d am + b$]

at (3000 -740) in main put Text with [text = $0 leq r lt d gcd(dc) g$]

at (3000 -860) in main put Text with [text = A4 $am + bn d = gcd(m n)$]

at (3000 -1200) in main put Text with [text = A5 $am + bn d am + b$]

at (3000 -1540) in main put Text with [text = $0 lt r lt d gcd(cd) = g$]

at (3000 -1660) in main put Text with [text = A6 $am + bn = d am + b$]

at (3000 -1940) in main put Text with [text = $gcd(c d) = gcd(m n)$]

at (3000 -2060) in main

(2500 00)-(2000 -50)-(1500 -150)-gt(00 -200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -400)-(2000 -450)-(1500 -650)-gt(00 -700) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -800)-(2000 -850)-(1500 -1150)-gt(00 -1200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2200 -1200)-(2000 -1200)-(1500 -1250) -gtrectangle3Pos + (900 00) with [startingTangent = (-10 00) endingTangent (-10 -10)]

(2250 -1600)-(2000 -1700)-(1500 -1900) -(1000 -1750)-gt(00 -1700) with [startingTangent = (-10 00) endingTangent (-10 00)]

(2250 -2000)-(1500 -2200)-gt(00 -2400) with [startingTangent = (-10 00) endingTangent (-10 00)]

108

~-- Al m gt On gt O

A2 c = m gt 0 d = n gt 0 a = b = 0 a = b = 1

A3 am + bn = dam + bdeg~ T lt dgcd(dc) = 9 E2

_--- A4 am + bn = d = gcd(m n)

A5 am + bn = dam + b Sto 0lt T lt dgcd(cd) = 9

Cf- d d f- T A6 am + bn = d am + bE4 t f- a a f- a a f- t - qa gcd(cd) =gcd(mn)t f- b b f- b b f- t - qb

primitive static sin javalangMath sin primitive static cos javalangMath cos primitive static sqrt javalangMath sqrt

fun ellipseCangle length width) return Clength cosCangle 20 31415 3600)

width sinCangle 20 31415 3600))

fun ellipseDeriveCangle length width) length2 = length length width2 = width width sinus = sinCangle 31415 1800) sinus2 = sinus sinus cosinus = cosCangle 31415 1800) cosinus2 = cosinus cosinus x = -10 Clength sinus)

sqrtCwidth2 cosinus2 + length2 sinus2) y = Cwidth cosinus) sqrtCwidth2 cosinus2 + length2 sinus2) return Cxy)

avail = Text with [text=AVAIL] link = Text with [text=LINKCP)] t = Text with [text=T]

109

put avail at ellipse(900 1000 500) in main put t at ellipse(1800 1000 500) in main put link at ellipse(OO 1000 500) in main

(ellipse(70 1000 500))-(ellipse(450 1000 500)) -gt(ellipse(750 1000 500))

(ellipse(1050 1000 500))-(ellipse(1350 1000 500)) -gt(ellipse(1730 1000 500))

(ellipse(1930 1000 500))-(ellipse(2700 1000 500)) -gt(ellipse(3550 1000 500))

AVAIL

~ T LINK(P)

primitive static sin javalangMatb sin primitive static cos javalangMatb cos

fun circular(angle radius) return (radius cos(31415 angle 1 1800)

radius sin(31415 angle 1 1800))

circleradius = 400 circle = Circle with [radius=100] g Text with [text=G] r = Text with [text=R] y Text with [text=Y]

put circle at (circular(300 circleradius)) in main put r at (circular(300 circleradius)) in main put circle at (circular(900 circleradius)) in main put r at (circular(900 circleradius)) in main put circle at (circular(1500 circleradius)) in main put g at (circular(1500 circleradius)) in main put circle at (circular(2100 circleradius)) in main put g at (circular(2100 circleradius)) in main put circle at (circular(2700 circleradius)) in main

110

put g at (circular(2700 circleradius)) in main put circle at (circular(3300 circleradius)) in main put y at (circular(3300 circleradius)) in main

(circular(450 circleradius))-(circular(600 circleradius)) -gt(circular(750 circleradius))

(circular(1050 circleradius))-(circular(1200 circleradius)) -gt(circular(1350 circleradius))

(circular(1650 circleradius))-(circular(1800 circleradius)) -gt(circular(1950 circleradius))

(circular(2250 circleradius))-(circular(2400 circleradius)) -gt(circular(2550 circleradius))

(circular(2850 circleradius))-(circular(3000 circleradius)) -gt(circular(3150 circleradius))

(circular(3450 circleradius))-(circular(OO circleradius)) -gt(circular(150 circleradius))

put Text with [text=tinyNEXTR] at (circular(900 circleradius)) + (00 150) in main

put Text with [text=tinyNEXTG] at (circular(-900 circleradius)) + (00 -150) in main

put Text with [text=tinyCURRENT] at (circular(-300 circleradius))+ (1~0 -150) in main

NEXTR

NEXTG

fun left(d)

return 016 coord of west in drectangle + 084 coord of east in drectangle

fun right(d)

return 016 coord of east in drectangle +

111

084 coord of west in drectangle

rectanglel = Rectangle with [length=600 width=200) rectangle2 = Rectangle with [length=200 width=200) circle = Circ le with [radius=10) put rectanglel in form rectangle = put rectangle2 in form put circle at (-200 00) in form put circle at (200 00) in form

dl = put form at (00 00) in main d2 = put form at (-600 -500) in main put Text with [text=IA) at (-600 -500) in main d3 = put form at (-1200 -1000) in main put Text with [text=IB) at (-1200 -1000) in main d4 = put form at (-1800 -1500) in main put Text with [text=ID) at (-1800 -1500) in main d5 = put form at (-600 -1500) in main put Text with [text=IE) at (-600 -1500) in main d6 = put form at (00 -1000) in main put Text with [text=IC) at (00 -1000) in main d7 = put form at (600 -1500) in main put Text with [text=f) at (600 -1500) in main d8 = put form at (-400 -2000) in main put Text with [text=IG) at (-400 -2000) in main dg = put form at (300 -2000) in main put Text with [text=IH) at (300 -2000) in main dl0 = put form at (1000 -2000) in main put Text with [text=JI) at (1000 -2000) in main

(left(dl))-gt(coord of north in d2rectangle) (right(dl))-gt(coord of east in dlrectangle + (00 50)) (left(d2))-gt(coord of north in d3rectangle) (right(d2))-gt(coord of north in d5rectangle) (left(d3))-gt(coord of north in d4rectangle) (right(d3))-gt(coord of south in d2rectangle) (left(d4))-gt(coord of west in dlrectangle + (00 50)) (right(d4))-gt(coord of south in d3rectangle) (left(d5))-gt(coord of north in d6rectangle) (right(d5))-gt(coord of north in d7rectangle) (left(d6))-gt(coord of south in d2rectangle) (right(d6))-gt(coord of north in d8rectangle)

112

(left(d7raquo-gt(coord of north in d9rectangle) (right(d7raquo-gt(coord of north in dl0rectangle) (left(dSraquo-gt(coord of south in d6rectangle) (right(d8raquo-gt(coord of south in d5rectangle) (left(d9raquo-gt(coord of south in d5rectangle) (right(d9raquo-gt(coord of south in d7rectangle) (left(dl0raquo-gt(coord of south in d7rectangle) (right(dl0raquo-gt(coord of south in dlrectangle + (100 00raquo

put Text wi th [text=List head] at coord of north in dlrectangle + (00 50) in main

circle = Circle with [radius = 100] bigcircle = Circle with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvasl put circle at 050 150) in canvasl put Text with [text = H] at 050 150) in canvasl put circle at (-150 150) in canvasl put Text with [text J] at (-150 150) in canvasl put Text with [text = B] at (00 -150) in canvasl

put bigcircle in canvas2

113

put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = Fil] at (150 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = liE] at (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvasl at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = Ali] at (00 -300) in main put bigellipse in main

A

fun drawBinaryTree(d s 0 dh dv n)

put s at a in d put 0-(0 + (-10 dh -10 dvraquo in d put 0-(0 + (db -10 dvraquo in d if (n == 1)

then return 0 else drawBinaryTree(d sa + (-10 dh -10 dv) db 20 dv n - 1) drawBinaryTree(d s a + (db -10 dv) db 20 dv n - 1) end

(0000)--(0000)

114

orlgln = (00 00) dv = 200 dh = 1000 bullet = Circle with [radius = 20) drawBinaryTree(main bullet origin dh dv 7)

bullet = Circle with [radius = 20] put bullet in main put bullet at (-300 -300) in main put bullet at (-600 -600) in main put bullet at (00 -600) in main put bullet at (300 -300) in main

(00 00)--(-300 -300) (00 00)--(300 -300) (-300 -300)--(-600-600) (-300 -300)--(00 -600)

(-100 00)-(-500 -300)-(-650 -650)-(-300 -400)shy(50-650)-(00-500)-(-150-300)-(-100 -200)shy(00-100)-(250-320)-(350-350)shy(320 -270)-gt(100 00)

circlel Circle with [radius 100]

lL5

circle2 = Circle with [radius = 120] ellipse = Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (100 0 500) in main d3 put form at (1000 -500) in main put Text with [text I$N(p_1)$] at (1000 1000) in main put Text with [text I$N(p_2)$] at (1000 500) in main put Text with [text dots] at (100 0 o 0) in main put Text with [text $N(p_n)$] at (1000 -500) in main

put Text with [text $S_O$] at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

sa

fun dropMany(f n s v c) for i from 10 to n do

put f at (s + (i - 10) v) in c

116

end

square = Square with [length=200] changeVec = (00 -200) dropMany(square 40 (00 00) changeVec main) dropMany(square 30 (500 00) changeVec main) dropMany(square 10 (1000 00) changeVec main) dropMany(square 10 (1500 00) changeVec main) put Text with [text=IO] at (00 00) in main put Text with [text=ll] at (00 -200) in main put Text with [text=13] at (00 -400) in main put Text with [text=17] at (00 -600) in main put Text with [text=bf ail] at (500 200) in main put Text with [text=12] at (500 00) in main put Text with [text=14] at (500 -200) in main put Text with [text=17] at (500 -400) in main put Text with [text=17] at (1000 00) in main put Text with [text=bf $a~b~+$] at (1500 200) in main put Text with [text=18] at (1500 00) in main put Text with [text=none ] at (2000 00) in main

(120 100)-gt(380 100) (620 100)-gt(880 100) (112 0 10 0) - gt(138 0 10 0) (1620 100)-gt(1880 100)

a ab+

~ -m-0-0-none 7

put Text with [text=IS] in main put Text with [text=A] at (00 -200) in main put Text with [text=B] at (00 -400) in main put Text with [text=$alpha$] at (-600 -600) in main put Text with [text=$beta$] at (-300 -600) in main put Text with [text=$gamma$] at (00 -600) in main put Text with [text=$y$] at (300 -600) in main put Text with [text=$z$] at (600 -600) in main

117

(-50 -50)--(-700 -540)--(-500 -540) (50 -50)--(700 -540)--(500 -540) (-50 -250)--(-400 -540)--(-200 -540) (50 -250)--(400 -540)--(200 -540) (-50 -450)--(-100 -540)--(100 -540)--(50 -450)

put Text with [text=D] in main

put Text with [text=T] at (-500 -500) in main put Text with [text=bf real] at (-500 -900) in main put Text with [text=4] at (-350 -500) in main put Text with [text= type] at (-150 -500) in main

put Text with [text=L] at (500 -500) in main put Text with [text=inh] at 050 -500) in main put Text with [text=5] at (350 -500) in main put Text with [text=6] at (650 -500) in main put Text with [text=entry] at (850 -500) in main

put Text with [text=bf $id_3$] at (900 -900) in main put Text with [text=bf ] at (500 -900) in main put Text with [text=3] at 0050 -900) in main put Text with [text=entry] at 0350 -900) in main

put Text with [text=L ] at (00 -1000) in main put Text with [text=inh] at (-350 -1000) in main put Text with [text=7] at (-150 -1000) in main put Text with [text=8] at 050 -1000) in main put Text with [text=entry] at (350 -1000) in main

put Text with [text=bf ] at (00 -1400) in main put Text with [text=bf $id_2$] at (400 -1400) in main put Text with [text=2] at (550 -1400) in main put Text with [text=entry] at (750 -1400) in main

put Text with [text=L] at (-500 -1500) in main

118

put Text with [text=inh] at (-850 -1500) in main put Text with [text=19] at (-650 -1500) in main put Text with [text=110] at (-350 -1500) in main put Text with [text= ent ry] at (-150 -1500) in main

put Text with [text=bf $id_l$] at (-500 -1900) in main put Text with [text=ll] at (-350 -1900) in main put Text with [text= ent ry ] at (-150 -1900) in main

(-100 -100)--(-400 -400) (-500 -600)--(-500 -800) (100 -100)--(400-400) (500 -600)--(500 -800) (600 -600)--(800 -800) (400 -600)--(100 -900) (100 -1100)--(400 -1300) (00 -1100)--(00 -1300) (-100 -1100)--(-400 -1400) (-500 -1600)--(-500 -1800)

(-300 -400)-(00 -300)-gt(300 -400) (400 -600)-(500 -650)-gt(600 -600) (950 -800)-gt(700 -600) (300 -600)-gt(-50 -900) (-100 -1100)-(00-1150)-gt(100 -1100) (450 -1300)-gt(200 -1100) (-200 -1100)-gt(-550 -1400) (-550 -1500)-(-500 -1550)-gt(-450 -1500) (-350 -1800)-gt(-350 -1600)

119

D

~ T 4 type inh 5 L 6 entry

entryrL ~~3 inh 7 L 8 entry

~2entrY inh 9 JJ lOentry

1 t id l 1 entry

circle = Circle with (radius=100J bigcircle = Circle with (radius=SOOJ

cl put circle at (00 200) c2 put circle at (200 00) c3 put circle at (-200 00) c4 put circle at (00 -200) bcl = put bigcircle in graphl

cS = put circle at (00 200) c6 = put circle at (00 -200) bc2 = put bigcircle in graph2

c7 put circle at (00 lS0)

in graphl in graphl in graphl in graphl

in graph2 in graph2

in graph3 c8 put circle at (200 -200) in graph3 c9 put circle at (-200 -200) in graph3 bc3 = put bigcircle in graph3

gl put graphl in main g2 put graph2 at (-1000 -1500) in main g3 put graph3 at (1000 -1000) in main

1 lines in first drawing (coord of anglePoint(900) in mainglc4)-gt

(coord of anglePoint(2700) in mainglcl) (coord of anglePoint(1800) in mainglcl)-gt

(coord of anglePoint(900) in mainglc3) (coord of anglePoint(OO) in mainglcl)-gt

120

(eoord of anglePoint(900) in maingle2) (eoord of anglePoint(2700) in maingle3)-gt

(eoord of anglePoint(1800) in maingle4) (eoord of anglePoint(2700) in maingle2)-gt

(eoord of anglePoint(OO) in maingle4)

(eoord of anglePoint(2700) in maingle3)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(1800) in maingle4)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(OO) in maingle2)shy(eoord of anglePoint(3450) in mainglbel)

lines in seeond drawing (eoord of anglePoint(2700) in maing2e5)-gt

(eoord of anglePoint(900) in maing2e6) erdl = eoord of anglePoint(1800) in maing2e6 erd2 = eoord of anglePoint(1800) in maing2e5 erdl-((erdl + erd2)20 + (-200 00))-gterd2

(eoord of anglePoint(900) in maing2e5)shy(eoord of anglePoint(900) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(450) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(OO) in maing2be2)

(eoord of anglePoint(OO) in maing2e6)shy(eoord of anglePoint(OO) in maing2be2)

lines in third drawing (eoord of anglePoint(1800) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e9) (eoord of anglePoint(OO) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e8) (eoord of anglePoint(OO) in maing3e9)-gt

(eoord of anglePoint(1800) in maing3e8) crd3 = eoord of anglePoint(OO) in maing3e8 erd4 = eoord of anglePoint(900) in maing3e7 erd3-(erd3 + erd4) 20 + (200 200)-gterd4

erd4--(eoord of anglePoint(1050) in maing3be3) (eoord of anglePoint(1800) in maing3e7)-shy

(eoord of anglePoint(1850) in maing3be3) (coord of anglePoint(1800) in maing3e9)-shy

121

(coord of anglePoint(1750) in maing3bc3)

lines between drawings (coord of anglePoint(2250) in mainglbcl)-gt

(coord of anglePoint(900) in maing2bc2) (coord of anglePoint(3450) in mainglbcl)-gt

(coord of anglePoint(1050) in maing3bc3) (coord of anglePoint(OO) in maing2bc2)-gt

(coord of anglePoint(1850) in maing3bc3) crd5 = coor~ of anglePoint(1750) in maing3bc3 crd6 = coord of anglePoint(450) in maing2bc2 crd5-(crd5 + crd6) 20 + (000 300)-gtcrd6

Texts crdTextl coord of anglePoint(1350) in mainglbcl + (-200 00) crdText2 = coord of anglePoint(1350) in maing2bc2 + (-100 100) crdText3 = coord of anglePoint(450) in maing3bc3 + (100 100) put Text with [text=$R_l$] at crdTextl in main put Text with [text=$R_2$] at crdText2 in main put Text with [text=$R_3$] at crdText3 in main

primitive getClip sddlhierarchyDrawing clip primitive setVisible sddlhierarchyShape setVisible

122

1 clip takes 3 drawings and a canvas first is a line second and third are two shapes which intersect line will draw a line between the intersection points the line creates with the two shapes 1

fun clip(dl d2 d3 canvas)

dlsetVisible(false) drawl = put dl in canvas cl = drawlgetClip(d2) c2 = drawlgetClip(d3) put cl--c2 in canvas

circle Circle with [radius=100] dl = put circle in main put Text with [text=14] in main d2 = put circle at (-400 -400) in main put Text with [text=13] at (-400 -400) in main d3 = put circle at (-700 -800) in main put Text with [text=12] at (-700 -800) in main d4 = put circle at (400 -400) in main put Text with [text=18] at (400 -400) in main d5 = put circle at (150 -800) in main put Text with [text=17] at 050 -800) in main d6 = put circle at (650 -800) in main put Text with [text=110] at (650 -800) in main d7 = put circle at (220 00) in main put Text with [text=14] at (220 00) in main d8 = put circle at (620 -400) in main put Text with [text=18] at (620 -400) in main dg = put circle at (370 -800) in main put Text with [text=7] at (370 -800) in main dl0 = put circle at (00 -1200) in main put Text with [text=5J at (00 -1200) in main

Il = (00 00)--(-400 -400) clip(ll dl d2 main) 12 = (-400 -400)--(-700 -800) clip(12 d2 d3 main) 13 = (00 00)--(400 -400) clip(13 dl d4 main) 14 = (400 -400)--(150 -800)

123

clip(14 d4 d5 main) 15 = (400 -400)--(650 -SOO) clip(15 d4 d6 main) 16 = (220 00)--(-400 -400) clip(16 d7 d2 main) 17 = (220 00)--(620 -400) clip(17 d7 dS main) lS = (620 -400)--(650 -SOO) clip(lS dS d6 main) 19 = (620 -400)--(370 -SOO) clip(19 dS d9 main) 110 = (370 -800)--(00 -1200) clip(110 dg d10 main)

2

5

fun niceArrow(c dMain dLeft dRight) firstPoint = coord of southwest in dMainrectangle + (30 30) secondPoint = coord of southeast in dMainrectangle + (-30 30)

firstEnd = coord of north in dLeftrectangle secondEnd = coord of north in dRightrectangle

put firstPoint-gtfirstEnd in c put secondPoint-gtsecondEnd in c

point1 firstPoint 50 60 + secondPoint 10 60 point2 firstPoint 40 60 + secondPoint 20 60 point3 firstPoint 30 60 + secondPoint 30 60 point4 firstPoint 20 60 + secondPoint 40 60 point5 firstPoint 10 60 + secondPoint 50 60

put (coord of southwest in dMainrectangle + (-25 25))shy(coord of south in dMainrectangle + (00 -50))shy

124

(coord of southeast in dMainrectangle + (25 25)) in c

put pointl--(pointl + (-1 0 30 -10 70)) in c put point2--(point2 + (-1 0 10 -10 85)) in c put point3--(point3 + (00 -10 90)) in c put point4--(point4 + (1 0 -10 85)) in c put point5--(point5 + (30 -1 0 70)) in c

put Text with [text=smallt] at point3 + (00 -130) in c

rect = Rectangle with [length=300 width=200] r = put rect in main put Text with [text=ll] in main rectangle = put rect in form put Text with [text=$t-l$] in form

dl = put form at (-1400 -500) in main dll = put form at (-2000 -1000) in main dlr = put form at (-800 -1000) in main dlll put form at (-2300 -1500) in main dllr put form at (-1700 -1500) in main dlrl put form at (-1100 -1500) in main dlrr put form at (-500 -1500) in main

dr = put form at (1400 -500) in main drr = put form at (2000 -1000) in main drl = put forro at (800 -1000) in main drrr put form at (2300 -1500) in main drrl put form at (1700 -1500) in main drlr put form at (1100 -1500) in main drll put form at (500 -1500) in main

put Text with [text=l root[T]] at (-300 300) in main (-300 240)-gt(coord of north in mainr)

dots = Text with [text=dots] put dots at (-1400 -1000) in main put dots at (-2000 -1500) in main put dots at (-SOO -1500) in main put dots at (1400 -1000) in main put dots at (2000 -1500) in main put dots at (800 -1500) in main

125

(coord of southwest in mainr + (30 30))-gt (coord of north in maindlrectangle)

(coord of southeast in mainr + (-30 30))-gt (coord of north in maindrrectangle)

niceArrow(main dl dll dlr) niceArrow(main dll dlll dllr) niceArrow(main dlr dlrl dlrr) niceArrow(main dr drl drr) niceArrow(main drl drll drlr) niceArrow(main drr drrl drrr)

root[T]

rect = put Rectangle with [length=600 width=200l in form put Rectangle with [length=200 width=200] at (200 00) in form bullet = put Circle with [radius=10] at (200 00) in form

put Text with [text=IF] in main

fl put form at (700 00) in main f2 put form at (1500 00) in main f3 put form at (2300 00) in main f4 put form at (3100 00) in main

(coord of anglePoint(OO) in mainflbullet)-gt (coord of west in mainf2rect)

(coord of anglePoint(OO) in mainf2bullet)-gt (coord of west in mainf3rect)

(coord of anglePoint(OO) in mainf3bullet)-gt (coord of west in mainf4rect)

126

ptW = coord of west in mainflrect ptE = coord of east in mainf4rect

ptW + (-300 OO)-gtptW ptE + (300 OO)-gtptE

put Text with [text=R] at (3800 00) in main

ptS = coord of anglePoint(2700) in mainf4bullet ptS2 = ptS + (00 -350)

ptS--ptS2 ptS2 + (-50 00)--ptS2 + (50 00) ptS2 + (-35 -20)--ptS2 + (35 -20) ptS2 + (-20 -40)--ptS2 + (20 -40)

BIBLIOGRAPHIE

Adobe Systems Incorporated 1994 PostScript Language Reference Manual http j jwwwadobecomjproductsjpostscriptjpdfsjPLRMpdf

-- 2006 PDF Reference Version 17 Adobe Systems Incorporated 6th eacutedition

-- 201Oa Adobe Postscript 3 http j jwwwadobecomjproductsjpostscriptj

2010b PDF Developer Corner PDF Reference http j jwwwadobecomjdevnetjpdfjpdLreferencehtm1

Aho A V R Sethi et J D Ullman 1986 Compilers Principles Techniques and Tools Addison-Wesley

American Mathematical Society 2008 Why Do We Recommend LaTeX http j jwwwamsorgjpublicationsjauthorsjtexjlatexbenefits

Apple Computer Inc 1996 The TrueType Reference Manu al Apple Computer Inc Cupertino California

Bourgeois M 2010 Introduction to Drawing Diagrams with SDDL httpj jrivershyvalley tvjintroduction-to-drawing-structured-diagrams-in-sddlj

Bourgeois M et R Villemaire 201Oa laquoDrawing Structured Diagrams with SDDL raquo

TUGBoat vol 31 no 2 p 206-210

-- 201Ob SDDL http j jwwwinfo2uqamca-villemaireJjRecherchejSDDLj

Bowman J C 2007 laquoThe 3D Asymptote Generalization of Metapost Beacutezier Interposhylation raquo Proceedings in Applied Mathematics and Mechanics

Chomsky N 1956 laquoThree Models for the Description of Language raquo Information Theory IRE Transactions on vol 2 no 3 p 113-124

Cormen T A C E Leiserson R L Rivest et C Stein 2001 Introduction to Algoshyrithms The MIT Press

Davis M R Sigal et E Weyuker 1994 Computability Complexity and Languages Pundamentals of Theoretical Computer Science Morgan Kaufmann

Dhu D-Z et K-I Ko 2000 Theory of Computational Complexity Wiley

Gagnon Eacute 1998 laquoSableCC an Object-Oriented Compiler Framework raquo Meacutemoire de maicirctrise McGill University

128

-- 2009 ObjeetMacro - SableCC httpsableccorgwikiObjectMacro

Group O M 1999 Unified Modeling Language (version 13) Rapport Object Manashygement Group

Hammerlindl A J Bowman et T Prince 2010a Asymptote httpasympshytotesourceforgenet

-- 20lOb Asymptote The Veetor Graphies Language httpasympshytotesourceforgenet asymptote pdf

Hobby J 1992 laquo A Users Manual for MetaPost raquo Computing Science Technical Report vol 162

International Organization for Standardization 2008 Document Management - Elecshytronic Document File Format for Long-Term Preservation - Part 1 Use of PDF 14 (PDF A-1) ISO 19005-1 2005

Jr F S H et S M Kelley 2007 Computer Graphics using GpenGL Prentice-Hall 3e eacutedition

Knuth D 1968 The Art of Computer Programming Addison-Wesley

-- 1984 The TeXbook Reading Mass Addison-Wesley

-- 1986 The Metafontbook Reading Mass Addison-Wesley

-- 1999 Digital Typography Stanford California Center for the Study of Language and Information

Lamport L et D Bibby 1986 LATEX A Document Preparation System T 260 Citeseer

Lancaster D 2005 Approximating a Circle or an Ellipse using Four Bezier Cubic Splines Rapport Synergetics

Maplesoft 2010 Maple 14 User Manual

McNaughton R et H Yamada 1960 laquoRegular Expressions and State Graphs for Automata raquo -IRE Transactions on Electronic Computers no l p 39-47

Object Management Group 2009 UML httpwwwumlorgj

Oracle 2010 Java httpwwwjavacomj

Pierce B C 2002 Types and Programming Languages MIT Press

Riskus A 2006 laquoApproximation of a Cubic Bezier Curve by Circular Arcs and Vice Versa raquo Information Technology and Control vol 35 no 4 p 371-378

Rose K H 2008 XY-pic Home Page httptugorgapplicationsjXy-picj

129

Rose K H et al 2010 laquoXY-pic Users Guide raquo DIKU Universiteacute de Copenhague vol 1

Rumbaugh J M Blaha W Premerlani F Eddy et W Lorensen 1991 ObjectshyOriented Modeling and Design Prentiee-Hall

Saunders J H 1989 laquoA Survey of Objeet-Oriented Programming Languages raquo JOOP Journal of Object-Oriented Programming vol 1

Sabel J et D Friedman 1996 An Introduction to Refiection-Oriented Programming San Francisco Reflection 96

TeX Users Group 2009 MetaPost - TeX User Groups httptugorgmetaposthtml

TIOBE Software 2008 Tiobe Index httpwwwtiobecomindexphpcontentshy paperinfo tpeiindexhtml

Ullman J J Hopcroft et R Motwani 1979 Introduction to Automata Theory Lanshyguages and Computation Addison-Wesley

Van Zandt T 1993a PSTricks-PostScript Macros for Generie TEX httpwwwtexuniyaracrudocpsLugpdf

-- 1993b laquoPSTricks PostScript Macros for Generie 1EX Users Guide raquo Version 093 a http jjwww tug orgjapplicationsjPSTricks

Page 2: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux

UNIVERSITEacute DU QUEacuteBEC Agrave MONTREacuteAL Service des bibliothegraveques

Avertissement

La diffusion de ce meacutemoire se fait dans lei respect des droits de son auteur qui a signeacute le formulaire Autorisation de reproduire et de diffuser un travail de recherche de cycles supeacuterieurs (SDU-522 - Reacutev01-2006) Cetle autorisation stipule que laquoconformeacutementagrave larticle 11 du Regraveglement no 8 des eacutetudes de cycles supeacuterieurs [lauteur] concegravede agrave lUniversiteacute du Queacutebec agrave Montreacuteal une licence non exclusive dutilisation et de publication qe la totaliteacute ou dune partie importante de (son] travail de recherche pour des fins peacutedagogiques et non commerciales Plus preacuteciseacutement (lauteur] autorise lUniversiteacute du Queacutebec agrave Montreacuteal agrave reproduire diffuser precircter distribuer ou vendre des copies de (son] travail de recherche agrave des fins non commerciales sur quelque support que ce soit y compris lInternet Cetle licence et cetle autorisation nentraicircnent pas une renonciation de (la] part [de lauteur] agrave (ses] droits moraux ni agrave (ses] droits de proprieacuteteacute intellectuelle Sauf entente contraire [lauteur] conserve la liberteacute de diffuser et de commercialiser ou non ce travail dont [il] possegravede un exemplaireraquo

REMERCIEMENTS

Un projet dune telle envergure naurait pas eacuteteacute possible sans un soutien constant

Je ne peux donc suffisamment remercier mon directeur M Roger Villemaire pour le

support quil ma fourni pendant ces trois anneacutees Ce meacutemoire ne serait pas entre vos

mains sans son aide

Je voudrais aussi remercier M Eacutetienne Cagnon pour ses nombreuses ideacutees qui ont

faccedilonneacute SDDL de maniegravere significative ainsi que pour les nombreuses gaffes concepshy

tuelles quil ma empecirccheacute de commettre

Je ne peux eacutevidemment passer sous silence les membres de la communauteacute 01EX

particuliegraverement ceux de la confeacuterence TUC 2010 qui mont accueilli malgreacute mon inshy

expeacuterience et qui mont fourni de preacutecieux commentaires et suggestions en rapport avec

mon projet Je voudrais remercier John Bowman pour son travail sur Asymptote ainsi

que Karl Berry pour linteacuterecirct deacutemontreacute envers mon projet et pour ses suggestions pour

mon article Eacutevidemment il est impossible de remercier les membres de 01EX sans

remercier au passage le grand gourou Donald Knuth sans qui ce meacutemoire serait difficishy

lement preacutesentable

Je remercie vivement la fondation de lUniversiteacute du Queacutebec agrave Montreacuteal ainsi que

le Fonds Queacutebecois de la Recherche sur la Nature et les Technologies pour leur support

financier durant les diffeacuterentes phases de mon projet Merci davoir cru en mon projet

ainsi quen moi-mecircme

Finalement je voudrais remercier mes parents Suzie et Yves ainsi que ma conjointe

Annie pour leur support inconditionnel ainsi que pour laide incroyable quils mont

fournie sans neacutecessairement sen rendre compte

TABLE DES MATIEgraveRES

LISTE DES FIGURES IX

REacuteSUMEacute XI

INTRODUCTION 1

CHAPITRE 1 PROBLEacuteMATIQUE ET OBJECTIFS 7

11 Description de la probleacutematique 7

111 Les notes de cours une mise en contexte 7

112 Domaine dapplication eacutelargi 8

12 Description des objectifs rechercheacutes 9

121 Inteacutegration avec JbTEX 9

122 Description de structures 10

123 Hieacuterarchie solide et extensible 10

124 Objectifs moindres 10

13 Analyse des solutions existantes 11

131 Paquets JbTEX standards 12

132 XY-pic 13

133 Metapost 14

134 Asymptote 15

135 Conclusion de lanalyse 17

14 Diagrammes repreacutesentatifs du domaine 18

141 Lapproche de Knuth 19

142 Description des exemples et des concepts preacutesents dans les diagrammes 20

CHAPITRE II STRUCTURE ET SOLUTION INFORMATIQUE 21

21 Objectifs dune structure dans une solution informatique 21

211 Les diffeacuterentes composantes dune solution informatique 21

vi

212 Consideacuterations pour une meacutethodologie de deacuteveloppement 23

22 La programmation orienteacutee-objet 24

221 Concepts de bases 24

222 Diffeacuterence avec la programmation baseacutee-objet 25

23 Meacutethode pour la conceptualisation dune hieacuterarchie 25

231 Origine de la meacutethode 26

232 Les diffeacuterentes eacutetapes de conceptualisation 26

24 Deacuteveloppement de la hieacuterarchie 27

241 Extraction des diffeacuterents concepts 27

242 Eacuteleacutements particuliers 27

CHAPITRE III EacuteLEacuteMENTS GRAPHIQUES 31

31 Courbes et segments en informatique 31

32 Courbes de Beacutezier 32

321 Deacutefinition 32

322 Deacutefinition alternative 33

323 Proprieacuteteacutes dune courbe de Beacutezier- 34

324 Deacutesavantages des courbes de Beacutezier 36

33 Splines cubiques 36

34 Le cas dun cercle 38

35 Structures informatiques dans les solutions deacutejagrave existantes 41

351 Postscript et PDF 42

352 Asymptote 43

CHAPITRE IV THEacuteORIE DES LANGAGES INFORMATIQUES 45

41 Theacuteorie des langages et automates 45

411 Les eacuteleacutement rie base dun langage (Aho Sethi et Ullman 1986) 46

412 Expressions reacuteguliegraveres 46

413 Automates 48

414 Lien entre langage reacutegulier et automate fini 51

vii

42 Grammaires 52

421 Deacutefinition dune grammaire formelle 52

422 Hieacuterarchie de Chomsky 54

423 Utiliteacute dans les langages de programmation 55

43 SableCC 56

431 Quest-ce que SabieCC 56

432 Avantages de SabieCC 56

44 Langage reacuteflexif 57

441 Deacutefinition dun langage reacuteflexif 57

442 Avantages 57

443 Deacutesavantages 58

CHAPITRE V MISE EN OEUVRE DE LA SOLUTION 59

51 Eacuteleacutements de langage en SDDL 59

511 Impleacutementation de la hieacuterarchie 59

512 Grammaire 60

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage 61

52 Reacutealisation en Java 63

521 Traverseacutee de larbre grammatical et exeacutecution 63

522 Deacutefinition dobjets quelconques 64

523 Gestion des erreurs 65

524 Structures de support 66

53 Accegraves agrave Postscript PDF et gTEX 66

531 Postscript 66

532 PDF 67

533 g1EX- 68

534 Geacuteneacuteration du code Asymptote 68

CHAPITRE VI REacuteALISATION DES DIAGRAMMES EN SDDL 71

61 Analyse du code des diagrammes existants 71

Vlll

611 Rappel des objectifs cruciaux agrave observer

612 Diagramme de compilation

613 Diagramme de tableau

614 Diagramme de Venn

62 Preacutesentation du produit final

621 Statistiques et documentation

622 Preacutesentation

623 Site web

63 Conclusion de notre analyse

CONCLUSION

APPENDICE A PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

APPENDICE B PREacuteSENTATION DE LA GRAMMAIRE DE SOOL

APPENDICE C PREacuteSENTATION DE LA HIEacuteRARCHIE

APPENDICE D PREacuteSENTATION DES DIAGRAMMES CHOISIS

BIBLIOGRAPHIE

72

73

75

78

79

80

80

81

81

83

85

91

97

105 shy

127

LISTE DES FIGURES

Figure Page

11 Code XY-pic pour un diagramme 14

12 Diagramme reacutesultant du code XY-pic 14

13 Code Metapost pour dessiner un triangle 15

14 Diagramme reacutesultant du code Metapost 15

15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin 16

16 Diagramme reacutesultant du code Asymptote 16

31 Courbes de Beacutezier lineacuteaire quadratique et cubique 34

32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier 38

33 Quart de cercle approximeacute par une courbe de Beacutezier 39

34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence 41

41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b 49

51 Extrait de la grammaire de SDDL pour une instruction 61

52 Code Java et SDDL pour calculer une combinaison lineacuteaire 63

53 Code reacuteflexif pour creacuteer une forme quelconque 65

54 Code pour geacuteneacuterer du code Asymptote pour un cercle 69

61 Diagramme dautomate de compilation 73

62 Code pour le diagramme dautomate 74

63 Diagramme de tableau 76

64 Code pour le diagramme de tableau 77

65 Diagramme de Venn 78

x

66 Code du diagramme de Venn 79

REacuteSUMEacute

Dans ce meacutemoire nous analysons la description de diagrammes structureacutes dans le domaine des matheacutematiques discregravetes et de linformatique theacuteorique Cette analyse seffectue agrave partir de meacutethodes eacutetablies du geacutenie logiciel Nous trouvons un ensemble de proprieacuteteacutes que nous recherchons dans une solution informatique nous permettant de creacuteer ces diagrammes Nous analysons aussi les outils classiques agrave partir des proprieacuteteacutes preacuteceacutedentes qui nous permettent de reacutealiser ces diagrammes dans un environnement I51EX Nous observons que ces outils ne sont pas aussi puissants quils le pourraient en fonction des proprieacuteteacutes eacutetablies par notre analyse

Par la suite en nous basant sur les meacutethodes de repreacutesentation graphique des courbes et sur la theacuteorie des langages informatiques nous jetons les bases dun lanshyguage de description Nous preacutesentons aussi un outil deacuteveloppeacute en Java qui nous pershymet de deacutecrire aiseacutement nos diagrammes dinformatique theacuteorique et de matheacutematiques discregravetes agrave partir dune hieacuterarchie dobjets claire et extensible Nous avons impleacutementeacute les eacuteleacutements essentiels de notre langage en SDDL (Structured Diagram Description Lanshyguage) Nous lavons aussi valideacute agrave laide dexemples repreacutesentatifs tireacutes de sources daushytoriteacute Nous avons finalement preacutesenteacute notre solution dans le cadre de la confeacuterence TUG 2010 Nous lavons aussi preacutesenteacute avec un article dans la revue du TeX Users Groups TUG

Mots cleacutes diagrammes informatique theacuteorique matheacutematiques discregravetes langage

INTRODUCTION

Le logiciel de mise en page de document U1EX est devenu llne reacutefeacuterence pour la creacuteation

de documents matheacutematiques (American Mathematical Society 2008) Plusieurs raisons

suscitent cet inteacuterecirct une structure naturelle permettant de repreacutesenter clairement ses

ideacutees le formatage automatique de qualiteacute et un reacutesultat final de qualiteacute professionnelle

agrave un coucirct moindre

Un traiteacute matheacutematique peut contenir plusieurs types dobjets textes formules grashy

phiques diagrammes etc Dans le cas preacutesent nous nous inteacuteressons principalement agrave

la repreacutesentation de diagrammes Par diagramme on entend un dessin qui possegravede une

structure discregravete sous-jacente (souvent combinatoire mais pas obligatoirement) Un

exemple simple serait un graphe ou un arbre

Agrave partir du moment ougrave nous nous inteacuteressons agrave ces diagrammes et agrave leur repreacutesentation

il devient inteacuteressant de voir ce que U1EX nous fournit afin de geacuteneacuterer des structures

de qualiteacute En effet les diagrammes sont essentiels agrave la transmission effective des ideacutees

et des reacutesultats en informatique et en matheacutematiques discregravetes De plus la consistance

nous oblige agrave chercher agrave faire nos diagrammes agrave partir dun modegravele coheacuterent Entre

autres il nous faut conserver la mecircme police dans les diagrammes et dans le texte

en plus davoir accegraves aux symboles matheacutematiques Nous pourrions aussi importer des

diagrammes exteacuterieurs agrave U1EX mais les reacutesultats obtenus ne serait pas consistant avec

le texte Nous devons donc chercher agrave obtenir une meacutethode de repreacutesentation adeacutequate

pour nos diagrammes

Bien sucircr il existe deacutejagrave plusieurs solutions agrave ce problegraveme Il nous faut donc les analyser

avec soin avec des critegraveres formels Cela implique de reacutepertorier les diffeacuterents paquets

U1EX permettant de faire du dessin avec leurs diffeacuterentes proprieacuteteacutes Il faut ensuite

2

ajouter les logiciels qui utilisent JbTEX indirectement donc qui nen font pas partie

mais sen servent tout de mecircme Cela nous donne une vue densemble complegravete des

solutions deacutejagrave existantes agrave notre problegraveme

Ensuite avant de penser agrave analyser ces solutions nous devons deacuteterminer ce que nous

voulons exactement Agrave cette fin nous avons analyseacute le processus qua utiliseacute Donald

Knuth creacuteateur de TEX agrave la base de Jb1EX afin de mateacuterialiser son logiciel de formatage

Nous devons aussi utiliser un ensemble de contraintes agrave soumettre agrave nos diffeacuterentes

solutions Il eacutetait essentiel dutiliser Jb1EX pour le formatage du texte mais aussi pour

la clarteacute deacutecriture la qualiteacute de la documentation et la capaciteacute de creacuteer aiseacutement des

structures Par la suite il devient aiseacute et tregraves formel danalyser chacunes des diffeacuterentes

solutions proposeacutees

Malheureusement cette analyse nous a permis de constater quaucune solution neacutetait

suffisamment bonne pour satisfaire nos besoins La plupart des paquets eacutetaient trop

simples alors que plusieurs eacutetaieentiernt composeacutes de macros rendant la veacuterification de

code quasi impossible Quelques solutions (telles que XY-Pic (Rose 2008) Metapost

(TeX Users Group 2009) et Asymptote (Hammerlindl Bowman- et Prince 2010a))

fournissaient de nombreuses ideacutees inteacuteressantes mais aucune ne convenait parfaitement

agrave nos besoins Nous en sommes donc venus agrave la conclusion que la meilleure solution

serait de creacuteer notre propre solution tout en reacuteutilisant les ideacutees deacuteveloppeacutees par les

solutions preacuteceacutedentes

Afin de creacuteer une solution robuste nous avons deacutecideacute de creacuteer une hieacuterarchie orienteacutee obshy

jet afin de repreacutesenter les diffeacuterentes structures du domaine des matheacutematiques discregravetes

et de linformatique theacuteorique Cela se justifie par le fait que les hieacuterarchies objets aushy

delagrave de leurs avantages possegravedent des meacutethodes de conceptualisation formelles et bien

deacutefinies Nous avons utiliseacute la meacutethode favoriseacutee par James Rumbaugh (Rumbaugh

et al 1991) un des creacuteateurs de UML (Object Management Group 2009)

Ce processus demande en tout premier lieu une analyse du domaine afin dobtenir les

structures principales Par la suite les liens entre les diffeacuterentes classes sont analyseacutes en

3

fonction des besoins respectifs Finalement apregraves plusieurs iteacuterations et simplifications

cette meacutethode foumit une hieacuterarchie complegravete Par contre elle doit par la suite ecirctre

adapteacutee aux speacutecificiteacutes du langage dimpleacutementation

Notre hieacuterarchie a eacuteteacute deacuteveloppeacutee autour de plusieurs concepts importants Certains

sont naturellement lieacutes au domaine dutilisation Par exemple un point est une structure

naturelle pour la description de positions dans un diagramme Le mecircme raisonnement

sapplique pour des formes geacuteomeacutetriques de base comme le cercle le carreacute et lellipse

Certains objets sont des simplifications de concepts communs Par exemple un point

abstrait est un point qui peut ecirctre deacutetermineacute de maniegravere absolue ou relative Une forme

est une classe de base repreacutesentant lensemble des objets qui peuvent ecirctre dessineacutes Il

existe aussi un dessin qui repreacutesente une forme agrave un endroit particulier

Bien que cela pourrait deacuteterminer complegravetement notre domaine afin davoir une hieacuteshy

rarchie complegravete il faut inclure certains eacuteleacutements de structure Par exemple bien que

nous puissions deacuteterminer assez aiseacutement ce quest un cercle la maniegravere de le deacutecrire

pour ecirctre dessineacute nest pas aussi simple Il en est de mecircme pour des formes courbes

plus complexes ainsi que des courbes de maniegravere geacuteneacuterale car un ordinateur ne peut pas

repreacutesenter aiseacutement toutes formes de chemin Nous pouvons creacuteer un concept geacuteneacuteral

de chemin mais celui-ci doit se ramener agrave la reacutealiteacute dun ordinateur

Cela est deacutetermineacute en analysant deux choses le format de document PDF et la desshy

cription de chemin dAsymptote Le premier utilise des splines cubiques comme eacuteleacutement

de base pour deacutecrire les courbes dans un document Cest inteacuteressant mais limitatif

Asymptote de son cocircteacute prend une description complexe mais preacutecise dune courbe et

en deacuteduit un ensemble de splines cubiques quil est possible de placer dans un docushy

ment PDF ensuite Nous en concluons que le bon chemin agrave prendre est probablement

dimpleacutementer comme structure de base des chemins tels que deacutecrits par Asymptote

avec une structure de splines cubiques

Par contre certaines questions theacuteoriques surviennent lors de cette analyse Le grand

problegraveme relegraveve de la puissance dexpression des splines cubiques En effet nous verrons

4

que les splines cubiques sont puissantes mais pas suffisamment puissantes pour deacutecrire

un cercle une forme geacuteomeacutetrique pourtant extrecircmement simple Nous verrons par contre

par la suite quil est possible de deacutecrire ce mecircme cercle avec des splines cubiques avec

une preacutecision acceptable pour la creacuteation de documents papier malgreacute son inexactitude

Afin dadapter la hieacuterarchie un langage dimpleacutementation a ducirc ecirctre choisi Eacutetant donneacute

les contraintes de temps il fucirct deacutecideacute de reacuteutiliser un langage de description de diashy

grammes deacutejagrave existant Asymptote Lutilisation de ce langage nous permet dobtenir

des primitives simples et un accegraves agrave Jb1EX deacutejagrave deacutetermineacute ce qui diminue de beaucoup la

charge de travail De plus Asymptote nous permet de creacuteer nos images reacutesultantes dans

les formats Postscript (Adobe Systems Incorporated 2010a) et PDF (Adobe Systems

Incorporated 2010b) sans avoir agrave reacutealiser nous-mecircmes du code de tregraves bas niveau

Eacutevidemment si Asymptote fournissait tout ce dont nous avions besoin nous naurions

pas besoin dutiliser autre chose Par contre cest un langage baseacute sur les structures

(Hammerlindl Bowman et Prince 201Ob) au lieu des objets Cela implique que notre

hieacuterarchie ne peut ecirctre construite agrave laide de lheacuteritage objet Eacutetant donneacute la complexiteacute

que cela engendrerait un langage suppleacutementaire doit-ecirctre utiliseacute pour-la creacuteation de

la hieacuterarchie Cela nous amegravene donc agrave choisir Java (Oracle 2010) Une recherche de la

compagnie TIOBE considegravere Java comme eacutetant le langage le plus utiliseacute au moment de

la preacutesente reacutedaction (TIOBE Software 2008)

Avant de consideacuterer le deacuteveloppement dun nouveau langage la premiegravere chose agrave faire

consiste agrave consideacuterer ce agrave quoi nous voulons quil ressemble Afin de reacutealiser cette eacutetape

nous avons analyseacute notre base de diagrammes en donnant une description la plus proche

possible dun langage de programmation En simplifiant chaque description autant que

possible nous avons pu extraire quelques concepts de base importants pour la descripshy

tion de nos diagrammes De plus certaines contraintes suppleacutementaires peuvent ecirctre

ajouteacutees qui deacutependent plus de limpleacutementation que de la theacuteorie En quelque sorte

il faut pour reacutealiser notre projet nous baser sur des technologies qui ont fait leurs

preuves

5

Afin de deacutevelopper notre langage il nous faut des concepts pour le deacutecrire Cela sefshy

fectue agrave laide de la theacuteorie des langages et des automates Plus particuliegraverement nous

utiliserons les grammaires afin de faccedilonner un langage qui convient agrave nos besoins tout en

eacutetant simple agrave analyser par un programme informatique agrave laide dun logiciel speacutecialiseacute

SabieCC (Gagnon 1998) Nous verrons que les grammaires nous permettent de deacutecrire

complegravetement notre langage afin decirctre analyseacute par ordinateur

Une fois que nous avons notre langage final il ne reste plus quagrave veacuterifier les reacutesultats

obtenus Afin de boucler la boucle nous avons reacutealiseacute la programmation de chacun des

diagrammes que nous avions choisis au deacutepart pour notre base de tests Une fois ceuxshy

ci reacutealiseacutes il ne restait plus quagrave analyser les diffeacuterences entre les deux et voir si les

reacutesultats obtenus eacutetaient satisfaisants Cela nous permet de deacutemontrer quil sagit dune

solution naturelle et efficace eacutetant donneacute que nous pouvons creacuteer les objets de notre

domaine pour produire des diagrammes de grande qualiteacute

Le reste de ce meacutemoire est structureacute comme suit Le chapitre 1 expose la probleacutematique

et les objectifs rechercheacutes Le chapitre 2 introduit la creacuteation de notre solution inforshy

matique et plus speacutecifiquement de la hieacuterarchie objet Le chapitre 3 deacutecrit la theacuteorie

matheacutematique derriegravere la description de courbes et segments par ordinateur Le chapitre

4 expose les dessous de la theacuteorie des langages que nous utilisons afin de creacuteer SOOL

Le chapitre 5 expose la creacuteation du langage au-dessus de la hieacuterarchie Finalement le

chapitre 6 analyse le reacutesultat final afin de voir si le tout reacutepond aux objectifs deacutefinis au

deacutepart

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CHAPITRE l

PROBLEacuteMATIQUE ET OBJECTIFS

Dans ce chapitre nous nous eacutetendrons sm une deacutefinition correcte et complegravete de la

probleacutematique ainsi que sur les objectifs que nous souhaitons atteindre Nous verrons

aussi une analyse des solutions qui existent deacutejagrave et les raisons qui nous poussent agrave

deacutevelopper notre propre solution Finalement nous deacutefinirons une base de diagrammes

aptes agrave repreacutesenter adeacutequatement nos objectifs

11 Description de la probleacutematique

111 Les notes de cours une mise en contexte

Ce projet fut motiveacute principalement par la reacutedaction de notes de cours En effet

dans un milieu universitaire (particuliegraverement pour les eacutetudiants au baccalaureacuteat mais

eacutegalement pour les eacutelegraveves de cycles supeacuterieurs) il est extrecircmement utile de pouvoir

utiliser des notes de cours de quali teacute

La creacuteation de notes de cours adapteacutees vient tout de mecircme avec quelques problegravemes

Premiegraverement surtout en informatique la plupart des livres sont eacutecrits en anglais Cela

implique souvent de devoir eacutecrire nos propres versions sous la forme de notes de cours

De plus linformatique est un domaine qui eacutevolue agrave un rythme fulgurant Cela implique

que des notes adeacutequates et adapteacutees doivent ecirctre agrave jour Comme certains eacuteleacutements en

informatique peuvent eacutevoluer agrave chaque anneacutee voire plus vite il faut ecirctre capable deacutecrire

extrecircmement rapidement des textes si nous souhaitons quils soient utiles un tant soit

8

peu

Cela nous amegravene agrave notre probleacutematique principale plusieurs cours neacutecessitent un supshy

port plus complexe que simplement des mots agrave savoir des dessins et des diagrammes

voire des animations Cela est requis dans plusieurs cours en informatique theacuteorique

particuliegraverement dans leacutetude des structures de donneacutees et des algorithmes Il nous faut

donc une meacutethode rapide et efficace pour creacuteer des diagrammes agrave placer dans nos notes

de cours

112 Domaine dapplication eacutelargi

Bien eacutevidemment cibler purement les notes de cours et les structures de donneacutees nest

quun point de deacutepart Nous pouvons eacutelargir notre domaine dapplication agrave des diashy

grammes structureacutes cest-agrave-dire un dessin qui possegravede une structure sous-jacente crushy

ciale au point de pouvoir necirctre deacutecrit quagrave partir de cette structure Par exemple

un graphe est un ensemble de sommets eacutetiqueteacutes relieacutes ensemble par des flegraveches Tout

dessin de graphe est donc un dagramm~ selon notye deacutefiniton Dun_autre cocirct~ une

peinture possegravede parfois une structure mais celle-ci est largement insuffisante pour

deacutecrire loeuvre Par exemple pertgtonne noserait deacutecrire un Picasso comme eacutetant un

amas de cercles et de carreacutes de diffeacuterentes couleurs

Lensemble des structures que nous visons se rapporte donc essentiellement agrave deux

domaines linformatique theacuteorique et les matheacutematiques discregravetes Linformatique

theacuteorique est surtout deacutefinie par les structures de donneacutees et les algorithmes (et tout

sujet sy reliant) Les matheacutematiques discregravetes sont surtout deacutefinies par la theacuteorie des

graphes et la combinatoire Nous neacutegligeons ici volontairement les matheacutematiques contishy

nues pour deux raisons La premiegravere est quune structure de taille infinie peut souvent

ecirctre repreacutesenteacutee par une structure finie (donc discregravete) La seconde est que les besoins

en matheacutematiques continues sont largement diffeacuterents des besoins en matheacutematiques

discregravetes En effet dessiner le graphe dune fonction de deux variables est un sujet comshy

plexe mais totalement diffeacuterent de creacuteer un graphe Afin de rendre nos besoins plus

9

speacutecifiques nous eacuteviterons ce genre de dessins qui possegravedent deacutejagrave de nombreux logiciels

pour les reacutealiser (entre autres Maple) (Maplesoft 2010)

12 Description des objectifs rechercheacutes

La premiegravere partie de notre travail consiste agrave deacutecrire les objectifs que nous souhaitons

atteindre dans notre creacuteation de diagrammes En effet plusieurs paramegravetres importants

peuvent ecirctre utiliseacutes Il est donc important de ne pas perdre de vue lensemble tout en

donnant la prioriteacute agrave certains eacuteleacutements

121 Inteacutegration avec ~IEX

Ib1EX est un langage de description de documents texte Creacuteeacute agrave lorigine sous la forme

de TEX par Donald Knuth (Knuth 1984) puis modifieacute par Leslie Lamport (Lamport

et Bibby 1986) celui-ci est rapidement devenu un standard dans la reacutedaction darticles

scientifiques dans plusieurs domaines Bien quutiliseacute surtout pour la reacutedaction darticles

il a eacuteteacute preacutevu au deacutepart pour la reacutedaction de livres Il se distingue par sa capaciteacute agrave

creacuteer aiseacutement du contenu matheacutematique et le fait de soccuper du contenu en laissant

le logiciel soccuper de la mise en page du texte Il est si populaire que de nombreux

meacutemoires incluant celui-ci sont eacutecrits agrave partir de Ib1EX

Eacutetant donneacute que le monde des matheacutematiques et de linformatique theacuteorique utilise

abondamment Ib1EX il est important quun logiciel de creacuteation de diagrammes pershy

mette de lutiliser En effet si notre objectif est de creacuteer du contenu de qualiteacute professhy

sionnelle il faut que les polices soient constantes au travers de notre article (ou de nos

notes de cours) Naturellement plusieurs diagrammes vont contenir du texte Il faut

donc pour ecirctre consistant geacuteneacuterer ce texte avec Ib1EX afin davoir une forme standard

pour lensemble du document De plus il est tout agrave fait possible de vouloir mettre des

symboles matheacutematiques dans un diagramme (par exemple un symbole dinteacutegrale) Si

le texte est geacuteneacutereacute avec Ib1EX cela vient automatiquement Sinon il devient tregraves difficile

dobtenir un texte de belle qualiteacute Il sagit donc dun besoin primordial

10

122 Description de structures

Un autre eacuteleacutement extrecircmement important que nous recherchons est de pouvoir faire

adeacutequatement la description de diffeacuterentes structures Eacutetant donneacute que les diagrammes

sont composeacutes de structures il faut pouvoir en creacuteer aiseacutement et les relier de maniegravere

aiseacutee Cela implique quelques petites contraintes entre autres de pouvoir utiliser des

variables pour conserver les structures en question Ideacutealement la solution la plus solide

en terme de description de structures utiliserait lorienteacute-objet Une des composantes

les plus importantes dune solution orienteacutee objet est la preacutesence dune hieacuterarchie de

classes dobjets

123 Hieacuterarchie solide et extensible

Un objectif que nous recherchons est que le langage nous fournisse une hieacuterarchie dobshy

jets (ou de structures) de qualiteacute afin de pouvoir creacuteer une grande quantiteacute de diashy

grammes agrave partir deacuteleacutements de cette hieacuterarchie Une hieacuterarchie peut ecirctre deacutecrite comme

eacutetant une structure permettant dinteacutegrer facilemen~ de nouveau~ aspects sans_avoir agrave

dupliquer inutilement du code Il serait aussi important quelle puisse ecirctre eacutetendue si cershy

tains eacuteleacutements suppleacutementaires sont neacutecessaires Par exemple il pourrait ecirctre inteacuteressant

pour des gens en geacutenie eacutelectrique de pouvoir faire des diagrammes eacutelectriques malgreacute

le fait que cela ne fait pas partie de nos contraintes de deacutepart Cela pourrait ecirctre ajouteacute

par extension du systegraveme

124 Objectifs moindres

Gestion des erreurs

Dans des notes de cours il est freacutequent davoir des diagrammes Par contre eacutecrire

un diagramme peut saveacuterer plus compliqueacute que deacutecrire du texte Comme plusieurs

utilisateurs potentiels ne seront pas des experts du systegraveme il faut que les erreurs soient

deacutetecteacutees et traiteacutees de maniegravere adeacutequate Cela assure agrave lutilisateur final une expeacuterience

11

plaisante en speacutecifiant les erreurs quil commet et des meacutethodes pour les reacuteparer Sil

faut que lutilisateur cherche pendant des heures pour trouver la petite erreur quil a

commise il va tout simplement cesser dutiliser le logiciel

Langage fluide et clair

Bien que moins important le fait davoir un langage clair est excellent pour attirer les

utilisateurs vers ce systegraveme En effet si le langage est un gribouillis incompreacutehensible il

sera fort probablement dur dapprentissage et difficile agrave aborder Par fluide et clair nous

entendons que le langage soit jusquagrave un certain point compreacutehensible pour quelquun

qui ne connaicirct pas le systegraveme

Qualiteacute de la documentation et courbe dapprentissage

Finalement il faut quune documentation existe et quelle soit complegravete De preacutefeacuterence

une bonne documentation contiendra un reacutepertoire de toutes les fonctionnaliteacutes mais

aussi des tutoriels avec des exemples codeacutes de cas standards Cela incite les utilisateurs

agrave essayer le logiciel en prenant un exemple et en ladaptant agrave leurs besoins Cela amegravene

(avec les autres objectifs) agrave un langage simple dapprentissage mais tout de mecircme

puissant Comme notre objectif est de trouver une solution simple il faut que nimporte

qui puisse commencer agrave sen servir rapidement sans avoir besoin de lire lensemble de

la documentation

13 Analyse des solutions existantes

Naturellement une fois que nous savons ce que nous recherchons il nous faut analyser

toutes les solutions qui existent deacutejagrave Cela nous permettra didentifier une solution qui

est deacutejagrave fonctionnelle ou au mieux une qui pourra ecirctre eacutetendue ou utiliseacutee afin de

simplifier le travail de creacuteation si besoin est Au minimum nous pourrons extraire les

concepts inteacuteressants de chaque solution et voir sil est possible de les inteacutegrer agrave notre

solution

12

131 Paquets f1TEX standards

Eacutetant donneacute limportance de lutilisation de JbIEX les premiegraveres solutions sont celles

disponibles agrave linteacuterieur mecircme de fbIEX Celles-ci sont appeleacutees des paquets Plusieurs

paquets diffeacuterents existent et bon nombre dentre eux sont des solutions bricoleacutees et

donc incomplegravetes

Dans les solutions inteacuteressantes on note premiegraverement la preacutesence de la commande

picture Celle-ci a eacuteteacute ajouteacutee dans TEX par Donald Knuth comme tme solution agrave tout

oubli potentiel dans son systegraveme Cette commande prend du texte quelconque et le passe

par la suite au pilote qui compile le document Cela permet entre autres de transfeacuterer

des informations au pilote qui compile en Postscript et permet donc lutilisation de toute

la force de Postscript dans la reacutedaction de dessin Un gros problegraveme de cette solution

est que le texte agrave eacutecrire deacutepend du pilote utiliseacute limitant de beaucoup son utilisation

Il est tout de mecircme devenu la base de nombreux paquets qui se servent de Postscript

Plusieurs solutions ont aussi eacuteteacute deacuteveloppeacutees pour toutes sortes de domaines On retrouve

entre autres des-diagrammes de-Peynmann et deuml Lewis (feyn et-lewis) des dia-grammes

de flots (nassflow) et des arbres linguistiques (xyling rst qtree et lingtrees)

Naturellement ces solutions ne conviennent pas car elles sont pour des domaines trop

speacutecifiques par rapport agrave notre objectif

Une solution dun domaine plus geacuteneacuteral qui se deacutemarque est le paquet PSTricks (Van

Zandt 1993a) Creacuteeacute en 1993 par le professeur Timothy Van Zandt celui-ci est devenu

tregraves populaire au fil des anneacutees eacutetant donneacute les nombreuses possibiliteacutes qui existent en

Postscript Un des grands avantages est sa documentation qui est tregraves prolifique et tregraves

claire (Van Zandt 1993b)

Cela est bien inteacuteressant mais malheureusement PSTricks souffre du mecircme problegraveme

que chaque paquet interne agrave JbTEXmiddot Il est fait agrave partir de macros En effet TEX a eacuteteacute eacutecrit

complegravetement agrave partir de macros Il sagit dlm meacutecanisme de remplacement textuel ougrave

lon deacutefinit une entreacutee et toutes les occurrences de cette entreacutee sont remplaceacutees par une

13

sortie bien speacutecifique Comme une macro est toujours remplaceacutee par son contenu avant

decirctre analyseacutee plus en deacutetail toute forme derreur se retrouve agrave un niveau extrecircmement

bas Cela fait que nimporte quelle erreur est quasi impossible agrave cerner correctement

rendant le travail de lutilisateur qui souhaite apprendre tregraves complexe De plus le fait

de fournir le Postscript directement agrave lutilisateur rend celui-ci tregraves puissant mais tregraves

dangereux Finalement bien que de nombreuses formes soient disponibles il nexiste

pas de hieacuterarchie en tant que telle dans PSTricks ce qui le rend impossible agrave eacutetendre

132 )(J(-pic

Une autre solution inteacuteressante peut ecirctre retrouveacutee agrave linteacuterieur de gTEX Il sagit

de XV-pic un paquet eacutecrit par Kristoffer H Rose (Rose et al 2010) Ce paquet

a eacuteteacute creacuteeacute speacutecifiquement pour la description de diagrammes agrave linteacuterieur de gTEX

et possegravede une documentation exhaustive Malheureusement cette documentation est

extrecircmement complexe mecircme pour un utilisateur avanceacute XV-pic utilise principalement

des boicirctes gTEX positionneacutees agrave diffeacuterents endroits afin de creacuteer les diagrammes Ceuxshy

ci sont par la suite relieacutes par diffeacuterents objets puis deacutecoreacutes Cela fournit un reacutesultat

final de qualiteacute XV-pic possegravede entre autres un mode pour creacuteer des diagrammes en

positionnant les eacuteleacutements dans une matrice Cela rend les dessins plus simples concepshy

tuellement mais pas toujours positionneacutes adeacutequatement XV-pic permet aussi de faire

du positionnement relatif agrave dautres objets ce qui peut ecirctre tregraves pratique Comme nous

pouvons le voir dans lexemple suivant XV-pic est tregraves pratique dans les reacutesultats quil

nous permet dobtenir mais sa syntaxe laisse de beaucoup agrave deacutesirer

Par contre les deacutefauts de XV-pic sont extrecircmement visibles En premier lieu la syntaxe

du langage est extrecircmement difficile agrave comprendre car elle est baseacutee sur la composition

de nombreux caractegraveres speacuteciaux De plus comme il sagit dun paquet gTEX le tout

est impleacutementeacute agrave laide de macros et rend donc la recherche derreur laborieuse (surshy

tout lorsquon prend en compte la syntaxe deacutejagrave difficile agrave utiliser) Cela rend XV-pic

inapte agrave lutilisation par quelquun qui ne souhaite pas investir trop de temps dans son

apprentissage Finalement les nombreux modes de dessins sont souvent incompatibles

14

xymatrix U ar_[ddr]_y ar-[drr]-x

argt[dr] I-(xy) amp X times_Z y ar[d]-q ar[r]_p amp X ar[d]_f amp y ar[r]-g

amp Z

Figure 11 Code XY-pic pour un diagramme

Figure 12 Diagramme reacutesultant du code XY-pic

entre eux et ne peuvent souvent pas ecirctre utiliseacutes dans un mecircme dessin

133 Metapost

Eacutetant donneacute le problegraveme commun agrave tous les paquets agrave linteacuterieur de JgEX la solution la

plus logique serait dessayer den sortir Cela a donneacute le logiciel Metapost (Hobby 1992)

Celui-ci a eacuteteacute inspireacute de Metafont (Knuth 1986) que Knuth a utiliseacute pour dessiner des

polices pour EX Une des grandes avanceacutees du langage est la description de courbes

Celui-ci reacuteutilise un algorithme de Knuth qui permet de deacutecrire des courbes tout en

en controcirclant les diffeacuterents paramegravetres De plus comme le logiciel nest pas reacutedigeacute en

macros il permet de deacutetecter de maniegravere adeacutequate les erreurs de lusager Nous pouvons

deacutejagrave voir dans le code fourni en exemple quil sagit dun langage beaucoup plus clair

que XV-pic

15

beginfig(l)

pair A B C A=(OO) B=(lcmO) C=(Olcm) draw A--B--C--cycle

endfig

Figure 13 Code Metapost pour dessiner un triangle

Figure 14 Diagramme reacutesultant du code Metapost

Par contre quelques problegravemes se deacutegagent de Metapost Premiegraverement le langage ne

permet pas limpleacutementation dune hieacuterarchie solide Cela ne serait pas un problegraveme sil

en existait deacutejagrave une mais ce nest pas le cas En effet les diagrammes ont fait lobjet

dune extension du langage mais rien de tregraves deacuteveloppeacute Il est donc faisable de faire

des diagrammes mais il ne sagit pas neacutecessairement dune solution agrave toute eacutepreuve

De plus comme toutes les coordonneacutees du langage sont donneacutees en valeur absolue cela

limite les possibiliteacutes du langage (entre autres en ne pouvant utiliser des points deacutefinis

par des objets)

134 Asymptote

Une autre possibiliteacute se retrouve dans le logiciel Asymptote qui se deacutefinit comme eacutetant

Wl langage inspireacute de Metapost (Hammerlindl Bowman et Prince 2010b) Il est donc

aussi externe agrave g1EX mais aussi inspireacute du langage de programmation CH Cela lui

confegravere la creacuteation de structures avanceacutees et la creacuteation de fonctions complexes De

plus une documentation exhaustive et un traitement des erreurs de qualiteacute en font une

solution robuste

Malheureusement comme Metapost Asymptote pose quelques problegravemes En effet ce

16

size(3cm) draw(unitsquare) labelC l $A$ (00) SW)

labelC $B$ Cl 0) SE) label ($C$ Cl 1) NE)

label ($0$ (01) NW)

Figure 15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin

( )

il

Figure 16 Diagramme reacutesultant du code Asymptote

logiciel fut eacutecrit avec les matheacutematiques continues et la geacuteomeacutetrie comme domaine

dutilisation Ce nest pas Lill problegraveme en tant que tel (Asymptote le fait tregraves bien)

mais cela fait que la- creacuteation de diagrammes discrets nest pas vraiment deacuteveloppeacutee

Il faudrait donc ecirctre capable de creacuteer une hieacuterarchie de structures pour la creacuteation de

diagrammes Eacutetant donneacute le support des structures posseacutedant des fonctions internes il

devrait ecirctre possible dajouter cette possibiliteacute agrave Asymptote

Malheureusement ce nest pas preacutesentement reacutealisable agrave linteacuterieur du langage En efshy

fet Asymptote est un langage baseacute objet Cela signifie quil possegravede des structures qui

ressemblent agrave une description typique dun objet mais pas toutes les proprieacuteteacutes imshy

portantes qui se rattachent agrave un langage agrave objets standard comme Java ou C++ Plus

particuliegraverement cest labsence de polymorphisme qui cause problegraveme En effet la

creacuteation dune hieacuterarchie implique de creacuteer des liens entre les diffeacuterentes structures Par

exemple un cercle un triangle et un nuage sont toutes des formes avec certaines proshy

prieacuteteacutes similaires Il nous faut donc avoir des fonctions qui prennent des formes comme

paramegravetres Si nous avons une fonction f qui prend une forme nous souhaiterions eacutecrire

une seule fonction

17

fCforme)

Malheureusement en Asymptote il faudrait eacutecrire une fonction pour chaque forme

distincte comme cela

fCcercle)

fCcarre)

fCnuage)

Cela rend la creacuteation dune hieacuterarchie extrecircmement difficile car pour chaque fonction

utilisant un objet plus geacuteneacuteral il nous faut eacutecrire plusieurs fois cette fonction De plus

cela rend lexpansion par lusager de la hieacuterarchie essentiellement impossible car il doit

rajouter des cas pour chaque fonction deacutefinie preacuteceacutedemment en plus dajouter son nouvel

objet dans la hieacuterarchie Cela est difficilement souhaitable

135 Conclusion de lanalyse

Afin den venir agrave une conclusion adeacutequate il faut se ramener aux objectifs rechercheacutes

Cela nous permet de rapidement eacuteliminer les solutions internes agrave Ib-TEX eacutetant donneacute

la complexiteacute de la gestion des erreurs (et indirectement la courbe dapprentissage du

langage) Cela nous laisse comme solution Metapost et Asymptote Naturellement le

langage Asymptote est plus eacutevolueacute que celui de Metapost et fournit des eacuteleacutements de

programmation plus inteacuteressants Cela implique donc quil nous permet plus aiseacutement

de construire nos structures tant deacutesireacutees

Par contre Asymptote ne fournit pas une solution suffisante eacutetant donneacute quil ne possegravede

pas une hieacuterarchie dobjets adapteacutee aux diagrammes De plus eacutetant donneacute que le langage

est baseacute objet il sera beaucoup trop compliqueacute dy implanter une hieacuterarchie Nous en

venons donc agrave la conclusion que le mieux serait dutiliser Asymptote qui nous fournit un

ensemble de services complexes (impleacutementation des chemins liens avec Ib-TEX etc )

et de limpleacutementer avec un langage de plus haut niveau

18

Java devient un choix inteacuteressant pour cette tacircche En effet cest un langage connu dans

lindustrie et simple dapprentissage Il sagit dun langage de programmation objet qui

nous permettra agrave coup sucircr dimpleacutementer une hieacuterarchie solide Par contre ce langage

possegravede quelqu~s petits problegravemes comme un tregraves haut niveau de verbositeacute et beaucoup

deacuteleacutements non requis pour la description de diagrammes

Nous en sommes donc venus agrave la conclusion que la meilleure solution serait dutiliser

Java mais dimpleacutementer par-dessus celui-ci un langage deacutedieacute qui eacuteliminerait tout ce

qui nest pas requis pour la description des diagrammes Nous appellerons ce langage

SDDL pour Structured Diagram Description Language

Concepts inteacuteressants agrave conserver

Avant de penser agrave concevoir notre logiciel il serait bon de voir quels eacuteleacutements nous

souhaitons conserver des solutions existantes Agrave cette fin leacuteleacutement le plus inteacuteressant

provient de XV-Pic En effet il permet de relier des objets entre eux par des flegraveches

dune maniegravere relativement simple Il serait donc inteacuteressant de pouvoir permettre de

deacutecrire des liens entre diffeacuterents objets par des points speacutecifiques agrave chacun dentre eux

De plus lalgorithme de description de chemins utiliseacute par Metapost et Asymptote est

extrecircmement efficace et utile et pourrait donc ecirctre utiliseacute directement par notre langage

Cela sera simple agrave impleacutementer eacutetant donneacute que nous souhaitons utiliser Asymptote pour

compiler vers Postscript

14 Diagrammes repreacutesentatifs du domaine

Finalement avant de pouvoir commencer agrave deacutefinir les besoins de notre hieacuterarchie il

nous faut obtenir une deacutefinition valide et complegravete de notre domaine Naturellement

il nest pas eacutevident de trouver une deacutefinition concregravete et objective dun diagramme en

informatique theacuteorique Nous devons donc nous rabattre sur une autre solution qui doit

tout de mecircme ecirctre la plus formelle possible

19

141 Lapproche de Knuth

Pour trouver une ideacutee nous nous ramegravenerons agrave la meacutethode que Donald Knuth a utiliseacutee

lorsquil a creacuteeacute TEX En effet il souhaitait creacuteer un logiciel qui ferait de laquo beauxraquo doshy

cuments Cela eacutetant un terme tregraves subjectif Knuth deacutecida de se deacutefinir un ensemble

de journaux scientifiques dont les publications eacutetaient du plus haut standard de qualiteacute

pour leacutepoque (Knuth 1999) Apregraves avoir obtenu ces diffeacuterents exemples il put saffairer

agrave essayer de reproduire une solution de cette qualiteacute Il devient donc eacutevident agrave la fin

du cycle de deacuteveloppement du logiciel que sa solution eacutetait coheacuterente et valide car elle

permettait dobtenir un reacutesultat de qualiteacute en comparaison agrave ce que nous pourrions

deacutejagrave deacutefinir comme eacutetant de qualiteacute

Nous pouvons donc chercher agrave suivre la mecircme meacutethode Afin de la respecter nous devons

trouver quelques livres dun haut niveau de qualiteacute et prendre certains diagrammes

que lon retrouve agrave linteacuterieur Cela nous permettra de retrouver les eacuteleacutements les plus

cruciaux de notre domaine

Plusieurs livres inteacuteressants soffrent agrave nous nous utiliserons entre autres laquo The Art

of Computer Programming raquo de Donald Knuth (Knuth 1968) Il est naturel quun des

livres les plus connus en informatique eacutecrit par Knuth de surcroicirct possegravede un haut

standard de qualiteacute Un autre livre important est le laquo livre du dragonraquo (Aho Sethi et

Ullman 1986) qui eacutetudie la theacuteorie de la compilation et est extrecircmement connu dans

son domaine De plus celui-ci renferme leacutetude de nombreuses structures de donneacutees ce

qui nous fournit de nombreux diagrammes de qualiteacute Finalement il existe aussi un livre

tregraves connu dans leacutetude des algorithmes (ce qui est aussi extrecircmement lieacute agrave leacutetude des

structures de donneacutees) qui sappelle laquo Introduction to Algorithmsraquo (Cormen et al

2001) Ces trois livres forment une base extrecircmement connue et de qualiteacute pour nos

diagrammes Nous avons extrait quinze (15) diffeacuterents diagrammes de ces livres

20

142 Description des exemples et des concepts preacutesents dans les diagrammes

Les diffeacuterents diagrammes que nous avons seacutelectionneacutes repreacutesentent diffeacuterentes strucshy

tures de donneacutees On y retrouve plusieurs arbres et graphes Les graphes sont de plushy

sieurs types allant dun graphe standard agrave des graphes dexeacutecution De plus certaines

structures preacutesentes plus rarement se retrouvent dans notre ensemble Entre autres on

retrouve un diagramme de Venn qui bien que conceptuellement simple est toujours

relativement complexe lorsque nous souhaitons le reacutealiser avec un logiciel On retrouve

aussi des arbres linguistiques qui ne sont pas neacutecessairement complexes mais surtout

longs agrave reacutealiser

Cet ensemble de diagrammes nous permet de couvrir lensemble des structures de

donneacutees importantes en informatique theacuteorique et en matheacutematiques discregravetes Il existe

dautres structures de donneacutees mais celles-ci peuvent toujours ecirctre impleacutementeacutees seacutepashy

reacutement eacutetant donneacute que nous souhaitons faire une hieacuterarchie aiseacutement extensible Nous

remarquons surtout dans nos exemples quun des eacuteleacutements les plus importants est de

pouvoir r~lier convenablement les_diffeacuterents eacuteleacutements (dans un graphe par exemple)

Comme il sagit de quelque chose qui est toujours preacutesent il sagira dun des points les

plus importants agrave deacutevelopper pour notre hieacuterarchie

CHAPITRE II

STRUCTURE ET SOLUTION INFORMATIQUE

Afin de deacutevelopper un produit qui convient agrave nos besoins nous aurons besoin quil soit

structureacute adeacutequatement Cela implique principalement la construction de la hieacuterarchie

dobjets du domaine Il faut deacuteterminer quels sont les eacuteleacutements rechercheacutes dans notre

solution trouver une meacutethode de deacuteveloppement formelle et adeacutequate puis la reacutealiser

correctement Cela assurera une solution de qualiteacute

21 Objectifs dune structure dans une solution informatique

En premier lieu il nous faut justifier le besoin dune meacutethode de deacuteveloppement forshy

melle et solide En effet lin logiciel en informatique est tregraves diffeacuterent dun problegraveme

matheacutematique standard Une deacutemarche matheacutematique se ramegravene agrave un concept bien

connu la preuve Cela reurond la reacutesolution du problegraveme creacutedible agrave condition que la

preuve soit bonne Par contre nous verrons quun problegraveme informatique ne peut ecirctre

reacutesolu agrave laide dune simple preuve

211 Les diffeacuterentes composantes dune solution informatique

Une solution agrave un problegraveme informatique possegravede diffeacuterents eacuteleacutements Chacun dentre

eux possegravedent un certain degreacute de formalisme qui affecte lensemble de la solution

22

Algorithmes

Les algorithmes sont les eacuteleacutements les plus formels dune solution informatique On peut

dire quils se ramegravenent agrave la partie matheacutematique dun problegraveme informatique en quelque

sorte Composeacute dune seacuterie dopeacuterations aux comportements bien deacutefinis le reacutesultat dun

algorithme est preacutevisible Eacutetant donneacute la possibiliteacute de preacutevoir le comportement dun

algorithme agrave partir de ses entreacutees il est possible de deacutemontrer que lalgorithme fournit

exactement les reacutesultats rechercheacutes Il suffit en effet de prouver que agrave chaque entreacutee

possible on obtient la sortie qui serait logiquement attendue de lalgorithme On peut

penser par exemple agrave un algorithme de tri qui pour chaque ensemble de nombres

retourne les nombres en ordre croissant

Malgreacute tout un algorithme en informatique nest pas parfait En effet si le temps

dexeacutecution dun algorithme pour des entreacutees standards est beaucoup trop eacuteleveacute il ne

sera pas utiliseacute peu importe quil donne le bon reacutesultat Le temps dopeacuteration et la

quantiteacute despace meacutemoire sont les deux principales contraintes qui entrent en ligne de

compte pour les diffeacuterents algorithmes dune solution informatique

Solutions technologiques

Lautre partie extrecircmement importante de tout logiciel informatique est le choix des

technologies utiliseacutees En effet les programmes informatiques ne sont pas directement

creacuteeacutes agrave partir de circuit eacutelectriques Chaque couche dabstraction suppleacutementaire (cirshy

cuits logiques code assembleur programmation de haut niveau) limite les possibiliteacutes

du programmeur et vient avec certains avantages et certains inconveacutenients Le fait de

ne pas utiliser une solution deacutejagrave existante peut permettre une solution plus puissante

mais agrave un coucirct de deacuteveloppement potentiellement beaucoup plus eacuteleveacute Il est aussi posshy

sible avec un certain ensemble de choix technologiques de ne pas pouvoir obtenir un

effet rechercheacute dans une solution Cela explique pourquoi nous avons deacutecideacute dutiliser

Asymptote Il nous fournit un accegraves agrave JbTEX deacutejagrave codeacute ainsi quune traduction comshy

plexe vers un fichier image Postscript La reacutealisation de ces diffeacuterents eacuteleacutements de

23

code aurait significativement augmenteacute la complexiteacute de notre tacircche

Imperfection de toute solution informatique

Eacutetant donneacute les limitations des outils technologiques agrave notre disposition nous sommes

obligeacutes de constater que toute solution informatique est imparfaite De plus plusieurs

contraintes donneacutees agrave des systegravemes informatiques sont geacuteneacuteralement vagues et peuvent

ecirctre interpreacuteteacutees diffeacuteremment en fonction de lutilisateur Par exemple nous souhaitons

reacutealiser un outil simple dutilisation mais puissant et extensible Naturellement plus

un langage est puissant plus il devient complexe Un utilisateur peut trouver un outil

tregraves simple alors quun autre le trouvera incompreacutehensible Dautres points comme la

qualiteacute de documentation la courbe dapprentissage et lagestion aiseacutee des erreurs sont

des critegraveres qui possegravedent une bonne part de subjectiviteacute Ce ne sont toutefois pas

neacutecegravessairement de mauvais critegraveres Il faut simplement chercher selon une deacutefinition la

plus proche possible dun utilisateur moyen agrave maximiser les diffeacuterents paramegravetres

Ce genre de contraintes relegraveve geacuteneacuteralement du geacutenie logiciel Bien que ce meacutemoire ne

constitue pas un travail de geacutenie logiciel nous sommes obligeacutes demprunter quelques

eacuteleacutements agrave ce domaine afin dobtenir un reacutesultat adeacutequat

212 Consideacuterations pour une meacutethodologie de deacuteveloppement

Avant de choisir notre meacutethodologie il est bon de veacuterifier les objectifs rechercheacutes dans

lutilisation dune telle meacutethode de deacuteveloppement Cela nous permettra de deacutegager les

eacuteleacutements importants agrave garder en tecircte tout au long du deacuteveloppement de la hieacuterarchie

Un des eacuteleacutements les plus importants est dobtenir une structure efficace pour deacutecrire

nos diagrammes Lautre eacuteleacutement crucial est dobtenir une hieacuterarchie qui repreacutesente

adeacutequatement le domaine De preacutefeacuterence elle doit ecirctre complegravete et dun usage naturel

On entend par lagrave que les eacuteleacutements sont suffisamment preacutecis et proches deacuteleacutements stanshy

dards et connus du domaine que toutes les opeacuterations soient laquo naturellesraquo pour une

personne qui ne connaicirct pas le langage Il nexiste malheureusement pas de mesure pour

24

deacuteterminer si une hieacuterarchie est naturelle ou non Toutefois si chaque section est reacutefleacutechie

de maniegravere formelle le reacutesultat final devrait ecirctre naturel Certaines consideacuterations mishy

neures peuvent ecirctre plus ou moins mesureacutees comme la longueur du code et les noms

adeacutequats de fonctions

22 La programmation orienteacutee-objet

La programmation orienteacutee-objet est un des pheacutenomegravenes tregraves importants en informashy

tique Depuis sa creacuteation elle est devenue de plus en plus populaire eacutetant donneacute la faciliteacute

de deacuteveloppement dans une telle meacutethode Le fait dutiliser une solution orienteacutee-objet

(au contraire de Metapost ou Asymptote) ne sest pas fait de faccedilon arbitraire Il est

donc de mise dexposer les diffeacuterents avantages qui nous ont pousseacutes agrave choisir un tel

paradigme pour notre logiciel

221 Concepts de bases

La structure de base en programmation orienteacutee-objet est naturellement lobjet Celuishy

ci est deacutefini comme eacutetant une structure de donneacutees qui regroupe des donneacutees et des

meacutethodes (Saunders 1989) Bien quil ne sagit pas dun critegravere obligatoire la plushy

part des langages de programmation creacuteent les objets agrave partir dune classe qui deacutefinit

les diffeacuterents champs et meacutethodes preacutesents et leurs effets Les objets forment donc le

minimum requis pour avoir un langage objet

En tant que tel cet ensemble de concepts est assez minimaliste Il existe plusieurs autres

eacuteleacutements qui sont preacutesents agrave un degreacute plus ou moins grand dans les langages agrave objets

Ceux-ci forment donc en quelque sorte la base de la programmation orienteacutee-objet

(Pierce 2002)

- Lencapsulation des donneacutees cest-agrave-dire camoufler les donneacutees dans une structure

speacutecifique (lobjet)

- Lheacuteritage qui permet de deacutefinir un objet comme eacutetant une installce speacutecifique dun

autre objet On peut appliquer le mecircme raisonnement agrave deux classes On dit alors

25

quune classe heacuterite dune classe de base Celle-ci possegravede exactement le mecircme corps

que sa classe de base mais peut rajouter ou modifier certaines proprieacuteteacutes Il sagit

dun des aspects les plus importants dans le deacuteveloppement dune hieacuterarchie

- Le polymorphisme qui nous permet de creacuteer des proprieacuteteacutes qui varient en fonction

des sous-classes Par exemple une classe Nombre pourrait avoir une meacutethode daddishy

tion alors que ses sous-classes Entiegraveres et Reacuteelles redeacutefiniraient cette meacutethode en

fonction de leur impleacutementation speacutecifique Cela nous permet par la suite de prendre

deux nombres et de les additionner peu importe quil sagisse de reacuteels ou dentiers

222 Diffeacuterence avec la programmation baseacutee-objet

Les diffeacuterentes prioriteacutes eacutenumeacutereacutees ci-haut sont les eacuteleacutements de base qui nous permettent

de creacuteer une hieacuterarchie de qualiteacute Il sagit de la raison principale justifiant de ne pas

utiliser Asymptote pour creacuteer la hieacuterarchie En effet celui-ci est un langage baseacute-objet

La diffeacuterence principale est quun langage baseacute-objet ne neacutecessite pas limpleacutementation

de lheacuteritage ou du polymorphisme (Saunders 1989) Asymptote de son cocircteacute possegravede un

heacuteritage de structure minimal mais pas de polymorphisme Cette diffeacuterence est cruciale

car cet eacuteleacutement est neacutecessaire pour la creacuteation dune hieacuterarchie dans des contraintes

acceptables

En effet une chose importante est dajouter des objets dans les diagrammes Par

exemple supposons que nous avons une classe Conteneur Celui-ci doit pouvoir conteshy

nir des Cercles des Carreacutes des Triangles etc Sil fallait eacutecrire une fonction pour

ajouter chacune des formes le travail deviendrait eacutenormeacutement complexe et impossible

agrave eacutetendre pour lusager final Avec le polymorphisme il suffit deacutecrire une fonction qui

permet dajouter une Forme quelconque

23 Meacutethode pour la conceptualisation dune hieacuterarchie

Nous deacutecrirons ici la meacutethode que nous avons utiliseacute Il sagit de DMT (pour Dbj ect

Modeling Technique)

26

231 Origine de la meacutethode

Cette meacutethode fut deacuteveloppeacutee principalement par James Rumbaugh (mais avec laide de

plusieurs personnes) (Rumbaugh et al 1991) en 1991 Celui-ci est principalement connu

comme eacutetant un des auteurs de la norme UML qui est devenu le scheacutema de modeacutelisation

objet standard et utiliseacute par tous les programmeurs objets (Group 1999) Il est agrave noter

que cette meacutethode est une meacutethode danalyse complegravete pour toute la dureacutee de vie du

logiciel Nous naurons par contre besoin que de la partie analyse de cette meacutethode

232 Les diffeacuterentes eacutetapes de conceptualisation

La premiegravere partie de cette meacutethode a deacutejagrave eacuteteacute effectueacutee implicitement lorsque nous

avons rechercheacute nos diagrammes relatifs du domaine Habituellement il est suggeacutereacute

deacutecrire un texte reacutesumant lensemble du domaine mais dans notre cas il est plus

approprieacute de reacutesumer notre domaine avec des diagrammes Par la suite il faut prendre

le temps de faire ressortir les diffeacuterentes classes dobjets qui font parties du domaine et

prendre le temps de bien les deacutefini~middot On eacuteliminera les classes vagues ou redondantes par

la suite

La prochaine eacutetape consiste agrave deacutefinir les diffeacuterentes associations entre les classes Par

exemple une classe Employeacute et une classe Compagnie seraient lieacutees par lassociation

travaille pour Par la suite on identifie les attributs (ou les champs) des diffeacuterentes

classes en eacutevitant les attributs dimpleacutementation Finalement on raffine le modegravele en

ajoutant lheacuteritage des classes Cela permet de simplifier significativement la hieacuterarchie

Cela fournit une hieacuterarchie complegravete de notre domaine Par contre rien ne deacutemontre

quelle est correcte Afin de la veacuterifier il suffit danalyser les diffeacuterents cas typiques de

notre problegraveme regarder le reacutesultat obtenu et relever toute erreur Dans notre cas il

sagit de coder (seulement en terme de la hieacuterarchie) les diffeacuterents diagrammes et veacuterifier

si nous consideacuterons le tout satisfaisant Par la suite nous pourrons reacuteiteacuterer le mecircme

proceacutedeacute jusquagrave obtenir satisfaction Nous serons ainsi assureacutes davoir une hieacuterarchie

27

adapteacutee agrave notre domaine et complegravete

24 Deacuteveloppement de la hieacuterarchie

Maintenant que nous avons une meacutethodologie correcte nous pouvons creacuteer notre hieacutershy

archie Le fait de sassurer de sa compleacutetude nous permettra de ne pas rencontrer de

problegravemes complexes lors de la phase dimpleacutementation du logiciel

241 Extraction des diffeacuterents concepts

Les concepts du domaine (qui se ramegravenent agrave des classes) se divisent en plusieurs cateacuteshy

gories Une des principales est le domaine des formes Une forme peut ecirctre un carreacute

un cercle etc Une autre cateacutegorie importante est formeacutee des points qui peuvent ecirctre

deacutefinis de plusieurs maniegraveres diffeacuterentes Finalement une autre section importante est

formeacutee des structures de conteneurs incluant les Canvas (pour contenir des objets) et

des Drawing (pour reacutefeacuterencer des objets)

Eacutetant donneacute le nombre relativement faible de formes distinctes il ne nous est pas apparu

utile de faire plusieurs cateacutegories de formes distinctes En effet une seacuteparation entre les

courbes fermeacutees et ouvertes peut nous permettre de factoriser un ou deux eacuteleacutements de

code sans toutefois ecirctre significatif ou reacuteellement utile (eacutetant donneacute quil nexiste pas

vraiment de forme standard deacutefinie par une courbe ouverte)

242 Eacuteleacutements particuliers

Plusieurs eacuteleacutements particuliers se sont reacuteveacuteleacutes complexes agrave modeacuteliser dans notre hieacuterarshy

chie Nous abordons ici les principales difficulteacutes rencontreacutees ainsi que les solutions pour

les reacutegler

28

Creacuteation et placement dobjets

Leacuteleacutement le plus important de notre hieacuterarchie est de pouvoir structurer les objets

que nous souhaitons positionner Nous avons donc creacuteeacute une classe Canvas Le nom est

inspireacute du mot canevas en peinture eacutetant donneacute que nous avons apposeacute des restrictions

similaires agrave ce domaine En effet nous avons deacutecideacute que lorsquun objet est placeacute dans

un canevas il ne peut ecirctre enleveacute ou modifieacute Cela nous permettra plus tard de faire

des calculs pour les points de reacutefeacuterence plus aiseacutement De plus un canevas doit pouvoir

posseacuteder des sous-canevas Pour cela il nous faut une classe geacuteneacuterale qui deacutecrit tout

eacuteleacutement pouvant ecirctre ajouteacute dans un canevas

Cela est reacutesolu avec lintroduction dune classe Shape Celle-ci repreacutesente toute forme

qui peut ecirctre dessineacutee quelle soit simple ou complexe Un Canvas est une forme afin

de sassurer de pouvoir positionner des sous-canevas Une implication particuliegravere de

notre choix est quune Shape ne possegravede pas de position Il sagit dune forme abstraite

qui peut ecirctre positionneacutee agrave un certain endroit Cela implique aussi quil est possible de

prendre une Shape et de la placer agrave plusieurs end_roits distincts Lorsquelle est ajouteacutee

dans un Canvas une Shape est copieacutee ce qui empecircche toute modification subseacutequente

de la forme

Objets multiples

Lorsquil sagit de creacuteer des diagrammes freacutequemment il est tregraves probable que plusieurs

eacuteleacutements soient similaires Par exemple si nous creacuteons un arbre avec des cercles comme

sommets il sagit toujours en quelque sorte du mecircme cercle De plus si nous creacuteons

un sous-canevas et que nous le positionnons agrave plusieurs endroits certaines formes deshy

viennent automatiquement deacutedoubleacutes Il devient donc primordial pour nous de pouvoir

reacuteutiliser un eacuteleacutement que nous avons deacutejagrave deacutefini afin deacuteviter la creacuteation agrave reacutepeacutetition

dobjets

Or nous avons deacutejagrave speacutecifieacute quil eacutetait possible de positionner plusieurs fois le mecircme

29

objet Cela est vrai mais il y a une limitation En effet ces objets ne peuvent pas ecirctre

reacutefeacuterenceacutes Si nous souhaitons connaicirctre un objet celui-ci doit pouvoir ecirctre distingueacute

dun autre Il nous faut donc une classe qui repreacutesente une forme agrave un endroit preacutecis

Pour cela nous avons creacuteeacute la classe Drawing Celle-ci permet de repreacutesenter une Shape

agrave un endroit bien preacutecis dans un canevas Cela fait toutefois que les eacuteleacutements dans un

sous-canevas multiple restent identiques Nous verrons bientocirct la solution agrave ce problegraveme

Points de reacutefeacuterence

Un des eacuteleacutements les plus complexes relevait du fait de fournir des points de reacutefeacuterence

En effet faire de simples chemins entre des coordonneacutees en valeurs absolues neacutetait pas

suffisant mecircme sil est possible dadditionner ses points La solution souhaiteacutee eacutetait de

permettre de deacutefinir des points de reacutefeacuterence ceux-ci pouvant ecirctre obtenus agrave partir de

lobjet lui-mecircme Par exemple un cercle pourrait retourner son point nord

Un eacuteleacutement fondamental causait problegraveme la fonction pour acceacuteder au point doit ecirctre

deacutefinie dans la forme (par exemple dans la classe Circle) Par contre une forme en

tant que telle ne possegravede pas de position speacutecifique Par conseacutequent son point nest

pas deacutefini non plus Pour cela il faudrait obtenir un Drawing Par contre un Drawing

ne peut pas posseacuteder la deacutefinition de chaque fonction daccegraves agrave un point pour chaque

forme Cela est contre-intuitif Il faut donc demander agrave la forme lorsquon appelle pour

obtenir un point de prendre le Drawing suppleacutementaire en paramegravetre Notre intention

est lorsque nous eacutecrirons un langage au-dessus de la hieacuterarchie de pouvoir reacutegler ce

problegraveme

Chemins de reacutefeacuterence

Finalement il nous reste un leacuteger problegraveme Nous pouvons maintenant faire une reacutefeacuteshy

rence agrave un objet disons a et obtenir un point speacutecifique de cet objet Par contre cela

nest pas suffisant dans un cas bien preacutecis Disons que a est dans le canevas b Ensuite b

est placeacute agrave deux reprises dans le canevas c obtenant deux Drawing diffeacuterents cl et c2

30

Nous ne pouvons pas acceacuteder agrave a car il est repreacutesenteacute seulement en fonction de b Pour

reacutegler le problegraveme il faut faire un chemin de reacutefeacuterence (disons cl b a dans le langage

final) Pour cela nous fournirons la possibiliteacute de partir dun Drawing et den obtenir

un autre (agrave condition quil sagisse dun Canvas naturellement) Cela va mettre agrave jour

la position relative de lobjet par rapport agrave un niveau de profondeur suppleacutementaire

En acceacutedant agrave cette fonction aussi souvent que neacutecessaire il est possible de reacutefeacuterencer

un objet peu importe son degreacute de profondeur reacuteel Cela nous permet donc de faire

des liens complexes entre nimporte quel objet (voire mecircme des objets de profondeur

diffeacuterentes)

31

CHAPITRE III

EacuteLEacuteMENTS GRAPHIQUES

Dans ce chapitre nous deacutefinissons les eacuteleacutements graphiques requis pour faire des dessins

informatiques dont les courbes de Beacutezier ainsi que les splines cubiques Les proprieacuteteacutes

importantes de ces courbes sont deacutemontreacutees De plus une preuve est fournie de la

possibiliteacute dapproximer adeacutequatement un cercle avec des splines cubiques Finalement

nous discuterons du fonctionnement des diffeacuterentes solutions informatiques en terme de

structure telles que PDF et Asymptote

Courbes et segments en informatique

Naturellement les eacuteleacutements les plus importants dans des dessins informatiques sont les

segments et les courbes Pour des besoins de simpliciteacute nous essaierons de les inteacutegrer

dans la mecircme deacutefinition en traitant les segments comme un cas particulier des courbes

Nous donnons agrave cette courbe geacuteneacuterale le nom de chemin

Le premier problegraveme lorsque nous voulons faire des courbes en informatique est la

meacutethode pour les repreacutesenter Lecirctre humain peut tracer une infiniteacute de courbes disshy

tinctes sans avoir besoin de la deacutecrire avec preacutecision Par contre lorsquon entre dans le

domaine de linformatique il faut non seulement ecirctre capable den faire une description

mais celle-ci doit ecirctre la plus petite possible

Une des meacutethodes de repreacutesentation est sous la forme de pixels (JI et Kelley 2007)

Cette meacutethode implique de repreacutesenter un plan continu par un ensemble de points disshy

32

crets appeleacutes pixels Cela permet de repreacutesenter plusieurs formes de dessins extrecircmement

complexes et est utiliseacute dans certains logiciels dimages

Une autre meacutethode est la meacutethode vectorielle Cest la plus populaire Au lieu de

repreacutesenter directement le dessin tel quil apparaicirct on fournit une description du dessin

agrave partir de quelques concepts tregraves simples (points segments et cercles par exemple)

Lorsque lutilisateur souhaite voir le dessin un logiciel traduit la description en pixels

pour leacutecran

La derniegravere meacutethode possegravede plusieurs avantages La description dun dessin est souvent

beaucoup plus compacte que si on deacutecrit le dessin pixel par pixel De plus la description

conserve la preacutecision du dessin peu importe la reacutesolution agrave laquelle il est preacutesenteacute Par

exemple si nous prenons un ensemble de pixels et quon lagrandit plusieurs fois il est

tregraves probable que nous ayons perdu beaucoup dinformations Il nous faut par contre

veacuterifier la puissance reacuteelle dune telle meacutethode Nous devons donc introduire une des

structures utiliseacutees pour la description vectorielle

32 Courbes de Beacutezier

Une courbe de Beacutezier est un concept relativement simple deacuteveloppeacute indeacutependamment

par Paul de Casteljau et Pierre Beacutezier entre 1959 et 1962 Ces deux personnes avaient

pour objectif de creacuteer des repreacutesentations par ordinateur de voitures pour les compagnies

Citroen et Renault respectivement (Jr et Kelley 2007)

321 Deacutefinition

Soit Po Pl P2 Pn E 1R2 un ensemble de points dans un plan carteacutesien typique

Ceux-ci sont appeleacutes des points de controcircle Soit t E IR et 0 lt t 1 La courbe de

Beacutezier de degreacute n des points Po agrave Pn est deacutefinie par la formule suivante

B t - n ( n

) 1 - t n-ttt

pPohmiddotPn ( ) - ~ i ( ) t (31) t=O

33

Le chemin est deacutefini pour les valeurs entre 0 et 1 de t Cette formule peut sembler

leacutegegraverement arbitraire et complexe pour une forme supposeacutement simple Une seconde

deacutefinition reacutecursive cette fois-ci simplifie beaucoup la formule

322 Deacutefinition alternative

Bp =p (32)

BpOPl Pn(t) = (1 - t)BpOPl Pn-l (t) + tBplhPn (33)

Cette deacutefinition alternative se ramegravene agrave dire quune courbe de Beacutezier est une intershy

polation lineacuteaire entre deux courbes de Beacutezier de degreacute infeacuterieur La deacutemonstration se

ramegravene agrave quelques manipulations bien simples et est laisseacutee en exercice au lecteur

Nous pouvons analyser les formules pour diffeacuterents degreacutes Par exemple une formule de

Beacutezier de degreacute 1 nest quune droite

BPoPl (t) = (1 - t)Po + tP] (34)

Alors quune courbe de degreacute 2 se ramegravene agrave une parabole

(35)

Finalement une courbe de Beacutezier cubique (de degreacute 3) fournit une courbe relativement

complexe qui commence agrave Po et termine agrave P3

--- ---

34

P P

0

P

Po - ____ _ - - P2

Po - - - - - - - - - - - - - - - - - - - - - - - shyPo P2 P3

(a) lineacuteaire (b) quadratique (c) cubique

Figure 31 Courbes de Beacutezier lineacuteaire quadratique et cubique

Eacutevidemment il ny a pas davantages significatifs agrave utiliser une courbe de Beacutezier lineacuteaire

Les courbes de Beacutezier quadratique sont quant agrave elles utiliseacutees lors de la geacuteneacuteration

de police TrueType (Apple Computer Inc 1996) Finalement les courbes de Beacutezier

cubiques sont utiliseacutees dans Postscript (Adobe Systems Incorporated 2010a) et dans la

plupart des produits Jb1EX tel que Metafont (Knuth 1986) Ces logiciels utilisent en

fait une combinaison de courbes de Beacutezier appeleacutees splines que nous verrons dans la

section suivante

323 Proprieacuteteacutes dune courbe de Beacutezier

En regardant les diffeacuterentes courbes nous pouvons aiseacutement voir quelques proprieacuteteacutes

Entre autres il y a interpolation des points de deacutepart et de fin Cela peut se deacutemontrer

aiseacutement en calculant B(uuml) et B(l) qui donne respectivement Po et Pn De plus les

autres points ne semblent pas ecirctre interpoleacutes Il sagit ici dun cas geacuteneacuteral (les points

peuvent ecirctre interpoleacutes sils sont colineacuteaires)

Une autre proprieacuteteacute inteacuteressante des courbes de Beacutezier est son invariance par transforshy

mation affine Cela se ramegravene au theacuteoregraveme suivant Dans le cadre de ce theacuteoregraveme nous

devrons transformer les coordonneacutees des points de controcircles des courbes de Beacutezier en

coordonneacutees projectives homogegravenes Ceci se ramegravene agrave rajouter un axe agrave chacun de nos

points dont la valeur sera toujours 1

35

Theacuteoregraveme dinvariance affine

Soit BpOPl Pn(t) une courbe de Beacutezier Soit M une matrice 3 par 3 repTeacutesentant une

transformation affine Alors on a que la courbe est invari(Lnte par lapplication de M

cest-agrave-dire MBpoPlPn(t) = BMPolvIPl lvIPn(t)

Pour le prouver il suffit de deacutevelopper la formule

NI BpoP1Pn (t) = M t (~) (1 - tt-ieuml Pi 1=0

= tM(~) (1- tt-itiPi 1=0

= t (~) (1- t)n-iti(MPi ) 1=0

Ce theacuteoregraveme implique que pour transformer une courbe de 8eacutezier il suffit dappliquer la

transformation agrave chaque point de controcircle et de calculer une nouvelle courbe de 8eacutezier

Donc une courbe de Beacutezier est entiegraverement deacutefinie par ses points de controcircle Cela fait

quelle est tregraves pratique en informatique car elle ne requiert que peu despace pour la

deacutefinir (ie seulement les n + 1 points de controcircle) De plus il est tregraves simple de geacuteneacuterer

une courbe de Beacutezier car il suffit dutiliser la formule pour autant de valeurs de t que

nous avons besoin de preacutecision dans la courbe En conservant linformation avec cette

meacutethode nous conservons une courbe sans aucune perte dinformation Cela signifie que

nous pouvons agrandir la reacutesolution de la courbe autant que nous le souhaitons et il

sagira toujours dune belle ligne courbe Cette proprieacuteteacute est extrecircmement inteacuteressante

en informatique

36

324 Deacutesavantages des courbes de Beacutezier

Les courbes de Beacutezier sont utiliseacutees dans beaucoup de domaines Par contre elles

possegravedent quelques deacutesavantages peu inteacuteressants Le plus important est probablement

labsence de controcircle local Cela sexprime par le fait que degraves que lon souhaite modifier

une courbe de Beacutezier agrave un endroit particulier tout le reste de la courbe est modifieacute au

passage Cela se deacutemontre par le fait que si 0 lt t lt 1 on a alors que

Cela implique que chaque point de controcircle de la courbe de Beacutezier a une influence (aussi

minime soit-elle) sur lensemble de la courbe Le reacutesultat est que les courbes de Beacutezier

seules sont difficiles agrave utiliser et longues agrave eacutevaluer si on utilise trop de points de controcircle

33 Splines cubiques

La solution agrave ce problegraveme est lutilisation de splines cubiques Lideacutee de base dune spline

est que si une seule courbe cause trop de problegravemes il est probablement mieux dutiliser

plusieurs courbes mais qui fonctionnent seulement dans un domaine plus petit Plus

formellement une spline cubique (aussi appeleacute B-spline cubique) est composeacute de

- un ensemble de valeurs ti pour 0 S i S m - 1 ougrave m repreacutesente le nombre de noeuds

On appelle aussi ces valeurs le vecteur de noeud Les t forment une suite monotone

croissante et sont tous des valeurs reacuteelles entre 0 et l

- L + l points de controcircle

- Une valeur entiegravere n qui repreacutesente lordre de la fonction B-sp1ine Une spline doit

respecter la condition n S m - 2

On deacutefinit une spline par la fonction suivante

37

m-n-2

S(t) = L Pibin(t) tE [01] i=O

ou dans le cas speacutecifique dune spline de degreacute 3

3

S(t) = L Pi bi 3(t) tE [01] i=O

Les bin repreacutesentent les bases de la B-spline (pour Basis Spline) Celles-ci sont deacutefinies

par la fonction reacutecursive suivante

bjoU) ~ sinon

Il sagit dune eacutequation complexe et nous ne nous y attarderons pas trop Quelques

deacutetails sont inteacuteressants agrave noter Entre autre il est inteacuteressant de constater que si lon

utilise n + 1 points de controcircle et que les noeuds sont n noeuds valant zeacutero et n noeuds

valant 1 le B-spline deacutegeacutenegravere en une courbe de Beurozier Il sagit donc dune extension

des capaciteacutes des courbes de Beacutezier

Le problegraveme principal eacutevoqueacute par les courbes de Beacutezier est que lutilisateur lors de

la creacuteation dune courbe manquait de controcircle local Il serait donc inteacuteressant que les

B-splines nous permettent de reacutegler ce problegraveme Lorsquon regarde la deacutefinition de la

base bi on remarque que celle-ci se ramegravene toujours au cas de base qui peut ecirctre aou

1 selon que nous sommes dans un domaine restreint ou non Comme il sagit du seul

facteur de Pi il est naturel daffirmer que le controcirc~e est plus localiseacute quavant Dautres

proprieacuteteacutes inteacuteressantes sont

- Pour tout t la somme de tout les bi(t) est 1

38

C5 C4 C3 -----~---- ----~-----

-----~---- ----~-----

Cg ClO Cn

Figure 32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier

- Un B-spline dordre m sera neacutecessairement Cm - 2 cest-agrave-dire quelle possegravede 2 ordres

de deacuteriyeacutees continues pour son domaine de deacutefinition _

- Tout comme les courbes de Beacutezier les B-splines sont invariants par transformation

affine On peut donc appliquer une courbe en appliquant tout simplement la transshy

formation sur les points de controcircle et en calculant le nouveau B-spline

34 Le cas dun cercle

Avec les outils que nous posseacutedons nous ne sommes pas en capaciteacute de dessiner un

cercle exact Cela nest pas grave eacutetant donneacute que nous pouvons tout de mecircme tenter de

lapproximer Pour ce faire nous utiliserons une spline cubique posseacutedant quatre points

(est nord ouest et sud respectivement) Chaque courbe de Beacute7i~r sera donc identique

aux autres agrave une rotation pregraves Il reste donc agrave deacuteterminer les points de controcircle agrave utiliser

Pour cela prenons le premier quadrant du cercle Nous passons du point Cl (10) agrave

C4 (0 1) Il nous faut deacuteterminer deux points de controcircle C2 et C3 Pour commencer

39

nous pouvons supposer de maniegravere tout agrave fait arbitraire que C2 se situe sur la tangente

de Cl et C3 sur la tangente de C4 Cela nous donne donc le scheacutema suivant

C4 C3 ----- ----~-----

1

1

1

1

TC2 1

1

1

i

Figure 33 Quart de cercle approximeacute par une courbe de Beacutezier

On a donc C2(1 k) et C3(k 1) ougrave k est une variable agrave deacuteterminer Afin de la deacuteterminer

nous devons donner une information suppleacutementaire Par exemple nous pouvons preacuteshy

supposer que le point agrave 45 degreacutes C(O5) doit ecirctre eacutevalueacute exactement par la courbe de

Beacutezier cest-agrave-dire C(O5) = (1 1) Nous obtenons donc la restriction

C(uuml5) = (1 - t)3CI + 3(1 - t)2tC2 + 3(1 - t)t2C3 + t3C4

1 3 3 1 = -Cl + -C2 + -C3 + -C4

8 8 8 8

ce qui nous permet dobtenir leacutegaliteacute

v2v2 1 3 3 1 (- -) = -Cl + -C2 + -C3 + -C4 (37)22 8 8 8 8

ce qui nous fournit apregraves substitution des valeurs des points deux fois leacutequation

v2 1 3k-=-+- (38)2 2 8

40

ce qui nous fournit apregraves reacutesolution

k = ~(J2 - 1) 0552285

Cela nous fournit donc une courbe de Beacutezier qui approxime notre cercle Il reste agrave voir

la preacutecision de cette approximation

Pour ce faire nous devrons comparer larc de cercle que nous venons de creacuteer agrave un cercle

reacuteel Afin dy arriver nous consideacutererons chaque valeur de notre arc comme eacutetant un

vecteur dont nous devrons calculer la longueur Plus cette longueur est proche de 1

plus nous avons une estimation reacutealiste Nous calculons donc

Par la suite une analyse des deacuteriveacutees nous permet de conclure que cette fonction dans

lintervalle t E [01] possegravede des m(iximu_ms agrave _t = 0 agrave tr~is reprises _(au deacutebut et agrave la

fin eacutetant donneacute la proprieacuteteacute naturelle des courbes de Beacutezier celle au milieu est due agrave

notre contrainte) Finalement elle possegravede deux (2) minimums agrave t = 0211 et t = 0789

et lerreur avec un cercle standard est de 0000273 Une telle variation sur un cercle

de rayon 1 est minime Il sagit dune variation maximale infeacuterieure agrave 003 Cela

signifie donc pour un cercle posseacutedant un rayon de 4000 pixels il y aura une variation

maximale de 12 pixels ce qui est indeacutetectable pour la taille du cercle Cela en fait une

bonne estimation pour cette section du cercle Nous pouvons naturellement suivre le

mecircme raisonnement pour les sections restantes

Il est aussi agrave noter que notre estimation nest pas la meilleure Notre choix de demander

leacutegaliteacute agrave 45 degreacutes est arbitraire et toute lerreur se retrouve dans le cocircteacute neacutegatif De

meilleures estimations ont eacuteteacute effectueacutees (Riskus 2006) avec des reacutesultats amenant une

preacutecision jusquagrave 25 plus grande (Lancaster 2005)

41

0--------------r--7T-----------------rl 08 (1

-000005

-000010

-000015

-000020

-000025

Figure 34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence

35 Structures informatiques dans les solutions deacutejagrave existantes

Maintenant que nous savons comment fonctionne les diffeacuterents modes de repreacutesentation

des dessins en informatique il faut analyser plus en deacutetail comment fonctionne les

logiciels dont nous allons nous servir En effet il nous faudra adapter nos structures de

bas niveau agrave celles disponibles dans les langages dont nous nous servirons Pour cela

nous allons analyser deux parties distinctes un format de fichier (PDF) ainsi quun

42

langage intermeacutediaire (Asymptote)

351 Postscript et PDF

En premier lieu il convient de comprendre comment fonctionne le format de fichier final

que nous utiliserons ]1EX permet de geacuteneacuterer plusieurs formats de fichier diffeacuterents

Pendant longtemps le plus populaire aura eacuteteacute Postscript creacuteeacute par Adobe Systems Cela

eacutetait principalement lieacute aux imprimantes qui fonctionnaient directement avec ce format

De nos jours le format PDF est beaucoup plus populaire bien quayant une base tregraves

proche de celle de Postscript

Postscript a eacuteteacute inventeacute par John Warnock et Charles Geschke en 1982 (Adobe Systems

Incorporated 1994) Lorsquil a eacuteteacute creacuteeacute il servait agrave faire la description de pages pour

impression Il se distingue comme eacutetant un langage de programmation complet mais

rarement utiliseacute directement En effet Postscript est difficile agrave utiliser car il utilise la

notation polonaise inverse Par exemple on exprime lappel de fonction j(a b c) de la

faccedilon suivante

abc f

Cette meacutethode rend lanalyse dun programme extrecircmement rapide et convivial pour

le logiciel qui linterpregravete car celui-ci est directement lieacute agrave la structure dune pile

dexeacutecution Par contre lanalyse dun tel programme par un humain est complexe

La plupart du temps Postscript eacutetait donc utiliseacute comme un langage de description

final pour un fichier

Il existait deux types de structures utiliseacutes en Postscript pour mettre des dessins sur une

page Le premier eacutetait lajout de texte Cela est intrinsegravequement lieacute agrave la description des

polices qui deacutepasse le cadre de ce meacutemoire Par contre pour faire un dessin quelconque

le format utilisait les chemins qui sont deacutecrits soit par des segments soit par des courbes

de Beacutezier cubiques On note donc le deacutesavantage de lutilisation dune courbe de Beacutezier

soit labsence de controcircle local

43

Quant agrave lui PDF a eacuteteacute creacuteeacute en 1993 (Adobe Systems Incorporated 2010b) Agrave travers les

gains de populariteacute le format PDF est devenue en 2008 un standard ISO (International

Organization for Standardization 2008) Cela en fait donc un format de document

standard extrecircmement inteacuteressant Alors que Postscript a eacuteteacute creacuteeacute pour des documents

qui devaient ecirctre imprimeacutes PDF a eacuteteacute conccedilu pour la description de documents plus

dynamiques cest-agrave-dire la possibiliteacute dajouter des eacuteleacutements multimeacutedias au document

Aussi il est possible de deacutecrire chaque page indeacutependamment des suivantes En effet

comme Postscript deacutecrivait des documents dimpression il est normal de connaicirctre la

page de deacutepart avant dimprimer la suivante En PDF chaque page est totalement

indeacutependante du reste du document

Pour la description deacuteleacutements graphiques les structures de base sont essentiellement

les mecircmes que Postscript Quelques eacuteleacutements comme la transparence cest-agrave-dire quun

eacuteleacutement cacheacute par un autre eacuteleacutement contribue au reacutesultat final ont eacuteteacute ajouteacutes mais les

eacuteleacutements graphiques de bas niveau sont identiques

352 Asymptote

Comme nous lavons dit preacuteceacutedemment tout ramener agrave des courbes de Beacutezier creacutee un

problegraveme de controcircle local des courbes Il faut donc utiliser une meacutethode pour donner

du controcircle agrave lutilisateur Pour cela nous utiliserons Asymptote Les structures de

bas niveau de Asymptote sont identiques agrave celles de PDF eacutetant donneacute quil convertit

directement les chemins Asymptote en chemins PDF Par contre Asymptote impleacutemente

un algorithme (Bowman 2007) originellement deacuteveloppeacute par Donald Knuth qui permet

de deacutecrire un chemin en fonction des points par lesquels il passe Asymptote utilise donc

des splines cubiques (qui ne sont pas neacutecessairement des B-splines toutefois)

Cet algorithme est complexe et en dehors du cadre de ce meacutemoire mais peut ecirctre

reacutesumeacute comme eacutetant un algorithme de choix des points de controcircle En effet une courbe

de Beacutezier cubique est deacutefinie par 4 points Le premier et le dernier sont interpoleacutes de

maniegravere exacte Ce que lalgorithme fait est quil prend un ensemble de points qui

44

seront tous interpoleacutes disons Pl P2 P3 P4 Ensuite pour chaque paire conseacutecutive de

points (donc (Pl P2 ) (P2 P3) et (P3 P4)) il geacuteneacuterera une courbe de Beacutezier cubique

La partie la plus importante de lalgorithme consiste agrave prendre toutes les informations

fournies par lutilisateur (les points de controcircle ainsi que des options qui deacutefinissent la

courbe comme les deacuteriveacutees agrave certains endroits ou des informations comme la tension qui

laisse lalgorithme calculer lui-mecircme les deacuteriveacutees agrave partir dun indice reacuteel simple) afin de

calculer pour chaque courbe de Beacutezier cubique les deux points de controcircle manquants

En laissant agrave lutilisateur le pouvoir de deacutecider seulement les points ougrave la courbe passe

le travail est simplifieacute mais permet tout de mecircme de terminer avec un ensemble de

courbes de Beacutezier

CHAPITRE IV

THEacuteORIE DES LANGAGES INFORMATIQUES

La creacuteation dun langage de programmation nest pas une mince tacircche Il faut donc

sassurer de le construire sur des bases theacuteoriques solides Nous preacutesenterons ici les

eacuteleacutements theacuteoriques importants de la theacuteorie des langages ainsi que leurs applications

dans le domaine de la compilation Nous preacutesenterons aussi loutil SableCC que nous

avons utiliseacute dans le cadre de notre langage ainsi quun bref exposeacute sur les langages

reacuteflexifs

La theacuteorie des langages est un sujet vaste et extrecircmement complexe Un meacutemoire comshy

plet pourrait ecirctre reacutedigeacute seulement sur les aspects theacuteoriques des automates reacuteguliers

Afin de compresser tout ce contenu dans un seul chapitre les eacuteleacutements seront mentionneacutes

sans preuve Nous recommandons toutefois au lecteur curieux et assidu de consulter les

reacutefeacuterences de ce chapitre pour des preuves et une couverture plus complegravete du sujet

41 Theacuteorie des langages et automates

Dans un premier temps nous devrons deacuteterminer ce quest formellement un langage

Par la suite nous analyserons une structure de donneacutees qui est intimement lieacutee agrave ce

sujet les automates

46

411 Les eacuteleacutements de base dun langage (Aho Sethi et Ullman 1986)

Alphabet et lettre

Un alphabet est un ensemble (au sens matheacutematique du mot) de symboles appeleacutes

lettres Un alphabet est fini et non-vide Par exemple lalphabet latin standard ainsi

que lensemble O I constituent des alphabets

Mot

Un mot dun alphabet A peut ecirctre un des trois cas suivants

- le mot vide euro formeacute daucune lettre

- une lettre de lalphabet A

- Toute suite finie de lettres aOal an ougrave chaque ai fait partie de lalphabet A

Il est agrave noter que les deux premiers sont en fait des cas speacutecifiques du dernier bien quils

sont souvent seacutepareacutes pour raison de clarteacute Dans le dernier cas on dit que les caractegraveres

sont lieacutes par lopeacuteration de concateacutenation

Langage

Un langage au sens le plus geacuteneacuteral possible est un ensemble de mots Celui-ci peut ecirctre

fini ou infini La plupart des exemples inteacuteressants (un langage de programmation par

exemple) est un langage infini En effet il existe une infiniteacute de programmes diffeacuterents

tout comme il existe une infiniteacute de nombres binaires

412 Exp esson reacutegnli r

Les expressions reacuteguliegraveres forment un outil de travail extrecircmement important en inshy

formatique De nombreux outils ainsi que certains langages (grep perl ) leurs sont

consacreacutes

47

On peut reacutesumer les expressions reacuteguliegraveres comme eacutetant une meacutethode afin de deacutecrire

un langage infini par une expression fini On utilisera dans la construction certaines

opeacuterations qui nous donneront des proprieacuteteacutes inteacuteressantes pour le langage final Tout

mot qui peut ecirctre construit agrave partir de ces regravegles fait automatiquement partie du langage

Constantes

Leacuteleacutement de base dune expression reacuteguliegravere est une constante Celle-ci est deacutefinie agrave

partir dune lettre de lalphabet et deacutefinit un seul mot la constante elle-mecircme Par

conseacutequent lexpression reacuteguliegravere a de lalphabet ab repreacutesente le langage a Il est

agrave noter que nous pouvons aussi utiliser le mot vide comme une constante repreacutesentant

lensemble vide

Concateacutenation

Lopeacuteration de concateacutenation est une opeacuteration sur les mots qui permet de creacuteer des

expressions reacuteguliegraveres plus longues agrave partir de deux expressions reacuteguliegraveres valides Le

reacutesultat de lexpression reacuteguliegravere A concateacuteneacutee agrave B est donc nimporte quel mot de A

concateacuteneacute agrave nimporte quel mot de B Par exemple ab est une expression reacuteguliegravere qui

repreacutesente un langage agrave un mot ab

Union

Lunion des expressions reacuteguliegraveres est une opeacuteration qui correspond agrave lunion ensemshy

bliste Lors de lunion de A et de B (deacutefini comme (AIB)) nous pouvons choisir nimshy

porte quel eacuteleacutement de A ou de B comme un mot valide Par exemple (alb)b repreacutesente

le langage contenant deux mots ab bb

Fermeture de Kleene

La fermeture de Kleene est une opeacuteration beaucoup plus inteacuteressante Celle-ci utilise

une expression reacuteguliegravere A Le reacutesultat de la fermeture noteacute A est la concateacutenation

48

dun nombre fini deacuteleacutements de A avec possibiliteacute de reacutepeacutetitions Par exemples pour

ab toute chaicircne de a finie possiblement de longueur zeacutero suivie dun b fait partie du

langage Lexpression reacuteguliegravere (alb) repreacutesente nimporte quelle chaicircne finie de a ou de

b

Les langages que nous pouvons geacuteneacuterer avec des expressions reacuteguliegraveres sont assez riches

bien quinsuffisants pour geacuteneacuterer un langage de programmation (Aho Sethi et Ullman

1986)

413 Automates

Avant de pouvoir expliquer agrave quoi servent les expressions reacuteguliegraveres nous devons discuter

des automates une structure dune importance cruciale en informatique

Automate fini

yn automate fini (Ullman Hopcroft et Motwani 1~79) est un quintuplet composeacute de

cinq eacuteleacutements

- Un ensemble fini deacutetats E

- Un alphabet fini A

- Un ou plusieurs eacutetats de deacutepart d (selon que lautomate est deacuteterministe ou non)

- Un ensemble deacutetats dit finaux F

- Une relation de transition T ccedil E x A x E Cela deacutefinit une maniegravere de passer dun

eacutetat agrave un autre lors de lapparition dun symbole speacutecifique

On repreacutesente en geacuteneacuteral un automate par un graphe avec des flegraveches nommeacutees Les

flegraveches repreacutesentent la relation de transition alors que les sommets repreacutesentent les

eacutetats dans E On repreacutesente un eacutetat initial par une flegraveche qui ne part pas dun eacutetat

Finalement on repreacutesente un eacutetat final par un cercle double Par exemple lautomate

suivant accepte lensemble des mots qui sont composeacutes dune seacuterie de a (possiblement

nulle) suivi dun b Donc les mots b ab et aab serait des mots valides par rapport agrave

49

cet automate

Figure 41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b

Lensemble T peut prendre plusieurs formes en fonction du deacuteterminisme de lautomate

comme nous allons maintenant le voir

Automate non-deacuteterministe

Un automate non-deacuteterministe peut posseacuteder plusieurs eacutetats de deacutepart De plus son

ensemble de transitions T est quelconque Il peut donc exister pour un eacutetat e et un

symbole a plusieurs eacutetats e tels que (e a e) E T

Un automate non-deacuteterministe peut ecirctre vu comme une forme de graphe dans lequel on

peut se promener en utilisant certaines transitions La suite des symboles des transitions

que nous utilisons forment un mot Lensemble des mots obtenus par une suite de transhy

sitions allant dun eacutetat initial agrave un eacutetat final constitue le langage de lautomate Dans

un automate non-deacuteterministe il peut neacuteanmoins exister pour le mecircme mot plusieurs

chemins diffeacuterents deacutebutant dans un eacutetat initial Il est important de noter quun mot

est accepteacute degraves quun de ces chemins se termine dans un eacutetat final

Automate deacuteterministe

Un automate non-deacuteterministe nous permet de creacuteer des langages mais le fait davoir

plus dun choix pour le mecircme symbole peut sembler inquieacutetant surtout lorsquil sagit

dinformatique Nous pouvons donc deacutefinir un automate deacuteterministe plus simple Celuishy

50

ci possegravede un seul eacutetat de deacutepart et son ensemble de transitions T assure que pour

chaque symbole il ny a quun seul eacutetat suivant possible Il ny a donc pour chaque mot

quun seul chemin possible agrave partir de leacutetat initial Plus formellement lautomate sera

deacuteterministe si pour tout e E E et a E A il y a un seul e E E tel que (e a e) ET

Le reacuteflexe naturel serait de croire quen enlevant le non-deacuteterminisme dun automate

celui-ci devient beaucoup moins puissant permettant de repreacutesenter beaucoup moins

de langages Or il nen est rien Il a eacuteteacute prouveacute (malheureusement en trop de pages

pour ce meacutemoire) que nimporte quel automate non-deacuteterministe peut ecirctre rameneacute agrave

un automate deacuteterministe quitte agrave voir le nombre deacutetats de lautomate augmenter

exponentiellement Nous pouvons donc toujours creacuteer un automate non-deacuteterministe et

laisser la tacircche agrave un ordinateur de creacuteer un automate deacuteterministe agrave partir de celui-ci

(Ullman Hopcroft et Motwani 1979)

Exeacutecution dun automate et contraintes temporelles

La meacutethode dexeacutecution dun automate deacuteterministe est assez simple Nous lui fournisshy

sons un mot dune certaine longueur disons n Nous deacutemarrons de leacutetat initial et chaque

lettre repreacutesente un choix agrave faire dans lautomate Comme lautomate est deacuteterministe

il ny a quune possibiliteacute agrave explorer Si nous ne pouvons plus avancer avant la fin du

mot celui-ci ne fait pas partie du langage de lautomate Si nous parvenons agrave avancer

jusquau bout et que nous ne sommes pas dans un eacutetat final il nen fait pas partie non

plus Par contre si leacutetat est final nous avons trouveacute un mot du langage Co me le mot

possegravede n lettres nous aurons au maximum n choix agrave faire rendant lalgorithme dapshy

partenance agrave un temps dexeacutecution lineacuteaire Un algorithme lineacuteaire est naturellement

extrecircmement inteacuteressant en informatique car nous voulons un programme qui sexeacutecute

dans un temps raisonnable

51

414 Lien entre langage reacutegulier et automate fini

Nous connaissons donc maintenant deux meacutethodes pour creacuteer un langage Les expresshy

sions reacuteguliegraveres ainsi que les automates Un automate est difficile agrave concevoir pour un

ecirctre humain mais extrecircmement rapide dutilisation par un ordinateur Une expression

reacuteguliegravere est complexe pour un ordinateur mais aiseacutee agrave concevoir par un ecirctre humain Il

nous faut donc voir si nous pouvons obtenir des proprieacuteteacutes communes agrave ces deux outils

Le lien

Il existe en effet un lien qui unit ces deux structures Celui-ci est extrecircmement fort

lensemble des langages quil est possible de geacuteneacuterer avec des expressions reacuteguliegraveres est

exactement le mecircme ensemble que ceux qui peuvent ecirctre geacuteneacutereacutes par un automate fini

deacuteterministe Cela implique que pour chaque expression reacuteguliegravere nous pouvons troushy

ver un automate qui repreacutesente le mecircme langage Cela est vrai aussi en sens inverse

Par contre il ne sagit pas dune bijection car plusieurs expressions reacuteguliegraveres peuvent

correspondre au mecircme automate (par exemple a et aamiddot) Il existe un algorithme permetshy

tant de transformer une expression reacuteguliegravere en automate mais celui-ci est complexe et

deacutepasse le cadre de ce meacutemoire Nous pouvons toutefois mentionner que cet algorithme

est relativement lent (sexeacutecute en O(2m ) ou m est la longueur de lexpression reacuteguliegravere)

mais permet par la suite de trouver si un mot fait partie dun langage en temps lineacuteaire

(McNaughton et Yamada 1960)

Importance dun tel lien

Ce lien est un eacuteleacutement crucial dans la capaciteacute dun ordinateur agrave travailler avec des lanshy

gages de programmation En effet cela permet aux creacuteateurs de langages de deacutecrire des

mots agrave partir dexpressions reacuteguliegraveres (quils comprennent) et de laisser un programme

creacuteer des automates qui peuvent reconnaicirctre ces symboles (un if ou un for mais aussi

des variables) dans des programmes Cela permet donc de creacuteer une partie importante

dun langage quon appelle lanalyse lexicale Cela permet agrave partir de lutilisation de

52

lautomate creacuteeacute par des expressions reacuteguliegraveres de transformer un texte en une suite de

symboles plus speacutecifiques Par exemple le texte

if a 1 then true else faIse

pourrait ecirctre traduit par la suite de symboles suivants

IF VAR EQ NUM THEN BD DL ELSE BDDL FININSTR

Cette eacutetape lanalyse lexicale est cruciale agrave la suite de lanalyse dun programme Les

automates nous sont toutefois utiles non seulement pour les mots cleacutes mais aussi pour

des eacuteleacutements plus complexes comme des variables Une variable est souvent identifieacutee

comme eacutetant une lettre suivie dune suite de caractegraveres quelconques (sauf exception tel

quun espace)

Malgreacute tout il existe certains eacuteleacutements quun automate ne peut reconnaicirctre Un exemple

classique est le parentheacutesage eacutequilibreacute (une suite de parenthegraveses telle que c~aque pashy

renthegravese ouvrante est associeacute agrave une parenthegravese fermante et agrave nimporte quel moment il

nexiste pas plus de fermantes que douvrantes) Il est en effet impossible aux automates

de faire le lien entre les deux types de parenthegraveses (Ullman Hopcroft et Motwani 1979)

Pour cela il nous faudra utiliser des structures plus complexes

42 Grammaires

Ces structures sont les grammaires Il est possible de les voir comme eacutetant une forme

beaucoup plus geacuteneacuterale des expressions reacuteguliegraveres Avec cette structure nous pourrons

nous assurer quun programme est bien formeacute cest-agrave-dire creacuteer un arbre repreacutesentant

la structure dun programme un peu comme la structure dune phrase

421 Deacutefinition dune grammaire formelle

Une grammaire est constitueacutee de quatre eacuteleacutements

53

- Un ensemble fini de terminaux Ceux-ci sont des symboles repreacutesentant les lettres

dun langage Par conseacutequent on peut aussi appeler les terminaux lalphabet dune

grammaire

- Un ensemble fini de non-terminaux Habituellement repreacutesenteacute par des majuscules

(par des symboles diffeacuterents des terminaux) pour des raisons de clarteacute ceux-ci repreacuteshy

sentent des eacutetats intermeacutediaires de la grammaire

- Un non-terminal de deacutepart parmi lensemble deacutecrit plus haut

- Un ensemble de regravegles de production Celles-ci vont varier selon la cateacutegorie de langage

choisie mais de maniegravere geacuteneacuterale une regravegle de production est une paire ordonneacutee

dont chaque eacuteleacutement est composeacute dune suite de terminaux et de non-terminaux (par

exemple aB -t aAa)

Le fait de repreacutesenter une regravegle de production avec une flegraveche permet den expliciter le

rocircle transformer une suite de caractegraveres en une autre Lutilisation dune grammaire

consiste donc agrave deacutemarrer avec le non-terminal de deacutepart puis dappliquer une suite de

regravegles de production pour modifier le non-termina Lorsquon obtient un mot formeacute

uniquement de terminaux il sagit dun mot du langage repreacutesenteacute par la grammaire

Par exemple

S -gt aA

A -gt b

repreacutesente un langage contenant le seul mot ab On applique doEn effet unc un proceacutedeacute

de deacuterivation (en appliquant chaque regravegle) Par exemple une deacuterivation possible du mot

ab dans ce contexte (la seule dailleurs) est la suite suivante

S (deacutepart)

S -gt aA (application de S -gt aA)

aA -gt ab (application de A -gt b)

54

422 Hieacuterarchie de Chomsky

La deacutefinition que nOlis avons donneacutee preacuteceacutedemment dun langage est beaucoup trop

geacuteneacuterale pour nous fournir des proprieacuteteacutes inteacuteressantes Afin de deacutegager des proprieacuteteacutes

inteacuteressantes nous deacutefinissons plusieurs cateacutegories Plusieurs noms sont utiliseacutes pour

chaque cateacutegorie mais nous nous limiterons agrave utiliser ceux deacutefinis par le linguiste Noam

Chomsky (Chomsky 1956) Chacune de ces cateacutegories sera deacutecrite par les proprieacuteteacutes de

sa grammaire Il est agrave noter que nous avons neacutegligeacute certaines cateacutegories de langages qui

ne sont pas lieacutees au domaine

Langage reacutegulier

Un langage reacutegulier est eacutequivalent aux expressions reacuteguliegraveres Les regravegles de production

de la grammaire doivent ecirctre de la forme

A -) Ba

A -) a

ou

A -) aB

A -) a

avec A et B des non-terminaux et a un termina Il est agrave noter que toutes les regravegles

dune grammaire doivent ecirctre soit du premier cas soit du deuxiegraveme cas On les appelle

reacutecursives agrave gauche ou agrave droite respectivement

Langage non-contextuel

Un langage non-contextuel est un peu plus complexe quun langage reacutegulier Les regravegles

de production de la grammaire doivent ecirctre de la forme

55

A -) B

avec A un non-terminal et B une suite de terminaux et de non-terminaux Le deacutetail

le plus important est de noter que les langages non-contextuels permettent de creacuteer un

systegraveme de parenthegraveses eacutequilibreacutees En effet voici une grammaire qui accepte seulement

un parentheacutesage eacutequilibreacute

P -) pp

P -) CP)

P -)

Il est eacutevident quune grammaire reacuteguliegravere ne peut geacuteneacuterer ce genre de langage Par contre

un parentheacutesage eacutequilibreacute est extrecircmement important dans le domaine de la compilashy

tion afin dexprimer clairement les ideacutees dun programmeur et plus speacutecifiquement

permettre deacutecrire des formules matheacutematiques complexes compreacutehensibles par lOlmiddotdishy

nateur

Langage contextuel

Les langages contextuels ne sont pas utiliseacutes en geacuteneacuteral en compilation car ils sont

beaucoup plus lents Les regravegles de production de la grammaire doivent ecirctre de la forme

ABC -) ADC

ougrave B est un non-terminal A et C sont des non-terminaux ou le mot vide et D est un

non-terminal (mais pas le mot vide) On voit clairement ici dougrave vient le nom de ce type

de langage B est transformeacute en fonction de ce qui est autour de lui (son contexte)

423 Utiliteacute dans les langages de programmation

La prochaine tacircche dans la creacuteation dun langage est danalyser la structure de notre

programme Pour effectuer cette tacircche nous pouvons utiliser une grammaire non-conshy

56

textuelle Agrave cette fin nous pouvons nous assurer que les eacutequations sont correctement

formeacutees que les instructions sont valides etc

Dans un autre ordre dideacutee la hieacuterarchie de Chomsky possegravede aussi des liens avec les

machines de Turing qui sont elles-mecircmes intimement lieacutees agrave la theacuteorie de la complexiteacute

(Davis Sigal et Weyuker 1994) Ce domaine est extrecircmement vaste et le lecteur pourra

trouver dans les reacutefeacuterences plusieurs excellents ouvrages pour sinitier agrave ce domaine (Dhu

et Ko 2000)

43 SableCC

Bien quil est tregraves inteacuteressant deacutetudier les algorithmes de compilation limpleacutementation

de chacun de ces algorithmes deacutepasse largement le cadre de ce meacutemoire Il nous faut

donc trouver une meacutethode afin de creacuteer notre langage de programmation Plusieurs

outils soffrent agrave nous mais notre choix sarrecirctera sur SableCC

431 Quest-ce que S~bleCC

SabieCC est ce quon appelle un compilateur de compilateurs (Gagnon 1998) Un comshy

pilateur de compilateurs est un programme qui permet agrave partir dune deacutefinition absshy

traite dun langage de programmation dobtenir un compilateur pour ce langage Plus

speacutecifiquement le programme reacutesultant nous permettra dobtenir larbre syntaxique

dun programme ce qui nous permettra de lanalyser reacutecursivement et de lexeacutecuter (ou

bien de le transformer dans un langage diffeacuterent selon le cas) Les formes abstraites que

requiert un compilateur de compilateurs sont justement les expressions reacuteguliegraveres (pour

deacutecouvrir les symboles) et les grammaires non-contextuelles (pour lanalyse syntaxique

des symboles obtenus preacuteceacutedemment)

432 Avantages de SableCC

Bien que SabieCC nest pas le compilateur de compilateurs le plus connu il possegravede

plusieurs aspects inteacuteressants Premiegraverement comparativement agrave ses compeacutetiteurs plus

57

acircgeacutes SabieCC est eacutecrit dans un paradigme orienteacute-objet Cela rend le compilateur beaushy

coup plus simple agrave utiliser De plus le logiciel geacutenegravere automatiquement un ensemble de

classes (dans un choix de plusieurs langages) qui permet de traiter aiseacutement et claishy

rement avec des concepts modernes les arbres syntaxiques reacutesultant de lanalyse du

programme

44 Langage reacuteflexif

Finalement une fois que nous avons obtenu un arbre syntaxique et que nous savons que

notre langage est bien formeacute il nous reste la reacuteflexiviteacute agrave prendre en compte En effet

nous ne voulons pas reacuteeacutecrire inutilement dans notre langage chaque fonction qui existe

deacutejagrave en Java Nous pourrons les utiliser avec un langage reacuteflexif Une autre possibiliteacute

dun langage reacuteflexif est de deacuteleacuteguer agrave SDDL la creacuteation de classes Cela permet agrave lutilishy

sateur de reacutefeacuterencer nimporte quelle classe Java sans avoir agrave changer le code de SDDL

lui-mecircme Cela serait impossible sans un langage reacuteflexif

441 Deacutefinition dun langage reacuteflexif

Un langage reacuteflexif (Sobel et Friedman 1996) est un langage qui est capable soit de

- Examiner son eacutetat cette proprieacuteteacute est appeleacutee introspection

- Modifier son eacutetat cette proprieacuteteacute est appeleacutee intercession

Lintrospection permet agrave un langage de connaicirctre entre autres les classes quil utilise

ainsi que les meacutethodes et les paramegravetres Lintercession beaucoup plus puissante pershy

mettrait par exemple cie rajouter modifier ou supprimer des classes etou meacutethodes

Pour nos besoins nous sommes naturellement inteacuteresseacutes par lintercession

442 Avantages

Lavantage le plus clair de lutilisation de la reacuteflexiviteacute est la reacuteutilisation du code En

effet toutes les fonctionnaliteacutes du langage infeacuterieur (Java dans ce cas-ci) peuvent ecirctre

58

automatiquement passeacutees au langage supeacuterieur Cela eacutevite davoir agrave reacuteeacutecrire du code

pour chaque nouvel eacuteleacutement agrave ajouter

Un autre avantage assez explicite est de permettre agrave des utilisateurs un peu plus aguerri

de lier du code des deux niveaux de langage ensemble En effet si un utilisateur creacutee

une structure de donneacutees en Java il peut toujours se servir exactement de la mecircme

classe dans le langage supeacuterieur sans avoir agrave faire la moindre modification au langage

supeacuterieur lui-mecircme Il est donc clair quun langage qui utilise la reacuteflexiviteacute peut devenir

tregraves puissant

443 Deacutesavantages

Certains deacutesavantages accompagnent aussi la reacuteflexiviteacute Un des plus importants est la

contrainte de seacutecuriteacute En effet si un utilisateur peut appeler nimporte quelle classe

Java agrave partir du langage supeacuterieur il peut tregraves aiseacutement appeler des fonctions qui cassent

le programme si un controcircle suffisamment important nest pas effectueacute par le logiciel Il

peut aussi sans causer d~s problegravem_es de seacutec~riteacute confondre un usager en provoquant

des effets de bord sur leacutetat du logiciel cest-agrave-dire modifier des proprieacuteteacutes du reste du

programme sans neacutecessairement que cela paraisse

Un autre deacutesavantage eacutevident est quun utilisateur qui souhaite utilicirc3er les fonctions du

langage infeacuterieur doit en quelque sorte connaicirctre celui-ci Cela implique donc lapprenshy

tissage dun deuxiegraveme langage ce qui en soit peut paraicirctre trop pour des utilisateurs

plus traditionnels

Lorsquon analyse froidement les avantages et les inconveacutenients on voit que les avanshy

tages sont beaucoup plus importants En effet le projet eacutetant limiteacute dans le temps et

dans le personnel il est en quelque sorte impossible de fournir des librairies de foncshy

tions suffisamment complegravetes pour les utilisateurs Se brancher sur les librairies Java

fournit automatiquement tout ce dont nous avons besoin et donne accegraves agrave une quantiteacute

innombrable de projets deacutejagrave creacuteeacutes dans ce langage

CHAPITRE V

MISE EN OEUVRE DE LA SOLUTION

Maintenant que nous avons des bases theacuteoriques solides ainsi quune hieacuterarchie bien

adapteacutee agrave nos besoins nous pouyons commencer agrave impleacutementer notre solution Cela

implique premiegraverement la creacuteation de notre hieacuterarchie objet en Java Deuxiegravemement

nous devons impleacutementer une grammaire afin de deacutecrire SDDL Finalement il faut

ajouter du code afin dimpleacutementer certaines proprieacuteteacutes voulues pour notre langage Il

est agrave noter que nous avons inclus en annexe un diagramme de notre hieacuterarchie ainsi que

la grammaire complegravete de SDDL

51 Eacuteleacutements de langage en SDDL

511 Impleacutementation de la hieacuterarchie

Limpleacutementation de la hieacuterarchie eacutetant seacutepareacutee du reste du langage il est normal de

commencer avec celle-ci eacutetant donneacute quelle repreacutesente le module le plus important de

notre projet Cela nous permet de le tester au fur et agrave mesure avant de commencer agrave

creacuteer un langage de plus haut niveau qui lutilise

Un des problegravemes les plus importants du deacuteveloppement de la hieacuterarchie fut de deacuteveshy

lopper correctement la deacutefinition et laccegraves agrave des points speacutecifiques de certains objets

Comme lideacutee eacutetait de permettre dobtenir une quantiteacute essentiellement illimiteacutee de

points diffeacuterents il fallait une meacutethode robuste et efficace

60

Notre meacutethode implique de fournir des informations par rapport au dessin englobant agrave

chaque sous-dessin Cela est requis car un objet preacutesent agrave plusieurs endroits diffeacuterents

auquel on demande un point speacutecifique se bute agrave une ambiguiumlteacute Mecircme en utilisant

seulement un Drawing qui est techniquement une instance unique dune forme il faut

faire attention En effet si on a un Drawing dun cercle qui est agrave linteacuterieur dune

ellipse par exemple nous pourrions deacutecider de placer cette ellipse agrave plusieurs endroits

Nous aurions donc le mecircme problegraveme dambiguiumlteacute du positionnement des points Afin

de remeacutedier agrave ce problegraveme nous avons fourni au Drawing sa position agrave linteacuterieur du

diagramme Lorsquil est copieacute nous navons quagrave changer linformation pour que le

positionnement soit correct

512 Grammaire

Le deacuteveloppement de la grammaire fut naturellement une section cruciale du deacutevelopshy

pement de SDDL Comme nous avions deacutejagrave deacuteveloppeacute des objectifs speacutecifiques pour la

forme du langage la creacuteation fut relativement directe Quelques eacuteleacutements importants

ont toutefois ducirc ecirctre ajouteacutes en cours de route En particulier des eacuteleacutements seacuteparateurs

ont eacuteteacute dune importance cruciale Il aurait donc pu ecirctre souhaitable de diminuer la

verbositeacute en enlevant des parenthegraveses ou des virgules mais cela cause (dans la plupart

des cas) des problegravemes au niveau de lambiguiumlteacute de la grammaire (tel que nous lavons

vu preacuteceacutedemment)

Nous avons aussi deacutecideacute de deacutecreacuteter quune expression geacuteneacuterale est une instruction Cela

peut sembler contre-intuitif car une expression (comme 2 + 2) ne semble pas ecirctre une

instruction La raison derriegravere ce changement est le dessin de chemin En effet nous

pouvons deacuteterminer un chemin (Path) comme nimporte quel autre objet Par contre

cela implique de lajouter par la suite seacutepareacutement agrave un canevas Cela semble contreshy

intuitif nous voyons souvent les liens entre les objets comme eacutetant des liens de niveau

supeacuterieur (bref faits dans le canevas principal) Pour lier a et b il semble plus logique

deacutecrire

61

a--b

que

lien = a--b

put lien in main

Afin de reacutegler ce problegraveme nous avons deacutecideacute de laisser les expressions ecirctre des insshy

tructions Cela fait que deacutefinir une ligne (comme a--b) devient automatiquement une

instruction valide Celle-ci sera traiteacutee comme un cas speacutecial afin decirctre placeacutee direcshy

tement au centre du canevas principal Cela implique aussi comme nous le verrons

plus tard de rajouter du code afin de sassurer que les expressions qui ne sont pas des

instructions soient refuseacutees par le programme

stm = exp exp sc 1 assign id assign exp sc 1 while while_kwd exp do_kwd (stms] stm end_kwd sc 1 if if_kwd exp then_kwd (stms] stm else_part end_kwd sc 1 for for_kwd id from~kwd (low_bound] exp to_kwd (up_bound] exp

do_kwd (stms] stm end_kwd sc 1 return return_kwd exp sc

Figure 51 Extrait de la grammaire de SDDL pour une instruction

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage

Plusieurs proprieacuteteacutes de SDDL ne venaient pas directement avec la grammaire Celles-ci

ont neacutecessiteacute un traitement bien particulier en fonction de la proprieacuteteacute rechercheacutee

Typage

La grammaire de SDDL indique clairement que le langage est agrave typage dynamique eacutetant

donneacute que les creacuteations de variables ne permettent pas de donner un type Le mecircme

62

pheacutenomegravene est preacutesent dans la deacutefinition des fonctions Par contre le fait de souhaiter

un typage dynamique implique lajout dune large section de code deacutedieacutee agrave la veacuterification

de type Chaque opeacuteration ne peut ecirctre appliqueacutee quagrave certains types deacuteleacutements et donc

avant deffectuer lopeacuteration il faut veacuterifier si le type est valide

Eacuteleacutements objets

Impleacutementer tous les principes dun langage orienteacute-objet est un travail de longue hashy

leine Par contre eacutetant donneacute que notre objectif eacutetait de simplifier le langage de desshy

cription final nous avons deacutecideacute de ne pas permettre la creacuteation de nouvelles classes

agrave linteacuterieur de SDDL Cela implique que nous pouvons releacuteguer la creacuteation de classes

uniquement au langage Java Cela a donc grandement faciliteacute la tacircche car nous navions

pas besoin dimpleacutementer la tregraves grande majoriteacute des concepts objets que nous laquo emshy

pruntons raquo agrave Java

Eacutelimination de la verbositeacute

Une bonne partie de leacutelimination de la verbositeacute vient de la conception mecircme du lanshy

gage En effet le fait de releacuteguer la deacutefinition des classes agrave Java ainsi que de creacuteer le

typage dynamique ont purement par choix eacutelimineacute une bonne partie de la verbositeacute

Quelques eacuteleacutements suppleacutementaires ont permis deacuteliminer un excegraves de verbositeacute On

note entre autres le fait de deacutefinir la description du diagramme sans le speacutecifier dans le

cadre dune fonction Un autre pheacutenomegravene important est davoir deacutecideacute de promouvoir

les points et certaines fonctions relieacutees agrave leacutetat de primitive naturelle du langage En

effet une addition entre un point a et b seffectue

c = a + b

au lieu de en Java

AbstractPoint c aadd(b)

63

Cela peut sembler comme un maigre gain mais lorsquappliqueacute agrave un calcul complexe

impliquant des points (par exemple le calcul dune combinaison lineacuteaire) les gains

combineacutes rendent le code extrecircmement clair

AbstractPoint c = amultiply(1030)add(bmultiply(2030))

c = (a 30 + 20 b 30)

Figure 52 Code Java et SDDL pour calculer une combinaison lineacuteaire

52 Reacutealisation en Java

Afin de reacutealiser SDDL il a bien sucircr fallu eacutecrire une grammaire mais beaucoup de code

autour sert agrave inteacutegrer la grammaire au restant des fonctionnaliteacutes de notre hieacuterarchie

Ce code fut complegravetement eacutecrit en Java et remplit plusieurs fonctions

521 Traverseacutee de larbre grammatical et exeacutecution

La grande majoriteacute du code Java suppleacutementaire eacutecrit a servi agrave permettre la traverseacutee

de larbre grammatical creacuteeacute par notre grammaire Cette traverseacutee permet en quelque

sorte lexeacutecution du code SDDL et est donc cruciale Pour la plupart il sagit dune trashy

verseacutee en profondeur relativement classique Quelques petits deacutetails retiennent toutefois

lattention

- Certains morceaux de code ne doivent pas ecirctre exeacutecuteacutes et ont donc un comportement

speacutecial Cest le cas des deacutefinitions de fonctions qui ne sont exeacutecuteacutees quagrave lappel On

meacutemorise donc en quelque sorte une partie de larbre grammatical et lors dun appel

on transfegravere le controcircle dexeacutecution agrave cette partie Eacutevidemment lors de la lecture de

la deacutefinition de la fonction il faut stocker quelques informations sur nos fonctions

dans une structure deacutefinie agrave cet effet (un Methodlnf0)

- Certaines opeacuterations ont plusieurs sens distincts qui ne peuvent ecirctre speacutecifieacutes dans la

grammaire La seacutemantique dune telle opeacuteration napparaicirct clairement quau moment

de la lecture de lopeacuteration (dans notre cas agrave lexeacutecut ion) Un exemple serait le

64

symbole daddition Bien que sa grammaire soit tregraves claire il peut sagir dune addition

de nombres mais aussi dune addition de points ou dune concateacutenation de chaicircnes

de caractegraveres Il est donc neacutecessaire agrave lexeacutecution de veacuterifier la classe de chaque objet

requis par lopeacuteration afin de trouver la bonne seacutemantique pour lopeacuteration si une

telle seacutemantique existe Si aucune nest trouveacutee on peut alors soulever une erreur

selon le meacutecanisme standard (par exemple additionner un point et une chaicircne de

caractegraveres)

- Certaines expressions grammaticalement correctes ne sont valides que sous certaines

conditions Par exemple nimporte quelle expression (exp) est accepteacutee comme eacutetant

une instruction (stm) grammaticalement valide Par exemple linstruction 2 + 2 va

ecirctre accepteacutee par la grammaire Par contre elle na pas de sens car elle naccomplit rien

du tout Il faut donc sassurer de veacuterifier dans la traverseacutee que lexeacutecution est leacutegale

Dans ce cas-ci il faut sassurer que lexpression de niveau supeacuterieur (une addition)

est valide pour ecirctre une instruction Dans un tel cas une erreur serait souleveacutee encore

selon le meacutecanisme standard

522 Deacutefinition dobjets quelconques

Une partie moins grande du code est consacreacutee agrave linteacutegration de la hieacuterarchie de SDDL

dans la deacutefinition du langage Comme nous souhaitions utiliser des classes quelconques

nous avons utiliseacute la reacuteflexiviteacute Java telle que nous le deacutecrivions plus tocirct Cela implique

de reacutecupeacuterer les noms des fonctions et des classes lors de leurs utilisations Toutes les

veacuterifications seffectuent agrave lexeacutecution Nous savons donc seulement si une classe A existe

bel et bien lorsque nous essayons de creacuteer un objet agrave partir de celle-ci De plus chaque

fonction appeleacutee sur un objet de classe A nest veacuterifieacutee que lors de son utilisation

Habituellement la solution aurait eacuteteacute de veacuterifier avant lexeacutecution lexistence de chaque

classe ainsi que les fonctions de chaque classe pour sassurer que lexeacutecution soit correcte

Dans notre cas la veacuterification agrave lexeacutecution est suffisante car les programmes sont tregraves

courts

De plus quelques contraintes ont ducirc ecirctre ajouteacutees afin de sassurer Clue seules les parties

65

Override public void caseADrawingTermCADrawingTerm node)

String className = nodegetClassName() getText()

try

thiscurrentExpressionClass ClassforName(sddlhierarchy + className)

thiscurrentExpressionValue = thiscurrentExpressionClassgetConstructor() newlnstance()

catch(NoSuchMethodException e)

throw new InterpreterException( cl ass Il + className + is ill-defined (no base constructor) nodegetClassName())

catch(Exception e)

throw new InterpreterException(unable to load + className +

Il class (maybe it does not exist) nodegetClassName())

Figure 53 Code reacuteflexif pour creacuteer une forme quelconque

requises de Java sont exposeacutees agrave lutilisateur final La restriction principale est de ne

creacuteer que des objets qui font partie du paquet sddl hierarchy Il est toutefois agrave

noter que cela nisole pas totalement le reste de Java car il est tout agrave fait possible de

creacuteer une classe qui permet dacceacuteder agrave Java complegravetement

523 Gestion des erreurs

La gestion des erreurs seffectue au travers des meacutecanismes deacutejagrave mis en place par Java

cest-agrave-dire les exceptions Une classe speacutecifique aux exceptions de linterpreacuteteur a eacuteteacute

creacuteeacutee qui permet de speacutecifier non seulement un message mais aussi un noeud bien

speacutecifique dans larbre grammatical afin didentifier lendroit ougrave lerreur a eacuteteacute deacutecouverte

66

Cela est extrecircmement utile afin de permettre agrave lutilisateur de corriger la majoriteacute de

ses erreurs

De plus une partie du code de gestion derreurs sert agrave repreacutesenter la pile dexeacutecution

En effet afin didentifier la source dun problegraveme il est important de pouvoir savoir

quelles fonctions sont impliqueacutees Nous pouvons donc identifier la ligne de chaque appel

au moment ougrave lerreur sest produite et ainsi identifier des problegravemes entre autres dans

le cas des fonctions reacutecursives

524 Structures de support

Dimportances mineures la plupart de ces structures servent agrave geacuterer lexeacutecution des

meacutethodes

- La classe Frame repreacutesente le cadre dexeacutecution dune fonction Cette classe permet

dobtenir des fonctions reacutecursives car on peut imbriquer un Frame dans un autre

- La classe Methodlnfo repreacutesente une fonction deacutefinie agrave linteacuterieur de SDDL Elle

permet de transfeacuterer lexeacutecution agrave la deacutefinition fournie par lutilisateur et regroupe

les informations geacuteneacuteralement utiles agrave la veacuterification seacutemantique (nom paramegravetres

etc)

- La classe PrimitiveMethodlnfo repreacutesente une fonction de Java accessible par la

reacuteflexiviteacute Elle fournit aussi quelques informations pour la veacuterification seacutemantique

- La classe MethodTable fournit une table pour geacuterer lensemble des fonctions afin

dacceacuteder directement agrave une fonction agrave partir de son nom

53 Accegraves agrave Postscript PDP et B-1EX

531 Postscript

Afin de reacutealiser correctement notre langage nous avions besoin dacceacuteder agrave diffeacuterentes

technologies Eacutetant donneacute que nous voulons terminer avec des dessins en format Postshy

script il devient important de pouvoir fournir aiseacutement du code dans ce format Il

67

sagit toutefois dun format relativement complexe et il devient donc long et complexe

de fournir une traduction valide pour chacun de nos diffeacuterents concepts

Le problegraveme principal de Postscript est quil possegravede un ensemble de primitives de tregraves

bas niveau En effet afin de dessiner une courbe la seule meacutethode possible est lutishy

lisation de courbes de Beacutezier avec des points de controcircle qui doivent ecirctre fournis agrave

lavance Comme nous lavons vu preacuteceacutedemment les courbes de Beacutezier sont tregraves prashy

tiques pour lordinateur mais peu pratique pour [utilisateur car la speacutecification de

points de controcircles qui ne sont pas interpoleacutes est peu intuitive De plus afin de faire

des courbes quelconques il faut les seacuteparer en plusieurs courbes de Beacutezier de tailles

infeacuterieures

Il existe des algorithmes qui permettent de prendre des courbes et de les seacuteparer en

sections adeacutequates Un de ces algorithmes est impleacutementeacute en Asymptote (Bowman

2007) Il est donc naturel afin deacuteviter davoir agrave reacuteimpleacutementer un algorithme aussi

complexe dutiliser Asymptote pour obtenir nos courbes de faccedilon systeacutematique

532 PDF

Le format PDF possegravede lavantage dinteacutegrer plusieurs fonctions multimeacutedias telles que

les liens les videacuteos les formulaires (Adobe Systems Incorporated 2006) etc Malgreacute

tout PDF outre les quelques ajouts nommeacutes ci-haut est essentiellement similaire agrave

Postscript Eacutevidemment les nombreuses possibiliteacutes fournies par le format PDF sont

deacutesirables (inteacutegrer des videacuteos agrave des notes de cours par exemple) Il existe toutefois

de nombreux convertisseurs qui peuvent prendre un fichier Postscript et le mettre au

format PDF Par contre cette conversion ne permet pas dajouter les fonctionnaliteacutes

PDF qui nous inteacuteressent Il devient donc crucial dobtenir une meacutethode pour fournir

des images directement au format PDF Encore lagrave le fait de passer par Asymptote

nous donne une solution rapide et eacuteleacutegante car le fait de fournir du PDF est inclus

dans le logiciel En geacuteneacuterant directement du Asymptote nous pourrions donc obtenir

automatiquement le format rechercheacute

68

533 ~1lE)C

Leacuteleacutement le plus crucial du langage que nous recherchions au deacutebut eacutetait de pouvoir

utiliser du texte tel que mis en forme par UTEX dans nos diagrammes Un tel besoin

implique plusieurs problegravemes

Premiegraverement un texte UTEX est conserveacute sous la forme dune chaicircne de caractegraveres

standard Par contre apregraves avoir eacuteteacute traiteacute le reacutesultat obtenu est une boicircte contenant

le texte mis en forme La taille de cette boicircte est deacutetermineacutee lors de la mise en page

et ne peut donc pas ecirctre deacutetermineacutee directement par notre programme Or si nous ne

connaissons pas la taille exacte de notre boicircte de texte il est impossible de positionner

un texte par une position autre que son coin supeacuterieur gauche Cela est un comportement

peu inteacuteressant eacutetant donneacute que dans de nombreux graphes on place le texte au centre

dun sommet (donc par exemple le centre de la boicircte sera placeacute au centre dune ellipse)

Afin de pallier agrave ce problegraveme il faudrait demander agrave UTEX de creacuteer les boicirctes une

premiegravere fois et de nous fournir les tailles des boicirctes Par la suite il faudrait geacuteneacuterer

une page UTEX de la bonne taille avec nos dessins puis dire agrave UIEX de geacuteneacuterer les

boicirctes de textes aux endroits que nous aurons calculeacute entre temps Bien que viable

cette meacutethode implique beaucoup de code et de cas diffeacuterents (laccegraves agrave IbIEX par un

programme externe va varier dun systegraveme dexploitation agrave lautre entre autres) Eacutetant

donneacute quAsymptote fournit deacutejagrave un accegraves agrave I5IEX agrave linteacuterieur du logiciel le travail

requis pour lutilisation de I5TEX est de beaucoup diminueacute

534 Geacuteneacuteration du code Asymptote

Afin davoir une solution valide il ne reste donc pl s quagrave nnecter not e so ution agrave

Asymptote Pour le faire nous devons premiegraverement geacuteneacuterer un fichier de code Asympshy

tote valide pour par la suite le faire valider en appelant le programme de maniegravere

externe Eacutetant donneacute que le projet a eacuteteacute eacutecrit speacutecifiquement pour fournir du code

Asymptote une solution simple a eacuteteacute utiliseacutee afin deacutecrire le code le canevas principal

69

public void draw(AbstractPoint location PrintWriter out)

AbstractPoint pl locationadd(new Point (radius 00)) AbstractPoint p2 locationadd(new Point(OO radius)) AbstractPoint p3 locationadd(new Pointe-radius 00)) AbstractPoint p4 locationadd(new Point(OO -radius))

outprintln(draw( + p1so1veO + + p2solveO + + p3solveO + + p4solveO + cycle))

Figure 54 Code pour geacuteneacuterer du code Asymptote pour un cercle

sera appeleacute agrave ecirctre dessineacute qui appellera reacutecursivement chacun de ses sous-canevas

La geacuteneacuteration du code Asymptote a eacuteteacute reacuteserveacutee dans une fonction draw speacutecifique agrave

chaque forme (Shape) qui eacutecrit dans un fichier ouvert fourni en paramegravetre Un exemple

dune telle meacutethode pour la classe Circle est illustreacute agrave la figure 54

Une telle meacutethode est simple mais suffisante pour nos besoins Bien sucircr agrave long terme

une solution plus robuste devrait simposer En effet comme leacutecriture du fichier est

faite directement lors de lexeacutecution les objets doivent ecirctre appeleacutes exactement dans

lordre dont ils sont deacutependants Par exemple un segment dessineacute entre deux cercles

doit ecirctre dessineacute apregraves les cercles car sinon les reacutefeacuterences seront absentes Dans ce cas-ci

le segment va toujours ecirctre deacutefinie par la suite Par contre si nous voulions rajouter

la possibiliteacute dutiliser des extensions dAsymptote cela impliquerait de les eacutecrire au

deacutebut du fichier Il est impossible de le faire avec cette solution

Une solution plus robuste serait dutiliser un outil lieacute agrave SabieCC qui est ObjectMacro

(Gagnon 2009) Cette extension nous permet de simplifier la geacuteneacuteration de code et

deacutecrire agrave des endroits arbitraires dans un fichier agrave laide de macros et de programmation

objet Cela nous permettrait aussi deacutetendre la geacuteneacuteration de code agrave plusieurs formats

diffeacuterents par exemple geacuteneacuterer directement du code PDF au lieu de geacuteneacuterer du code

70

Asymptote

61

CHAPITRE VI

REacuteALISATION DES DIAGRAMMES EN SDDL

Maintenant que nous avons notre programme complet et fonctionnel il faut veacuterifier son

efficaciteacute Nous proceacutedons en deux temps Premiegraverement il faut revenir agrave nos dessins

de base et les coder avec notre logiciel Par la suite il faut aussi les analyser en fonction

des diffeacuterents facteurs cruciaux que nous avons eacutenumeacutereacutes dans les chapitres preacuteceacutedents

Nous pourrons donc agrave partir de cela conclure si le logiciel savegravere efficace pour nos

besoins ou si certains problegravemes lempecircchent de fonctionner adeacutequatement

Naturellement nous avons pris le temps dappliquer cette analyse agrave chacun des dessins

dans notre base de diagrammes du domaine Par manque despace nous nanalyserons

dans ce chapitre que trois dessins Une attention particuliegravere a eacuteteacute porteacutee au choix de

ces dessins afin de repreacutesenter un eacuteventail assez large des capaciteacutes du logiciel et des

diffeacuterents eacuteleacutements cruciaux agrave obtenir dans la description dun diagramme Tous les

diagrammes sont disponibles en annexe avec code sans analyse deacutetailleacutee toutefois

Analyse du code des diagrammes existants

Pour faire notre analyse nous devons premiegraverement obtenir chaque dessin Dans ce cas

nous utiliserons un diagramme tireacute du domaine de la compilation Cela nous fournit un

graphe relativement standard avec un niveau de complexiteacute inteacuteressant sans toutefois

ecirctre trop complexe Par la suite nOlis analyserons un diagramme repreacutesentant une strucshy

ture de tableau Cela montre la capaciteacute du logiciel de travailler avec des structures de

72

donneacutees geacuteneacuterales Finalement nous effectuerons lanalyse dun diagramme de Venn qui

nest a priori pas supporteacute par le logiciel afin de voir la complexiteacute dun diagramme

totalement geacuteneacuteral et qui sort des conventions preacute-eacutetablies par le logiciel

611 Rappel des objectifs cruciaux agrave observer

Naturellement afin de faire une analyse rationnelle de notre solution il faut se remeacuteshy

morer les diffeacuterents objectifs que nous nous eacutetions fixeacutes Les plus importants eacutetaient les

suivants

- Inteacutegration avec Jb1EX Eacutetant donneacute le design de notre solution ce point est naturelshy

lement reacutealiseacute dans tous les diagrammes

- Description de structures Il nous faut pouvoir deacutecrire une structure de maniegravere aiseacutee

Le fait decirctre aiseacute est naturellement subjectif mais nous pouvons ramener le tout au

fait quil soit plus simple de deacutecrire dans notre logiciel Wle structure que dutiliser les

primitives de base du langage Par exemple il est plus aiseacute de deacutecrire une structure

en parlant de boicirctes et de liens quen parlant de lignes et de courbes

- Hieacuterarchie solide et extensible Nous ne testerons pas lextensibiliteacute de la solution car

elle a deacutejagrave eacuteteacute deacutemontreacutee Toutefois les diffeacuterents codes nous permettront danalyser

agrave quel point nous utilisons la hieacuterarchie que nous avons construite et agrave quel point elle

est reacuteellement pratique

Nous avions aussi dautres objectifs de moindre importance

- Gestion des erreurs Il nest pas possible avec du code compleacuteteacute de tester la gestion des

erreurs Lauteur peut toutefois garantir que sans la gestion des erreurs une grande

quantiteacute de temps aurait eacuteteacute perdu dans la reacutedaction du code des diagrammes et ce

malgreacute la connaissance profonde du langage sous-jacent

- Langage fluide et clair Cela peut ecirctre testeacute par le lecteur en regardant le code Si

une analyse rapide lui permet de comprendre le sens du code alors celui-ci est clair

Naturellement lauteur ne peut effectuer cette analyse par lui-mecircme Bien que nous

ne puissions en faire une analyse scientifique en inspectant le code reacutesultant nous

73

sommes confiants que la syntaxe que nous avons choisie est claire et permet dexprimer

clairement les concepts sous-jacents au langage

- Qualiteacute de la documentation et courbe dapprentissage Il sagit ici dun autre eacuteleacutement

que nous pouvons difficilement aborder par nous-mecircmes Cela ne sera pas pris en

compte dans notre analyse

Selon ces diffeacuterents facteurs nous voyons que nous devrons surtout nous concentrer sur

la structure geacuteneacuterale du code ainsi que sur sa complexiteacute Le code doit ecirctre facile agrave

lire tout en permettant de compacter un maximum dinformation dans un minimum

despace

612 Diagramme de compilation

Notre premier dessin est tireacute dun livre de compilation Il sagit dun automate assez

standard et repreacutesente donc un bon diagramme moyen afin de voir les capaciteacutes de

notre logiciel

Figure 61 Diagramme dautomate de compilation

Quelques points importants sont agrave noter dans ce dessin Premiegraverement on note la

creacuteation dune structure sous-jacente (composeacutee dune ellipse et deux cercles) Par la

74

circlel Circle with [radius = 100] circle2 Circ le with [radius = 120] ellipse Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (1000 500) in main d3 put form at (1000 -500) in main put Text with [text $N(p_l)$] at (1000 1000) in main put Text with [text $N(p_2)$] at (1000 500) in main put Text with [text dotsJ at (100000) in main put Text with [text I$N(p_n)$J at (1000 -500) in main

put Text with [text = $s_O$J at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt(coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt(coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt(coord of anglePoint(1800) in maind3circle)

Figure 62 Code pour le diagramme dautomate

suite cette forme est appliqueacutee agrave plusieurs reprises dans le dessin Cela deacutemontre que

dans ce cas-ci il est possible de creacuteer et dutiliser des structures dun certain degreacute de

complexiteacute

On note aussi lutilisation des variables pour reacutecupeacuterer les dessins afin de pouvoir les

reacutefeacuterencer plus tard Cette eacutetape est aussi simple que lassignation agrave une variable Par

la suite on peut noter les flegraveches qui sont traceacutees agrave partir de points deacutefinis agrave partir de

certains cercles La structure mecircme est extrecircmement explicite dans ce cas et rend la

compreacutehension du dessin tregraves simple On reacutecupegravere aussi finalement les points formeacutes agrave

un certain angle dun cercle

75

La complexiteacute du diagramme est beaucoup plus simple quelle ne le serait avec des

primitives de base En effet les seuls dessins explicites que nous devons effectuer par

points sont les flegraveches De plus ces flegraveches sont relativement simples puisque nous navons

rien agrave speacutecifier pour le bout de flegraveche seulement les extreacutemiteacutes Pour le reste les formes

sont soient deacutefinies agrave partir de notre hieacuterarchie (comme les cercles ou les ellipses) ou

bien par un collage de formes plus simples (comme pour la forme form) Les points sont

obtenus par des accegraves structureacutes et fournissent donc des valeurs exactes rendant ces

opeacuterations extrecircmement rapides agrave eacutecrire pour lusager

On note toutefois quil existe certains eacuteleacutements dans le code qui auraient pu ecirctre simshy

plifieacutes afin de rendre le code encore plus compact En effet nous remarquons la preacutesence

de beaucoup de valeurs explicites alors quil aurait eacuteteacute possible de les remplacer par des

variables afin de rendre le tout plus clair

Un eacuteleacutement qui aurait pu amener une touche de simplification aurait eacuteteacute dutiliser des

listes ou des boucles afin dinseacuterer plus aiseacutement les objets Par exemple la structure

complexe aurait pu ecirctre ajouteacutee plusieurs fois par une boucle for avec des positions

calculeacutees en fonction de lindex Nous sommes toutefois davis que malgreacute lameacutelioration

possible que cela fournit au code il est peu probable que les utilisateurs finaux prennent

le temps de faire ce genre de modification et utiliseront fort probablement plus des

positions relatives avec une seacuterie dappels sauf si le nombre dobjets agrave positionner

devenait grand (par exemple une dizaine dobjets)

En geacuteneacuteral nous pouvons toutefois consideacuterer que ce diagramme est simplifieacute de beaushy

coup par lutilisation de notre solution La grande part du code est explicite et la strucshy

ture est tregraves simple agrave observer en regardant uniquement le code Mecircme si tout nest pas

parfait il y a clairement avantage agrave utiliser le logiciel pour coder cet automate

613 Diagramme de tableau

Notre second dessin est tireacute dun livre sur les structures de donneacutees Il repreacutesente

leacutevolution dune structure de donneacutee simple (un tableau) agrave travers certaines modifishy

76

cations

a ab 1 0 2 8 (lime

1 -10

3 7

iuml

Figure 63 Diagramme de tableau

Un des points les plus inteacuteressants de ce dessin est lutilisation dune fonction Elle place

une forme dans un canevas agrave plusieurs endroits speacutecifiques en fonction dune position de

deacutepart et dun vecteur de translation Cela nous permet de placer une forme identique

(un carreacute) plusieurs fois de suite ce qui nous donne limpression quil sagit en reacutealiteacute

dun tableau

Un autre point qui est tregraves important dans ce dessin est que les nombreux carreacutes sont

en fait tous des instances du mecircme deacutefini au deacutebut Cela permet de modifier lensemble

des carreacutes aiseacutement en ne modifiant que les proprieacuteteacutes de celui de base Pour le reste du

dessin il sagit surtout dun ensemble de flegraveches et de textes positionneacutes agrave des endroits

speacutecifiques

En analysant le code on voit une ameacutelioration claire provoqueacutee par le fait dutilishy

ser une fonction pour placer les carreacutes Cela nous permet de simplifier de beaucoup

les appels et les reacutepeacutetitions Nous pouvons toutefois noter que quelques ameacuteliorations

suppleacutementaires pourraient ecirctre apporteacutees En effet une classe aurait pu ecirctre eacutecrite en

Java pour repreacutesenter un tableau agrave lhorizontale ou agrave la verticale Cela aurait pu simshy

plifier significativement le code du dessin en combinant dans la structure le texte et

les carreacutes utiliseacutes pour repreacutesenter le tableau lui-mecircme De plus les flegraveches auraient pu

ecirctre deacutetermineacutees agrave partir de points obtenus du tableau lui-mecircme (par exemple le coin

supeacuterieur droit ou supeacuterieur gauche) auxquels nous aurions ajouteacute un vecentierteur de

deacuteplacement

77

fun dropMany(f n s v c) for i from 1 to n do

put f at (s + (i - 1) v) in c end

square = Square with [length = 200] changeVec = (00 -200) dropMany (square 4 (00 00) changeVec main)

dropMany(square 3 (500 00) changeVec main) dropMany(square 1 (1000 00) changeVec main)

dropMany (square 1 (1500 00) changeVec main) put Text with [text=O] at (00 00) in main

put Text with [text=l] at (00 -200) in main put Text with [text=3] at (00 -400) in main

put Text with [text=7] at (00 -600) in main put Text with [text=bf a] at (500200) in main put Text with [text=2] at (500 00) in main

put Text with [text=4] at (500 -200) in main put Text with [text=7] at (500 -400) in main

put Text with [text=7] at 0000 00) in main put Text with [text=bf $a-b-+$] at 0500 200) in main

put Text with [text=8] at 0500 00) in main put Text with [text=none] at (2000 00) in main

020 100)-gt(380 100) (620 100)-gt(880 100)

(1120 100)-gt0380100) 0620 100)-gt0880100)

Figure 64 Code pour le diagramme de tableau

Avec ces changements le code aurait pu ecirctre beaucoup plus compact Bien que cette

option soit reacutealisable nous ne lavons pas impleacutementeacutee car il eacutetait important de limiter

ce quun usager peut creacuteer sans lutilisation de Java Cela est ducirc au fait que notre objectif

est que seulles utilisateurs experts se servent de Java afin dameacuteliorer le logiciel Le code

est tout de mecircme significativement meilleur que de placer tout agrave la main ce qui nous

permet de conclure agrave lefficaciteacute de notre logiciel dans le cas dune structure geacuteneacuterale

78

614 Diagramme de Venn

Notre dernier dessin est une structure qui ressemble beaucoup plus agrave un dessin geacuteneacuteral

cest-agrave-dire un diagramme de Venn La forme dun tel diagramme fait quil est extrecircmeshy

ment complexe deacutecrire une classe qui permet de dessiner automatiquement ce type de

structure et quil vaut mieux creacuteer les formes une par une comme on le ferait agrave la main

Cela nous permettra danalyser si les choses simples agrave dessiner agrave la main demeurent

facile agrave reacutealiser avec notre logiciel

A

Figure 65 Diagramme de Venn

Ce dessin ne possegravede pas beaucoup de grands points dinteacuterecirct En effet la structure ne

peut pas vraiment ecirctre geacuteneacutereacutee automatiquement par un algorithme alors elle est entreacutee

manuellement On remarque tout de mecircme lutilisation de plusieurs sous-canevas afin

de simplifier le placement des objets qui sont agrave linteacuterieur dautres

Naturellement eacutetant donneacute que la structure doit ecirctre deacutecrite manuellement le code

nest pas plus court que lutilisation de primitives de base Par contre cela est comshy

penseacute par un niveau de clarteacute supeacuterieur eacutetant donneacute lutilisation des canevas afin de

regrouper les eacuteleacutements dans des ensembles respectifs Cfla permet de positionner tous

les eacuteleacutements en valeurs relatives au lieu dabsolues ce qui simplifie de beaucoup le travail

de positionnement

De plus le fait de pouvoir stocker les eacuteleacutements dans des variables nous permet de les

identifier par diffeacuterents noms significatifs ce que des primitives de base comme celles

79

circle = Circle with [radius = 100] bigcircle = Circ le with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvas1 put circle at 050 150) in canvas1 put Text with [text = H] at 050 150) in canvas1 put circle at (-150 150) in canvas1 put Text with [text J] at (-150 150) in canvas1 put Text with [text = B] at (00 -150) in canvas1

put bigcircle in canvas2 put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = F] at 050 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = E] ac (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvas1 at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = A] at (00 -300) in main put bigellipse in main

Figure 66 Code du diagramme de Venn

de PDF ne nous permet pas de faiTe Nous pouvons donc en conclure que mecircme pour

les structures difficiles agrave repreacutesenter notre logiciel fournit tout de mecircme un nombre

significatif davantages

Preacutesentation du produit final

Une fois que nous avons pu confirmer que notre logiciel eacutetait efficace il ne restait plus

quagrave le faire connaicirctre Nous preacutesentons donc ici un reacutesumeacute des efforts qui ont eacuteteacute

effectueacutes afin damener le logiciel agrave la connaissance de la communauteacute gIEX

62

80

621 Statistiques et documentation

En premier lieu avant de pouvoir preacutesenter notre solution il nous fallait la documenter

correctement En effet leffort de deacuteveloppement nous aura permis de deacutevelopper un

produit de tregraves grande taille La taille totale du travail se limite agrave environ 10 megs mais

cela implique plus de 6300 lignes de code deacuteveloppeacutees speacutecifiquement pour le projet

(cela incluant les commentaires mais excluant tout le code geacuteneacutereacute par SableCC qui est

tregraves exhaustif) Avec une taille aussi significative il est tout simplement impensable de

sattendre agrave ce quun utilisateur analyse le code afin de trouver ce qui va reacutepondre agrave ses

besoins

Pour cela nous avons pris le temps de reacutediger une documentation interne Elle consiste agrave

documenter chaque classe de notre hieacuterarchie ainsi que chaque fonction disponibles Cela

fournit des renseignements complets pour quelquun qui cherche un eacuteleacutement speacutecifique

du langage

622 Preacutesentation

Par la suite nous avons reacutedigeacute une preacutesentation pour la confeacuterence TUG 2010 que nous

avons preacutesenteacutee le 28 juin 2010 agrave San Francisco devant des membres tregraves influents de

la communauteacute JbTEX dont Donald Knuth le creacuteateur original de TEX La confeacuterence

nous a permis de nous mettre au pouls des besoins de la communauteacute et de linteacuterecirct

quils portent agrave un tel projet La reacuteponse se voulait enthousiaste particuliegraverement de

la part du preacutesentateur dAsymptote John Bowman La confeacuterence est disponible sur

le site de River Valley (Bourgeois 2010) (malheureusement sans videacuteo eacutetant donneacute un

problegraveme dopeacutemt ur)

Bien quil sagisse dun eacuteleacutement tregraves important dans la preacutesentation dun projet une

confeacuterence ne rejoint pas beaucoup de monde Pour combler ce besoin nous avons aussi

reacutedigeacute un article pour la revue TUGBoat (Bourgeois et Villemaire 2010a) qui est la

revue principale de la communauteacute JbTEX Nous avons inclus larticle en annexe Cela

81

nous a permis de rejoindre un public beaucoup plus grand quune simple preacutesentation

devant public

623 Site web

Finalement afin de faciliter la distribution de notre logiciel nous avons deacuteveloppeacute un site

web (Bourgeois et Villemaire 2uuml1uumlb) pour accompagner la preacutesentation et permettre le

teacuteleacutechargement Le site contient aussi toute notre documentation ainsi que les contenus

des preacutesentations et articles que nous avons mentionneacutes plus haut Nous avons aussi pris

le temps de fournir quelques exemples suppleacutementaires afin de montrer lattrait direct

de SDDL

63 Conclusion de notre analyse

Nous concluons que notre solution est efficace et quelle respecte agrave diffeacuterents niveaux

les critegraveres que nous nous eacutetions fixeacutes au deacutepart Il sagit dune hieacuterarchie dobjets facile

et extensible accompagneacutee dune syntaxe claire et fluide Avec lajout de la gestion des

erreurs et sa capaciteacute agrave deacutecrire plusieurs formes de structures notre logiciel permet de

simplifier la repreacutesentation des diagrammes classiques du domaine Nous en venons donc

agrave la conclusion que notre solution respecte les diffeacuterents critegraveres et nous pouvons donc

consideacuterer notre solution comme eacutetant valide

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CONCLUSIOK

La creacuteation de diagrammes structureacutes comme nous avons pu le constater tout au long

de ce meacutemoire est un sujet tregraves complexe Bien quil puisse de prime abord necirctre vu

que comme la capaciteacute de faire des petits dessins simples nous remarquons rapidement

que les deacutecrire tels que nous les voyons est beaucoup plus difficile quil y parait

Entre autres nous avons pu constater que les diagrammes sont penseacutes de maniegravere

extrecircmement abstraites En effet dans un arbre nous ne voyons pas une seacuterie de somshy

mets relieacutes par des points mais bel et bien un arbre seulement Cette capaciteacute agrave abstraire

la forme du contenu est extrecircmement pratique pour un ecirctre humain mais pas tregraves utile

pour un ordinateur Il est extrecircmement difficile dessayer de saffranchir du besoin de

speacutecifier la forme lorsquon veut creacuteer un diagramme

Il en est de mecircme avec IbTEX duquel nous nous sommes inspireacute Bien que le logiciel

puisse faire la forme de maniegravere adeacutequate dans plusieurs cas ces derniers savegraverent tregraves

speacutecifiques et plus souvent quautrement la possibiliteacute dobtenir un niveau accru de

controcircle sur la forme est souhaitable Dautre part la question du positionnement dun

texte scientifique dans une page a eacuteteacute abondamment eacutetudieacute (entre autre par la creacuteation

de TEX) alors que le bon positionnement dun diagramme la eacuteteacute beaucoup moins Il

est donc probleacutematique de se deacutebarrasser de cet eacuteleacutement de forme dans nimporte quel

logiciel de creacuteation de diagrammes

Cela nous amegravene donc agrave la question naturelle de savoir si notre logiciel savegravere une solushy

tion valide agrave notre probleacutematique initiale En effet bien que notre analyse deacutemontre que

la creacuteation de dessins devient plus simple nous ne pouvons affirmer que nous eacutecrivons

ce que nous pensons du diagramme

- -

84

Or comme la question est de veacuterifier la validiteacute de notre solution nous reacutepondrons par

laffirmative Mecircme si elle nest pas parfaite un degreacute de complexiteacute se trouve eacutelimineacute

malgreacute tout Il est tout de mecircme possible pour un utilisateur de penser en des termes plus

abstraits mecircme sil ne sagit pas du niveau dabstraction optimal De plus eacutetant donneacute

que nous avons creacuteeacute notre solution pour ecirctre extensible il est possible daugmenter le

niveau dabstraction avec la contribution de la communauteacute Bien que la solution ne soit

pas parfaite et aurait pu jouir dameacuteliorations subseacutequentes lobjectif principal eacutetait de

deacutevelopper un langage qui simplifiait la description de diagrammes structureacutes et cela

fut atteint

Naturellement eacutetant donneacute les limites de temps et de complexiteacute plusieurs pistes de

deacuteveloppements suppleacutementaires nont pu ecirctre utiliseacutees En effet nous nous sommes

limiteacutes agrave la description dune image statique Il est toutefois tregraves utile de pouvoir creacuteer

des images dynamiques La possibiliteacute de creacuteer des seacutequences de mouvements agrave linteacuterieur

dun diagramme aurait pu rendre notre outil plus inteacuteressant De plus lUl outil de

geacuteneacuteration automatique de graphes ou darbres mecircme imparfait pourrait fournir des

choix suppleacutementaires agrave un utilisateur qui souhaite obtenir un reacutesultat rapidement sans

toutefois rechercher un reacutesultat parfait

Il est toutefois bon de noter que bien quil soit long et complexe deffectuer de tels

ajouts notre logiciel a eacuteteacute penseacute en fonction de pouvoir ecirctre eacutetendu par lutilisateur Il

est donc tout agrave fait possible de pouvoir eacuteventuellement fournir de telles fonctionnaliteacutes

dans une version future du programme Dici lagrave celui-ci suffira amplement agrave la creacuteation

de diagrammes simples

APPENDICE A

PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

Nous incluons ici larticle complet que nous avons reacutedigeacute agrave propos de notre logiciel

afin den faire la promotion aupregraves de la communauteacute TEX et JbTEX Cet article qui fut

preacutesenteacute dans Tugboat la revue du TEX Users Group tel que mentionneacute preacuteceacutedemment

compleacutemente la preacutesentation qui fut effectueacutee lors de la confeacuterence du mecircme groupe

agrave San Francisco Larticle est essentiellement une introduction pragmatique pour un

utilisateur final et fournit donc plusieurs exemples inteacuteressants dutilisation tout en

deacutecrivant briegravevement les diffeacuterents concepts importants qui ont meneacutes le deacuteveloppement

de SDDL Il sagit de la version finale tel que Jarticle apparait dans le numeacutero de Tugboat

206

Drawing structured diagrams with SDDL

Mathieu Bourgeois and Roger Villemaire

Abstract

We present SOOL a Structured Diagram Description Language aimed at producing graphical representashytions for discrete mathematics and computer science SDDL allows combining graphical objects (circles lines arrows ) and lbTEX boxes to produce diashygrams representing discrete structures such as graphs trees etc with an easy-to-use domain specific lanshyguage

1 What is SDDL

SDDL Structured Diagram Description Language is a high-level domain specific language tailored for diagrams that have an inherent structure Examples of these might be trees graphs and automata Any diagram that is naturally structured can be described in SDOL However it was designed especially for data structures appearing in computer science and discrete mathematics

The main objective of this language is to realize drawings in a natural and structured way Mainly one describes a drawing in SOOL in a way that is simishylar to drawing on a blackboard For example specific shapes (like circles ellipses texts boxes) are drawn at positions that can be either absolute or relative to specific points on already placed shapes Since we aim at mathematical drawings text is handled through lbTEX

Since exhibiting the structure of a diagram is esshysential to our purpose SOOL uses an object-oriented hierarchy completely written in Java under our high-levellanguage Having shapes as objects makes structuring of diagrams easier and more intuitive since most shapes are explicitly represented by a class Furthermore extension by the end user is quite feasible since Java is a well-known language

At the lower level SDDL uses another graphishycal description language for lbTEX namely Asympshytote [1] Our tool produces Asymptote code which is finally converted to an encapsulated PostScript (eps) vector file

2 Canvas and shapes

A diagram in SDDL is defined by a main Canvas It is just like a standard painting canvas in the sense that we can place (or paint) different things on it as much as we like The things we can place inside a Canvas are Shapes Thus for creating a Hello world diagram we would use the following

put Text with [text = Hello worldJ in main

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

resulting in

Hello world

In this example Text is a Shape and it posshysesses a property text which is the JbTEX string used to render the text Each Shape defines a cershytain number of such properties

SDDL permits the definition of variables It is a dynamically typed language so variables dont have to be declared before being used Variables make it possible to reuse the same Shape at multiple locations For example

a = Circle with [radius = 100] put a at (-75 00) in main put a at (75 00) in main

m In this example we specify the location where we want our Shape to be If a location is not specified with the at clause the Shape will be placed at the point of origin of the current Canvas which is its center

One important thing to note is that once a Shape has been put in a Canvas it is immutable It cannot be modified or removed A Shape can be modified alter it has been drawn on a Canvas but this will have an effect only on later use of this object and will not modify the actual Canvas in any way a Shape always appears in a Canvas as it was at the moment it was added

When a Shape is created every property specishyfied by the user is set in the given order It is not necessary to specify ail properties at once nor to set ail of them Most of the properties have appropriate default values However sorne properties if not set will yield strange results For example a circle with no radius property set will have a defaul radius of O Usually property order is irrelevant For instance giving for an ellipse the radius along the x-axis or the y-axis first will yield exactly the saille result

a = Ellipse a = a with [xradius 200] a = a with [yradius 100] put a in main

o 3 Structuring multiple canvases

Every diagram consists of a main Canvas However we can define other Canvas objects if we wish An additional Canvas can be introduced using a typical variable assignment However when a put command is used SODL checks to see if the canvas variable is

4

207 TUGboat Volume 31 (2010) No 2

already defined If it isnt it automatically creates an empty Canvas for use

One of the main reasons to use other Canvases is to create an explicit structure in our diagram Since a Canvas is a Shape once a sub-Canvas has been created it can be placed inside the main Canvas or any other one for that matter This will ensure that everything that is defined inside our sub-Canvas will be placed at the proper position in the final diagram However any Canvas that has been defined but is not linked directly or indirectly with the main Canvas will not be drawn in the final diagram

As an example lets say we want to make a diagram that consists of two identical eyes Instead of defining two identical objects we will create one in a Canvas named form and put it at different positions inside our main Canvas Our eye consists of a circle and an ellipse both with the same center Ali we need to do for this is place them at the default position of the Canvas Finally we can take this subshyCanvas and place it at the two positions required a ~ Circle with [radius~100]

b ~ Ellipse with [xradius~200 yradius~100]

put a in form put b in form put form at (-200 00) in main put form at (200 00) in main

Paths

SDDL offers support for the description of paths The way in which they are described is similar in syntax with MetaPost and Asymptote though with sorne variations A Path shape is described by linking points together with specific linking symbols To draw a line between two points the line symbol - shycan be used To link sorne points using a curve use the curved line symbol - which will use Asymptotes positioning algorithms to create a nice-looking curve which passes through those points For the moment user control over the curve is limited to beginning and ending tangents but could be expanded

pl ~ a--b--c p2 ~ a-b-c

One of the other things you may want to do with a Path is to create an Arrow out of it SDDL defines symbols for forward backward and bidirectional arshyrows for both linear and curved lines Right now however support is restricted to forward arrows

pl ~ alt-b--c-gtd p2 alt-b-c-gtd p3 alt-gtb p4 aCgtb

Once a Path is defined it can be used as any other Shape However one of the main things that you want ta do is ta put your Path somewhere For this you can write something Iike this p ~ (00 00) -- (100 100) put p in main

This is the standard way to add Shapes ta a Canvas However since Paths are usually used to link different Shapes together in the main Canvas special handling is done in SDDL Namely a Path that is not explicitly assigned to a variable will be automatically placed in the main Canvas Therefore the Path will be directly placed in main without any explicit put expression Thus linking has its own special syntax which is more natural and convenient As an example this program (00 00) -- (100 100)

yields exactly the same result as the one just above Furthermore points can be added and multiplied by a scalar (as vectors) Using a dot to locate the origin of the drawing we can use the SDDL syntax ta create this example a ~ (100 100) a--20a-gt(300 00) a-(-10)a-(300 00)

ocirc Finally as we will now see Shapes also usually

define specifie points

5 Drawing and linking shapes together

Ta draw a diagram usually sorne shapes with a specific structure are first laid down Once that is done those objects are linked together with lines curves and arrows However these links must be made between specific positions usually derived from one or more specifie Shapes For example we may want to link the northwestern point of a rectangle with the point on a circle at an angle of 45 degrees These points could obviously be computed in advance However this becomes quite problematic when points are at peculiar angles or more complex relationships between points and Shapes are needed Worst of ail if the position or any other property of a Shape is changed ail computations will have to be redone

To ease object linking SDDL provides so-called reference points A reference point is a point that has no static value unlike points defined by a pair of two real numbers Instead a reference point is defined by its relationship to a specifie Shape appearing at a particular location As a matter of fact ail reference

Drawing structured diagrams with SDDL

208

points are defined along with the Shape because they are a natural part of it This ensures that we always have nice-looking lines at exactly the positions we want them to be

However a reference points exact position in a Canvas will depend on the Shapes position Worse since the same Shape can appears at multiple locashytions in the same Canvas we have to know which occurrence we are talking about

Therefore SDDL introcluces a feature called a Drawing A Drawing is an object that represents a Shape at a particular position Le a specifie occurshyrence of a Shape in a Canvas Whenever a Shape is put inside a Canvas a Drawing is returned and can be assigned to a variable This gives a way to uniquely identify every occurrence of a Shape apshypearing in a Canvas If the same Shape is placed twice two different Drawings will be returned each referring to a different occurrence of the same Shape

a = Circle with [radius = 100] dl = put a at (-100 00) in main d2 = put a at (100 00) in main

Once a drawing has been defined a way to access its points is needed SDDL defines a syntax for extracting points from drawings

coord of (coord) ( (args) ) in (drawing)

Here one specifies the kind of point to use (( coord) ) and any particular arguments required to obtain it The available points are Shape specifie so only those kinds of points which make sense for the particular Shape can be used For instance one can get a point at a particular angle on a Circle This is also an example where an additional argument is needed For instance anglePoint(450) will give the point at 45 degrees

Finally to reference the drawing from which we take the point its clrawing Path (a dot separatecl path) from the main diagram must be given

a = Circle with [radius = 100] dl = put a at (-75 00) in main d2 = put a at (75 00) in main (coord of anglePoint(OO) in maindl)

(coord of anglePoint(1800) in maind2)

m In this example a line between two identical circles is drawn The drawing Paths are simple here since both drawings are made directly in main Thus only main followed by the drawing name is needed

Simply giving a Drawing is not sufficient in order to make reference points non-ambiguous complete drawing Paths are required as we will now show Lets go back to the two eyes we drew previously

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

The eye was defined by a circle and an ellipse both put inside a sub-Canvas Now lets say we want to draw a line between the two circles Each of those circles is defined in the sub-Canvas and they are as a matter of fact the same Drawing a Adding a link between a and itself wauld add a link between the sub-Canvas circle and itself (what could this mean) Adding the sub-Canvas to the main Canvas twice as we did before would just duplicate this structure inside the main Canvas

But since a Canvas is a Shape we get a drawing when we put the sub-Canvas inside main We can therefore identify each inner circle by listing the drawings required to access them as shown in the following SDDL example Thus we can always link together Shapes that are deeply nested inside a subshyCanvas a = Circ le with [radius=100] b = Ellipse with [xradius=200 yradius=100] c = put a in form put b in form fl = put form at (-200 00) in main f2 = put form at (200 00) in main (coord of anglePoint(1800) in mainflc) -gt

(coord of anglePoint(OO) in mainf2c)

6 Programming constructs and lists

SDDL also defines typical programming constructs For instance Iists are created and elements accessed in a syntax similar to most other dynamic languages Since the content of a list is a general Java Dbject you can create a list of objects that are not of the same type Thus an assignment like l = [20 (00 00) [] a--b]

is perfectly legal even if not typically very useful A more typical use of Iists would be list = [(00 00) (100 100)] 1= list[O] 12 = list [1]

1--12

Lists are nice but to use them properly adeshyquate programming canstructs are needed such as for and while loops SODL defines those permitting us to draw arrays of Shapes or riAfine points through a simple list

The ability to use loops significantly simplifies many diagrams in computer science In this example we first define a Iist of points Afterward using a for loop we link those points into a linear Path a = [(100 100) (200 100)

(200 200) (100 200)] for i from 0 to 2 do

209 TUGboat Volume 31 (2010) No 2

a[i]--a[H1)

end

Alternatively we coulcl get the same result using the following while loop i = 0 hile i 1= 3 do

a [il --a [i+1] i = i + 1

end

7 Functions

SDDL also permits the creation of functiolli inside the code Those must be written before the diagram description A SDDL function is defined with the keyword fun The list of arguments does not need to be typed only named The return type (if it exists) does not need to be specified either To cali the function in the resulting code a typical C-like cali is used fun dropManyCs i v n c)

for j from 1 to n do put s at i + jv in c

end

circle = Circ le vith [radius = 50] dropManyCcircle COO 00)

C50 00) 100 main)

(rtttt3JJJ) In this case we define a function that drops

many instances of a Shape s at different positions on a Canvas c The positions of the Shape are detershymined by an initial point i and a translation vector v Finally the number of Shapes placed is also given as a parameter n Each Shape is then placed at the initial point translated by the translation vector a certain number of times This permits us to create many circles along one line

One important point is the parameter for the Canvas in which we place the Shapes However we pass main as our parameter The reason for this is that SDDL does not possess global variables A function can only access its parameters and variables that have been defined inside the function Thus trying to place something in main From inside a funcshytion will yield an errer message saying the variable main is unknown

8 Primitives

SDDL as mentioned before is written in Java One of the nice features of Java is its libraries Many classes have been written for any number of different tasks and the number of functions and algorithms implemented is astonishing To rewrite libraries that are already defined in Java or to link them one by

one in SDDL seemed pointless It is much nicer to directly use those functions since theyre already there

Since Java is a reftexive language in the sense that the program knows about itself and can modify itself at will functions can be dynamically accessed at runtime We already use this feature to simplify the definition of the SDDL interpreter the interpreter doesnt have to know every possible type of Shape in order to work Using these same mechanisms permits loading classes at runtime and gives the user the power to cali From inside SDDL any Java function

This is done through so-called primitives which are defined using the keyword primitive followed by the name of the function as it will appear in SDDL Following that two strings are given one for the package in which the function is defined and one for the name of the function as it was defined in Java Any primitive declaration must be made prior to any function definition

Lets look at an example One of the main things a diagram description language would require is sorne basic mathematics and geometry libraries Java possesses a nice java lang math package which we would like to use especially the sin and cos funcshytions For this we will need to define two primitives primitive static sin javalangMath sin primitive static cos javalangMath cos

Once they are defined they can be called just like any other SDDL functions In this case we will use those functions to place circles around an invisible circle for i from 1 to 6 do

put Circle vith [radius = 50] at C200 cos(i 314 30) 200 sin(i 314 30raquo

in main end

00 o 0 00

9 A concrete example

Now that we have ail our tools lets use SDDL to describe a simple diagram of an automaton This is the complete code along with the resulting image circlel Circle vith [radius = 100] circle2 Circle vith [radius = 120] ellipse Ellipse vith [xradius = 500

yradius = 200] circle = put circlel at (-300 00) in form put circlel at C300 00) in form put circle2 at (300 00) in form

Drawing structured diagrams with SDDL

210

put ellipse in form

dl = put form at (1000 1000) in main d2 = put form at (1000 500) in main d3 = put form at (1000 -500) in main put Text with [text=$N(p_1)$]

at (1000 1000) in main put Text with [text=$N(p_2)$]

at (1000 500) in main put Text with [text=dots]

at (100000) in main put Text with [text=$N(p_n)$]

at (1000 -500) in main

put Text with [text = $s_O$] at (00 200) in main

d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle) (coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle) (coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

10 Modifying the hierarchy by adding shapes

Using what has been described above most diagrams can be created However many simplifications can be made and sorne domains may find it relevant to add classes specifie to their trade SDDL eases the modification of the Java hierarchy underneath the language by using reftexivity Any user who respects sorne basic guidelines will be able to have its class work automatica11y in SDDL without any specifie linking required

To do this every class must possess a certain number of properties Those properties are defined through setters and getters For instance for the

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

radius of a circle these are called setRadius and getRadius Any property that follows this rule will be accessible

Furthermore an empty constructor must also be defined that sets as much as possible default values for a11 properties of the defined Shape There are also sorne small functions to be defined like the draw and obtainPath functions Any reference points must also be defined with a function to obtain them

As an example lets say we would like to add a class to represent a cloud A cloud will have a number of spikes and a size The class definition (without function definition) that we would require would be the following

public class Cloud extends Shape double size int numberOfSpikes public Cloud() public void setSize(double size) public double getSize() public void setNumberOfSpikes(int n) public int getNumberOfSpikes() public void draw(AbstractPoint a

PrintWriter w) public Path obtainPath()

11 Future additions and availability

SDDL is available now at httpwwwinfo2uqam cal -villemaire_rReChereacuteheSDDL It is funcshytional though not by any means complete Many additional Shapes couid be added (in particular tree and graph classes) and options could be added to existing classes Development of the application conshytinues for the time being and a more thorough version will be made available

References

[1] John C Bowman and Andy Hammerlindl Asymptote A vector graphies language TUGboat The Communications of the TEX Users Group 29288-294 2008

o Mathieu Bourgeois Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada bourgeois dot mathieu dot 2 (at)

courrier dot uqam dot ca

o Roger Villemaire Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada villemaire dot roger (at) uqam dot ca httpintrainfouqamca

personnelsMembersvillemaire_r

APPENDICE B

PREacuteSENTATION DE LA GRAMMAIRE DE SDDL

Nous preacutesentons ici le contenu entier de la grammaire de SDDL tel que reacutealiseacute avec

SableCC Tous les eacuteleacutements du langage sont lagrave agrave lexception de la reacuteflexiviteacute dont les

deacutetails de code sont situeacutes dans la partie Java de notre projet

Package sddlsyntax

Helpers

any [O Oxffff]

tab 9 li 10 cr = 13

upper [ A 2 ]

lower [ a z]

digit [ 0 9]

name char = upper 1 lower 1 digit -

string_char = [[32 126] - ]

= J bulldot

not star = [any-] not_star_not_slash = [not_star - l]

Tokens

92

put_kwd = put at_kwd = at in_kwd = in fit_kwd = fit around_kwd = around if_kwd = if

while_kwd = while true_kwd = true false_kwd = false then_kwd = then else_kwd = else for_kwd = for from_kwd = from end_kwd = end to kwd to by_kwd = by do_kwd = do with_kwd = with and_kwd = and or_kwd = or fun_kwd = fun return_kwd = return primitive_kwd = primitive call_kwd = call static_kwd = static coord_kwd = coord of _kwd = of get_kwd = get

scaled_kwd = scaled slanted_kwd = slanted rotated_kwd = rotated translated_kwd = translated

straight_line_kwd = -- curved_line_kwd = - straight_fwd_arrow_kwd = -gt curved_fwd_arrow_kwd = -gt straight_bwd_arrow_kwd = (- curved_bwd_arrow_kwd = (- straight_bidir_arrow_kwd = (-gt curved_bidir_arrow_kwd = (-gt

93

plus = + minus = -

mult = div =

eq = == neq = = lt lt gt = gt leq lt= geq gt= not assign = =

dot = dot

l br = - r br ( l _par = ) r_par =

l cr = [ )

-r_cr = J

sc = comma =

id = lower name_char class_name = upper name_char

integer = (-) digit+ real = (-) digit+ dot digit+

) ) Il J )Ilstring string_char

blank = 1 tab 1 cr 1 If 1 cr If comment not_star ( (not_star_not_slash not_star))

Ignored Tokens

blank comment

Productions

file = [primitives] primitive [functions] function [stms] stm

94

primitive =

primitive_kwd static_kwd id [class_name] string [func_name] string signature sc

signature = l_par type_list r_par

type_li st = string [additional_types] additional_type

additional_type comma string

function = fun_kwd id l_par id_list r_par l_br [stms]stm r_br

id_list =

id [additional_ids] additional_id

additional id comma id

stm = exp exp sc 1

assign id assign exp sc 1

while while_kwd exp do_kwd [stms] stm end_kwd sc Il if if_kwd exp then_kwd [stms] stm else_part end_kwd sc 1

for for_kwd id from_kwd [low_bound] exp to_kwd [up_bound] exp do_kwd [stms] stm end_kwd sc 1

return return_kwd exp sc

else_part = else_kwd [stms] stm

exp = or exp or_kwd and_exp simple and_exp

and_exp = and and_exp and_kwd line_exp 1

simple line_exp

line_exp line line_exp line_op eq_exp with_part 1

95

1

1

simple eq_exp

line_op =

straight_Iine straight_line_kwd 1

curved_line curved_Iine_kwd 1

straight_fwd_arrow straight_fwd_arrow_kwd curved_fwd_arrow curved_fwd_arrow_kwd 1

straight_bwd_arrow straight_bwd_arrow_kwd curved_bwd_arrow curved_bwd_arrow_kwd 1

straight_bidir_arrow straight_bidir_arrow_kwd curved_bidir_arrow curved_bidir_arrow_kwd

eq_exp = eq [left] cmp_exp eq [right] cmp_exp 1

neq [left] cmp_exp neq [right] cmp_exp simple cmp_exp

cmp_exp = lt [left] add_exp lt [right] add_exp 1

gt [left] add_exp gt [right] add_exp 1

leq [left] add_exp leq [right] add_exp geq [left] add_exp geq [right] add_exp simple add_exp

add_exp = add add_exp plus mul_exp 1

minus add_exp minus mul_exp simple mul_exp

mul_exp =

mult mul_exp mult left_unary_exp div mul_exp div left_unary_exp simple left_unary_exp

left_unary_exp = not not left_unary_exp get get_kwd id from_kwd left_unary_exp put put_kwd exp at_part in_kwd left_unary_exp fit fit_kwd class_Dame around_kwd left_uoary_exp coord coord_kwd of_kwd id l_par

arg_Iist r_par in_kwd left_unary_exp 1

simple right_exp

96

right_exp = calI right_exp dot id l_par arg_Iist r_par 1

index right_exp l_cr exp r_cr 1

scaled right_exp scaled_kwd l_par eq_exp r_par slanted right_exp slanted_kwd l_par

[xslant] exp comma [yslant] eq_exp r_par rotated right_exp rotated_kwd l_par eq_exp r_par 1

translated right_exp translated_kwd l_par [xtranslate] term comma [ytranslate] eq_exp r_par 1

simple term

term =

par l_par exp r_par 1

point l_par [x_value] exp comma [y_value] exp r_par 1

drawing class_name with_part 1

var id 1

int integer 1

real real 1

true true_kwd 1

false false_kwd string string 1

list l_cr arg_Iist r_cr 1

static_call id l_par arg_Iist r_par

arg_Iist = exp [additional_args] additional_arg

additional_arg comma exp

with_part = with_kwd l cr options r_cr

options = option [additional_options] additional_option

additional_option comma option

option = id assign exp

APPENDICE C

PREacuteSENTATION DE LA HIEacuteRARCHIE

Nous preacutesentons ici la description complegravete de notre hieacuterarchie objet en Java Le tout est

deacutecrit agrave laide dun diagramme UML Toutefois afin de faciliter le formatage nous avons

seacutepareacute le tout en deux sections Le premier diagramme contient les noms des classes ainsi

que leurs relations dheacuteritage Par apregraves tous les diagrammes suivants repreacutesentent le

contenu speacutecifique de chaque classe sans les relations entre classes Ceci nous permet

dobtenir une vue densemble des classes tout en obtenant des deacutetails cruciaux sur

limpleacutementation de chaque classe

98

l -llill Pa aj f1 1 Sh middotisVIsible boolampan

+draw(locaton AbstractPoint oot PniltWriBl) void

+lsVlsigtle() boolean +copyO Shape +obtalnPathO Path

Drawlna

-numberOIDrawinm int =0 middotdrawingNumber (nt -dependendes DrawingD middotpointsDellned AbsttactPolntD middothasBeenDrawn booLean middotshape Shape dmWingName string middotdrowingPositlon AbstractPoint -position AbstnldPolnt

+Orawlog(s Shape) +Shape(s S~ location AbsbaclPoint) +setPositlcn(positlon AbslradPoinl) void +seIDraloVingName(nsme slJfng) void +gelName() string +geISUbDrawlng(name string) ~ Drawlng +re~~Jri~)slring

+addDeflO8dPoint(point AbstractPolnl) Int +hasBeenDraWn() booIean +lsDrawn() booIean +canBeDlBWn() booIean +getShape() Shape fdraw(Jocafion AbslraclPolnt out PrlnlWriler) void +obtainPathO Path -tdp(other Orawilg) AbslractPoilt

uare length double

+Squate() ~s ( ~ le)

ell-eoatMength double) void +getlongthO bulldouble +dmw(locabmiddotoo AbstrampctPoint out PrnMYler) void +obtainPath() Path ffOPY() Shape

99

Rectangle

-lengIh double -wldth double -100 KI boeacuteIean

+Rectangle() +Rectangle(length double wldth double) +selleogth~ength double) void +setWldth(Width double) void +seIRound(rlaquo)Ulld booIegravean) void +getlengtb( doubIe +getMdth() double +getRound() booIeao +getNorth(d Dmwlog) RefPoint lttget5outh(d Drawlng) RefPolnl +getwest(d DlaWlng) RefPoint +gelEaat(d Drawlng) RefPoinl +gelNorthwest(d Drawllg) RefPoInt +gelNortheast(d Drawlng) R1tfPolnt lttgetSou1hwe$(d Drawlng) RefPoInt +get5outheast(d Drawilg) RefPoklt +dl8wlocalion Absl18ctPoiIt Ougravet ~Mhl81 void ii)blainPathO ~ Path

CIrcIe

middotradlus double

+Clœ() +Clrcle(radlus double)

+COPYO Shape +setRadlus(radius ~ double) void +getRadius() double +getAnglePolnt(d Omwilg angle double) RefPoInt +dmwlocation AbstradPoirlt our AiltKtler) VOiCI iOblailPath() Path

ElIID8e

middotxradlus double middotyradlus double

+Ellpse() +copyO bullShape +setXRadlus(r double) void +setYRadIus(r doublrt) void -gelXRadlus() double +geIYRadius() double +draw(txalJon AbstractPomt out PrinMbl8l) IIOIumld iOblainPathO Path

100

Lino point1 AbslractPoln1 middotpoint2 AbstractPoint

+L1oe() +Llne(point1 AbstractPoint poill2 AbstractPolnt) +COPYO Shape +dmw(locaIJon AbsIroctPoinl out PrnIWril9f) void +selPolnt1 (poInl1 AbsttactPoint) void +seIPoill2(poinl2 AbslractPoinl) void +getPolnl1 () AbslraclPoinl tiJotPolnl2() AbstraclPolntn_~

EqTrtanale middotsim double

-EqTriangleQ +EqTrlangle(size double) +cOPYO Shape +setSlze(slze double) void +gets1ze() double +d18W(Jocolion AbstTadPoinl out Ptil1Wfit8f) void +oblalllPalhll Path

middotpath Path bulltext string middotposIlIon double -dir Poilt middotabsohJle boolean middothasTexl boolean

+Arrav(path Palh) +copyO Shape TCl(( ex s n~ U blo dn 010 aosolute boolean) void seISlartingTangcnl(dlr Poinl) void

seIEndflgTangenl(dir Potnt) void tgelPalhO Palh +obtalnPath Path

101

cany -canvasLlst Carwas(J -canvasPontLIsl AbstractPoinllJ daWVigUsl DrawingD dlawilgPolnlUst AbsJaCtPolntO middotIsMaIn booean canvasPosltion bullAbstmetPoint

+CsnYaS() copYO Shape +seteanvasPositIoR(posllon AbslraclPotnt) VOId +setMaln() void +f8Mai1() booIean +addShape(S Shapeloca1ion AbstradPoItit) Drawilg l+a~pe(S Shape IocagravetJon AllstraclPolnl name slring) DraNklg +getOtawiDg(I Inl) D1awlng ~elDtawfng(namamp string) bull Drawilg tgelOl8WIngiocal1on(namo stlllllJ) AbsllaclPoilt ~olDmwlngOrNull(name string) Drawilg tgelOrawinglocation(l int) AbslractPolnt o+getNumberOfDrawlngs() int +dl8w(location AbstrodPonr oui PrintwrllerJ void +dmwMain(oul PrinlWrllGr) void +drawCanvaa(locatlon AbSlractPoinl remalnlllQDraws Drawlna Il out Prlntwriter) void

Path -Bst AbstractPolnllJ middothasASIartilgTangent boolean -hasAEndhlgTangent booIean -startiogTangent Point middotendingTangent Point middot1sU1ear boolean

+PathO Psth(Ust AbstraclPoint 0) +Path(Dst Ab~tPolnt Q startingTangent Polnt endlngTangenl Point) +cOPYO Sh8p6 +addPoinl(poiumlnl Abstl8ClPoint) void +seIUnear() void +IsUnearO booloao +getPolnt(l Inl) AbsIraclPcInl +getPolnts() AbsIlaCPoht 0 o+getNumberOlPolnts() Rt +cyc1B() void -thasASI8rthgTangent() boolean +hasAEndingTangentO booIoan +getStattilgTangenlO PoiIl +getEndlngTangent() Polnl 4uumllSlartingTangenl(stllllngTangent Peint) w1d +seIEndIllQTangent(encliigTangenl ~nt) void +psthValue() strilg +dmwJocalion AbslradPoItlI oot FilMtJrer) void

102

Text

-told slfng

ImiddotTexl() +Texl(lext string) +sotText(tegravext string) void iil8tTeld() string +draw(Jocalion AbstroctPoJnl oof PrinWriter) void ~btalnPath() Path +CODV(J ShsD9

AbsctPolnl +altfd(second AbstraclPoinl) AbslractPolnt -tmulliply(multipier double) AbstraclPolnt +eombine(perœntage double second AbstraclPolnl) AbstractPoint +solvfJ() slrillg +COfNIJ AbslradPoinl

Point -x double y doub19

+POIcirclIO +POIOI(x double y double) +solvo() slting -+IoSlflngO string~ n bull

RefPolnt -mf8teflœDrawlng Drawlng -poIntNumbef Int

+RefPoint(referenceDrawing DraYIing poiolNu ber Illl) +SoNe() stmg +COPYO AbstroctPDAcirclf

lnauudJonPoint p Path

-q Palh

+lnlCfSecllonPoint(p Palh q Path) +COPYO AbstrampcfPoitlt +soIve() string

103

Un Point -point AbsbaclPoint -pIampStmg string -endStrlng string -value double

+UnaryMapPolnl(poInt AbstradPoInt) +ScW9() string +setMapTypeMultlpIy(vallJe double) void +c Abslr8ctPoinI

Bln oint frstPoint Absll8clPoinl secoodPoInt AbstrootPoint -pceSIring string -middIeSlrIng Itlfno -endString string

+8ilatyMapPolnt(fkstPoiIt Abstmc1Po1nt secondPolnt AbslraetPointl +cOPYO bull AbstraetPOOI +soAte() string +selMapTypeAddO void

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

APPENDICE D

PREacuteSENTATION DES DIAGRAMMES CHOISIS

Cet annexe comprend lensemble des quinze (15) diagrammes que nous avons choisis

comme base de qualiteacute pour notre projet Tel que mentionneacute preacuteceacutedemment nous avons

inclus agrave la fois le code de chaque diagramme en SDDL ainsi que le diagramme reacutesultant

Aucune analyse nest effectueacute pour ces dessins agrave lexception de ceux deacutejagrave analyseacutes au

chapitre 6

Start box triangle = EqTriangle with [size = 400J put triangle at (00 -100) in main put Text with [text = StartJ at (00 -50) in main

El box rectanglePos = (00 -500) rectangle = Rectangle with [length = 1600 width = 300J put rectangle at rectanglePos in main put Text with [text El J at rectanglePos - (600 00) in main put Text with [text $a leftarrow O$J

at rectanglePos + (-300 50) in main put Text with [text $b leftarrow l$J

at rectanglePos + (-300 -50) in main put Text with [text $a leftarrow l$J

at rectanglePos + (100 50) in main put Text with [text $b leftarrow O$J

at rectanglePos + (100 -50) in main put Text with [text $c leftarrow m$J

at rectanglePos + (500 50) in main put Text with [text $d leftarrow n$J

106

at rectanglePos + (500 -50) in main

1 E2 box 1 rectangle2Pos = (00 -1000) put rectangle at rectangle2Pos in main put Text with [text = E2 ] at rectangle2Pos (600 00) in main put Text with [text = $q leftarrow quotient(c div d)$]

at rectangle2Pos + (100 50) in main put Text with [text = $r leftarrow remainderCc div d)$]

at rectangle2Pos + (100 -50) in main

1 Round E3 box 1 rectangle3Pos = (00 -1500) roundRectangle = Rectangle with [length = 800 width 250

round = true] put roundRectangle at rectangle3Pos in main put Text with [text = E3 $r = O$] at rectangle3Pos in main

1 Stop box 1 stopPos = (1500 -1700) put triangle at stopPos in main put Text with [text = Stop] at stopPos + (00 50) in main

1 E4 box 1 rectangle4Pos = (00 -2000) put Rectangle with [length = 1600 width = 400]

at rectangle4Pos in main put Text with [text = E4] at rectangle4Pos + (-700 00) in main put Text with [text = $c leftarrow d d leftarrow r$]

at rectangle4Pos + (100 120) in main put Text with

[text = $t leftarrow a a leftarrow a a leftarrow t - qa$] at rectangle4Pos + (100 00) in main

put Text with [text = $t leftarrow b b leftarrow b b leftarrow t - qb$ ] at rectangle4Pos + (100 -120) in main

(00 -100) -) rectanglePos + (00 150) rectanglePos + (00 -150) -) rectangle2Pos + (00150) rectangle2Pos + (00 -150) -) rectangle3Pos + (00125) rectangle3Pos + (00 -125) -) rectangle4Pos + (00200) rectangle4Pos + (00 -200) -- rectangle4Pos + (00 -500)

rectangle4Pos + (-1000 -500) -- rectangle2Pos + (-1000 00) -) rectangle2Pos + (-800 00)

107

rectangle3Pos + (400 00) -gt rectangle3Pos + (1410 00) put Text with [text Yes] at rectangle3Pos + (480 -50) in main put Text with [text = No] at rectangle3Pos + (-80 -175) in main

Placing text notes put Text with [text Al $m gt 0 n gt 0$] at (3000 00) in main put Text with [text A2 $c=mgtO d=ngtO$] at (3000 -340) in main put Text with [text $a=b=O a=b=l$] at (3000 -460) in main put Text with [text A3 $am + bn = d am + b$]

at (3000 -740) in main put Text with [text = $0 leq r lt d gcd(dc) g$]

at (3000 -860) in main put Text with [text = A4 $am + bn d = gcd(m n)$]

at (3000 -1200) in main put Text with [text = A5 $am + bn d am + b$]

at (3000 -1540) in main put Text with [text = $0 lt r lt d gcd(cd) = g$]

at (3000 -1660) in main put Text with [text = A6 $am + bn = d am + b$]

at (3000 -1940) in main put Text with [text = $gcd(c d) = gcd(m n)$]

at (3000 -2060) in main

(2500 00)-(2000 -50)-(1500 -150)-gt(00 -200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -400)-(2000 -450)-(1500 -650)-gt(00 -700) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -800)-(2000 -850)-(1500 -1150)-gt(00 -1200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2200 -1200)-(2000 -1200)-(1500 -1250) -gtrectangle3Pos + (900 00) with [startingTangent = (-10 00) endingTangent (-10 -10)]

(2250 -1600)-(2000 -1700)-(1500 -1900) -(1000 -1750)-gt(00 -1700) with [startingTangent = (-10 00) endingTangent (-10 00)]

(2250 -2000)-(1500 -2200)-gt(00 -2400) with [startingTangent = (-10 00) endingTangent (-10 00)]

108

~-- Al m gt On gt O

A2 c = m gt 0 d = n gt 0 a = b = 0 a = b = 1

A3 am + bn = dam + bdeg~ T lt dgcd(dc) = 9 E2

_--- A4 am + bn = d = gcd(m n)

A5 am + bn = dam + b Sto 0lt T lt dgcd(cd) = 9

Cf- d d f- T A6 am + bn = d am + bE4 t f- a a f- a a f- t - qa gcd(cd) =gcd(mn)t f- b b f- b b f- t - qb

primitive static sin javalangMath sin primitive static cos javalangMath cos primitive static sqrt javalangMath sqrt

fun ellipseCangle length width) return Clength cosCangle 20 31415 3600)

width sinCangle 20 31415 3600))

fun ellipseDeriveCangle length width) length2 = length length width2 = width width sinus = sinCangle 31415 1800) sinus2 = sinus sinus cosinus = cosCangle 31415 1800) cosinus2 = cosinus cosinus x = -10 Clength sinus)

sqrtCwidth2 cosinus2 + length2 sinus2) y = Cwidth cosinus) sqrtCwidth2 cosinus2 + length2 sinus2) return Cxy)

avail = Text with [text=AVAIL] link = Text with [text=LINKCP)] t = Text with [text=T]

109

put avail at ellipse(900 1000 500) in main put t at ellipse(1800 1000 500) in main put link at ellipse(OO 1000 500) in main

(ellipse(70 1000 500))-(ellipse(450 1000 500)) -gt(ellipse(750 1000 500))

(ellipse(1050 1000 500))-(ellipse(1350 1000 500)) -gt(ellipse(1730 1000 500))

(ellipse(1930 1000 500))-(ellipse(2700 1000 500)) -gt(ellipse(3550 1000 500))

AVAIL

~ T LINK(P)

primitive static sin javalangMatb sin primitive static cos javalangMatb cos

fun circular(angle radius) return (radius cos(31415 angle 1 1800)

radius sin(31415 angle 1 1800))

circleradius = 400 circle = Circle with [radius=100] g Text with [text=G] r = Text with [text=R] y Text with [text=Y]

put circle at (circular(300 circleradius)) in main put r at (circular(300 circleradius)) in main put circle at (circular(900 circleradius)) in main put r at (circular(900 circleradius)) in main put circle at (circular(1500 circleradius)) in main put g at (circular(1500 circleradius)) in main put circle at (circular(2100 circleradius)) in main put g at (circular(2100 circleradius)) in main put circle at (circular(2700 circleradius)) in main

110

put g at (circular(2700 circleradius)) in main put circle at (circular(3300 circleradius)) in main put y at (circular(3300 circleradius)) in main

(circular(450 circleradius))-(circular(600 circleradius)) -gt(circular(750 circleradius))

(circular(1050 circleradius))-(circular(1200 circleradius)) -gt(circular(1350 circleradius))

(circular(1650 circleradius))-(circular(1800 circleradius)) -gt(circular(1950 circleradius))

(circular(2250 circleradius))-(circular(2400 circleradius)) -gt(circular(2550 circleradius))

(circular(2850 circleradius))-(circular(3000 circleradius)) -gt(circular(3150 circleradius))

(circular(3450 circleradius))-(circular(OO circleradius)) -gt(circular(150 circleradius))

put Text with [text=tinyNEXTR] at (circular(900 circleradius)) + (00 150) in main

put Text with [text=tinyNEXTG] at (circular(-900 circleradius)) + (00 -150) in main

put Text with [text=tinyCURRENT] at (circular(-300 circleradius))+ (1~0 -150) in main

NEXTR

NEXTG

fun left(d)

return 016 coord of west in drectangle + 084 coord of east in drectangle

fun right(d)

return 016 coord of east in drectangle +

111

084 coord of west in drectangle

rectanglel = Rectangle with [length=600 width=200) rectangle2 = Rectangle with [length=200 width=200) circle = Circ le with [radius=10) put rectanglel in form rectangle = put rectangle2 in form put circle at (-200 00) in form put circle at (200 00) in form

dl = put form at (00 00) in main d2 = put form at (-600 -500) in main put Text with [text=IA) at (-600 -500) in main d3 = put form at (-1200 -1000) in main put Text with [text=IB) at (-1200 -1000) in main d4 = put form at (-1800 -1500) in main put Text with [text=ID) at (-1800 -1500) in main d5 = put form at (-600 -1500) in main put Text with [text=IE) at (-600 -1500) in main d6 = put form at (00 -1000) in main put Text with [text=IC) at (00 -1000) in main d7 = put form at (600 -1500) in main put Text with [text=f) at (600 -1500) in main d8 = put form at (-400 -2000) in main put Text with [text=IG) at (-400 -2000) in main dg = put form at (300 -2000) in main put Text with [text=IH) at (300 -2000) in main dl0 = put form at (1000 -2000) in main put Text with [text=JI) at (1000 -2000) in main

(left(dl))-gt(coord of north in d2rectangle) (right(dl))-gt(coord of east in dlrectangle + (00 50)) (left(d2))-gt(coord of north in d3rectangle) (right(d2))-gt(coord of north in d5rectangle) (left(d3))-gt(coord of north in d4rectangle) (right(d3))-gt(coord of south in d2rectangle) (left(d4))-gt(coord of west in dlrectangle + (00 50)) (right(d4))-gt(coord of south in d3rectangle) (left(d5))-gt(coord of north in d6rectangle) (right(d5))-gt(coord of north in d7rectangle) (left(d6))-gt(coord of south in d2rectangle) (right(d6))-gt(coord of north in d8rectangle)

112

(left(d7raquo-gt(coord of north in d9rectangle) (right(d7raquo-gt(coord of north in dl0rectangle) (left(dSraquo-gt(coord of south in d6rectangle) (right(d8raquo-gt(coord of south in d5rectangle) (left(d9raquo-gt(coord of south in d5rectangle) (right(d9raquo-gt(coord of south in d7rectangle) (left(dl0raquo-gt(coord of south in d7rectangle) (right(dl0raquo-gt(coord of south in dlrectangle + (100 00raquo

put Text wi th [text=List head] at coord of north in dlrectangle + (00 50) in main

circle = Circle with [radius = 100] bigcircle = Circle with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvasl put circle at 050 150) in canvasl put Text with [text = H] at 050 150) in canvasl put circle at (-150 150) in canvasl put Text with [text J] at (-150 150) in canvasl put Text with [text = B] at (00 -150) in canvasl

put bigcircle in canvas2

113

put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = Fil] at (150 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = liE] at (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvasl at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = Ali] at (00 -300) in main put bigellipse in main

A

fun drawBinaryTree(d s 0 dh dv n)

put s at a in d put 0-(0 + (-10 dh -10 dvraquo in d put 0-(0 + (db -10 dvraquo in d if (n == 1)

then return 0 else drawBinaryTree(d sa + (-10 dh -10 dv) db 20 dv n - 1) drawBinaryTree(d s a + (db -10 dv) db 20 dv n - 1) end

(0000)--(0000)

114

orlgln = (00 00) dv = 200 dh = 1000 bullet = Circle with [radius = 20) drawBinaryTree(main bullet origin dh dv 7)

bullet = Circle with [radius = 20] put bullet in main put bullet at (-300 -300) in main put bullet at (-600 -600) in main put bullet at (00 -600) in main put bullet at (300 -300) in main

(00 00)--(-300 -300) (00 00)--(300 -300) (-300 -300)--(-600-600) (-300 -300)--(00 -600)

(-100 00)-(-500 -300)-(-650 -650)-(-300 -400)shy(50-650)-(00-500)-(-150-300)-(-100 -200)shy(00-100)-(250-320)-(350-350)shy(320 -270)-gt(100 00)

circlel Circle with [radius 100]

lL5

circle2 = Circle with [radius = 120] ellipse = Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (100 0 500) in main d3 put form at (1000 -500) in main put Text with [text I$N(p_1)$] at (1000 1000) in main put Text with [text I$N(p_2)$] at (1000 500) in main put Text with [text dots] at (100 0 o 0) in main put Text with [text $N(p_n)$] at (1000 -500) in main

put Text with [text $S_O$] at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

sa

fun dropMany(f n s v c) for i from 10 to n do

put f at (s + (i - 10) v) in c

116

end

square = Square with [length=200] changeVec = (00 -200) dropMany(square 40 (00 00) changeVec main) dropMany(square 30 (500 00) changeVec main) dropMany(square 10 (1000 00) changeVec main) dropMany(square 10 (1500 00) changeVec main) put Text with [text=IO] at (00 00) in main put Text with [text=ll] at (00 -200) in main put Text with [text=13] at (00 -400) in main put Text with [text=17] at (00 -600) in main put Text with [text=bf ail] at (500 200) in main put Text with [text=12] at (500 00) in main put Text with [text=14] at (500 -200) in main put Text with [text=17] at (500 -400) in main put Text with [text=17] at (1000 00) in main put Text with [text=bf $a~b~+$] at (1500 200) in main put Text with [text=18] at (1500 00) in main put Text with [text=none ] at (2000 00) in main

(120 100)-gt(380 100) (620 100)-gt(880 100) (112 0 10 0) - gt(138 0 10 0) (1620 100)-gt(1880 100)

a ab+

~ -m-0-0-none 7

put Text with [text=IS] in main put Text with [text=A] at (00 -200) in main put Text with [text=B] at (00 -400) in main put Text with [text=$alpha$] at (-600 -600) in main put Text with [text=$beta$] at (-300 -600) in main put Text with [text=$gamma$] at (00 -600) in main put Text with [text=$y$] at (300 -600) in main put Text with [text=$z$] at (600 -600) in main

117

(-50 -50)--(-700 -540)--(-500 -540) (50 -50)--(700 -540)--(500 -540) (-50 -250)--(-400 -540)--(-200 -540) (50 -250)--(400 -540)--(200 -540) (-50 -450)--(-100 -540)--(100 -540)--(50 -450)

put Text with [text=D] in main

put Text with [text=T] at (-500 -500) in main put Text with [text=bf real] at (-500 -900) in main put Text with [text=4] at (-350 -500) in main put Text with [text= type] at (-150 -500) in main

put Text with [text=L] at (500 -500) in main put Text with [text=inh] at 050 -500) in main put Text with [text=5] at (350 -500) in main put Text with [text=6] at (650 -500) in main put Text with [text=entry] at (850 -500) in main

put Text with [text=bf $id_3$] at (900 -900) in main put Text with [text=bf ] at (500 -900) in main put Text with [text=3] at 0050 -900) in main put Text with [text=entry] at 0350 -900) in main

put Text with [text=L ] at (00 -1000) in main put Text with [text=inh] at (-350 -1000) in main put Text with [text=7] at (-150 -1000) in main put Text with [text=8] at 050 -1000) in main put Text with [text=entry] at (350 -1000) in main

put Text with [text=bf ] at (00 -1400) in main put Text with [text=bf $id_2$] at (400 -1400) in main put Text with [text=2] at (550 -1400) in main put Text with [text=entry] at (750 -1400) in main

put Text with [text=L] at (-500 -1500) in main

118

put Text with [text=inh] at (-850 -1500) in main put Text with [text=19] at (-650 -1500) in main put Text with [text=110] at (-350 -1500) in main put Text with [text= ent ry] at (-150 -1500) in main

put Text with [text=bf $id_l$] at (-500 -1900) in main put Text with [text=ll] at (-350 -1900) in main put Text with [text= ent ry ] at (-150 -1900) in main

(-100 -100)--(-400 -400) (-500 -600)--(-500 -800) (100 -100)--(400-400) (500 -600)--(500 -800) (600 -600)--(800 -800) (400 -600)--(100 -900) (100 -1100)--(400 -1300) (00 -1100)--(00 -1300) (-100 -1100)--(-400 -1400) (-500 -1600)--(-500 -1800)

(-300 -400)-(00 -300)-gt(300 -400) (400 -600)-(500 -650)-gt(600 -600) (950 -800)-gt(700 -600) (300 -600)-gt(-50 -900) (-100 -1100)-(00-1150)-gt(100 -1100) (450 -1300)-gt(200 -1100) (-200 -1100)-gt(-550 -1400) (-550 -1500)-(-500 -1550)-gt(-450 -1500) (-350 -1800)-gt(-350 -1600)

119

D

~ T 4 type inh 5 L 6 entry

entryrL ~~3 inh 7 L 8 entry

~2entrY inh 9 JJ lOentry

1 t id l 1 entry

circle = Circle with (radius=100J bigcircle = Circle with (radius=SOOJ

cl put circle at (00 200) c2 put circle at (200 00) c3 put circle at (-200 00) c4 put circle at (00 -200) bcl = put bigcircle in graphl

cS = put circle at (00 200) c6 = put circle at (00 -200) bc2 = put bigcircle in graph2

c7 put circle at (00 lS0)

in graphl in graphl in graphl in graphl

in graph2 in graph2

in graph3 c8 put circle at (200 -200) in graph3 c9 put circle at (-200 -200) in graph3 bc3 = put bigcircle in graph3

gl put graphl in main g2 put graph2 at (-1000 -1500) in main g3 put graph3 at (1000 -1000) in main

1 lines in first drawing (coord of anglePoint(900) in mainglc4)-gt

(coord of anglePoint(2700) in mainglcl) (coord of anglePoint(1800) in mainglcl)-gt

(coord of anglePoint(900) in mainglc3) (coord of anglePoint(OO) in mainglcl)-gt

120

(eoord of anglePoint(900) in maingle2) (eoord of anglePoint(2700) in maingle3)-gt

(eoord of anglePoint(1800) in maingle4) (eoord of anglePoint(2700) in maingle2)-gt

(eoord of anglePoint(OO) in maingle4)

(eoord of anglePoint(2700) in maingle3)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(1800) in maingle4)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(OO) in maingle2)shy(eoord of anglePoint(3450) in mainglbel)

lines in seeond drawing (eoord of anglePoint(2700) in maing2e5)-gt

(eoord of anglePoint(900) in maing2e6) erdl = eoord of anglePoint(1800) in maing2e6 erd2 = eoord of anglePoint(1800) in maing2e5 erdl-((erdl + erd2)20 + (-200 00))-gterd2

(eoord of anglePoint(900) in maing2e5)shy(eoord of anglePoint(900) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(450) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(OO) in maing2be2)

(eoord of anglePoint(OO) in maing2e6)shy(eoord of anglePoint(OO) in maing2be2)

lines in third drawing (eoord of anglePoint(1800) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e9) (eoord of anglePoint(OO) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e8) (eoord of anglePoint(OO) in maing3e9)-gt

(eoord of anglePoint(1800) in maing3e8) crd3 = eoord of anglePoint(OO) in maing3e8 erd4 = eoord of anglePoint(900) in maing3e7 erd3-(erd3 + erd4) 20 + (200 200)-gterd4

erd4--(eoord of anglePoint(1050) in maing3be3) (eoord of anglePoint(1800) in maing3e7)-shy

(eoord of anglePoint(1850) in maing3be3) (coord of anglePoint(1800) in maing3e9)-shy

121

(coord of anglePoint(1750) in maing3bc3)

lines between drawings (coord of anglePoint(2250) in mainglbcl)-gt

(coord of anglePoint(900) in maing2bc2) (coord of anglePoint(3450) in mainglbcl)-gt

(coord of anglePoint(1050) in maing3bc3) (coord of anglePoint(OO) in maing2bc2)-gt

(coord of anglePoint(1850) in maing3bc3) crd5 = coor~ of anglePoint(1750) in maing3bc3 crd6 = coord of anglePoint(450) in maing2bc2 crd5-(crd5 + crd6) 20 + (000 300)-gtcrd6

Texts crdTextl coord of anglePoint(1350) in mainglbcl + (-200 00) crdText2 = coord of anglePoint(1350) in maing2bc2 + (-100 100) crdText3 = coord of anglePoint(450) in maing3bc3 + (100 100) put Text with [text=$R_l$] at crdTextl in main put Text with [text=$R_2$] at crdText2 in main put Text with [text=$R_3$] at crdText3 in main

primitive getClip sddlhierarchyDrawing clip primitive setVisible sddlhierarchyShape setVisible

122

1 clip takes 3 drawings and a canvas first is a line second and third are two shapes which intersect line will draw a line between the intersection points the line creates with the two shapes 1

fun clip(dl d2 d3 canvas)

dlsetVisible(false) drawl = put dl in canvas cl = drawlgetClip(d2) c2 = drawlgetClip(d3) put cl--c2 in canvas

circle Circle with [radius=100] dl = put circle in main put Text with [text=14] in main d2 = put circle at (-400 -400) in main put Text with [text=13] at (-400 -400) in main d3 = put circle at (-700 -800) in main put Text with [text=12] at (-700 -800) in main d4 = put circle at (400 -400) in main put Text with [text=18] at (400 -400) in main d5 = put circle at (150 -800) in main put Text with [text=17] at 050 -800) in main d6 = put circle at (650 -800) in main put Text with [text=110] at (650 -800) in main d7 = put circle at (220 00) in main put Text with [text=14] at (220 00) in main d8 = put circle at (620 -400) in main put Text with [text=18] at (620 -400) in main dg = put circle at (370 -800) in main put Text with [text=7] at (370 -800) in main dl0 = put circle at (00 -1200) in main put Text with [text=5J at (00 -1200) in main

Il = (00 00)--(-400 -400) clip(ll dl d2 main) 12 = (-400 -400)--(-700 -800) clip(12 d2 d3 main) 13 = (00 00)--(400 -400) clip(13 dl d4 main) 14 = (400 -400)--(150 -800)

123

clip(14 d4 d5 main) 15 = (400 -400)--(650 -SOO) clip(15 d4 d6 main) 16 = (220 00)--(-400 -400) clip(16 d7 d2 main) 17 = (220 00)--(620 -400) clip(17 d7 dS main) lS = (620 -400)--(650 -SOO) clip(lS dS d6 main) 19 = (620 -400)--(370 -SOO) clip(19 dS d9 main) 110 = (370 -800)--(00 -1200) clip(110 dg d10 main)

2

5

fun niceArrow(c dMain dLeft dRight) firstPoint = coord of southwest in dMainrectangle + (30 30) secondPoint = coord of southeast in dMainrectangle + (-30 30)

firstEnd = coord of north in dLeftrectangle secondEnd = coord of north in dRightrectangle

put firstPoint-gtfirstEnd in c put secondPoint-gtsecondEnd in c

point1 firstPoint 50 60 + secondPoint 10 60 point2 firstPoint 40 60 + secondPoint 20 60 point3 firstPoint 30 60 + secondPoint 30 60 point4 firstPoint 20 60 + secondPoint 40 60 point5 firstPoint 10 60 + secondPoint 50 60

put (coord of southwest in dMainrectangle + (-25 25))shy(coord of south in dMainrectangle + (00 -50))shy

124

(coord of southeast in dMainrectangle + (25 25)) in c

put pointl--(pointl + (-1 0 30 -10 70)) in c put point2--(point2 + (-1 0 10 -10 85)) in c put point3--(point3 + (00 -10 90)) in c put point4--(point4 + (1 0 -10 85)) in c put point5--(point5 + (30 -1 0 70)) in c

put Text with [text=smallt] at point3 + (00 -130) in c

rect = Rectangle with [length=300 width=200] r = put rect in main put Text with [text=ll] in main rectangle = put rect in form put Text with [text=$t-l$] in form

dl = put form at (-1400 -500) in main dll = put form at (-2000 -1000) in main dlr = put form at (-800 -1000) in main dlll put form at (-2300 -1500) in main dllr put form at (-1700 -1500) in main dlrl put form at (-1100 -1500) in main dlrr put form at (-500 -1500) in main

dr = put form at (1400 -500) in main drr = put form at (2000 -1000) in main drl = put forro at (800 -1000) in main drrr put form at (2300 -1500) in main drrl put form at (1700 -1500) in main drlr put form at (1100 -1500) in main drll put form at (500 -1500) in main

put Text with [text=l root[T]] at (-300 300) in main (-300 240)-gt(coord of north in mainr)

dots = Text with [text=dots] put dots at (-1400 -1000) in main put dots at (-2000 -1500) in main put dots at (-SOO -1500) in main put dots at (1400 -1000) in main put dots at (2000 -1500) in main put dots at (800 -1500) in main

125

(coord of southwest in mainr + (30 30))-gt (coord of north in maindlrectangle)

(coord of southeast in mainr + (-30 30))-gt (coord of north in maindrrectangle)

niceArrow(main dl dll dlr) niceArrow(main dll dlll dllr) niceArrow(main dlr dlrl dlrr) niceArrow(main dr drl drr) niceArrow(main drl drll drlr) niceArrow(main drr drrl drrr)

root[T]

rect = put Rectangle with [length=600 width=200l in form put Rectangle with [length=200 width=200] at (200 00) in form bullet = put Circle with [radius=10] at (200 00) in form

put Text with [text=IF] in main

fl put form at (700 00) in main f2 put form at (1500 00) in main f3 put form at (2300 00) in main f4 put form at (3100 00) in main

(coord of anglePoint(OO) in mainflbullet)-gt (coord of west in mainf2rect)

(coord of anglePoint(OO) in mainf2bullet)-gt (coord of west in mainf3rect)

(coord of anglePoint(OO) in mainf3bullet)-gt (coord of west in mainf4rect)

126

ptW = coord of west in mainflrect ptE = coord of east in mainf4rect

ptW + (-300 OO)-gtptW ptE + (300 OO)-gtptE

put Text with [text=R] at (3800 00) in main

ptS = coord of anglePoint(2700) in mainf4bullet ptS2 = ptS + (00 -350)

ptS--ptS2 ptS2 + (-50 00)--ptS2 + (50 00) ptS2 + (-35 -20)--ptS2 + (35 -20) ptS2 + (-20 -40)--ptS2 + (20 -40)

BIBLIOGRAPHIE

Adobe Systems Incorporated 1994 PostScript Language Reference Manual http j jwwwadobecomjproductsjpostscriptjpdfsjPLRMpdf

-- 2006 PDF Reference Version 17 Adobe Systems Incorporated 6th eacutedition

-- 201Oa Adobe Postscript 3 http j jwwwadobecomjproductsjpostscriptj

2010b PDF Developer Corner PDF Reference http j jwwwadobecomjdevnetjpdfjpdLreferencehtm1

Aho A V R Sethi et J D Ullman 1986 Compilers Principles Techniques and Tools Addison-Wesley

American Mathematical Society 2008 Why Do We Recommend LaTeX http j jwwwamsorgjpublicationsjauthorsjtexjlatexbenefits

Apple Computer Inc 1996 The TrueType Reference Manu al Apple Computer Inc Cupertino California

Bourgeois M 2010 Introduction to Drawing Diagrams with SDDL httpj jrivershyvalley tvjintroduction-to-drawing-structured-diagrams-in-sddlj

Bourgeois M et R Villemaire 201Oa laquoDrawing Structured Diagrams with SDDL raquo

TUGBoat vol 31 no 2 p 206-210

-- 201Ob SDDL http j jwwwinfo2uqamca-villemaireJjRecherchejSDDLj

Bowman J C 2007 laquoThe 3D Asymptote Generalization of Metapost Beacutezier Interposhylation raquo Proceedings in Applied Mathematics and Mechanics

Chomsky N 1956 laquoThree Models for the Description of Language raquo Information Theory IRE Transactions on vol 2 no 3 p 113-124

Cormen T A C E Leiserson R L Rivest et C Stein 2001 Introduction to Algoshyrithms The MIT Press

Davis M R Sigal et E Weyuker 1994 Computability Complexity and Languages Pundamentals of Theoretical Computer Science Morgan Kaufmann

Dhu D-Z et K-I Ko 2000 Theory of Computational Complexity Wiley

Gagnon Eacute 1998 laquoSableCC an Object-Oriented Compiler Framework raquo Meacutemoire de maicirctrise McGill University

128

-- 2009 ObjeetMacro - SableCC httpsableccorgwikiObjectMacro

Group O M 1999 Unified Modeling Language (version 13) Rapport Object Manashygement Group

Hammerlindl A J Bowman et T Prince 2010a Asymptote httpasympshytotesourceforgenet

-- 20lOb Asymptote The Veetor Graphies Language httpasympshytotesourceforgenet asymptote pdf

Hobby J 1992 laquo A Users Manual for MetaPost raquo Computing Science Technical Report vol 162

International Organization for Standardization 2008 Document Management - Elecshytronic Document File Format for Long-Term Preservation - Part 1 Use of PDF 14 (PDF A-1) ISO 19005-1 2005

Jr F S H et S M Kelley 2007 Computer Graphics using GpenGL Prentice-Hall 3e eacutedition

Knuth D 1968 The Art of Computer Programming Addison-Wesley

-- 1984 The TeXbook Reading Mass Addison-Wesley

-- 1986 The Metafontbook Reading Mass Addison-Wesley

-- 1999 Digital Typography Stanford California Center for the Study of Language and Information

Lamport L et D Bibby 1986 LATEX A Document Preparation System T 260 Citeseer

Lancaster D 2005 Approximating a Circle or an Ellipse using Four Bezier Cubic Splines Rapport Synergetics

Maplesoft 2010 Maple 14 User Manual

McNaughton R et H Yamada 1960 laquoRegular Expressions and State Graphs for Automata raquo -IRE Transactions on Electronic Computers no l p 39-47

Object Management Group 2009 UML httpwwwumlorgj

Oracle 2010 Java httpwwwjavacomj

Pierce B C 2002 Types and Programming Languages MIT Press

Riskus A 2006 laquoApproximation of a Cubic Bezier Curve by Circular Arcs and Vice Versa raquo Information Technology and Control vol 35 no 4 p 371-378

Rose K H 2008 XY-pic Home Page httptugorgapplicationsjXy-picj

129

Rose K H et al 2010 laquoXY-pic Users Guide raquo DIKU Universiteacute de Copenhague vol 1

Rumbaugh J M Blaha W Premerlani F Eddy et W Lorensen 1991 ObjectshyOriented Modeling and Design Prentiee-Hall

Saunders J H 1989 laquoA Survey of Objeet-Oriented Programming Languages raquo JOOP Journal of Object-Oriented Programming vol 1

Sabel J et D Friedman 1996 An Introduction to Refiection-Oriented Programming San Francisco Reflection 96

TeX Users Group 2009 MetaPost - TeX User Groups httptugorgmetaposthtml

TIOBE Software 2008 Tiobe Index httpwwwtiobecomindexphpcontentshy paperinfo tpeiindexhtml

Ullman J J Hopcroft et R Motwani 1979 Introduction to Automata Theory Lanshyguages and Computation Addison-Wesley

Van Zandt T 1993a PSTricks-PostScript Macros for Generie TEX httpwwwtexuniyaracrudocpsLugpdf

-- 1993b laquoPSTricks PostScript Macros for Generie 1EX Users Guide raquo Version 093 a http jjwww tug orgjapplicationsjPSTricks

Page 3: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux

REMERCIEMENTS

Un projet dune telle envergure naurait pas eacuteteacute possible sans un soutien constant

Je ne peux donc suffisamment remercier mon directeur M Roger Villemaire pour le

support quil ma fourni pendant ces trois anneacutees Ce meacutemoire ne serait pas entre vos

mains sans son aide

Je voudrais aussi remercier M Eacutetienne Cagnon pour ses nombreuses ideacutees qui ont

faccedilonneacute SDDL de maniegravere significative ainsi que pour les nombreuses gaffes concepshy

tuelles quil ma empecirccheacute de commettre

Je ne peux eacutevidemment passer sous silence les membres de la communauteacute 01EX

particuliegraverement ceux de la confeacuterence TUC 2010 qui mont accueilli malgreacute mon inshy

expeacuterience et qui mont fourni de preacutecieux commentaires et suggestions en rapport avec

mon projet Je voudrais remercier John Bowman pour son travail sur Asymptote ainsi

que Karl Berry pour linteacuterecirct deacutemontreacute envers mon projet et pour ses suggestions pour

mon article Eacutevidemment il est impossible de remercier les membres de 01EX sans

remercier au passage le grand gourou Donald Knuth sans qui ce meacutemoire serait difficishy

lement preacutesentable

Je remercie vivement la fondation de lUniversiteacute du Queacutebec agrave Montreacuteal ainsi que

le Fonds Queacutebecois de la Recherche sur la Nature et les Technologies pour leur support

financier durant les diffeacuterentes phases de mon projet Merci davoir cru en mon projet

ainsi quen moi-mecircme

Finalement je voudrais remercier mes parents Suzie et Yves ainsi que ma conjointe

Annie pour leur support inconditionnel ainsi que pour laide incroyable quils mont

fournie sans neacutecessairement sen rendre compte

TABLE DES MATIEgraveRES

LISTE DES FIGURES IX

REacuteSUMEacute XI

INTRODUCTION 1

CHAPITRE 1 PROBLEacuteMATIQUE ET OBJECTIFS 7

11 Description de la probleacutematique 7

111 Les notes de cours une mise en contexte 7

112 Domaine dapplication eacutelargi 8

12 Description des objectifs rechercheacutes 9

121 Inteacutegration avec JbTEX 9

122 Description de structures 10

123 Hieacuterarchie solide et extensible 10

124 Objectifs moindres 10

13 Analyse des solutions existantes 11

131 Paquets JbTEX standards 12

132 XY-pic 13

133 Metapost 14

134 Asymptote 15

135 Conclusion de lanalyse 17

14 Diagrammes repreacutesentatifs du domaine 18

141 Lapproche de Knuth 19

142 Description des exemples et des concepts preacutesents dans les diagrammes 20

CHAPITRE II STRUCTURE ET SOLUTION INFORMATIQUE 21

21 Objectifs dune structure dans une solution informatique 21

211 Les diffeacuterentes composantes dune solution informatique 21

vi

212 Consideacuterations pour une meacutethodologie de deacuteveloppement 23

22 La programmation orienteacutee-objet 24

221 Concepts de bases 24

222 Diffeacuterence avec la programmation baseacutee-objet 25

23 Meacutethode pour la conceptualisation dune hieacuterarchie 25

231 Origine de la meacutethode 26

232 Les diffeacuterentes eacutetapes de conceptualisation 26

24 Deacuteveloppement de la hieacuterarchie 27

241 Extraction des diffeacuterents concepts 27

242 Eacuteleacutements particuliers 27

CHAPITRE III EacuteLEacuteMENTS GRAPHIQUES 31

31 Courbes et segments en informatique 31

32 Courbes de Beacutezier 32

321 Deacutefinition 32

322 Deacutefinition alternative 33

323 Proprieacuteteacutes dune courbe de Beacutezier- 34

324 Deacutesavantages des courbes de Beacutezier 36

33 Splines cubiques 36

34 Le cas dun cercle 38

35 Structures informatiques dans les solutions deacutejagrave existantes 41

351 Postscript et PDF 42

352 Asymptote 43

CHAPITRE IV THEacuteORIE DES LANGAGES INFORMATIQUES 45

41 Theacuteorie des langages et automates 45

411 Les eacuteleacutement rie base dun langage (Aho Sethi et Ullman 1986) 46

412 Expressions reacuteguliegraveres 46

413 Automates 48

414 Lien entre langage reacutegulier et automate fini 51

vii

42 Grammaires 52

421 Deacutefinition dune grammaire formelle 52

422 Hieacuterarchie de Chomsky 54

423 Utiliteacute dans les langages de programmation 55

43 SableCC 56

431 Quest-ce que SabieCC 56

432 Avantages de SabieCC 56

44 Langage reacuteflexif 57

441 Deacutefinition dun langage reacuteflexif 57

442 Avantages 57

443 Deacutesavantages 58

CHAPITRE V MISE EN OEUVRE DE LA SOLUTION 59

51 Eacuteleacutements de langage en SDDL 59

511 Impleacutementation de la hieacuterarchie 59

512 Grammaire 60

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage 61

52 Reacutealisation en Java 63

521 Traverseacutee de larbre grammatical et exeacutecution 63

522 Deacutefinition dobjets quelconques 64

523 Gestion des erreurs 65

524 Structures de support 66

53 Accegraves agrave Postscript PDF et gTEX 66

531 Postscript 66

532 PDF 67

533 g1EX- 68

534 Geacuteneacuteration du code Asymptote 68

CHAPITRE VI REacuteALISATION DES DIAGRAMMES EN SDDL 71

61 Analyse du code des diagrammes existants 71

Vlll

611 Rappel des objectifs cruciaux agrave observer

612 Diagramme de compilation

613 Diagramme de tableau

614 Diagramme de Venn

62 Preacutesentation du produit final

621 Statistiques et documentation

622 Preacutesentation

623 Site web

63 Conclusion de notre analyse

CONCLUSION

APPENDICE A PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

APPENDICE B PREacuteSENTATION DE LA GRAMMAIRE DE SOOL

APPENDICE C PREacuteSENTATION DE LA HIEacuteRARCHIE

APPENDICE D PREacuteSENTATION DES DIAGRAMMES CHOISIS

BIBLIOGRAPHIE

72

73

75

78

79

80

80

81

81

83

85

91

97

105 shy

127

LISTE DES FIGURES

Figure Page

11 Code XY-pic pour un diagramme 14

12 Diagramme reacutesultant du code XY-pic 14

13 Code Metapost pour dessiner un triangle 15

14 Diagramme reacutesultant du code Metapost 15

15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin 16

16 Diagramme reacutesultant du code Asymptote 16

31 Courbes de Beacutezier lineacuteaire quadratique et cubique 34

32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier 38

33 Quart de cercle approximeacute par une courbe de Beacutezier 39

34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence 41

41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b 49

51 Extrait de la grammaire de SDDL pour une instruction 61

52 Code Java et SDDL pour calculer une combinaison lineacuteaire 63

53 Code reacuteflexif pour creacuteer une forme quelconque 65

54 Code pour geacuteneacuterer du code Asymptote pour un cercle 69

61 Diagramme dautomate de compilation 73

62 Code pour le diagramme dautomate 74

63 Diagramme de tableau 76

64 Code pour le diagramme de tableau 77

65 Diagramme de Venn 78

x

66 Code du diagramme de Venn 79

REacuteSUMEacute

Dans ce meacutemoire nous analysons la description de diagrammes structureacutes dans le domaine des matheacutematiques discregravetes et de linformatique theacuteorique Cette analyse seffectue agrave partir de meacutethodes eacutetablies du geacutenie logiciel Nous trouvons un ensemble de proprieacuteteacutes que nous recherchons dans une solution informatique nous permettant de creacuteer ces diagrammes Nous analysons aussi les outils classiques agrave partir des proprieacuteteacutes preacuteceacutedentes qui nous permettent de reacutealiser ces diagrammes dans un environnement I51EX Nous observons que ces outils ne sont pas aussi puissants quils le pourraient en fonction des proprieacuteteacutes eacutetablies par notre analyse

Par la suite en nous basant sur les meacutethodes de repreacutesentation graphique des courbes et sur la theacuteorie des langages informatiques nous jetons les bases dun lanshyguage de description Nous preacutesentons aussi un outil deacuteveloppeacute en Java qui nous pershymet de deacutecrire aiseacutement nos diagrammes dinformatique theacuteorique et de matheacutematiques discregravetes agrave partir dune hieacuterarchie dobjets claire et extensible Nous avons impleacutementeacute les eacuteleacutements essentiels de notre langage en SDDL (Structured Diagram Description Lanshyguage) Nous lavons aussi valideacute agrave laide dexemples repreacutesentatifs tireacutes de sources daushytoriteacute Nous avons finalement preacutesenteacute notre solution dans le cadre de la confeacuterence TUG 2010 Nous lavons aussi preacutesenteacute avec un article dans la revue du TeX Users Groups TUG

Mots cleacutes diagrammes informatique theacuteorique matheacutematiques discregravetes langage

INTRODUCTION

Le logiciel de mise en page de document U1EX est devenu llne reacutefeacuterence pour la creacuteation

de documents matheacutematiques (American Mathematical Society 2008) Plusieurs raisons

suscitent cet inteacuterecirct une structure naturelle permettant de repreacutesenter clairement ses

ideacutees le formatage automatique de qualiteacute et un reacutesultat final de qualiteacute professionnelle

agrave un coucirct moindre

Un traiteacute matheacutematique peut contenir plusieurs types dobjets textes formules grashy

phiques diagrammes etc Dans le cas preacutesent nous nous inteacuteressons principalement agrave

la repreacutesentation de diagrammes Par diagramme on entend un dessin qui possegravede une

structure discregravete sous-jacente (souvent combinatoire mais pas obligatoirement) Un

exemple simple serait un graphe ou un arbre

Agrave partir du moment ougrave nous nous inteacuteressons agrave ces diagrammes et agrave leur repreacutesentation

il devient inteacuteressant de voir ce que U1EX nous fournit afin de geacuteneacuterer des structures

de qualiteacute En effet les diagrammes sont essentiels agrave la transmission effective des ideacutees

et des reacutesultats en informatique et en matheacutematiques discregravetes De plus la consistance

nous oblige agrave chercher agrave faire nos diagrammes agrave partir dun modegravele coheacuterent Entre

autres il nous faut conserver la mecircme police dans les diagrammes et dans le texte

en plus davoir accegraves aux symboles matheacutematiques Nous pourrions aussi importer des

diagrammes exteacuterieurs agrave U1EX mais les reacutesultats obtenus ne serait pas consistant avec

le texte Nous devons donc chercher agrave obtenir une meacutethode de repreacutesentation adeacutequate

pour nos diagrammes

Bien sucircr il existe deacutejagrave plusieurs solutions agrave ce problegraveme Il nous faut donc les analyser

avec soin avec des critegraveres formels Cela implique de reacutepertorier les diffeacuterents paquets

U1EX permettant de faire du dessin avec leurs diffeacuterentes proprieacuteteacutes Il faut ensuite

2

ajouter les logiciels qui utilisent JbTEX indirectement donc qui nen font pas partie

mais sen servent tout de mecircme Cela nous donne une vue densemble complegravete des

solutions deacutejagrave existantes agrave notre problegraveme

Ensuite avant de penser agrave analyser ces solutions nous devons deacuteterminer ce que nous

voulons exactement Agrave cette fin nous avons analyseacute le processus qua utiliseacute Donald

Knuth creacuteateur de TEX agrave la base de Jb1EX afin de mateacuterialiser son logiciel de formatage

Nous devons aussi utiliser un ensemble de contraintes agrave soumettre agrave nos diffeacuterentes

solutions Il eacutetait essentiel dutiliser Jb1EX pour le formatage du texte mais aussi pour

la clarteacute deacutecriture la qualiteacute de la documentation et la capaciteacute de creacuteer aiseacutement des

structures Par la suite il devient aiseacute et tregraves formel danalyser chacunes des diffeacuterentes

solutions proposeacutees

Malheureusement cette analyse nous a permis de constater quaucune solution neacutetait

suffisamment bonne pour satisfaire nos besoins La plupart des paquets eacutetaient trop

simples alors que plusieurs eacutetaieentiernt composeacutes de macros rendant la veacuterification de

code quasi impossible Quelques solutions (telles que XY-Pic (Rose 2008) Metapost

(TeX Users Group 2009) et Asymptote (Hammerlindl Bowman- et Prince 2010a))

fournissaient de nombreuses ideacutees inteacuteressantes mais aucune ne convenait parfaitement

agrave nos besoins Nous en sommes donc venus agrave la conclusion que la meilleure solution

serait de creacuteer notre propre solution tout en reacuteutilisant les ideacutees deacuteveloppeacutees par les

solutions preacuteceacutedentes

Afin de creacuteer une solution robuste nous avons deacutecideacute de creacuteer une hieacuterarchie orienteacutee obshy

jet afin de repreacutesenter les diffeacuterentes structures du domaine des matheacutematiques discregravetes

et de linformatique theacuteorique Cela se justifie par le fait que les hieacuterarchies objets aushy

delagrave de leurs avantages possegravedent des meacutethodes de conceptualisation formelles et bien

deacutefinies Nous avons utiliseacute la meacutethode favoriseacutee par James Rumbaugh (Rumbaugh

et al 1991) un des creacuteateurs de UML (Object Management Group 2009)

Ce processus demande en tout premier lieu une analyse du domaine afin dobtenir les

structures principales Par la suite les liens entre les diffeacuterentes classes sont analyseacutes en

3

fonction des besoins respectifs Finalement apregraves plusieurs iteacuterations et simplifications

cette meacutethode foumit une hieacuterarchie complegravete Par contre elle doit par la suite ecirctre

adapteacutee aux speacutecificiteacutes du langage dimpleacutementation

Notre hieacuterarchie a eacuteteacute deacuteveloppeacutee autour de plusieurs concepts importants Certains

sont naturellement lieacutes au domaine dutilisation Par exemple un point est une structure

naturelle pour la description de positions dans un diagramme Le mecircme raisonnement

sapplique pour des formes geacuteomeacutetriques de base comme le cercle le carreacute et lellipse

Certains objets sont des simplifications de concepts communs Par exemple un point

abstrait est un point qui peut ecirctre deacutetermineacute de maniegravere absolue ou relative Une forme

est une classe de base repreacutesentant lensemble des objets qui peuvent ecirctre dessineacutes Il

existe aussi un dessin qui repreacutesente une forme agrave un endroit particulier

Bien que cela pourrait deacuteterminer complegravetement notre domaine afin davoir une hieacuteshy

rarchie complegravete il faut inclure certains eacuteleacutements de structure Par exemple bien que

nous puissions deacuteterminer assez aiseacutement ce quest un cercle la maniegravere de le deacutecrire

pour ecirctre dessineacute nest pas aussi simple Il en est de mecircme pour des formes courbes

plus complexes ainsi que des courbes de maniegravere geacuteneacuterale car un ordinateur ne peut pas

repreacutesenter aiseacutement toutes formes de chemin Nous pouvons creacuteer un concept geacuteneacuteral

de chemin mais celui-ci doit se ramener agrave la reacutealiteacute dun ordinateur

Cela est deacutetermineacute en analysant deux choses le format de document PDF et la desshy

cription de chemin dAsymptote Le premier utilise des splines cubiques comme eacuteleacutement

de base pour deacutecrire les courbes dans un document Cest inteacuteressant mais limitatif

Asymptote de son cocircteacute prend une description complexe mais preacutecise dune courbe et

en deacuteduit un ensemble de splines cubiques quil est possible de placer dans un docushy

ment PDF ensuite Nous en concluons que le bon chemin agrave prendre est probablement

dimpleacutementer comme structure de base des chemins tels que deacutecrits par Asymptote

avec une structure de splines cubiques

Par contre certaines questions theacuteoriques surviennent lors de cette analyse Le grand

problegraveme relegraveve de la puissance dexpression des splines cubiques En effet nous verrons

4

que les splines cubiques sont puissantes mais pas suffisamment puissantes pour deacutecrire

un cercle une forme geacuteomeacutetrique pourtant extrecircmement simple Nous verrons par contre

par la suite quil est possible de deacutecrire ce mecircme cercle avec des splines cubiques avec

une preacutecision acceptable pour la creacuteation de documents papier malgreacute son inexactitude

Afin dadapter la hieacuterarchie un langage dimpleacutementation a ducirc ecirctre choisi Eacutetant donneacute

les contraintes de temps il fucirct deacutecideacute de reacuteutiliser un langage de description de diashy

grammes deacutejagrave existant Asymptote Lutilisation de ce langage nous permet dobtenir

des primitives simples et un accegraves agrave Jb1EX deacutejagrave deacutetermineacute ce qui diminue de beaucoup la

charge de travail De plus Asymptote nous permet de creacuteer nos images reacutesultantes dans

les formats Postscript (Adobe Systems Incorporated 2010a) et PDF (Adobe Systems

Incorporated 2010b) sans avoir agrave reacutealiser nous-mecircmes du code de tregraves bas niveau

Eacutevidemment si Asymptote fournissait tout ce dont nous avions besoin nous naurions

pas besoin dutiliser autre chose Par contre cest un langage baseacute sur les structures

(Hammerlindl Bowman et Prince 201Ob) au lieu des objets Cela implique que notre

hieacuterarchie ne peut ecirctre construite agrave laide de lheacuteritage objet Eacutetant donneacute la complexiteacute

que cela engendrerait un langage suppleacutementaire doit-ecirctre utiliseacute pour-la creacuteation de

la hieacuterarchie Cela nous amegravene donc agrave choisir Java (Oracle 2010) Une recherche de la

compagnie TIOBE considegravere Java comme eacutetant le langage le plus utiliseacute au moment de

la preacutesente reacutedaction (TIOBE Software 2008)

Avant de consideacuterer le deacuteveloppement dun nouveau langage la premiegravere chose agrave faire

consiste agrave consideacuterer ce agrave quoi nous voulons quil ressemble Afin de reacutealiser cette eacutetape

nous avons analyseacute notre base de diagrammes en donnant une description la plus proche

possible dun langage de programmation En simplifiant chaque description autant que

possible nous avons pu extraire quelques concepts de base importants pour la descripshy

tion de nos diagrammes De plus certaines contraintes suppleacutementaires peuvent ecirctre

ajouteacutees qui deacutependent plus de limpleacutementation que de la theacuteorie En quelque sorte

il faut pour reacutealiser notre projet nous baser sur des technologies qui ont fait leurs

preuves

5

Afin de deacutevelopper notre langage il nous faut des concepts pour le deacutecrire Cela sefshy

fectue agrave laide de la theacuteorie des langages et des automates Plus particuliegraverement nous

utiliserons les grammaires afin de faccedilonner un langage qui convient agrave nos besoins tout en

eacutetant simple agrave analyser par un programme informatique agrave laide dun logiciel speacutecialiseacute

SabieCC (Gagnon 1998) Nous verrons que les grammaires nous permettent de deacutecrire

complegravetement notre langage afin decirctre analyseacute par ordinateur

Une fois que nous avons notre langage final il ne reste plus quagrave veacuterifier les reacutesultats

obtenus Afin de boucler la boucle nous avons reacutealiseacute la programmation de chacun des

diagrammes que nous avions choisis au deacutepart pour notre base de tests Une fois ceuxshy

ci reacutealiseacutes il ne restait plus quagrave analyser les diffeacuterences entre les deux et voir si les

reacutesultats obtenus eacutetaient satisfaisants Cela nous permet de deacutemontrer quil sagit dune

solution naturelle et efficace eacutetant donneacute que nous pouvons creacuteer les objets de notre

domaine pour produire des diagrammes de grande qualiteacute

Le reste de ce meacutemoire est structureacute comme suit Le chapitre 1 expose la probleacutematique

et les objectifs rechercheacutes Le chapitre 2 introduit la creacuteation de notre solution inforshy

matique et plus speacutecifiquement de la hieacuterarchie objet Le chapitre 3 deacutecrit la theacuteorie

matheacutematique derriegravere la description de courbes et segments par ordinateur Le chapitre

4 expose les dessous de la theacuteorie des langages que nous utilisons afin de creacuteer SOOL

Le chapitre 5 expose la creacuteation du langage au-dessus de la hieacuterarchie Finalement le

chapitre 6 analyse le reacutesultat final afin de voir si le tout reacutepond aux objectifs deacutefinis au

deacutepart

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CHAPITRE l

PROBLEacuteMATIQUE ET OBJECTIFS

Dans ce chapitre nous nous eacutetendrons sm une deacutefinition correcte et complegravete de la

probleacutematique ainsi que sur les objectifs que nous souhaitons atteindre Nous verrons

aussi une analyse des solutions qui existent deacutejagrave et les raisons qui nous poussent agrave

deacutevelopper notre propre solution Finalement nous deacutefinirons une base de diagrammes

aptes agrave repreacutesenter adeacutequatement nos objectifs

11 Description de la probleacutematique

111 Les notes de cours une mise en contexte

Ce projet fut motiveacute principalement par la reacutedaction de notes de cours En effet

dans un milieu universitaire (particuliegraverement pour les eacutetudiants au baccalaureacuteat mais

eacutegalement pour les eacutelegraveves de cycles supeacuterieurs) il est extrecircmement utile de pouvoir

utiliser des notes de cours de quali teacute

La creacuteation de notes de cours adapteacutees vient tout de mecircme avec quelques problegravemes

Premiegraverement surtout en informatique la plupart des livres sont eacutecrits en anglais Cela

implique souvent de devoir eacutecrire nos propres versions sous la forme de notes de cours

De plus linformatique est un domaine qui eacutevolue agrave un rythme fulgurant Cela implique

que des notes adeacutequates et adapteacutees doivent ecirctre agrave jour Comme certains eacuteleacutements en

informatique peuvent eacutevoluer agrave chaque anneacutee voire plus vite il faut ecirctre capable deacutecrire

extrecircmement rapidement des textes si nous souhaitons quils soient utiles un tant soit

8

peu

Cela nous amegravene agrave notre probleacutematique principale plusieurs cours neacutecessitent un supshy

port plus complexe que simplement des mots agrave savoir des dessins et des diagrammes

voire des animations Cela est requis dans plusieurs cours en informatique theacuteorique

particuliegraverement dans leacutetude des structures de donneacutees et des algorithmes Il nous faut

donc une meacutethode rapide et efficace pour creacuteer des diagrammes agrave placer dans nos notes

de cours

112 Domaine dapplication eacutelargi

Bien eacutevidemment cibler purement les notes de cours et les structures de donneacutees nest

quun point de deacutepart Nous pouvons eacutelargir notre domaine dapplication agrave des diashy

grammes structureacutes cest-agrave-dire un dessin qui possegravede une structure sous-jacente crushy

ciale au point de pouvoir necirctre deacutecrit quagrave partir de cette structure Par exemple

un graphe est un ensemble de sommets eacutetiqueteacutes relieacutes ensemble par des flegraveches Tout

dessin de graphe est donc un dagramm~ selon notye deacutefiniton Dun_autre cocirct~ une

peinture possegravede parfois une structure mais celle-ci est largement insuffisante pour

deacutecrire loeuvre Par exemple pertgtonne noserait deacutecrire un Picasso comme eacutetant un

amas de cercles et de carreacutes de diffeacuterentes couleurs

Lensemble des structures que nous visons se rapporte donc essentiellement agrave deux

domaines linformatique theacuteorique et les matheacutematiques discregravetes Linformatique

theacuteorique est surtout deacutefinie par les structures de donneacutees et les algorithmes (et tout

sujet sy reliant) Les matheacutematiques discregravetes sont surtout deacutefinies par la theacuteorie des

graphes et la combinatoire Nous neacutegligeons ici volontairement les matheacutematiques contishy

nues pour deux raisons La premiegravere est quune structure de taille infinie peut souvent

ecirctre repreacutesenteacutee par une structure finie (donc discregravete) La seconde est que les besoins

en matheacutematiques continues sont largement diffeacuterents des besoins en matheacutematiques

discregravetes En effet dessiner le graphe dune fonction de deux variables est un sujet comshy

plexe mais totalement diffeacuterent de creacuteer un graphe Afin de rendre nos besoins plus

9

speacutecifiques nous eacuteviterons ce genre de dessins qui possegravedent deacutejagrave de nombreux logiciels

pour les reacutealiser (entre autres Maple) (Maplesoft 2010)

12 Description des objectifs rechercheacutes

La premiegravere partie de notre travail consiste agrave deacutecrire les objectifs que nous souhaitons

atteindre dans notre creacuteation de diagrammes En effet plusieurs paramegravetres importants

peuvent ecirctre utiliseacutes Il est donc important de ne pas perdre de vue lensemble tout en

donnant la prioriteacute agrave certains eacuteleacutements

121 Inteacutegration avec ~IEX

Ib1EX est un langage de description de documents texte Creacuteeacute agrave lorigine sous la forme

de TEX par Donald Knuth (Knuth 1984) puis modifieacute par Leslie Lamport (Lamport

et Bibby 1986) celui-ci est rapidement devenu un standard dans la reacutedaction darticles

scientifiques dans plusieurs domaines Bien quutiliseacute surtout pour la reacutedaction darticles

il a eacuteteacute preacutevu au deacutepart pour la reacutedaction de livres Il se distingue par sa capaciteacute agrave

creacuteer aiseacutement du contenu matheacutematique et le fait de soccuper du contenu en laissant

le logiciel soccuper de la mise en page du texte Il est si populaire que de nombreux

meacutemoires incluant celui-ci sont eacutecrits agrave partir de Ib1EX

Eacutetant donneacute que le monde des matheacutematiques et de linformatique theacuteorique utilise

abondamment Ib1EX il est important quun logiciel de creacuteation de diagrammes pershy

mette de lutiliser En effet si notre objectif est de creacuteer du contenu de qualiteacute professhy

sionnelle il faut que les polices soient constantes au travers de notre article (ou de nos

notes de cours) Naturellement plusieurs diagrammes vont contenir du texte Il faut

donc pour ecirctre consistant geacuteneacuterer ce texte avec Ib1EX afin davoir une forme standard

pour lensemble du document De plus il est tout agrave fait possible de vouloir mettre des

symboles matheacutematiques dans un diagramme (par exemple un symbole dinteacutegrale) Si

le texte est geacuteneacutereacute avec Ib1EX cela vient automatiquement Sinon il devient tregraves difficile

dobtenir un texte de belle qualiteacute Il sagit donc dun besoin primordial

10

122 Description de structures

Un autre eacuteleacutement extrecircmement important que nous recherchons est de pouvoir faire

adeacutequatement la description de diffeacuterentes structures Eacutetant donneacute que les diagrammes

sont composeacutes de structures il faut pouvoir en creacuteer aiseacutement et les relier de maniegravere

aiseacutee Cela implique quelques petites contraintes entre autres de pouvoir utiliser des

variables pour conserver les structures en question Ideacutealement la solution la plus solide

en terme de description de structures utiliserait lorienteacute-objet Une des composantes

les plus importantes dune solution orienteacutee objet est la preacutesence dune hieacuterarchie de

classes dobjets

123 Hieacuterarchie solide et extensible

Un objectif que nous recherchons est que le langage nous fournisse une hieacuterarchie dobshy

jets (ou de structures) de qualiteacute afin de pouvoir creacuteer une grande quantiteacute de diashy

grammes agrave partir deacuteleacutements de cette hieacuterarchie Une hieacuterarchie peut ecirctre deacutecrite comme

eacutetant une structure permettant dinteacutegrer facilemen~ de nouveau~ aspects sans_avoir agrave

dupliquer inutilement du code Il serait aussi important quelle puisse ecirctre eacutetendue si cershy

tains eacuteleacutements suppleacutementaires sont neacutecessaires Par exemple il pourrait ecirctre inteacuteressant

pour des gens en geacutenie eacutelectrique de pouvoir faire des diagrammes eacutelectriques malgreacute

le fait que cela ne fait pas partie de nos contraintes de deacutepart Cela pourrait ecirctre ajouteacute

par extension du systegraveme

124 Objectifs moindres

Gestion des erreurs

Dans des notes de cours il est freacutequent davoir des diagrammes Par contre eacutecrire

un diagramme peut saveacuterer plus compliqueacute que deacutecrire du texte Comme plusieurs

utilisateurs potentiels ne seront pas des experts du systegraveme il faut que les erreurs soient

deacutetecteacutees et traiteacutees de maniegravere adeacutequate Cela assure agrave lutilisateur final une expeacuterience

11

plaisante en speacutecifiant les erreurs quil commet et des meacutethodes pour les reacuteparer Sil

faut que lutilisateur cherche pendant des heures pour trouver la petite erreur quil a

commise il va tout simplement cesser dutiliser le logiciel

Langage fluide et clair

Bien que moins important le fait davoir un langage clair est excellent pour attirer les

utilisateurs vers ce systegraveme En effet si le langage est un gribouillis incompreacutehensible il

sera fort probablement dur dapprentissage et difficile agrave aborder Par fluide et clair nous

entendons que le langage soit jusquagrave un certain point compreacutehensible pour quelquun

qui ne connaicirct pas le systegraveme

Qualiteacute de la documentation et courbe dapprentissage

Finalement il faut quune documentation existe et quelle soit complegravete De preacutefeacuterence

une bonne documentation contiendra un reacutepertoire de toutes les fonctionnaliteacutes mais

aussi des tutoriels avec des exemples codeacutes de cas standards Cela incite les utilisateurs

agrave essayer le logiciel en prenant un exemple et en ladaptant agrave leurs besoins Cela amegravene

(avec les autres objectifs) agrave un langage simple dapprentissage mais tout de mecircme

puissant Comme notre objectif est de trouver une solution simple il faut que nimporte

qui puisse commencer agrave sen servir rapidement sans avoir besoin de lire lensemble de

la documentation

13 Analyse des solutions existantes

Naturellement une fois que nous savons ce que nous recherchons il nous faut analyser

toutes les solutions qui existent deacutejagrave Cela nous permettra didentifier une solution qui

est deacutejagrave fonctionnelle ou au mieux une qui pourra ecirctre eacutetendue ou utiliseacutee afin de

simplifier le travail de creacuteation si besoin est Au minimum nous pourrons extraire les

concepts inteacuteressants de chaque solution et voir sil est possible de les inteacutegrer agrave notre

solution

12

131 Paquets f1TEX standards

Eacutetant donneacute limportance de lutilisation de JbIEX les premiegraveres solutions sont celles

disponibles agrave linteacuterieur mecircme de fbIEX Celles-ci sont appeleacutees des paquets Plusieurs

paquets diffeacuterents existent et bon nombre dentre eux sont des solutions bricoleacutees et

donc incomplegravetes

Dans les solutions inteacuteressantes on note premiegraverement la preacutesence de la commande

picture Celle-ci a eacuteteacute ajouteacutee dans TEX par Donald Knuth comme tme solution agrave tout

oubli potentiel dans son systegraveme Cette commande prend du texte quelconque et le passe

par la suite au pilote qui compile le document Cela permet entre autres de transfeacuterer

des informations au pilote qui compile en Postscript et permet donc lutilisation de toute

la force de Postscript dans la reacutedaction de dessin Un gros problegraveme de cette solution

est que le texte agrave eacutecrire deacutepend du pilote utiliseacute limitant de beaucoup son utilisation

Il est tout de mecircme devenu la base de nombreux paquets qui se servent de Postscript

Plusieurs solutions ont aussi eacuteteacute deacuteveloppeacutees pour toutes sortes de domaines On retrouve

entre autres des-diagrammes de-Peynmann et deuml Lewis (feyn et-lewis) des dia-grammes

de flots (nassflow) et des arbres linguistiques (xyling rst qtree et lingtrees)

Naturellement ces solutions ne conviennent pas car elles sont pour des domaines trop

speacutecifiques par rapport agrave notre objectif

Une solution dun domaine plus geacuteneacuteral qui se deacutemarque est le paquet PSTricks (Van

Zandt 1993a) Creacuteeacute en 1993 par le professeur Timothy Van Zandt celui-ci est devenu

tregraves populaire au fil des anneacutees eacutetant donneacute les nombreuses possibiliteacutes qui existent en

Postscript Un des grands avantages est sa documentation qui est tregraves prolifique et tregraves

claire (Van Zandt 1993b)

Cela est bien inteacuteressant mais malheureusement PSTricks souffre du mecircme problegraveme

que chaque paquet interne agrave JbTEXmiddot Il est fait agrave partir de macros En effet TEX a eacuteteacute eacutecrit

complegravetement agrave partir de macros Il sagit dlm meacutecanisme de remplacement textuel ougrave

lon deacutefinit une entreacutee et toutes les occurrences de cette entreacutee sont remplaceacutees par une

13

sortie bien speacutecifique Comme une macro est toujours remplaceacutee par son contenu avant

decirctre analyseacutee plus en deacutetail toute forme derreur se retrouve agrave un niveau extrecircmement

bas Cela fait que nimporte quelle erreur est quasi impossible agrave cerner correctement

rendant le travail de lutilisateur qui souhaite apprendre tregraves complexe De plus le fait

de fournir le Postscript directement agrave lutilisateur rend celui-ci tregraves puissant mais tregraves

dangereux Finalement bien que de nombreuses formes soient disponibles il nexiste

pas de hieacuterarchie en tant que telle dans PSTricks ce qui le rend impossible agrave eacutetendre

132 )(J(-pic

Une autre solution inteacuteressante peut ecirctre retrouveacutee agrave linteacuterieur de gTEX Il sagit

de XV-pic un paquet eacutecrit par Kristoffer H Rose (Rose et al 2010) Ce paquet

a eacuteteacute creacuteeacute speacutecifiquement pour la description de diagrammes agrave linteacuterieur de gTEX

et possegravede une documentation exhaustive Malheureusement cette documentation est

extrecircmement complexe mecircme pour un utilisateur avanceacute XV-pic utilise principalement

des boicirctes gTEX positionneacutees agrave diffeacuterents endroits afin de creacuteer les diagrammes Ceuxshy

ci sont par la suite relieacutes par diffeacuterents objets puis deacutecoreacutes Cela fournit un reacutesultat

final de qualiteacute XV-pic possegravede entre autres un mode pour creacuteer des diagrammes en

positionnant les eacuteleacutements dans une matrice Cela rend les dessins plus simples concepshy

tuellement mais pas toujours positionneacutes adeacutequatement XV-pic permet aussi de faire

du positionnement relatif agrave dautres objets ce qui peut ecirctre tregraves pratique Comme nous

pouvons le voir dans lexemple suivant XV-pic est tregraves pratique dans les reacutesultats quil

nous permet dobtenir mais sa syntaxe laisse de beaucoup agrave deacutesirer

Par contre les deacutefauts de XV-pic sont extrecircmement visibles En premier lieu la syntaxe

du langage est extrecircmement difficile agrave comprendre car elle est baseacutee sur la composition

de nombreux caractegraveres speacuteciaux De plus comme il sagit dun paquet gTEX le tout

est impleacutementeacute agrave laide de macros et rend donc la recherche derreur laborieuse (surshy

tout lorsquon prend en compte la syntaxe deacutejagrave difficile agrave utiliser) Cela rend XV-pic

inapte agrave lutilisation par quelquun qui ne souhaite pas investir trop de temps dans son

apprentissage Finalement les nombreux modes de dessins sont souvent incompatibles

14

xymatrix U ar_[ddr]_y ar-[drr]-x

argt[dr] I-(xy) amp X times_Z y ar[d]-q ar[r]_p amp X ar[d]_f amp y ar[r]-g

amp Z

Figure 11 Code XY-pic pour un diagramme

Figure 12 Diagramme reacutesultant du code XY-pic

entre eux et ne peuvent souvent pas ecirctre utiliseacutes dans un mecircme dessin

133 Metapost

Eacutetant donneacute le problegraveme commun agrave tous les paquets agrave linteacuterieur de JgEX la solution la

plus logique serait dessayer den sortir Cela a donneacute le logiciel Metapost (Hobby 1992)

Celui-ci a eacuteteacute inspireacute de Metafont (Knuth 1986) que Knuth a utiliseacute pour dessiner des

polices pour EX Une des grandes avanceacutees du langage est la description de courbes

Celui-ci reacuteutilise un algorithme de Knuth qui permet de deacutecrire des courbes tout en

en controcirclant les diffeacuterents paramegravetres De plus comme le logiciel nest pas reacutedigeacute en

macros il permet de deacutetecter de maniegravere adeacutequate les erreurs de lusager Nous pouvons

deacutejagrave voir dans le code fourni en exemple quil sagit dun langage beaucoup plus clair

que XV-pic

15

beginfig(l)

pair A B C A=(OO) B=(lcmO) C=(Olcm) draw A--B--C--cycle

endfig

Figure 13 Code Metapost pour dessiner un triangle

Figure 14 Diagramme reacutesultant du code Metapost

Par contre quelques problegravemes se deacutegagent de Metapost Premiegraverement le langage ne

permet pas limpleacutementation dune hieacuterarchie solide Cela ne serait pas un problegraveme sil

en existait deacutejagrave une mais ce nest pas le cas En effet les diagrammes ont fait lobjet

dune extension du langage mais rien de tregraves deacuteveloppeacute Il est donc faisable de faire

des diagrammes mais il ne sagit pas neacutecessairement dune solution agrave toute eacutepreuve

De plus comme toutes les coordonneacutees du langage sont donneacutees en valeur absolue cela

limite les possibiliteacutes du langage (entre autres en ne pouvant utiliser des points deacutefinis

par des objets)

134 Asymptote

Une autre possibiliteacute se retrouve dans le logiciel Asymptote qui se deacutefinit comme eacutetant

Wl langage inspireacute de Metapost (Hammerlindl Bowman et Prince 2010b) Il est donc

aussi externe agrave g1EX mais aussi inspireacute du langage de programmation CH Cela lui

confegravere la creacuteation de structures avanceacutees et la creacuteation de fonctions complexes De

plus une documentation exhaustive et un traitement des erreurs de qualiteacute en font une

solution robuste

Malheureusement comme Metapost Asymptote pose quelques problegravemes En effet ce

16

size(3cm) draw(unitsquare) labelC l $A$ (00) SW)

labelC $B$ Cl 0) SE) label ($C$ Cl 1) NE)

label ($0$ (01) NW)

Figure 15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin

( )

il

Figure 16 Diagramme reacutesultant du code Asymptote

logiciel fut eacutecrit avec les matheacutematiques continues et la geacuteomeacutetrie comme domaine

dutilisation Ce nest pas Lill problegraveme en tant que tel (Asymptote le fait tregraves bien)

mais cela fait que la- creacuteation de diagrammes discrets nest pas vraiment deacuteveloppeacutee

Il faudrait donc ecirctre capable de creacuteer une hieacuterarchie de structures pour la creacuteation de

diagrammes Eacutetant donneacute le support des structures posseacutedant des fonctions internes il

devrait ecirctre possible dajouter cette possibiliteacute agrave Asymptote

Malheureusement ce nest pas preacutesentement reacutealisable agrave linteacuterieur du langage En efshy

fet Asymptote est un langage baseacute objet Cela signifie quil possegravede des structures qui

ressemblent agrave une description typique dun objet mais pas toutes les proprieacuteteacutes imshy

portantes qui se rattachent agrave un langage agrave objets standard comme Java ou C++ Plus

particuliegraverement cest labsence de polymorphisme qui cause problegraveme En effet la

creacuteation dune hieacuterarchie implique de creacuteer des liens entre les diffeacuterentes structures Par

exemple un cercle un triangle et un nuage sont toutes des formes avec certaines proshy

prieacuteteacutes similaires Il nous faut donc avoir des fonctions qui prennent des formes comme

paramegravetres Si nous avons une fonction f qui prend une forme nous souhaiterions eacutecrire

une seule fonction

17

fCforme)

Malheureusement en Asymptote il faudrait eacutecrire une fonction pour chaque forme

distincte comme cela

fCcercle)

fCcarre)

fCnuage)

Cela rend la creacuteation dune hieacuterarchie extrecircmement difficile car pour chaque fonction

utilisant un objet plus geacuteneacuteral il nous faut eacutecrire plusieurs fois cette fonction De plus

cela rend lexpansion par lusager de la hieacuterarchie essentiellement impossible car il doit

rajouter des cas pour chaque fonction deacutefinie preacuteceacutedemment en plus dajouter son nouvel

objet dans la hieacuterarchie Cela est difficilement souhaitable

135 Conclusion de lanalyse

Afin den venir agrave une conclusion adeacutequate il faut se ramener aux objectifs rechercheacutes

Cela nous permet de rapidement eacuteliminer les solutions internes agrave Ib-TEX eacutetant donneacute

la complexiteacute de la gestion des erreurs (et indirectement la courbe dapprentissage du

langage) Cela nous laisse comme solution Metapost et Asymptote Naturellement le

langage Asymptote est plus eacutevolueacute que celui de Metapost et fournit des eacuteleacutements de

programmation plus inteacuteressants Cela implique donc quil nous permet plus aiseacutement

de construire nos structures tant deacutesireacutees

Par contre Asymptote ne fournit pas une solution suffisante eacutetant donneacute quil ne possegravede

pas une hieacuterarchie dobjets adapteacutee aux diagrammes De plus eacutetant donneacute que le langage

est baseacute objet il sera beaucoup trop compliqueacute dy implanter une hieacuterarchie Nous en

venons donc agrave la conclusion que le mieux serait dutiliser Asymptote qui nous fournit un

ensemble de services complexes (impleacutementation des chemins liens avec Ib-TEX etc )

et de limpleacutementer avec un langage de plus haut niveau

18

Java devient un choix inteacuteressant pour cette tacircche En effet cest un langage connu dans

lindustrie et simple dapprentissage Il sagit dun langage de programmation objet qui

nous permettra agrave coup sucircr dimpleacutementer une hieacuterarchie solide Par contre ce langage

possegravede quelqu~s petits problegravemes comme un tregraves haut niveau de verbositeacute et beaucoup

deacuteleacutements non requis pour la description de diagrammes

Nous en sommes donc venus agrave la conclusion que la meilleure solution serait dutiliser

Java mais dimpleacutementer par-dessus celui-ci un langage deacutedieacute qui eacuteliminerait tout ce

qui nest pas requis pour la description des diagrammes Nous appellerons ce langage

SDDL pour Structured Diagram Description Language

Concepts inteacuteressants agrave conserver

Avant de penser agrave concevoir notre logiciel il serait bon de voir quels eacuteleacutements nous

souhaitons conserver des solutions existantes Agrave cette fin leacuteleacutement le plus inteacuteressant

provient de XV-Pic En effet il permet de relier des objets entre eux par des flegraveches

dune maniegravere relativement simple Il serait donc inteacuteressant de pouvoir permettre de

deacutecrire des liens entre diffeacuterents objets par des points speacutecifiques agrave chacun dentre eux

De plus lalgorithme de description de chemins utiliseacute par Metapost et Asymptote est

extrecircmement efficace et utile et pourrait donc ecirctre utiliseacute directement par notre langage

Cela sera simple agrave impleacutementer eacutetant donneacute que nous souhaitons utiliser Asymptote pour

compiler vers Postscript

14 Diagrammes repreacutesentatifs du domaine

Finalement avant de pouvoir commencer agrave deacutefinir les besoins de notre hieacuterarchie il

nous faut obtenir une deacutefinition valide et complegravete de notre domaine Naturellement

il nest pas eacutevident de trouver une deacutefinition concregravete et objective dun diagramme en

informatique theacuteorique Nous devons donc nous rabattre sur une autre solution qui doit

tout de mecircme ecirctre la plus formelle possible

19

141 Lapproche de Knuth

Pour trouver une ideacutee nous nous ramegravenerons agrave la meacutethode que Donald Knuth a utiliseacutee

lorsquil a creacuteeacute TEX En effet il souhaitait creacuteer un logiciel qui ferait de laquo beauxraquo doshy

cuments Cela eacutetant un terme tregraves subjectif Knuth deacutecida de se deacutefinir un ensemble

de journaux scientifiques dont les publications eacutetaient du plus haut standard de qualiteacute

pour leacutepoque (Knuth 1999) Apregraves avoir obtenu ces diffeacuterents exemples il put saffairer

agrave essayer de reproduire une solution de cette qualiteacute Il devient donc eacutevident agrave la fin

du cycle de deacuteveloppement du logiciel que sa solution eacutetait coheacuterente et valide car elle

permettait dobtenir un reacutesultat de qualiteacute en comparaison agrave ce que nous pourrions

deacutejagrave deacutefinir comme eacutetant de qualiteacute

Nous pouvons donc chercher agrave suivre la mecircme meacutethode Afin de la respecter nous devons

trouver quelques livres dun haut niveau de qualiteacute et prendre certains diagrammes

que lon retrouve agrave linteacuterieur Cela nous permettra de retrouver les eacuteleacutements les plus

cruciaux de notre domaine

Plusieurs livres inteacuteressants soffrent agrave nous nous utiliserons entre autres laquo The Art

of Computer Programming raquo de Donald Knuth (Knuth 1968) Il est naturel quun des

livres les plus connus en informatique eacutecrit par Knuth de surcroicirct possegravede un haut

standard de qualiteacute Un autre livre important est le laquo livre du dragonraquo (Aho Sethi et

Ullman 1986) qui eacutetudie la theacuteorie de la compilation et est extrecircmement connu dans

son domaine De plus celui-ci renferme leacutetude de nombreuses structures de donneacutees ce

qui nous fournit de nombreux diagrammes de qualiteacute Finalement il existe aussi un livre

tregraves connu dans leacutetude des algorithmes (ce qui est aussi extrecircmement lieacute agrave leacutetude des

structures de donneacutees) qui sappelle laquo Introduction to Algorithmsraquo (Cormen et al

2001) Ces trois livres forment une base extrecircmement connue et de qualiteacute pour nos

diagrammes Nous avons extrait quinze (15) diffeacuterents diagrammes de ces livres

20

142 Description des exemples et des concepts preacutesents dans les diagrammes

Les diffeacuterents diagrammes que nous avons seacutelectionneacutes repreacutesentent diffeacuterentes strucshy

tures de donneacutees On y retrouve plusieurs arbres et graphes Les graphes sont de plushy

sieurs types allant dun graphe standard agrave des graphes dexeacutecution De plus certaines

structures preacutesentes plus rarement se retrouvent dans notre ensemble Entre autres on

retrouve un diagramme de Venn qui bien que conceptuellement simple est toujours

relativement complexe lorsque nous souhaitons le reacutealiser avec un logiciel On retrouve

aussi des arbres linguistiques qui ne sont pas neacutecessairement complexes mais surtout

longs agrave reacutealiser

Cet ensemble de diagrammes nous permet de couvrir lensemble des structures de

donneacutees importantes en informatique theacuteorique et en matheacutematiques discregravetes Il existe

dautres structures de donneacutees mais celles-ci peuvent toujours ecirctre impleacutementeacutees seacutepashy

reacutement eacutetant donneacute que nous souhaitons faire une hieacuterarchie aiseacutement extensible Nous

remarquons surtout dans nos exemples quun des eacuteleacutements les plus importants est de

pouvoir r~lier convenablement les_diffeacuterents eacuteleacutements (dans un graphe par exemple)

Comme il sagit de quelque chose qui est toujours preacutesent il sagira dun des points les

plus importants agrave deacutevelopper pour notre hieacuterarchie

CHAPITRE II

STRUCTURE ET SOLUTION INFORMATIQUE

Afin de deacutevelopper un produit qui convient agrave nos besoins nous aurons besoin quil soit

structureacute adeacutequatement Cela implique principalement la construction de la hieacuterarchie

dobjets du domaine Il faut deacuteterminer quels sont les eacuteleacutements rechercheacutes dans notre

solution trouver une meacutethode de deacuteveloppement formelle et adeacutequate puis la reacutealiser

correctement Cela assurera une solution de qualiteacute

21 Objectifs dune structure dans une solution informatique

En premier lieu il nous faut justifier le besoin dune meacutethode de deacuteveloppement forshy

melle et solide En effet lin logiciel en informatique est tregraves diffeacuterent dun problegraveme

matheacutematique standard Une deacutemarche matheacutematique se ramegravene agrave un concept bien

connu la preuve Cela reurond la reacutesolution du problegraveme creacutedible agrave condition que la

preuve soit bonne Par contre nous verrons quun problegraveme informatique ne peut ecirctre

reacutesolu agrave laide dune simple preuve

211 Les diffeacuterentes composantes dune solution informatique

Une solution agrave un problegraveme informatique possegravede diffeacuterents eacuteleacutements Chacun dentre

eux possegravedent un certain degreacute de formalisme qui affecte lensemble de la solution

22

Algorithmes

Les algorithmes sont les eacuteleacutements les plus formels dune solution informatique On peut

dire quils se ramegravenent agrave la partie matheacutematique dun problegraveme informatique en quelque

sorte Composeacute dune seacuterie dopeacuterations aux comportements bien deacutefinis le reacutesultat dun

algorithme est preacutevisible Eacutetant donneacute la possibiliteacute de preacutevoir le comportement dun

algorithme agrave partir de ses entreacutees il est possible de deacutemontrer que lalgorithme fournit

exactement les reacutesultats rechercheacutes Il suffit en effet de prouver que agrave chaque entreacutee

possible on obtient la sortie qui serait logiquement attendue de lalgorithme On peut

penser par exemple agrave un algorithme de tri qui pour chaque ensemble de nombres

retourne les nombres en ordre croissant

Malgreacute tout un algorithme en informatique nest pas parfait En effet si le temps

dexeacutecution dun algorithme pour des entreacutees standards est beaucoup trop eacuteleveacute il ne

sera pas utiliseacute peu importe quil donne le bon reacutesultat Le temps dopeacuteration et la

quantiteacute despace meacutemoire sont les deux principales contraintes qui entrent en ligne de

compte pour les diffeacuterents algorithmes dune solution informatique

Solutions technologiques

Lautre partie extrecircmement importante de tout logiciel informatique est le choix des

technologies utiliseacutees En effet les programmes informatiques ne sont pas directement

creacuteeacutes agrave partir de circuit eacutelectriques Chaque couche dabstraction suppleacutementaire (cirshy

cuits logiques code assembleur programmation de haut niveau) limite les possibiliteacutes

du programmeur et vient avec certains avantages et certains inconveacutenients Le fait de

ne pas utiliser une solution deacutejagrave existante peut permettre une solution plus puissante

mais agrave un coucirct de deacuteveloppement potentiellement beaucoup plus eacuteleveacute Il est aussi posshy

sible avec un certain ensemble de choix technologiques de ne pas pouvoir obtenir un

effet rechercheacute dans une solution Cela explique pourquoi nous avons deacutecideacute dutiliser

Asymptote Il nous fournit un accegraves agrave JbTEX deacutejagrave codeacute ainsi quune traduction comshy

plexe vers un fichier image Postscript La reacutealisation de ces diffeacuterents eacuteleacutements de

23

code aurait significativement augmenteacute la complexiteacute de notre tacircche

Imperfection de toute solution informatique

Eacutetant donneacute les limitations des outils technologiques agrave notre disposition nous sommes

obligeacutes de constater que toute solution informatique est imparfaite De plus plusieurs

contraintes donneacutees agrave des systegravemes informatiques sont geacuteneacuteralement vagues et peuvent

ecirctre interpreacuteteacutees diffeacuteremment en fonction de lutilisateur Par exemple nous souhaitons

reacutealiser un outil simple dutilisation mais puissant et extensible Naturellement plus

un langage est puissant plus il devient complexe Un utilisateur peut trouver un outil

tregraves simple alors quun autre le trouvera incompreacutehensible Dautres points comme la

qualiteacute de documentation la courbe dapprentissage et lagestion aiseacutee des erreurs sont

des critegraveres qui possegravedent une bonne part de subjectiviteacute Ce ne sont toutefois pas

neacutecegravessairement de mauvais critegraveres Il faut simplement chercher selon une deacutefinition la

plus proche possible dun utilisateur moyen agrave maximiser les diffeacuterents paramegravetres

Ce genre de contraintes relegraveve geacuteneacuteralement du geacutenie logiciel Bien que ce meacutemoire ne

constitue pas un travail de geacutenie logiciel nous sommes obligeacutes demprunter quelques

eacuteleacutements agrave ce domaine afin dobtenir un reacutesultat adeacutequat

212 Consideacuterations pour une meacutethodologie de deacuteveloppement

Avant de choisir notre meacutethodologie il est bon de veacuterifier les objectifs rechercheacutes dans

lutilisation dune telle meacutethode de deacuteveloppement Cela nous permettra de deacutegager les

eacuteleacutements importants agrave garder en tecircte tout au long du deacuteveloppement de la hieacuterarchie

Un des eacuteleacutements les plus importants est dobtenir une structure efficace pour deacutecrire

nos diagrammes Lautre eacuteleacutement crucial est dobtenir une hieacuterarchie qui repreacutesente

adeacutequatement le domaine De preacutefeacuterence elle doit ecirctre complegravete et dun usage naturel

On entend par lagrave que les eacuteleacutements sont suffisamment preacutecis et proches deacuteleacutements stanshy

dards et connus du domaine que toutes les opeacuterations soient laquo naturellesraquo pour une

personne qui ne connaicirct pas le langage Il nexiste malheureusement pas de mesure pour

24

deacuteterminer si une hieacuterarchie est naturelle ou non Toutefois si chaque section est reacutefleacutechie

de maniegravere formelle le reacutesultat final devrait ecirctre naturel Certaines consideacuterations mishy

neures peuvent ecirctre plus ou moins mesureacutees comme la longueur du code et les noms

adeacutequats de fonctions

22 La programmation orienteacutee-objet

La programmation orienteacutee-objet est un des pheacutenomegravenes tregraves importants en informashy

tique Depuis sa creacuteation elle est devenue de plus en plus populaire eacutetant donneacute la faciliteacute

de deacuteveloppement dans une telle meacutethode Le fait dutiliser une solution orienteacutee-objet

(au contraire de Metapost ou Asymptote) ne sest pas fait de faccedilon arbitraire Il est

donc de mise dexposer les diffeacuterents avantages qui nous ont pousseacutes agrave choisir un tel

paradigme pour notre logiciel

221 Concepts de bases

La structure de base en programmation orienteacutee-objet est naturellement lobjet Celuishy

ci est deacutefini comme eacutetant une structure de donneacutees qui regroupe des donneacutees et des

meacutethodes (Saunders 1989) Bien quil ne sagit pas dun critegravere obligatoire la plushy

part des langages de programmation creacuteent les objets agrave partir dune classe qui deacutefinit

les diffeacuterents champs et meacutethodes preacutesents et leurs effets Les objets forment donc le

minimum requis pour avoir un langage objet

En tant que tel cet ensemble de concepts est assez minimaliste Il existe plusieurs autres

eacuteleacutements qui sont preacutesents agrave un degreacute plus ou moins grand dans les langages agrave objets

Ceux-ci forment donc en quelque sorte la base de la programmation orienteacutee-objet

(Pierce 2002)

- Lencapsulation des donneacutees cest-agrave-dire camoufler les donneacutees dans une structure

speacutecifique (lobjet)

- Lheacuteritage qui permet de deacutefinir un objet comme eacutetant une installce speacutecifique dun

autre objet On peut appliquer le mecircme raisonnement agrave deux classes On dit alors

25

quune classe heacuterite dune classe de base Celle-ci possegravede exactement le mecircme corps

que sa classe de base mais peut rajouter ou modifier certaines proprieacuteteacutes Il sagit

dun des aspects les plus importants dans le deacuteveloppement dune hieacuterarchie

- Le polymorphisme qui nous permet de creacuteer des proprieacuteteacutes qui varient en fonction

des sous-classes Par exemple une classe Nombre pourrait avoir une meacutethode daddishy

tion alors que ses sous-classes Entiegraveres et Reacuteelles redeacutefiniraient cette meacutethode en

fonction de leur impleacutementation speacutecifique Cela nous permet par la suite de prendre

deux nombres et de les additionner peu importe quil sagisse de reacuteels ou dentiers

222 Diffeacuterence avec la programmation baseacutee-objet

Les diffeacuterentes prioriteacutes eacutenumeacutereacutees ci-haut sont les eacuteleacutements de base qui nous permettent

de creacuteer une hieacuterarchie de qualiteacute Il sagit de la raison principale justifiant de ne pas

utiliser Asymptote pour creacuteer la hieacuterarchie En effet celui-ci est un langage baseacute-objet

La diffeacuterence principale est quun langage baseacute-objet ne neacutecessite pas limpleacutementation

de lheacuteritage ou du polymorphisme (Saunders 1989) Asymptote de son cocircteacute possegravede un

heacuteritage de structure minimal mais pas de polymorphisme Cette diffeacuterence est cruciale

car cet eacuteleacutement est neacutecessaire pour la creacuteation dune hieacuterarchie dans des contraintes

acceptables

En effet une chose importante est dajouter des objets dans les diagrammes Par

exemple supposons que nous avons une classe Conteneur Celui-ci doit pouvoir conteshy

nir des Cercles des Carreacutes des Triangles etc Sil fallait eacutecrire une fonction pour

ajouter chacune des formes le travail deviendrait eacutenormeacutement complexe et impossible

agrave eacutetendre pour lusager final Avec le polymorphisme il suffit deacutecrire une fonction qui

permet dajouter une Forme quelconque

23 Meacutethode pour la conceptualisation dune hieacuterarchie

Nous deacutecrirons ici la meacutethode que nous avons utiliseacute Il sagit de DMT (pour Dbj ect

Modeling Technique)

26

231 Origine de la meacutethode

Cette meacutethode fut deacuteveloppeacutee principalement par James Rumbaugh (mais avec laide de

plusieurs personnes) (Rumbaugh et al 1991) en 1991 Celui-ci est principalement connu

comme eacutetant un des auteurs de la norme UML qui est devenu le scheacutema de modeacutelisation

objet standard et utiliseacute par tous les programmeurs objets (Group 1999) Il est agrave noter

que cette meacutethode est une meacutethode danalyse complegravete pour toute la dureacutee de vie du

logiciel Nous naurons par contre besoin que de la partie analyse de cette meacutethode

232 Les diffeacuterentes eacutetapes de conceptualisation

La premiegravere partie de cette meacutethode a deacutejagrave eacuteteacute effectueacutee implicitement lorsque nous

avons rechercheacute nos diagrammes relatifs du domaine Habituellement il est suggeacutereacute

deacutecrire un texte reacutesumant lensemble du domaine mais dans notre cas il est plus

approprieacute de reacutesumer notre domaine avec des diagrammes Par la suite il faut prendre

le temps de faire ressortir les diffeacuterentes classes dobjets qui font parties du domaine et

prendre le temps de bien les deacutefini~middot On eacuteliminera les classes vagues ou redondantes par

la suite

La prochaine eacutetape consiste agrave deacutefinir les diffeacuterentes associations entre les classes Par

exemple une classe Employeacute et une classe Compagnie seraient lieacutees par lassociation

travaille pour Par la suite on identifie les attributs (ou les champs) des diffeacuterentes

classes en eacutevitant les attributs dimpleacutementation Finalement on raffine le modegravele en

ajoutant lheacuteritage des classes Cela permet de simplifier significativement la hieacuterarchie

Cela fournit une hieacuterarchie complegravete de notre domaine Par contre rien ne deacutemontre

quelle est correcte Afin de la veacuterifier il suffit danalyser les diffeacuterents cas typiques de

notre problegraveme regarder le reacutesultat obtenu et relever toute erreur Dans notre cas il

sagit de coder (seulement en terme de la hieacuterarchie) les diffeacuterents diagrammes et veacuterifier

si nous consideacuterons le tout satisfaisant Par la suite nous pourrons reacuteiteacuterer le mecircme

proceacutedeacute jusquagrave obtenir satisfaction Nous serons ainsi assureacutes davoir une hieacuterarchie

27

adapteacutee agrave notre domaine et complegravete

24 Deacuteveloppement de la hieacuterarchie

Maintenant que nous avons une meacutethodologie correcte nous pouvons creacuteer notre hieacutershy

archie Le fait de sassurer de sa compleacutetude nous permettra de ne pas rencontrer de

problegravemes complexes lors de la phase dimpleacutementation du logiciel

241 Extraction des diffeacuterents concepts

Les concepts du domaine (qui se ramegravenent agrave des classes) se divisent en plusieurs cateacuteshy

gories Une des principales est le domaine des formes Une forme peut ecirctre un carreacute

un cercle etc Une autre cateacutegorie importante est formeacutee des points qui peuvent ecirctre

deacutefinis de plusieurs maniegraveres diffeacuterentes Finalement une autre section importante est

formeacutee des structures de conteneurs incluant les Canvas (pour contenir des objets) et

des Drawing (pour reacutefeacuterencer des objets)

Eacutetant donneacute le nombre relativement faible de formes distinctes il ne nous est pas apparu

utile de faire plusieurs cateacutegories de formes distinctes En effet une seacuteparation entre les

courbes fermeacutees et ouvertes peut nous permettre de factoriser un ou deux eacuteleacutements de

code sans toutefois ecirctre significatif ou reacuteellement utile (eacutetant donneacute quil nexiste pas

vraiment de forme standard deacutefinie par une courbe ouverte)

242 Eacuteleacutements particuliers

Plusieurs eacuteleacutements particuliers se sont reacuteveacuteleacutes complexes agrave modeacuteliser dans notre hieacuterarshy

chie Nous abordons ici les principales difficulteacutes rencontreacutees ainsi que les solutions pour

les reacutegler

28

Creacuteation et placement dobjets

Leacuteleacutement le plus important de notre hieacuterarchie est de pouvoir structurer les objets

que nous souhaitons positionner Nous avons donc creacuteeacute une classe Canvas Le nom est

inspireacute du mot canevas en peinture eacutetant donneacute que nous avons apposeacute des restrictions

similaires agrave ce domaine En effet nous avons deacutecideacute que lorsquun objet est placeacute dans

un canevas il ne peut ecirctre enleveacute ou modifieacute Cela nous permettra plus tard de faire

des calculs pour les points de reacutefeacuterence plus aiseacutement De plus un canevas doit pouvoir

posseacuteder des sous-canevas Pour cela il nous faut une classe geacuteneacuterale qui deacutecrit tout

eacuteleacutement pouvant ecirctre ajouteacute dans un canevas

Cela est reacutesolu avec lintroduction dune classe Shape Celle-ci repreacutesente toute forme

qui peut ecirctre dessineacutee quelle soit simple ou complexe Un Canvas est une forme afin

de sassurer de pouvoir positionner des sous-canevas Une implication particuliegravere de

notre choix est quune Shape ne possegravede pas de position Il sagit dune forme abstraite

qui peut ecirctre positionneacutee agrave un certain endroit Cela implique aussi quil est possible de

prendre une Shape et de la placer agrave plusieurs end_roits distincts Lorsquelle est ajouteacutee

dans un Canvas une Shape est copieacutee ce qui empecircche toute modification subseacutequente

de la forme

Objets multiples

Lorsquil sagit de creacuteer des diagrammes freacutequemment il est tregraves probable que plusieurs

eacuteleacutements soient similaires Par exemple si nous creacuteons un arbre avec des cercles comme

sommets il sagit toujours en quelque sorte du mecircme cercle De plus si nous creacuteons

un sous-canevas et que nous le positionnons agrave plusieurs endroits certaines formes deshy

viennent automatiquement deacutedoubleacutes Il devient donc primordial pour nous de pouvoir

reacuteutiliser un eacuteleacutement que nous avons deacutejagrave deacutefini afin deacuteviter la creacuteation agrave reacutepeacutetition

dobjets

Or nous avons deacutejagrave speacutecifieacute quil eacutetait possible de positionner plusieurs fois le mecircme

29

objet Cela est vrai mais il y a une limitation En effet ces objets ne peuvent pas ecirctre

reacutefeacuterenceacutes Si nous souhaitons connaicirctre un objet celui-ci doit pouvoir ecirctre distingueacute

dun autre Il nous faut donc une classe qui repreacutesente une forme agrave un endroit preacutecis

Pour cela nous avons creacuteeacute la classe Drawing Celle-ci permet de repreacutesenter une Shape

agrave un endroit bien preacutecis dans un canevas Cela fait toutefois que les eacuteleacutements dans un

sous-canevas multiple restent identiques Nous verrons bientocirct la solution agrave ce problegraveme

Points de reacutefeacuterence

Un des eacuteleacutements les plus complexes relevait du fait de fournir des points de reacutefeacuterence

En effet faire de simples chemins entre des coordonneacutees en valeurs absolues neacutetait pas

suffisant mecircme sil est possible dadditionner ses points La solution souhaiteacutee eacutetait de

permettre de deacutefinir des points de reacutefeacuterence ceux-ci pouvant ecirctre obtenus agrave partir de

lobjet lui-mecircme Par exemple un cercle pourrait retourner son point nord

Un eacuteleacutement fondamental causait problegraveme la fonction pour acceacuteder au point doit ecirctre

deacutefinie dans la forme (par exemple dans la classe Circle) Par contre une forme en

tant que telle ne possegravede pas de position speacutecifique Par conseacutequent son point nest

pas deacutefini non plus Pour cela il faudrait obtenir un Drawing Par contre un Drawing

ne peut pas posseacuteder la deacutefinition de chaque fonction daccegraves agrave un point pour chaque

forme Cela est contre-intuitif Il faut donc demander agrave la forme lorsquon appelle pour

obtenir un point de prendre le Drawing suppleacutementaire en paramegravetre Notre intention

est lorsque nous eacutecrirons un langage au-dessus de la hieacuterarchie de pouvoir reacutegler ce

problegraveme

Chemins de reacutefeacuterence

Finalement il nous reste un leacuteger problegraveme Nous pouvons maintenant faire une reacutefeacuteshy

rence agrave un objet disons a et obtenir un point speacutecifique de cet objet Par contre cela

nest pas suffisant dans un cas bien preacutecis Disons que a est dans le canevas b Ensuite b

est placeacute agrave deux reprises dans le canevas c obtenant deux Drawing diffeacuterents cl et c2

30

Nous ne pouvons pas acceacuteder agrave a car il est repreacutesenteacute seulement en fonction de b Pour

reacutegler le problegraveme il faut faire un chemin de reacutefeacuterence (disons cl b a dans le langage

final) Pour cela nous fournirons la possibiliteacute de partir dun Drawing et den obtenir

un autre (agrave condition quil sagisse dun Canvas naturellement) Cela va mettre agrave jour

la position relative de lobjet par rapport agrave un niveau de profondeur suppleacutementaire

En acceacutedant agrave cette fonction aussi souvent que neacutecessaire il est possible de reacutefeacuterencer

un objet peu importe son degreacute de profondeur reacuteel Cela nous permet donc de faire

des liens complexes entre nimporte quel objet (voire mecircme des objets de profondeur

diffeacuterentes)

31

CHAPITRE III

EacuteLEacuteMENTS GRAPHIQUES

Dans ce chapitre nous deacutefinissons les eacuteleacutements graphiques requis pour faire des dessins

informatiques dont les courbes de Beacutezier ainsi que les splines cubiques Les proprieacuteteacutes

importantes de ces courbes sont deacutemontreacutees De plus une preuve est fournie de la

possibiliteacute dapproximer adeacutequatement un cercle avec des splines cubiques Finalement

nous discuterons du fonctionnement des diffeacuterentes solutions informatiques en terme de

structure telles que PDF et Asymptote

Courbes et segments en informatique

Naturellement les eacuteleacutements les plus importants dans des dessins informatiques sont les

segments et les courbes Pour des besoins de simpliciteacute nous essaierons de les inteacutegrer

dans la mecircme deacutefinition en traitant les segments comme un cas particulier des courbes

Nous donnons agrave cette courbe geacuteneacuterale le nom de chemin

Le premier problegraveme lorsque nous voulons faire des courbes en informatique est la

meacutethode pour les repreacutesenter Lecirctre humain peut tracer une infiniteacute de courbes disshy

tinctes sans avoir besoin de la deacutecrire avec preacutecision Par contre lorsquon entre dans le

domaine de linformatique il faut non seulement ecirctre capable den faire une description

mais celle-ci doit ecirctre la plus petite possible

Une des meacutethodes de repreacutesentation est sous la forme de pixels (JI et Kelley 2007)

Cette meacutethode implique de repreacutesenter un plan continu par un ensemble de points disshy

32

crets appeleacutes pixels Cela permet de repreacutesenter plusieurs formes de dessins extrecircmement

complexes et est utiliseacute dans certains logiciels dimages

Une autre meacutethode est la meacutethode vectorielle Cest la plus populaire Au lieu de

repreacutesenter directement le dessin tel quil apparaicirct on fournit une description du dessin

agrave partir de quelques concepts tregraves simples (points segments et cercles par exemple)

Lorsque lutilisateur souhaite voir le dessin un logiciel traduit la description en pixels

pour leacutecran

La derniegravere meacutethode possegravede plusieurs avantages La description dun dessin est souvent

beaucoup plus compacte que si on deacutecrit le dessin pixel par pixel De plus la description

conserve la preacutecision du dessin peu importe la reacutesolution agrave laquelle il est preacutesenteacute Par

exemple si nous prenons un ensemble de pixels et quon lagrandit plusieurs fois il est

tregraves probable que nous ayons perdu beaucoup dinformations Il nous faut par contre

veacuterifier la puissance reacuteelle dune telle meacutethode Nous devons donc introduire une des

structures utiliseacutees pour la description vectorielle

32 Courbes de Beacutezier

Une courbe de Beacutezier est un concept relativement simple deacuteveloppeacute indeacutependamment

par Paul de Casteljau et Pierre Beacutezier entre 1959 et 1962 Ces deux personnes avaient

pour objectif de creacuteer des repreacutesentations par ordinateur de voitures pour les compagnies

Citroen et Renault respectivement (Jr et Kelley 2007)

321 Deacutefinition

Soit Po Pl P2 Pn E 1R2 un ensemble de points dans un plan carteacutesien typique

Ceux-ci sont appeleacutes des points de controcircle Soit t E IR et 0 lt t 1 La courbe de

Beacutezier de degreacute n des points Po agrave Pn est deacutefinie par la formule suivante

B t - n ( n

) 1 - t n-ttt

pPohmiddotPn ( ) - ~ i ( ) t (31) t=O

33

Le chemin est deacutefini pour les valeurs entre 0 et 1 de t Cette formule peut sembler

leacutegegraverement arbitraire et complexe pour une forme supposeacutement simple Une seconde

deacutefinition reacutecursive cette fois-ci simplifie beaucoup la formule

322 Deacutefinition alternative

Bp =p (32)

BpOPl Pn(t) = (1 - t)BpOPl Pn-l (t) + tBplhPn (33)

Cette deacutefinition alternative se ramegravene agrave dire quune courbe de Beacutezier est une intershy

polation lineacuteaire entre deux courbes de Beacutezier de degreacute infeacuterieur La deacutemonstration se

ramegravene agrave quelques manipulations bien simples et est laisseacutee en exercice au lecteur

Nous pouvons analyser les formules pour diffeacuterents degreacutes Par exemple une formule de

Beacutezier de degreacute 1 nest quune droite

BPoPl (t) = (1 - t)Po + tP] (34)

Alors quune courbe de degreacute 2 se ramegravene agrave une parabole

(35)

Finalement une courbe de Beacutezier cubique (de degreacute 3) fournit une courbe relativement

complexe qui commence agrave Po et termine agrave P3

--- ---

34

P P

0

P

Po - ____ _ - - P2

Po - - - - - - - - - - - - - - - - - - - - - - - shyPo P2 P3

(a) lineacuteaire (b) quadratique (c) cubique

Figure 31 Courbes de Beacutezier lineacuteaire quadratique et cubique

Eacutevidemment il ny a pas davantages significatifs agrave utiliser une courbe de Beacutezier lineacuteaire

Les courbes de Beacutezier quadratique sont quant agrave elles utiliseacutees lors de la geacuteneacuteration

de police TrueType (Apple Computer Inc 1996) Finalement les courbes de Beacutezier

cubiques sont utiliseacutees dans Postscript (Adobe Systems Incorporated 2010a) et dans la

plupart des produits Jb1EX tel que Metafont (Knuth 1986) Ces logiciels utilisent en

fait une combinaison de courbes de Beacutezier appeleacutees splines que nous verrons dans la

section suivante

323 Proprieacuteteacutes dune courbe de Beacutezier

En regardant les diffeacuterentes courbes nous pouvons aiseacutement voir quelques proprieacuteteacutes

Entre autres il y a interpolation des points de deacutepart et de fin Cela peut se deacutemontrer

aiseacutement en calculant B(uuml) et B(l) qui donne respectivement Po et Pn De plus les

autres points ne semblent pas ecirctre interpoleacutes Il sagit ici dun cas geacuteneacuteral (les points

peuvent ecirctre interpoleacutes sils sont colineacuteaires)

Une autre proprieacuteteacute inteacuteressante des courbes de Beacutezier est son invariance par transforshy

mation affine Cela se ramegravene au theacuteoregraveme suivant Dans le cadre de ce theacuteoregraveme nous

devrons transformer les coordonneacutees des points de controcircles des courbes de Beacutezier en

coordonneacutees projectives homogegravenes Ceci se ramegravene agrave rajouter un axe agrave chacun de nos

points dont la valeur sera toujours 1

35

Theacuteoregraveme dinvariance affine

Soit BpOPl Pn(t) une courbe de Beacutezier Soit M une matrice 3 par 3 repTeacutesentant une

transformation affine Alors on a que la courbe est invari(Lnte par lapplication de M

cest-agrave-dire MBpoPlPn(t) = BMPolvIPl lvIPn(t)

Pour le prouver il suffit de deacutevelopper la formule

NI BpoP1Pn (t) = M t (~) (1 - tt-ieuml Pi 1=0

= tM(~) (1- tt-itiPi 1=0

= t (~) (1- t)n-iti(MPi ) 1=0

Ce theacuteoregraveme implique que pour transformer une courbe de 8eacutezier il suffit dappliquer la

transformation agrave chaque point de controcircle et de calculer une nouvelle courbe de 8eacutezier

Donc une courbe de Beacutezier est entiegraverement deacutefinie par ses points de controcircle Cela fait

quelle est tregraves pratique en informatique car elle ne requiert que peu despace pour la

deacutefinir (ie seulement les n + 1 points de controcircle) De plus il est tregraves simple de geacuteneacuterer

une courbe de Beacutezier car il suffit dutiliser la formule pour autant de valeurs de t que

nous avons besoin de preacutecision dans la courbe En conservant linformation avec cette

meacutethode nous conservons une courbe sans aucune perte dinformation Cela signifie que

nous pouvons agrandir la reacutesolution de la courbe autant que nous le souhaitons et il

sagira toujours dune belle ligne courbe Cette proprieacuteteacute est extrecircmement inteacuteressante

en informatique

36

324 Deacutesavantages des courbes de Beacutezier

Les courbes de Beacutezier sont utiliseacutees dans beaucoup de domaines Par contre elles

possegravedent quelques deacutesavantages peu inteacuteressants Le plus important est probablement

labsence de controcircle local Cela sexprime par le fait que degraves que lon souhaite modifier

une courbe de Beacutezier agrave un endroit particulier tout le reste de la courbe est modifieacute au

passage Cela se deacutemontre par le fait que si 0 lt t lt 1 on a alors que

Cela implique que chaque point de controcircle de la courbe de Beacutezier a une influence (aussi

minime soit-elle) sur lensemble de la courbe Le reacutesultat est que les courbes de Beacutezier

seules sont difficiles agrave utiliser et longues agrave eacutevaluer si on utilise trop de points de controcircle

33 Splines cubiques

La solution agrave ce problegraveme est lutilisation de splines cubiques Lideacutee de base dune spline

est que si une seule courbe cause trop de problegravemes il est probablement mieux dutiliser

plusieurs courbes mais qui fonctionnent seulement dans un domaine plus petit Plus

formellement une spline cubique (aussi appeleacute B-spline cubique) est composeacute de

- un ensemble de valeurs ti pour 0 S i S m - 1 ougrave m repreacutesente le nombre de noeuds

On appelle aussi ces valeurs le vecteur de noeud Les t forment une suite monotone

croissante et sont tous des valeurs reacuteelles entre 0 et l

- L + l points de controcircle

- Une valeur entiegravere n qui repreacutesente lordre de la fonction B-sp1ine Une spline doit

respecter la condition n S m - 2

On deacutefinit une spline par la fonction suivante

37

m-n-2

S(t) = L Pibin(t) tE [01] i=O

ou dans le cas speacutecifique dune spline de degreacute 3

3

S(t) = L Pi bi 3(t) tE [01] i=O

Les bin repreacutesentent les bases de la B-spline (pour Basis Spline) Celles-ci sont deacutefinies

par la fonction reacutecursive suivante

bjoU) ~ sinon

Il sagit dune eacutequation complexe et nous ne nous y attarderons pas trop Quelques

deacutetails sont inteacuteressants agrave noter Entre autre il est inteacuteressant de constater que si lon

utilise n + 1 points de controcircle et que les noeuds sont n noeuds valant zeacutero et n noeuds

valant 1 le B-spline deacutegeacutenegravere en une courbe de Beurozier Il sagit donc dune extension

des capaciteacutes des courbes de Beacutezier

Le problegraveme principal eacutevoqueacute par les courbes de Beacutezier est que lutilisateur lors de

la creacuteation dune courbe manquait de controcircle local Il serait donc inteacuteressant que les

B-splines nous permettent de reacutegler ce problegraveme Lorsquon regarde la deacutefinition de la

base bi on remarque que celle-ci se ramegravene toujours au cas de base qui peut ecirctre aou

1 selon que nous sommes dans un domaine restreint ou non Comme il sagit du seul

facteur de Pi il est naturel daffirmer que le controcirc~e est plus localiseacute quavant Dautres

proprieacuteteacutes inteacuteressantes sont

- Pour tout t la somme de tout les bi(t) est 1

38

C5 C4 C3 -----~---- ----~-----

-----~---- ----~-----

Cg ClO Cn

Figure 32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier

- Un B-spline dordre m sera neacutecessairement Cm - 2 cest-agrave-dire quelle possegravede 2 ordres

de deacuteriyeacutees continues pour son domaine de deacutefinition _

- Tout comme les courbes de Beacutezier les B-splines sont invariants par transformation

affine On peut donc appliquer une courbe en appliquant tout simplement la transshy

formation sur les points de controcircle et en calculant le nouveau B-spline

34 Le cas dun cercle

Avec les outils que nous posseacutedons nous ne sommes pas en capaciteacute de dessiner un

cercle exact Cela nest pas grave eacutetant donneacute que nous pouvons tout de mecircme tenter de

lapproximer Pour ce faire nous utiliserons une spline cubique posseacutedant quatre points

(est nord ouest et sud respectivement) Chaque courbe de Beacute7i~r sera donc identique

aux autres agrave une rotation pregraves Il reste donc agrave deacuteterminer les points de controcircle agrave utiliser

Pour cela prenons le premier quadrant du cercle Nous passons du point Cl (10) agrave

C4 (0 1) Il nous faut deacuteterminer deux points de controcircle C2 et C3 Pour commencer

39

nous pouvons supposer de maniegravere tout agrave fait arbitraire que C2 se situe sur la tangente

de Cl et C3 sur la tangente de C4 Cela nous donne donc le scheacutema suivant

C4 C3 ----- ----~-----

1

1

1

1

TC2 1

1

1

i

Figure 33 Quart de cercle approximeacute par une courbe de Beacutezier

On a donc C2(1 k) et C3(k 1) ougrave k est une variable agrave deacuteterminer Afin de la deacuteterminer

nous devons donner une information suppleacutementaire Par exemple nous pouvons preacuteshy

supposer que le point agrave 45 degreacutes C(O5) doit ecirctre eacutevalueacute exactement par la courbe de

Beacutezier cest-agrave-dire C(O5) = (1 1) Nous obtenons donc la restriction

C(uuml5) = (1 - t)3CI + 3(1 - t)2tC2 + 3(1 - t)t2C3 + t3C4

1 3 3 1 = -Cl + -C2 + -C3 + -C4

8 8 8 8

ce qui nous permet dobtenir leacutegaliteacute

v2v2 1 3 3 1 (- -) = -Cl + -C2 + -C3 + -C4 (37)22 8 8 8 8

ce qui nous fournit apregraves substitution des valeurs des points deux fois leacutequation

v2 1 3k-=-+- (38)2 2 8

40

ce qui nous fournit apregraves reacutesolution

k = ~(J2 - 1) 0552285

Cela nous fournit donc une courbe de Beacutezier qui approxime notre cercle Il reste agrave voir

la preacutecision de cette approximation

Pour ce faire nous devrons comparer larc de cercle que nous venons de creacuteer agrave un cercle

reacuteel Afin dy arriver nous consideacutererons chaque valeur de notre arc comme eacutetant un

vecteur dont nous devrons calculer la longueur Plus cette longueur est proche de 1

plus nous avons une estimation reacutealiste Nous calculons donc

Par la suite une analyse des deacuteriveacutees nous permet de conclure que cette fonction dans

lintervalle t E [01] possegravede des m(iximu_ms agrave _t = 0 agrave tr~is reprises _(au deacutebut et agrave la

fin eacutetant donneacute la proprieacuteteacute naturelle des courbes de Beacutezier celle au milieu est due agrave

notre contrainte) Finalement elle possegravede deux (2) minimums agrave t = 0211 et t = 0789

et lerreur avec un cercle standard est de 0000273 Une telle variation sur un cercle

de rayon 1 est minime Il sagit dune variation maximale infeacuterieure agrave 003 Cela

signifie donc pour un cercle posseacutedant un rayon de 4000 pixels il y aura une variation

maximale de 12 pixels ce qui est indeacutetectable pour la taille du cercle Cela en fait une

bonne estimation pour cette section du cercle Nous pouvons naturellement suivre le

mecircme raisonnement pour les sections restantes

Il est aussi agrave noter que notre estimation nest pas la meilleure Notre choix de demander

leacutegaliteacute agrave 45 degreacutes est arbitraire et toute lerreur se retrouve dans le cocircteacute neacutegatif De

meilleures estimations ont eacuteteacute effectueacutees (Riskus 2006) avec des reacutesultats amenant une

preacutecision jusquagrave 25 plus grande (Lancaster 2005)

41

0--------------r--7T-----------------rl 08 (1

-000005

-000010

-000015

-000020

-000025

Figure 34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence

35 Structures informatiques dans les solutions deacutejagrave existantes

Maintenant que nous savons comment fonctionne les diffeacuterents modes de repreacutesentation

des dessins en informatique il faut analyser plus en deacutetail comment fonctionne les

logiciels dont nous allons nous servir En effet il nous faudra adapter nos structures de

bas niveau agrave celles disponibles dans les langages dont nous nous servirons Pour cela

nous allons analyser deux parties distinctes un format de fichier (PDF) ainsi quun

42

langage intermeacutediaire (Asymptote)

351 Postscript et PDF

En premier lieu il convient de comprendre comment fonctionne le format de fichier final

que nous utiliserons ]1EX permet de geacuteneacuterer plusieurs formats de fichier diffeacuterents

Pendant longtemps le plus populaire aura eacuteteacute Postscript creacuteeacute par Adobe Systems Cela

eacutetait principalement lieacute aux imprimantes qui fonctionnaient directement avec ce format

De nos jours le format PDF est beaucoup plus populaire bien quayant une base tregraves

proche de celle de Postscript

Postscript a eacuteteacute inventeacute par John Warnock et Charles Geschke en 1982 (Adobe Systems

Incorporated 1994) Lorsquil a eacuteteacute creacuteeacute il servait agrave faire la description de pages pour

impression Il se distingue comme eacutetant un langage de programmation complet mais

rarement utiliseacute directement En effet Postscript est difficile agrave utiliser car il utilise la

notation polonaise inverse Par exemple on exprime lappel de fonction j(a b c) de la

faccedilon suivante

abc f

Cette meacutethode rend lanalyse dun programme extrecircmement rapide et convivial pour

le logiciel qui linterpregravete car celui-ci est directement lieacute agrave la structure dune pile

dexeacutecution Par contre lanalyse dun tel programme par un humain est complexe

La plupart du temps Postscript eacutetait donc utiliseacute comme un langage de description

final pour un fichier

Il existait deux types de structures utiliseacutes en Postscript pour mettre des dessins sur une

page Le premier eacutetait lajout de texte Cela est intrinsegravequement lieacute agrave la description des

polices qui deacutepasse le cadre de ce meacutemoire Par contre pour faire un dessin quelconque

le format utilisait les chemins qui sont deacutecrits soit par des segments soit par des courbes

de Beacutezier cubiques On note donc le deacutesavantage de lutilisation dune courbe de Beacutezier

soit labsence de controcircle local

43

Quant agrave lui PDF a eacuteteacute creacuteeacute en 1993 (Adobe Systems Incorporated 2010b) Agrave travers les

gains de populariteacute le format PDF est devenue en 2008 un standard ISO (International

Organization for Standardization 2008) Cela en fait donc un format de document

standard extrecircmement inteacuteressant Alors que Postscript a eacuteteacute creacuteeacute pour des documents

qui devaient ecirctre imprimeacutes PDF a eacuteteacute conccedilu pour la description de documents plus

dynamiques cest-agrave-dire la possibiliteacute dajouter des eacuteleacutements multimeacutedias au document

Aussi il est possible de deacutecrire chaque page indeacutependamment des suivantes En effet

comme Postscript deacutecrivait des documents dimpression il est normal de connaicirctre la

page de deacutepart avant dimprimer la suivante En PDF chaque page est totalement

indeacutependante du reste du document

Pour la description deacuteleacutements graphiques les structures de base sont essentiellement

les mecircmes que Postscript Quelques eacuteleacutements comme la transparence cest-agrave-dire quun

eacuteleacutement cacheacute par un autre eacuteleacutement contribue au reacutesultat final ont eacuteteacute ajouteacutes mais les

eacuteleacutements graphiques de bas niveau sont identiques

352 Asymptote

Comme nous lavons dit preacuteceacutedemment tout ramener agrave des courbes de Beacutezier creacutee un

problegraveme de controcircle local des courbes Il faut donc utiliser une meacutethode pour donner

du controcircle agrave lutilisateur Pour cela nous utiliserons Asymptote Les structures de

bas niveau de Asymptote sont identiques agrave celles de PDF eacutetant donneacute quil convertit

directement les chemins Asymptote en chemins PDF Par contre Asymptote impleacutemente

un algorithme (Bowman 2007) originellement deacuteveloppeacute par Donald Knuth qui permet

de deacutecrire un chemin en fonction des points par lesquels il passe Asymptote utilise donc

des splines cubiques (qui ne sont pas neacutecessairement des B-splines toutefois)

Cet algorithme est complexe et en dehors du cadre de ce meacutemoire mais peut ecirctre

reacutesumeacute comme eacutetant un algorithme de choix des points de controcircle En effet une courbe

de Beacutezier cubique est deacutefinie par 4 points Le premier et le dernier sont interpoleacutes de

maniegravere exacte Ce que lalgorithme fait est quil prend un ensemble de points qui

44

seront tous interpoleacutes disons Pl P2 P3 P4 Ensuite pour chaque paire conseacutecutive de

points (donc (Pl P2 ) (P2 P3) et (P3 P4)) il geacuteneacuterera une courbe de Beacutezier cubique

La partie la plus importante de lalgorithme consiste agrave prendre toutes les informations

fournies par lutilisateur (les points de controcircle ainsi que des options qui deacutefinissent la

courbe comme les deacuteriveacutees agrave certains endroits ou des informations comme la tension qui

laisse lalgorithme calculer lui-mecircme les deacuteriveacutees agrave partir dun indice reacuteel simple) afin de

calculer pour chaque courbe de Beacutezier cubique les deux points de controcircle manquants

En laissant agrave lutilisateur le pouvoir de deacutecider seulement les points ougrave la courbe passe

le travail est simplifieacute mais permet tout de mecircme de terminer avec un ensemble de

courbes de Beacutezier

CHAPITRE IV

THEacuteORIE DES LANGAGES INFORMATIQUES

La creacuteation dun langage de programmation nest pas une mince tacircche Il faut donc

sassurer de le construire sur des bases theacuteoriques solides Nous preacutesenterons ici les

eacuteleacutements theacuteoriques importants de la theacuteorie des langages ainsi que leurs applications

dans le domaine de la compilation Nous preacutesenterons aussi loutil SableCC que nous

avons utiliseacute dans le cadre de notre langage ainsi quun bref exposeacute sur les langages

reacuteflexifs

La theacuteorie des langages est un sujet vaste et extrecircmement complexe Un meacutemoire comshy

plet pourrait ecirctre reacutedigeacute seulement sur les aspects theacuteoriques des automates reacuteguliers

Afin de compresser tout ce contenu dans un seul chapitre les eacuteleacutements seront mentionneacutes

sans preuve Nous recommandons toutefois au lecteur curieux et assidu de consulter les

reacutefeacuterences de ce chapitre pour des preuves et une couverture plus complegravete du sujet

41 Theacuteorie des langages et automates

Dans un premier temps nous devrons deacuteterminer ce quest formellement un langage

Par la suite nous analyserons une structure de donneacutees qui est intimement lieacutee agrave ce

sujet les automates

46

411 Les eacuteleacutements de base dun langage (Aho Sethi et Ullman 1986)

Alphabet et lettre

Un alphabet est un ensemble (au sens matheacutematique du mot) de symboles appeleacutes

lettres Un alphabet est fini et non-vide Par exemple lalphabet latin standard ainsi

que lensemble O I constituent des alphabets

Mot

Un mot dun alphabet A peut ecirctre un des trois cas suivants

- le mot vide euro formeacute daucune lettre

- une lettre de lalphabet A

- Toute suite finie de lettres aOal an ougrave chaque ai fait partie de lalphabet A

Il est agrave noter que les deux premiers sont en fait des cas speacutecifiques du dernier bien quils

sont souvent seacutepareacutes pour raison de clarteacute Dans le dernier cas on dit que les caractegraveres

sont lieacutes par lopeacuteration de concateacutenation

Langage

Un langage au sens le plus geacuteneacuteral possible est un ensemble de mots Celui-ci peut ecirctre

fini ou infini La plupart des exemples inteacuteressants (un langage de programmation par

exemple) est un langage infini En effet il existe une infiniteacute de programmes diffeacuterents

tout comme il existe une infiniteacute de nombres binaires

412 Exp esson reacutegnli r

Les expressions reacuteguliegraveres forment un outil de travail extrecircmement important en inshy

formatique De nombreux outils ainsi que certains langages (grep perl ) leurs sont

consacreacutes

47

On peut reacutesumer les expressions reacuteguliegraveres comme eacutetant une meacutethode afin de deacutecrire

un langage infini par une expression fini On utilisera dans la construction certaines

opeacuterations qui nous donneront des proprieacuteteacutes inteacuteressantes pour le langage final Tout

mot qui peut ecirctre construit agrave partir de ces regravegles fait automatiquement partie du langage

Constantes

Leacuteleacutement de base dune expression reacuteguliegravere est une constante Celle-ci est deacutefinie agrave

partir dune lettre de lalphabet et deacutefinit un seul mot la constante elle-mecircme Par

conseacutequent lexpression reacuteguliegravere a de lalphabet ab repreacutesente le langage a Il est

agrave noter que nous pouvons aussi utiliser le mot vide comme une constante repreacutesentant

lensemble vide

Concateacutenation

Lopeacuteration de concateacutenation est une opeacuteration sur les mots qui permet de creacuteer des

expressions reacuteguliegraveres plus longues agrave partir de deux expressions reacuteguliegraveres valides Le

reacutesultat de lexpression reacuteguliegravere A concateacuteneacutee agrave B est donc nimporte quel mot de A

concateacuteneacute agrave nimporte quel mot de B Par exemple ab est une expression reacuteguliegravere qui

repreacutesente un langage agrave un mot ab

Union

Lunion des expressions reacuteguliegraveres est une opeacuteration qui correspond agrave lunion ensemshy

bliste Lors de lunion de A et de B (deacutefini comme (AIB)) nous pouvons choisir nimshy

porte quel eacuteleacutement de A ou de B comme un mot valide Par exemple (alb)b repreacutesente

le langage contenant deux mots ab bb

Fermeture de Kleene

La fermeture de Kleene est une opeacuteration beaucoup plus inteacuteressante Celle-ci utilise

une expression reacuteguliegravere A Le reacutesultat de la fermeture noteacute A est la concateacutenation

48

dun nombre fini deacuteleacutements de A avec possibiliteacute de reacutepeacutetitions Par exemples pour

ab toute chaicircne de a finie possiblement de longueur zeacutero suivie dun b fait partie du

langage Lexpression reacuteguliegravere (alb) repreacutesente nimporte quelle chaicircne finie de a ou de

b

Les langages que nous pouvons geacuteneacuterer avec des expressions reacuteguliegraveres sont assez riches

bien quinsuffisants pour geacuteneacuterer un langage de programmation (Aho Sethi et Ullman

1986)

413 Automates

Avant de pouvoir expliquer agrave quoi servent les expressions reacuteguliegraveres nous devons discuter

des automates une structure dune importance cruciale en informatique

Automate fini

yn automate fini (Ullman Hopcroft et Motwani 1~79) est un quintuplet composeacute de

cinq eacuteleacutements

- Un ensemble fini deacutetats E

- Un alphabet fini A

- Un ou plusieurs eacutetats de deacutepart d (selon que lautomate est deacuteterministe ou non)

- Un ensemble deacutetats dit finaux F

- Une relation de transition T ccedil E x A x E Cela deacutefinit une maniegravere de passer dun

eacutetat agrave un autre lors de lapparition dun symbole speacutecifique

On repreacutesente en geacuteneacuteral un automate par un graphe avec des flegraveches nommeacutees Les

flegraveches repreacutesentent la relation de transition alors que les sommets repreacutesentent les

eacutetats dans E On repreacutesente un eacutetat initial par une flegraveche qui ne part pas dun eacutetat

Finalement on repreacutesente un eacutetat final par un cercle double Par exemple lautomate

suivant accepte lensemble des mots qui sont composeacutes dune seacuterie de a (possiblement

nulle) suivi dun b Donc les mots b ab et aab serait des mots valides par rapport agrave

49

cet automate

Figure 41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b

Lensemble T peut prendre plusieurs formes en fonction du deacuteterminisme de lautomate

comme nous allons maintenant le voir

Automate non-deacuteterministe

Un automate non-deacuteterministe peut posseacuteder plusieurs eacutetats de deacutepart De plus son

ensemble de transitions T est quelconque Il peut donc exister pour un eacutetat e et un

symbole a plusieurs eacutetats e tels que (e a e) E T

Un automate non-deacuteterministe peut ecirctre vu comme une forme de graphe dans lequel on

peut se promener en utilisant certaines transitions La suite des symboles des transitions

que nous utilisons forment un mot Lensemble des mots obtenus par une suite de transhy

sitions allant dun eacutetat initial agrave un eacutetat final constitue le langage de lautomate Dans

un automate non-deacuteterministe il peut neacuteanmoins exister pour le mecircme mot plusieurs

chemins diffeacuterents deacutebutant dans un eacutetat initial Il est important de noter quun mot

est accepteacute degraves quun de ces chemins se termine dans un eacutetat final

Automate deacuteterministe

Un automate non-deacuteterministe nous permet de creacuteer des langages mais le fait davoir

plus dun choix pour le mecircme symbole peut sembler inquieacutetant surtout lorsquil sagit

dinformatique Nous pouvons donc deacutefinir un automate deacuteterministe plus simple Celuishy

50

ci possegravede un seul eacutetat de deacutepart et son ensemble de transitions T assure que pour

chaque symbole il ny a quun seul eacutetat suivant possible Il ny a donc pour chaque mot

quun seul chemin possible agrave partir de leacutetat initial Plus formellement lautomate sera

deacuteterministe si pour tout e E E et a E A il y a un seul e E E tel que (e a e) ET

Le reacuteflexe naturel serait de croire quen enlevant le non-deacuteterminisme dun automate

celui-ci devient beaucoup moins puissant permettant de repreacutesenter beaucoup moins

de langages Or il nen est rien Il a eacuteteacute prouveacute (malheureusement en trop de pages

pour ce meacutemoire) que nimporte quel automate non-deacuteterministe peut ecirctre rameneacute agrave

un automate deacuteterministe quitte agrave voir le nombre deacutetats de lautomate augmenter

exponentiellement Nous pouvons donc toujours creacuteer un automate non-deacuteterministe et

laisser la tacircche agrave un ordinateur de creacuteer un automate deacuteterministe agrave partir de celui-ci

(Ullman Hopcroft et Motwani 1979)

Exeacutecution dun automate et contraintes temporelles

La meacutethode dexeacutecution dun automate deacuteterministe est assez simple Nous lui fournisshy

sons un mot dune certaine longueur disons n Nous deacutemarrons de leacutetat initial et chaque

lettre repreacutesente un choix agrave faire dans lautomate Comme lautomate est deacuteterministe

il ny a quune possibiliteacute agrave explorer Si nous ne pouvons plus avancer avant la fin du

mot celui-ci ne fait pas partie du langage de lautomate Si nous parvenons agrave avancer

jusquau bout et que nous ne sommes pas dans un eacutetat final il nen fait pas partie non

plus Par contre si leacutetat est final nous avons trouveacute un mot du langage Co me le mot

possegravede n lettres nous aurons au maximum n choix agrave faire rendant lalgorithme dapshy

partenance agrave un temps dexeacutecution lineacuteaire Un algorithme lineacuteaire est naturellement

extrecircmement inteacuteressant en informatique car nous voulons un programme qui sexeacutecute

dans un temps raisonnable

51

414 Lien entre langage reacutegulier et automate fini

Nous connaissons donc maintenant deux meacutethodes pour creacuteer un langage Les expresshy

sions reacuteguliegraveres ainsi que les automates Un automate est difficile agrave concevoir pour un

ecirctre humain mais extrecircmement rapide dutilisation par un ordinateur Une expression

reacuteguliegravere est complexe pour un ordinateur mais aiseacutee agrave concevoir par un ecirctre humain Il

nous faut donc voir si nous pouvons obtenir des proprieacuteteacutes communes agrave ces deux outils

Le lien

Il existe en effet un lien qui unit ces deux structures Celui-ci est extrecircmement fort

lensemble des langages quil est possible de geacuteneacuterer avec des expressions reacuteguliegraveres est

exactement le mecircme ensemble que ceux qui peuvent ecirctre geacuteneacutereacutes par un automate fini

deacuteterministe Cela implique que pour chaque expression reacuteguliegravere nous pouvons troushy

ver un automate qui repreacutesente le mecircme langage Cela est vrai aussi en sens inverse

Par contre il ne sagit pas dune bijection car plusieurs expressions reacuteguliegraveres peuvent

correspondre au mecircme automate (par exemple a et aamiddot) Il existe un algorithme permetshy

tant de transformer une expression reacuteguliegravere en automate mais celui-ci est complexe et

deacutepasse le cadre de ce meacutemoire Nous pouvons toutefois mentionner que cet algorithme

est relativement lent (sexeacutecute en O(2m ) ou m est la longueur de lexpression reacuteguliegravere)

mais permet par la suite de trouver si un mot fait partie dun langage en temps lineacuteaire

(McNaughton et Yamada 1960)

Importance dun tel lien

Ce lien est un eacuteleacutement crucial dans la capaciteacute dun ordinateur agrave travailler avec des lanshy

gages de programmation En effet cela permet aux creacuteateurs de langages de deacutecrire des

mots agrave partir dexpressions reacuteguliegraveres (quils comprennent) et de laisser un programme

creacuteer des automates qui peuvent reconnaicirctre ces symboles (un if ou un for mais aussi

des variables) dans des programmes Cela permet donc de creacuteer une partie importante

dun langage quon appelle lanalyse lexicale Cela permet agrave partir de lutilisation de

52

lautomate creacuteeacute par des expressions reacuteguliegraveres de transformer un texte en une suite de

symboles plus speacutecifiques Par exemple le texte

if a 1 then true else faIse

pourrait ecirctre traduit par la suite de symboles suivants

IF VAR EQ NUM THEN BD DL ELSE BDDL FININSTR

Cette eacutetape lanalyse lexicale est cruciale agrave la suite de lanalyse dun programme Les

automates nous sont toutefois utiles non seulement pour les mots cleacutes mais aussi pour

des eacuteleacutements plus complexes comme des variables Une variable est souvent identifieacutee

comme eacutetant une lettre suivie dune suite de caractegraveres quelconques (sauf exception tel

quun espace)

Malgreacute tout il existe certains eacuteleacutements quun automate ne peut reconnaicirctre Un exemple

classique est le parentheacutesage eacutequilibreacute (une suite de parenthegraveses telle que c~aque pashy

renthegravese ouvrante est associeacute agrave une parenthegravese fermante et agrave nimporte quel moment il

nexiste pas plus de fermantes que douvrantes) Il est en effet impossible aux automates

de faire le lien entre les deux types de parenthegraveses (Ullman Hopcroft et Motwani 1979)

Pour cela il nous faudra utiliser des structures plus complexes

42 Grammaires

Ces structures sont les grammaires Il est possible de les voir comme eacutetant une forme

beaucoup plus geacuteneacuterale des expressions reacuteguliegraveres Avec cette structure nous pourrons

nous assurer quun programme est bien formeacute cest-agrave-dire creacuteer un arbre repreacutesentant

la structure dun programme un peu comme la structure dune phrase

421 Deacutefinition dune grammaire formelle

Une grammaire est constitueacutee de quatre eacuteleacutements

53

- Un ensemble fini de terminaux Ceux-ci sont des symboles repreacutesentant les lettres

dun langage Par conseacutequent on peut aussi appeler les terminaux lalphabet dune

grammaire

- Un ensemble fini de non-terminaux Habituellement repreacutesenteacute par des majuscules

(par des symboles diffeacuterents des terminaux) pour des raisons de clarteacute ceux-ci repreacuteshy

sentent des eacutetats intermeacutediaires de la grammaire

- Un non-terminal de deacutepart parmi lensemble deacutecrit plus haut

- Un ensemble de regravegles de production Celles-ci vont varier selon la cateacutegorie de langage

choisie mais de maniegravere geacuteneacuterale une regravegle de production est une paire ordonneacutee

dont chaque eacuteleacutement est composeacute dune suite de terminaux et de non-terminaux (par

exemple aB -t aAa)

Le fait de repreacutesenter une regravegle de production avec une flegraveche permet den expliciter le

rocircle transformer une suite de caractegraveres en une autre Lutilisation dune grammaire

consiste donc agrave deacutemarrer avec le non-terminal de deacutepart puis dappliquer une suite de

regravegles de production pour modifier le non-termina Lorsquon obtient un mot formeacute

uniquement de terminaux il sagit dun mot du langage repreacutesenteacute par la grammaire

Par exemple

S -gt aA

A -gt b

repreacutesente un langage contenant le seul mot ab On applique doEn effet unc un proceacutedeacute

de deacuterivation (en appliquant chaque regravegle) Par exemple une deacuterivation possible du mot

ab dans ce contexte (la seule dailleurs) est la suite suivante

S (deacutepart)

S -gt aA (application de S -gt aA)

aA -gt ab (application de A -gt b)

54

422 Hieacuterarchie de Chomsky

La deacutefinition que nOlis avons donneacutee preacuteceacutedemment dun langage est beaucoup trop

geacuteneacuterale pour nous fournir des proprieacuteteacutes inteacuteressantes Afin de deacutegager des proprieacuteteacutes

inteacuteressantes nous deacutefinissons plusieurs cateacutegories Plusieurs noms sont utiliseacutes pour

chaque cateacutegorie mais nous nous limiterons agrave utiliser ceux deacutefinis par le linguiste Noam

Chomsky (Chomsky 1956) Chacune de ces cateacutegories sera deacutecrite par les proprieacuteteacutes de

sa grammaire Il est agrave noter que nous avons neacutegligeacute certaines cateacutegories de langages qui

ne sont pas lieacutees au domaine

Langage reacutegulier

Un langage reacutegulier est eacutequivalent aux expressions reacuteguliegraveres Les regravegles de production

de la grammaire doivent ecirctre de la forme

A -) Ba

A -) a

ou

A -) aB

A -) a

avec A et B des non-terminaux et a un termina Il est agrave noter que toutes les regravegles

dune grammaire doivent ecirctre soit du premier cas soit du deuxiegraveme cas On les appelle

reacutecursives agrave gauche ou agrave droite respectivement

Langage non-contextuel

Un langage non-contextuel est un peu plus complexe quun langage reacutegulier Les regravegles

de production de la grammaire doivent ecirctre de la forme

55

A -) B

avec A un non-terminal et B une suite de terminaux et de non-terminaux Le deacutetail

le plus important est de noter que les langages non-contextuels permettent de creacuteer un

systegraveme de parenthegraveses eacutequilibreacutees En effet voici une grammaire qui accepte seulement

un parentheacutesage eacutequilibreacute

P -) pp

P -) CP)

P -)

Il est eacutevident quune grammaire reacuteguliegravere ne peut geacuteneacuterer ce genre de langage Par contre

un parentheacutesage eacutequilibreacute est extrecircmement important dans le domaine de la compilashy

tion afin dexprimer clairement les ideacutees dun programmeur et plus speacutecifiquement

permettre deacutecrire des formules matheacutematiques complexes compreacutehensibles par lOlmiddotdishy

nateur

Langage contextuel

Les langages contextuels ne sont pas utiliseacutes en geacuteneacuteral en compilation car ils sont

beaucoup plus lents Les regravegles de production de la grammaire doivent ecirctre de la forme

ABC -) ADC

ougrave B est un non-terminal A et C sont des non-terminaux ou le mot vide et D est un

non-terminal (mais pas le mot vide) On voit clairement ici dougrave vient le nom de ce type

de langage B est transformeacute en fonction de ce qui est autour de lui (son contexte)

423 Utiliteacute dans les langages de programmation

La prochaine tacircche dans la creacuteation dun langage est danalyser la structure de notre

programme Pour effectuer cette tacircche nous pouvons utiliser une grammaire non-conshy

56

textuelle Agrave cette fin nous pouvons nous assurer que les eacutequations sont correctement

formeacutees que les instructions sont valides etc

Dans un autre ordre dideacutee la hieacuterarchie de Chomsky possegravede aussi des liens avec les

machines de Turing qui sont elles-mecircmes intimement lieacutees agrave la theacuteorie de la complexiteacute

(Davis Sigal et Weyuker 1994) Ce domaine est extrecircmement vaste et le lecteur pourra

trouver dans les reacutefeacuterences plusieurs excellents ouvrages pour sinitier agrave ce domaine (Dhu

et Ko 2000)

43 SableCC

Bien quil est tregraves inteacuteressant deacutetudier les algorithmes de compilation limpleacutementation

de chacun de ces algorithmes deacutepasse largement le cadre de ce meacutemoire Il nous faut

donc trouver une meacutethode afin de creacuteer notre langage de programmation Plusieurs

outils soffrent agrave nous mais notre choix sarrecirctera sur SableCC

431 Quest-ce que S~bleCC

SabieCC est ce quon appelle un compilateur de compilateurs (Gagnon 1998) Un comshy

pilateur de compilateurs est un programme qui permet agrave partir dune deacutefinition absshy

traite dun langage de programmation dobtenir un compilateur pour ce langage Plus

speacutecifiquement le programme reacutesultant nous permettra dobtenir larbre syntaxique

dun programme ce qui nous permettra de lanalyser reacutecursivement et de lexeacutecuter (ou

bien de le transformer dans un langage diffeacuterent selon le cas) Les formes abstraites que

requiert un compilateur de compilateurs sont justement les expressions reacuteguliegraveres (pour

deacutecouvrir les symboles) et les grammaires non-contextuelles (pour lanalyse syntaxique

des symboles obtenus preacuteceacutedemment)

432 Avantages de SableCC

Bien que SabieCC nest pas le compilateur de compilateurs le plus connu il possegravede

plusieurs aspects inteacuteressants Premiegraverement comparativement agrave ses compeacutetiteurs plus

57

acircgeacutes SabieCC est eacutecrit dans un paradigme orienteacute-objet Cela rend le compilateur beaushy

coup plus simple agrave utiliser De plus le logiciel geacutenegravere automatiquement un ensemble de

classes (dans un choix de plusieurs langages) qui permet de traiter aiseacutement et claishy

rement avec des concepts modernes les arbres syntaxiques reacutesultant de lanalyse du

programme

44 Langage reacuteflexif

Finalement une fois que nous avons obtenu un arbre syntaxique et que nous savons que

notre langage est bien formeacute il nous reste la reacuteflexiviteacute agrave prendre en compte En effet

nous ne voulons pas reacuteeacutecrire inutilement dans notre langage chaque fonction qui existe

deacutejagrave en Java Nous pourrons les utiliser avec un langage reacuteflexif Une autre possibiliteacute

dun langage reacuteflexif est de deacuteleacuteguer agrave SDDL la creacuteation de classes Cela permet agrave lutilishy

sateur de reacutefeacuterencer nimporte quelle classe Java sans avoir agrave changer le code de SDDL

lui-mecircme Cela serait impossible sans un langage reacuteflexif

441 Deacutefinition dun langage reacuteflexif

Un langage reacuteflexif (Sobel et Friedman 1996) est un langage qui est capable soit de

- Examiner son eacutetat cette proprieacuteteacute est appeleacutee introspection

- Modifier son eacutetat cette proprieacuteteacute est appeleacutee intercession

Lintrospection permet agrave un langage de connaicirctre entre autres les classes quil utilise

ainsi que les meacutethodes et les paramegravetres Lintercession beaucoup plus puissante pershy

mettrait par exemple cie rajouter modifier ou supprimer des classes etou meacutethodes

Pour nos besoins nous sommes naturellement inteacuteresseacutes par lintercession

442 Avantages

Lavantage le plus clair de lutilisation de la reacuteflexiviteacute est la reacuteutilisation du code En

effet toutes les fonctionnaliteacutes du langage infeacuterieur (Java dans ce cas-ci) peuvent ecirctre

58

automatiquement passeacutees au langage supeacuterieur Cela eacutevite davoir agrave reacuteeacutecrire du code

pour chaque nouvel eacuteleacutement agrave ajouter

Un autre avantage assez explicite est de permettre agrave des utilisateurs un peu plus aguerri

de lier du code des deux niveaux de langage ensemble En effet si un utilisateur creacutee

une structure de donneacutees en Java il peut toujours se servir exactement de la mecircme

classe dans le langage supeacuterieur sans avoir agrave faire la moindre modification au langage

supeacuterieur lui-mecircme Il est donc clair quun langage qui utilise la reacuteflexiviteacute peut devenir

tregraves puissant

443 Deacutesavantages

Certains deacutesavantages accompagnent aussi la reacuteflexiviteacute Un des plus importants est la

contrainte de seacutecuriteacute En effet si un utilisateur peut appeler nimporte quelle classe

Java agrave partir du langage supeacuterieur il peut tregraves aiseacutement appeler des fonctions qui cassent

le programme si un controcircle suffisamment important nest pas effectueacute par le logiciel Il

peut aussi sans causer d~s problegravem_es de seacutec~riteacute confondre un usager en provoquant

des effets de bord sur leacutetat du logiciel cest-agrave-dire modifier des proprieacuteteacutes du reste du

programme sans neacutecessairement que cela paraisse

Un autre deacutesavantage eacutevident est quun utilisateur qui souhaite utilicirc3er les fonctions du

langage infeacuterieur doit en quelque sorte connaicirctre celui-ci Cela implique donc lapprenshy

tissage dun deuxiegraveme langage ce qui en soit peut paraicirctre trop pour des utilisateurs

plus traditionnels

Lorsquon analyse froidement les avantages et les inconveacutenients on voit que les avanshy

tages sont beaucoup plus importants En effet le projet eacutetant limiteacute dans le temps et

dans le personnel il est en quelque sorte impossible de fournir des librairies de foncshy

tions suffisamment complegravetes pour les utilisateurs Se brancher sur les librairies Java

fournit automatiquement tout ce dont nous avons besoin et donne accegraves agrave une quantiteacute

innombrable de projets deacutejagrave creacuteeacutes dans ce langage

CHAPITRE V

MISE EN OEUVRE DE LA SOLUTION

Maintenant que nous avons des bases theacuteoriques solides ainsi quune hieacuterarchie bien

adapteacutee agrave nos besoins nous pouyons commencer agrave impleacutementer notre solution Cela

implique premiegraverement la creacuteation de notre hieacuterarchie objet en Java Deuxiegravemement

nous devons impleacutementer une grammaire afin de deacutecrire SDDL Finalement il faut

ajouter du code afin dimpleacutementer certaines proprieacuteteacutes voulues pour notre langage Il

est agrave noter que nous avons inclus en annexe un diagramme de notre hieacuterarchie ainsi que

la grammaire complegravete de SDDL

51 Eacuteleacutements de langage en SDDL

511 Impleacutementation de la hieacuterarchie

Limpleacutementation de la hieacuterarchie eacutetant seacutepareacutee du reste du langage il est normal de

commencer avec celle-ci eacutetant donneacute quelle repreacutesente le module le plus important de

notre projet Cela nous permet de le tester au fur et agrave mesure avant de commencer agrave

creacuteer un langage de plus haut niveau qui lutilise

Un des problegravemes les plus importants du deacuteveloppement de la hieacuterarchie fut de deacuteveshy

lopper correctement la deacutefinition et laccegraves agrave des points speacutecifiques de certains objets

Comme lideacutee eacutetait de permettre dobtenir une quantiteacute essentiellement illimiteacutee de

points diffeacuterents il fallait une meacutethode robuste et efficace

60

Notre meacutethode implique de fournir des informations par rapport au dessin englobant agrave

chaque sous-dessin Cela est requis car un objet preacutesent agrave plusieurs endroits diffeacuterents

auquel on demande un point speacutecifique se bute agrave une ambiguiumlteacute Mecircme en utilisant

seulement un Drawing qui est techniquement une instance unique dune forme il faut

faire attention En effet si on a un Drawing dun cercle qui est agrave linteacuterieur dune

ellipse par exemple nous pourrions deacutecider de placer cette ellipse agrave plusieurs endroits

Nous aurions donc le mecircme problegraveme dambiguiumlteacute du positionnement des points Afin

de remeacutedier agrave ce problegraveme nous avons fourni au Drawing sa position agrave linteacuterieur du

diagramme Lorsquil est copieacute nous navons quagrave changer linformation pour que le

positionnement soit correct

512 Grammaire

Le deacuteveloppement de la grammaire fut naturellement une section cruciale du deacutevelopshy

pement de SDDL Comme nous avions deacutejagrave deacuteveloppeacute des objectifs speacutecifiques pour la

forme du langage la creacuteation fut relativement directe Quelques eacuteleacutements importants

ont toutefois ducirc ecirctre ajouteacutes en cours de route En particulier des eacuteleacutements seacuteparateurs

ont eacuteteacute dune importance cruciale Il aurait donc pu ecirctre souhaitable de diminuer la

verbositeacute en enlevant des parenthegraveses ou des virgules mais cela cause (dans la plupart

des cas) des problegravemes au niveau de lambiguiumlteacute de la grammaire (tel que nous lavons

vu preacuteceacutedemment)

Nous avons aussi deacutecideacute de deacutecreacuteter quune expression geacuteneacuterale est une instruction Cela

peut sembler contre-intuitif car une expression (comme 2 + 2) ne semble pas ecirctre une

instruction La raison derriegravere ce changement est le dessin de chemin En effet nous

pouvons deacuteterminer un chemin (Path) comme nimporte quel autre objet Par contre

cela implique de lajouter par la suite seacutepareacutement agrave un canevas Cela semble contreshy

intuitif nous voyons souvent les liens entre les objets comme eacutetant des liens de niveau

supeacuterieur (bref faits dans le canevas principal) Pour lier a et b il semble plus logique

deacutecrire

61

a--b

que

lien = a--b

put lien in main

Afin de reacutegler ce problegraveme nous avons deacutecideacute de laisser les expressions ecirctre des insshy

tructions Cela fait que deacutefinir une ligne (comme a--b) devient automatiquement une

instruction valide Celle-ci sera traiteacutee comme un cas speacutecial afin decirctre placeacutee direcshy

tement au centre du canevas principal Cela implique aussi comme nous le verrons

plus tard de rajouter du code afin de sassurer que les expressions qui ne sont pas des

instructions soient refuseacutees par le programme

stm = exp exp sc 1 assign id assign exp sc 1 while while_kwd exp do_kwd (stms] stm end_kwd sc 1 if if_kwd exp then_kwd (stms] stm else_part end_kwd sc 1 for for_kwd id from~kwd (low_bound] exp to_kwd (up_bound] exp

do_kwd (stms] stm end_kwd sc 1 return return_kwd exp sc

Figure 51 Extrait de la grammaire de SDDL pour une instruction

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage

Plusieurs proprieacuteteacutes de SDDL ne venaient pas directement avec la grammaire Celles-ci

ont neacutecessiteacute un traitement bien particulier en fonction de la proprieacuteteacute rechercheacutee

Typage

La grammaire de SDDL indique clairement que le langage est agrave typage dynamique eacutetant

donneacute que les creacuteations de variables ne permettent pas de donner un type Le mecircme

62

pheacutenomegravene est preacutesent dans la deacutefinition des fonctions Par contre le fait de souhaiter

un typage dynamique implique lajout dune large section de code deacutedieacutee agrave la veacuterification

de type Chaque opeacuteration ne peut ecirctre appliqueacutee quagrave certains types deacuteleacutements et donc

avant deffectuer lopeacuteration il faut veacuterifier si le type est valide

Eacuteleacutements objets

Impleacutementer tous les principes dun langage orienteacute-objet est un travail de longue hashy

leine Par contre eacutetant donneacute que notre objectif eacutetait de simplifier le langage de desshy

cription final nous avons deacutecideacute de ne pas permettre la creacuteation de nouvelles classes

agrave linteacuterieur de SDDL Cela implique que nous pouvons releacuteguer la creacuteation de classes

uniquement au langage Java Cela a donc grandement faciliteacute la tacircche car nous navions

pas besoin dimpleacutementer la tregraves grande majoriteacute des concepts objets que nous laquo emshy

pruntons raquo agrave Java

Eacutelimination de la verbositeacute

Une bonne partie de leacutelimination de la verbositeacute vient de la conception mecircme du lanshy

gage En effet le fait de releacuteguer la deacutefinition des classes agrave Java ainsi que de creacuteer le

typage dynamique ont purement par choix eacutelimineacute une bonne partie de la verbositeacute

Quelques eacuteleacutements suppleacutementaires ont permis deacuteliminer un excegraves de verbositeacute On

note entre autres le fait de deacutefinir la description du diagramme sans le speacutecifier dans le

cadre dune fonction Un autre pheacutenomegravene important est davoir deacutecideacute de promouvoir

les points et certaines fonctions relieacutees agrave leacutetat de primitive naturelle du langage En

effet une addition entre un point a et b seffectue

c = a + b

au lieu de en Java

AbstractPoint c aadd(b)

63

Cela peut sembler comme un maigre gain mais lorsquappliqueacute agrave un calcul complexe

impliquant des points (par exemple le calcul dune combinaison lineacuteaire) les gains

combineacutes rendent le code extrecircmement clair

AbstractPoint c = amultiply(1030)add(bmultiply(2030))

c = (a 30 + 20 b 30)

Figure 52 Code Java et SDDL pour calculer une combinaison lineacuteaire

52 Reacutealisation en Java

Afin de reacutealiser SDDL il a bien sucircr fallu eacutecrire une grammaire mais beaucoup de code

autour sert agrave inteacutegrer la grammaire au restant des fonctionnaliteacutes de notre hieacuterarchie

Ce code fut complegravetement eacutecrit en Java et remplit plusieurs fonctions

521 Traverseacutee de larbre grammatical et exeacutecution

La grande majoriteacute du code Java suppleacutementaire eacutecrit a servi agrave permettre la traverseacutee

de larbre grammatical creacuteeacute par notre grammaire Cette traverseacutee permet en quelque

sorte lexeacutecution du code SDDL et est donc cruciale Pour la plupart il sagit dune trashy

verseacutee en profondeur relativement classique Quelques petits deacutetails retiennent toutefois

lattention

- Certains morceaux de code ne doivent pas ecirctre exeacutecuteacutes et ont donc un comportement

speacutecial Cest le cas des deacutefinitions de fonctions qui ne sont exeacutecuteacutees quagrave lappel On

meacutemorise donc en quelque sorte une partie de larbre grammatical et lors dun appel

on transfegravere le controcircle dexeacutecution agrave cette partie Eacutevidemment lors de la lecture de

la deacutefinition de la fonction il faut stocker quelques informations sur nos fonctions

dans une structure deacutefinie agrave cet effet (un Methodlnf0)

- Certaines opeacuterations ont plusieurs sens distincts qui ne peuvent ecirctre speacutecifieacutes dans la

grammaire La seacutemantique dune telle opeacuteration napparaicirct clairement quau moment

de la lecture de lopeacuteration (dans notre cas agrave lexeacutecut ion) Un exemple serait le

64

symbole daddition Bien que sa grammaire soit tregraves claire il peut sagir dune addition

de nombres mais aussi dune addition de points ou dune concateacutenation de chaicircnes

de caractegraveres Il est donc neacutecessaire agrave lexeacutecution de veacuterifier la classe de chaque objet

requis par lopeacuteration afin de trouver la bonne seacutemantique pour lopeacuteration si une

telle seacutemantique existe Si aucune nest trouveacutee on peut alors soulever une erreur

selon le meacutecanisme standard (par exemple additionner un point et une chaicircne de

caractegraveres)

- Certaines expressions grammaticalement correctes ne sont valides que sous certaines

conditions Par exemple nimporte quelle expression (exp) est accepteacutee comme eacutetant

une instruction (stm) grammaticalement valide Par exemple linstruction 2 + 2 va

ecirctre accepteacutee par la grammaire Par contre elle na pas de sens car elle naccomplit rien

du tout Il faut donc sassurer de veacuterifier dans la traverseacutee que lexeacutecution est leacutegale

Dans ce cas-ci il faut sassurer que lexpression de niveau supeacuterieur (une addition)

est valide pour ecirctre une instruction Dans un tel cas une erreur serait souleveacutee encore

selon le meacutecanisme standard

522 Deacutefinition dobjets quelconques

Une partie moins grande du code est consacreacutee agrave linteacutegration de la hieacuterarchie de SDDL

dans la deacutefinition du langage Comme nous souhaitions utiliser des classes quelconques

nous avons utiliseacute la reacuteflexiviteacute Java telle que nous le deacutecrivions plus tocirct Cela implique

de reacutecupeacuterer les noms des fonctions et des classes lors de leurs utilisations Toutes les

veacuterifications seffectuent agrave lexeacutecution Nous savons donc seulement si une classe A existe

bel et bien lorsque nous essayons de creacuteer un objet agrave partir de celle-ci De plus chaque

fonction appeleacutee sur un objet de classe A nest veacuterifieacutee que lors de son utilisation

Habituellement la solution aurait eacuteteacute de veacuterifier avant lexeacutecution lexistence de chaque

classe ainsi que les fonctions de chaque classe pour sassurer que lexeacutecution soit correcte

Dans notre cas la veacuterification agrave lexeacutecution est suffisante car les programmes sont tregraves

courts

De plus quelques contraintes ont ducirc ecirctre ajouteacutees afin de sassurer Clue seules les parties

65

Override public void caseADrawingTermCADrawingTerm node)

String className = nodegetClassName() getText()

try

thiscurrentExpressionClass ClassforName(sddlhierarchy + className)

thiscurrentExpressionValue = thiscurrentExpressionClassgetConstructor() newlnstance()

catch(NoSuchMethodException e)

throw new InterpreterException( cl ass Il + className + is ill-defined (no base constructor) nodegetClassName())

catch(Exception e)

throw new InterpreterException(unable to load + className +

Il class (maybe it does not exist) nodegetClassName())

Figure 53 Code reacuteflexif pour creacuteer une forme quelconque

requises de Java sont exposeacutees agrave lutilisateur final La restriction principale est de ne

creacuteer que des objets qui font partie du paquet sddl hierarchy Il est toutefois agrave

noter que cela nisole pas totalement le reste de Java car il est tout agrave fait possible de

creacuteer une classe qui permet dacceacuteder agrave Java complegravetement

523 Gestion des erreurs

La gestion des erreurs seffectue au travers des meacutecanismes deacutejagrave mis en place par Java

cest-agrave-dire les exceptions Une classe speacutecifique aux exceptions de linterpreacuteteur a eacuteteacute

creacuteeacutee qui permet de speacutecifier non seulement un message mais aussi un noeud bien

speacutecifique dans larbre grammatical afin didentifier lendroit ougrave lerreur a eacuteteacute deacutecouverte

66

Cela est extrecircmement utile afin de permettre agrave lutilisateur de corriger la majoriteacute de

ses erreurs

De plus une partie du code de gestion derreurs sert agrave repreacutesenter la pile dexeacutecution

En effet afin didentifier la source dun problegraveme il est important de pouvoir savoir

quelles fonctions sont impliqueacutees Nous pouvons donc identifier la ligne de chaque appel

au moment ougrave lerreur sest produite et ainsi identifier des problegravemes entre autres dans

le cas des fonctions reacutecursives

524 Structures de support

Dimportances mineures la plupart de ces structures servent agrave geacuterer lexeacutecution des

meacutethodes

- La classe Frame repreacutesente le cadre dexeacutecution dune fonction Cette classe permet

dobtenir des fonctions reacutecursives car on peut imbriquer un Frame dans un autre

- La classe Methodlnfo repreacutesente une fonction deacutefinie agrave linteacuterieur de SDDL Elle

permet de transfeacuterer lexeacutecution agrave la deacutefinition fournie par lutilisateur et regroupe

les informations geacuteneacuteralement utiles agrave la veacuterification seacutemantique (nom paramegravetres

etc)

- La classe PrimitiveMethodlnfo repreacutesente une fonction de Java accessible par la

reacuteflexiviteacute Elle fournit aussi quelques informations pour la veacuterification seacutemantique

- La classe MethodTable fournit une table pour geacuterer lensemble des fonctions afin

dacceacuteder directement agrave une fonction agrave partir de son nom

53 Accegraves agrave Postscript PDP et B-1EX

531 Postscript

Afin de reacutealiser correctement notre langage nous avions besoin dacceacuteder agrave diffeacuterentes

technologies Eacutetant donneacute que nous voulons terminer avec des dessins en format Postshy

script il devient important de pouvoir fournir aiseacutement du code dans ce format Il

67

sagit toutefois dun format relativement complexe et il devient donc long et complexe

de fournir une traduction valide pour chacun de nos diffeacuterents concepts

Le problegraveme principal de Postscript est quil possegravede un ensemble de primitives de tregraves

bas niveau En effet afin de dessiner une courbe la seule meacutethode possible est lutishy

lisation de courbes de Beacutezier avec des points de controcircle qui doivent ecirctre fournis agrave

lavance Comme nous lavons vu preacuteceacutedemment les courbes de Beacutezier sont tregraves prashy

tiques pour lordinateur mais peu pratique pour [utilisateur car la speacutecification de

points de controcircles qui ne sont pas interpoleacutes est peu intuitive De plus afin de faire

des courbes quelconques il faut les seacuteparer en plusieurs courbes de Beacutezier de tailles

infeacuterieures

Il existe des algorithmes qui permettent de prendre des courbes et de les seacuteparer en

sections adeacutequates Un de ces algorithmes est impleacutementeacute en Asymptote (Bowman

2007) Il est donc naturel afin deacuteviter davoir agrave reacuteimpleacutementer un algorithme aussi

complexe dutiliser Asymptote pour obtenir nos courbes de faccedilon systeacutematique

532 PDF

Le format PDF possegravede lavantage dinteacutegrer plusieurs fonctions multimeacutedias telles que

les liens les videacuteos les formulaires (Adobe Systems Incorporated 2006) etc Malgreacute

tout PDF outre les quelques ajouts nommeacutes ci-haut est essentiellement similaire agrave

Postscript Eacutevidemment les nombreuses possibiliteacutes fournies par le format PDF sont

deacutesirables (inteacutegrer des videacuteos agrave des notes de cours par exemple) Il existe toutefois

de nombreux convertisseurs qui peuvent prendre un fichier Postscript et le mettre au

format PDF Par contre cette conversion ne permet pas dajouter les fonctionnaliteacutes

PDF qui nous inteacuteressent Il devient donc crucial dobtenir une meacutethode pour fournir

des images directement au format PDF Encore lagrave le fait de passer par Asymptote

nous donne une solution rapide et eacuteleacutegante car le fait de fournir du PDF est inclus

dans le logiciel En geacuteneacuterant directement du Asymptote nous pourrions donc obtenir

automatiquement le format rechercheacute

68

533 ~1lE)C

Leacuteleacutement le plus crucial du langage que nous recherchions au deacutebut eacutetait de pouvoir

utiliser du texte tel que mis en forme par UTEX dans nos diagrammes Un tel besoin

implique plusieurs problegravemes

Premiegraverement un texte UTEX est conserveacute sous la forme dune chaicircne de caractegraveres

standard Par contre apregraves avoir eacuteteacute traiteacute le reacutesultat obtenu est une boicircte contenant

le texte mis en forme La taille de cette boicircte est deacutetermineacutee lors de la mise en page

et ne peut donc pas ecirctre deacutetermineacutee directement par notre programme Or si nous ne

connaissons pas la taille exacte de notre boicircte de texte il est impossible de positionner

un texte par une position autre que son coin supeacuterieur gauche Cela est un comportement

peu inteacuteressant eacutetant donneacute que dans de nombreux graphes on place le texte au centre

dun sommet (donc par exemple le centre de la boicircte sera placeacute au centre dune ellipse)

Afin de pallier agrave ce problegraveme il faudrait demander agrave UTEX de creacuteer les boicirctes une

premiegravere fois et de nous fournir les tailles des boicirctes Par la suite il faudrait geacuteneacuterer

une page UTEX de la bonne taille avec nos dessins puis dire agrave UIEX de geacuteneacuterer les

boicirctes de textes aux endroits que nous aurons calculeacute entre temps Bien que viable

cette meacutethode implique beaucoup de code et de cas diffeacuterents (laccegraves agrave IbIEX par un

programme externe va varier dun systegraveme dexploitation agrave lautre entre autres) Eacutetant

donneacute quAsymptote fournit deacutejagrave un accegraves agrave I5IEX agrave linteacuterieur du logiciel le travail

requis pour lutilisation de I5TEX est de beaucoup diminueacute

534 Geacuteneacuteration du code Asymptote

Afin davoir une solution valide il ne reste donc pl s quagrave nnecter not e so ution agrave

Asymptote Pour le faire nous devons premiegraverement geacuteneacuterer un fichier de code Asympshy

tote valide pour par la suite le faire valider en appelant le programme de maniegravere

externe Eacutetant donneacute que le projet a eacuteteacute eacutecrit speacutecifiquement pour fournir du code

Asymptote une solution simple a eacuteteacute utiliseacutee afin deacutecrire le code le canevas principal

69

public void draw(AbstractPoint location PrintWriter out)

AbstractPoint pl locationadd(new Point (radius 00)) AbstractPoint p2 locationadd(new Point(OO radius)) AbstractPoint p3 locationadd(new Pointe-radius 00)) AbstractPoint p4 locationadd(new Point(OO -radius))

outprintln(draw( + p1so1veO + + p2solveO + + p3solveO + + p4solveO + cycle))

Figure 54 Code pour geacuteneacuterer du code Asymptote pour un cercle

sera appeleacute agrave ecirctre dessineacute qui appellera reacutecursivement chacun de ses sous-canevas

La geacuteneacuteration du code Asymptote a eacuteteacute reacuteserveacutee dans une fonction draw speacutecifique agrave

chaque forme (Shape) qui eacutecrit dans un fichier ouvert fourni en paramegravetre Un exemple

dune telle meacutethode pour la classe Circle est illustreacute agrave la figure 54

Une telle meacutethode est simple mais suffisante pour nos besoins Bien sucircr agrave long terme

une solution plus robuste devrait simposer En effet comme leacutecriture du fichier est

faite directement lors de lexeacutecution les objets doivent ecirctre appeleacutes exactement dans

lordre dont ils sont deacutependants Par exemple un segment dessineacute entre deux cercles

doit ecirctre dessineacute apregraves les cercles car sinon les reacutefeacuterences seront absentes Dans ce cas-ci

le segment va toujours ecirctre deacutefinie par la suite Par contre si nous voulions rajouter

la possibiliteacute dutiliser des extensions dAsymptote cela impliquerait de les eacutecrire au

deacutebut du fichier Il est impossible de le faire avec cette solution

Une solution plus robuste serait dutiliser un outil lieacute agrave SabieCC qui est ObjectMacro

(Gagnon 2009) Cette extension nous permet de simplifier la geacuteneacuteration de code et

deacutecrire agrave des endroits arbitraires dans un fichier agrave laide de macros et de programmation

objet Cela nous permettrait aussi deacutetendre la geacuteneacuteration de code agrave plusieurs formats

diffeacuterents par exemple geacuteneacuterer directement du code PDF au lieu de geacuteneacuterer du code

70

Asymptote

61

CHAPITRE VI

REacuteALISATION DES DIAGRAMMES EN SDDL

Maintenant que nous avons notre programme complet et fonctionnel il faut veacuterifier son

efficaciteacute Nous proceacutedons en deux temps Premiegraverement il faut revenir agrave nos dessins

de base et les coder avec notre logiciel Par la suite il faut aussi les analyser en fonction

des diffeacuterents facteurs cruciaux que nous avons eacutenumeacutereacutes dans les chapitres preacuteceacutedents

Nous pourrons donc agrave partir de cela conclure si le logiciel savegravere efficace pour nos

besoins ou si certains problegravemes lempecircchent de fonctionner adeacutequatement

Naturellement nous avons pris le temps dappliquer cette analyse agrave chacun des dessins

dans notre base de diagrammes du domaine Par manque despace nous nanalyserons

dans ce chapitre que trois dessins Une attention particuliegravere a eacuteteacute porteacutee au choix de

ces dessins afin de repreacutesenter un eacuteventail assez large des capaciteacutes du logiciel et des

diffeacuterents eacuteleacutements cruciaux agrave obtenir dans la description dun diagramme Tous les

diagrammes sont disponibles en annexe avec code sans analyse deacutetailleacutee toutefois

Analyse du code des diagrammes existants

Pour faire notre analyse nous devons premiegraverement obtenir chaque dessin Dans ce cas

nous utiliserons un diagramme tireacute du domaine de la compilation Cela nous fournit un

graphe relativement standard avec un niveau de complexiteacute inteacuteressant sans toutefois

ecirctre trop complexe Par la suite nOlis analyserons un diagramme repreacutesentant une strucshy

ture de tableau Cela montre la capaciteacute du logiciel de travailler avec des structures de

72

donneacutees geacuteneacuterales Finalement nous effectuerons lanalyse dun diagramme de Venn qui

nest a priori pas supporteacute par le logiciel afin de voir la complexiteacute dun diagramme

totalement geacuteneacuteral et qui sort des conventions preacute-eacutetablies par le logiciel

611 Rappel des objectifs cruciaux agrave observer

Naturellement afin de faire une analyse rationnelle de notre solution il faut se remeacuteshy

morer les diffeacuterents objectifs que nous nous eacutetions fixeacutes Les plus importants eacutetaient les

suivants

- Inteacutegration avec Jb1EX Eacutetant donneacute le design de notre solution ce point est naturelshy

lement reacutealiseacute dans tous les diagrammes

- Description de structures Il nous faut pouvoir deacutecrire une structure de maniegravere aiseacutee

Le fait decirctre aiseacute est naturellement subjectif mais nous pouvons ramener le tout au

fait quil soit plus simple de deacutecrire dans notre logiciel Wle structure que dutiliser les

primitives de base du langage Par exemple il est plus aiseacute de deacutecrire une structure

en parlant de boicirctes et de liens quen parlant de lignes et de courbes

- Hieacuterarchie solide et extensible Nous ne testerons pas lextensibiliteacute de la solution car

elle a deacutejagrave eacuteteacute deacutemontreacutee Toutefois les diffeacuterents codes nous permettront danalyser

agrave quel point nous utilisons la hieacuterarchie que nous avons construite et agrave quel point elle

est reacuteellement pratique

Nous avions aussi dautres objectifs de moindre importance

- Gestion des erreurs Il nest pas possible avec du code compleacuteteacute de tester la gestion des

erreurs Lauteur peut toutefois garantir que sans la gestion des erreurs une grande

quantiteacute de temps aurait eacuteteacute perdu dans la reacutedaction du code des diagrammes et ce

malgreacute la connaissance profonde du langage sous-jacent

- Langage fluide et clair Cela peut ecirctre testeacute par le lecteur en regardant le code Si

une analyse rapide lui permet de comprendre le sens du code alors celui-ci est clair

Naturellement lauteur ne peut effectuer cette analyse par lui-mecircme Bien que nous

ne puissions en faire une analyse scientifique en inspectant le code reacutesultant nous

73

sommes confiants que la syntaxe que nous avons choisie est claire et permet dexprimer

clairement les concepts sous-jacents au langage

- Qualiteacute de la documentation et courbe dapprentissage Il sagit ici dun autre eacuteleacutement

que nous pouvons difficilement aborder par nous-mecircmes Cela ne sera pas pris en

compte dans notre analyse

Selon ces diffeacuterents facteurs nous voyons que nous devrons surtout nous concentrer sur

la structure geacuteneacuterale du code ainsi que sur sa complexiteacute Le code doit ecirctre facile agrave

lire tout en permettant de compacter un maximum dinformation dans un minimum

despace

612 Diagramme de compilation

Notre premier dessin est tireacute dun livre de compilation Il sagit dun automate assez

standard et repreacutesente donc un bon diagramme moyen afin de voir les capaciteacutes de

notre logiciel

Figure 61 Diagramme dautomate de compilation

Quelques points importants sont agrave noter dans ce dessin Premiegraverement on note la

creacuteation dune structure sous-jacente (composeacutee dune ellipse et deux cercles) Par la

74

circlel Circle with [radius = 100] circle2 Circ le with [radius = 120] ellipse Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (1000 500) in main d3 put form at (1000 -500) in main put Text with [text $N(p_l)$] at (1000 1000) in main put Text with [text $N(p_2)$] at (1000 500) in main put Text with [text dotsJ at (100000) in main put Text with [text I$N(p_n)$J at (1000 -500) in main

put Text with [text = $s_O$J at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt(coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt(coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt(coord of anglePoint(1800) in maind3circle)

Figure 62 Code pour le diagramme dautomate

suite cette forme est appliqueacutee agrave plusieurs reprises dans le dessin Cela deacutemontre que

dans ce cas-ci il est possible de creacuteer et dutiliser des structures dun certain degreacute de

complexiteacute

On note aussi lutilisation des variables pour reacutecupeacuterer les dessins afin de pouvoir les

reacutefeacuterencer plus tard Cette eacutetape est aussi simple que lassignation agrave une variable Par

la suite on peut noter les flegraveches qui sont traceacutees agrave partir de points deacutefinis agrave partir de

certains cercles La structure mecircme est extrecircmement explicite dans ce cas et rend la

compreacutehension du dessin tregraves simple On reacutecupegravere aussi finalement les points formeacutes agrave

un certain angle dun cercle

75

La complexiteacute du diagramme est beaucoup plus simple quelle ne le serait avec des

primitives de base En effet les seuls dessins explicites que nous devons effectuer par

points sont les flegraveches De plus ces flegraveches sont relativement simples puisque nous navons

rien agrave speacutecifier pour le bout de flegraveche seulement les extreacutemiteacutes Pour le reste les formes

sont soient deacutefinies agrave partir de notre hieacuterarchie (comme les cercles ou les ellipses) ou

bien par un collage de formes plus simples (comme pour la forme form) Les points sont

obtenus par des accegraves structureacutes et fournissent donc des valeurs exactes rendant ces

opeacuterations extrecircmement rapides agrave eacutecrire pour lusager

On note toutefois quil existe certains eacuteleacutements dans le code qui auraient pu ecirctre simshy

plifieacutes afin de rendre le code encore plus compact En effet nous remarquons la preacutesence

de beaucoup de valeurs explicites alors quil aurait eacuteteacute possible de les remplacer par des

variables afin de rendre le tout plus clair

Un eacuteleacutement qui aurait pu amener une touche de simplification aurait eacuteteacute dutiliser des

listes ou des boucles afin dinseacuterer plus aiseacutement les objets Par exemple la structure

complexe aurait pu ecirctre ajouteacutee plusieurs fois par une boucle for avec des positions

calculeacutees en fonction de lindex Nous sommes toutefois davis que malgreacute lameacutelioration

possible que cela fournit au code il est peu probable que les utilisateurs finaux prennent

le temps de faire ce genre de modification et utiliseront fort probablement plus des

positions relatives avec une seacuterie dappels sauf si le nombre dobjets agrave positionner

devenait grand (par exemple une dizaine dobjets)

En geacuteneacuteral nous pouvons toutefois consideacuterer que ce diagramme est simplifieacute de beaushy

coup par lutilisation de notre solution La grande part du code est explicite et la strucshy

ture est tregraves simple agrave observer en regardant uniquement le code Mecircme si tout nest pas

parfait il y a clairement avantage agrave utiliser le logiciel pour coder cet automate

613 Diagramme de tableau

Notre second dessin est tireacute dun livre sur les structures de donneacutees Il repreacutesente

leacutevolution dune structure de donneacutee simple (un tableau) agrave travers certaines modifishy

76

cations

a ab 1 0 2 8 (lime

1 -10

3 7

iuml

Figure 63 Diagramme de tableau

Un des points les plus inteacuteressants de ce dessin est lutilisation dune fonction Elle place

une forme dans un canevas agrave plusieurs endroits speacutecifiques en fonction dune position de

deacutepart et dun vecteur de translation Cela nous permet de placer une forme identique

(un carreacute) plusieurs fois de suite ce qui nous donne limpression quil sagit en reacutealiteacute

dun tableau

Un autre point qui est tregraves important dans ce dessin est que les nombreux carreacutes sont

en fait tous des instances du mecircme deacutefini au deacutebut Cela permet de modifier lensemble

des carreacutes aiseacutement en ne modifiant que les proprieacuteteacutes de celui de base Pour le reste du

dessin il sagit surtout dun ensemble de flegraveches et de textes positionneacutes agrave des endroits

speacutecifiques

En analysant le code on voit une ameacutelioration claire provoqueacutee par le fait dutilishy

ser une fonction pour placer les carreacutes Cela nous permet de simplifier de beaucoup

les appels et les reacutepeacutetitions Nous pouvons toutefois noter que quelques ameacuteliorations

suppleacutementaires pourraient ecirctre apporteacutees En effet une classe aurait pu ecirctre eacutecrite en

Java pour repreacutesenter un tableau agrave lhorizontale ou agrave la verticale Cela aurait pu simshy

plifier significativement le code du dessin en combinant dans la structure le texte et

les carreacutes utiliseacutes pour repreacutesenter le tableau lui-mecircme De plus les flegraveches auraient pu

ecirctre deacutetermineacutees agrave partir de points obtenus du tableau lui-mecircme (par exemple le coin

supeacuterieur droit ou supeacuterieur gauche) auxquels nous aurions ajouteacute un vecentierteur de

deacuteplacement

77

fun dropMany(f n s v c) for i from 1 to n do

put f at (s + (i - 1) v) in c end

square = Square with [length = 200] changeVec = (00 -200) dropMany (square 4 (00 00) changeVec main)

dropMany(square 3 (500 00) changeVec main) dropMany(square 1 (1000 00) changeVec main)

dropMany (square 1 (1500 00) changeVec main) put Text with [text=O] at (00 00) in main

put Text with [text=l] at (00 -200) in main put Text with [text=3] at (00 -400) in main

put Text with [text=7] at (00 -600) in main put Text with [text=bf a] at (500200) in main put Text with [text=2] at (500 00) in main

put Text with [text=4] at (500 -200) in main put Text with [text=7] at (500 -400) in main

put Text with [text=7] at 0000 00) in main put Text with [text=bf $a-b-+$] at 0500 200) in main

put Text with [text=8] at 0500 00) in main put Text with [text=none] at (2000 00) in main

020 100)-gt(380 100) (620 100)-gt(880 100)

(1120 100)-gt0380100) 0620 100)-gt0880100)

Figure 64 Code pour le diagramme de tableau

Avec ces changements le code aurait pu ecirctre beaucoup plus compact Bien que cette

option soit reacutealisable nous ne lavons pas impleacutementeacutee car il eacutetait important de limiter

ce quun usager peut creacuteer sans lutilisation de Java Cela est ducirc au fait que notre objectif

est que seulles utilisateurs experts se servent de Java afin dameacuteliorer le logiciel Le code

est tout de mecircme significativement meilleur que de placer tout agrave la main ce qui nous

permet de conclure agrave lefficaciteacute de notre logiciel dans le cas dune structure geacuteneacuterale

78

614 Diagramme de Venn

Notre dernier dessin est une structure qui ressemble beaucoup plus agrave un dessin geacuteneacuteral

cest-agrave-dire un diagramme de Venn La forme dun tel diagramme fait quil est extrecircmeshy

ment complexe deacutecrire une classe qui permet de dessiner automatiquement ce type de

structure et quil vaut mieux creacuteer les formes une par une comme on le ferait agrave la main

Cela nous permettra danalyser si les choses simples agrave dessiner agrave la main demeurent

facile agrave reacutealiser avec notre logiciel

A

Figure 65 Diagramme de Venn

Ce dessin ne possegravede pas beaucoup de grands points dinteacuterecirct En effet la structure ne

peut pas vraiment ecirctre geacuteneacutereacutee automatiquement par un algorithme alors elle est entreacutee

manuellement On remarque tout de mecircme lutilisation de plusieurs sous-canevas afin

de simplifier le placement des objets qui sont agrave linteacuterieur dautres

Naturellement eacutetant donneacute que la structure doit ecirctre deacutecrite manuellement le code

nest pas plus court que lutilisation de primitives de base Par contre cela est comshy

penseacute par un niveau de clarteacute supeacuterieur eacutetant donneacute lutilisation des canevas afin de

regrouper les eacuteleacutements dans des ensembles respectifs Cfla permet de positionner tous

les eacuteleacutements en valeurs relatives au lieu dabsolues ce qui simplifie de beaucoup le travail

de positionnement

De plus le fait de pouvoir stocker les eacuteleacutements dans des variables nous permet de les

identifier par diffeacuterents noms significatifs ce que des primitives de base comme celles

79

circle = Circle with [radius = 100] bigcircle = Circ le with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvas1 put circle at 050 150) in canvas1 put Text with [text = H] at 050 150) in canvas1 put circle at (-150 150) in canvas1 put Text with [text J] at (-150 150) in canvas1 put Text with [text = B] at (00 -150) in canvas1

put bigcircle in canvas2 put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = F] at 050 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = E] ac (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvas1 at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = A] at (00 -300) in main put bigellipse in main

Figure 66 Code du diagramme de Venn

de PDF ne nous permet pas de faiTe Nous pouvons donc en conclure que mecircme pour

les structures difficiles agrave repreacutesenter notre logiciel fournit tout de mecircme un nombre

significatif davantages

Preacutesentation du produit final

Une fois que nous avons pu confirmer que notre logiciel eacutetait efficace il ne restait plus

quagrave le faire connaicirctre Nous preacutesentons donc ici un reacutesumeacute des efforts qui ont eacuteteacute

effectueacutes afin damener le logiciel agrave la connaissance de la communauteacute gIEX

62

80

621 Statistiques et documentation

En premier lieu avant de pouvoir preacutesenter notre solution il nous fallait la documenter

correctement En effet leffort de deacuteveloppement nous aura permis de deacutevelopper un

produit de tregraves grande taille La taille totale du travail se limite agrave environ 10 megs mais

cela implique plus de 6300 lignes de code deacuteveloppeacutees speacutecifiquement pour le projet

(cela incluant les commentaires mais excluant tout le code geacuteneacutereacute par SableCC qui est

tregraves exhaustif) Avec une taille aussi significative il est tout simplement impensable de

sattendre agrave ce quun utilisateur analyse le code afin de trouver ce qui va reacutepondre agrave ses

besoins

Pour cela nous avons pris le temps de reacutediger une documentation interne Elle consiste agrave

documenter chaque classe de notre hieacuterarchie ainsi que chaque fonction disponibles Cela

fournit des renseignements complets pour quelquun qui cherche un eacuteleacutement speacutecifique

du langage

622 Preacutesentation

Par la suite nous avons reacutedigeacute une preacutesentation pour la confeacuterence TUG 2010 que nous

avons preacutesenteacutee le 28 juin 2010 agrave San Francisco devant des membres tregraves influents de

la communauteacute JbTEX dont Donald Knuth le creacuteateur original de TEX La confeacuterence

nous a permis de nous mettre au pouls des besoins de la communauteacute et de linteacuterecirct

quils portent agrave un tel projet La reacuteponse se voulait enthousiaste particuliegraverement de

la part du preacutesentateur dAsymptote John Bowman La confeacuterence est disponible sur

le site de River Valley (Bourgeois 2010) (malheureusement sans videacuteo eacutetant donneacute un

problegraveme dopeacutemt ur)

Bien quil sagisse dun eacuteleacutement tregraves important dans la preacutesentation dun projet une

confeacuterence ne rejoint pas beaucoup de monde Pour combler ce besoin nous avons aussi

reacutedigeacute un article pour la revue TUGBoat (Bourgeois et Villemaire 2010a) qui est la

revue principale de la communauteacute JbTEX Nous avons inclus larticle en annexe Cela

81

nous a permis de rejoindre un public beaucoup plus grand quune simple preacutesentation

devant public

623 Site web

Finalement afin de faciliter la distribution de notre logiciel nous avons deacuteveloppeacute un site

web (Bourgeois et Villemaire 2uuml1uumlb) pour accompagner la preacutesentation et permettre le

teacuteleacutechargement Le site contient aussi toute notre documentation ainsi que les contenus

des preacutesentations et articles que nous avons mentionneacutes plus haut Nous avons aussi pris

le temps de fournir quelques exemples suppleacutementaires afin de montrer lattrait direct

de SDDL

63 Conclusion de notre analyse

Nous concluons que notre solution est efficace et quelle respecte agrave diffeacuterents niveaux

les critegraveres que nous nous eacutetions fixeacutes au deacutepart Il sagit dune hieacuterarchie dobjets facile

et extensible accompagneacutee dune syntaxe claire et fluide Avec lajout de la gestion des

erreurs et sa capaciteacute agrave deacutecrire plusieurs formes de structures notre logiciel permet de

simplifier la repreacutesentation des diagrammes classiques du domaine Nous en venons donc

agrave la conclusion que notre solution respecte les diffeacuterents critegraveres et nous pouvons donc

consideacuterer notre solution comme eacutetant valide

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CONCLUSIOK

La creacuteation de diagrammes structureacutes comme nous avons pu le constater tout au long

de ce meacutemoire est un sujet tregraves complexe Bien quil puisse de prime abord necirctre vu

que comme la capaciteacute de faire des petits dessins simples nous remarquons rapidement

que les deacutecrire tels que nous les voyons est beaucoup plus difficile quil y parait

Entre autres nous avons pu constater que les diagrammes sont penseacutes de maniegravere

extrecircmement abstraites En effet dans un arbre nous ne voyons pas une seacuterie de somshy

mets relieacutes par des points mais bel et bien un arbre seulement Cette capaciteacute agrave abstraire

la forme du contenu est extrecircmement pratique pour un ecirctre humain mais pas tregraves utile

pour un ordinateur Il est extrecircmement difficile dessayer de saffranchir du besoin de

speacutecifier la forme lorsquon veut creacuteer un diagramme

Il en est de mecircme avec IbTEX duquel nous nous sommes inspireacute Bien que le logiciel

puisse faire la forme de maniegravere adeacutequate dans plusieurs cas ces derniers savegraverent tregraves

speacutecifiques et plus souvent quautrement la possibiliteacute dobtenir un niveau accru de

controcircle sur la forme est souhaitable Dautre part la question du positionnement dun

texte scientifique dans une page a eacuteteacute abondamment eacutetudieacute (entre autre par la creacuteation

de TEX) alors que le bon positionnement dun diagramme la eacuteteacute beaucoup moins Il

est donc probleacutematique de se deacutebarrasser de cet eacuteleacutement de forme dans nimporte quel

logiciel de creacuteation de diagrammes

Cela nous amegravene donc agrave la question naturelle de savoir si notre logiciel savegravere une solushy

tion valide agrave notre probleacutematique initiale En effet bien que notre analyse deacutemontre que

la creacuteation de dessins devient plus simple nous ne pouvons affirmer que nous eacutecrivons

ce que nous pensons du diagramme

- -

84

Or comme la question est de veacuterifier la validiteacute de notre solution nous reacutepondrons par

laffirmative Mecircme si elle nest pas parfaite un degreacute de complexiteacute se trouve eacutelimineacute

malgreacute tout Il est tout de mecircme possible pour un utilisateur de penser en des termes plus

abstraits mecircme sil ne sagit pas du niveau dabstraction optimal De plus eacutetant donneacute

que nous avons creacuteeacute notre solution pour ecirctre extensible il est possible daugmenter le

niveau dabstraction avec la contribution de la communauteacute Bien que la solution ne soit

pas parfaite et aurait pu jouir dameacuteliorations subseacutequentes lobjectif principal eacutetait de

deacutevelopper un langage qui simplifiait la description de diagrammes structureacutes et cela

fut atteint

Naturellement eacutetant donneacute les limites de temps et de complexiteacute plusieurs pistes de

deacuteveloppements suppleacutementaires nont pu ecirctre utiliseacutees En effet nous nous sommes

limiteacutes agrave la description dune image statique Il est toutefois tregraves utile de pouvoir creacuteer

des images dynamiques La possibiliteacute de creacuteer des seacutequences de mouvements agrave linteacuterieur

dun diagramme aurait pu rendre notre outil plus inteacuteressant De plus lUl outil de

geacuteneacuteration automatique de graphes ou darbres mecircme imparfait pourrait fournir des

choix suppleacutementaires agrave un utilisateur qui souhaite obtenir un reacutesultat rapidement sans

toutefois rechercher un reacutesultat parfait

Il est toutefois bon de noter que bien quil soit long et complexe deffectuer de tels

ajouts notre logiciel a eacuteteacute penseacute en fonction de pouvoir ecirctre eacutetendu par lutilisateur Il

est donc tout agrave fait possible de pouvoir eacuteventuellement fournir de telles fonctionnaliteacutes

dans une version future du programme Dici lagrave celui-ci suffira amplement agrave la creacuteation

de diagrammes simples

APPENDICE A

PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

Nous incluons ici larticle complet que nous avons reacutedigeacute agrave propos de notre logiciel

afin den faire la promotion aupregraves de la communauteacute TEX et JbTEX Cet article qui fut

preacutesenteacute dans Tugboat la revue du TEX Users Group tel que mentionneacute preacuteceacutedemment

compleacutemente la preacutesentation qui fut effectueacutee lors de la confeacuterence du mecircme groupe

agrave San Francisco Larticle est essentiellement une introduction pragmatique pour un

utilisateur final et fournit donc plusieurs exemples inteacuteressants dutilisation tout en

deacutecrivant briegravevement les diffeacuterents concepts importants qui ont meneacutes le deacuteveloppement

de SDDL Il sagit de la version finale tel que Jarticle apparait dans le numeacutero de Tugboat

206

Drawing structured diagrams with SDDL

Mathieu Bourgeois and Roger Villemaire

Abstract

We present SOOL a Structured Diagram Description Language aimed at producing graphical representashytions for discrete mathematics and computer science SDDL allows combining graphical objects (circles lines arrows ) and lbTEX boxes to produce diashygrams representing discrete structures such as graphs trees etc with an easy-to-use domain specific lanshyguage

1 What is SDDL

SDDL Structured Diagram Description Language is a high-level domain specific language tailored for diagrams that have an inherent structure Examples of these might be trees graphs and automata Any diagram that is naturally structured can be described in SDOL However it was designed especially for data structures appearing in computer science and discrete mathematics

The main objective of this language is to realize drawings in a natural and structured way Mainly one describes a drawing in SOOL in a way that is simishylar to drawing on a blackboard For example specific shapes (like circles ellipses texts boxes) are drawn at positions that can be either absolute or relative to specific points on already placed shapes Since we aim at mathematical drawings text is handled through lbTEX

Since exhibiting the structure of a diagram is esshysential to our purpose SOOL uses an object-oriented hierarchy completely written in Java under our high-levellanguage Having shapes as objects makes structuring of diagrams easier and more intuitive since most shapes are explicitly represented by a class Furthermore extension by the end user is quite feasible since Java is a well-known language

At the lower level SDDL uses another graphishycal description language for lbTEX namely Asympshytote [1] Our tool produces Asymptote code which is finally converted to an encapsulated PostScript (eps) vector file

2 Canvas and shapes

A diagram in SDDL is defined by a main Canvas It is just like a standard painting canvas in the sense that we can place (or paint) different things on it as much as we like The things we can place inside a Canvas are Shapes Thus for creating a Hello world diagram we would use the following

put Text with [text = Hello worldJ in main

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

resulting in

Hello world

In this example Text is a Shape and it posshysesses a property text which is the JbTEX string used to render the text Each Shape defines a cershytain number of such properties

SDDL permits the definition of variables It is a dynamically typed language so variables dont have to be declared before being used Variables make it possible to reuse the same Shape at multiple locations For example

a = Circle with [radius = 100] put a at (-75 00) in main put a at (75 00) in main

m In this example we specify the location where we want our Shape to be If a location is not specified with the at clause the Shape will be placed at the point of origin of the current Canvas which is its center

One important thing to note is that once a Shape has been put in a Canvas it is immutable It cannot be modified or removed A Shape can be modified alter it has been drawn on a Canvas but this will have an effect only on later use of this object and will not modify the actual Canvas in any way a Shape always appears in a Canvas as it was at the moment it was added

When a Shape is created every property specishyfied by the user is set in the given order It is not necessary to specify ail properties at once nor to set ail of them Most of the properties have appropriate default values However sorne properties if not set will yield strange results For example a circle with no radius property set will have a defaul radius of O Usually property order is irrelevant For instance giving for an ellipse the radius along the x-axis or the y-axis first will yield exactly the saille result

a = Ellipse a = a with [xradius 200] a = a with [yradius 100] put a in main

o 3 Structuring multiple canvases

Every diagram consists of a main Canvas However we can define other Canvas objects if we wish An additional Canvas can be introduced using a typical variable assignment However when a put command is used SODL checks to see if the canvas variable is

4

207 TUGboat Volume 31 (2010) No 2

already defined If it isnt it automatically creates an empty Canvas for use

One of the main reasons to use other Canvases is to create an explicit structure in our diagram Since a Canvas is a Shape once a sub-Canvas has been created it can be placed inside the main Canvas or any other one for that matter This will ensure that everything that is defined inside our sub-Canvas will be placed at the proper position in the final diagram However any Canvas that has been defined but is not linked directly or indirectly with the main Canvas will not be drawn in the final diagram

As an example lets say we want to make a diagram that consists of two identical eyes Instead of defining two identical objects we will create one in a Canvas named form and put it at different positions inside our main Canvas Our eye consists of a circle and an ellipse both with the same center Ali we need to do for this is place them at the default position of the Canvas Finally we can take this subshyCanvas and place it at the two positions required a ~ Circle with [radius~100]

b ~ Ellipse with [xradius~200 yradius~100]

put a in form put b in form put form at (-200 00) in main put form at (200 00) in main

Paths

SDDL offers support for the description of paths The way in which they are described is similar in syntax with MetaPost and Asymptote though with sorne variations A Path shape is described by linking points together with specific linking symbols To draw a line between two points the line symbol - shycan be used To link sorne points using a curve use the curved line symbol - which will use Asymptotes positioning algorithms to create a nice-looking curve which passes through those points For the moment user control over the curve is limited to beginning and ending tangents but could be expanded

pl ~ a--b--c p2 ~ a-b-c

One of the other things you may want to do with a Path is to create an Arrow out of it SDDL defines symbols for forward backward and bidirectional arshyrows for both linear and curved lines Right now however support is restricted to forward arrows

pl ~ alt-b--c-gtd p2 alt-b-c-gtd p3 alt-gtb p4 aCgtb

Once a Path is defined it can be used as any other Shape However one of the main things that you want ta do is ta put your Path somewhere For this you can write something Iike this p ~ (00 00) -- (100 100) put p in main

This is the standard way to add Shapes ta a Canvas However since Paths are usually used to link different Shapes together in the main Canvas special handling is done in SDDL Namely a Path that is not explicitly assigned to a variable will be automatically placed in the main Canvas Therefore the Path will be directly placed in main without any explicit put expression Thus linking has its own special syntax which is more natural and convenient As an example this program (00 00) -- (100 100)

yields exactly the same result as the one just above Furthermore points can be added and multiplied by a scalar (as vectors) Using a dot to locate the origin of the drawing we can use the SDDL syntax ta create this example a ~ (100 100) a--20a-gt(300 00) a-(-10)a-(300 00)

ocirc Finally as we will now see Shapes also usually

define specifie points

5 Drawing and linking shapes together

Ta draw a diagram usually sorne shapes with a specific structure are first laid down Once that is done those objects are linked together with lines curves and arrows However these links must be made between specific positions usually derived from one or more specifie Shapes For example we may want to link the northwestern point of a rectangle with the point on a circle at an angle of 45 degrees These points could obviously be computed in advance However this becomes quite problematic when points are at peculiar angles or more complex relationships between points and Shapes are needed Worst of ail if the position or any other property of a Shape is changed ail computations will have to be redone

To ease object linking SDDL provides so-called reference points A reference point is a point that has no static value unlike points defined by a pair of two real numbers Instead a reference point is defined by its relationship to a specifie Shape appearing at a particular location As a matter of fact ail reference

Drawing structured diagrams with SDDL

208

points are defined along with the Shape because they are a natural part of it This ensures that we always have nice-looking lines at exactly the positions we want them to be

However a reference points exact position in a Canvas will depend on the Shapes position Worse since the same Shape can appears at multiple locashytions in the same Canvas we have to know which occurrence we are talking about

Therefore SDDL introcluces a feature called a Drawing A Drawing is an object that represents a Shape at a particular position Le a specifie occurshyrence of a Shape in a Canvas Whenever a Shape is put inside a Canvas a Drawing is returned and can be assigned to a variable This gives a way to uniquely identify every occurrence of a Shape apshypearing in a Canvas If the same Shape is placed twice two different Drawings will be returned each referring to a different occurrence of the same Shape

a = Circle with [radius = 100] dl = put a at (-100 00) in main d2 = put a at (100 00) in main

Once a drawing has been defined a way to access its points is needed SDDL defines a syntax for extracting points from drawings

coord of (coord) ( (args) ) in (drawing)

Here one specifies the kind of point to use (( coord) ) and any particular arguments required to obtain it The available points are Shape specifie so only those kinds of points which make sense for the particular Shape can be used For instance one can get a point at a particular angle on a Circle This is also an example where an additional argument is needed For instance anglePoint(450) will give the point at 45 degrees

Finally to reference the drawing from which we take the point its clrawing Path (a dot separatecl path) from the main diagram must be given

a = Circle with [radius = 100] dl = put a at (-75 00) in main d2 = put a at (75 00) in main (coord of anglePoint(OO) in maindl)

(coord of anglePoint(1800) in maind2)

m In this example a line between two identical circles is drawn The drawing Paths are simple here since both drawings are made directly in main Thus only main followed by the drawing name is needed

Simply giving a Drawing is not sufficient in order to make reference points non-ambiguous complete drawing Paths are required as we will now show Lets go back to the two eyes we drew previously

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

The eye was defined by a circle and an ellipse both put inside a sub-Canvas Now lets say we want to draw a line between the two circles Each of those circles is defined in the sub-Canvas and they are as a matter of fact the same Drawing a Adding a link between a and itself wauld add a link between the sub-Canvas circle and itself (what could this mean) Adding the sub-Canvas to the main Canvas twice as we did before would just duplicate this structure inside the main Canvas

But since a Canvas is a Shape we get a drawing when we put the sub-Canvas inside main We can therefore identify each inner circle by listing the drawings required to access them as shown in the following SDDL example Thus we can always link together Shapes that are deeply nested inside a subshyCanvas a = Circ le with [radius=100] b = Ellipse with [xradius=200 yradius=100] c = put a in form put b in form fl = put form at (-200 00) in main f2 = put form at (200 00) in main (coord of anglePoint(1800) in mainflc) -gt

(coord of anglePoint(OO) in mainf2c)

6 Programming constructs and lists

SDDL also defines typical programming constructs For instance Iists are created and elements accessed in a syntax similar to most other dynamic languages Since the content of a list is a general Java Dbject you can create a list of objects that are not of the same type Thus an assignment like l = [20 (00 00) [] a--b]

is perfectly legal even if not typically very useful A more typical use of Iists would be list = [(00 00) (100 100)] 1= list[O] 12 = list [1]

1--12

Lists are nice but to use them properly adeshyquate programming canstructs are needed such as for and while loops SODL defines those permitting us to draw arrays of Shapes or riAfine points through a simple list

The ability to use loops significantly simplifies many diagrams in computer science In this example we first define a Iist of points Afterward using a for loop we link those points into a linear Path a = [(100 100) (200 100)

(200 200) (100 200)] for i from 0 to 2 do

209 TUGboat Volume 31 (2010) No 2

a[i]--a[H1)

end

Alternatively we coulcl get the same result using the following while loop i = 0 hile i 1= 3 do

a [il --a [i+1] i = i + 1

end

7 Functions

SDDL also permits the creation of functiolli inside the code Those must be written before the diagram description A SDDL function is defined with the keyword fun The list of arguments does not need to be typed only named The return type (if it exists) does not need to be specified either To cali the function in the resulting code a typical C-like cali is used fun dropManyCs i v n c)

for j from 1 to n do put s at i + jv in c

end

circle = Circ le vith [radius = 50] dropManyCcircle COO 00)

C50 00) 100 main)

(rtttt3JJJ) In this case we define a function that drops

many instances of a Shape s at different positions on a Canvas c The positions of the Shape are detershymined by an initial point i and a translation vector v Finally the number of Shapes placed is also given as a parameter n Each Shape is then placed at the initial point translated by the translation vector a certain number of times This permits us to create many circles along one line

One important point is the parameter for the Canvas in which we place the Shapes However we pass main as our parameter The reason for this is that SDDL does not possess global variables A function can only access its parameters and variables that have been defined inside the function Thus trying to place something in main From inside a funcshytion will yield an errer message saying the variable main is unknown

8 Primitives

SDDL as mentioned before is written in Java One of the nice features of Java is its libraries Many classes have been written for any number of different tasks and the number of functions and algorithms implemented is astonishing To rewrite libraries that are already defined in Java or to link them one by

one in SDDL seemed pointless It is much nicer to directly use those functions since theyre already there

Since Java is a reftexive language in the sense that the program knows about itself and can modify itself at will functions can be dynamically accessed at runtime We already use this feature to simplify the definition of the SDDL interpreter the interpreter doesnt have to know every possible type of Shape in order to work Using these same mechanisms permits loading classes at runtime and gives the user the power to cali From inside SDDL any Java function

This is done through so-called primitives which are defined using the keyword primitive followed by the name of the function as it will appear in SDDL Following that two strings are given one for the package in which the function is defined and one for the name of the function as it was defined in Java Any primitive declaration must be made prior to any function definition

Lets look at an example One of the main things a diagram description language would require is sorne basic mathematics and geometry libraries Java possesses a nice java lang math package which we would like to use especially the sin and cos funcshytions For this we will need to define two primitives primitive static sin javalangMath sin primitive static cos javalangMath cos

Once they are defined they can be called just like any other SDDL functions In this case we will use those functions to place circles around an invisible circle for i from 1 to 6 do

put Circle vith [radius = 50] at C200 cos(i 314 30) 200 sin(i 314 30raquo

in main end

00 o 0 00

9 A concrete example

Now that we have ail our tools lets use SDDL to describe a simple diagram of an automaton This is the complete code along with the resulting image circlel Circle vith [radius = 100] circle2 Circle vith [radius = 120] ellipse Ellipse vith [xradius = 500

yradius = 200] circle = put circlel at (-300 00) in form put circlel at C300 00) in form put circle2 at (300 00) in form

Drawing structured diagrams with SDDL

210

put ellipse in form

dl = put form at (1000 1000) in main d2 = put form at (1000 500) in main d3 = put form at (1000 -500) in main put Text with [text=$N(p_1)$]

at (1000 1000) in main put Text with [text=$N(p_2)$]

at (1000 500) in main put Text with [text=dots]

at (100000) in main put Text with [text=$N(p_n)$]

at (1000 -500) in main

put Text with [text = $s_O$] at (00 200) in main

d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle) (coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle) (coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

10 Modifying the hierarchy by adding shapes

Using what has been described above most diagrams can be created However many simplifications can be made and sorne domains may find it relevant to add classes specifie to their trade SDDL eases the modification of the Java hierarchy underneath the language by using reftexivity Any user who respects sorne basic guidelines will be able to have its class work automatica11y in SDDL without any specifie linking required

To do this every class must possess a certain number of properties Those properties are defined through setters and getters For instance for the

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

radius of a circle these are called setRadius and getRadius Any property that follows this rule will be accessible

Furthermore an empty constructor must also be defined that sets as much as possible default values for a11 properties of the defined Shape There are also sorne small functions to be defined like the draw and obtainPath functions Any reference points must also be defined with a function to obtain them

As an example lets say we would like to add a class to represent a cloud A cloud will have a number of spikes and a size The class definition (without function definition) that we would require would be the following

public class Cloud extends Shape double size int numberOfSpikes public Cloud() public void setSize(double size) public double getSize() public void setNumberOfSpikes(int n) public int getNumberOfSpikes() public void draw(AbstractPoint a

PrintWriter w) public Path obtainPath()

11 Future additions and availability

SDDL is available now at httpwwwinfo2uqam cal -villemaire_rReChereacuteheSDDL It is funcshytional though not by any means complete Many additional Shapes couid be added (in particular tree and graph classes) and options could be added to existing classes Development of the application conshytinues for the time being and a more thorough version will be made available

References

[1] John C Bowman and Andy Hammerlindl Asymptote A vector graphies language TUGboat The Communications of the TEX Users Group 29288-294 2008

o Mathieu Bourgeois Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada bourgeois dot mathieu dot 2 (at)

courrier dot uqam dot ca

o Roger Villemaire Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada villemaire dot roger (at) uqam dot ca httpintrainfouqamca

personnelsMembersvillemaire_r

APPENDICE B

PREacuteSENTATION DE LA GRAMMAIRE DE SDDL

Nous preacutesentons ici le contenu entier de la grammaire de SDDL tel que reacutealiseacute avec

SableCC Tous les eacuteleacutements du langage sont lagrave agrave lexception de la reacuteflexiviteacute dont les

deacutetails de code sont situeacutes dans la partie Java de notre projet

Package sddlsyntax

Helpers

any [O Oxffff]

tab 9 li 10 cr = 13

upper [ A 2 ]

lower [ a z]

digit [ 0 9]

name char = upper 1 lower 1 digit -

string_char = [[32 126] - ]

= J bulldot

not star = [any-] not_star_not_slash = [not_star - l]

Tokens

92

put_kwd = put at_kwd = at in_kwd = in fit_kwd = fit around_kwd = around if_kwd = if

while_kwd = while true_kwd = true false_kwd = false then_kwd = then else_kwd = else for_kwd = for from_kwd = from end_kwd = end to kwd to by_kwd = by do_kwd = do with_kwd = with and_kwd = and or_kwd = or fun_kwd = fun return_kwd = return primitive_kwd = primitive call_kwd = call static_kwd = static coord_kwd = coord of _kwd = of get_kwd = get

scaled_kwd = scaled slanted_kwd = slanted rotated_kwd = rotated translated_kwd = translated

straight_line_kwd = -- curved_line_kwd = - straight_fwd_arrow_kwd = -gt curved_fwd_arrow_kwd = -gt straight_bwd_arrow_kwd = (- curved_bwd_arrow_kwd = (- straight_bidir_arrow_kwd = (-gt curved_bidir_arrow_kwd = (-gt

93

plus = + minus = -

mult = div =

eq = == neq = = lt lt gt = gt leq lt= geq gt= not assign = =

dot = dot

l br = - r br ( l _par = ) r_par =

l cr = [ )

-r_cr = J

sc = comma =

id = lower name_char class_name = upper name_char

integer = (-) digit+ real = (-) digit+ dot digit+

) ) Il J )Ilstring string_char

blank = 1 tab 1 cr 1 If 1 cr If comment not_star ( (not_star_not_slash not_star))

Ignored Tokens

blank comment

Productions

file = [primitives] primitive [functions] function [stms] stm

94

primitive =

primitive_kwd static_kwd id [class_name] string [func_name] string signature sc

signature = l_par type_list r_par

type_li st = string [additional_types] additional_type

additional_type comma string

function = fun_kwd id l_par id_list r_par l_br [stms]stm r_br

id_list =

id [additional_ids] additional_id

additional id comma id

stm = exp exp sc 1

assign id assign exp sc 1

while while_kwd exp do_kwd [stms] stm end_kwd sc Il if if_kwd exp then_kwd [stms] stm else_part end_kwd sc 1

for for_kwd id from_kwd [low_bound] exp to_kwd [up_bound] exp do_kwd [stms] stm end_kwd sc 1

return return_kwd exp sc

else_part = else_kwd [stms] stm

exp = or exp or_kwd and_exp simple and_exp

and_exp = and and_exp and_kwd line_exp 1

simple line_exp

line_exp line line_exp line_op eq_exp with_part 1

95

1

1

simple eq_exp

line_op =

straight_Iine straight_line_kwd 1

curved_line curved_Iine_kwd 1

straight_fwd_arrow straight_fwd_arrow_kwd curved_fwd_arrow curved_fwd_arrow_kwd 1

straight_bwd_arrow straight_bwd_arrow_kwd curved_bwd_arrow curved_bwd_arrow_kwd 1

straight_bidir_arrow straight_bidir_arrow_kwd curved_bidir_arrow curved_bidir_arrow_kwd

eq_exp = eq [left] cmp_exp eq [right] cmp_exp 1

neq [left] cmp_exp neq [right] cmp_exp simple cmp_exp

cmp_exp = lt [left] add_exp lt [right] add_exp 1

gt [left] add_exp gt [right] add_exp 1

leq [left] add_exp leq [right] add_exp geq [left] add_exp geq [right] add_exp simple add_exp

add_exp = add add_exp plus mul_exp 1

minus add_exp minus mul_exp simple mul_exp

mul_exp =

mult mul_exp mult left_unary_exp div mul_exp div left_unary_exp simple left_unary_exp

left_unary_exp = not not left_unary_exp get get_kwd id from_kwd left_unary_exp put put_kwd exp at_part in_kwd left_unary_exp fit fit_kwd class_Dame around_kwd left_uoary_exp coord coord_kwd of_kwd id l_par

arg_Iist r_par in_kwd left_unary_exp 1

simple right_exp

96

right_exp = calI right_exp dot id l_par arg_Iist r_par 1

index right_exp l_cr exp r_cr 1

scaled right_exp scaled_kwd l_par eq_exp r_par slanted right_exp slanted_kwd l_par

[xslant] exp comma [yslant] eq_exp r_par rotated right_exp rotated_kwd l_par eq_exp r_par 1

translated right_exp translated_kwd l_par [xtranslate] term comma [ytranslate] eq_exp r_par 1

simple term

term =

par l_par exp r_par 1

point l_par [x_value] exp comma [y_value] exp r_par 1

drawing class_name with_part 1

var id 1

int integer 1

real real 1

true true_kwd 1

false false_kwd string string 1

list l_cr arg_Iist r_cr 1

static_call id l_par arg_Iist r_par

arg_Iist = exp [additional_args] additional_arg

additional_arg comma exp

with_part = with_kwd l cr options r_cr

options = option [additional_options] additional_option

additional_option comma option

option = id assign exp

APPENDICE C

PREacuteSENTATION DE LA HIEacuteRARCHIE

Nous preacutesentons ici la description complegravete de notre hieacuterarchie objet en Java Le tout est

deacutecrit agrave laide dun diagramme UML Toutefois afin de faciliter le formatage nous avons

seacutepareacute le tout en deux sections Le premier diagramme contient les noms des classes ainsi

que leurs relations dheacuteritage Par apregraves tous les diagrammes suivants repreacutesentent le

contenu speacutecifique de chaque classe sans les relations entre classes Ceci nous permet

dobtenir une vue densemble des classes tout en obtenant des deacutetails cruciaux sur

limpleacutementation de chaque classe

98

l -llill Pa aj f1 1 Sh middotisVIsible boolampan

+draw(locaton AbstractPoint oot PniltWriBl) void

+lsVlsigtle() boolean +copyO Shape +obtalnPathO Path

Drawlna

-numberOIDrawinm int =0 middotdrawingNumber (nt -dependendes DrawingD middotpointsDellned AbsttactPolntD middothasBeenDrawn booLean middotshape Shape dmWingName string middotdrowingPositlon AbstractPoint -position AbstnldPolnt

+Orawlog(s Shape) +Shape(s S~ location AbsbaclPoint) +setPositlcn(positlon AbslradPoinl) void +seIDraloVingName(nsme slJfng) void +gelName() string +geISUbDrawlng(name string) ~ Drawlng +re~~Jri~)slring

+addDeflO8dPoint(point AbstractPolnl) Int +hasBeenDraWn() booIean +lsDrawn() booIean +canBeDlBWn() booIean +getShape() Shape fdraw(Jocafion AbslraclPolnt out PrlnlWriler) void +obtainPathO Path -tdp(other Orawilg) AbslractPoilt

uare length double

+Squate() ~s ( ~ le)

ell-eoatMength double) void +getlongthO bulldouble +dmw(locabmiddotoo AbstrampctPoint out PrnMYler) void +obtainPath() Path ffOPY() Shape

99

Rectangle

-lengIh double -wldth double -100 KI boeacuteIean

+Rectangle() +Rectangle(length double wldth double) +selleogth~ength double) void +setWldth(Width double) void +seIRound(rlaquo)Ulld booIegravean) void +getlengtb( doubIe +getMdth() double +getRound() booIeao +getNorth(d Dmwlog) RefPoint lttget5outh(d Drawlng) RefPolnl +getwest(d DlaWlng) RefPoint +gelEaat(d Drawlng) RefPoinl +gelNorthwest(d Drawllg) RefPoInt +gelNortheast(d Drawlng) R1tfPolnt lttgetSou1hwe$(d Drawlng) RefPoInt +get5outheast(d Drawilg) RefPoklt +dl8wlocalion Absl18ctPoiIt Ougravet ~Mhl81 void ii)blainPathO ~ Path

CIrcIe

middotradlus double

+Clœ() +Clrcle(radlus double)

+COPYO Shape +setRadlus(radius ~ double) void +getRadius() double +getAnglePolnt(d Omwilg angle double) RefPoInt +dmwlocation AbstradPoirlt our AiltKtler) VOiCI iOblailPath() Path

ElIID8e

middotxradlus double middotyradlus double

+Ellpse() +copyO bullShape +setXRadlus(r double) void +setYRadIus(r doublrt) void -gelXRadlus() double +geIYRadius() double +draw(txalJon AbstractPomt out PrinMbl8l) IIOIumld iOblainPathO Path

100

Lino point1 AbslractPoln1 middotpoint2 AbstractPoint

+L1oe() +Llne(point1 AbstractPoint poill2 AbstractPolnt) +COPYO Shape +dmw(locaIJon AbsIroctPoinl out PrnIWril9f) void +selPolnt1 (poInl1 AbsttactPoint) void +seIPoill2(poinl2 AbslractPoinl) void +getPolnl1 () AbslraclPoinl tiJotPolnl2() AbstraclPolntn_~

EqTrtanale middotsim double

-EqTriangleQ +EqTrlangle(size double) +cOPYO Shape +setSlze(slze double) void +gets1ze() double +d18W(Jocolion AbstTadPoinl out Ptil1Wfit8f) void +oblalllPalhll Path

middotpath Path bulltext string middotposIlIon double -dir Poilt middotabsohJle boolean middothasTexl boolean

+Arrav(path Palh) +copyO Shape TCl(( ex s n~ U blo dn 010 aosolute boolean) void seISlartingTangcnl(dlr Poinl) void

seIEndflgTangenl(dir Potnt) void tgelPalhO Palh +obtalnPath Path

101

cany -canvasLlst Carwas(J -canvasPontLIsl AbstractPoinllJ daWVigUsl DrawingD dlawilgPolnlUst AbsJaCtPolntO middotIsMaIn booean canvasPosltion bullAbstmetPoint

+CsnYaS() copYO Shape +seteanvasPositIoR(posllon AbslraclPotnt) VOId +setMaln() void +f8Mai1() booIean +addShape(S Shapeloca1ion AbstradPoItit) Drawilg l+a~pe(S Shape IocagravetJon AllstraclPolnl name slring) DraNklg +getOtawiDg(I Inl) D1awlng ~elDtawfng(namamp string) bull Drawilg tgelOl8WIngiocal1on(namo stlllllJ) AbsllaclPoilt ~olDmwlngOrNull(name string) Drawilg tgelOrawinglocation(l int) AbslractPolnt o+getNumberOfDrawlngs() int +dl8w(location AbstrodPonr oui PrintwrllerJ void +dmwMain(oul PrinlWrllGr) void +drawCanvaa(locatlon AbSlractPoinl remalnlllQDraws Drawlna Il out Prlntwriter) void

Path -Bst AbstractPolnllJ middothasASIartilgTangent boolean -hasAEndhlgTangent booIean -startiogTangent Point middotendingTangent Point middot1sU1ear boolean

+PathO Psth(Ust AbstraclPoint 0) +Path(Dst Ab~tPolnt Q startingTangent Polnt endlngTangenl Point) +cOPYO Sh8p6 +addPoinl(poiumlnl Abstl8ClPoint) void +seIUnear() void +IsUnearO booloao +getPolnt(l Inl) AbsIraclPcInl +getPolnts() AbsIlaCPoht 0 o+getNumberOlPolnts() Rt +cyc1B() void -thasASI8rthgTangent() boolean +hasAEndingTangentO booIoan +getStattilgTangenlO PoiIl +getEndlngTangent() Polnl 4uumllSlartingTangenl(stllllngTangent Peint) w1d +seIEndIllQTangent(encliigTangenl ~nt) void +psthValue() strilg +dmwJocalion AbslradPoItlI oot FilMtJrer) void

102

Text

-told slfng

ImiddotTexl() +Texl(lext string) +sotText(tegravext string) void iil8tTeld() string +draw(Jocalion AbstroctPoJnl oof PrinWriter) void ~btalnPath() Path +CODV(J ShsD9

AbsctPolnl +altfd(second AbstraclPoinl) AbslractPolnt -tmulliply(multipier double) AbstraclPolnt +eombine(perœntage double second AbstraclPolnl) AbstractPoint +solvfJ() slrillg +COfNIJ AbslradPoinl

Point -x double y doub19

+POIcirclIO +POIOI(x double y double) +solvo() slting -+IoSlflngO string~ n bull

RefPolnt -mf8teflœDrawlng Drawlng -poIntNumbef Int

+RefPoint(referenceDrawing DraYIing poiolNu ber Illl) +SoNe() stmg +COPYO AbstroctPDAcirclf

lnauudJonPoint p Path

-q Palh

+lnlCfSecllonPoint(p Palh q Path) +COPYO AbstrampcfPoitlt +soIve() string

103

Un Point -point AbsbaclPoint -pIampStmg string -endStrlng string -value double

+UnaryMapPolnl(poInt AbstradPoInt) +ScW9() string +setMapTypeMultlpIy(vallJe double) void +c Abslr8ctPoinI

Bln oint frstPoint Absll8clPoinl secoodPoInt AbstrootPoint -pceSIring string -middIeSlrIng Itlfno -endString string

+8ilatyMapPolnt(fkstPoiIt Abstmc1Po1nt secondPolnt AbslraetPointl +cOPYO bull AbstraetPOOI +soAte() string +selMapTypeAddO void

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

APPENDICE D

PREacuteSENTATION DES DIAGRAMMES CHOISIS

Cet annexe comprend lensemble des quinze (15) diagrammes que nous avons choisis

comme base de qualiteacute pour notre projet Tel que mentionneacute preacuteceacutedemment nous avons

inclus agrave la fois le code de chaque diagramme en SDDL ainsi que le diagramme reacutesultant

Aucune analyse nest effectueacute pour ces dessins agrave lexception de ceux deacutejagrave analyseacutes au

chapitre 6

Start box triangle = EqTriangle with [size = 400J put triangle at (00 -100) in main put Text with [text = StartJ at (00 -50) in main

El box rectanglePos = (00 -500) rectangle = Rectangle with [length = 1600 width = 300J put rectangle at rectanglePos in main put Text with [text El J at rectanglePos - (600 00) in main put Text with [text $a leftarrow O$J

at rectanglePos + (-300 50) in main put Text with [text $b leftarrow l$J

at rectanglePos + (-300 -50) in main put Text with [text $a leftarrow l$J

at rectanglePos + (100 50) in main put Text with [text $b leftarrow O$J

at rectanglePos + (100 -50) in main put Text with [text $c leftarrow m$J

at rectanglePos + (500 50) in main put Text with [text $d leftarrow n$J

106

at rectanglePos + (500 -50) in main

1 E2 box 1 rectangle2Pos = (00 -1000) put rectangle at rectangle2Pos in main put Text with [text = E2 ] at rectangle2Pos (600 00) in main put Text with [text = $q leftarrow quotient(c div d)$]

at rectangle2Pos + (100 50) in main put Text with [text = $r leftarrow remainderCc div d)$]

at rectangle2Pos + (100 -50) in main

1 Round E3 box 1 rectangle3Pos = (00 -1500) roundRectangle = Rectangle with [length = 800 width 250

round = true] put roundRectangle at rectangle3Pos in main put Text with [text = E3 $r = O$] at rectangle3Pos in main

1 Stop box 1 stopPos = (1500 -1700) put triangle at stopPos in main put Text with [text = Stop] at stopPos + (00 50) in main

1 E4 box 1 rectangle4Pos = (00 -2000) put Rectangle with [length = 1600 width = 400]

at rectangle4Pos in main put Text with [text = E4] at rectangle4Pos + (-700 00) in main put Text with [text = $c leftarrow d d leftarrow r$]

at rectangle4Pos + (100 120) in main put Text with

[text = $t leftarrow a a leftarrow a a leftarrow t - qa$] at rectangle4Pos + (100 00) in main

put Text with [text = $t leftarrow b b leftarrow b b leftarrow t - qb$ ] at rectangle4Pos + (100 -120) in main

(00 -100) -) rectanglePos + (00 150) rectanglePos + (00 -150) -) rectangle2Pos + (00150) rectangle2Pos + (00 -150) -) rectangle3Pos + (00125) rectangle3Pos + (00 -125) -) rectangle4Pos + (00200) rectangle4Pos + (00 -200) -- rectangle4Pos + (00 -500)

rectangle4Pos + (-1000 -500) -- rectangle2Pos + (-1000 00) -) rectangle2Pos + (-800 00)

107

rectangle3Pos + (400 00) -gt rectangle3Pos + (1410 00) put Text with [text Yes] at rectangle3Pos + (480 -50) in main put Text with [text = No] at rectangle3Pos + (-80 -175) in main

Placing text notes put Text with [text Al $m gt 0 n gt 0$] at (3000 00) in main put Text with [text A2 $c=mgtO d=ngtO$] at (3000 -340) in main put Text with [text $a=b=O a=b=l$] at (3000 -460) in main put Text with [text A3 $am + bn = d am + b$]

at (3000 -740) in main put Text with [text = $0 leq r lt d gcd(dc) g$]

at (3000 -860) in main put Text with [text = A4 $am + bn d = gcd(m n)$]

at (3000 -1200) in main put Text with [text = A5 $am + bn d am + b$]

at (3000 -1540) in main put Text with [text = $0 lt r lt d gcd(cd) = g$]

at (3000 -1660) in main put Text with [text = A6 $am + bn = d am + b$]

at (3000 -1940) in main put Text with [text = $gcd(c d) = gcd(m n)$]

at (3000 -2060) in main

(2500 00)-(2000 -50)-(1500 -150)-gt(00 -200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -400)-(2000 -450)-(1500 -650)-gt(00 -700) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -800)-(2000 -850)-(1500 -1150)-gt(00 -1200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2200 -1200)-(2000 -1200)-(1500 -1250) -gtrectangle3Pos + (900 00) with [startingTangent = (-10 00) endingTangent (-10 -10)]

(2250 -1600)-(2000 -1700)-(1500 -1900) -(1000 -1750)-gt(00 -1700) with [startingTangent = (-10 00) endingTangent (-10 00)]

(2250 -2000)-(1500 -2200)-gt(00 -2400) with [startingTangent = (-10 00) endingTangent (-10 00)]

108

~-- Al m gt On gt O

A2 c = m gt 0 d = n gt 0 a = b = 0 a = b = 1

A3 am + bn = dam + bdeg~ T lt dgcd(dc) = 9 E2

_--- A4 am + bn = d = gcd(m n)

A5 am + bn = dam + b Sto 0lt T lt dgcd(cd) = 9

Cf- d d f- T A6 am + bn = d am + bE4 t f- a a f- a a f- t - qa gcd(cd) =gcd(mn)t f- b b f- b b f- t - qb

primitive static sin javalangMath sin primitive static cos javalangMath cos primitive static sqrt javalangMath sqrt

fun ellipseCangle length width) return Clength cosCangle 20 31415 3600)

width sinCangle 20 31415 3600))

fun ellipseDeriveCangle length width) length2 = length length width2 = width width sinus = sinCangle 31415 1800) sinus2 = sinus sinus cosinus = cosCangle 31415 1800) cosinus2 = cosinus cosinus x = -10 Clength sinus)

sqrtCwidth2 cosinus2 + length2 sinus2) y = Cwidth cosinus) sqrtCwidth2 cosinus2 + length2 sinus2) return Cxy)

avail = Text with [text=AVAIL] link = Text with [text=LINKCP)] t = Text with [text=T]

109

put avail at ellipse(900 1000 500) in main put t at ellipse(1800 1000 500) in main put link at ellipse(OO 1000 500) in main

(ellipse(70 1000 500))-(ellipse(450 1000 500)) -gt(ellipse(750 1000 500))

(ellipse(1050 1000 500))-(ellipse(1350 1000 500)) -gt(ellipse(1730 1000 500))

(ellipse(1930 1000 500))-(ellipse(2700 1000 500)) -gt(ellipse(3550 1000 500))

AVAIL

~ T LINK(P)

primitive static sin javalangMatb sin primitive static cos javalangMatb cos

fun circular(angle radius) return (radius cos(31415 angle 1 1800)

radius sin(31415 angle 1 1800))

circleradius = 400 circle = Circle with [radius=100] g Text with [text=G] r = Text with [text=R] y Text with [text=Y]

put circle at (circular(300 circleradius)) in main put r at (circular(300 circleradius)) in main put circle at (circular(900 circleradius)) in main put r at (circular(900 circleradius)) in main put circle at (circular(1500 circleradius)) in main put g at (circular(1500 circleradius)) in main put circle at (circular(2100 circleradius)) in main put g at (circular(2100 circleradius)) in main put circle at (circular(2700 circleradius)) in main

110

put g at (circular(2700 circleradius)) in main put circle at (circular(3300 circleradius)) in main put y at (circular(3300 circleradius)) in main

(circular(450 circleradius))-(circular(600 circleradius)) -gt(circular(750 circleradius))

(circular(1050 circleradius))-(circular(1200 circleradius)) -gt(circular(1350 circleradius))

(circular(1650 circleradius))-(circular(1800 circleradius)) -gt(circular(1950 circleradius))

(circular(2250 circleradius))-(circular(2400 circleradius)) -gt(circular(2550 circleradius))

(circular(2850 circleradius))-(circular(3000 circleradius)) -gt(circular(3150 circleradius))

(circular(3450 circleradius))-(circular(OO circleradius)) -gt(circular(150 circleradius))

put Text with [text=tinyNEXTR] at (circular(900 circleradius)) + (00 150) in main

put Text with [text=tinyNEXTG] at (circular(-900 circleradius)) + (00 -150) in main

put Text with [text=tinyCURRENT] at (circular(-300 circleradius))+ (1~0 -150) in main

NEXTR

NEXTG

fun left(d)

return 016 coord of west in drectangle + 084 coord of east in drectangle

fun right(d)

return 016 coord of east in drectangle +

111

084 coord of west in drectangle

rectanglel = Rectangle with [length=600 width=200) rectangle2 = Rectangle with [length=200 width=200) circle = Circ le with [radius=10) put rectanglel in form rectangle = put rectangle2 in form put circle at (-200 00) in form put circle at (200 00) in form

dl = put form at (00 00) in main d2 = put form at (-600 -500) in main put Text with [text=IA) at (-600 -500) in main d3 = put form at (-1200 -1000) in main put Text with [text=IB) at (-1200 -1000) in main d4 = put form at (-1800 -1500) in main put Text with [text=ID) at (-1800 -1500) in main d5 = put form at (-600 -1500) in main put Text with [text=IE) at (-600 -1500) in main d6 = put form at (00 -1000) in main put Text with [text=IC) at (00 -1000) in main d7 = put form at (600 -1500) in main put Text with [text=f) at (600 -1500) in main d8 = put form at (-400 -2000) in main put Text with [text=IG) at (-400 -2000) in main dg = put form at (300 -2000) in main put Text with [text=IH) at (300 -2000) in main dl0 = put form at (1000 -2000) in main put Text with [text=JI) at (1000 -2000) in main

(left(dl))-gt(coord of north in d2rectangle) (right(dl))-gt(coord of east in dlrectangle + (00 50)) (left(d2))-gt(coord of north in d3rectangle) (right(d2))-gt(coord of north in d5rectangle) (left(d3))-gt(coord of north in d4rectangle) (right(d3))-gt(coord of south in d2rectangle) (left(d4))-gt(coord of west in dlrectangle + (00 50)) (right(d4))-gt(coord of south in d3rectangle) (left(d5))-gt(coord of north in d6rectangle) (right(d5))-gt(coord of north in d7rectangle) (left(d6))-gt(coord of south in d2rectangle) (right(d6))-gt(coord of north in d8rectangle)

112

(left(d7raquo-gt(coord of north in d9rectangle) (right(d7raquo-gt(coord of north in dl0rectangle) (left(dSraquo-gt(coord of south in d6rectangle) (right(d8raquo-gt(coord of south in d5rectangle) (left(d9raquo-gt(coord of south in d5rectangle) (right(d9raquo-gt(coord of south in d7rectangle) (left(dl0raquo-gt(coord of south in d7rectangle) (right(dl0raquo-gt(coord of south in dlrectangle + (100 00raquo

put Text wi th [text=List head] at coord of north in dlrectangle + (00 50) in main

circle = Circle with [radius = 100] bigcircle = Circle with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvasl put circle at 050 150) in canvasl put Text with [text = H] at 050 150) in canvasl put circle at (-150 150) in canvasl put Text with [text J] at (-150 150) in canvasl put Text with [text = B] at (00 -150) in canvasl

put bigcircle in canvas2

113

put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = Fil] at (150 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = liE] at (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvasl at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = Ali] at (00 -300) in main put bigellipse in main

A

fun drawBinaryTree(d s 0 dh dv n)

put s at a in d put 0-(0 + (-10 dh -10 dvraquo in d put 0-(0 + (db -10 dvraquo in d if (n == 1)

then return 0 else drawBinaryTree(d sa + (-10 dh -10 dv) db 20 dv n - 1) drawBinaryTree(d s a + (db -10 dv) db 20 dv n - 1) end

(0000)--(0000)

114

orlgln = (00 00) dv = 200 dh = 1000 bullet = Circle with [radius = 20) drawBinaryTree(main bullet origin dh dv 7)

bullet = Circle with [radius = 20] put bullet in main put bullet at (-300 -300) in main put bullet at (-600 -600) in main put bullet at (00 -600) in main put bullet at (300 -300) in main

(00 00)--(-300 -300) (00 00)--(300 -300) (-300 -300)--(-600-600) (-300 -300)--(00 -600)

(-100 00)-(-500 -300)-(-650 -650)-(-300 -400)shy(50-650)-(00-500)-(-150-300)-(-100 -200)shy(00-100)-(250-320)-(350-350)shy(320 -270)-gt(100 00)

circlel Circle with [radius 100]

lL5

circle2 = Circle with [radius = 120] ellipse = Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (100 0 500) in main d3 put form at (1000 -500) in main put Text with [text I$N(p_1)$] at (1000 1000) in main put Text with [text I$N(p_2)$] at (1000 500) in main put Text with [text dots] at (100 0 o 0) in main put Text with [text $N(p_n)$] at (1000 -500) in main

put Text with [text $S_O$] at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

sa

fun dropMany(f n s v c) for i from 10 to n do

put f at (s + (i - 10) v) in c

116

end

square = Square with [length=200] changeVec = (00 -200) dropMany(square 40 (00 00) changeVec main) dropMany(square 30 (500 00) changeVec main) dropMany(square 10 (1000 00) changeVec main) dropMany(square 10 (1500 00) changeVec main) put Text with [text=IO] at (00 00) in main put Text with [text=ll] at (00 -200) in main put Text with [text=13] at (00 -400) in main put Text with [text=17] at (00 -600) in main put Text with [text=bf ail] at (500 200) in main put Text with [text=12] at (500 00) in main put Text with [text=14] at (500 -200) in main put Text with [text=17] at (500 -400) in main put Text with [text=17] at (1000 00) in main put Text with [text=bf $a~b~+$] at (1500 200) in main put Text with [text=18] at (1500 00) in main put Text with [text=none ] at (2000 00) in main

(120 100)-gt(380 100) (620 100)-gt(880 100) (112 0 10 0) - gt(138 0 10 0) (1620 100)-gt(1880 100)

a ab+

~ -m-0-0-none 7

put Text with [text=IS] in main put Text with [text=A] at (00 -200) in main put Text with [text=B] at (00 -400) in main put Text with [text=$alpha$] at (-600 -600) in main put Text with [text=$beta$] at (-300 -600) in main put Text with [text=$gamma$] at (00 -600) in main put Text with [text=$y$] at (300 -600) in main put Text with [text=$z$] at (600 -600) in main

117

(-50 -50)--(-700 -540)--(-500 -540) (50 -50)--(700 -540)--(500 -540) (-50 -250)--(-400 -540)--(-200 -540) (50 -250)--(400 -540)--(200 -540) (-50 -450)--(-100 -540)--(100 -540)--(50 -450)

put Text with [text=D] in main

put Text with [text=T] at (-500 -500) in main put Text with [text=bf real] at (-500 -900) in main put Text with [text=4] at (-350 -500) in main put Text with [text= type] at (-150 -500) in main

put Text with [text=L] at (500 -500) in main put Text with [text=inh] at 050 -500) in main put Text with [text=5] at (350 -500) in main put Text with [text=6] at (650 -500) in main put Text with [text=entry] at (850 -500) in main

put Text with [text=bf $id_3$] at (900 -900) in main put Text with [text=bf ] at (500 -900) in main put Text with [text=3] at 0050 -900) in main put Text with [text=entry] at 0350 -900) in main

put Text with [text=L ] at (00 -1000) in main put Text with [text=inh] at (-350 -1000) in main put Text with [text=7] at (-150 -1000) in main put Text with [text=8] at 050 -1000) in main put Text with [text=entry] at (350 -1000) in main

put Text with [text=bf ] at (00 -1400) in main put Text with [text=bf $id_2$] at (400 -1400) in main put Text with [text=2] at (550 -1400) in main put Text with [text=entry] at (750 -1400) in main

put Text with [text=L] at (-500 -1500) in main

118

put Text with [text=inh] at (-850 -1500) in main put Text with [text=19] at (-650 -1500) in main put Text with [text=110] at (-350 -1500) in main put Text with [text= ent ry] at (-150 -1500) in main

put Text with [text=bf $id_l$] at (-500 -1900) in main put Text with [text=ll] at (-350 -1900) in main put Text with [text= ent ry ] at (-150 -1900) in main

(-100 -100)--(-400 -400) (-500 -600)--(-500 -800) (100 -100)--(400-400) (500 -600)--(500 -800) (600 -600)--(800 -800) (400 -600)--(100 -900) (100 -1100)--(400 -1300) (00 -1100)--(00 -1300) (-100 -1100)--(-400 -1400) (-500 -1600)--(-500 -1800)

(-300 -400)-(00 -300)-gt(300 -400) (400 -600)-(500 -650)-gt(600 -600) (950 -800)-gt(700 -600) (300 -600)-gt(-50 -900) (-100 -1100)-(00-1150)-gt(100 -1100) (450 -1300)-gt(200 -1100) (-200 -1100)-gt(-550 -1400) (-550 -1500)-(-500 -1550)-gt(-450 -1500) (-350 -1800)-gt(-350 -1600)

119

D

~ T 4 type inh 5 L 6 entry

entryrL ~~3 inh 7 L 8 entry

~2entrY inh 9 JJ lOentry

1 t id l 1 entry

circle = Circle with (radius=100J bigcircle = Circle with (radius=SOOJ

cl put circle at (00 200) c2 put circle at (200 00) c3 put circle at (-200 00) c4 put circle at (00 -200) bcl = put bigcircle in graphl

cS = put circle at (00 200) c6 = put circle at (00 -200) bc2 = put bigcircle in graph2

c7 put circle at (00 lS0)

in graphl in graphl in graphl in graphl

in graph2 in graph2

in graph3 c8 put circle at (200 -200) in graph3 c9 put circle at (-200 -200) in graph3 bc3 = put bigcircle in graph3

gl put graphl in main g2 put graph2 at (-1000 -1500) in main g3 put graph3 at (1000 -1000) in main

1 lines in first drawing (coord of anglePoint(900) in mainglc4)-gt

(coord of anglePoint(2700) in mainglcl) (coord of anglePoint(1800) in mainglcl)-gt

(coord of anglePoint(900) in mainglc3) (coord of anglePoint(OO) in mainglcl)-gt

120

(eoord of anglePoint(900) in maingle2) (eoord of anglePoint(2700) in maingle3)-gt

(eoord of anglePoint(1800) in maingle4) (eoord of anglePoint(2700) in maingle2)-gt

(eoord of anglePoint(OO) in maingle4)

(eoord of anglePoint(2700) in maingle3)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(1800) in maingle4)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(OO) in maingle2)shy(eoord of anglePoint(3450) in mainglbel)

lines in seeond drawing (eoord of anglePoint(2700) in maing2e5)-gt

(eoord of anglePoint(900) in maing2e6) erdl = eoord of anglePoint(1800) in maing2e6 erd2 = eoord of anglePoint(1800) in maing2e5 erdl-((erdl + erd2)20 + (-200 00))-gterd2

(eoord of anglePoint(900) in maing2e5)shy(eoord of anglePoint(900) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(450) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(OO) in maing2be2)

(eoord of anglePoint(OO) in maing2e6)shy(eoord of anglePoint(OO) in maing2be2)

lines in third drawing (eoord of anglePoint(1800) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e9) (eoord of anglePoint(OO) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e8) (eoord of anglePoint(OO) in maing3e9)-gt

(eoord of anglePoint(1800) in maing3e8) crd3 = eoord of anglePoint(OO) in maing3e8 erd4 = eoord of anglePoint(900) in maing3e7 erd3-(erd3 + erd4) 20 + (200 200)-gterd4

erd4--(eoord of anglePoint(1050) in maing3be3) (eoord of anglePoint(1800) in maing3e7)-shy

(eoord of anglePoint(1850) in maing3be3) (coord of anglePoint(1800) in maing3e9)-shy

121

(coord of anglePoint(1750) in maing3bc3)

lines between drawings (coord of anglePoint(2250) in mainglbcl)-gt

(coord of anglePoint(900) in maing2bc2) (coord of anglePoint(3450) in mainglbcl)-gt

(coord of anglePoint(1050) in maing3bc3) (coord of anglePoint(OO) in maing2bc2)-gt

(coord of anglePoint(1850) in maing3bc3) crd5 = coor~ of anglePoint(1750) in maing3bc3 crd6 = coord of anglePoint(450) in maing2bc2 crd5-(crd5 + crd6) 20 + (000 300)-gtcrd6

Texts crdTextl coord of anglePoint(1350) in mainglbcl + (-200 00) crdText2 = coord of anglePoint(1350) in maing2bc2 + (-100 100) crdText3 = coord of anglePoint(450) in maing3bc3 + (100 100) put Text with [text=$R_l$] at crdTextl in main put Text with [text=$R_2$] at crdText2 in main put Text with [text=$R_3$] at crdText3 in main

primitive getClip sddlhierarchyDrawing clip primitive setVisible sddlhierarchyShape setVisible

122

1 clip takes 3 drawings and a canvas first is a line second and third are two shapes which intersect line will draw a line between the intersection points the line creates with the two shapes 1

fun clip(dl d2 d3 canvas)

dlsetVisible(false) drawl = put dl in canvas cl = drawlgetClip(d2) c2 = drawlgetClip(d3) put cl--c2 in canvas

circle Circle with [radius=100] dl = put circle in main put Text with [text=14] in main d2 = put circle at (-400 -400) in main put Text with [text=13] at (-400 -400) in main d3 = put circle at (-700 -800) in main put Text with [text=12] at (-700 -800) in main d4 = put circle at (400 -400) in main put Text with [text=18] at (400 -400) in main d5 = put circle at (150 -800) in main put Text with [text=17] at 050 -800) in main d6 = put circle at (650 -800) in main put Text with [text=110] at (650 -800) in main d7 = put circle at (220 00) in main put Text with [text=14] at (220 00) in main d8 = put circle at (620 -400) in main put Text with [text=18] at (620 -400) in main dg = put circle at (370 -800) in main put Text with [text=7] at (370 -800) in main dl0 = put circle at (00 -1200) in main put Text with [text=5J at (00 -1200) in main

Il = (00 00)--(-400 -400) clip(ll dl d2 main) 12 = (-400 -400)--(-700 -800) clip(12 d2 d3 main) 13 = (00 00)--(400 -400) clip(13 dl d4 main) 14 = (400 -400)--(150 -800)

123

clip(14 d4 d5 main) 15 = (400 -400)--(650 -SOO) clip(15 d4 d6 main) 16 = (220 00)--(-400 -400) clip(16 d7 d2 main) 17 = (220 00)--(620 -400) clip(17 d7 dS main) lS = (620 -400)--(650 -SOO) clip(lS dS d6 main) 19 = (620 -400)--(370 -SOO) clip(19 dS d9 main) 110 = (370 -800)--(00 -1200) clip(110 dg d10 main)

2

5

fun niceArrow(c dMain dLeft dRight) firstPoint = coord of southwest in dMainrectangle + (30 30) secondPoint = coord of southeast in dMainrectangle + (-30 30)

firstEnd = coord of north in dLeftrectangle secondEnd = coord of north in dRightrectangle

put firstPoint-gtfirstEnd in c put secondPoint-gtsecondEnd in c

point1 firstPoint 50 60 + secondPoint 10 60 point2 firstPoint 40 60 + secondPoint 20 60 point3 firstPoint 30 60 + secondPoint 30 60 point4 firstPoint 20 60 + secondPoint 40 60 point5 firstPoint 10 60 + secondPoint 50 60

put (coord of southwest in dMainrectangle + (-25 25))shy(coord of south in dMainrectangle + (00 -50))shy

124

(coord of southeast in dMainrectangle + (25 25)) in c

put pointl--(pointl + (-1 0 30 -10 70)) in c put point2--(point2 + (-1 0 10 -10 85)) in c put point3--(point3 + (00 -10 90)) in c put point4--(point4 + (1 0 -10 85)) in c put point5--(point5 + (30 -1 0 70)) in c

put Text with [text=smallt] at point3 + (00 -130) in c

rect = Rectangle with [length=300 width=200] r = put rect in main put Text with [text=ll] in main rectangle = put rect in form put Text with [text=$t-l$] in form

dl = put form at (-1400 -500) in main dll = put form at (-2000 -1000) in main dlr = put form at (-800 -1000) in main dlll put form at (-2300 -1500) in main dllr put form at (-1700 -1500) in main dlrl put form at (-1100 -1500) in main dlrr put form at (-500 -1500) in main

dr = put form at (1400 -500) in main drr = put form at (2000 -1000) in main drl = put forro at (800 -1000) in main drrr put form at (2300 -1500) in main drrl put form at (1700 -1500) in main drlr put form at (1100 -1500) in main drll put form at (500 -1500) in main

put Text with [text=l root[T]] at (-300 300) in main (-300 240)-gt(coord of north in mainr)

dots = Text with [text=dots] put dots at (-1400 -1000) in main put dots at (-2000 -1500) in main put dots at (-SOO -1500) in main put dots at (1400 -1000) in main put dots at (2000 -1500) in main put dots at (800 -1500) in main

125

(coord of southwest in mainr + (30 30))-gt (coord of north in maindlrectangle)

(coord of southeast in mainr + (-30 30))-gt (coord of north in maindrrectangle)

niceArrow(main dl dll dlr) niceArrow(main dll dlll dllr) niceArrow(main dlr dlrl dlrr) niceArrow(main dr drl drr) niceArrow(main drl drll drlr) niceArrow(main drr drrl drrr)

root[T]

rect = put Rectangle with [length=600 width=200l in form put Rectangle with [length=200 width=200] at (200 00) in form bullet = put Circle with [radius=10] at (200 00) in form

put Text with [text=IF] in main

fl put form at (700 00) in main f2 put form at (1500 00) in main f3 put form at (2300 00) in main f4 put form at (3100 00) in main

(coord of anglePoint(OO) in mainflbullet)-gt (coord of west in mainf2rect)

(coord of anglePoint(OO) in mainf2bullet)-gt (coord of west in mainf3rect)

(coord of anglePoint(OO) in mainf3bullet)-gt (coord of west in mainf4rect)

126

ptW = coord of west in mainflrect ptE = coord of east in mainf4rect

ptW + (-300 OO)-gtptW ptE + (300 OO)-gtptE

put Text with [text=R] at (3800 00) in main

ptS = coord of anglePoint(2700) in mainf4bullet ptS2 = ptS + (00 -350)

ptS--ptS2 ptS2 + (-50 00)--ptS2 + (50 00) ptS2 + (-35 -20)--ptS2 + (35 -20) ptS2 + (-20 -40)--ptS2 + (20 -40)

BIBLIOGRAPHIE

Adobe Systems Incorporated 1994 PostScript Language Reference Manual http j jwwwadobecomjproductsjpostscriptjpdfsjPLRMpdf

-- 2006 PDF Reference Version 17 Adobe Systems Incorporated 6th eacutedition

-- 201Oa Adobe Postscript 3 http j jwwwadobecomjproductsjpostscriptj

2010b PDF Developer Corner PDF Reference http j jwwwadobecomjdevnetjpdfjpdLreferencehtm1

Aho A V R Sethi et J D Ullman 1986 Compilers Principles Techniques and Tools Addison-Wesley

American Mathematical Society 2008 Why Do We Recommend LaTeX http j jwwwamsorgjpublicationsjauthorsjtexjlatexbenefits

Apple Computer Inc 1996 The TrueType Reference Manu al Apple Computer Inc Cupertino California

Bourgeois M 2010 Introduction to Drawing Diagrams with SDDL httpj jrivershyvalley tvjintroduction-to-drawing-structured-diagrams-in-sddlj

Bourgeois M et R Villemaire 201Oa laquoDrawing Structured Diagrams with SDDL raquo

TUGBoat vol 31 no 2 p 206-210

-- 201Ob SDDL http j jwwwinfo2uqamca-villemaireJjRecherchejSDDLj

Bowman J C 2007 laquoThe 3D Asymptote Generalization of Metapost Beacutezier Interposhylation raquo Proceedings in Applied Mathematics and Mechanics

Chomsky N 1956 laquoThree Models for the Description of Language raquo Information Theory IRE Transactions on vol 2 no 3 p 113-124

Cormen T A C E Leiserson R L Rivest et C Stein 2001 Introduction to Algoshyrithms The MIT Press

Davis M R Sigal et E Weyuker 1994 Computability Complexity and Languages Pundamentals of Theoretical Computer Science Morgan Kaufmann

Dhu D-Z et K-I Ko 2000 Theory of Computational Complexity Wiley

Gagnon Eacute 1998 laquoSableCC an Object-Oriented Compiler Framework raquo Meacutemoire de maicirctrise McGill University

128

-- 2009 ObjeetMacro - SableCC httpsableccorgwikiObjectMacro

Group O M 1999 Unified Modeling Language (version 13) Rapport Object Manashygement Group

Hammerlindl A J Bowman et T Prince 2010a Asymptote httpasympshytotesourceforgenet

-- 20lOb Asymptote The Veetor Graphies Language httpasympshytotesourceforgenet asymptote pdf

Hobby J 1992 laquo A Users Manual for MetaPost raquo Computing Science Technical Report vol 162

International Organization for Standardization 2008 Document Management - Elecshytronic Document File Format for Long-Term Preservation - Part 1 Use of PDF 14 (PDF A-1) ISO 19005-1 2005

Jr F S H et S M Kelley 2007 Computer Graphics using GpenGL Prentice-Hall 3e eacutedition

Knuth D 1968 The Art of Computer Programming Addison-Wesley

-- 1984 The TeXbook Reading Mass Addison-Wesley

-- 1986 The Metafontbook Reading Mass Addison-Wesley

-- 1999 Digital Typography Stanford California Center for the Study of Language and Information

Lamport L et D Bibby 1986 LATEX A Document Preparation System T 260 Citeseer

Lancaster D 2005 Approximating a Circle or an Ellipse using Four Bezier Cubic Splines Rapport Synergetics

Maplesoft 2010 Maple 14 User Manual

McNaughton R et H Yamada 1960 laquoRegular Expressions and State Graphs for Automata raquo -IRE Transactions on Electronic Computers no l p 39-47

Object Management Group 2009 UML httpwwwumlorgj

Oracle 2010 Java httpwwwjavacomj

Pierce B C 2002 Types and Programming Languages MIT Press

Riskus A 2006 laquoApproximation of a Cubic Bezier Curve by Circular Arcs and Vice Versa raquo Information Technology and Control vol 35 no 4 p 371-378

Rose K H 2008 XY-pic Home Page httptugorgapplicationsjXy-picj

129

Rose K H et al 2010 laquoXY-pic Users Guide raquo DIKU Universiteacute de Copenhague vol 1

Rumbaugh J M Blaha W Premerlani F Eddy et W Lorensen 1991 ObjectshyOriented Modeling and Design Prentiee-Hall

Saunders J H 1989 laquoA Survey of Objeet-Oriented Programming Languages raquo JOOP Journal of Object-Oriented Programming vol 1

Sabel J et D Friedman 1996 An Introduction to Refiection-Oriented Programming San Francisco Reflection 96

TeX Users Group 2009 MetaPost - TeX User Groups httptugorgmetaposthtml

TIOBE Software 2008 Tiobe Index httpwwwtiobecomindexphpcontentshy paperinfo tpeiindexhtml

Ullman J J Hopcroft et R Motwani 1979 Introduction to Automata Theory Lanshyguages and Computation Addison-Wesley

Van Zandt T 1993a PSTricks-PostScript Macros for Generie TEX httpwwwtexuniyaracrudocpsLugpdf

-- 1993b laquoPSTricks PostScript Macros for Generie 1EX Users Guide raquo Version 093 a http jjwww tug orgjapplicationsjPSTricks

Page 4: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux

TABLE DES MATIEgraveRES

LISTE DES FIGURES IX

REacuteSUMEacute XI

INTRODUCTION 1

CHAPITRE 1 PROBLEacuteMATIQUE ET OBJECTIFS 7

11 Description de la probleacutematique 7

111 Les notes de cours une mise en contexte 7

112 Domaine dapplication eacutelargi 8

12 Description des objectifs rechercheacutes 9

121 Inteacutegration avec JbTEX 9

122 Description de structures 10

123 Hieacuterarchie solide et extensible 10

124 Objectifs moindres 10

13 Analyse des solutions existantes 11

131 Paquets JbTEX standards 12

132 XY-pic 13

133 Metapost 14

134 Asymptote 15

135 Conclusion de lanalyse 17

14 Diagrammes repreacutesentatifs du domaine 18

141 Lapproche de Knuth 19

142 Description des exemples et des concepts preacutesents dans les diagrammes 20

CHAPITRE II STRUCTURE ET SOLUTION INFORMATIQUE 21

21 Objectifs dune structure dans une solution informatique 21

211 Les diffeacuterentes composantes dune solution informatique 21

vi

212 Consideacuterations pour une meacutethodologie de deacuteveloppement 23

22 La programmation orienteacutee-objet 24

221 Concepts de bases 24

222 Diffeacuterence avec la programmation baseacutee-objet 25

23 Meacutethode pour la conceptualisation dune hieacuterarchie 25

231 Origine de la meacutethode 26

232 Les diffeacuterentes eacutetapes de conceptualisation 26

24 Deacuteveloppement de la hieacuterarchie 27

241 Extraction des diffeacuterents concepts 27

242 Eacuteleacutements particuliers 27

CHAPITRE III EacuteLEacuteMENTS GRAPHIQUES 31

31 Courbes et segments en informatique 31

32 Courbes de Beacutezier 32

321 Deacutefinition 32

322 Deacutefinition alternative 33

323 Proprieacuteteacutes dune courbe de Beacutezier- 34

324 Deacutesavantages des courbes de Beacutezier 36

33 Splines cubiques 36

34 Le cas dun cercle 38

35 Structures informatiques dans les solutions deacutejagrave existantes 41

351 Postscript et PDF 42

352 Asymptote 43

CHAPITRE IV THEacuteORIE DES LANGAGES INFORMATIQUES 45

41 Theacuteorie des langages et automates 45

411 Les eacuteleacutement rie base dun langage (Aho Sethi et Ullman 1986) 46

412 Expressions reacuteguliegraveres 46

413 Automates 48

414 Lien entre langage reacutegulier et automate fini 51

vii

42 Grammaires 52

421 Deacutefinition dune grammaire formelle 52

422 Hieacuterarchie de Chomsky 54

423 Utiliteacute dans les langages de programmation 55

43 SableCC 56

431 Quest-ce que SabieCC 56

432 Avantages de SabieCC 56

44 Langage reacuteflexif 57

441 Deacutefinition dun langage reacuteflexif 57

442 Avantages 57

443 Deacutesavantages 58

CHAPITRE V MISE EN OEUVRE DE LA SOLUTION 59

51 Eacuteleacutements de langage en SDDL 59

511 Impleacutementation de la hieacuterarchie 59

512 Grammaire 60

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage 61

52 Reacutealisation en Java 63

521 Traverseacutee de larbre grammatical et exeacutecution 63

522 Deacutefinition dobjets quelconques 64

523 Gestion des erreurs 65

524 Structures de support 66

53 Accegraves agrave Postscript PDF et gTEX 66

531 Postscript 66

532 PDF 67

533 g1EX- 68

534 Geacuteneacuteration du code Asymptote 68

CHAPITRE VI REacuteALISATION DES DIAGRAMMES EN SDDL 71

61 Analyse du code des diagrammes existants 71

Vlll

611 Rappel des objectifs cruciaux agrave observer

612 Diagramme de compilation

613 Diagramme de tableau

614 Diagramme de Venn

62 Preacutesentation du produit final

621 Statistiques et documentation

622 Preacutesentation

623 Site web

63 Conclusion de notre analyse

CONCLUSION

APPENDICE A PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

APPENDICE B PREacuteSENTATION DE LA GRAMMAIRE DE SOOL

APPENDICE C PREacuteSENTATION DE LA HIEacuteRARCHIE

APPENDICE D PREacuteSENTATION DES DIAGRAMMES CHOISIS

BIBLIOGRAPHIE

72

73

75

78

79

80

80

81

81

83

85

91

97

105 shy

127

LISTE DES FIGURES

Figure Page

11 Code XY-pic pour un diagramme 14

12 Diagramme reacutesultant du code XY-pic 14

13 Code Metapost pour dessiner un triangle 15

14 Diagramme reacutesultant du code Metapost 15

15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin 16

16 Diagramme reacutesultant du code Asymptote 16

31 Courbes de Beacutezier lineacuteaire quadratique et cubique 34

32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier 38

33 Quart de cercle approximeacute par une courbe de Beacutezier 39

34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence 41

41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b 49

51 Extrait de la grammaire de SDDL pour une instruction 61

52 Code Java et SDDL pour calculer une combinaison lineacuteaire 63

53 Code reacuteflexif pour creacuteer une forme quelconque 65

54 Code pour geacuteneacuterer du code Asymptote pour un cercle 69

61 Diagramme dautomate de compilation 73

62 Code pour le diagramme dautomate 74

63 Diagramme de tableau 76

64 Code pour le diagramme de tableau 77

65 Diagramme de Venn 78

x

66 Code du diagramme de Venn 79

REacuteSUMEacute

Dans ce meacutemoire nous analysons la description de diagrammes structureacutes dans le domaine des matheacutematiques discregravetes et de linformatique theacuteorique Cette analyse seffectue agrave partir de meacutethodes eacutetablies du geacutenie logiciel Nous trouvons un ensemble de proprieacuteteacutes que nous recherchons dans une solution informatique nous permettant de creacuteer ces diagrammes Nous analysons aussi les outils classiques agrave partir des proprieacuteteacutes preacuteceacutedentes qui nous permettent de reacutealiser ces diagrammes dans un environnement I51EX Nous observons que ces outils ne sont pas aussi puissants quils le pourraient en fonction des proprieacuteteacutes eacutetablies par notre analyse

Par la suite en nous basant sur les meacutethodes de repreacutesentation graphique des courbes et sur la theacuteorie des langages informatiques nous jetons les bases dun lanshyguage de description Nous preacutesentons aussi un outil deacuteveloppeacute en Java qui nous pershymet de deacutecrire aiseacutement nos diagrammes dinformatique theacuteorique et de matheacutematiques discregravetes agrave partir dune hieacuterarchie dobjets claire et extensible Nous avons impleacutementeacute les eacuteleacutements essentiels de notre langage en SDDL (Structured Diagram Description Lanshyguage) Nous lavons aussi valideacute agrave laide dexemples repreacutesentatifs tireacutes de sources daushytoriteacute Nous avons finalement preacutesenteacute notre solution dans le cadre de la confeacuterence TUG 2010 Nous lavons aussi preacutesenteacute avec un article dans la revue du TeX Users Groups TUG

Mots cleacutes diagrammes informatique theacuteorique matheacutematiques discregravetes langage

INTRODUCTION

Le logiciel de mise en page de document U1EX est devenu llne reacutefeacuterence pour la creacuteation

de documents matheacutematiques (American Mathematical Society 2008) Plusieurs raisons

suscitent cet inteacuterecirct une structure naturelle permettant de repreacutesenter clairement ses

ideacutees le formatage automatique de qualiteacute et un reacutesultat final de qualiteacute professionnelle

agrave un coucirct moindre

Un traiteacute matheacutematique peut contenir plusieurs types dobjets textes formules grashy

phiques diagrammes etc Dans le cas preacutesent nous nous inteacuteressons principalement agrave

la repreacutesentation de diagrammes Par diagramme on entend un dessin qui possegravede une

structure discregravete sous-jacente (souvent combinatoire mais pas obligatoirement) Un

exemple simple serait un graphe ou un arbre

Agrave partir du moment ougrave nous nous inteacuteressons agrave ces diagrammes et agrave leur repreacutesentation

il devient inteacuteressant de voir ce que U1EX nous fournit afin de geacuteneacuterer des structures

de qualiteacute En effet les diagrammes sont essentiels agrave la transmission effective des ideacutees

et des reacutesultats en informatique et en matheacutematiques discregravetes De plus la consistance

nous oblige agrave chercher agrave faire nos diagrammes agrave partir dun modegravele coheacuterent Entre

autres il nous faut conserver la mecircme police dans les diagrammes et dans le texte

en plus davoir accegraves aux symboles matheacutematiques Nous pourrions aussi importer des

diagrammes exteacuterieurs agrave U1EX mais les reacutesultats obtenus ne serait pas consistant avec

le texte Nous devons donc chercher agrave obtenir une meacutethode de repreacutesentation adeacutequate

pour nos diagrammes

Bien sucircr il existe deacutejagrave plusieurs solutions agrave ce problegraveme Il nous faut donc les analyser

avec soin avec des critegraveres formels Cela implique de reacutepertorier les diffeacuterents paquets

U1EX permettant de faire du dessin avec leurs diffeacuterentes proprieacuteteacutes Il faut ensuite

2

ajouter les logiciels qui utilisent JbTEX indirectement donc qui nen font pas partie

mais sen servent tout de mecircme Cela nous donne une vue densemble complegravete des

solutions deacutejagrave existantes agrave notre problegraveme

Ensuite avant de penser agrave analyser ces solutions nous devons deacuteterminer ce que nous

voulons exactement Agrave cette fin nous avons analyseacute le processus qua utiliseacute Donald

Knuth creacuteateur de TEX agrave la base de Jb1EX afin de mateacuterialiser son logiciel de formatage

Nous devons aussi utiliser un ensemble de contraintes agrave soumettre agrave nos diffeacuterentes

solutions Il eacutetait essentiel dutiliser Jb1EX pour le formatage du texte mais aussi pour

la clarteacute deacutecriture la qualiteacute de la documentation et la capaciteacute de creacuteer aiseacutement des

structures Par la suite il devient aiseacute et tregraves formel danalyser chacunes des diffeacuterentes

solutions proposeacutees

Malheureusement cette analyse nous a permis de constater quaucune solution neacutetait

suffisamment bonne pour satisfaire nos besoins La plupart des paquets eacutetaient trop

simples alors que plusieurs eacutetaieentiernt composeacutes de macros rendant la veacuterification de

code quasi impossible Quelques solutions (telles que XY-Pic (Rose 2008) Metapost

(TeX Users Group 2009) et Asymptote (Hammerlindl Bowman- et Prince 2010a))

fournissaient de nombreuses ideacutees inteacuteressantes mais aucune ne convenait parfaitement

agrave nos besoins Nous en sommes donc venus agrave la conclusion que la meilleure solution

serait de creacuteer notre propre solution tout en reacuteutilisant les ideacutees deacuteveloppeacutees par les

solutions preacuteceacutedentes

Afin de creacuteer une solution robuste nous avons deacutecideacute de creacuteer une hieacuterarchie orienteacutee obshy

jet afin de repreacutesenter les diffeacuterentes structures du domaine des matheacutematiques discregravetes

et de linformatique theacuteorique Cela se justifie par le fait que les hieacuterarchies objets aushy

delagrave de leurs avantages possegravedent des meacutethodes de conceptualisation formelles et bien

deacutefinies Nous avons utiliseacute la meacutethode favoriseacutee par James Rumbaugh (Rumbaugh

et al 1991) un des creacuteateurs de UML (Object Management Group 2009)

Ce processus demande en tout premier lieu une analyse du domaine afin dobtenir les

structures principales Par la suite les liens entre les diffeacuterentes classes sont analyseacutes en

3

fonction des besoins respectifs Finalement apregraves plusieurs iteacuterations et simplifications

cette meacutethode foumit une hieacuterarchie complegravete Par contre elle doit par la suite ecirctre

adapteacutee aux speacutecificiteacutes du langage dimpleacutementation

Notre hieacuterarchie a eacuteteacute deacuteveloppeacutee autour de plusieurs concepts importants Certains

sont naturellement lieacutes au domaine dutilisation Par exemple un point est une structure

naturelle pour la description de positions dans un diagramme Le mecircme raisonnement

sapplique pour des formes geacuteomeacutetriques de base comme le cercle le carreacute et lellipse

Certains objets sont des simplifications de concepts communs Par exemple un point

abstrait est un point qui peut ecirctre deacutetermineacute de maniegravere absolue ou relative Une forme

est une classe de base repreacutesentant lensemble des objets qui peuvent ecirctre dessineacutes Il

existe aussi un dessin qui repreacutesente une forme agrave un endroit particulier

Bien que cela pourrait deacuteterminer complegravetement notre domaine afin davoir une hieacuteshy

rarchie complegravete il faut inclure certains eacuteleacutements de structure Par exemple bien que

nous puissions deacuteterminer assez aiseacutement ce quest un cercle la maniegravere de le deacutecrire

pour ecirctre dessineacute nest pas aussi simple Il en est de mecircme pour des formes courbes

plus complexes ainsi que des courbes de maniegravere geacuteneacuterale car un ordinateur ne peut pas

repreacutesenter aiseacutement toutes formes de chemin Nous pouvons creacuteer un concept geacuteneacuteral

de chemin mais celui-ci doit se ramener agrave la reacutealiteacute dun ordinateur

Cela est deacutetermineacute en analysant deux choses le format de document PDF et la desshy

cription de chemin dAsymptote Le premier utilise des splines cubiques comme eacuteleacutement

de base pour deacutecrire les courbes dans un document Cest inteacuteressant mais limitatif

Asymptote de son cocircteacute prend une description complexe mais preacutecise dune courbe et

en deacuteduit un ensemble de splines cubiques quil est possible de placer dans un docushy

ment PDF ensuite Nous en concluons que le bon chemin agrave prendre est probablement

dimpleacutementer comme structure de base des chemins tels que deacutecrits par Asymptote

avec une structure de splines cubiques

Par contre certaines questions theacuteoriques surviennent lors de cette analyse Le grand

problegraveme relegraveve de la puissance dexpression des splines cubiques En effet nous verrons

4

que les splines cubiques sont puissantes mais pas suffisamment puissantes pour deacutecrire

un cercle une forme geacuteomeacutetrique pourtant extrecircmement simple Nous verrons par contre

par la suite quil est possible de deacutecrire ce mecircme cercle avec des splines cubiques avec

une preacutecision acceptable pour la creacuteation de documents papier malgreacute son inexactitude

Afin dadapter la hieacuterarchie un langage dimpleacutementation a ducirc ecirctre choisi Eacutetant donneacute

les contraintes de temps il fucirct deacutecideacute de reacuteutiliser un langage de description de diashy

grammes deacutejagrave existant Asymptote Lutilisation de ce langage nous permet dobtenir

des primitives simples et un accegraves agrave Jb1EX deacutejagrave deacutetermineacute ce qui diminue de beaucoup la

charge de travail De plus Asymptote nous permet de creacuteer nos images reacutesultantes dans

les formats Postscript (Adobe Systems Incorporated 2010a) et PDF (Adobe Systems

Incorporated 2010b) sans avoir agrave reacutealiser nous-mecircmes du code de tregraves bas niveau

Eacutevidemment si Asymptote fournissait tout ce dont nous avions besoin nous naurions

pas besoin dutiliser autre chose Par contre cest un langage baseacute sur les structures

(Hammerlindl Bowman et Prince 201Ob) au lieu des objets Cela implique que notre

hieacuterarchie ne peut ecirctre construite agrave laide de lheacuteritage objet Eacutetant donneacute la complexiteacute

que cela engendrerait un langage suppleacutementaire doit-ecirctre utiliseacute pour-la creacuteation de

la hieacuterarchie Cela nous amegravene donc agrave choisir Java (Oracle 2010) Une recherche de la

compagnie TIOBE considegravere Java comme eacutetant le langage le plus utiliseacute au moment de

la preacutesente reacutedaction (TIOBE Software 2008)

Avant de consideacuterer le deacuteveloppement dun nouveau langage la premiegravere chose agrave faire

consiste agrave consideacuterer ce agrave quoi nous voulons quil ressemble Afin de reacutealiser cette eacutetape

nous avons analyseacute notre base de diagrammes en donnant une description la plus proche

possible dun langage de programmation En simplifiant chaque description autant que

possible nous avons pu extraire quelques concepts de base importants pour la descripshy

tion de nos diagrammes De plus certaines contraintes suppleacutementaires peuvent ecirctre

ajouteacutees qui deacutependent plus de limpleacutementation que de la theacuteorie En quelque sorte

il faut pour reacutealiser notre projet nous baser sur des technologies qui ont fait leurs

preuves

5

Afin de deacutevelopper notre langage il nous faut des concepts pour le deacutecrire Cela sefshy

fectue agrave laide de la theacuteorie des langages et des automates Plus particuliegraverement nous

utiliserons les grammaires afin de faccedilonner un langage qui convient agrave nos besoins tout en

eacutetant simple agrave analyser par un programme informatique agrave laide dun logiciel speacutecialiseacute

SabieCC (Gagnon 1998) Nous verrons que les grammaires nous permettent de deacutecrire

complegravetement notre langage afin decirctre analyseacute par ordinateur

Une fois que nous avons notre langage final il ne reste plus quagrave veacuterifier les reacutesultats

obtenus Afin de boucler la boucle nous avons reacutealiseacute la programmation de chacun des

diagrammes que nous avions choisis au deacutepart pour notre base de tests Une fois ceuxshy

ci reacutealiseacutes il ne restait plus quagrave analyser les diffeacuterences entre les deux et voir si les

reacutesultats obtenus eacutetaient satisfaisants Cela nous permet de deacutemontrer quil sagit dune

solution naturelle et efficace eacutetant donneacute que nous pouvons creacuteer les objets de notre

domaine pour produire des diagrammes de grande qualiteacute

Le reste de ce meacutemoire est structureacute comme suit Le chapitre 1 expose la probleacutematique

et les objectifs rechercheacutes Le chapitre 2 introduit la creacuteation de notre solution inforshy

matique et plus speacutecifiquement de la hieacuterarchie objet Le chapitre 3 deacutecrit la theacuteorie

matheacutematique derriegravere la description de courbes et segments par ordinateur Le chapitre

4 expose les dessous de la theacuteorie des langages que nous utilisons afin de creacuteer SOOL

Le chapitre 5 expose la creacuteation du langage au-dessus de la hieacuterarchie Finalement le

chapitre 6 analyse le reacutesultat final afin de voir si le tout reacutepond aux objectifs deacutefinis au

deacutepart

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CHAPITRE l

PROBLEacuteMATIQUE ET OBJECTIFS

Dans ce chapitre nous nous eacutetendrons sm une deacutefinition correcte et complegravete de la

probleacutematique ainsi que sur les objectifs que nous souhaitons atteindre Nous verrons

aussi une analyse des solutions qui existent deacutejagrave et les raisons qui nous poussent agrave

deacutevelopper notre propre solution Finalement nous deacutefinirons une base de diagrammes

aptes agrave repreacutesenter adeacutequatement nos objectifs

11 Description de la probleacutematique

111 Les notes de cours une mise en contexte

Ce projet fut motiveacute principalement par la reacutedaction de notes de cours En effet

dans un milieu universitaire (particuliegraverement pour les eacutetudiants au baccalaureacuteat mais

eacutegalement pour les eacutelegraveves de cycles supeacuterieurs) il est extrecircmement utile de pouvoir

utiliser des notes de cours de quali teacute

La creacuteation de notes de cours adapteacutees vient tout de mecircme avec quelques problegravemes

Premiegraverement surtout en informatique la plupart des livres sont eacutecrits en anglais Cela

implique souvent de devoir eacutecrire nos propres versions sous la forme de notes de cours

De plus linformatique est un domaine qui eacutevolue agrave un rythme fulgurant Cela implique

que des notes adeacutequates et adapteacutees doivent ecirctre agrave jour Comme certains eacuteleacutements en

informatique peuvent eacutevoluer agrave chaque anneacutee voire plus vite il faut ecirctre capable deacutecrire

extrecircmement rapidement des textes si nous souhaitons quils soient utiles un tant soit

8

peu

Cela nous amegravene agrave notre probleacutematique principale plusieurs cours neacutecessitent un supshy

port plus complexe que simplement des mots agrave savoir des dessins et des diagrammes

voire des animations Cela est requis dans plusieurs cours en informatique theacuteorique

particuliegraverement dans leacutetude des structures de donneacutees et des algorithmes Il nous faut

donc une meacutethode rapide et efficace pour creacuteer des diagrammes agrave placer dans nos notes

de cours

112 Domaine dapplication eacutelargi

Bien eacutevidemment cibler purement les notes de cours et les structures de donneacutees nest

quun point de deacutepart Nous pouvons eacutelargir notre domaine dapplication agrave des diashy

grammes structureacutes cest-agrave-dire un dessin qui possegravede une structure sous-jacente crushy

ciale au point de pouvoir necirctre deacutecrit quagrave partir de cette structure Par exemple

un graphe est un ensemble de sommets eacutetiqueteacutes relieacutes ensemble par des flegraveches Tout

dessin de graphe est donc un dagramm~ selon notye deacutefiniton Dun_autre cocirct~ une

peinture possegravede parfois une structure mais celle-ci est largement insuffisante pour

deacutecrire loeuvre Par exemple pertgtonne noserait deacutecrire un Picasso comme eacutetant un

amas de cercles et de carreacutes de diffeacuterentes couleurs

Lensemble des structures que nous visons se rapporte donc essentiellement agrave deux

domaines linformatique theacuteorique et les matheacutematiques discregravetes Linformatique

theacuteorique est surtout deacutefinie par les structures de donneacutees et les algorithmes (et tout

sujet sy reliant) Les matheacutematiques discregravetes sont surtout deacutefinies par la theacuteorie des

graphes et la combinatoire Nous neacutegligeons ici volontairement les matheacutematiques contishy

nues pour deux raisons La premiegravere est quune structure de taille infinie peut souvent

ecirctre repreacutesenteacutee par une structure finie (donc discregravete) La seconde est que les besoins

en matheacutematiques continues sont largement diffeacuterents des besoins en matheacutematiques

discregravetes En effet dessiner le graphe dune fonction de deux variables est un sujet comshy

plexe mais totalement diffeacuterent de creacuteer un graphe Afin de rendre nos besoins plus

9

speacutecifiques nous eacuteviterons ce genre de dessins qui possegravedent deacutejagrave de nombreux logiciels

pour les reacutealiser (entre autres Maple) (Maplesoft 2010)

12 Description des objectifs rechercheacutes

La premiegravere partie de notre travail consiste agrave deacutecrire les objectifs que nous souhaitons

atteindre dans notre creacuteation de diagrammes En effet plusieurs paramegravetres importants

peuvent ecirctre utiliseacutes Il est donc important de ne pas perdre de vue lensemble tout en

donnant la prioriteacute agrave certains eacuteleacutements

121 Inteacutegration avec ~IEX

Ib1EX est un langage de description de documents texte Creacuteeacute agrave lorigine sous la forme

de TEX par Donald Knuth (Knuth 1984) puis modifieacute par Leslie Lamport (Lamport

et Bibby 1986) celui-ci est rapidement devenu un standard dans la reacutedaction darticles

scientifiques dans plusieurs domaines Bien quutiliseacute surtout pour la reacutedaction darticles

il a eacuteteacute preacutevu au deacutepart pour la reacutedaction de livres Il se distingue par sa capaciteacute agrave

creacuteer aiseacutement du contenu matheacutematique et le fait de soccuper du contenu en laissant

le logiciel soccuper de la mise en page du texte Il est si populaire que de nombreux

meacutemoires incluant celui-ci sont eacutecrits agrave partir de Ib1EX

Eacutetant donneacute que le monde des matheacutematiques et de linformatique theacuteorique utilise

abondamment Ib1EX il est important quun logiciel de creacuteation de diagrammes pershy

mette de lutiliser En effet si notre objectif est de creacuteer du contenu de qualiteacute professhy

sionnelle il faut que les polices soient constantes au travers de notre article (ou de nos

notes de cours) Naturellement plusieurs diagrammes vont contenir du texte Il faut

donc pour ecirctre consistant geacuteneacuterer ce texte avec Ib1EX afin davoir une forme standard

pour lensemble du document De plus il est tout agrave fait possible de vouloir mettre des

symboles matheacutematiques dans un diagramme (par exemple un symbole dinteacutegrale) Si

le texte est geacuteneacutereacute avec Ib1EX cela vient automatiquement Sinon il devient tregraves difficile

dobtenir un texte de belle qualiteacute Il sagit donc dun besoin primordial

10

122 Description de structures

Un autre eacuteleacutement extrecircmement important que nous recherchons est de pouvoir faire

adeacutequatement la description de diffeacuterentes structures Eacutetant donneacute que les diagrammes

sont composeacutes de structures il faut pouvoir en creacuteer aiseacutement et les relier de maniegravere

aiseacutee Cela implique quelques petites contraintes entre autres de pouvoir utiliser des

variables pour conserver les structures en question Ideacutealement la solution la plus solide

en terme de description de structures utiliserait lorienteacute-objet Une des composantes

les plus importantes dune solution orienteacutee objet est la preacutesence dune hieacuterarchie de

classes dobjets

123 Hieacuterarchie solide et extensible

Un objectif que nous recherchons est que le langage nous fournisse une hieacuterarchie dobshy

jets (ou de structures) de qualiteacute afin de pouvoir creacuteer une grande quantiteacute de diashy

grammes agrave partir deacuteleacutements de cette hieacuterarchie Une hieacuterarchie peut ecirctre deacutecrite comme

eacutetant une structure permettant dinteacutegrer facilemen~ de nouveau~ aspects sans_avoir agrave

dupliquer inutilement du code Il serait aussi important quelle puisse ecirctre eacutetendue si cershy

tains eacuteleacutements suppleacutementaires sont neacutecessaires Par exemple il pourrait ecirctre inteacuteressant

pour des gens en geacutenie eacutelectrique de pouvoir faire des diagrammes eacutelectriques malgreacute

le fait que cela ne fait pas partie de nos contraintes de deacutepart Cela pourrait ecirctre ajouteacute

par extension du systegraveme

124 Objectifs moindres

Gestion des erreurs

Dans des notes de cours il est freacutequent davoir des diagrammes Par contre eacutecrire

un diagramme peut saveacuterer plus compliqueacute que deacutecrire du texte Comme plusieurs

utilisateurs potentiels ne seront pas des experts du systegraveme il faut que les erreurs soient

deacutetecteacutees et traiteacutees de maniegravere adeacutequate Cela assure agrave lutilisateur final une expeacuterience

11

plaisante en speacutecifiant les erreurs quil commet et des meacutethodes pour les reacuteparer Sil

faut que lutilisateur cherche pendant des heures pour trouver la petite erreur quil a

commise il va tout simplement cesser dutiliser le logiciel

Langage fluide et clair

Bien que moins important le fait davoir un langage clair est excellent pour attirer les

utilisateurs vers ce systegraveme En effet si le langage est un gribouillis incompreacutehensible il

sera fort probablement dur dapprentissage et difficile agrave aborder Par fluide et clair nous

entendons que le langage soit jusquagrave un certain point compreacutehensible pour quelquun

qui ne connaicirct pas le systegraveme

Qualiteacute de la documentation et courbe dapprentissage

Finalement il faut quune documentation existe et quelle soit complegravete De preacutefeacuterence

une bonne documentation contiendra un reacutepertoire de toutes les fonctionnaliteacutes mais

aussi des tutoriels avec des exemples codeacutes de cas standards Cela incite les utilisateurs

agrave essayer le logiciel en prenant un exemple et en ladaptant agrave leurs besoins Cela amegravene

(avec les autres objectifs) agrave un langage simple dapprentissage mais tout de mecircme

puissant Comme notre objectif est de trouver une solution simple il faut que nimporte

qui puisse commencer agrave sen servir rapidement sans avoir besoin de lire lensemble de

la documentation

13 Analyse des solutions existantes

Naturellement une fois que nous savons ce que nous recherchons il nous faut analyser

toutes les solutions qui existent deacutejagrave Cela nous permettra didentifier une solution qui

est deacutejagrave fonctionnelle ou au mieux une qui pourra ecirctre eacutetendue ou utiliseacutee afin de

simplifier le travail de creacuteation si besoin est Au minimum nous pourrons extraire les

concepts inteacuteressants de chaque solution et voir sil est possible de les inteacutegrer agrave notre

solution

12

131 Paquets f1TEX standards

Eacutetant donneacute limportance de lutilisation de JbIEX les premiegraveres solutions sont celles

disponibles agrave linteacuterieur mecircme de fbIEX Celles-ci sont appeleacutees des paquets Plusieurs

paquets diffeacuterents existent et bon nombre dentre eux sont des solutions bricoleacutees et

donc incomplegravetes

Dans les solutions inteacuteressantes on note premiegraverement la preacutesence de la commande

picture Celle-ci a eacuteteacute ajouteacutee dans TEX par Donald Knuth comme tme solution agrave tout

oubli potentiel dans son systegraveme Cette commande prend du texte quelconque et le passe

par la suite au pilote qui compile le document Cela permet entre autres de transfeacuterer

des informations au pilote qui compile en Postscript et permet donc lutilisation de toute

la force de Postscript dans la reacutedaction de dessin Un gros problegraveme de cette solution

est que le texte agrave eacutecrire deacutepend du pilote utiliseacute limitant de beaucoup son utilisation

Il est tout de mecircme devenu la base de nombreux paquets qui se servent de Postscript

Plusieurs solutions ont aussi eacuteteacute deacuteveloppeacutees pour toutes sortes de domaines On retrouve

entre autres des-diagrammes de-Peynmann et deuml Lewis (feyn et-lewis) des dia-grammes

de flots (nassflow) et des arbres linguistiques (xyling rst qtree et lingtrees)

Naturellement ces solutions ne conviennent pas car elles sont pour des domaines trop

speacutecifiques par rapport agrave notre objectif

Une solution dun domaine plus geacuteneacuteral qui se deacutemarque est le paquet PSTricks (Van

Zandt 1993a) Creacuteeacute en 1993 par le professeur Timothy Van Zandt celui-ci est devenu

tregraves populaire au fil des anneacutees eacutetant donneacute les nombreuses possibiliteacutes qui existent en

Postscript Un des grands avantages est sa documentation qui est tregraves prolifique et tregraves

claire (Van Zandt 1993b)

Cela est bien inteacuteressant mais malheureusement PSTricks souffre du mecircme problegraveme

que chaque paquet interne agrave JbTEXmiddot Il est fait agrave partir de macros En effet TEX a eacuteteacute eacutecrit

complegravetement agrave partir de macros Il sagit dlm meacutecanisme de remplacement textuel ougrave

lon deacutefinit une entreacutee et toutes les occurrences de cette entreacutee sont remplaceacutees par une

13

sortie bien speacutecifique Comme une macro est toujours remplaceacutee par son contenu avant

decirctre analyseacutee plus en deacutetail toute forme derreur se retrouve agrave un niveau extrecircmement

bas Cela fait que nimporte quelle erreur est quasi impossible agrave cerner correctement

rendant le travail de lutilisateur qui souhaite apprendre tregraves complexe De plus le fait

de fournir le Postscript directement agrave lutilisateur rend celui-ci tregraves puissant mais tregraves

dangereux Finalement bien que de nombreuses formes soient disponibles il nexiste

pas de hieacuterarchie en tant que telle dans PSTricks ce qui le rend impossible agrave eacutetendre

132 )(J(-pic

Une autre solution inteacuteressante peut ecirctre retrouveacutee agrave linteacuterieur de gTEX Il sagit

de XV-pic un paquet eacutecrit par Kristoffer H Rose (Rose et al 2010) Ce paquet

a eacuteteacute creacuteeacute speacutecifiquement pour la description de diagrammes agrave linteacuterieur de gTEX

et possegravede une documentation exhaustive Malheureusement cette documentation est

extrecircmement complexe mecircme pour un utilisateur avanceacute XV-pic utilise principalement

des boicirctes gTEX positionneacutees agrave diffeacuterents endroits afin de creacuteer les diagrammes Ceuxshy

ci sont par la suite relieacutes par diffeacuterents objets puis deacutecoreacutes Cela fournit un reacutesultat

final de qualiteacute XV-pic possegravede entre autres un mode pour creacuteer des diagrammes en

positionnant les eacuteleacutements dans une matrice Cela rend les dessins plus simples concepshy

tuellement mais pas toujours positionneacutes adeacutequatement XV-pic permet aussi de faire

du positionnement relatif agrave dautres objets ce qui peut ecirctre tregraves pratique Comme nous

pouvons le voir dans lexemple suivant XV-pic est tregraves pratique dans les reacutesultats quil

nous permet dobtenir mais sa syntaxe laisse de beaucoup agrave deacutesirer

Par contre les deacutefauts de XV-pic sont extrecircmement visibles En premier lieu la syntaxe

du langage est extrecircmement difficile agrave comprendre car elle est baseacutee sur la composition

de nombreux caractegraveres speacuteciaux De plus comme il sagit dun paquet gTEX le tout

est impleacutementeacute agrave laide de macros et rend donc la recherche derreur laborieuse (surshy

tout lorsquon prend en compte la syntaxe deacutejagrave difficile agrave utiliser) Cela rend XV-pic

inapte agrave lutilisation par quelquun qui ne souhaite pas investir trop de temps dans son

apprentissage Finalement les nombreux modes de dessins sont souvent incompatibles

14

xymatrix U ar_[ddr]_y ar-[drr]-x

argt[dr] I-(xy) amp X times_Z y ar[d]-q ar[r]_p amp X ar[d]_f amp y ar[r]-g

amp Z

Figure 11 Code XY-pic pour un diagramme

Figure 12 Diagramme reacutesultant du code XY-pic

entre eux et ne peuvent souvent pas ecirctre utiliseacutes dans un mecircme dessin

133 Metapost

Eacutetant donneacute le problegraveme commun agrave tous les paquets agrave linteacuterieur de JgEX la solution la

plus logique serait dessayer den sortir Cela a donneacute le logiciel Metapost (Hobby 1992)

Celui-ci a eacuteteacute inspireacute de Metafont (Knuth 1986) que Knuth a utiliseacute pour dessiner des

polices pour EX Une des grandes avanceacutees du langage est la description de courbes

Celui-ci reacuteutilise un algorithme de Knuth qui permet de deacutecrire des courbes tout en

en controcirclant les diffeacuterents paramegravetres De plus comme le logiciel nest pas reacutedigeacute en

macros il permet de deacutetecter de maniegravere adeacutequate les erreurs de lusager Nous pouvons

deacutejagrave voir dans le code fourni en exemple quil sagit dun langage beaucoup plus clair

que XV-pic

15

beginfig(l)

pair A B C A=(OO) B=(lcmO) C=(Olcm) draw A--B--C--cycle

endfig

Figure 13 Code Metapost pour dessiner un triangle

Figure 14 Diagramme reacutesultant du code Metapost

Par contre quelques problegravemes se deacutegagent de Metapost Premiegraverement le langage ne

permet pas limpleacutementation dune hieacuterarchie solide Cela ne serait pas un problegraveme sil

en existait deacutejagrave une mais ce nest pas le cas En effet les diagrammes ont fait lobjet

dune extension du langage mais rien de tregraves deacuteveloppeacute Il est donc faisable de faire

des diagrammes mais il ne sagit pas neacutecessairement dune solution agrave toute eacutepreuve

De plus comme toutes les coordonneacutees du langage sont donneacutees en valeur absolue cela

limite les possibiliteacutes du langage (entre autres en ne pouvant utiliser des points deacutefinis

par des objets)

134 Asymptote

Une autre possibiliteacute se retrouve dans le logiciel Asymptote qui se deacutefinit comme eacutetant

Wl langage inspireacute de Metapost (Hammerlindl Bowman et Prince 2010b) Il est donc

aussi externe agrave g1EX mais aussi inspireacute du langage de programmation CH Cela lui

confegravere la creacuteation de structures avanceacutees et la creacuteation de fonctions complexes De

plus une documentation exhaustive et un traitement des erreurs de qualiteacute en font une

solution robuste

Malheureusement comme Metapost Asymptote pose quelques problegravemes En effet ce

16

size(3cm) draw(unitsquare) labelC l $A$ (00) SW)

labelC $B$ Cl 0) SE) label ($C$ Cl 1) NE)

label ($0$ (01) NW)

Figure 15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin

( )

il

Figure 16 Diagramme reacutesultant du code Asymptote

logiciel fut eacutecrit avec les matheacutematiques continues et la geacuteomeacutetrie comme domaine

dutilisation Ce nest pas Lill problegraveme en tant que tel (Asymptote le fait tregraves bien)

mais cela fait que la- creacuteation de diagrammes discrets nest pas vraiment deacuteveloppeacutee

Il faudrait donc ecirctre capable de creacuteer une hieacuterarchie de structures pour la creacuteation de

diagrammes Eacutetant donneacute le support des structures posseacutedant des fonctions internes il

devrait ecirctre possible dajouter cette possibiliteacute agrave Asymptote

Malheureusement ce nest pas preacutesentement reacutealisable agrave linteacuterieur du langage En efshy

fet Asymptote est un langage baseacute objet Cela signifie quil possegravede des structures qui

ressemblent agrave une description typique dun objet mais pas toutes les proprieacuteteacutes imshy

portantes qui se rattachent agrave un langage agrave objets standard comme Java ou C++ Plus

particuliegraverement cest labsence de polymorphisme qui cause problegraveme En effet la

creacuteation dune hieacuterarchie implique de creacuteer des liens entre les diffeacuterentes structures Par

exemple un cercle un triangle et un nuage sont toutes des formes avec certaines proshy

prieacuteteacutes similaires Il nous faut donc avoir des fonctions qui prennent des formes comme

paramegravetres Si nous avons une fonction f qui prend une forme nous souhaiterions eacutecrire

une seule fonction

17

fCforme)

Malheureusement en Asymptote il faudrait eacutecrire une fonction pour chaque forme

distincte comme cela

fCcercle)

fCcarre)

fCnuage)

Cela rend la creacuteation dune hieacuterarchie extrecircmement difficile car pour chaque fonction

utilisant un objet plus geacuteneacuteral il nous faut eacutecrire plusieurs fois cette fonction De plus

cela rend lexpansion par lusager de la hieacuterarchie essentiellement impossible car il doit

rajouter des cas pour chaque fonction deacutefinie preacuteceacutedemment en plus dajouter son nouvel

objet dans la hieacuterarchie Cela est difficilement souhaitable

135 Conclusion de lanalyse

Afin den venir agrave une conclusion adeacutequate il faut se ramener aux objectifs rechercheacutes

Cela nous permet de rapidement eacuteliminer les solutions internes agrave Ib-TEX eacutetant donneacute

la complexiteacute de la gestion des erreurs (et indirectement la courbe dapprentissage du

langage) Cela nous laisse comme solution Metapost et Asymptote Naturellement le

langage Asymptote est plus eacutevolueacute que celui de Metapost et fournit des eacuteleacutements de

programmation plus inteacuteressants Cela implique donc quil nous permet plus aiseacutement

de construire nos structures tant deacutesireacutees

Par contre Asymptote ne fournit pas une solution suffisante eacutetant donneacute quil ne possegravede

pas une hieacuterarchie dobjets adapteacutee aux diagrammes De plus eacutetant donneacute que le langage

est baseacute objet il sera beaucoup trop compliqueacute dy implanter une hieacuterarchie Nous en

venons donc agrave la conclusion que le mieux serait dutiliser Asymptote qui nous fournit un

ensemble de services complexes (impleacutementation des chemins liens avec Ib-TEX etc )

et de limpleacutementer avec un langage de plus haut niveau

18

Java devient un choix inteacuteressant pour cette tacircche En effet cest un langage connu dans

lindustrie et simple dapprentissage Il sagit dun langage de programmation objet qui

nous permettra agrave coup sucircr dimpleacutementer une hieacuterarchie solide Par contre ce langage

possegravede quelqu~s petits problegravemes comme un tregraves haut niveau de verbositeacute et beaucoup

deacuteleacutements non requis pour la description de diagrammes

Nous en sommes donc venus agrave la conclusion que la meilleure solution serait dutiliser

Java mais dimpleacutementer par-dessus celui-ci un langage deacutedieacute qui eacuteliminerait tout ce

qui nest pas requis pour la description des diagrammes Nous appellerons ce langage

SDDL pour Structured Diagram Description Language

Concepts inteacuteressants agrave conserver

Avant de penser agrave concevoir notre logiciel il serait bon de voir quels eacuteleacutements nous

souhaitons conserver des solutions existantes Agrave cette fin leacuteleacutement le plus inteacuteressant

provient de XV-Pic En effet il permet de relier des objets entre eux par des flegraveches

dune maniegravere relativement simple Il serait donc inteacuteressant de pouvoir permettre de

deacutecrire des liens entre diffeacuterents objets par des points speacutecifiques agrave chacun dentre eux

De plus lalgorithme de description de chemins utiliseacute par Metapost et Asymptote est

extrecircmement efficace et utile et pourrait donc ecirctre utiliseacute directement par notre langage

Cela sera simple agrave impleacutementer eacutetant donneacute que nous souhaitons utiliser Asymptote pour

compiler vers Postscript

14 Diagrammes repreacutesentatifs du domaine

Finalement avant de pouvoir commencer agrave deacutefinir les besoins de notre hieacuterarchie il

nous faut obtenir une deacutefinition valide et complegravete de notre domaine Naturellement

il nest pas eacutevident de trouver une deacutefinition concregravete et objective dun diagramme en

informatique theacuteorique Nous devons donc nous rabattre sur une autre solution qui doit

tout de mecircme ecirctre la plus formelle possible

19

141 Lapproche de Knuth

Pour trouver une ideacutee nous nous ramegravenerons agrave la meacutethode que Donald Knuth a utiliseacutee

lorsquil a creacuteeacute TEX En effet il souhaitait creacuteer un logiciel qui ferait de laquo beauxraquo doshy

cuments Cela eacutetant un terme tregraves subjectif Knuth deacutecida de se deacutefinir un ensemble

de journaux scientifiques dont les publications eacutetaient du plus haut standard de qualiteacute

pour leacutepoque (Knuth 1999) Apregraves avoir obtenu ces diffeacuterents exemples il put saffairer

agrave essayer de reproduire une solution de cette qualiteacute Il devient donc eacutevident agrave la fin

du cycle de deacuteveloppement du logiciel que sa solution eacutetait coheacuterente et valide car elle

permettait dobtenir un reacutesultat de qualiteacute en comparaison agrave ce que nous pourrions

deacutejagrave deacutefinir comme eacutetant de qualiteacute

Nous pouvons donc chercher agrave suivre la mecircme meacutethode Afin de la respecter nous devons

trouver quelques livres dun haut niveau de qualiteacute et prendre certains diagrammes

que lon retrouve agrave linteacuterieur Cela nous permettra de retrouver les eacuteleacutements les plus

cruciaux de notre domaine

Plusieurs livres inteacuteressants soffrent agrave nous nous utiliserons entre autres laquo The Art

of Computer Programming raquo de Donald Knuth (Knuth 1968) Il est naturel quun des

livres les plus connus en informatique eacutecrit par Knuth de surcroicirct possegravede un haut

standard de qualiteacute Un autre livre important est le laquo livre du dragonraquo (Aho Sethi et

Ullman 1986) qui eacutetudie la theacuteorie de la compilation et est extrecircmement connu dans

son domaine De plus celui-ci renferme leacutetude de nombreuses structures de donneacutees ce

qui nous fournit de nombreux diagrammes de qualiteacute Finalement il existe aussi un livre

tregraves connu dans leacutetude des algorithmes (ce qui est aussi extrecircmement lieacute agrave leacutetude des

structures de donneacutees) qui sappelle laquo Introduction to Algorithmsraquo (Cormen et al

2001) Ces trois livres forment une base extrecircmement connue et de qualiteacute pour nos

diagrammes Nous avons extrait quinze (15) diffeacuterents diagrammes de ces livres

20

142 Description des exemples et des concepts preacutesents dans les diagrammes

Les diffeacuterents diagrammes que nous avons seacutelectionneacutes repreacutesentent diffeacuterentes strucshy

tures de donneacutees On y retrouve plusieurs arbres et graphes Les graphes sont de plushy

sieurs types allant dun graphe standard agrave des graphes dexeacutecution De plus certaines

structures preacutesentes plus rarement se retrouvent dans notre ensemble Entre autres on

retrouve un diagramme de Venn qui bien que conceptuellement simple est toujours

relativement complexe lorsque nous souhaitons le reacutealiser avec un logiciel On retrouve

aussi des arbres linguistiques qui ne sont pas neacutecessairement complexes mais surtout

longs agrave reacutealiser

Cet ensemble de diagrammes nous permet de couvrir lensemble des structures de

donneacutees importantes en informatique theacuteorique et en matheacutematiques discregravetes Il existe

dautres structures de donneacutees mais celles-ci peuvent toujours ecirctre impleacutementeacutees seacutepashy

reacutement eacutetant donneacute que nous souhaitons faire une hieacuterarchie aiseacutement extensible Nous

remarquons surtout dans nos exemples quun des eacuteleacutements les plus importants est de

pouvoir r~lier convenablement les_diffeacuterents eacuteleacutements (dans un graphe par exemple)

Comme il sagit de quelque chose qui est toujours preacutesent il sagira dun des points les

plus importants agrave deacutevelopper pour notre hieacuterarchie

CHAPITRE II

STRUCTURE ET SOLUTION INFORMATIQUE

Afin de deacutevelopper un produit qui convient agrave nos besoins nous aurons besoin quil soit

structureacute adeacutequatement Cela implique principalement la construction de la hieacuterarchie

dobjets du domaine Il faut deacuteterminer quels sont les eacuteleacutements rechercheacutes dans notre

solution trouver une meacutethode de deacuteveloppement formelle et adeacutequate puis la reacutealiser

correctement Cela assurera une solution de qualiteacute

21 Objectifs dune structure dans une solution informatique

En premier lieu il nous faut justifier le besoin dune meacutethode de deacuteveloppement forshy

melle et solide En effet lin logiciel en informatique est tregraves diffeacuterent dun problegraveme

matheacutematique standard Une deacutemarche matheacutematique se ramegravene agrave un concept bien

connu la preuve Cela reurond la reacutesolution du problegraveme creacutedible agrave condition que la

preuve soit bonne Par contre nous verrons quun problegraveme informatique ne peut ecirctre

reacutesolu agrave laide dune simple preuve

211 Les diffeacuterentes composantes dune solution informatique

Une solution agrave un problegraveme informatique possegravede diffeacuterents eacuteleacutements Chacun dentre

eux possegravedent un certain degreacute de formalisme qui affecte lensemble de la solution

22

Algorithmes

Les algorithmes sont les eacuteleacutements les plus formels dune solution informatique On peut

dire quils se ramegravenent agrave la partie matheacutematique dun problegraveme informatique en quelque

sorte Composeacute dune seacuterie dopeacuterations aux comportements bien deacutefinis le reacutesultat dun

algorithme est preacutevisible Eacutetant donneacute la possibiliteacute de preacutevoir le comportement dun

algorithme agrave partir de ses entreacutees il est possible de deacutemontrer que lalgorithme fournit

exactement les reacutesultats rechercheacutes Il suffit en effet de prouver que agrave chaque entreacutee

possible on obtient la sortie qui serait logiquement attendue de lalgorithme On peut

penser par exemple agrave un algorithme de tri qui pour chaque ensemble de nombres

retourne les nombres en ordre croissant

Malgreacute tout un algorithme en informatique nest pas parfait En effet si le temps

dexeacutecution dun algorithme pour des entreacutees standards est beaucoup trop eacuteleveacute il ne

sera pas utiliseacute peu importe quil donne le bon reacutesultat Le temps dopeacuteration et la

quantiteacute despace meacutemoire sont les deux principales contraintes qui entrent en ligne de

compte pour les diffeacuterents algorithmes dune solution informatique

Solutions technologiques

Lautre partie extrecircmement importante de tout logiciel informatique est le choix des

technologies utiliseacutees En effet les programmes informatiques ne sont pas directement

creacuteeacutes agrave partir de circuit eacutelectriques Chaque couche dabstraction suppleacutementaire (cirshy

cuits logiques code assembleur programmation de haut niveau) limite les possibiliteacutes

du programmeur et vient avec certains avantages et certains inconveacutenients Le fait de

ne pas utiliser une solution deacutejagrave existante peut permettre une solution plus puissante

mais agrave un coucirct de deacuteveloppement potentiellement beaucoup plus eacuteleveacute Il est aussi posshy

sible avec un certain ensemble de choix technologiques de ne pas pouvoir obtenir un

effet rechercheacute dans une solution Cela explique pourquoi nous avons deacutecideacute dutiliser

Asymptote Il nous fournit un accegraves agrave JbTEX deacutejagrave codeacute ainsi quune traduction comshy

plexe vers un fichier image Postscript La reacutealisation de ces diffeacuterents eacuteleacutements de

23

code aurait significativement augmenteacute la complexiteacute de notre tacircche

Imperfection de toute solution informatique

Eacutetant donneacute les limitations des outils technologiques agrave notre disposition nous sommes

obligeacutes de constater que toute solution informatique est imparfaite De plus plusieurs

contraintes donneacutees agrave des systegravemes informatiques sont geacuteneacuteralement vagues et peuvent

ecirctre interpreacuteteacutees diffeacuteremment en fonction de lutilisateur Par exemple nous souhaitons

reacutealiser un outil simple dutilisation mais puissant et extensible Naturellement plus

un langage est puissant plus il devient complexe Un utilisateur peut trouver un outil

tregraves simple alors quun autre le trouvera incompreacutehensible Dautres points comme la

qualiteacute de documentation la courbe dapprentissage et lagestion aiseacutee des erreurs sont

des critegraveres qui possegravedent une bonne part de subjectiviteacute Ce ne sont toutefois pas

neacutecegravessairement de mauvais critegraveres Il faut simplement chercher selon une deacutefinition la

plus proche possible dun utilisateur moyen agrave maximiser les diffeacuterents paramegravetres

Ce genre de contraintes relegraveve geacuteneacuteralement du geacutenie logiciel Bien que ce meacutemoire ne

constitue pas un travail de geacutenie logiciel nous sommes obligeacutes demprunter quelques

eacuteleacutements agrave ce domaine afin dobtenir un reacutesultat adeacutequat

212 Consideacuterations pour une meacutethodologie de deacuteveloppement

Avant de choisir notre meacutethodologie il est bon de veacuterifier les objectifs rechercheacutes dans

lutilisation dune telle meacutethode de deacuteveloppement Cela nous permettra de deacutegager les

eacuteleacutements importants agrave garder en tecircte tout au long du deacuteveloppement de la hieacuterarchie

Un des eacuteleacutements les plus importants est dobtenir une structure efficace pour deacutecrire

nos diagrammes Lautre eacuteleacutement crucial est dobtenir une hieacuterarchie qui repreacutesente

adeacutequatement le domaine De preacutefeacuterence elle doit ecirctre complegravete et dun usage naturel

On entend par lagrave que les eacuteleacutements sont suffisamment preacutecis et proches deacuteleacutements stanshy

dards et connus du domaine que toutes les opeacuterations soient laquo naturellesraquo pour une

personne qui ne connaicirct pas le langage Il nexiste malheureusement pas de mesure pour

24

deacuteterminer si une hieacuterarchie est naturelle ou non Toutefois si chaque section est reacutefleacutechie

de maniegravere formelle le reacutesultat final devrait ecirctre naturel Certaines consideacuterations mishy

neures peuvent ecirctre plus ou moins mesureacutees comme la longueur du code et les noms

adeacutequats de fonctions

22 La programmation orienteacutee-objet

La programmation orienteacutee-objet est un des pheacutenomegravenes tregraves importants en informashy

tique Depuis sa creacuteation elle est devenue de plus en plus populaire eacutetant donneacute la faciliteacute

de deacuteveloppement dans une telle meacutethode Le fait dutiliser une solution orienteacutee-objet

(au contraire de Metapost ou Asymptote) ne sest pas fait de faccedilon arbitraire Il est

donc de mise dexposer les diffeacuterents avantages qui nous ont pousseacutes agrave choisir un tel

paradigme pour notre logiciel

221 Concepts de bases

La structure de base en programmation orienteacutee-objet est naturellement lobjet Celuishy

ci est deacutefini comme eacutetant une structure de donneacutees qui regroupe des donneacutees et des

meacutethodes (Saunders 1989) Bien quil ne sagit pas dun critegravere obligatoire la plushy

part des langages de programmation creacuteent les objets agrave partir dune classe qui deacutefinit

les diffeacuterents champs et meacutethodes preacutesents et leurs effets Les objets forment donc le

minimum requis pour avoir un langage objet

En tant que tel cet ensemble de concepts est assez minimaliste Il existe plusieurs autres

eacuteleacutements qui sont preacutesents agrave un degreacute plus ou moins grand dans les langages agrave objets

Ceux-ci forment donc en quelque sorte la base de la programmation orienteacutee-objet

(Pierce 2002)

- Lencapsulation des donneacutees cest-agrave-dire camoufler les donneacutees dans une structure

speacutecifique (lobjet)

- Lheacuteritage qui permet de deacutefinir un objet comme eacutetant une installce speacutecifique dun

autre objet On peut appliquer le mecircme raisonnement agrave deux classes On dit alors

25

quune classe heacuterite dune classe de base Celle-ci possegravede exactement le mecircme corps

que sa classe de base mais peut rajouter ou modifier certaines proprieacuteteacutes Il sagit

dun des aspects les plus importants dans le deacuteveloppement dune hieacuterarchie

- Le polymorphisme qui nous permet de creacuteer des proprieacuteteacutes qui varient en fonction

des sous-classes Par exemple une classe Nombre pourrait avoir une meacutethode daddishy

tion alors que ses sous-classes Entiegraveres et Reacuteelles redeacutefiniraient cette meacutethode en

fonction de leur impleacutementation speacutecifique Cela nous permet par la suite de prendre

deux nombres et de les additionner peu importe quil sagisse de reacuteels ou dentiers

222 Diffeacuterence avec la programmation baseacutee-objet

Les diffeacuterentes prioriteacutes eacutenumeacutereacutees ci-haut sont les eacuteleacutements de base qui nous permettent

de creacuteer une hieacuterarchie de qualiteacute Il sagit de la raison principale justifiant de ne pas

utiliser Asymptote pour creacuteer la hieacuterarchie En effet celui-ci est un langage baseacute-objet

La diffeacuterence principale est quun langage baseacute-objet ne neacutecessite pas limpleacutementation

de lheacuteritage ou du polymorphisme (Saunders 1989) Asymptote de son cocircteacute possegravede un

heacuteritage de structure minimal mais pas de polymorphisme Cette diffeacuterence est cruciale

car cet eacuteleacutement est neacutecessaire pour la creacuteation dune hieacuterarchie dans des contraintes

acceptables

En effet une chose importante est dajouter des objets dans les diagrammes Par

exemple supposons que nous avons une classe Conteneur Celui-ci doit pouvoir conteshy

nir des Cercles des Carreacutes des Triangles etc Sil fallait eacutecrire une fonction pour

ajouter chacune des formes le travail deviendrait eacutenormeacutement complexe et impossible

agrave eacutetendre pour lusager final Avec le polymorphisme il suffit deacutecrire une fonction qui

permet dajouter une Forme quelconque

23 Meacutethode pour la conceptualisation dune hieacuterarchie

Nous deacutecrirons ici la meacutethode que nous avons utiliseacute Il sagit de DMT (pour Dbj ect

Modeling Technique)

26

231 Origine de la meacutethode

Cette meacutethode fut deacuteveloppeacutee principalement par James Rumbaugh (mais avec laide de

plusieurs personnes) (Rumbaugh et al 1991) en 1991 Celui-ci est principalement connu

comme eacutetant un des auteurs de la norme UML qui est devenu le scheacutema de modeacutelisation

objet standard et utiliseacute par tous les programmeurs objets (Group 1999) Il est agrave noter

que cette meacutethode est une meacutethode danalyse complegravete pour toute la dureacutee de vie du

logiciel Nous naurons par contre besoin que de la partie analyse de cette meacutethode

232 Les diffeacuterentes eacutetapes de conceptualisation

La premiegravere partie de cette meacutethode a deacutejagrave eacuteteacute effectueacutee implicitement lorsque nous

avons rechercheacute nos diagrammes relatifs du domaine Habituellement il est suggeacutereacute

deacutecrire un texte reacutesumant lensemble du domaine mais dans notre cas il est plus

approprieacute de reacutesumer notre domaine avec des diagrammes Par la suite il faut prendre

le temps de faire ressortir les diffeacuterentes classes dobjets qui font parties du domaine et

prendre le temps de bien les deacutefini~middot On eacuteliminera les classes vagues ou redondantes par

la suite

La prochaine eacutetape consiste agrave deacutefinir les diffeacuterentes associations entre les classes Par

exemple une classe Employeacute et une classe Compagnie seraient lieacutees par lassociation

travaille pour Par la suite on identifie les attributs (ou les champs) des diffeacuterentes

classes en eacutevitant les attributs dimpleacutementation Finalement on raffine le modegravele en

ajoutant lheacuteritage des classes Cela permet de simplifier significativement la hieacuterarchie

Cela fournit une hieacuterarchie complegravete de notre domaine Par contre rien ne deacutemontre

quelle est correcte Afin de la veacuterifier il suffit danalyser les diffeacuterents cas typiques de

notre problegraveme regarder le reacutesultat obtenu et relever toute erreur Dans notre cas il

sagit de coder (seulement en terme de la hieacuterarchie) les diffeacuterents diagrammes et veacuterifier

si nous consideacuterons le tout satisfaisant Par la suite nous pourrons reacuteiteacuterer le mecircme

proceacutedeacute jusquagrave obtenir satisfaction Nous serons ainsi assureacutes davoir une hieacuterarchie

27

adapteacutee agrave notre domaine et complegravete

24 Deacuteveloppement de la hieacuterarchie

Maintenant que nous avons une meacutethodologie correcte nous pouvons creacuteer notre hieacutershy

archie Le fait de sassurer de sa compleacutetude nous permettra de ne pas rencontrer de

problegravemes complexes lors de la phase dimpleacutementation du logiciel

241 Extraction des diffeacuterents concepts

Les concepts du domaine (qui se ramegravenent agrave des classes) se divisent en plusieurs cateacuteshy

gories Une des principales est le domaine des formes Une forme peut ecirctre un carreacute

un cercle etc Une autre cateacutegorie importante est formeacutee des points qui peuvent ecirctre

deacutefinis de plusieurs maniegraveres diffeacuterentes Finalement une autre section importante est

formeacutee des structures de conteneurs incluant les Canvas (pour contenir des objets) et

des Drawing (pour reacutefeacuterencer des objets)

Eacutetant donneacute le nombre relativement faible de formes distinctes il ne nous est pas apparu

utile de faire plusieurs cateacutegories de formes distinctes En effet une seacuteparation entre les

courbes fermeacutees et ouvertes peut nous permettre de factoriser un ou deux eacuteleacutements de

code sans toutefois ecirctre significatif ou reacuteellement utile (eacutetant donneacute quil nexiste pas

vraiment de forme standard deacutefinie par une courbe ouverte)

242 Eacuteleacutements particuliers

Plusieurs eacuteleacutements particuliers se sont reacuteveacuteleacutes complexes agrave modeacuteliser dans notre hieacuterarshy

chie Nous abordons ici les principales difficulteacutes rencontreacutees ainsi que les solutions pour

les reacutegler

28

Creacuteation et placement dobjets

Leacuteleacutement le plus important de notre hieacuterarchie est de pouvoir structurer les objets

que nous souhaitons positionner Nous avons donc creacuteeacute une classe Canvas Le nom est

inspireacute du mot canevas en peinture eacutetant donneacute que nous avons apposeacute des restrictions

similaires agrave ce domaine En effet nous avons deacutecideacute que lorsquun objet est placeacute dans

un canevas il ne peut ecirctre enleveacute ou modifieacute Cela nous permettra plus tard de faire

des calculs pour les points de reacutefeacuterence plus aiseacutement De plus un canevas doit pouvoir

posseacuteder des sous-canevas Pour cela il nous faut une classe geacuteneacuterale qui deacutecrit tout

eacuteleacutement pouvant ecirctre ajouteacute dans un canevas

Cela est reacutesolu avec lintroduction dune classe Shape Celle-ci repreacutesente toute forme

qui peut ecirctre dessineacutee quelle soit simple ou complexe Un Canvas est une forme afin

de sassurer de pouvoir positionner des sous-canevas Une implication particuliegravere de

notre choix est quune Shape ne possegravede pas de position Il sagit dune forme abstraite

qui peut ecirctre positionneacutee agrave un certain endroit Cela implique aussi quil est possible de

prendre une Shape et de la placer agrave plusieurs end_roits distincts Lorsquelle est ajouteacutee

dans un Canvas une Shape est copieacutee ce qui empecircche toute modification subseacutequente

de la forme

Objets multiples

Lorsquil sagit de creacuteer des diagrammes freacutequemment il est tregraves probable que plusieurs

eacuteleacutements soient similaires Par exemple si nous creacuteons un arbre avec des cercles comme

sommets il sagit toujours en quelque sorte du mecircme cercle De plus si nous creacuteons

un sous-canevas et que nous le positionnons agrave plusieurs endroits certaines formes deshy

viennent automatiquement deacutedoubleacutes Il devient donc primordial pour nous de pouvoir

reacuteutiliser un eacuteleacutement que nous avons deacutejagrave deacutefini afin deacuteviter la creacuteation agrave reacutepeacutetition

dobjets

Or nous avons deacutejagrave speacutecifieacute quil eacutetait possible de positionner plusieurs fois le mecircme

29

objet Cela est vrai mais il y a une limitation En effet ces objets ne peuvent pas ecirctre

reacutefeacuterenceacutes Si nous souhaitons connaicirctre un objet celui-ci doit pouvoir ecirctre distingueacute

dun autre Il nous faut donc une classe qui repreacutesente une forme agrave un endroit preacutecis

Pour cela nous avons creacuteeacute la classe Drawing Celle-ci permet de repreacutesenter une Shape

agrave un endroit bien preacutecis dans un canevas Cela fait toutefois que les eacuteleacutements dans un

sous-canevas multiple restent identiques Nous verrons bientocirct la solution agrave ce problegraveme

Points de reacutefeacuterence

Un des eacuteleacutements les plus complexes relevait du fait de fournir des points de reacutefeacuterence

En effet faire de simples chemins entre des coordonneacutees en valeurs absolues neacutetait pas

suffisant mecircme sil est possible dadditionner ses points La solution souhaiteacutee eacutetait de

permettre de deacutefinir des points de reacutefeacuterence ceux-ci pouvant ecirctre obtenus agrave partir de

lobjet lui-mecircme Par exemple un cercle pourrait retourner son point nord

Un eacuteleacutement fondamental causait problegraveme la fonction pour acceacuteder au point doit ecirctre

deacutefinie dans la forme (par exemple dans la classe Circle) Par contre une forme en

tant que telle ne possegravede pas de position speacutecifique Par conseacutequent son point nest

pas deacutefini non plus Pour cela il faudrait obtenir un Drawing Par contre un Drawing

ne peut pas posseacuteder la deacutefinition de chaque fonction daccegraves agrave un point pour chaque

forme Cela est contre-intuitif Il faut donc demander agrave la forme lorsquon appelle pour

obtenir un point de prendre le Drawing suppleacutementaire en paramegravetre Notre intention

est lorsque nous eacutecrirons un langage au-dessus de la hieacuterarchie de pouvoir reacutegler ce

problegraveme

Chemins de reacutefeacuterence

Finalement il nous reste un leacuteger problegraveme Nous pouvons maintenant faire une reacutefeacuteshy

rence agrave un objet disons a et obtenir un point speacutecifique de cet objet Par contre cela

nest pas suffisant dans un cas bien preacutecis Disons que a est dans le canevas b Ensuite b

est placeacute agrave deux reprises dans le canevas c obtenant deux Drawing diffeacuterents cl et c2

30

Nous ne pouvons pas acceacuteder agrave a car il est repreacutesenteacute seulement en fonction de b Pour

reacutegler le problegraveme il faut faire un chemin de reacutefeacuterence (disons cl b a dans le langage

final) Pour cela nous fournirons la possibiliteacute de partir dun Drawing et den obtenir

un autre (agrave condition quil sagisse dun Canvas naturellement) Cela va mettre agrave jour

la position relative de lobjet par rapport agrave un niveau de profondeur suppleacutementaire

En acceacutedant agrave cette fonction aussi souvent que neacutecessaire il est possible de reacutefeacuterencer

un objet peu importe son degreacute de profondeur reacuteel Cela nous permet donc de faire

des liens complexes entre nimporte quel objet (voire mecircme des objets de profondeur

diffeacuterentes)

31

CHAPITRE III

EacuteLEacuteMENTS GRAPHIQUES

Dans ce chapitre nous deacutefinissons les eacuteleacutements graphiques requis pour faire des dessins

informatiques dont les courbes de Beacutezier ainsi que les splines cubiques Les proprieacuteteacutes

importantes de ces courbes sont deacutemontreacutees De plus une preuve est fournie de la

possibiliteacute dapproximer adeacutequatement un cercle avec des splines cubiques Finalement

nous discuterons du fonctionnement des diffeacuterentes solutions informatiques en terme de

structure telles que PDF et Asymptote

Courbes et segments en informatique

Naturellement les eacuteleacutements les plus importants dans des dessins informatiques sont les

segments et les courbes Pour des besoins de simpliciteacute nous essaierons de les inteacutegrer

dans la mecircme deacutefinition en traitant les segments comme un cas particulier des courbes

Nous donnons agrave cette courbe geacuteneacuterale le nom de chemin

Le premier problegraveme lorsque nous voulons faire des courbes en informatique est la

meacutethode pour les repreacutesenter Lecirctre humain peut tracer une infiniteacute de courbes disshy

tinctes sans avoir besoin de la deacutecrire avec preacutecision Par contre lorsquon entre dans le

domaine de linformatique il faut non seulement ecirctre capable den faire une description

mais celle-ci doit ecirctre la plus petite possible

Une des meacutethodes de repreacutesentation est sous la forme de pixels (JI et Kelley 2007)

Cette meacutethode implique de repreacutesenter un plan continu par un ensemble de points disshy

32

crets appeleacutes pixels Cela permet de repreacutesenter plusieurs formes de dessins extrecircmement

complexes et est utiliseacute dans certains logiciels dimages

Une autre meacutethode est la meacutethode vectorielle Cest la plus populaire Au lieu de

repreacutesenter directement le dessin tel quil apparaicirct on fournit une description du dessin

agrave partir de quelques concepts tregraves simples (points segments et cercles par exemple)

Lorsque lutilisateur souhaite voir le dessin un logiciel traduit la description en pixels

pour leacutecran

La derniegravere meacutethode possegravede plusieurs avantages La description dun dessin est souvent

beaucoup plus compacte que si on deacutecrit le dessin pixel par pixel De plus la description

conserve la preacutecision du dessin peu importe la reacutesolution agrave laquelle il est preacutesenteacute Par

exemple si nous prenons un ensemble de pixels et quon lagrandit plusieurs fois il est

tregraves probable que nous ayons perdu beaucoup dinformations Il nous faut par contre

veacuterifier la puissance reacuteelle dune telle meacutethode Nous devons donc introduire une des

structures utiliseacutees pour la description vectorielle

32 Courbes de Beacutezier

Une courbe de Beacutezier est un concept relativement simple deacuteveloppeacute indeacutependamment

par Paul de Casteljau et Pierre Beacutezier entre 1959 et 1962 Ces deux personnes avaient

pour objectif de creacuteer des repreacutesentations par ordinateur de voitures pour les compagnies

Citroen et Renault respectivement (Jr et Kelley 2007)

321 Deacutefinition

Soit Po Pl P2 Pn E 1R2 un ensemble de points dans un plan carteacutesien typique

Ceux-ci sont appeleacutes des points de controcircle Soit t E IR et 0 lt t 1 La courbe de

Beacutezier de degreacute n des points Po agrave Pn est deacutefinie par la formule suivante

B t - n ( n

) 1 - t n-ttt

pPohmiddotPn ( ) - ~ i ( ) t (31) t=O

33

Le chemin est deacutefini pour les valeurs entre 0 et 1 de t Cette formule peut sembler

leacutegegraverement arbitraire et complexe pour une forme supposeacutement simple Une seconde

deacutefinition reacutecursive cette fois-ci simplifie beaucoup la formule

322 Deacutefinition alternative

Bp =p (32)

BpOPl Pn(t) = (1 - t)BpOPl Pn-l (t) + tBplhPn (33)

Cette deacutefinition alternative se ramegravene agrave dire quune courbe de Beacutezier est une intershy

polation lineacuteaire entre deux courbes de Beacutezier de degreacute infeacuterieur La deacutemonstration se

ramegravene agrave quelques manipulations bien simples et est laisseacutee en exercice au lecteur

Nous pouvons analyser les formules pour diffeacuterents degreacutes Par exemple une formule de

Beacutezier de degreacute 1 nest quune droite

BPoPl (t) = (1 - t)Po + tP] (34)

Alors quune courbe de degreacute 2 se ramegravene agrave une parabole

(35)

Finalement une courbe de Beacutezier cubique (de degreacute 3) fournit une courbe relativement

complexe qui commence agrave Po et termine agrave P3

--- ---

34

P P

0

P

Po - ____ _ - - P2

Po - - - - - - - - - - - - - - - - - - - - - - - shyPo P2 P3

(a) lineacuteaire (b) quadratique (c) cubique

Figure 31 Courbes de Beacutezier lineacuteaire quadratique et cubique

Eacutevidemment il ny a pas davantages significatifs agrave utiliser une courbe de Beacutezier lineacuteaire

Les courbes de Beacutezier quadratique sont quant agrave elles utiliseacutees lors de la geacuteneacuteration

de police TrueType (Apple Computer Inc 1996) Finalement les courbes de Beacutezier

cubiques sont utiliseacutees dans Postscript (Adobe Systems Incorporated 2010a) et dans la

plupart des produits Jb1EX tel que Metafont (Knuth 1986) Ces logiciels utilisent en

fait une combinaison de courbes de Beacutezier appeleacutees splines que nous verrons dans la

section suivante

323 Proprieacuteteacutes dune courbe de Beacutezier

En regardant les diffeacuterentes courbes nous pouvons aiseacutement voir quelques proprieacuteteacutes

Entre autres il y a interpolation des points de deacutepart et de fin Cela peut se deacutemontrer

aiseacutement en calculant B(uuml) et B(l) qui donne respectivement Po et Pn De plus les

autres points ne semblent pas ecirctre interpoleacutes Il sagit ici dun cas geacuteneacuteral (les points

peuvent ecirctre interpoleacutes sils sont colineacuteaires)

Une autre proprieacuteteacute inteacuteressante des courbes de Beacutezier est son invariance par transforshy

mation affine Cela se ramegravene au theacuteoregraveme suivant Dans le cadre de ce theacuteoregraveme nous

devrons transformer les coordonneacutees des points de controcircles des courbes de Beacutezier en

coordonneacutees projectives homogegravenes Ceci se ramegravene agrave rajouter un axe agrave chacun de nos

points dont la valeur sera toujours 1

35

Theacuteoregraveme dinvariance affine

Soit BpOPl Pn(t) une courbe de Beacutezier Soit M une matrice 3 par 3 repTeacutesentant une

transformation affine Alors on a que la courbe est invari(Lnte par lapplication de M

cest-agrave-dire MBpoPlPn(t) = BMPolvIPl lvIPn(t)

Pour le prouver il suffit de deacutevelopper la formule

NI BpoP1Pn (t) = M t (~) (1 - tt-ieuml Pi 1=0

= tM(~) (1- tt-itiPi 1=0

= t (~) (1- t)n-iti(MPi ) 1=0

Ce theacuteoregraveme implique que pour transformer une courbe de 8eacutezier il suffit dappliquer la

transformation agrave chaque point de controcircle et de calculer une nouvelle courbe de 8eacutezier

Donc une courbe de Beacutezier est entiegraverement deacutefinie par ses points de controcircle Cela fait

quelle est tregraves pratique en informatique car elle ne requiert que peu despace pour la

deacutefinir (ie seulement les n + 1 points de controcircle) De plus il est tregraves simple de geacuteneacuterer

une courbe de Beacutezier car il suffit dutiliser la formule pour autant de valeurs de t que

nous avons besoin de preacutecision dans la courbe En conservant linformation avec cette

meacutethode nous conservons une courbe sans aucune perte dinformation Cela signifie que

nous pouvons agrandir la reacutesolution de la courbe autant que nous le souhaitons et il

sagira toujours dune belle ligne courbe Cette proprieacuteteacute est extrecircmement inteacuteressante

en informatique

36

324 Deacutesavantages des courbes de Beacutezier

Les courbes de Beacutezier sont utiliseacutees dans beaucoup de domaines Par contre elles

possegravedent quelques deacutesavantages peu inteacuteressants Le plus important est probablement

labsence de controcircle local Cela sexprime par le fait que degraves que lon souhaite modifier

une courbe de Beacutezier agrave un endroit particulier tout le reste de la courbe est modifieacute au

passage Cela se deacutemontre par le fait que si 0 lt t lt 1 on a alors que

Cela implique que chaque point de controcircle de la courbe de Beacutezier a une influence (aussi

minime soit-elle) sur lensemble de la courbe Le reacutesultat est que les courbes de Beacutezier

seules sont difficiles agrave utiliser et longues agrave eacutevaluer si on utilise trop de points de controcircle

33 Splines cubiques

La solution agrave ce problegraveme est lutilisation de splines cubiques Lideacutee de base dune spline

est que si une seule courbe cause trop de problegravemes il est probablement mieux dutiliser

plusieurs courbes mais qui fonctionnent seulement dans un domaine plus petit Plus

formellement une spline cubique (aussi appeleacute B-spline cubique) est composeacute de

- un ensemble de valeurs ti pour 0 S i S m - 1 ougrave m repreacutesente le nombre de noeuds

On appelle aussi ces valeurs le vecteur de noeud Les t forment une suite monotone

croissante et sont tous des valeurs reacuteelles entre 0 et l

- L + l points de controcircle

- Une valeur entiegravere n qui repreacutesente lordre de la fonction B-sp1ine Une spline doit

respecter la condition n S m - 2

On deacutefinit une spline par la fonction suivante

37

m-n-2

S(t) = L Pibin(t) tE [01] i=O

ou dans le cas speacutecifique dune spline de degreacute 3

3

S(t) = L Pi bi 3(t) tE [01] i=O

Les bin repreacutesentent les bases de la B-spline (pour Basis Spline) Celles-ci sont deacutefinies

par la fonction reacutecursive suivante

bjoU) ~ sinon

Il sagit dune eacutequation complexe et nous ne nous y attarderons pas trop Quelques

deacutetails sont inteacuteressants agrave noter Entre autre il est inteacuteressant de constater que si lon

utilise n + 1 points de controcircle et que les noeuds sont n noeuds valant zeacutero et n noeuds

valant 1 le B-spline deacutegeacutenegravere en une courbe de Beurozier Il sagit donc dune extension

des capaciteacutes des courbes de Beacutezier

Le problegraveme principal eacutevoqueacute par les courbes de Beacutezier est que lutilisateur lors de

la creacuteation dune courbe manquait de controcircle local Il serait donc inteacuteressant que les

B-splines nous permettent de reacutegler ce problegraveme Lorsquon regarde la deacutefinition de la

base bi on remarque que celle-ci se ramegravene toujours au cas de base qui peut ecirctre aou

1 selon que nous sommes dans un domaine restreint ou non Comme il sagit du seul

facteur de Pi il est naturel daffirmer que le controcirc~e est plus localiseacute quavant Dautres

proprieacuteteacutes inteacuteressantes sont

- Pour tout t la somme de tout les bi(t) est 1

38

C5 C4 C3 -----~---- ----~-----

-----~---- ----~-----

Cg ClO Cn

Figure 32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier

- Un B-spline dordre m sera neacutecessairement Cm - 2 cest-agrave-dire quelle possegravede 2 ordres

de deacuteriyeacutees continues pour son domaine de deacutefinition _

- Tout comme les courbes de Beacutezier les B-splines sont invariants par transformation

affine On peut donc appliquer une courbe en appliquant tout simplement la transshy

formation sur les points de controcircle et en calculant le nouveau B-spline

34 Le cas dun cercle

Avec les outils que nous posseacutedons nous ne sommes pas en capaciteacute de dessiner un

cercle exact Cela nest pas grave eacutetant donneacute que nous pouvons tout de mecircme tenter de

lapproximer Pour ce faire nous utiliserons une spline cubique posseacutedant quatre points

(est nord ouest et sud respectivement) Chaque courbe de Beacute7i~r sera donc identique

aux autres agrave une rotation pregraves Il reste donc agrave deacuteterminer les points de controcircle agrave utiliser

Pour cela prenons le premier quadrant du cercle Nous passons du point Cl (10) agrave

C4 (0 1) Il nous faut deacuteterminer deux points de controcircle C2 et C3 Pour commencer

39

nous pouvons supposer de maniegravere tout agrave fait arbitraire que C2 se situe sur la tangente

de Cl et C3 sur la tangente de C4 Cela nous donne donc le scheacutema suivant

C4 C3 ----- ----~-----

1

1

1

1

TC2 1

1

1

i

Figure 33 Quart de cercle approximeacute par une courbe de Beacutezier

On a donc C2(1 k) et C3(k 1) ougrave k est une variable agrave deacuteterminer Afin de la deacuteterminer

nous devons donner une information suppleacutementaire Par exemple nous pouvons preacuteshy

supposer que le point agrave 45 degreacutes C(O5) doit ecirctre eacutevalueacute exactement par la courbe de

Beacutezier cest-agrave-dire C(O5) = (1 1) Nous obtenons donc la restriction

C(uuml5) = (1 - t)3CI + 3(1 - t)2tC2 + 3(1 - t)t2C3 + t3C4

1 3 3 1 = -Cl + -C2 + -C3 + -C4

8 8 8 8

ce qui nous permet dobtenir leacutegaliteacute

v2v2 1 3 3 1 (- -) = -Cl + -C2 + -C3 + -C4 (37)22 8 8 8 8

ce qui nous fournit apregraves substitution des valeurs des points deux fois leacutequation

v2 1 3k-=-+- (38)2 2 8

40

ce qui nous fournit apregraves reacutesolution

k = ~(J2 - 1) 0552285

Cela nous fournit donc une courbe de Beacutezier qui approxime notre cercle Il reste agrave voir

la preacutecision de cette approximation

Pour ce faire nous devrons comparer larc de cercle que nous venons de creacuteer agrave un cercle

reacuteel Afin dy arriver nous consideacutererons chaque valeur de notre arc comme eacutetant un

vecteur dont nous devrons calculer la longueur Plus cette longueur est proche de 1

plus nous avons une estimation reacutealiste Nous calculons donc

Par la suite une analyse des deacuteriveacutees nous permet de conclure que cette fonction dans

lintervalle t E [01] possegravede des m(iximu_ms agrave _t = 0 agrave tr~is reprises _(au deacutebut et agrave la

fin eacutetant donneacute la proprieacuteteacute naturelle des courbes de Beacutezier celle au milieu est due agrave

notre contrainte) Finalement elle possegravede deux (2) minimums agrave t = 0211 et t = 0789

et lerreur avec un cercle standard est de 0000273 Une telle variation sur un cercle

de rayon 1 est minime Il sagit dune variation maximale infeacuterieure agrave 003 Cela

signifie donc pour un cercle posseacutedant un rayon de 4000 pixels il y aura une variation

maximale de 12 pixels ce qui est indeacutetectable pour la taille du cercle Cela en fait une

bonne estimation pour cette section du cercle Nous pouvons naturellement suivre le

mecircme raisonnement pour les sections restantes

Il est aussi agrave noter que notre estimation nest pas la meilleure Notre choix de demander

leacutegaliteacute agrave 45 degreacutes est arbitraire et toute lerreur se retrouve dans le cocircteacute neacutegatif De

meilleures estimations ont eacuteteacute effectueacutees (Riskus 2006) avec des reacutesultats amenant une

preacutecision jusquagrave 25 plus grande (Lancaster 2005)

41

0--------------r--7T-----------------rl 08 (1

-000005

-000010

-000015

-000020

-000025

Figure 34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence

35 Structures informatiques dans les solutions deacutejagrave existantes

Maintenant que nous savons comment fonctionne les diffeacuterents modes de repreacutesentation

des dessins en informatique il faut analyser plus en deacutetail comment fonctionne les

logiciels dont nous allons nous servir En effet il nous faudra adapter nos structures de

bas niveau agrave celles disponibles dans les langages dont nous nous servirons Pour cela

nous allons analyser deux parties distinctes un format de fichier (PDF) ainsi quun

42

langage intermeacutediaire (Asymptote)

351 Postscript et PDF

En premier lieu il convient de comprendre comment fonctionne le format de fichier final

que nous utiliserons ]1EX permet de geacuteneacuterer plusieurs formats de fichier diffeacuterents

Pendant longtemps le plus populaire aura eacuteteacute Postscript creacuteeacute par Adobe Systems Cela

eacutetait principalement lieacute aux imprimantes qui fonctionnaient directement avec ce format

De nos jours le format PDF est beaucoup plus populaire bien quayant une base tregraves

proche de celle de Postscript

Postscript a eacuteteacute inventeacute par John Warnock et Charles Geschke en 1982 (Adobe Systems

Incorporated 1994) Lorsquil a eacuteteacute creacuteeacute il servait agrave faire la description de pages pour

impression Il se distingue comme eacutetant un langage de programmation complet mais

rarement utiliseacute directement En effet Postscript est difficile agrave utiliser car il utilise la

notation polonaise inverse Par exemple on exprime lappel de fonction j(a b c) de la

faccedilon suivante

abc f

Cette meacutethode rend lanalyse dun programme extrecircmement rapide et convivial pour

le logiciel qui linterpregravete car celui-ci est directement lieacute agrave la structure dune pile

dexeacutecution Par contre lanalyse dun tel programme par un humain est complexe

La plupart du temps Postscript eacutetait donc utiliseacute comme un langage de description

final pour un fichier

Il existait deux types de structures utiliseacutes en Postscript pour mettre des dessins sur une

page Le premier eacutetait lajout de texte Cela est intrinsegravequement lieacute agrave la description des

polices qui deacutepasse le cadre de ce meacutemoire Par contre pour faire un dessin quelconque

le format utilisait les chemins qui sont deacutecrits soit par des segments soit par des courbes

de Beacutezier cubiques On note donc le deacutesavantage de lutilisation dune courbe de Beacutezier

soit labsence de controcircle local

43

Quant agrave lui PDF a eacuteteacute creacuteeacute en 1993 (Adobe Systems Incorporated 2010b) Agrave travers les

gains de populariteacute le format PDF est devenue en 2008 un standard ISO (International

Organization for Standardization 2008) Cela en fait donc un format de document

standard extrecircmement inteacuteressant Alors que Postscript a eacuteteacute creacuteeacute pour des documents

qui devaient ecirctre imprimeacutes PDF a eacuteteacute conccedilu pour la description de documents plus

dynamiques cest-agrave-dire la possibiliteacute dajouter des eacuteleacutements multimeacutedias au document

Aussi il est possible de deacutecrire chaque page indeacutependamment des suivantes En effet

comme Postscript deacutecrivait des documents dimpression il est normal de connaicirctre la

page de deacutepart avant dimprimer la suivante En PDF chaque page est totalement

indeacutependante du reste du document

Pour la description deacuteleacutements graphiques les structures de base sont essentiellement

les mecircmes que Postscript Quelques eacuteleacutements comme la transparence cest-agrave-dire quun

eacuteleacutement cacheacute par un autre eacuteleacutement contribue au reacutesultat final ont eacuteteacute ajouteacutes mais les

eacuteleacutements graphiques de bas niveau sont identiques

352 Asymptote

Comme nous lavons dit preacuteceacutedemment tout ramener agrave des courbes de Beacutezier creacutee un

problegraveme de controcircle local des courbes Il faut donc utiliser une meacutethode pour donner

du controcircle agrave lutilisateur Pour cela nous utiliserons Asymptote Les structures de

bas niveau de Asymptote sont identiques agrave celles de PDF eacutetant donneacute quil convertit

directement les chemins Asymptote en chemins PDF Par contre Asymptote impleacutemente

un algorithme (Bowman 2007) originellement deacuteveloppeacute par Donald Knuth qui permet

de deacutecrire un chemin en fonction des points par lesquels il passe Asymptote utilise donc

des splines cubiques (qui ne sont pas neacutecessairement des B-splines toutefois)

Cet algorithme est complexe et en dehors du cadre de ce meacutemoire mais peut ecirctre

reacutesumeacute comme eacutetant un algorithme de choix des points de controcircle En effet une courbe

de Beacutezier cubique est deacutefinie par 4 points Le premier et le dernier sont interpoleacutes de

maniegravere exacte Ce que lalgorithme fait est quil prend un ensemble de points qui

44

seront tous interpoleacutes disons Pl P2 P3 P4 Ensuite pour chaque paire conseacutecutive de

points (donc (Pl P2 ) (P2 P3) et (P3 P4)) il geacuteneacuterera une courbe de Beacutezier cubique

La partie la plus importante de lalgorithme consiste agrave prendre toutes les informations

fournies par lutilisateur (les points de controcircle ainsi que des options qui deacutefinissent la

courbe comme les deacuteriveacutees agrave certains endroits ou des informations comme la tension qui

laisse lalgorithme calculer lui-mecircme les deacuteriveacutees agrave partir dun indice reacuteel simple) afin de

calculer pour chaque courbe de Beacutezier cubique les deux points de controcircle manquants

En laissant agrave lutilisateur le pouvoir de deacutecider seulement les points ougrave la courbe passe

le travail est simplifieacute mais permet tout de mecircme de terminer avec un ensemble de

courbes de Beacutezier

CHAPITRE IV

THEacuteORIE DES LANGAGES INFORMATIQUES

La creacuteation dun langage de programmation nest pas une mince tacircche Il faut donc

sassurer de le construire sur des bases theacuteoriques solides Nous preacutesenterons ici les

eacuteleacutements theacuteoriques importants de la theacuteorie des langages ainsi que leurs applications

dans le domaine de la compilation Nous preacutesenterons aussi loutil SableCC que nous

avons utiliseacute dans le cadre de notre langage ainsi quun bref exposeacute sur les langages

reacuteflexifs

La theacuteorie des langages est un sujet vaste et extrecircmement complexe Un meacutemoire comshy

plet pourrait ecirctre reacutedigeacute seulement sur les aspects theacuteoriques des automates reacuteguliers

Afin de compresser tout ce contenu dans un seul chapitre les eacuteleacutements seront mentionneacutes

sans preuve Nous recommandons toutefois au lecteur curieux et assidu de consulter les

reacutefeacuterences de ce chapitre pour des preuves et une couverture plus complegravete du sujet

41 Theacuteorie des langages et automates

Dans un premier temps nous devrons deacuteterminer ce quest formellement un langage

Par la suite nous analyserons une structure de donneacutees qui est intimement lieacutee agrave ce

sujet les automates

46

411 Les eacuteleacutements de base dun langage (Aho Sethi et Ullman 1986)

Alphabet et lettre

Un alphabet est un ensemble (au sens matheacutematique du mot) de symboles appeleacutes

lettres Un alphabet est fini et non-vide Par exemple lalphabet latin standard ainsi

que lensemble O I constituent des alphabets

Mot

Un mot dun alphabet A peut ecirctre un des trois cas suivants

- le mot vide euro formeacute daucune lettre

- une lettre de lalphabet A

- Toute suite finie de lettres aOal an ougrave chaque ai fait partie de lalphabet A

Il est agrave noter que les deux premiers sont en fait des cas speacutecifiques du dernier bien quils

sont souvent seacutepareacutes pour raison de clarteacute Dans le dernier cas on dit que les caractegraveres

sont lieacutes par lopeacuteration de concateacutenation

Langage

Un langage au sens le plus geacuteneacuteral possible est un ensemble de mots Celui-ci peut ecirctre

fini ou infini La plupart des exemples inteacuteressants (un langage de programmation par

exemple) est un langage infini En effet il existe une infiniteacute de programmes diffeacuterents

tout comme il existe une infiniteacute de nombres binaires

412 Exp esson reacutegnli r

Les expressions reacuteguliegraveres forment un outil de travail extrecircmement important en inshy

formatique De nombreux outils ainsi que certains langages (grep perl ) leurs sont

consacreacutes

47

On peut reacutesumer les expressions reacuteguliegraveres comme eacutetant une meacutethode afin de deacutecrire

un langage infini par une expression fini On utilisera dans la construction certaines

opeacuterations qui nous donneront des proprieacuteteacutes inteacuteressantes pour le langage final Tout

mot qui peut ecirctre construit agrave partir de ces regravegles fait automatiquement partie du langage

Constantes

Leacuteleacutement de base dune expression reacuteguliegravere est une constante Celle-ci est deacutefinie agrave

partir dune lettre de lalphabet et deacutefinit un seul mot la constante elle-mecircme Par

conseacutequent lexpression reacuteguliegravere a de lalphabet ab repreacutesente le langage a Il est

agrave noter que nous pouvons aussi utiliser le mot vide comme une constante repreacutesentant

lensemble vide

Concateacutenation

Lopeacuteration de concateacutenation est une opeacuteration sur les mots qui permet de creacuteer des

expressions reacuteguliegraveres plus longues agrave partir de deux expressions reacuteguliegraveres valides Le

reacutesultat de lexpression reacuteguliegravere A concateacuteneacutee agrave B est donc nimporte quel mot de A

concateacuteneacute agrave nimporte quel mot de B Par exemple ab est une expression reacuteguliegravere qui

repreacutesente un langage agrave un mot ab

Union

Lunion des expressions reacuteguliegraveres est une opeacuteration qui correspond agrave lunion ensemshy

bliste Lors de lunion de A et de B (deacutefini comme (AIB)) nous pouvons choisir nimshy

porte quel eacuteleacutement de A ou de B comme un mot valide Par exemple (alb)b repreacutesente

le langage contenant deux mots ab bb

Fermeture de Kleene

La fermeture de Kleene est une opeacuteration beaucoup plus inteacuteressante Celle-ci utilise

une expression reacuteguliegravere A Le reacutesultat de la fermeture noteacute A est la concateacutenation

48

dun nombre fini deacuteleacutements de A avec possibiliteacute de reacutepeacutetitions Par exemples pour

ab toute chaicircne de a finie possiblement de longueur zeacutero suivie dun b fait partie du

langage Lexpression reacuteguliegravere (alb) repreacutesente nimporte quelle chaicircne finie de a ou de

b

Les langages que nous pouvons geacuteneacuterer avec des expressions reacuteguliegraveres sont assez riches

bien quinsuffisants pour geacuteneacuterer un langage de programmation (Aho Sethi et Ullman

1986)

413 Automates

Avant de pouvoir expliquer agrave quoi servent les expressions reacuteguliegraveres nous devons discuter

des automates une structure dune importance cruciale en informatique

Automate fini

yn automate fini (Ullman Hopcroft et Motwani 1~79) est un quintuplet composeacute de

cinq eacuteleacutements

- Un ensemble fini deacutetats E

- Un alphabet fini A

- Un ou plusieurs eacutetats de deacutepart d (selon que lautomate est deacuteterministe ou non)

- Un ensemble deacutetats dit finaux F

- Une relation de transition T ccedil E x A x E Cela deacutefinit une maniegravere de passer dun

eacutetat agrave un autre lors de lapparition dun symbole speacutecifique

On repreacutesente en geacuteneacuteral un automate par un graphe avec des flegraveches nommeacutees Les

flegraveches repreacutesentent la relation de transition alors que les sommets repreacutesentent les

eacutetats dans E On repreacutesente un eacutetat initial par une flegraveche qui ne part pas dun eacutetat

Finalement on repreacutesente un eacutetat final par un cercle double Par exemple lautomate

suivant accepte lensemble des mots qui sont composeacutes dune seacuterie de a (possiblement

nulle) suivi dun b Donc les mots b ab et aab serait des mots valides par rapport agrave

49

cet automate

Figure 41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b

Lensemble T peut prendre plusieurs formes en fonction du deacuteterminisme de lautomate

comme nous allons maintenant le voir

Automate non-deacuteterministe

Un automate non-deacuteterministe peut posseacuteder plusieurs eacutetats de deacutepart De plus son

ensemble de transitions T est quelconque Il peut donc exister pour un eacutetat e et un

symbole a plusieurs eacutetats e tels que (e a e) E T

Un automate non-deacuteterministe peut ecirctre vu comme une forme de graphe dans lequel on

peut se promener en utilisant certaines transitions La suite des symboles des transitions

que nous utilisons forment un mot Lensemble des mots obtenus par une suite de transhy

sitions allant dun eacutetat initial agrave un eacutetat final constitue le langage de lautomate Dans

un automate non-deacuteterministe il peut neacuteanmoins exister pour le mecircme mot plusieurs

chemins diffeacuterents deacutebutant dans un eacutetat initial Il est important de noter quun mot

est accepteacute degraves quun de ces chemins se termine dans un eacutetat final

Automate deacuteterministe

Un automate non-deacuteterministe nous permet de creacuteer des langages mais le fait davoir

plus dun choix pour le mecircme symbole peut sembler inquieacutetant surtout lorsquil sagit

dinformatique Nous pouvons donc deacutefinir un automate deacuteterministe plus simple Celuishy

50

ci possegravede un seul eacutetat de deacutepart et son ensemble de transitions T assure que pour

chaque symbole il ny a quun seul eacutetat suivant possible Il ny a donc pour chaque mot

quun seul chemin possible agrave partir de leacutetat initial Plus formellement lautomate sera

deacuteterministe si pour tout e E E et a E A il y a un seul e E E tel que (e a e) ET

Le reacuteflexe naturel serait de croire quen enlevant le non-deacuteterminisme dun automate

celui-ci devient beaucoup moins puissant permettant de repreacutesenter beaucoup moins

de langages Or il nen est rien Il a eacuteteacute prouveacute (malheureusement en trop de pages

pour ce meacutemoire) que nimporte quel automate non-deacuteterministe peut ecirctre rameneacute agrave

un automate deacuteterministe quitte agrave voir le nombre deacutetats de lautomate augmenter

exponentiellement Nous pouvons donc toujours creacuteer un automate non-deacuteterministe et

laisser la tacircche agrave un ordinateur de creacuteer un automate deacuteterministe agrave partir de celui-ci

(Ullman Hopcroft et Motwani 1979)

Exeacutecution dun automate et contraintes temporelles

La meacutethode dexeacutecution dun automate deacuteterministe est assez simple Nous lui fournisshy

sons un mot dune certaine longueur disons n Nous deacutemarrons de leacutetat initial et chaque

lettre repreacutesente un choix agrave faire dans lautomate Comme lautomate est deacuteterministe

il ny a quune possibiliteacute agrave explorer Si nous ne pouvons plus avancer avant la fin du

mot celui-ci ne fait pas partie du langage de lautomate Si nous parvenons agrave avancer

jusquau bout et que nous ne sommes pas dans un eacutetat final il nen fait pas partie non

plus Par contre si leacutetat est final nous avons trouveacute un mot du langage Co me le mot

possegravede n lettres nous aurons au maximum n choix agrave faire rendant lalgorithme dapshy

partenance agrave un temps dexeacutecution lineacuteaire Un algorithme lineacuteaire est naturellement

extrecircmement inteacuteressant en informatique car nous voulons un programme qui sexeacutecute

dans un temps raisonnable

51

414 Lien entre langage reacutegulier et automate fini

Nous connaissons donc maintenant deux meacutethodes pour creacuteer un langage Les expresshy

sions reacuteguliegraveres ainsi que les automates Un automate est difficile agrave concevoir pour un

ecirctre humain mais extrecircmement rapide dutilisation par un ordinateur Une expression

reacuteguliegravere est complexe pour un ordinateur mais aiseacutee agrave concevoir par un ecirctre humain Il

nous faut donc voir si nous pouvons obtenir des proprieacuteteacutes communes agrave ces deux outils

Le lien

Il existe en effet un lien qui unit ces deux structures Celui-ci est extrecircmement fort

lensemble des langages quil est possible de geacuteneacuterer avec des expressions reacuteguliegraveres est

exactement le mecircme ensemble que ceux qui peuvent ecirctre geacuteneacutereacutes par un automate fini

deacuteterministe Cela implique que pour chaque expression reacuteguliegravere nous pouvons troushy

ver un automate qui repreacutesente le mecircme langage Cela est vrai aussi en sens inverse

Par contre il ne sagit pas dune bijection car plusieurs expressions reacuteguliegraveres peuvent

correspondre au mecircme automate (par exemple a et aamiddot) Il existe un algorithme permetshy

tant de transformer une expression reacuteguliegravere en automate mais celui-ci est complexe et

deacutepasse le cadre de ce meacutemoire Nous pouvons toutefois mentionner que cet algorithme

est relativement lent (sexeacutecute en O(2m ) ou m est la longueur de lexpression reacuteguliegravere)

mais permet par la suite de trouver si un mot fait partie dun langage en temps lineacuteaire

(McNaughton et Yamada 1960)

Importance dun tel lien

Ce lien est un eacuteleacutement crucial dans la capaciteacute dun ordinateur agrave travailler avec des lanshy

gages de programmation En effet cela permet aux creacuteateurs de langages de deacutecrire des

mots agrave partir dexpressions reacuteguliegraveres (quils comprennent) et de laisser un programme

creacuteer des automates qui peuvent reconnaicirctre ces symboles (un if ou un for mais aussi

des variables) dans des programmes Cela permet donc de creacuteer une partie importante

dun langage quon appelle lanalyse lexicale Cela permet agrave partir de lutilisation de

52

lautomate creacuteeacute par des expressions reacuteguliegraveres de transformer un texte en une suite de

symboles plus speacutecifiques Par exemple le texte

if a 1 then true else faIse

pourrait ecirctre traduit par la suite de symboles suivants

IF VAR EQ NUM THEN BD DL ELSE BDDL FININSTR

Cette eacutetape lanalyse lexicale est cruciale agrave la suite de lanalyse dun programme Les

automates nous sont toutefois utiles non seulement pour les mots cleacutes mais aussi pour

des eacuteleacutements plus complexes comme des variables Une variable est souvent identifieacutee

comme eacutetant une lettre suivie dune suite de caractegraveres quelconques (sauf exception tel

quun espace)

Malgreacute tout il existe certains eacuteleacutements quun automate ne peut reconnaicirctre Un exemple

classique est le parentheacutesage eacutequilibreacute (une suite de parenthegraveses telle que c~aque pashy

renthegravese ouvrante est associeacute agrave une parenthegravese fermante et agrave nimporte quel moment il

nexiste pas plus de fermantes que douvrantes) Il est en effet impossible aux automates

de faire le lien entre les deux types de parenthegraveses (Ullman Hopcroft et Motwani 1979)

Pour cela il nous faudra utiliser des structures plus complexes

42 Grammaires

Ces structures sont les grammaires Il est possible de les voir comme eacutetant une forme

beaucoup plus geacuteneacuterale des expressions reacuteguliegraveres Avec cette structure nous pourrons

nous assurer quun programme est bien formeacute cest-agrave-dire creacuteer un arbre repreacutesentant

la structure dun programme un peu comme la structure dune phrase

421 Deacutefinition dune grammaire formelle

Une grammaire est constitueacutee de quatre eacuteleacutements

53

- Un ensemble fini de terminaux Ceux-ci sont des symboles repreacutesentant les lettres

dun langage Par conseacutequent on peut aussi appeler les terminaux lalphabet dune

grammaire

- Un ensemble fini de non-terminaux Habituellement repreacutesenteacute par des majuscules

(par des symboles diffeacuterents des terminaux) pour des raisons de clarteacute ceux-ci repreacuteshy

sentent des eacutetats intermeacutediaires de la grammaire

- Un non-terminal de deacutepart parmi lensemble deacutecrit plus haut

- Un ensemble de regravegles de production Celles-ci vont varier selon la cateacutegorie de langage

choisie mais de maniegravere geacuteneacuterale une regravegle de production est une paire ordonneacutee

dont chaque eacuteleacutement est composeacute dune suite de terminaux et de non-terminaux (par

exemple aB -t aAa)

Le fait de repreacutesenter une regravegle de production avec une flegraveche permet den expliciter le

rocircle transformer une suite de caractegraveres en une autre Lutilisation dune grammaire

consiste donc agrave deacutemarrer avec le non-terminal de deacutepart puis dappliquer une suite de

regravegles de production pour modifier le non-termina Lorsquon obtient un mot formeacute

uniquement de terminaux il sagit dun mot du langage repreacutesenteacute par la grammaire

Par exemple

S -gt aA

A -gt b

repreacutesente un langage contenant le seul mot ab On applique doEn effet unc un proceacutedeacute

de deacuterivation (en appliquant chaque regravegle) Par exemple une deacuterivation possible du mot

ab dans ce contexte (la seule dailleurs) est la suite suivante

S (deacutepart)

S -gt aA (application de S -gt aA)

aA -gt ab (application de A -gt b)

54

422 Hieacuterarchie de Chomsky

La deacutefinition que nOlis avons donneacutee preacuteceacutedemment dun langage est beaucoup trop

geacuteneacuterale pour nous fournir des proprieacuteteacutes inteacuteressantes Afin de deacutegager des proprieacuteteacutes

inteacuteressantes nous deacutefinissons plusieurs cateacutegories Plusieurs noms sont utiliseacutes pour

chaque cateacutegorie mais nous nous limiterons agrave utiliser ceux deacutefinis par le linguiste Noam

Chomsky (Chomsky 1956) Chacune de ces cateacutegories sera deacutecrite par les proprieacuteteacutes de

sa grammaire Il est agrave noter que nous avons neacutegligeacute certaines cateacutegories de langages qui

ne sont pas lieacutees au domaine

Langage reacutegulier

Un langage reacutegulier est eacutequivalent aux expressions reacuteguliegraveres Les regravegles de production

de la grammaire doivent ecirctre de la forme

A -) Ba

A -) a

ou

A -) aB

A -) a

avec A et B des non-terminaux et a un termina Il est agrave noter que toutes les regravegles

dune grammaire doivent ecirctre soit du premier cas soit du deuxiegraveme cas On les appelle

reacutecursives agrave gauche ou agrave droite respectivement

Langage non-contextuel

Un langage non-contextuel est un peu plus complexe quun langage reacutegulier Les regravegles

de production de la grammaire doivent ecirctre de la forme

55

A -) B

avec A un non-terminal et B une suite de terminaux et de non-terminaux Le deacutetail

le plus important est de noter que les langages non-contextuels permettent de creacuteer un

systegraveme de parenthegraveses eacutequilibreacutees En effet voici une grammaire qui accepte seulement

un parentheacutesage eacutequilibreacute

P -) pp

P -) CP)

P -)

Il est eacutevident quune grammaire reacuteguliegravere ne peut geacuteneacuterer ce genre de langage Par contre

un parentheacutesage eacutequilibreacute est extrecircmement important dans le domaine de la compilashy

tion afin dexprimer clairement les ideacutees dun programmeur et plus speacutecifiquement

permettre deacutecrire des formules matheacutematiques complexes compreacutehensibles par lOlmiddotdishy

nateur

Langage contextuel

Les langages contextuels ne sont pas utiliseacutes en geacuteneacuteral en compilation car ils sont

beaucoup plus lents Les regravegles de production de la grammaire doivent ecirctre de la forme

ABC -) ADC

ougrave B est un non-terminal A et C sont des non-terminaux ou le mot vide et D est un

non-terminal (mais pas le mot vide) On voit clairement ici dougrave vient le nom de ce type

de langage B est transformeacute en fonction de ce qui est autour de lui (son contexte)

423 Utiliteacute dans les langages de programmation

La prochaine tacircche dans la creacuteation dun langage est danalyser la structure de notre

programme Pour effectuer cette tacircche nous pouvons utiliser une grammaire non-conshy

56

textuelle Agrave cette fin nous pouvons nous assurer que les eacutequations sont correctement

formeacutees que les instructions sont valides etc

Dans un autre ordre dideacutee la hieacuterarchie de Chomsky possegravede aussi des liens avec les

machines de Turing qui sont elles-mecircmes intimement lieacutees agrave la theacuteorie de la complexiteacute

(Davis Sigal et Weyuker 1994) Ce domaine est extrecircmement vaste et le lecteur pourra

trouver dans les reacutefeacuterences plusieurs excellents ouvrages pour sinitier agrave ce domaine (Dhu

et Ko 2000)

43 SableCC

Bien quil est tregraves inteacuteressant deacutetudier les algorithmes de compilation limpleacutementation

de chacun de ces algorithmes deacutepasse largement le cadre de ce meacutemoire Il nous faut

donc trouver une meacutethode afin de creacuteer notre langage de programmation Plusieurs

outils soffrent agrave nous mais notre choix sarrecirctera sur SableCC

431 Quest-ce que S~bleCC

SabieCC est ce quon appelle un compilateur de compilateurs (Gagnon 1998) Un comshy

pilateur de compilateurs est un programme qui permet agrave partir dune deacutefinition absshy

traite dun langage de programmation dobtenir un compilateur pour ce langage Plus

speacutecifiquement le programme reacutesultant nous permettra dobtenir larbre syntaxique

dun programme ce qui nous permettra de lanalyser reacutecursivement et de lexeacutecuter (ou

bien de le transformer dans un langage diffeacuterent selon le cas) Les formes abstraites que

requiert un compilateur de compilateurs sont justement les expressions reacuteguliegraveres (pour

deacutecouvrir les symboles) et les grammaires non-contextuelles (pour lanalyse syntaxique

des symboles obtenus preacuteceacutedemment)

432 Avantages de SableCC

Bien que SabieCC nest pas le compilateur de compilateurs le plus connu il possegravede

plusieurs aspects inteacuteressants Premiegraverement comparativement agrave ses compeacutetiteurs plus

57

acircgeacutes SabieCC est eacutecrit dans un paradigme orienteacute-objet Cela rend le compilateur beaushy

coup plus simple agrave utiliser De plus le logiciel geacutenegravere automatiquement un ensemble de

classes (dans un choix de plusieurs langages) qui permet de traiter aiseacutement et claishy

rement avec des concepts modernes les arbres syntaxiques reacutesultant de lanalyse du

programme

44 Langage reacuteflexif

Finalement une fois que nous avons obtenu un arbre syntaxique et que nous savons que

notre langage est bien formeacute il nous reste la reacuteflexiviteacute agrave prendre en compte En effet

nous ne voulons pas reacuteeacutecrire inutilement dans notre langage chaque fonction qui existe

deacutejagrave en Java Nous pourrons les utiliser avec un langage reacuteflexif Une autre possibiliteacute

dun langage reacuteflexif est de deacuteleacuteguer agrave SDDL la creacuteation de classes Cela permet agrave lutilishy

sateur de reacutefeacuterencer nimporte quelle classe Java sans avoir agrave changer le code de SDDL

lui-mecircme Cela serait impossible sans un langage reacuteflexif

441 Deacutefinition dun langage reacuteflexif

Un langage reacuteflexif (Sobel et Friedman 1996) est un langage qui est capable soit de

- Examiner son eacutetat cette proprieacuteteacute est appeleacutee introspection

- Modifier son eacutetat cette proprieacuteteacute est appeleacutee intercession

Lintrospection permet agrave un langage de connaicirctre entre autres les classes quil utilise

ainsi que les meacutethodes et les paramegravetres Lintercession beaucoup plus puissante pershy

mettrait par exemple cie rajouter modifier ou supprimer des classes etou meacutethodes

Pour nos besoins nous sommes naturellement inteacuteresseacutes par lintercession

442 Avantages

Lavantage le plus clair de lutilisation de la reacuteflexiviteacute est la reacuteutilisation du code En

effet toutes les fonctionnaliteacutes du langage infeacuterieur (Java dans ce cas-ci) peuvent ecirctre

58

automatiquement passeacutees au langage supeacuterieur Cela eacutevite davoir agrave reacuteeacutecrire du code

pour chaque nouvel eacuteleacutement agrave ajouter

Un autre avantage assez explicite est de permettre agrave des utilisateurs un peu plus aguerri

de lier du code des deux niveaux de langage ensemble En effet si un utilisateur creacutee

une structure de donneacutees en Java il peut toujours se servir exactement de la mecircme

classe dans le langage supeacuterieur sans avoir agrave faire la moindre modification au langage

supeacuterieur lui-mecircme Il est donc clair quun langage qui utilise la reacuteflexiviteacute peut devenir

tregraves puissant

443 Deacutesavantages

Certains deacutesavantages accompagnent aussi la reacuteflexiviteacute Un des plus importants est la

contrainte de seacutecuriteacute En effet si un utilisateur peut appeler nimporte quelle classe

Java agrave partir du langage supeacuterieur il peut tregraves aiseacutement appeler des fonctions qui cassent

le programme si un controcircle suffisamment important nest pas effectueacute par le logiciel Il

peut aussi sans causer d~s problegravem_es de seacutec~riteacute confondre un usager en provoquant

des effets de bord sur leacutetat du logiciel cest-agrave-dire modifier des proprieacuteteacutes du reste du

programme sans neacutecessairement que cela paraisse

Un autre deacutesavantage eacutevident est quun utilisateur qui souhaite utilicirc3er les fonctions du

langage infeacuterieur doit en quelque sorte connaicirctre celui-ci Cela implique donc lapprenshy

tissage dun deuxiegraveme langage ce qui en soit peut paraicirctre trop pour des utilisateurs

plus traditionnels

Lorsquon analyse froidement les avantages et les inconveacutenients on voit que les avanshy

tages sont beaucoup plus importants En effet le projet eacutetant limiteacute dans le temps et

dans le personnel il est en quelque sorte impossible de fournir des librairies de foncshy

tions suffisamment complegravetes pour les utilisateurs Se brancher sur les librairies Java

fournit automatiquement tout ce dont nous avons besoin et donne accegraves agrave une quantiteacute

innombrable de projets deacutejagrave creacuteeacutes dans ce langage

CHAPITRE V

MISE EN OEUVRE DE LA SOLUTION

Maintenant que nous avons des bases theacuteoriques solides ainsi quune hieacuterarchie bien

adapteacutee agrave nos besoins nous pouyons commencer agrave impleacutementer notre solution Cela

implique premiegraverement la creacuteation de notre hieacuterarchie objet en Java Deuxiegravemement

nous devons impleacutementer une grammaire afin de deacutecrire SDDL Finalement il faut

ajouter du code afin dimpleacutementer certaines proprieacuteteacutes voulues pour notre langage Il

est agrave noter que nous avons inclus en annexe un diagramme de notre hieacuterarchie ainsi que

la grammaire complegravete de SDDL

51 Eacuteleacutements de langage en SDDL

511 Impleacutementation de la hieacuterarchie

Limpleacutementation de la hieacuterarchie eacutetant seacutepareacutee du reste du langage il est normal de

commencer avec celle-ci eacutetant donneacute quelle repreacutesente le module le plus important de

notre projet Cela nous permet de le tester au fur et agrave mesure avant de commencer agrave

creacuteer un langage de plus haut niveau qui lutilise

Un des problegravemes les plus importants du deacuteveloppement de la hieacuterarchie fut de deacuteveshy

lopper correctement la deacutefinition et laccegraves agrave des points speacutecifiques de certains objets

Comme lideacutee eacutetait de permettre dobtenir une quantiteacute essentiellement illimiteacutee de

points diffeacuterents il fallait une meacutethode robuste et efficace

60

Notre meacutethode implique de fournir des informations par rapport au dessin englobant agrave

chaque sous-dessin Cela est requis car un objet preacutesent agrave plusieurs endroits diffeacuterents

auquel on demande un point speacutecifique se bute agrave une ambiguiumlteacute Mecircme en utilisant

seulement un Drawing qui est techniquement une instance unique dune forme il faut

faire attention En effet si on a un Drawing dun cercle qui est agrave linteacuterieur dune

ellipse par exemple nous pourrions deacutecider de placer cette ellipse agrave plusieurs endroits

Nous aurions donc le mecircme problegraveme dambiguiumlteacute du positionnement des points Afin

de remeacutedier agrave ce problegraveme nous avons fourni au Drawing sa position agrave linteacuterieur du

diagramme Lorsquil est copieacute nous navons quagrave changer linformation pour que le

positionnement soit correct

512 Grammaire

Le deacuteveloppement de la grammaire fut naturellement une section cruciale du deacutevelopshy

pement de SDDL Comme nous avions deacutejagrave deacuteveloppeacute des objectifs speacutecifiques pour la

forme du langage la creacuteation fut relativement directe Quelques eacuteleacutements importants

ont toutefois ducirc ecirctre ajouteacutes en cours de route En particulier des eacuteleacutements seacuteparateurs

ont eacuteteacute dune importance cruciale Il aurait donc pu ecirctre souhaitable de diminuer la

verbositeacute en enlevant des parenthegraveses ou des virgules mais cela cause (dans la plupart

des cas) des problegravemes au niveau de lambiguiumlteacute de la grammaire (tel que nous lavons

vu preacuteceacutedemment)

Nous avons aussi deacutecideacute de deacutecreacuteter quune expression geacuteneacuterale est une instruction Cela

peut sembler contre-intuitif car une expression (comme 2 + 2) ne semble pas ecirctre une

instruction La raison derriegravere ce changement est le dessin de chemin En effet nous

pouvons deacuteterminer un chemin (Path) comme nimporte quel autre objet Par contre

cela implique de lajouter par la suite seacutepareacutement agrave un canevas Cela semble contreshy

intuitif nous voyons souvent les liens entre les objets comme eacutetant des liens de niveau

supeacuterieur (bref faits dans le canevas principal) Pour lier a et b il semble plus logique

deacutecrire

61

a--b

que

lien = a--b

put lien in main

Afin de reacutegler ce problegraveme nous avons deacutecideacute de laisser les expressions ecirctre des insshy

tructions Cela fait que deacutefinir une ligne (comme a--b) devient automatiquement une

instruction valide Celle-ci sera traiteacutee comme un cas speacutecial afin decirctre placeacutee direcshy

tement au centre du canevas principal Cela implique aussi comme nous le verrons

plus tard de rajouter du code afin de sassurer que les expressions qui ne sont pas des

instructions soient refuseacutees par le programme

stm = exp exp sc 1 assign id assign exp sc 1 while while_kwd exp do_kwd (stms] stm end_kwd sc 1 if if_kwd exp then_kwd (stms] stm else_part end_kwd sc 1 for for_kwd id from~kwd (low_bound] exp to_kwd (up_bound] exp

do_kwd (stms] stm end_kwd sc 1 return return_kwd exp sc

Figure 51 Extrait de la grammaire de SDDL pour une instruction

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage

Plusieurs proprieacuteteacutes de SDDL ne venaient pas directement avec la grammaire Celles-ci

ont neacutecessiteacute un traitement bien particulier en fonction de la proprieacuteteacute rechercheacutee

Typage

La grammaire de SDDL indique clairement que le langage est agrave typage dynamique eacutetant

donneacute que les creacuteations de variables ne permettent pas de donner un type Le mecircme

62

pheacutenomegravene est preacutesent dans la deacutefinition des fonctions Par contre le fait de souhaiter

un typage dynamique implique lajout dune large section de code deacutedieacutee agrave la veacuterification

de type Chaque opeacuteration ne peut ecirctre appliqueacutee quagrave certains types deacuteleacutements et donc

avant deffectuer lopeacuteration il faut veacuterifier si le type est valide

Eacuteleacutements objets

Impleacutementer tous les principes dun langage orienteacute-objet est un travail de longue hashy

leine Par contre eacutetant donneacute que notre objectif eacutetait de simplifier le langage de desshy

cription final nous avons deacutecideacute de ne pas permettre la creacuteation de nouvelles classes

agrave linteacuterieur de SDDL Cela implique que nous pouvons releacuteguer la creacuteation de classes

uniquement au langage Java Cela a donc grandement faciliteacute la tacircche car nous navions

pas besoin dimpleacutementer la tregraves grande majoriteacute des concepts objets que nous laquo emshy

pruntons raquo agrave Java

Eacutelimination de la verbositeacute

Une bonne partie de leacutelimination de la verbositeacute vient de la conception mecircme du lanshy

gage En effet le fait de releacuteguer la deacutefinition des classes agrave Java ainsi que de creacuteer le

typage dynamique ont purement par choix eacutelimineacute une bonne partie de la verbositeacute

Quelques eacuteleacutements suppleacutementaires ont permis deacuteliminer un excegraves de verbositeacute On

note entre autres le fait de deacutefinir la description du diagramme sans le speacutecifier dans le

cadre dune fonction Un autre pheacutenomegravene important est davoir deacutecideacute de promouvoir

les points et certaines fonctions relieacutees agrave leacutetat de primitive naturelle du langage En

effet une addition entre un point a et b seffectue

c = a + b

au lieu de en Java

AbstractPoint c aadd(b)

63

Cela peut sembler comme un maigre gain mais lorsquappliqueacute agrave un calcul complexe

impliquant des points (par exemple le calcul dune combinaison lineacuteaire) les gains

combineacutes rendent le code extrecircmement clair

AbstractPoint c = amultiply(1030)add(bmultiply(2030))

c = (a 30 + 20 b 30)

Figure 52 Code Java et SDDL pour calculer une combinaison lineacuteaire

52 Reacutealisation en Java

Afin de reacutealiser SDDL il a bien sucircr fallu eacutecrire une grammaire mais beaucoup de code

autour sert agrave inteacutegrer la grammaire au restant des fonctionnaliteacutes de notre hieacuterarchie

Ce code fut complegravetement eacutecrit en Java et remplit plusieurs fonctions

521 Traverseacutee de larbre grammatical et exeacutecution

La grande majoriteacute du code Java suppleacutementaire eacutecrit a servi agrave permettre la traverseacutee

de larbre grammatical creacuteeacute par notre grammaire Cette traverseacutee permet en quelque

sorte lexeacutecution du code SDDL et est donc cruciale Pour la plupart il sagit dune trashy

verseacutee en profondeur relativement classique Quelques petits deacutetails retiennent toutefois

lattention

- Certains morceaux de code ne doivent pas ecirctre exeacutecuteacutes et ont donc un comportement

speacutecial Cest le cas des deacutefinitions de fonctions qui ne sont exeacutecuteacutees quagrave lappel On

meacutemorise donc en quelque sorte une partie de larbre grammatical et lors dun appel

on transfegravere le controcircle dexeacutecution agrave cette partie Eacutevidemment lors de la lecture de

la deacutefinition de la fonction il faut stocker quelques informations sur nos fonctions

dans une structure deacutefinie agrave cet effet (un Methodlnf0)

- Certaines opeacuterations ont plusieurs sens distincts qui ne peuvent ecirctre speacutecifieacutes dans la

grammaire La seacutemantique dune telle opeacuteration napparaicirct clairement quau moment

de la lecture de lopeacuteration (dans notre cas agrave lexeacutecut ion) Un exemple serait le

64

symbole daddition Bien que sa grammaire soit tregraves claire il peut sagir dune addition

de nombres mais aussi dune addition de points ou dune concateacutenation de chaicircnes

de caractegraveres Il est donc neacutecessaire agrave lexeacutecution de veacuterifier la classe de chaque objet

requis par lopeacuteration afin de trouver la bonne seacutemantique pour lopeacuteration si une

telle seacutemantique existe Si aucune nest trouveacutee on peut alors soulever une erreur

selon le meacutecanisme standard (par exemple additionner un point et une chaicircne de

caractegraveres)

- Certaines expressions grammaticalement correctes ne sont valides que sous certaines

conditions Par exemple nimporte quelle expression (exp) est accepteacutee comme eacutetant

une instruction (stm) grammaticalement valide Par exemple linstruction 2 + 2 va

ecirctre accepteacutee par la grammaire Par contre elle na pas de sens car elle naccomplit rien

du tout Il faut donc sassurer de veacuterifier dans la traverseacutee que lexeacutecution est leacutegale

Dans ce cas-ci il faut sassurer que lexpression de niveau supeacuterieur (une addition)

est valide pour ecirctre une instruction Dans un tel cas une erreur serait souleveacutee encore

selon le meacutecanisme standard

522 Deacutefinition dobjets quelconques

Une partie moins grande du code est consacreacutee agrave linteacutegration de la hieacuterarchie de SDDL

dans la deacutefinition du langage Comme nous souhaitions utiliser des classes quelconques

nous avons utiliseacute la reacuteflexiviteacute Java telle que nous le deacutecrivions plus tocirct Cela implique

de reacutecupeacuterer les noms des fonctions et des classes lors de leurs utilisations Toutes les

veacuterifications seffectuent agrave lexeacutecution Nous savons donc seulement si une classe A existe

bel et bien lorsque nous essayons de creacuteer un objet agrave partir de celle-ci De plus chaque

fonction appeleacutee sur un objet de classe A nest veacuterifieacutee que lors de son utilisation

Habituellement la solution aurait eacuteteacute de veacuterifier avant lexeacutecution lexistence de chaque

classe ainsi que les fonctions de chaque classe pour sassurer que lexeacutecution soit correcte

Dans notre cas la veacuterification agrave lexeacutecution est suffisante car les programmes sont tregraves

courts

De plus quelques contraintes ont ducirc ecirctre ajouteacutees afin de sassurer Clue seules les parties

65

Override public void caseADrawingTermCADrawingTerm node)

String className = nodegetClassName() getText()

try

thiscurrentExpressionClass ClassforName(sddlhierarchy + className)

thiscurrentExpressionValue = thiscurrentExpressionClassgetConstructor() newlnstance()

catch(NoSuchMethodException e)

throw new InterpreterException( cl ass Il + className + is ill-defined (no base constructor) nodegetClassName())

catch(Exception e)

throw new InterpreterException(unable to load + className +

Il class (maybe it does not exist) nodegetClassName())

Figure 53 Code reacuteflexif pour creacuteer une forme quelconque

requises de Java sont exposeacutees agrave lutilisateur final La restriction principale est de ne

creacuteer que des objets qui font partie du paquet sddl hierarchy Il est toutefois agrave

noter que cela nisole pas totalement le reste de Java car il est tout agrave fait possible de

creacuteer une classe qui permet dacceacuteder agrave Java complegravetement

523 Gestion des erreurs

La gestion des erreurs seffectue au travers des meacutecanismes deacutejagrave mis en place par Java

cest-agrave-dire les exceptions Une classe speacutecifique aux exceptions de linterpreacuteteur a eacuteteacute

creacuteeacutee qui permet de speacutecifier non seulement un message mais aussi un noeud bien

speacutecifique dans larbre grammatical afin didentifier lendroit ougrave lerreur a eacuteteacute deacutecouverte

66

Cela est extrecircmement utile afin de permettre agrave lutilisateur de corriger la majoriteacute de

ses erreurs

De plus une partie du code de gestion derreurs sert agrave repreacutesenter la pile dexeacutecution

En effet afin didentifier la source dun problegraveme il est important de pouvoir savoir

quelles fonctions sont impliqueacutees Nous pouvons donc identifier la ligne de chaque appel

au moment ougrave lerreur sest produite et ainsi identifier des problegravemes entre autres dans

le cas des fonctions reacutecursives

524 Structures de support

Dimportances mineures la plupart de ces structures servent agrave geacuterer lexeacutecution des

meacutethodes

- La classe Frame repreacutesente le cadre dexeacutecution dune fonction Cette classe permet

dobtenir des fonctions reacutecursives car on peut imbriquer un Frame dans un autre

- La classe Methodlnfo repreacutesente une fonction deacutefinie agrave linteacuterieur de SDDL Elle

permet de transfeacuterer lexeacutecution agrave la deacutefinition fournie par lutilisateur et regroupe

les informations geacuteneacuteralement utiles agrave la veacuterification seacutemantique (nom paramegravetres

etc)

- La classe PrimitiveMethodlnfo repreacutesente une fonction de Java accessible par la

reacuteflexiviteacute Elle fournit aussi quelques informations pour la veacuterification seacutemantique

- La classe MethodTable fournit une table pour geacuterer lensemble des fonctions afin

dacceacuteder directement agrave une fonction agrave partir de son nom

53 Accegraves agrave Postscript PDP et B-1EX

531 Postscript

Afin de reacutealiser correctement notre langage nous avions besoin dacceacuteder agrave diffeacuterentes

technologies Eacutetant donneacute que nous voulons terminer avec des dessins en format Postshy

script il devient important de pouvoir fournir aiseacutement du code dans ce format Il

67

sagit toutefois dun format relativement complexe et il devient donc long et complexe

de fournir une traduction valide pour chacun de nos diffeacuterents concepts

Le problegraveme principal de Postscript est quil possegravede un ensemble de primitives de tregraves

bas niveau En effet afin de dessiner une courbe la seule meacutethode possible est lutishy

lisation de courbes de Beacutezier avec des points de controcircle qui doivent ecirctre fournis agrave

lavance Comme nous lavons vu preacuteceacutedemment les courbes de Beacutezier sont tregraves prashy

tiques pour lordinateur mais peu pratique pour [utilisateur car la speacutecification de

points de controcircles qui ne sont pas interpoleacutes est peu intuitive De plus afin de faire

des courbes quelconques il faut les seacuteparer en plusieurs courbes de Beacutezier de tailles

infeacuterieures

Il existe des algorithmes qui permettent de prendre des courbes et de les seacuteparer en

sections adeacutequates Un de ces algorithmes est impleacutementeacute en Asymptote (Bowman

2007) Il est donc naturel afin deacuteviter davoir agrave reacuteimpleacutementer un algorithme aussi

complexe dutiliser Asymptote pour obtenir nos courbes de faccedilon systeacutematique

532 PDF

Le format PDF possegravede lavantage dinteacutegrer plusieurs fonctions multimeacutedias telles que

les liens les videacuteos les formulaires (Adobe Systems Incorporated 2006) etc Malgreacute

tout PDF outre les quelques ajouts nommeacutes ci-haut est essentiellement similaire agrave

Postscript Eacutevidemment les nombreuses possibiliteacutes fournies par le format PDF sont

deacutesirables (inteacutegrer des videacuteos agrave des notes de cours par exemple) Il existe toutefois

de nombreux convertisseurs qui peuvent prendre un fichier Postscript et le mettre au

format PDF Par contre cette conversion ne permet pas dajouter les fonctionnaliteacutes

PDF qui nous inteacuteressent Il devient donc crucial dobtenir une meacutethode pour fournir

des images directement au format PDF Encore lagrave le fait de passer par Asymptote

nous donne une solution rapide et eacuteleacutegante car le fait de fournir du PDF est inclus

dans le logiciel En geacuteneacuterant directement du Asymptote nous pourrions donc obtenir

automatiquement le format rechercheacute

68

533 ~1lE)C

Leacuteleacutement le plus crucial du langage que nous recherchions au deacutebut eacutetait de pouvoir

utiliser du texte tel que mis en forme par UTEX dans nos diagrammes Un tel besoin

implique plusieurs problegravemes

Premiegraverement un texte UTEX est conserveacute sous la forme dune chaicircne de caractegraveres

standard Par contre apregraves avoir eacuteteacute traiteacute le reacutesultat obtenu est une boicircte contenant

le texte mis en forme La taille de cette boicircte est deacutetermineacutee lors de la mise en page

et ne peut donc pas ecirctre deacutetermineacutee directement par notre programme Or si nous ne

connaissons pas la taille exacte de notre boicircte de texte il est impossible de positionner

un texte par une position autre que son coin supeacuterieur gauche Cela est un comportement

peu inteacuteressant eacutetant donneacute que dans de nombreux graphes on place le texte au centre

dun sommet (donc par exemple le centre de la boicircte sera placeacute au centre dune ellipse)

Afin de pallier agrave ce problegraveme il faudrait demander agrave UTEX de creacuteer les boicirctes une

premiegravere fois et de nous fournir les tailles des boicirctes Par la suite il faudrait geacuteneacuterer

une page UTEX de la bonne taille avec nos dessins puis dire agrave UIEX de geacuteneacuterer les

boicirctes de textes aux endroits que nous aurons calculeacute entre temps Bien que viable

cette meacutethode implique beaucoup de code et de cas diffeacuterents (laccegraves agrave IbIEX par un

programme externe va varier dun systegraveme dexploitation agrave lautre entre autres) Eacutetant

donneacute quAsymptote fournit deacutejagrave un accegraves agrave I5IEX agrave linteacuterieur du logiciel le travail

requis pour lutilisation de I5TEX est de beaucoup diminueacute

534 Geacuteneacuteration du code Asymptote

Afin davoir une solution valide il ne reste donc pl s quagrave nnecter not e so ution agrave

Asymptote Pour le faire nous devons premiegraverement geacuteneacuterer un fichier de code Asympshy

tote valide pour par la suite le faire valider en appelant le programme de maniegravere

externe Eacutetant donneacute que le projet a eacuteteacute eacutecrit speacutecifiquement pour fournir du code

Asymptote une solution simple a eacuteteacute utiliseacutee afin deacutecrire le code le canevas principal

69

public void draw(AbstractPoint location PrintWriter out)

AbstractPoint pl locationadd(new Point (radius 00)) AbstractPoint p2 locationadd(new Point(OO radius)) AbstractPoint p3 locationadd(new Pointe-radius 00)) AbstractPoint p4 locationadd(new Point(OO -radius))

outprintln(draw( + p1so1veO + + p2solveO + + p3solveO + + p4solveO + cycle))

Figure 54 Code pour geacuteneacuterer du code Asymptote pour un cercle

sera appeleacute agrave ecirctre dessineacute qui appellera reacutecursivement chacun de ses sous-canevas

La geacuteneacuteration du code Asymptote a eacuteteacute reacuteserveacutee dans une fonction draw speacutecifique agrave

chaque forme (Shape) qui eacutecrit dans un fichier ouvert fourni en paramegravetre Un exemple

dune telle meacutethode pour la classe Circle est illustreacute agrave la figure 54

Une telle meacutethode est simple mais suffisante pour nos besoins Bien sucircr agrave long terme

une solution plus robuste devrait simposer En effet comme leacutecriture du fichier est

faite directement lors de lexeacutecution les objets doivent ecirctre appeleacutes exactement dans

lordre dont ils sont deacutependants Par exemple un segment dessineacute entre deux cercles

doit ecirctre dessineacute apregraves les cercles car sinon les reacutefeacuterences seront absentes Dans ce cas-ci

le segment va toujours ecirctre deacutefinie par la suite Par contre si nous voulions rajouter

la possibiliteacute dutiliser des extensions dAsymptote cela impliquerait de les eacutecrire au

deacutebut du fichier Il est impossible de le faire avec cette solution

Une solution plus robuste serait dutiliser un outil lieacute agrave SabieCC qui est ObjectMacro

(Gagnon 2009) Cette extension nous permet de simplifier la geacuteneacuteration de code et

deacutecrire agrave des endroits arbitraires dans un fichier agrave laide de macros et de programmation

objet Cela nous permettrait aussi deacutetendre la geacuteneacuteration de code agrave plusieurs formats

diffeacuterents par exemple geacuteneacuterer directement du code PDF au lieu de geacuteneacuterer du code

70

Asymptote

61

CHAPITRE VI

REacuteALISATION DES DIAGRAMMES EN SDDL

Maintenant que nous avons notre programme complet et fonctionnel il faut veacuterifier son

efficaciteacute Nous proceacutedons en deux temps Premiegraverement il faut revenir agrave nos dessins

de base et les coder avec notre logiciel Par la suite il faut aussi les analyser en fonction

des diffeacuterents facteurs cruciaux que nous avons eacutenumeacutereacutes dans les chapitres preacuteceacutedents

Nous pourrons donc agrave partir de cela conclure si le logiciel savegravere efficace pour nos

besoins ou si certains problegravemes lempecircchent de fonctionner adeacutequatement

Naturellement nous avons pris le temps dappliquer cette analyse agrave chacun des dessins

dans notre base de diagrammes du domaine Par manque despace nous nanalyserons

dans ce chapitre que trois dessins Une attention particuliegravere a eacuteteacute porteacutee au choix de

ces dessins afin de repreacutesenter un eacuteventail assez large des capaciteacutes du logiciel et des

diffeacuterents eacuteleacutements cruciaux agrave obtenir dans la description dun diagramme Tous les

diagrammes sont disponibles en annexe avec code sans analyse deacutetailleacutee toutefois

Analyse du code des diagrammes existants

Pour faire notre analyse nous devons premiegraverement obtenir chaque dessin Dans ce cas

nous utiliserons un diagramme tireacute du domaine de la compilation Cela nous fournit un

graphe relativement standard avec un niveau de complexiteacute inteacuteressant sans toutefois

ecirctre trop complexe Par la suite nOlis analyserons un diagramme repreacutesentant une strucshy

ture de tableau Cela montre la capaciteacute du logiciel de travailler avec des structures de

72

donneacutees geacuteneacuterales Finalement nous effectuerons lanalyse dun diagramme de Venn qui

nest a priori pas supporteacute par le logiciel afin de voir la complexiteacute dun diagramme

totalement geacuteneacuteral et qui sort des conventions preacute-eacutetablies par le logiciel

611 Rappel des objectifs cruciaux agrave observer

Naturellement afin de faire une analyse rationnelle de notre solution il faut se remeacuteshy

morer les diffeacuterents objectifs que nous nous eacutetions fixeacutes Les plus importants eacutetaient les

suivants

- Inteacutegration avec Jb1EX Eacutetant donneacute le design de notre solution ce point est naturelshy

lement reacutealiseacute dans tous les diagrammes

- Description de structures Il nous faut pouvoir deacutecrire une structure de maniegravere aiseacutee

Le fait decirctre aiseacute est naturellement subjectif mais nous pouvons ramener le tout au

fait quil soit plus simple de deacutecrire dans notre logiciel Wle structure que dutiliser les

primitives de base du langage Par exemple il est plus aiseacute de deacutecrire une structure

en parlant de boicirctes et de liens quen parlant de lignes et de courbes

- Hieacuterarchie solide et extensible Nous ne testerons pas lextensibiliteacute de la solution car

elle a deacutejagrave eacuteteacute deacutemontreacutee Toutefois les diffeacuterents codes nous permettront danalyser

agrave quel point nous utilisons la hieacuterarchie que nous avons construite et agrave quel point elle

est reacuteellement pratique

Nous avions aussi dautres objectifs de moindre importance

- Gestion des erreurs Il nest pas possible avec du code compleacuteteacute de tester la gestion des

erreurs Lauteur peut toutefois garantir que sans la gestion des erreurs une grande

quantiteacute de temps aurait eacuteteacute perdu dans la reacutedaction du code des diagrammes et ce

malgreacute la connaissance profonde du langage sous-jacent

- Langage fluide et clair Cela peut ecirctre testeacute par le lecteur en regardant le code Si

une analyse rapide lui permet de comprendre le sens du code alors celui-ci est clair

Naturellement lauteur ne peut effectuer cette analyse par lui-mecircme Bien que nous

ne puissions en faire une analyse scientifique en inspectant le code reacutesultant nous

73

sommes confiants que la syntaxe que nous avons choisie est claire et permet dexprimer

clairement les concepts sous-jacents au langage

- Qualiteacute de la documentation et courbe dapprentissage Il sagit ici dun autre eacuteleacutement

que nous pouvons difficilement aborder par nous-mecircmes Cela ne sera pas pris en

compte dans notre analyse

Selon ces diffeacuterents facteurs nous voyons que nous devrons surtout nous concentrer sur

la structure geacuteneacuterale du code ainsi que sur sa complexiteacute Le code doit ecirctre facile agrave

lire tout en permettant de compacter un maximum dinformation dans un minimum

despace

612 Diagramme de compilation

Notre premier dessin est tireacute dun livre de compilation Il sagit dun automate assez

standard et repreacutesente donc un bon diagramme moyen afin de voir les capaciteacutes de

notre logiciel

Figure 61 Diagramme dautomate de compilation

Quelques points importants sont agrave noter dans ce dessin Premiegraverement on note la

creacuteation dune structure sous-jacente (composeacutee dune ellipse et deux cercles) Par la

74

circlel Circle with [radius = 100] circle2 Circ le with [radius = 120] ellipse Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (1000 500) in main d3 put form at (1000 -500) in main put Text with [text $N(p_l)$] at (1000 1000) in main put Text with [text $N(p_2)$] at (1000 500) in main put Text with [text dotsJ at (100000) in main put Text with [text I$N(p_n)$J at (1000 -500) in main

put Text with [text = $s_O$J at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt(coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt(coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt(coord of anglePoint(1800) in maind3circle)

Figure 62 Code pour le diagramme dautomate

suite cette forme est appliqueacutee agrave plusieurs reprises dans le dessin Cela deacutemontre que

dans ce cas-ci il est possible de creacuteer et dutiliser des structures dun certain degreacute de

complexiteacute

On note aussi lutilisation des variables pour reacutecupeacuterer les dessins afin de pouvoir les

reacutefeacuterencer plus tard Cette eacutetape est aussi simple que lassignation agrave une variable Par

la suite on peut noter les flegraveches qui sont traceacutees agrave partir de points deacutefinis agrave partir de

certains cercles La structure mecircme est extrecircmement explicite dans ce cas et rend la

compreacutehension du dessin tregraves simple On reacutecupegravere aussi finalement les points formeacutes agrave

un certain angle dun cercle

75

La complexiteacute du diagramme est beaucoup plus simple quelle ne le serait avec des

primitives de base En effet les seuls dessins explicites que nous devons effectuer par

points sont les flegraveches De plus ces flegraveches sont relativement simples puisque nous navons

rien agrave speacutecifier pour le bout de flegraveche seulement les extreacutemiteacutes Pour le reste les formes

sont soient deacutefinies agrave partir de notre hieacuterarchie (comme les cercles ou les ellipses) ou

bien par un collage de formes plus simples (comme pour la forme form) Les points sont

obtenus par des accegraves structureacutes et fournissent donc des valeurs exactes rendant ces

opeacuterations extrecircmement rapides agrave eacutecrire pour lusager

On note toutefois quil existe certains eacuteleacutements dans le code qui auraient pu ecirctre simshy

plifieacutes afin de rendre le code encore plus compact En effet nous remarquons la preacutesence

de beaucoup de valeurs explicites alors quil aurait eacuteteacute possible de les remplacer par des

variables afin de rendre le tout plus clair

Un eacuteleacutement qui aurait pu amener une touche de simplification aurait eacuteteacute dutiliser des

listes ou des boucles afin dinseacuterer plus aiseacutement les objets Par exemple la structure

complexe aurait pu ecirctre ajouteacutee plusieurs fois par une boucle for avec des positions

calculeacutees en fonction de lindex Nous sommes toutefois davis que malgreacute lameacutelioration

possible que cela fournit au code il est peu probable que les utilisateurs finaux prennent

le temps de faire ce genre de modification et utiliseront fort probablement plus des

positions relatives avec une seacuterie dappels sauf si le nombre dobjets agrave positionner

devenait grand (par exemple une dizaine dobjets)

En geacuteneacuteral nous pouvons toutefois consideacuterer que ce diagramme est simplifieacute de beaushy

coup par lutilisation de notre solution La grande part du code est explicite et la strucshy

ture est tregraves simple agrave observer en regardant uniquement le code Mecircme si tout nest pas

parfait il y a clairement avantage agrave utiliser le logiciel pour coder cet automate

613 Diagramme de tableau

Notre second dessin est tireacute dun livre sur les structures de donneacutees Il repreacutesente

leacutevolution dune structure de donneacutee simple (un tableau) agrave travers certaines modifishy

76

cations

a ab 1 0 2 8 (lime

1 -10

3 7

iuml

Figure 63 Diagramme de tableau

Un des points les plus inteacuteressants de ce dessin est lutilisation dune fonction Elle place

une forme dans un canevas agrave plusieurs endroits speacutecifiques en fonction dune position de

deacutepart et dun vecteur de translation Cela nous permet de placer une forme identique

(un carreacute) plusieurs fois de suite ce qui nous donne limpression quil sagit en reacutealiteacute

dun tableau

Un autre point qui est tregraves important dans ce dessin est que les nombreux carreacutes sont

en fait tous des instances du mecircme deacutefini au deacutebut Cela permet de modifier lensemble

des carreacutes aiseacutement en ne modifiant que les proprieacuteteacutes de celui de base Pour le reste du

dessin il sagit surtout dun ensemble de flegraveches et de textes positionneacutes agrave des endroits

speacutecifiques

En analysant le code on voit une ameacutelioration claire provoqueacutee par le fait dutilishy

ser une fonction pour placer les carreacutes Cela nous permet de simplifier de beaucoup

les appels et les reacutepeacutetitions Nous pouvons toutefois noter que quelques ameacuteliorations

suppleacutementaires pourraient ecirctre apporteacutees En effet une classe aurait pu ecirctre eacutecrite en

Java pour repreacutesenter un tableau agrave lhorizontale ou agrave la verticale Cela aurait pu simshy

plifier significativement le code du dessin en combinant dans la structure le texte et

les carreacutes utiliseacutes pour repreacutesenter le tableau lui-mecircme De plus les flegraveches auraient pu

ecirctre deacutetermineacutees agrave partir de points obtenus du tableau lui-mecircme (par exemple le coin

supeacuterieur droit ou supeacuterieur gauche) auxquels nous aurions ajouteacute un vecentierteur de

deacuteplacement

77

fun dropMany(f n s v c) for i from 1 to n do

put f at (s + (i - 1) v) in c end

square = Square with [length = 200] changeVec = (00 -200) dropMany (square 4 (00 00) changeVec main)

dropMany(square 3 (500 00) changeVec main) dropMany(square 1 (1000 00) changeVec main)

dropMany (square 1 (1500 00) changeVec main) put Text with [text=O] at (00 00) in main

put Text with [text=l] at (00 -200) in main put Text with [text=3] at (00 -400) in main

put Text with [text=7] at (00 -600) in main put Text with [text=bf a] at (500200) in main put Text with [text=2] at (500 00) in main

put Text with [text=4] at (500 -200) in main put Text with [text=7] at (500 -400) in main

put Text with [text=7] at 0000 00) in main put Text with [text=bf $a-b-+$] at 0500 200) in main

put Text with [text=8] at 0500 00) in main put Text with [text=none] at (2000 00) in main

020 100)-gt(380 100) (620 100)-gt(880 100)

(1120 100)-gt0380100) 0620 100)-gt0880100)

Figure 64 Code pour le diagramme de tableau

Avec ces changements le code aurait pu ecirctre beaucoup plus compact Bien que cette

option soit reacutealisable nous ne lavons pas impleacutementeacutee car il eacutetait important de limiter

ce quun usager peut creacuteer sans lutilisation de Java Cela est ducirc au fait que notre objectif

est que seulles utilisateurs experts se servent de Java afin dameacuteliorer le logiciel Le code

est tout de mecircme significativement meilleur que de placer tout agrave la main ce qui nous

permet de conclure agrave lefficaciteacute de notre logiciel dans le cas dune structure geacuteneacuterale

78

614 Diagramme de Venn

Notre dernier dessin est une structure qui ressemble beaucoup plus agrave un dessin geacuteneacuteral

cest-agrave-dire un diagramme de Venn La forme dun tel diagramme fait quil est extrecircmeshy

ment complexe deacutecrire une classe qui permet de dessiner automatiquement ce type de

structure et quil vaut mieux creacuteer les formes une par une comme on le ferait agrave la main

Cela nous permettra danalyser si les choses simples agrave dessiner agrave la main demeurent

facile agrave reacutealiser avec notre logiciel

A

Figure 65 Diagramme de Venn

Ce dessin ne possegravede pas beaucoup de grands points dinteacuterecirct En effet la structure ne

peut pas vraiment ecirctre geacuteneacutereacutee automatiquement par un algorithme alors elle est entreacutee

manuellement On remarque tout de mecircme lutilisation de plusieurs sous-canevas afin

de simplifier le placement des objets qui sont agrave linteacuterieur dautres

Naturellement eacutetant donneacute que la structure doit ecirctre deacutecrite manuellement le code

nest pas plus court que lutilisation de primitives de base Par contre cela est comshy

penseacute par un niveau de clarteacute supeacuterieur eacutetant donneacute lutilisation des canevas afin de

regrouper les eacuteleacutements dans des ensembles respectifs Cfla permet de positionner tous

les eacuteleacutements en valeurs relatives au lieu dabsolues ce qui simplifie de beaucoup le travail

de positionnement

De plus le fait de pouvoir stocker les eacuteleacutements dans des variables nous permet de les

identifier par diffeacuterents noms significatifs ce que des primitives de base comme celles

79

circle = Circle with [radius = 100] bigcircle = Circ le with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvas1 put circle at 050 150) in canvas1 put Text with [text = H] at 050 150) in canvas1 put circle at (-150 150) in canvas1 put Text with [text J] at (-150 150) in canvas1 put Text with [text = B] at (00 -150) in canvas1

put bigcircle in canvas2 put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = F] at 050 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = E] ac (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvas1 at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = A] at (00 -300) in main put bigellipse in main

Figure 66 Code du diagramme de Venn

de PDF ne nous permet pas de faiTe Nous pouvons donc en conclure que mecircme pour

les structures difficiles agrave repreacutesenter notre logiciel fournit tout de mecircme un nombre

significatif davantages

Preacutesentation du produit final

Une fois que nous avons pu confirmer que notre logiciel eacutetait efficace il ne restait plus

quagrave le faire connaicirctre Nous preacutesentons donc ici un reacutesumeacute des efforts qui ont eacuteteacute

effectueacutes afin damener le logiciel agrave la connaissance de la communauteacute gIEX

62

80

621 Statistiques et documentation

En premier lieu avant de pouvoir preacutesenter notre solution il nous fallait la documenter

correctement En effet leffort de deacuteveloppement nous aura permis de deacutevelopper un

produit de tregraves grande taille La taille totale du travail se limite agrave environ 10 megs mais

cela implique plus de 6300 lignes de code deacuteveloppeacutees speacutecifiquement pour le projet

(cela incluant les commentaires mais excluant tout le code geacuteneacutereacute par SableCC qui est

tregraves exhaustif) Avec une taille aussi significative il est tout simplement impensable de

sattendre agrave ce quun utilisateur analyse le code afin de trouver ce qui va reacutepondre agrave ses

besoins

Pour cela nous avons pris le temps de reacutediger une documentation interne Elle consiste agrave

documenter chaque classe de notre hieacuterarchie ainsi que chaque fonction disponibles Cela

fournit des renseignements complets pour quelquun qui cherche un eacuteleacutement speacutecifique

du langage

622 Preacutesentation

Par la suite nous avons reacutedigeacute une preacutesentation pour la confeacuterence TUG 2010 que nous

avons preacutesenteacutee le 28 juin 2010 agrave San Francisco devant des membres tregraves influents de

la communauteacute JbTEX dont Donald Knuth le creacuteateur original de TEX La confeacuterence

nous a permis de nous mettre au pouls des besoins de la communauteacute et de linteacuterecirct

quils portent agrave un tel projet La reacuteponse se voulait enthousiaste particuliegraverement de

la part du preacutesentateur dAsymptote John Bowman La confeacuterence est disponible sur

le site de River Valley (Bourgeois 2010) (malheureusement sans videacuteo eacutetant donneacute un

problegraveme dopeacutemt ur)

Bien quil sagisse dun eacuteleacutement tregraves important dans la preacutesentation dun projet une

confeacuterence ne rejoint pas beaucoup de monde Pour combler ce besoin nous avons aussi

reacutedigeacute un article pour la revue TUGBoat (Bourgeois et Villemaire 2010a) qui est la

revue principale de la communauteacute JbTEX Nous avons inclus larticle en annexe Cela

81

nous a permis de rejoindre un public beaucoup plus grand quune simple preacutesentation

devant public

623 Site web

Finalement afin de faciliter la distribution de notre logiciel nous avons deacuteveloppeacute un site

web (Bourgeois et Villemaire 2uuml1uumlb) pour accompagner la preacutesentation et permettre le

teacuteleacutechargement Le site contient aussi toute notre documentation ainsi que les contenus

des preacutesentations et articles que nous avons mentionneacutes plus haut Nous avons aussi pris

le temps de fournir quelques exemples suppleacutementaires afin de montrer lattrait direct

de SDDL

63 Conclusion de notre analyse

Nous concluons que notre solution est efficace et quelle respecte agrave diffeacuterents niveaux

les critegraveres que nous nous eacutetions fixeacutes au deacutepart Il sagit dune hieacuterarchie dobjets facile

et extensible accompagneacutee dune syntaxe claire et fluide Avec lajout de la gestion des

erreurs et sa capaciteacute agrave deacutecrire plusieurs formes de structures notre logiciel permet de

simplifier la repreacutesentation des diagrammes classiques du domaine Nous en venons donc

agrave la conclusion que notre solution respecte les diffeacuterents critegraveres et nous pouvons donc

consideacuterer notre solution comme eacutetant valide

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CONCLUSIOK

La creacuteation de diagrammes structureacutes comme nous avons pu le constater tout au long

de ce meacutemoire est un sujet tregraves complexe Bien quil puisse de prime abord necirctre vu

que comme la capaciteacute de faire des petits dessins simples nous remarquons rapidement

que les deacutecrire tels que nous les voyons est beaucoup plus difficile quil y parait

Entre autres nous avons pu constater que les diagrammes sont penseacutes de maniegravere

extrecircmement abstraites En effet dans un arbre nous ne voyons pas une seacuterie de somshy

mets relieacutes par des points mais bel et bien un arbre seulement Cette capaciteacute agrave abstraire

la forme du contenu est extrecircmement pratique pour un ecirctre humain mais pas tregraves utile

pour un ordinateur Il est extrecircmement difficile dessayer de saffranchir du besoin de

speacutecifier la forme lorsquon veut creacuteer un diagramme

Il en est de mecircme avec IbTEX duquel nous nous sommes inspireacute Bien que le logiciel

puisse faire la forme de maniegravere adeacutequate dans plusieurs cas ces derniers savegraverent tregraves

speacutecifiques et plus souvent quautrement la possibiliteacute dobtenir un niveau accru de

controcircle sur la forme est souhaitable Dautre part la question du positionnement dun

texte scientifique dans une page a eacuteteacute abondamment eacutetudieacute (entre autre par la creacuteation

de TEX) alors que le bon positionnement dun diagramme la eacuteteacute beaucoup moins Il

est donc probleacutematique de se deacutebarrasser de cet eacuteleacutement de forme dans nimporte quel

logiciel de creacuteation de diagrammes

Cela nous amegravene donc agrave la question naturelle de savoir si notre logiciel savegravere une solushy

tion valide agrave notre probleacutematique initiale En effet bien que notre analyse deacutemontre que

la creacuteation de dessins devient plus simple nous ne pouvons affirmer que nous eacutecrivons

ce que nous pensons du diagramme

- -

84

Or comme la question est de veacuterifier la validiteacute de notre solution nous reacutepondrons par

laffirmative Mecircme si elle nest pas parfaite un degreacute de complexiteacute se trouve eacutelimineacute

malgreacute tout Il est tout de mecircme possible pour un utilisateur de penser en des termes plus

abstraits mecircme sil ne sagit pas du niveau dabstraction optimal De plus eacutetant donneacute

que nous avons creacuteeacute notre solution pour ecirctre extensible il est possible daugmenter le

niveau dabstraction avec la contribution de la communauteacute Bien que la solution ne soit

pas parfaite et aurait pu jouir dameacuteliorations subseacutequentes lobjectif principal eacutetait de

deacutevelopper un langage qui simplifiait la description de diagrammes structureacutes et cela

fut atteint

Naturellement eacutetant donneacute les limites de temps et de complexiteacute plusieurs pistes de

deacuteveloppements suppleacutementaires nont pu ecirctre utiliseacutees En effet nous nous sommes

limiteacutes agrave la description dune image statique Il est toutefois tregraves utile de pouvoir creacuteer

des images dynamiques La possibiliteacute de creacuteer des seacutequences de mouvements agrave linteacuterieur

dun diagramme aurait pu rendre notre outil plus inteacuteressant De plus lUl outil de

geacuteneacuteration automatique de graphes ou darbres mecircme imparfait pourrait fournir des

choix suppleacutementaires agrave un utilisateur qui souhaite obtenir un reacutesultat rapidement sans

toutefois rechercher un reacutesultat parfait

Il est toutefois bon de noter que bien quil soit long et complexe deffectuer de tels

ajouts notre logiciel a eacuteteacute penseacute en fonction de pouvoir ecirctre eacutetendu par lutilisateur Il

est donc tout agrave fait possible de pouvoir eacuteventuellement fournir de telles fonctionnaliteacutes

dans une version future du programme Dici lagrave celui-ci suffira amplement agrave la creacuteation

de diagrammes simples

APPENDICE A

PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

Nous incluons ici larticle complet que nous avons reacutedigeacute agrave propos de notre logiciel

afin den faire la promotion aupregraves de la communauteacute TEX et JbTEX Cet article qui fut

preacutesenteacute dans Tugboat la revue du TEX Users Group tel que mentionneacute preacuteceacutedemment

compleacutemente la preacutesentation qui fut effectueacutee lors de la confeacuterence du mecircme groupe

agrave San Francisco Larticle est essentiellement une introduction pragmatique pour un

utilisateur final et fournit donc plusieurs exemples inteacuteressants dutilisation tout en

deacutecrivant briegravevement les diffeacuterents concepts importants qui ont meneacutes le deacuteveloppement

de SDDL Il sagit de la version finale tel que Jarticle apparait dans le numeacutero de Tugboat

206

Drawing structured diagrams with SDDL

Mathieu Bourgeois and Roger Villemaire

Abstract

We present SOOL a Structured Diagram Description Language aimed at producing graphical representashytions for discrete mathematics and computer science SDDL allows combining graphical objects (circles lines arrows ) and lbTEX boxes to produce diashygrams representing discrete structures such as graphs trees etc with an easy-to-use domain specific lanshyguage

1 What is SDDL

SDDL Structured Diagram Description Language is a high-level domain specific language tailored for diagrams that have an inherent structure Examples of these might be trees graphs and automata Any diagram that is naturally structured can be described in SDOL However it was designed especially for data structures appearing in computer science and discrete mathematics

The main objective of this language is to realize drawings in a natural and structured way Mainly one describes a drawing in SOOL in a way that is simishylar to drawing on a blackboard For example specific shapes (like circles ellipses texts boxes) are drawn at positions that can be either absolute or relative to specific points on already placed shapes Since we aim at mathematical drawings text is handled through lbTEX

Since exhibiting the structure of a diagram is esshysential to our purpose SOOL uses an object-oriented hierarchy completely written in Java under our high-levellanguage Having shapes as objects makes structuring of diagrams easier and more intuitive since most shapes are explicitly represented by a class Furthermore extension by the end user is quite feasible since Java is a well-known language

At the lower level SDDL uses another graphishycal description language for lbTEX namely Asympshytote [1] Our tool produces Asymptote code which is finally converted to an encapsulated PostScript (eps) vector file

2 Canvas and shapes

A diagram in SDDL is defined by a main Canvas It is just like a standard painting canvas in the sense that we can place (or paint) different things on it as much as we like The things we can place inside a Canvas are Shapes Thus for creating a Hello world diagram we would use the following

put Text with [text = Hello worldJ in main

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

resulting in

Hello world

In this example Text is a Shape and it posshysesses a property text which is the JbTEX string used to render the text Each Shape defines a cershytain number of such properties

SDDL permits the definition of variables It is a dynamically typed language so variables dont have to be declared before being used Variables make it possible to reuse the same Shape at multiple locations For example

a = Circle with [radius = 100] put a at (-75 00) in main put a at (75 00) in main

m In this example we specify the location where we want our Shape to be If a location is not specified with the at clause the Shape will be placed at the point of origin of the current Canvas which is its center

One important thing to note is that once a Shape has been put in a Canvas it is immutable It cannot be modified or removed A Shape can be modified alter it has been drawn on a Canvas but this will have an effect only on later use of this object and will not modify the actual Canvas in any way a Shape always appears in a Canvas as it was at the moment it was added

When a Shape is created every property specishyfied by the user is set in the given order It is not necessary to specify ail properties at once nor to set ail of them Most of the properties have appropriate default values However sorne properties if not set will yield strange results For example a circle with no radius property set will have a defaul radius of O Usually property order is irrelevant For instance giving for an ellipse the radius along the x-axis or the y-axis first will yield exactly the saille result

a = Ellipse a = a with [xradius 200] a = a with [yradius 100] put a in main

o 3 Structuring multiple canvases

Every diagram consists of a main Canvas However we can define other Canvas objects if we wish An additional Canvas can be introduced using a typical variable assignment However when a put command is used SODL checks to see if the canvas variable is

4

207 TUGboat Volume 31 (2010) No 2

already defined If it isnt it automatically creates an empty Canvas for use

One of the main reasons to use other Canvases is to create an explicit structure in our diagram Since a Canvas is a Shape once a sub-Canvas has been created it can be placed inside the main Canvas or any other one for that matter This will ensure that everything that is defined inside our sub-Canvas will be placed at the proper position in the final diagram However any Canvas that has been defined but is not linked directly or indirectly with the main Canvas will not be drawn in the final diagram

As an example lets say we want to make a diagram that consists of two identical eyes Instead of defining two identical objects we will create one in a Canvas named form and put it at different positions inside our main Canvas Our eye consists of a circle and an ellipse both with the same center Ali we need to do for this is place them at the default position of the Canvas Finally we can take this subshyCanvas and place it at the two positions required a ~ Circle with [radius~100]

b ~ Ellipse with [xradius~200 yradius~100]

put a in form put b in form put form at (-200 00) in main put form at (200 00) in main

Paths

SDDL offers support for the description of paths The way in which they are described is similar in syntax with MetaPost and Asymptote though with sorne variations A Path shape is described by linking points together with specific linking symbols To draw a line between two points the line symbol - shycan be used To link sorne points using a curve use the curved line symbol - which will use Asymptotes positioning algorithms to create a nice-looking curve which passes through those points For the moment user control over the curve is limited to beginning and ending tangents but could be expanded

pl ~ a--b--c p2 ~ a-b-c

One of the other things you may want to do with a Path is to create an Arrow out of it SDDL defines symbols for forward backward and bidirectional arshyrows for both linear and curved lines Right now however support is restricted to forward arrows

pl ~ alt-b--c-gtd p2 alt-b-c-gtd p3 alt-gtb p4 aCgtb

Once a Path is defined it can be used as any other Shape However one of the main things that you want ta do is ta put your Path somewhere For this you can write something Iike this p ~ (00 00) -- (100 100) put p in main

This is the standard way to add Shapes ta a Canvas However since Paths are usually used to link different Shapes together in the main Canvas special handling is done in SDDL Namely a Path that is not explicitly assigned to a variable will be automatically placed in the main Canvas Therefore the Path will be directly placed in main without any explicit put expression Thus linking has its own special syntax which is more natural and convenient As an example this program (00 00) -- (100 100)

yields exactly the same result as the one just above Furthermore points can be added and multiplied by a scalar (as vectors) Using a dot to locate the origin of the drawing we can use the SDDL syntax ta create this example a ~ (100 100) a--20a-gt(300 00) a-(-10)a-(300 00)

ocirc Finally as we will now see Shapes also usually

define specifie points

5 Drawing and linking shapes together

Ta draw a diagram usually sorne shapes with a specific structure are first laid down Once that is done those objects are linked together with lines curves and arrows However these links must be made between specific positions usually derived from one or more specifie Shapes For example we may want to link the northwestern point of a rectangle with the point on a circle at an angle of 45 degrees These points could obviously be computed in advance However this becomes quite problematic when points are at peculiar angles or more complex relationships between points and Shapes are needed Worst of ail if the position or any other property of a Shape is changed ail computations will have to be redone

To ease object linking SDDL provides so-called reference points A reference point is a point that has no static value unlike points defined by a pair of two real numbers Instead a reference point is defined by its relationship to a specifie Shape appearing at a particular location As a matter of fact ail reference

Drawing structured diagrams with SDDL

208

points are defined along with the Shape because they are a natural part of it This ensures that we always have nice-looking lines at exactly the positions we want them to be

However a reference points exact position in a Canvas will depend on the Shapes position Worse since the same Shape can appears at multiple locashytions in the same Canvas we have to know which occurrence we are talking about

Therefore SDDL introcluces a feature called a Drawing A Drawing is an object that represents a Shape at a particular position Le a specifie occurshyrence of a Shape in a Canvas Whenever a Shape is put inside a Canvas a Drawing is returned and can be assigned to a variable This gives a way to uniquely identify every occurrence of a Shape apshypearing in a Canvas If the same Shape is placed twice two different Drawings will be returned each referring to a different occurrence of the same Shape

a = Circle with [radius = 100] dl = put a at (-100 00) in main d2 = put a at (100 00) in main

Once a drawing has been defined a way to access its points is needed SDDL defines a syntax for extracting points from drawings

coord of (coord) ( (args) ) in (drawing)

Here one specifies the kind of point to use (( coord) ) and any particular arguments required to obtain it The available points are Shape specifie so only those kinds of points which make sense for the particular Shape can be used For instance one can get a point at a particular angle on a Circle This is also an example where an additional argument is needed For instance anglePoint(450) will give the point at 45 degrees

Finally to reference the drawing from which we take the point its clrawing Path (a dot separatecl path) from the main diagram must be given

a = Circle with [radius = 100] dl = put a at (-75 00) in main d2 = put a at (75 00) in main (coord of anglePoint(OO) in maindl)

(coord of anglePoint(1800) in maind2)

m In this example a line between two identical circles is drawn The drawing Paths are simple here since both drawings are made directly in main Thus only main followed by the drawing name is needed

Simply giving a Drawing is not sufficient in order to make reference points non-ambiguous complete drawing Paths are required as we will now show Lets go back to the two eyes we drew previously

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

The eye was defined by a circle and an ellipse both put inside a sub-Canvas Now lets say we want to draw a line between the two circles Each of those circles is defined in the sub-Canvas and they are as a matter of fact the same Drawing a Adding a link between a and itself wauld add a link between the sub-Canvas circle and itself (what could this mean) Adding the sub-Canvas to the main Canvas twice as we did before would just duplicate this structure inside the main Canvas

But since a Canvas is a Shape we get a drawing when we put the sub-Canvas inside main We can therefore identify each inner circle by listing the drawings required to access them as shown in the following SDDL example Thus we can always link together Shapes that are deeply nested inside a subshyCanvas a = Circ le with [radius=100] b = Ellipse with [xradius=200 yradius=100] c = put a in form put b in form fl = put form at (-200 00) in main f2 = put form at (200 00) in main (coord of anglePoint(1800) in mainflc) -gt

(coord of anglePoint(OO) in mainf2c)

6 Programming constructs and lists

SDDL also defines typical programming constructs For instance Iists are created and elements accessed in a syntax similar to most other dynamic languages Since the content of a list is a general Java Dbject you can create a list of objects that are not of the same type Thus an assignment like l = [20 (00 00) [] a--b]

is perfectly legal even if not typically very useful A more typical use of Iists would be list = [(00 00) (100 100)] 1= list[O] 12 = list [1]

1--12

Lists are nice but to use them properly adeshyquate programming canstructs are needed such as for and while loops SODL defines those permitting us to draw arrays of Shapes or riAfine points through a simple list

The ability to use loops significantly simplifies many diagrams in computer science In this example we first define a Iist of points Afterward using a for loop we link those points into a linear Path a = [(100 100) (200 100)

(200 200) (100 200)] for i from 0 to 2 do

209 TUGboat Volume 31 (2010) No 2

a[i]--a[H1)

end

Alternatively we coulcl get the same result using the following while loop i = 0 hile i 1= 3 do

a [il --a [i+1] i = i + 1

end

7 Functions

SDDL also permits the creation of functiolli inside the code Those must be written before the diagram description A SDDL function is defined with the keyword fun The list of arguments does not need to be typed only named The return type (if it exists) does not need to be specified either To cali the function in the resulting code a typical C-like cali is used fun dropManyCs i v n c)

for j from 1 to n do put s at i + jv in c

end

circle = Circ le vith [radius = 50] dropManyCcircle COO 00)

C50 00) 100 main)

(rtttt3JJJ) In this case we define a function that drops

many instances of a Shape s at different positions on a Canvas c The positions of the Shape are detershymined by an initial point i and a translation vector v Finally the number of Shapes placed is also given as a parameter n Each Shape is then placed at the initial point translated by the translation vector a certain number of times This permits us to create many circles along one line

One important point is the parameter for the Canvas in which we place the Shapes However we pass main as our parameter The reason for this is that SDDL does not possess global variables A function can only access its parameters and variables that have been defined inside the function Thus trying to place something in main From inside a funcshytion will yield an errer message saying the variable main is unknown

8 Primitives

SDDL as mentioned before is written in Java One of the nice features of Java is its libraries Many classes have been written for any number of different tasks and the number of functions and algorithms implemented is astonishing To rewrite libraries that are already defined in Java or to link them one by

one in SDDL seemed pointless It is much nicer to directly use those functions since theyre already there

Since Java is a reftexive language in the sense that the program knows about itself and can modify itself at will functions can be dynamically accessed at runtime We already use this feature to simplify the definition of the SDDL interpreter the interpreter doesnt have to know every possible type of Shape in order to work Using these same mechanisms permits loading classes at runtime and gives the user the power to cali From inside SDDL any Java function

This is done through so-called primitives which are defined using the keyword primitive followed by the name of the function as it will appear in SDDL Following that two strings are given one for the package in which the function is defined and one for the name of the function as it was defined in Java Any primitive declaration must be made prior to any function definition

Lets look at an example One of the main things a diagram description language would require is sorne basic mathematics and geometry libraries Java possesses a nice java lang math package which we would like to use especially the sin and cos funcshytions For this we will need to define two primitives primitive static sin javalangMath sin primitive static cos javalangMath cos

Once they are defined they can be called just like any other SDDL functions In this case we will use those functions to place circles around an invisible circle for i from 1 to 6 do

put Circle vith [radius = 50] at C200 cos(i 314 30) 200 sin(i 314 30raquo

in main end

00 o 0 00

9 A concrete example

Now that we have ail our tools lets use SDDL to describe a simple diagram of an automaton This is the complete code along with the resulting image circlel Circle vith [radius = 100] circle2 Circle vith [radius = 120] ellipse Ellipse vith [xradius = 500

yradius = 200] circle = put circlel at (-300 00) in form put circlel at C300 00) in form put circle2 at (300 00) in form

Drawing structured diagrams with SDDL

210

put ellipse in form

dl = put form at (1000 1000) in main d2 = put form at (1000 500) in main d3 = put form at (1000 -500) in main put Text with [text=$N(p_1)$]

at (1000 1000) in main put Text with [text=$N(p_2)$]

at (1000 500) in main put Text with [text=dots]

at (100000) in main put Text with [text=$N(p_n)$]

at (1000 -500) in main

put Text with [text = $s_O$] at (00 200) in main

d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle) (coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle) (coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

10 Modifying the hierarchy by adding shapes

Using what has been described above most diagrams can be created However many simplifications can be made and sorne domains may find it relevant to add classes specifie to their trade SDDL eases the modification of the Java hierarchy underneath the language by using reftexivity Any user who respects sorne basic guidelines will be able to have its class work automatica11y in SDDL without any specifie linking required

To do this every class must possess a certain number of properties Those properties are defined through setters and getters For instance for the

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

radius of a circle these are called setRadius and getRadius Any property that follows this rule will be accessible

Furthermore an empty constructor must also be defined that sets as much as possible default values for a11 properties of the defined Shape There are also sorne small functions to be defined like the draw and obtainPath functions Any reference points must also be defined with a function to obtain them

As an example lets say we would like to add a class to represent a cloud A cloud will have a number of spikes and a size The class definition (without function definition) that we would require would be the following

public class Cloud extends Shape double size int numberOfSpikes public Cloud() public void setSize(double size) public double getSize() public void setNumberOfSpikes(int n) public int getNumberOfSpikes() public void draw(AbstractPoint a

PrintWriter w) public Path obtainPath()

11 Future additions and availability

SDDL is available now at httpwwwinfo2uqam cal -villemaire_rReChereacuteheSDDL It is funcshytional though not by any means complete Many additional Shapes couid be added (in particular tree and graph classes) and options could be added to existing classes Development of the application conshytinues for the time being and a more thorough version will be made available

References

[1] John C Bowman and Andy Hammerlindl Asymptote A vector graphies language TUGboat The Communications of the TEX Users Group 29288-294 2008

o Mathieu Bourgeois Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada bourgeois dot mathieu dot 2 (at)

courrier dot uqam dot ca

o Roger Villemaire Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada villemaire dot roger (at) uqam dot ca httpintrainfouqamca

personnelsMembersvillemaire_r

APPENDICE B

PREacuteSENTATION DE LA GRAMMAIRE DE SDDL

Nous preacutesentons ici le contenu entier de la grammaire de SDDL tel que reacutealiseacute avec

SableCC Tous les eacuteleacutements du langage sont lagrave agrave lexception de la reacuteflexiviteacute dont les

deacutetails de code sont situeacutes dans la partie Java de notre projet

Package sddlsyntax

Helpers

any [O Oxffff]

tab 9 li 10 cr = 13

upper [ A 2 ]

lower [ a z]

digit [ 0 9]

name char = upper 1 lower 1 digit -

string_char = [[32 126] - ]

= J bulldot

not star = [any-] not_star_not_slash = [not_star - l]

Tokens

92

put_kwd = put at_kwd = at in_kwd = in fit_kwd = fit around_kwd = around if_kwd = if

while_kwd = while true_kwd = true false_kwd = false then_kwd = then else_kwd = else for_kwd = for from_kwd = from end_kwd = end to kwd to by_kwd = by do_kwd = do with_kwd = with and_kwd = and or_kwd = or fun_kwd = fun return_kwd = return primitive_kwd = primitive call_kwd = call static_kwd = static coord_kwd = coord of _kwd = of get_kwd = get

scaled_kwd = scaled slanted_kwd = slanted rotated_kwd = rotated translated_kwd = translated

straight_line_kwd = -- curved_line_kwd = - straight_fwd_arrow_kwd = -gt curved_fwd_arrow_kwd = -gt straight_bwd_arrow_kwd = (- curved_bwd_arrow_kwd = (- straight_bidir_arrow_kwd = (-gt curved_bidir_arrow_kwd = (-gt

93

plus = + minus = -

mult = div =

eq = == neq = = lt lt gt = gt leq lt= geq gt= not assign = =

dot = dot

l br = - r br ( l _par = ) r_par =

l cr = [ )

-r_cr = J

sc = comma =

id = lower name_char class_name = upper name_char

integer = (-) digit+ real = (-) digit+ dot digit+

) ) Il J )Ilstring string_char

blank = 1 tab 1 cr 1 If 1 cr If comment not_star ( (not_star_not_slash not_star))

Ignored Tokens

blank comment

Productions

file = [primitives] primitive [functions] function [stms] stm

94

primitive =

primitive_kwd static_kwd id [class_name] string [func_name] string signature sc

signature = l_par type_list r_par

type_li st = string [additional_types] additional_type

additional_type comma string

function = fun_kwd id l_par id_list r_par l_br [stms]stm r_br

id_list =

id [additional_ids] additional_id

additional id comma id

stm = exp exp sc 1

assign id assign exp sc 1

while while_kwd exp do_kwd [stms] stm end_kwd sc Il if if_kwd exp then_kwd [stms] stm else_part end_kwd sc 1

for for_kwd id from_kwd [low_bound] exp to_kwd [up_bound] exp do_kwd [stms] stm end_kwd sc 1

return return_kwd exp sc

else_part = else_kwd [stms] stm

exp = or exp or_kwd and_exp simple and_exp

and_exp = and and_exp and_kwd line_exp 1

simple line_exp

line_exp line line_exp line_op eq_exp with_part 1

95

1

1

simple eq_exp

line_op =

straight_Iine straight_line_kwd 1

curved_line curved_Iine_kwd 1

straight_fwd_arrow straight_fwd_arrow_kwd curved_fwd_arrow curved_fwd_arrow_kwd 1

straight_bwd_arrow straight_bwd_arrow_kwd curved_bwd_arrow curved_bwd_arrow_kwd 1

straight_bidir_arrow straight_bidir_arrow_kwd curved_bidir_arrow curved_bidir_arrow_kwd

eq_exp = eq [left] cmp_exp eq [right] cmp_exp 1

neq [left] cmp_exp neq [right] cmp_exp simple cmp_exp

cmp_exp = lt [left] add_exp lt [right] add_exp 1

gt [left] add_exp gt [right] add_exp 1

leq [left] add_exp leq [right] add_exp geq [left] add_exp geq [right] add_exp simple add_exp

add_exp = add add_exp plus mul_exp 1

minus add_exp minus mul_exp simple mul_exp

mul_exp =

mult mul_exp mult left_unary_exp div mul_exp div left_unary_exp simple left_unary_exp

left_unary_exp = not not left_unary_exp get get_kwd id from_kwd left_unary_exp put put_kwd exp at_part in_kwd left_unary_exp fit fit_kwd class_Dame around_kwd left_uoary_exp coord coord_kwd of_kwd id l_par

arg_Iist r_par in_kwd left_unary_exp 1

simple right_exp

96

right_exp = calI right_exp dot id l_par arg_Iist r_par 1

index right_exp l_cr exp r_cr 1

scaled right_exp scaled_kwd l_par eq_exp r_par slanted right_exp slanted_kwd l_par

[xslant] exp comma [yslant] eq_exp r_par rotated right_exp rotated_kwd l_par eq_exp r_par 1

translated right_exp translated_kwd l_par [xtranslate] term comma [ytranslate] eq_exp r_par 1

simple term

term =

par l_par exp r_par 1

point l_par [x_value] exp comma [y_value] exp r_par 1

drawing class_name with_part 1

var id 1

int integer 1

real real 1

true true_kwd 1

false false_kwd string string 1

list l_cr arg_Iist r_cr 1

static_call id l_par arg_Iist r_par

arg_Iist = exp [additional_args] additional_arg

additional_arg comma exp

with_part = with_kwd l cr options r_cr

options = option [additional_options] additional_option

additional_option comma option

option = id assign exp

APPENDICE C

PREacuteSENTATION DE LA HIEacuteRARCHIE

Nous preacutesentons ici la description complegravete de notre hieacuterarchie objet en Java Le tout est

deacutecrit agrave laide dun diagramme UML Toutefois afin de faciliter le formatage nous avons

seacutepareacute le tout en deux sections Le premier diagramme contient les noms des classes ainsi

que leurs relations dheacuteritage Par apregraves tous les diagrammes suivants repreacutesentent le

contenu speacutecifique de chaque classe sans les relations entre classes Ceci nous permet

dobtenir une vue densemble des classes tout en obtenant des deacutetails cruciaux sur

limpleacutementation de chaque classe

98

l -llill Pa aj f1 1 Sh middotisVIsible boolampan

+draw(locaton AbstractPoint oot PniltWriBl) void

+lsVlsigtle() boolean +copyO Shape +obtalnPathO Path

Drawlna

-numberOIDrawinm int =0 middotdrawingNumber (nt -dependendes DrawingD middotpointsDellned AbsttactPolntD middothasBeenDrawn booLean middotshape Shape dmWingName string middotdrowingPositlon AbstractPoint -position AbstnldPolnt

+Orawlog(s Shape) +Shape(s S~ location AbsbaclPoint) +setPositlcn(positlon AbslradPoinl) void +seIDraloVingName(nsme slJfng) void +gelName() string +geISUbDrawlng(name string) ~ Drawlng +re~~Jri~)slring

+addDeflO8dPoint(point AbstractPolnl) Int +hasBeenDraWn() booIean +lsDrawn() booIean +canBeDlBWn() booIean +getShape() Shape fdraw(Jocafion AbslraclPolnt out PrlnlWriler) void +obtainPathO Path -tdp(other Orawilg) AbslractPoilt

uare length double

+Squate() ~s ( ~ le)

ell-eoatMength double) void +getlongthO bulldouble +dmw(locabmiddotoo AbstrampctPoint out PrnMYler) void +obtainPath() Path ffOPY() Shape

99

Rectangle

-lengIh double -wldth double -100 KI boeacuteIean

+Rectangle() +Rectangle(length double wldth double) +selleogth~ength double) void +setWldth(Width double) void +seIRound(rlaquo)Ulld booIegravean) void +getlengtb( doubIe +getMdth() double +getRound() booIeao +getNorth(d Dmwlog) RefPoint lttget5outh(d Drawlng) RefPolnl +getwest(d DlaWlng) RefPoint +gelEaat(d Drawlng) RefPoinl +gelNorthwest(d Drawllg) RefPoInt +gelNortheast(d Drawlng) R1tfPolnt lttgetSou1hwe$(d Drawlng) RefPoInt +get5outheast(d Drawilg) RefPoklt +dl8wlocalion Absl18ctPoiIt Ougravet ~Mhl81 void ii)blainPathO ~ Path

CIrcIe

middotradlus double

+Clœ() +Clrcle(radlus double)

+COPYO Shape +setRadlus(radius ~ double) void +getRadius() double +getAnglePolnt(d Omwilg angle double) RefPoInt +dmwlocation AbstradPoirlt our AiltKtler) VOiCI iOblailPath() Path

ElIID8e

middotxradlus double middotyradlus double

+Ellpse() +copyO bullShape +setXRadlus(r double) void +setYRadIus(r doublrt) void -gelXRadlus() double +geIYRadius() double +draw(txalJon AbstractPomt out PrinMbl8l) IIOIumld iOblainPathO Path

100

Lino point1 AbslractPoln1 middotpoint2 AbstractPoint

+L1oe() +Llne(point1 AbstractPoint poill2 AbstractPolnt) +COPYO Shape +dmw(locaIJon AbsIroctPoinl out PrnIWril9f) void +selPolnt1 (poInl1 AbsttactPoint) void +seIPoill2(poinl2 AbslractPoinl) void +getPolnl1 () AbslraclPoinl tiJotPolnl2() AbstraclPolntn_~

EqTrtanale middotsim double

-EqTriangleQ +EqTrlangle(size double) +cOPYO Shape +setSlze(slze double) void +gets1ze() double +d18W(Jocolion AbstTadPoinl out Ptil1Wfit8f) void +oblalllPalhll Path

middotpath Path bulltext string middotposIlIon double -dir Poilt middotabsohJle boolean middothasTexl boolean

+Arrav(path Palh) +copyO Shape TCl(( ex s n~ U blo dn 010 aosolute boolean) void seISlartingTangcnl(dlr Poinl) void

seIEndflgTangenl(dir Potnt) void tgelPalhO Palh +obtalnPath Path

101

cany -canvasLlst Carwas(J -canvasPontLIsl AbstractPoinllJ daWVigUsl DrawingD dlawilgPolnlUst AbsJaCtPolntO middotIsMaIn booean canvasPosltion bullAbstmetPoint

+CsnYaS() copYO Shape +seteanvasPositIoR(posllon AbslraclPotnt) VOId +setMaln() void +f8Mai1() booIean +addShape(S Shapeloca1ion AbstradPoItit) Drawilg l+a~pe(S Shape IocagravetJon AllstraclPolnl name slring) DraNklg +getOtawiDg(I Inl) D1awlng ~elDtawfng(namamp string) bull Drawilg tgelOl8WIngiocal1on(namo stlllllJ) AbsllaclPoilt ~olDmwlngOrNull(name string) Drawilg tgelOrawinglocation(l int) AbslractPolnt o+getNumberOfDrawlngs() int +dl8w(location AbstrodPonr oui PrintwrllerJ void +dmwMain(oul PrinlWrllGr) void +drawCanvaa(locatlon AbSlractPoinl remalnlllQDraws Drawlna Il out Prlntwriter) void

Path -Bst AbstractPolnllJ middothasASIartilgTangent boolean -hasAEndhlgTangent booIean -startiogTangent Point middotendingTangent Point middot1sU1ear boolean

+PathO Psth(Ust AbstraclPoint 0) +Path(Dst Ab~tPolnt Q startingTangent Polnt endlngTangenl Point) +cOPYO Sh8p6 +addPoinl(poiumlnl Abstl8ClPoint) void +seIUnear() void +IsUnearO booloao +getPolnt(l Inl) AbsIraclPcInl +getPolnts() AbsIlaCPoht 0 o+getNumberOlPolnts() Rt +cyc1B() void -thasASI8rthgTangent() boolean +hasAEndingTangentO booIoan +getStattilgTangenlO PoiIl +getEndlngTangent() Polnl 4uumllSlartingTangenl(stllllngTangent Peint) w1d +seIEndIllQTangent(encliigTangenl ~nt) void +psthValue() strilg +dmwJocalion AbslradPoItlI oot FilMtJrer) void

102

Text

-told slfng

ImiddotTexl() +Texl(lext string) +sotText(tegravext string) void iil8tTeld() string +draw(Jocalion AbstroctPoJnl oof PrinWriter) void ~btalnPath() Path +CODV(J ShsD9

AbsctPolnl +altfd(second AbstraclPoinl) AbslractPolnt -tmulliply(multipier double) AbstraclPolnt +eombine(perœntage double second AbstraclPolnl) AbstractPoint +solvfJ() slrillg +COfNIJ AbslradPoinl

Point -x double y doub19

+POIcirclIO +POIOI(x double y double) +solvo() slting -+IoSlflngO string~ n bull

RefPolnt -mf8teflœDrawlng Drawlng -poIntNumbef Int

+RefPoint(referenceDrawing DraYIing poiolNu ber Illl) +SoNe() stmg +COPYO AbstroctPDAcirclf

lnauudJonPoint p Path

-q Palh

+lnlCfSecllonPoint(p Palh q Path) +COPYO AbstrampcfPoitlt +soIve() string

103

Un Point -point AbsbaclPoint -pIampStmg string -endStrlng string -value double

+UnaryMapPolnl(poInt AbstradPoInt) +ScW9() string +setMapTypeMultlpIy(vallJe double) void +c Abslr8ctPoinI

Bln oint frstPoint Absll8clPoinl secoodPoInt AbstrootPoint -pceSIring string -middIeSlrIng Itlfno -endString string

+8ilatyMapPolnt(fkstPoiIt Abstmc1Po1nt secondPolnt AbslraetPointl +cOPYO bull AbstraetPOOI +soAte() string +selMapTypeAddO void

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

APPENDICE D

PREacuteSENTATION DES DIAGRAMMES CHOISIS

Cet annexe comprend lensemble des quinze (15) diagrammes que nous avons choisis

comme base de qualiteacute pour notre projet Tel que mentionneacute preacuteceacutedemment nous avons

inclus agrave la fois le code de chaque diagramme en SDDL ainsi que le diagramme reacutesultant

Aucune analyse nest effectueacute pour ces dessins agrave lexception de ceux deacutejagrave analyseacutes au

chapitre 6

Start box triangle = EqTriangle with [size = 400J put triangle at (00 -100) in main put Text with [text = StartJ at (00 -50) in main

El box rectanglePos = (00 -500) rectangle = Rectangle with [length = 1600 width = 300J put rectangle at rectanglePos in main put Text with [text El J at rectanglePos - (600 00) in main put Text with [text $a leftarrow O$J

at rectanglePos + (-300 50) in main put Text with [text $b leftarrow l$J

at rectanglePos + (-300 -50) in main put Text with [text $a leftarrow l$J

at rectanglePos + (100 50) in main put Text with [text $b leftarrow O$J

at rectanglePos + (100 -50) in main put Text with [text $c leftarrow m$J

at rectanglePos + (500 50) in main put Text with [text $d leftarrow n$J

106

at rectanglePos + (500 -50) in main

1 E2 box 1 rectangle2Pos = (00 -1000) put rectangle at rectangle2Pos in main put Text with [text = E2 ] at rectangle2Pos (600 00) in main put Text with [text = $q leftarrow quotient(c div d)$]

at rectangle2Pos + (100 50) in main put Text with [text = $r leftarrow remainderCc div d)$]

at rectangle2Pos + (100 -50) in main

1 Round E3 box 1 rectangle3Pos = (00 -1500) roundRectangle = Rectangle with [length = 800 width 250

round = true] put roundRectangle at rectangle3Pos in main put Text with [text = E3 $r = O$] at rectangle3Pos in main

1 Stop box 1 stopPos = (1500 -1700) put triangle at stopPos in main put Text with [text = Stop] at stopPos + (00 50) in main

1 E4 box 1 rectangle4Pos = (00 -2000) put Rectangle with [length = 1600 width = 400]

at rectangle4Pos in main put Text with [text = E4] at rectangle4Pos + (-700 00) in main put Text with [text = $c leftarrow d d leftarrow r$]

at rectangle4Pos + (100 120) in main put Text with

[text = $t leftarrow a a leftarrow a a leftarrow t - qa$] at rectangle4Pos + (100 00) in main

put Text with [text = $t leftarrow b b leftarrow b b leftarrow t - qb$ ] at rectangle4Pos + (100 -120) in main

(00 -100) -) rectanglePos + (00 150) rectanglePos + (00 -150) -) rectangle2Pos + (00150) rectangle2Pos + (00 -150) -) rectangle3Pos + (00125) rectangle3Pos + (00 -125) -) rectangle4Pos + (00200) rectangle4Pos + (00 -200) -- rectangle4Pos + (00 -500)

rectangle4Pos + (-1000 -500) -- rectangle2Pos + (-1000 00) -) rectangle2Pos + (-800 00)

107

rectangle3Pos + (400 00) -gt rectangle3Pos + (1410 00) put Text with [text Yes] at rectangle3Pos + (480 -50) in main put Text with [text = No] at rectangle3Pos + (-80 -175) in main

Placing text notes put Text with [text Al $m gt 0 n gt 0$] at (3000 00) in main put Text with [text A2 $c=mgtO d=ngtO$] at (3000 -340) in main put Text with [text $a=b=O a=b=l$] at (3000 -460) in main put Text with [text A3 $am + bn = d am + b$]

at (3000 -740) in main put Text with [text = $0 leq r lt d gcd(dc) g$]

at (3000 -860) in main put Text with [text = A4 $am + bn d = gcd(m n)$]

at (3000 -1200) in main put Text with [text = A5 $am + bn d am + b$]

at (3000 -1540) in main put Text with [text = $0 lt r lt d gcd(cd) = g$]

at (3000 -1660) in main put Text with [text = A6 $am + bn = d am + b$]

at (3000 -1940) in main put Text with [text = $gcd(c d) = gcd(m n)$]

at (3000 -2060) in main

(2500 00)-(2000 -50)-(1500 -150)-gt(00 -200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -400)-(2000 -450)-(1500 -650)-gt(00 -700) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -800)-(2000 -850)-(1500 -1150)-gt(00 -1200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2200 -1200)-(2000 -1200)-(1500 -1250) -gtrectangle3Pos + (900 00) with [startingTangent = (-10 00) endingTangent (-10 -10)]

(2250 -1600)-(2000 -1700)-(1500 -1900) -(1000 -1750)-gt(00 -1700) with [startingTangent = (-10 00) endingTangent (-10 00)]

(2250 -2000)-(1500 -2200)-gt(00 -2400) with [startingTangent = (-10 00) endingTangent (-10 00)]

108

~-- Al m gt On gt O

A2 c = m gt 0 d = n gt 0 a = b = 0 a = b = 1

A3 am + bn = dam + bdeg~ T lt dgcd(dc) = 9 E2

_--- A4 am + bn = d = gcd(m n)

A5 am + bn = dam + b Sto 0lt T lt dgcd(cd) = 9

Cf- d d f- T A6 am + bn = d am + bE4 t f- a a f- a a f- t - qa gcd(cd) =gcd(mn)t f- b b f- b b f- t - qb

primitive static sin javalangMath sin primitive static cos javalangMath cos primitive static sqrt javalangMath sqrt

fun ellipseCangle length width) return Clength cosCangle 20 31415 3600)

width sinCangle 20 31415 3600))

fun ellipseDeriveCangle length width) length2 = length length width2 = width width sinus = sinCangle 31415 1800) sinus2 = sinus sinus cosinus = cosCangle 31415 1800) cosinus2 = cosinus cosinus x = -10 Clength sinus)

sqrtCwidth2 cosinus2 + length2 sinus2) y = Cwidth cosinus) sqrtCwidth2 cosinus2 + length2 sinus2) return Cxy)

avail = Text with [text=AVAIL] link = Text with [text=LINKCP)] t = Text with [text=T]

109

put avail at ellipse(900 1000 500) in main put t at ellipse(1800 1000 500) in main put link at ellipse(OO 1000 500) in main

(ellipse(70 1000 500))-(ellipse(450 1000 500)) -gt(ellipse(750 1000 500))

(ellipse(1050 1000 500))-(ellipse(1350 1000 500)) -gt(ellipse(1730 1000 500))

(ellipse(1930 1000 500))-(ellipse(2700 1000 500)) -gt(ellipse(3550 1000 500))

AVAIL

~ T LINK(P)

primitive static sin javalangMatb sin primitive static cos javalangMatb cos

fun circular(angle radius) return (radius cos(31415 angle 1 1800)

radius sin(31415 angle 1 1800))

circleradius = 400 circle = Circle with [radius=100] g Text with [text=G] r = Text with [text=R] y Text with [text=Y]

put circle at (circular(300 circleradius)) in main put r at (circular(300 circleradius)) in main put circle at (circular(900 circleradius)) in main put r at (circular(900 circleradius)) in main put circle at (circular(1500 circleradius)) in main put g at (circular(1500 circleradius)) in main put circle at (circular(2100 circleradius)) in main put g at (circular(2100 circleradius)) in main put circle at (circular(2700 circleradius)) in main

110

put g at (circular(2700 circleradius)) in main put circle at (circular(3300 circleradius)) in main put y at (circular(3300 circleradius)) in main

(circular(450 circleradius))-(circular(600 circleradius)) -gt(circular(750 circleradius))

(circular(1050 circleradius))-(circular(1200 circleradius)) -gt(circular(1350 circleradius))

(circular(1650 circleradius))-(circular(1800 circleradius)) -gt(circular(1950 circleradius))

(circular(2250 circleradius))-(circular(2400 circleradius)) -gt(circular(2550 circleradius))

(circular(2850 circleradius))-(circular(3000 circleradius)) -gt(circular(3150 circleradius))

(circular(3450 circleradius))-(circular(OO circleradius)) -gt(circular(150 circleradius))

put Text with [text=tinyNEXTR] at (circular(900 circleradius)) + (00 150) in main

put Text with [text=tinyNEXTG] at (circular(-900 circleradius)) + (00 -150) in main

put Text with [text=tinyCURRENT] at (circular(-300 circleradius))+ (1~0 -150) in main

NEXTR

NEXTG

fun left(d)

return 016 coord of west in drectangle + 084 coord of east in drectangle

fun right(d)

return 016 coord of east in drectangle +

111

084 coord of west in drectangle

rectanglel = Rectangle with [length=600 width=200) rectangle2 = Rectangle with [length=200 width=200) circle = Circ le with [radius=10) put rectanglel in form rectangle = put rectangle2 in form put circle at (-200 00) in form put circle at (200 00) in form

dl = put form at (00 00) in main d2 = put form at (-600 -500) in main put Text with [text=IA) at (-600 -500) in main d3 = put form at (-1200 -1000) in main put Text with [text=IB) at (-1200 -1000) in main d4 = put form at (-1800 -1500) in main put Text with [text=ID) at (-1800 -1500) in main d5 = put form at (-600 -1500) in main put Text with [text=IE) at (-600 -1500) in main d6 = put form at (00 -1000) in main put Text with [text=IC) at (00 -1000) in main d7 = put form at (600 -1500) in main put Text with [text=f) at (600 -1500) in main d8 = put form at (-400 -2000) in main put Text with [text=IG) at (-400 -2000) in main dg = put form at (300 -2000) in main put Text with [text=IH) at (300 -2000) in main dl0 = put form at (1000 -2000) in main put Text with [text=JI) at (1000 -2000) in main

(left(dl))-gt(coord of north in d2rectangle) (right(dl))-gt(coord of east in dlrectangle + (00 50)) (left(d2))-gt(coord of north in d3rectangle) (right(d2))-gt(coord of north in d5rectangle) (left(d3))-gt(coord of north in d4rectangle) (right(d3))-gt(coord of south in d2rectangle) (left(d4))-gt(coord of west in dlrectangle + (00 50)) (right(d4))-gt(coord of south in d3rectangle) (left(d5))-gt(coord of north in d6rectangle) (right(d5))-gt(coord of north in d7rectangle) (left(d6))-gt(coord of south in d2rectangle) (right(d6))-gt(coord of north in d8rectangle)

112

(left(d7raquo-gt(coord of north in d9rectangle) (right(d7raquo-gt(coord of north in dl0rectangle) (left(dSraquo-gt(coord of south in d6rectangle) (right(d8raquo-gt(coord of south in d5rectangle) (left(d9raquo-gt(coord of south in d5rectangle) (right(d9raquo-gt(coord of south in d7rectangle) (left(dl0raquo-gt(coord of south in d7rectangle) (right(dl0raquo-gt(coord of south in dlrectangle + (100 00raquo

put Text wi th [text=List head] at coord of north in dlrectangle + (00 50) in main

circle = Circle with [radius = 100] bigcircle = Circle with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvasl put circle at 050 150) in canvasl put Text with [text = H] at 050 150) in canvasl put circle at (-150 150) in canvasl put Text with [text J] at (-150 150) in canvasl put Text with [text = B] at (00 -150) in canvasl

put bigcircle in canvas2

113

put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = Fil] at (150 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = liE] at (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvasl at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = Ali] at (00 -300) in main put bigellipse in main

A

fun drawBinaryTree(d s 0 dh dv n)

put s at a in d put 0-(0 + (-10 dh -10 dvraquo in d put 0-(0 + (db -10 dvraquo in d if (n == 1)

then return 0 else drawBinaryTree(d sa + (-10 dh -10 dv) db 20 dv n - 1) drawBinaryTree(d s a + (db -10 dv) db 20 dv n - 1) end

(0000)--(0000)

114

orlgln = (00 00) dv = 200 dh = 1000 bullet = Circle with [radius = 20) drawBinaryTree(main bullet origin dh dv 7)

bullet = Circle with [radius = 20] put bullet in main put bullet at (-300 -300) in main put bullet at (-600 -600) in main put bullet at (00 -600) in main put bullet at (300 -300) in main

(00 00)--(-300 -300) (00 00)--(300 -300) (-300 -300)--(-600-600) (-300 -300)--(00 -600)

(-100 00)-(-500 -300)-(-650 -650)-(-300 -400)shy(50-650)-(00-500)-(-150-300)-(-100 -200)shy(00-100)-(250-320)-(350-350)shy(320 -270)-gt(100 00)

circlel Circle with [radius 100]

lL5

circle2 = Circle with [radius = 120] ellipse = Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (100 0 500) in main d3 put form at (1000 -500) in main put Text with [text I$N(p_1)$] at (1000 1000) in main put Text with [text I$N(p_2)$] at (1000 500) in main put Text with [text dots] at (100 0 o 0) in main put Text with [text $N(p_n)$] at (1000 -500) in main

put Text with [text $S_O$] at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

sa

fun dropMany(f n s v c) for i from 10 to n do

put f at (s + (i - 10) v) in c

116

end

square = Square with [length=200] changeVec = (00 -200) dropMany(square 40 (00 00) changeVec main) dropMany(square 30 (500 00) changeVec main) dropMany(square 10 (1000 00) changeVec main) dropMany(square 10 (1500 00) changeVec main) put Text with [text=IO] at (00 00) in main put Text with [text=ll] at (00 -200) in main put Text with [text=13] at (00 -400) in main put Text with [text=17] at (00 -600) in main put Text with [text=bf ail] at (500 200) in main put Text with [text=12] at (500 00) in main put Text with [text=14] at (500 -200) in main put Text with [text=17] at (500 -400) in main put Text with [text=17] at (1000 00) in main put Text with [text=bf $a~b~+$] at (1500 200) in main put Text with [text=18] at (1500 00) in main put Text with [text=none ] at (2000 00) in main

(120 100)-gt(380 100) (620 100)-gt(880 100) (112 0 10 0) - gt(138 0 10 0) (1620 100)-gt(1880 100)

a ab+

~ -m-0-0-none 7

put Text with [text=IS] in main put Text with [text=A] at (00 -200) in main put Text with [text=B] at (00 -400) in main put Text with [text=$alpha$] at (-600 -600) in main put Text with [text=$beta$] at (-300 -600) in main put Text with [text=$gamma$] at (00 -600) in main put Text with [text=$y$] at (300 -600) in main put Text with [text=$z$] at (600 -600) in main

117

(-50 -50)--(-700 -540)--(-500 -540) (50 -50)--(700 -540)--(500 -540) (-50 -250)--(-400 -540)--(-200 -540) (50 -250)--(400 -540)--(200 -540) (-50 -450)--(-100 -540)--(100 -540)--(50 -450)

put Text with [text=D] in main

put Text with [text=T] at (-500 -500) in main put Text with [text=bf real] at (-500 -900) in main put Text with [text=4] at (-350 -500) in main put Text with [text= type] at (-150 -500) in main

put Text with [text=L] at (500 -500) in main put Text with [text=inh] at 050 -500) in main put Text with [text=5] at (350 -500) in main put Text with [text=6] at (650 -500) in main put Text with [text=entry] at (850 -500) in main

put Text with [text=bf $id_3$] at (900 -900) in main put Text with [text=bf ] at (500 -900) in main put Text with [text=3] at 0050 -900) in main put Text with [text=entry] at 0350 -900) in main

put Text with [text=L ] at (00 -1000) in main put Text with [text=inh] at (-350 -1000) in main put Text with [text=7] at (-150 -1000) in main put Text with [text=8] at 050 -1000) in main put Text with [text=entry] at (350 -1000) in main

put Text with [text=bf ] at (00 -1400) in main put Text with [text=bf $id_2$] at (400 -1400) in main put Text with [text=2] at (550 -1400) in main put Text with [text=entry] at (750 -1400) in main

put Text with [text=L] at (-500 -1500) in main

118

put Text with [text=inh] at (-850 -1500) in main put Text with [text=19] at (-650 -1500) in main put Text with [text=110] at (-350 -1500) in main put Text with [text= ent ry] at (-150 -1500) in main

put Text with [text=bf $id_l$] at (-500 -1900) in main put Text with [text=ll] at (-350 -1900) in main put Text with [text= ent ry ] at (-150 -1900) in main

(-100 -100)--(-400 -400) (-500 -600)--(-500 -800) (100 -100)--(400-400) (500 -600)--(500 -800) (600 -600)--(800 -800) (400 -600)--(100 -900) (100 -1100)--(400 -1300) (00 -1100)--(00 -1300) (-100 -1100)--(-400 -1400) (-500 -1600)--(-500 -1800)

(-300 -400)-(00 -300)-gt(300 -400) (400 -600)-(500 -650)-gt(600 -600) (950 -800)-gt(700 -600) (300 -600)-gt(-50 -900) (-100 -1100)-(00-1150)-gt(100 -1100) (450 -1300)-gt(200 -1100) (-200 -1100)-gt(-550 -1400) (-550 -1500)-(-500 -1550)-gt(-450 -1500) (-350 -1800)-gt(-350 -1600)

119

D

~ T 4 type inh 5 L 6 entry

entryrL ~~3 inh 7 L 8 entry

~2entrY inh 9 JJ lOentry

1 t id l 1 entry

circle = Circle with (radius=100J bigcircle = Circle with (radius=SOOJ

cl put circle at (00 200) c2 put circle at (200 00) c3 put circle at (-200 00) c4 put circle at (00 -200) bcl = put bigcircle in graphl

cS = put circle at (00 200) c6 = put circle at (00 -200) bc2 = put bigcircle in graph2

c7 put circle at (00 lS0)

in graphl in graphl in graphl in graphl

in graph2 in graph2

in graph3 c8 put circle at (200 -200) in graph3 c9 put circle at (-200 -200) in graph3 bc3 = put bigcircle in graph3

gl put graphl in main g2 put graph2 at (-1000 -1500) in main g3 put graph3 at (1000 -1000) in main

1 lines in first drawing (coord of anglePoint(900) in mainglc4)-gt

(coord of anglePoint(2700) in mainglcl) (coord of anglePoint(1800) in mainglcl)-gt

(coord of anglePoint(900) in mainglc3) (coord of anglePoint(OO) in mainglcl)-gt

120

(eoord of anglePoint(900) in maingle2) (eoord of anglePoint(2700) in maingle3)-gt

(eoord of anglePoint(1800) in maingle4) (eoord of anglePoint(2700) in maingle2)-gt

(eoord of anglePoint(OO) in maingle4)

(eoord of anglePoint(2700) in maingle3)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(1800) in maingle4)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(OO) in maingle2)shy(eoord of anglePoint(3450) in mainglbel)

lines in seeond drawing (eoord of anglePoint(2700) in maing2e5)-gt

(eoord of anglePoint(900) in maing2e6) erdl = eoord of anglePoint(1800) in maing2e6 erd2 = eoord of anglePoint(1800) in maing2e5 erdl-((erdl + erd2)20 + (-200 00))-gterd2

(eoord of anglePoint(900) in maing2e5)shy(eoord of anglePoint(900) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(450) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(OO) in maing2be2)

(eoord of anglePoint(OO) in maing2e6)shy(eoord of anglePoint(OO) in maing2be2)

lines in third drawing (eoord of anglePoint(1800) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e9) (eoord of anglePoint(OO) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e8) (eoord of anglePoint(OO) in maing3e9)-gt

(eoord of anglePoint(1800) in maing3e8) crd3 = eoord of anglePoint(OO) in maing3e8 erd4 = eoord of anglePoint(900) in maing3e7 erd3-(erd3 + erd4) 20 + (200 200)-gterd4

erd4--(eoord of anglePoint(1050) in maing3be3) (eoord of anglePoint(1800) in maing3e7)-shy

(eoord of anglePoint(1850) in maing3be3) (coord of anglePoint(1800) in maing3e9)-shy

121

(coord of anglePoint(1750) in maing3bc3)

lines between drawings (coord of anglePoint(2250) in mainglbcl)-gt

(coord of anglePoint(900) in maing2bc2) (coord of anglePoint(3450) in mainglbcl)-gt

(coord of anglePoint(1050) in maing3bc3) (coord of anglePoint(OO) in maing2bc2)-gt

(coord of anglePoint(1850) in maing3bc3) crd5 = coor~ of anglePoint(1750) in maing3bc3 crd6 = coord of anglePoint(450) in maing2bc2 crd5-(crd5 + crd6) 20 + (000 300)-gtcrd6

Texts crdTextl coord of anglePoint(1350) in mainglbcl + (-200 00) crdText2 = coord of anglePoint(1350) in maing2bc2 + (-100 100) crdText3 = coord of anglePoint(450) in maing3bc3 + (100 100) put Text with [text=$R_l$] at crdTextl in main put Text with [text=$R_2$] at crdText2 in main put Text with [text=$R_3$] at crdText3 in main

primitive getClip sddlhierarchyDrawing clip primitive setVisible sddlhierarchyShape setVisible

122

1 clip takes 3 drawings and a canvas first is a line second and third are two shapes which intersect line will draw a line between the intersection points the line creates with the two shapes 1

fun clip(dl d2 d3 canvas)

dlsetVisible(false) drawl = put dl in canvas cl = drawlgetClip(d2) c2 = drawlgetClip(d3) put cl--c2 in canvas

circle Circle with [radius=100] dl = put circle in main put Text with [text=14] in main d2 = put circle at (-400 -400) in main put Text with [text=13] at (-400 -400) in main d3 = put circle at (-700 -800) in main put Text with [text=12] at (-700 -800) in main d4 = put circle at (400 -400) in main put Text with [text=18] at (400 -400) in main d5 = put circle at (150 -800) in main put Text with [text=17] at 050 -800) in main d6 = put circle at (650 -800) in main put Text with [text=110] at (650 -800) in main d7 = put circle at (220 00) in main put Text with [text=14] at (220 00) in main d8 = put circle at (620 -400) in main put Text with [text=18] at (620 -400) in main dg = put circle at (370 -800) in main put Text with [text=7] at (370 -800) in main dl0 = put circle at (00 -1200) in main put Text with [text=5J at (00 -1200) in main

Il = (00 00)--(-400 -400) clip(ll dl d2 main) 12 = (-400 -400)--(-700 -800) clip(12 d2 d3 main) 13 = (00 00)--(400 -400) clip(13 dl d4 main) 14 = (400 -400)--(150 -800)

123

clip(14 d4 d5 main) 15 = (400 -400)--(650 -SOO) clip(15 d4 d6 main) 16 = (220 00)--(-400 -400) clip(16 d7 d2 main) 17 = (220 00)--(620 -400) clip(17 d7 dS main) lS = (620 -400)--(650 -SOO) clip(lS dS d6 main) 19 = (620 -400)--(370 -SOO) clip(19 dS d9 main) 110 = (370 -800)--(00 -1200) clip(110 dg d10 main)

2

5

fun niceArrow(c dMain dLeft dRight) firstPoint = coord of southwest in dMainrectangle + (30 30) secondPoint = coord of southeast in dMainrectangle + (-30 30)

firstEnd = coord of north in dLeftrectangle secondEnd = coord of north in dRightrectangle

put firstPoint-gtfirstEnd in c put secondPoint-gtsecondEnd in c

point1 firstPoint 50 60 + secondPoint 10 60 point2 firstPoint 40 60 + secondPoint 20 60 point3 firstPoint 30 60 + secondPoint 30 60 point4 firstPoint 20 60 + secondPoint 40 60 point5 firstPoint 10 60 + secondPoint 50 60

put (coord of southwest in dMainrectangle + (-25 25))shy(coord of south in dMainrectangle + (00 -50))shy

124

(coord of southeast in dMainrectangle + (25 25)) in c

put pointl--(pointl + (-1 0 30 -10 70)) in c put point2--(point2 + (-1 0 10 -10 85)) in c put point3--(point3 + (00 -10 90)) in c put point4--(point4 + (1 0 -10 85)) in c put point5--(point5 + (30 -1 0 70)) in c

put Text with [text=smallt] at point3 + (00 -130) in c

rect = Rectangle with [length=300 width=200] r = put rect in main put Text with [text=ll] in main rectangle = put rect in form put Text with [text=$t-l$] in form

dl = put form at (-1400 -500) in main dll = put form at (-2000 -1000) in main dlr = put form at (-800 -1000) in main dlll put form at (-2300 -1500) in main dllr put form at (-1700 -1500) in main dlrl put form at (-1100 -1500) in main dlrr put form at (-500 -1500) in main

dr = put form at (1400 -500) in main drr = put form at (2000 -1000) in main drl = put forro at (800 -1000) in main drrr put form at (2300 -1500) in main drrl put form at (1700 -1500) in main drlr put form at (1100 -1500) in main drll put form at (500 -1500) in main

put Text with [text=l root[T]] at (-300 300) in main (-300 240)-gt(coord of north in mainr)

dots = Text with [text=dots] put dots at (-1400 -1000) in main put dots at (-2000 -1500) in main put dots at (-SOO -1500) in main put dots at (1400 -1000) in main put dots at (2000 -1500) in main put dots at (800 -1500) in main

125

(coord of southwest in mainr + (30 30))-gt (coord of north in maindlrectangle)

(coord of southeast in mainr + (-30 30))-gt (coord of north in maindrrectangle)

niceArrow(main dl dll dlr) niceArrow(main dll dlll dllr) niceArrow(main dlr dlrl dlrr) niceArrow(main dr drl drr) niceArrow(main drl drll drlr) niceArrow(main drr drrl drrr)

root[T]

rect = put Rectangle with [length=600 width=200l in form put Rectangle with [length=200 width=200] at (200 00) in form bullet = put Circle with [radius=10] at (200 00) in form

put Text with [text=IF] in main

fl put form at (700 00) in main f2 put form at (1500 00) in main f3 put form at (2300 00) in main f4 put form at (3100 00) in main

(coord of anglePoint(OO) in mainflbullet)-gt (coord of west in mainf2rect)

(coord of anglePoint(OO) in mainf2bullet)-gt (coord of west in mainf3rect)

(coord of anglePoint(OO) in mainf3bullet)-gt (coord of west in mainf4rect)

126

ptW = coord of west in mainflrect ptE = coord of east in mainf4rect

ptW + (-300 OO)-gtptW ptE + (300 OO)-gtptE

put Text with [text=R] at (3800 00) in main

ptS = coord of anglePoint(2700) in mainf4bullet ptS2 = ptS + (00 -350)

ptS--ptS2 ptS2 + (-50 00)--ptS2 + (50 00) ptS2 + (-35 -20)--ptS2 + (35 -20) ptS2 + (-20 -40)--ptS2 + (20 -40)

BIBLIOGRAPHIE

Adobe Systems Incorporated 1994 PostScript Language Reference Manual http j jwwwadobecomjproductsjpostscriptjpdfsjPLRMpdf

-- 2006 PDF Reference Version 17 Adobe Systems Incorporated 6th eacutedition

-- 201Oa Adobe Postscript 3 http j jwwwadobecomjproductsjpostscriptj

2010b PDF Developer Corner PDF Reference http j jwwwadobecomjdevnetjpdfjpdLreferencehtm1

Aho A V R Sethi et J D Ullman 1986 Compilers Principles Techniques and Tools Addison-Wesley

American Mathematical Society 2008 Why Do We Recommend LaTeX http j jwwwamsorgjpublicationsjauthorsjtexjlatexbenefits

Apple Computer Inc 1996 The TrueType Reference Manu al Apple Computer Inc Cupertino California

Bourgeois M 2010 Introduction to Drawing Diagrams with SDDL httpj jrivershyvalley tvjintroduction-to-drawing-structured-diagrams-in-sddlj

Bourgeois M et R Villemaire 201Oa laquoDrawing Structured Diagrams with SDDL raquo

TUGBoat vol 31 no 2 p 206-210

-- 201Ob SDDL http j jwwwinfo2uqamca-villemaireJjRecherchejSDDLj

Bowman J C 2007 laquoThe 3D Asymptote Generalization of Metapost Beacutezier Interposhylation raquo Proceedings in Applied Mathematics and Mechanics

Chomsky N 1956 laquoThree Models for the Description of Language raquo Information Theory IRE Transactions on vol 2 no 3 p 113-124

Cormen T A C E Leiserson R L Rivest et C Stein 2001 Introduction to Algoshyrithms The MIT Press

Davis M R Sigal et E Weyuker 1994 Computability Complexity and Languages Pundamentals of Theoretical Computer Science Morgan Kaufmann

Dhu D-Z et K-I Ko 2000 Theory of Computational Complexity Wiley

Gagnon Eacute 1998 laquoSableCC an Object-Oriented Compiler Framework raquo Meacutemoire de maicirctrise McGill University

128

-- 2009 ObjeetMacro - SableCC httpsableccorgwikiObjectMacro

Group O M 1999 Unified Modeling Language (version 13) Rapport Object Manashygement Group

Hammerlindl A J Bowman et T Prince 2010a Asymptote httpasympshytotesourceforgenet

-- 20lOb Asymptote The Veetor Graphies Language httpasympshytotesourceforgenet asymptote pdf

Hobby J 1992 laquo A Users Manual for MetaPost raquo Computing Science Technical Report vol 162

International Organization for Standardization 2008 Document Management - Elecshytronic Document File Format for Long-Term Preservation - Part 1 Use of PDF 14 (PDF A-1) ISO 19005-1 2005

Jr F S H et S M Kelley 2007 Computer Graphics using GpenGL Prentice-Hall 3e eacutedition

Knuth D 1968 The Art of Computer Programming Addison-Wesley

-- 1984 The TeXbook Reading Mass Addison-Wesley

-- 1986 The Metafontbook Reading Mass Addison-Wesley

-- 1999 Digital Typography Stanford California Center for the Study of Language and Information

Lamport L et D Bibby 1986 LATEX A Document Preparation System T 260 Citeseer

Lancaster D 2005 Approximating a Circle or an Ellipse using Four Bezier Cubic Splines Rapport Synergetics

Maplesoft 2010 Maple 14 User Manual

McNaughton R et H Yamada 1960 laquoRegular Expressions and State Graphs for Automata raquo -IRE Transactions on Electronic Computers no l p 39-47

Object Management Group 2009 UML httpwwwumlorgj

Oracle 2010 Java httpwwwjavacomj

Pierce B C 2002 Types and Programming Languages MIT Press

Riskus A 2006 laquoApproximation of a Cubic Bezier Curve by Circular Arcs and Vice Versa raquo Information Technology and Control vol 35 no 4 p 371-378

Rose K H 2008 XY-pic Home Page httptugorgapplicationsjXy-picj

129

Rose K H et al 2010 laquoXY-pic Users Guide raquo DIKU Universiteacute de Copenhague vol 1

Rumbaugh J M Blaha W Premerlani F Eddy et W Lorensen 1991 ObjectshyOriented Modeling and Design Prentiee-Hall

Saunders J H 1989 laquoA Survey of Objeet-Oriented Programming Languages raquo JOOP Journal of Object-Oriented Programming vol 1

Sabel J et D Friedman 1996 An Introduction to Refiection-Oriented Programming San Francisco Reflection 96

TeX Users Group 2009 MetaPost - TeX User Groups httptugorgmetaposthtml

TIOBE Software 2008 Tiobe Index httpwwwtiobecomindexphpcontentshy paperinfo tpeiindexhtml

Ullman J J Hopcroft et R Motwani 1979 Introduction to Automata Theory Lanshyguages and Computation Addison-Wesley

Van Zandt T 1993a PSTricks-PostScript Macros for Generie TEX httpwwwtexuniyaracrudocpsLugpdf

-- 1993b laquoPSTricks PostScript Macros for Generie 1EX Users Guide raquo Version 093 a http jjwww tug orgjapplicationsjPSTricks

Page 5: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux

vi

212 Consideacuterations pour une meacutethodologie de deacuteveloppement 23

22 La programmation orienteacutee-objet 24

221 Concepts de bases 24

222 Diffeacuterence avec la programmation baseacutee-objet 25

23 Meacutethode pour la conceptualisation dune hieacuterarchie 25

231 Origine de la meacutethode 26

232 Les diffeacuterentes eacutetapes de conceptualisation 26

24 Deacuteveloppement de la hieacuterarchie 27

241 Extraction des diffeacuterents concepts 27

242 Eacuteleacutements particuliers 27

CHAPITRE III EacuteLEacuteMENTS GRAPHIQUES 31

31 Courbes et segments en informatique 31

32 Courbes de Beacutezier 32

321 Deacutefinition 32

322 Deacutefinition alternative 33

323 Proprieacuteteacutes dune courbe de Beacutezier- 34

324 Deacutesavantages des courbes de Beacutezier 36

33 Splines cubiques 36

34 Le cas dun cercle 38

35 Structures informatiques dans les solutions deacutejagrave existantes 41

351 Postscript et PDF 42

352 Asymptote 43

CHAPITRE IV THEacuteORIE DES LANGAGES INFORMATIQUES 45

41 Theacuteorie des langages et automates 45

411 Les eacuteleacutement rie base dun langage (Aho Sethi et Ullman 1986) 46

412 Expressions reacuteguliegraveres 46

413 Automates 48

414 Lien entre langage reacutegulier et automate fini 51

vii

42 Grammaires 52

421 Deacutefinition dune grammaire formelle 52

422 Hieacuterarchie de Chomsky 54

423 Utiliteacute dans les langages de programmation 55

43 SableCC 56

431 Quest-ce que SabieCC 56

432 Avantages de SabieCC 56

44 Langage reacuteflexif 57

441 Deacutefinition dun langage reacuteflexif 57

442 Avantages 57

443 Deacutesavantages 58

CHAPITRE V MISE EN OEUVRE DE LA SOLUTION 59

51 Eacuteleacutements de langage en SDDL 59

511 Impleacutementation de la hieacuterarchie 59

512 Grammaire 60

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage 61

52 Reacutealisation en Java 63

521 Traverseacutee de larbre grammatical et exeacutecution 63

522 Deacutefinition dobjets quelconques 64

523 Gestion des erreurs 65

524 Structures de support 66

53 Accegraves agrave Postscript PDF et gTEX 66

531 Postscript 66

532 PDF 67

533 g1EX- 68

534 Geacuteneacuteration du code Asymptote 68

CHAPITRE VI REacuteALISATION DES DIAGRAMMES EN SDDL 71

61 Analyse du code des diagrammes existants 71

Vlll

611 Rappel des objectifs cruciaux agrave observer

612 Diagramme de compilation

613 Diagramme de tableau

614 Diagramme de Venn

62 Preacutesentation du produit final

621 Statistiques et documentation

622 Preacutesentation

623 Site web

63 Conclusion de notre analyse

CONCLUSION

APPENDICE A PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

APPENDICE B PREacuteSENTATION DE LA GRAMMAIRE DE SOOL

APPENDICE C PREacuteSENTATION DE LA HIEacuteRARCHIE

APPENDICE D PREacuteSENTATION DES DIAGRAMMES CHOISIS

BIBLIOGRAPHIE

72

73

75

78

79

80

80

81

81

83

85

91

97

105 shy

127

LISTE DES FIGURES

Figure Page

11 Code XY-pic pour un diagramme 14

12 Diagramme reacutesultant du code XY-pic 14

13 Code Metapost pour dessiner un triangle 15

14 Diagramme reacutesultant du code Metapost 15

15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin 16

16 Diagramme reacutesultant du code Asymptote 16

31 Courbes de Beacutezier lineacuteaire quadratique et cubique 34

32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier 38

33 Quart de cercle approximeacute par une courbe de Beacutezier 39

34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence 41

41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b 49

51 Extrait de la grammaire de SDDL pour une instruction 61

52 Code Java et SDDL pour calculer une combinaison lineacuteaire 63

53 Code reacuteflexif pour creacuteer une forme quelconque 65

54 Code pour geacuteneacuterer du code Asymptote pour un cercle 69

61 Diagramme dautomate de compilation 73

62 Code pour le diagramme dautomate 74

63 Diagramme de tableau 76

64 Code pour le diagramme de tableau 77

65 Diagramme de Venn 78

x

66 Code du diagramme de Venn 79

REacuteSUMEacute

Dans ce meacutemoire nous analysons la description de diagrammes structureacutes dans le domaine des matheacutematiques discregravetes et de linformatique theacuteorique Cette analyse seffectue agrave partir de meacutethodes eacutetablies du geacutenie logiciel Nous trouvons un ensemble de proprieacuteteacutes que nous recherchons dans une solution informatique nous permettant de creacuteer ces diagrammes Nous analysons aussi les outils classiques agrave partir des proprieacuteteacutes preacuteceacutedentes qui nous permettent de reacutealiser ces diagrammes dans un environnement I51EX Nous observons que ces outils ne sont pas aussi puissants quils le pourraient en fonction des proprieacuteteacutes eacutetablies par notre analyse

Par la suite en nous basant sur les meacutethodes de repreacutesentation graphique des courbes et sur la theacuteorie des langages informatiques nous jetons les bases dun lanshyguage de description Nous preacutesentons aussi un outil deacuteveloppeacute en Java qui nous pershymet de deacutecrire aiseacutement nos diagrammes dinformatique theacuteorique et de matheacutematiques discregravetes agrave partir dune hieacuterarchie dobjets claire et extensible Nous avons impleacutementeacute les eacuteleacutements essentiels de notre langage en SDDL (Structured Diagram Description Lanshyguage) Nous lavons aussi valideacute agrave laide dexemples repreacutesentatifs tireacutes de sources daushytoriteacute Nous avons finalement preacutesenteacute notre solution dans le cadre de la confeacuterence TUG 2010 Nous lavons aussi preacutesenteacute avec un article dans la revue du TeX Users Groups TUG

Mots cleacutes diagrammes informatique theacuteorique matheacutematiques discregravetes langage

INTRODUCTION

Le logiciel de mise en page de document U1EX est devenu llne reacutefeacuterence pour la creacuteation

de documents matheacutematiques (American Mathematical Society 2008) Plusieurs raisons

suscitent cet inteacuterecirct une structure naturelle permettant de repreacutesenter clairement ses

ideacutees le formatage automatique de qualiteacute et un reacutesultat final de qualiteacute professionnelle

agrave un coucirct moindre

Un traiteacute matheacutematique peut contenir plusieurs types dobjets textes formules grashy

phiques diagrammes etc Dans le cas preacutesent nous nous inteacuteressons principalement agrave

la repreacutesentation de diagrammes Par diagramme on entend un dessin qui possegravede une

structure discregravete sous-jacente (souvent combinatoire mais pas obligatoirement) Un

exemple simple serait un graphe ou un arbre

Agrave partir du moment ougrave nous nous inteacuteressons agrave ces diagrammes et agrave leur repreacutesentation

il devient inteacuteressant de voir ce que U1EX nous fournit afin de geacuteneacuterer des structures

de qualiteacute En effet les diagrammes sont essentiels agrave la transmission effective des ideacutees

et des reacutesultats en informatique et en matheacutematiques discregravetes De plus la consistance

nous oblige agrave chercher agrave faire nos diagrammes agrave partir dun modegravele coheacuterent Entre

autres il nous faut conserver la mecircme police dans les diagrammes et dans le texte

en plus davoir accegraves aux symboles matheacutematiques Nous pourrions aussi importer des

diagrammes exteacuterieurs agrave U1EX mais les reacutesultats obtenus ne serait pas consistant avec

le texte Nous devons donc chercher agrave obtenir une meacutethode de repreacutesentation adeacutequate

pour nos diagrammes

Bien sucircr il existe deacutejagrave plusieurs solutions agrave ce problegraveme Il nous faut donc les analyser

avec soin avec des critegraveres formels Cela implique de reacutepertorier les diffeacuterents paquets

U1EX permettant de faire du dessin avec leurs diffeacuterentes proprieacuteteacutes Il faut ensuite

2

ajouter les logiciels qui utilisent JbTEX indirectement donc qui nen font pas partie

mais sen servent tout de mecircme Cela nous donne une vue densemble complegravete des

solutions deacutejagrave existantes agrave notre problegraveme

Ensuite avant de penser agrave analyser ces solutions nous devons deacuteterminer ce que nous

voulons exactement Agrave cette fin nous avons analyseacute le processus qua utiliseacute Donald

Knuth creacuteateur de TEX agrave la base de Jb1EX afin de mateacuterialiser son logiciel de formatage

Nous devons aussi utiliser un ensemble de contraintes agrave soumettre agrave nos diffeacuterentes

solutions Il eacutetait essentiel dutiliser Jb1EX pour le formatage du texte mais aussi pour

la clarteacute deacutecriture la qualiteacute de la documentation et la capaciteacute de creacuteer aiseacutement des

structures Par la suite il devient aiseacute et tregraves formel danalyser chacunes des diffeacuterentes

solutions proposeacutees

Malheureusement cette analyse nous a permis de constater quaucune solution neacutetait

suffisamment bonne pour satisfaire nos besoins La plupart des paquets eacutetaient trop

simples alors que plusieurs eacutetaieentiernt composeacutes de macros rendant la veacuterification de

code quasi impossible Quelques solutions (telles que XY-Pic (Rose 2008) Metapost

(TeX Users Group 2009) et Asymptote (Hammerlindl Bowman- et Prince 2010a))

fournissaient de nombreuses ideacutees inteacuteressantes mais aucune ne convenait parfaitement

agrave nos besoins Nous en sommes donc venus agrave la conclusion que la meilleure solution

serait de creacuteer notre propre solution tout en reacuteutilisant les ideacutees deacuteveloppeacutees par les

solutions preacuteceacutedentes

Afin de creacuteer une solution robuste nous avons deacutecideacute de creacuteer une hieacuterarchie orienteacutee obshy

jet afin de repreacutesenter les diffeacuterentes structures du domaine des matheacutematiques discregravetes

et de linformatique theacuteorique Cela se justifie par le fait que les hieacuterarchies objets aushy

delagrave de leurs avantages possegravedent des meacutethodes de conceptualisation formelles et bien

deacutefinies Nous avons utiliseacute la meacutethode favoriseacutee par James Rumbaugh (Rumbaugh

et al 1991) un des creacuteateurs de UML (Object Management Group 2009)

Ce processus demande en tout premier lieu une analyse du domaine afin dobtenir les

structures principales Par la suite les liens entre les diffeacuterentes classes sont analyseacutes en

3

fonction des besoins respectifs Finalement apregraves plusieurs iteacuterations et simplifications

cette meacutethode foumit une hieacuterarchie complegravete Par contre elle doit par la suite ecirctre

adapteacutee aux speacutecificiteacutes du langage dimpleacutementation

Notre hieacuterarchie a eacuteteacute deacuteveloppeacutee autour de plusieurs concepts importants Certains

sont naturellement lieacutes au domaine dutilisation Par exemple un point est une structure

naturelle pour la description de positions dans un diagramme Le mecircme raisonnement

sapplique pour des formes geacuteomeacutetriques de base comme le cercle le carreacute et lellipse

Certains objets sont des simplifications de concepts communs Par exemple un point

abstrait est un point qui peut ecirctre deacutetermineacute de maniegravere absolue ou relative Une forme

est une classe de base repreacutesentant lensemble des objets qui peuvent ecirctre dessineacutes Il

existe aussi un dessin qui repreacutesente une forme agrave un endroit particulier

Bien que cela pourrait deacuteterminer complegravetement notre domaine afin davoir une hieacuteshy

rarchie complegravete il faut inclure certains eacuteleacutements de structure Par exemple bien que

nous puissions deacuteterminer assez aiseacutement ce quest un cercle la maniegravere de le deacutecrire

pour ecirctre dessineacute nest pas aussi simple Il en est de mecircme pour des formes courbes

plus complexes ainsi que des courbes de maniegravere geacuteneacuterale car un ordinateur ne peut pas

repreacutesenter aiseacutement toutes formes de chemin Nous pouvons creacuteer un concept geacuteneacuteral

de chemin mais celui-ci doit se ramener agrave la reacutealiteacute dun ordinateur

Cela est deacutetermineacute en analysant deux choses le format de document PDF et la desshy

cription de chemin dAsymptote Le premier utilise des splines cubiques comme eacuteleacutement

de base pour deacutecrire les courbes dans un document Cest inteacuteressant mais limitatif

Asymptote de son cocircteacute prend une description complexe mais preacutecise dune courbe et

en deacuteduit un ensemble de splines cubiques quil est possible de placer dans un docushy

ment PDF ensuite Nous en concluons que le bon chemin agrave prendre est probablement

dimpleacutementer comme structure de base des chemins tels que deacutecrits par Asymptote

avec une structure de splines cubiques

Par contre certaines questions theacuteoriques surviennent lors de cette analyse Le grand

problegraveme relegraveve de la puissance dexpression des splines cubiques En effet nous verrons

4

que les splines cubiques sont puissantes mais pas suffisamment puissantes pour deacutecrire

un cercle une forme geacuteomeacutetrique pourtant extrecircmement simple Nous verrons par contre

par la suite quil est possible de deacutecrire ce mecircme cercle avec des splines cubiques avec

une preacutecision acceptable pour la creacuteation de documents papier malgreacute son inexactitude

Afin dadapter la hieacuterarchie un langage dimpleacutementation a ducirc ecirctre choisi Eacutetant donneacute

les contraintes de temps il fucirct deacutecideacute de reacuteutiliser un langage de description de diashy

grammes deacutejagrave existant Asymptote Lutilisation de ce langage nous permet dobtenir

des primitives simples et un accegraves agrave Jb1EX deacutejagrave deacutetermineacute ce qui diminue de beaucoup la

charge de travail De plus Asymptote nous permet de creacuteer nos images reacutesultantes dans

les formats Postscript (Adobe Systems Incorporated 2010a) et PDF (Adobe Systems

Incorporated 2010b) sans avoir agrave reacutealiser nous-mecircmes du code de tregraves bas niveau

Eacutevidemment si Asymptote fournissait tout ce dont nous avions besoin nous naurions

pas besoin dutiliser autre chose Par contre cest un langage baseacute sur les structures

(Hammerlindl Bowman et Prince 201Ob) au lieu des objets Cela implique que notre

hieacuterarchie ne peut ecirctre construite agrave laide de lheacuteritage objet Eacutetant donneacute la complexiteacute

que cela engendrerait un langage suppleacutementaire doit-ecirctre utiliseacute pour-la creacuteation de

la hieacuterarchie Cela nous amegravene donc agrave choisir Java (Oracle 2010) Une recherche de la

compagnie TIOBE considegravere Java comme eacutetant le langage le plus utiliseacute au moment de

la preacutesente reacutedaction (TIOBE Software 2008)

Avant de consideacuterer le deacuteveloppement dun nouveau langage la premiegravere chose agrave faire

consiste agrave consideacuterer ce agrave quoi nous voulons quil ressemble Afin de reacutealiser cette eacutetape

nous avons analyseacute notre base de diagrammes en donnant une description la plus proche

possible dun langage de programmation En simplifiant chaque description autant que

possible nous avons pu extraire quelques concepts de base importants pour la descripshy

tion de nos diagrammes De plus certaines contraintes suppleacutementaires peuvent ecirctre

ajouteacutees qui deacutependent plus de limpleacutementation que de la theacuteorie En quelque sorte

il faut pour reacutealiser notre projet nous baser sur des technologies qui ont fait leurs

preuves

5

Afin de deacutevelopper notre langage il nous faut des concepts pour le deacutecrire Cela sefshy

fectue agrave laide de la theacuteorie des langages et des automates Plus particuliegraverement nous

utiliserons les grammaires afin de faccedilonner un langage qui convient agrave nos besoins tout en

eacutetant simple agrave analyser par un programme informatique agrave laide dun logiciel speacutecialiseacute

SabieCC (Gagnon 1998) Nous verrons que les grammaires nous permettent de deacutecrire

complegravetement notre langage afin decirctre analyseacute par ordinateur

Une fois que nous avons notre langage final il ne reste plus quagrave veacuterifier les reacutesultats

obtenus Afin de boucler la boucle nous avons reacutealiseacute la programmation de chacun des

diagrammes que nous avions choisis au deacutepart pour notre base de tests Une fois ceuxshy

ci reacutealiseacutes il ne restait plus quagrave analyser les diffeacuterences entre les deux et voir si les

reacutesultats obtenus eacutetaient satisfaisants Cela nous permet de deacutemontrer quil sagit dune

solution naturelle et efficace eacutetant donneacute que nous pouvons creacuteer les objets de notre

domaine pour produire des diagrammes de grande qualiteacute

Le reste de ce meacutemoire est structureacute comme suit Le chapitre 1 expose la probleacutematique

et les objectifs rechercheacutes Le chapitre 2 introduit la creacuteation de notre solution inforshy

matique et plus speacutecifiquement de la hieacuterarchie objet Le chapitre 3 deacutecrit la theacuteorie

matheacutematique derriegravere la description de courbes et segments par ordinateur Le chapitre

4 expose les dessous de la theacuteorie des langages que nous utilisons afin de creacuteer SOOL

Le chapitre 5 expose la creacuteation du langage au-dessus de la hieacuterarchie Finalement le

chapitre 6 analyse le reacutesultat final afin de voir si le tout reacutepond aux objectifs deacutefinis au

deacutepart

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CHAPITRE l

PROBLEacuteMATIQUE ET OBJECTIFS

Dans ce chapitre nous nous eacutetendrons sm une deacutefinition correcte et complegravete de la

probleacutematique ainsi que sur les objectifs que nous souhaitons atteindre Nous verrons

aussi une analyse des solutions qui existent deacutejagrave et les raisons qui nous poussent agrave

deacutevelopper notre propre solution Finalement nous deacutefinirons une base de diagrammes

aptes agrave repreacutesenter adeacutequatement nos objectifs

11 Description de la probleacutematique

111 Les notes de cours une mise en contexte

Ce projet fut motiveacute principalement par la reacutedaction de notes de cours En effet

dans un milieu universitaire (particuliegraverement pour les eacutetudiants au baccalaureacuteat mais

eacutegalement pour les eacutelegraveves de cycles supeacuterieurs) il est extrecircmement utile de pouvoir

utiliser des notes de cours de quali teacute

La creacuteation de notes de cours adapteacutees vient tout de mecircme avec quelques problegravemes

Premiegraverement surtout en informatique la plupart des livres sont eacutecrits en anglais Cela

implique souvent de devoir eacutecrire nos propres versions sous la forme de notes de cours

De plus linformatique est un domaine qui eacutevolue agrave un rythme fulgurant Cela implique

que des notes adeacutequates et adapteacutees doivent ecirctre agrave jour Comme certains eacuteleacutements en

informatique peuvent eacutevoluer agrave chaque anneacutee voire plus vite il faut ecirctre capable deacutecrire

extrecircmement rapidement des textes si nous souhaitons quils soient utiles un tant soit

8

peu

Cela nous amegravene agrave notre probleacutematique principale plusieurs cours neacutecessitent un supshy

port plus complexe que simplement des mots agrave savoir des dessins et des diagrammes

voire des animations Cela est requis dans plusieurs cours en informatique theacuteorique

particuliegraverement dans leacutetude des structures de donneacutees et des algorithmes Il nous faut

donc une meacutethode rapide et efficace pour creacuteer des diagrammes agrave placer dans nos notes

de cours

112 Domaine dapplication eacutelargi

Bien eacutevidemment cibler purement les notes de cours et les structures de donneacutees nest

quun point de deacutepart Nous pouvons eacutelargir notre domaine dapplication agrave des diashy

grammes structureacutes cest-agrave-dire un dessin qui possegravede une structure sous-jacente crushy

ciale au point de pouvoir necirctre deacutecrit quagrave partir de cette structure Par exemple

un graphe est un ensemble de sommets eacutetiqueteacutes relieacutes ensemble par des flegraveches Tout

dessin de graphe est donc un dagramm~ selon notye deacutefiniton Dun_autre cocirct~ une

peinture possegravede parfois une structure mais celle-ci est largement insuffisante pour

deacutecrire loeuvre Par exemple pertgtonne noserait deacutecrire un Picasso comme eacutetant un

amas de cercles et de carreacutes de diffeacuterentes couleurs

Lensemble des structures que nous visons se rapporte donc essentiellement agrave deux

domaines linformatique theacuteorique et les matheacutematiques discregravetes Linformatique

theacuteorique est surtout deacutefinie par les structures de donneacutees et les algorithmes (et tout

sujet sy reliant) Les matheacutematiques discregravetes sont surtout deacutefinies par la theacuteorie des

graphes et la combinatoire Nous neacutegligeons ici volontairement les matheacutematiques contishy

nues pour deux raisons La premiegravere est quune structure de taille infinie peut souvent

ecirctre repreacutesenteacutee par une structure finie (donc discregravete) La seconde est que les besoins

en matheacutematiques continues sont largement diffeacuterents des besoins en matheacutematiques

discregravetes En effet dessiner le graphe dune fonction de deux variables est un sujet comshy

plexe mais totalement diffeacuterent de creacuteer un graphe Afin de rendre nos besoins plus

9

speacutecifiques nous eacuteviterons ce genre de dessins qui possegravedent deacutejagrave de nombreux logiciels

pour les reacutealiser (entre autres Maple) (Maplesoft 2010)

12 Description des objectifs rechercheacutes

La premiegravere partie de notre travail consiste agrave deacutecrire les objectifs que nous souhaitons

atteindre dans notre creacuteation de diagrammes En effet plusieurs paramegravetres importants

peuvent ecirctre utiliseacutes Il est donc important de ne pas perdre de vue lensemble tout en

donnant la prioriteacute agrave certains eacuteleacutements

121 Inteacutegration avec ~IEX

Ib1EX est un langage de description de documents texte Creacuteeacute agrave lorigine sous la forme

de TEX par Donald Knuth (Knuth 1984) puis modifieacute par Leslie Lamport (Lamport

et Bibby 1986) celui-ci est rapidement devenu un standard dans la reacutedaction darticles

scientifiques dans plusieurs domaines Bien quutiliseacute surtout pour la reacutedaction darticles

il a eacuteteacute preacutevu au deacutepart pour la reacutedaction de livres Il se distingue par sa capaciteacute agrave

creacuteer aiseacutement du contenu matheacutematique et le fait de soccuper du contenu en laissant

le logiciel soccuper de la mise en page du texte Il est si populaire que de nombreux

meacutemoires incluant celui-ci sont eacutecrits agrave partir de Ib1EX

Eacutetant donneacute que le monde des matheacutematiques et de linformatique theacuteorique utilise

abondamment Ib1EX il est important quun logiciel de creacuteation de diagrammes pershy

mette de lutiliser En effet si notre objectif est de creacuteer du contenu de qualiteacute professhy

sionnelle il faut que les polices soient constantes au travers de notre article (ou de nos

notes de cours) Naturellement plusieurs diagrammes vont contenir du texte Il faut

donc pour ecirctre consistant geacuteneacuterer ce texte avec Ib1EX afin davoir une forme standard

pour lensemble du document De plus il est tout agrave fait possible de vouloir mettre des

symboles matheacutematiques dans un diagramme (par exemple un symbole dinteacutegrale) Si

le texte est geacuteneacutereacute avec Ib1EX cela vient automatiquement Sinon il devient tregraves difficile

dobtenir un texte de belle qualiteacute Il sagit donc dun besoin primordial

10

122 Description de structures

Un autre eacuteleacutement extrecircmement important que nous recherchons est de pouvoir faire

adeacutequatement la description de diffeacuterentes structures Eacutetant donneacute que les diagrammes

sont composeacutes de structures il faut pouvoir en creacuteer aiseacutement et les relier de maniegravere

aiseacutee Cela implique quelques petites contraintes entre autres de pouvoir utiliser des

variables pour conserver les structures en question Ideacutealement la solution la plus solide

en terme de description de structures utiliserait lorienteacute-objet Une des composantes

les plus importantes dune solution orienteacutee objet est la preacutesence dune hieacuterarchie de

classes dobjets

123 Hieacuterarchie solide et extensible

Un objectif que nous recherchons est que le langage nous fournisse une hieacuterarchie dobshy

jets (ou de structures) de qualiteacute afin de pouvoir creacuteer une grande quantiteacute de diashy

grammes agrave partir deacuteleacutements de cette hieacuterarchie Une hieacuterarchie peut ecirctre deacutecrite comme

eacutetant une structure permettant dinteacutegrer facilemen~ de nouveau~ aspects sans_avoir agrave

dupliquer inutilement du code Il serait aussi important quelle puisse ecirctre eacutetendue si cershy

tains eacuteleacutements suppleacutementaires sont neacutecessaires Par exemple il pourrait ecirctre inteacuteressant

pour des gens en geacutenie eacutelectrique de pouvoir faire des diagrammes eacutelectriques malgreacute

le fait que cela ne fait pas partie de nos contraintes de deacutepart Cela pourrait ecirctre ajouteacute

par extension du systegraveme

124 Objectifs moindres

Gestion des erreurs

Dans des notes de cours il est freacutequent davoir des diagrammes Par contre eacutecrire

un diagramme peut saveacuterer plus compliqueacute que deacutecrire du texte Comme plusieurs

utilisateurs potentiels ne seront pas des experts du systegraveme il faut que les erreurs soient

deacutetecteacutees et traiteacutees de maniegravere adeacutequate Cela assure agrave lutilisateur final une expeacuterience

11

plaisante en speacutecifiant les erreurs quil commet et des meacutethodes pour les reacuteparer Sil

faut que lutilisateur cherche pendant des heures pour trouver la petite erreur quil a

commise il va tout simplement cesser dutiliser le logiciel

Langage fluide et clair

Bien que moins important le fait davoir un langage clair est excellent pour attirer les

utilisateurs vers ce systegraveme En effet si le langage est un gribouillis incompreacutehensible il

sera fort probablement dur dapprentissage et difficile agrave aborder Par fluide et clair nous

entendons que le langage soit jusquagrave un certain point compreacutehensible pour quelquun

qui ne connaicirct pas le systegraveme

Qualiteacute de la documentation et courbe dapprentissage

Finalement il faut quune documentation existe et quelle soit complegravete De preacutefeacuterence

une bonne documentation contiendra un reacutepertoire de toutes les fonctionnaliteacutes mais

aussi des tutoriels avec des exemples codeacutes de cas standards Cela incite les utilisateurs

agrave essayer le logiciel en prenant un exemple et en ladaptant agrave leurs besoins Cela amegravene

(avec les autres objectifs) agrave un langage simple dapprentissage mais tout de mecircme

puissant Comme notre objectif est de trouver une solution simple il faut que nimporte

qui puisse commencer agrave sen servir rapidement sans avoir besoin de lire lensemble de

la documentation

13 Analyse des solutions existantes

Naturellement une fois que nous savons ce que nous recherchons il nous faut analyser

toutes les solutions qui existent deacutejagrave Cela nous permettra didentifier une solution qui

est deacutejagrave fonctionnelle ou au mieux une qui pourra ecirctre eacutetendue ou utiliseacutee afin de

simplifier le travail de creacuteation si besoin est Au minimum nous pourrons extraire les

concepts inteacuteressants de chaque solution et voir sil est possible de les inteacutegrer agrave notre

solution

12

131 Paquets f1TEX standards

Eacutetant donneacute limportance de lutilisation de JbIEX les premiegraveres solutions sont celles

disponibles agrave linteacuterieur mecircme de fbIEX Celles-ci sont appeleacutees des paquets Plusieurs

paquets diffeacuterents existent et bon nombre dentre eux sont des solutions bricoleacutees et

donc incomplegravetes

Dans les solutions inteacuteressantes on note premiegraverement la preacutesence de la commande

picture Celle-ci a eacuteteacute ajouteacutee dans TEX par Donald Knuth comme tme solution agrave tout

oubli potentiel dans son systegraveme Cette commande prend du texte quelconque et le passe

par la suite au pilote qui compile le document Cela permet entre autres de transfeacuterer

des informations au pilote qui compile en Postscript et permet donc lutilisation de toute

la force de Postscript dans la reacutedaction de dessin Un gros problegraveme de cette solution

est que le texte agrave eacutecrire deacutepend du pilote utiliseacute limitant de beaucoup son utilisation

Il est tout de mecircme devenu la base de nombreux paquets qui se servent de Postscript

Plusieurs solutions ont aussi eacuteteacute deacuteveloppeacutees pour toutes sortes de domaines On retrouve

entre autres des-diagrammes de-Peynmann et deuml Lewis (feyn et-lewis) des dia-grammes

de flots (nassflow) et des arbres linguistiques (xyling rst qtree et lingtrees)

Naturellement ces solutions ne conviennent pas car elles sont pour des domaines trop

speacutecifiques par rapport agrave notre objectif

Une solution dun domaine plus geacuteneacuteral qui se deacutemarque est le paquet PSTricks (Van

Zandt 1993a) Creacuteeacute en 1993 par le professeur Timothy Van Zandt celui-ci est devenu

tregraves populaire au fil des anneacutees eacutetant donneacute les nombreuses possibiliteacutes qui existent en

Postscript Un des grands avantages est sa documentation qui est tregraves prolifique et tregraves

claire (Van Zandt 1993b)

Cela est bien inteacuteressant mais malheureusement PSTricks souffre du mecircme problegraveme

que chaque paquet interne agrave JbTEXmiddot Il est fait agrave partir de macros En effet TEX a eacuteteacute eacutecrit

complegravetement agrave partir de macros Il sagit dlm meacutecanisme de remplacement textuel ougrave

lon deacutefinit une entreacutee et toutes les occurrences de cette entreacutee sont remplaceacutees par une

13

sortie bien speacutecifique Comme une macro est toujours remplaceacutee par son contenu avant

decirctre analyseacutee plus en deacutetail toute forme derreur se retrouve agrave un niveau extrecircmement

bas Cela fait que nimporte quelle erreur est quasi impossible agrave cerner correctement

rendant le travail de lutilisateur qui souhaite apprendre tregraves complexe De plus le fait

de fournir le Postscript directement agrave lutilisateur rend celui-ci tregraves puissant mais tregraves

dangereux Finalement bien que de nombreuses formes soient disponibles il nexiste

pas de hieacuterarchie en tant que telle dans PSTricks ce qui le rend impossible agrave eacutetendre

132 )(J(-pic

Une autre solution inteacuteressante peut ecirctre retrouveacutee agrave linteacuterieur de gTEX Il sagit

de XV-pic un paquet eacutecrit par Kristoffer H Rose (Rose et al 2010) Ce paquet

a eacuteteacute creacuteeacute speacutecifiquement pour la description de diagrammes agrave linteacuterieur de gTEX

et possegravede une documentation exhaustive Malheureusement cette documentation est

extrecircmement complexe mecircme pour un utilisateur avanceacute XV-pic utilise principalement

des boicirctes gTEX positionneacutees agrave diffeacuterents endroits afin de creacuteer les diagrammes Ceuxshy

ci sont par la suite relieacutes par diffeacuterents objets puis deacutecoreacutes Cela fournit un reacutesultat

final de qualiteacute XV-pic possegravede entre autres un mode pour creacuteer des diagrammes en

positionnant les eacuteleacutements dans une matrice Cela rend les dessins plus simples concepshy

tuellement mais pas toujours positionneacutes adeacutequatement XV-pic permet aussi de faire

du positionnement relatif agrave dautres objets ce qui peut ecirctre tregraves pratique Comme nous

pouvons le voir dans lexemple suivant XV-pic est tregraves pratique dans les reacutesultats quil

nous permet dobtenir mais sa syntaxe laisse de beaucoup agrave deacutesirer

Par contre les deacutefauts de XV-pic sont extrecircmement visibles En premier lieu la syntaxe

du langage est extrecircmement difficile agrave comprendre car elle est baseacutee sur la composition

de nombreux caractegraveres speacuteciaux De plus comme il sagit dun paquet gTEX le tout

est impleacutementeacute agrave laide de macros et rend donc la recherche derreur laborieuse (surshy

tout lorsquon prend en compte la syntaxe deacutejagrave difficile agrave utiliser) Cela rend XV-pic

inapte agrave lutilisation par quelquun qui ne souhaite pas investir trop de temps dans son

apprentissage Finalement les nombreux modes de dessins sont souvent incompatibles

14

xymatrix U ar_[ddr]_y ar-[drr]-x

argt[dr] I-(xy) amp X times_Z y ar[d]-q ar[r]_p amp X ar[d]_f amp y ar[r]-g

amp Z

Figure 11 Code XY-pic pour un diagramme

Figure 12 Diagramme reacutesultant du code XY-pic

entre eux et ne peuvent souvent pas ecirctre utiliseacutes dans un mecircme dessin

133 Metapost

Eacutetant donneacute le problegraveme commun agrave tous les paquets agrave linteacuterieur de JgEX la solution la

plus logique serait dessayer den sortir Cela a donneacute le logiciel Metapost (Hobby 1992)

Celui-ci a eacuteteacute inspireacute de Metafont (Knuth 1986) que Knuth a utiliseacute pour dessiner des

polices pour EX Une des grandes avanceacutees du langage est la description de courbes

Celui-ci reacuteutilise un algorithme de Knuth qui permet de deacutecrire des courbes tout en

en controcirclant les diffeacuterents paramegravetres De plus comme le logiciel nest pas reacutedigeacute en

macros il permet de deacutetecter de maniegravere adeacutequate les erreurs de lusager Nous pouvons

deacutejagrave voir dans le code fourni en exemple quil sagit dun langage beaucoup plus clair

que XV-pic

15

beginfig(l)

pair A B C A=(OO) B=(lcmO) C=(Olcm) draw A--B--C--cycle

endfig

Figure 13 Code Metapost pour dessiner un triangle

Figure 14 Diagramme reacutesultant du code Metapost

Par contre quelques problegravemes se deacutegagent de Metapost Premiegraverement le langage ne

permet pas limpleacutementation dune hieacuterarchie solide Cela ne serait pas un problegraveme sil

en existait deacutejagrave une mais ce nest pas le cas En effet les diagrammes ont fait lobjet

dune extension du langage mais rien de tregraves deacuteveloppeacute Il est donc faisable de faire

des diagrammes mais il ne sagit pas neacutecessairement dune solution agrave toute eacutepreuve

De plus comme toutes les coordonneacutees du langage sont donneacutees en valeur absolue cela

limite les possibiliteacutes du langage (entre autres en ne pouvant utiliser des points deacutefinis

par des objets)

134 Asymptote

Une autre possibiliteacute se retrouve dans le logiciel Asymptote qui se deacutefinit comme eacutetant

Wl langage inspireacute de Metapost (Hammerlindl Bowman et Prince 2010b) Il est donc

aussi externe agrave g1EX mais aussi inspireacute du langage de programmation CH Cela lui

confegravere la creacuteation de structures avanceacutees et la creacuteation de fonctions complexes De

plus une documentation exhaustive et un traitement des erreurs de qualiteacute en font une

solution robuste

Malheureusement comme Metapost Asymptote pose quelques problegravemes En effet ce

16

size(3cm) draw(unitsquare) labelC l $A$ (00) SW)

labelC $B$ Cl 0) SE) label ($C$ Cl 1) NE)

label ($0$ (01) NW)

Figure 15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin

( )

il

Figure 16 Diagramme reacutesultant du code Asymptote

logiciel fut eacutecrit avec les matheacutematiques continues et la geacuteomeacutetrie comme domaine

dutilisation Ce nest pas Lill problegraveme en tant que tel (Asymptote le fait tregraves bien)

mais cela fait que la- creacuteation de diagrammes discrets nest pas vraiment deacuteveloppeacutee

Il faudrait donc ecirctre capable de creacuteer une hieacuterarchie de structures pour la creacuteation de

diagrammes Eacutetant donneacute le support des structures posseacutedant des fonctions internes il

devrait ecirctre possible dajouter cette possibiliteacute agrave Asymptote

Malheureusement ce nest pas preacutesentement reacutealisable agrave linteacuterieur du langage En efshy

fet Asymptote est un langage baseacute objet Cela signifie quil possegravede des structures qui

ressemblent agrave une description typique dun objet mais pas toutes les proprieacuteteacutes imshy

portantes qui se rattachent agrave un langage agrave objets standard comme Java ou C++ Plus

particuliegraverement cest labsence de polymorphisme qui cause problegraveme En effet la

creacuteation dune hieacuterarchie implique de creacuteer des liens entre les diffeacuterentes structures Par

exemple un cercle un triangle et un nuage sont toutes des formes avec certaines proshy

prieacuteteacutes similaires Il nous faut donc avoir des fonctions qui prennent des formes comme

paramegravetres Si nous avons une fonction f qui prend une forme nous souhaiterions eacutecrire

une seule fonction

17

fCforme)

Malheureusement en Asymptote il faudrait eacutecrire une fonction pour chaque forme

distincte comme cela

fCcercle)

fCcarre)

fCnuage)

Cela rend la creacuteation dune hieacuterarchie extrecircmement difficile car pour chaque fonction

utilisant un objet plus geacuteneacuteral il nous faut eacutecrire plusieurs fois cette fonction De plus

cela rend lexpansion par lusager de la hieacuterarchie essentiellement impossible car il doit

rajouter des cas pour chaque fonction deacutefinie preacuteceacutedemment en plus dajouter son nouvel

objet dans la hieacuterarchie Cela est difficilement souhaitable

135 Conclusion de lanalyse

Afin den venir agrave une conclusion adeacutequate il faut se ramener aux objectifs rechercheacutes

Cela nous permet de rapidement eacuteliminer les solutions internes agrave Ib-TEX eacutetant donneacute

la complexiteacute de la gestion des erreurs (et indirectement la courbe dapprentissage du

langage) Cela nous laisse comme solution Metapost et Asymptote Naturellement le

langage Asymptote est plus eacutevolueacute que celui de Metapost et fournit des eacuteleacutements de

programmation plus inteacuteressants Cela implique donc quil nous permet plus aiseacutement

de construire nos structures tant deacutesireacutees

Par contre Asymptote ne fournit pas une solution suffisante eacutetant donneacute quil ne possegravede

pas une hieacuterarchie dobjets adapteacutee aux diagrammes De plus eacutetant donneacute que le langage

est baseacute objet il sera beaucoup trop compliqueacute dy implanter une hieacuterarchie Nous en

venons donc agrave la conclusion que le mieux serait dutiliser Asymptote qui nous fournit un

ensemble de services complexes (impleacutementation des chemins liens avec Ib-TEX etc )

et de limpleacutementer avec un langage de plus haut niveau

18

Java devient un choix inteacuteressant pour cette tacircche En effet cest un langage connu dans

lindustrie et simple dapprentissage Il sagit dun langage de programmation objet qui

nous permettra agrave coup sucircr dimpleacutementer une hieacuterarchie solide Par contre ce langage

possegravede quelqu~s petits problegravemes comme un tregraves haut niveau de verbositeacute et beaucoup

deacuteleacutements non requis pour la description de diagrammes

Nous en sommes donc venus agrave la conclusion que la meilleure solution serait dutiliser

Java mais dimpleacutementer par-dessus celui-ci un langage deacutedieacute qui eacuteliminerait tout ce

qui nest pas requis pour la description des diagrammes Nous appellerons ce langage

SDDL pour Structured Diagram Description Language

Concepts inteacuteressants agrave conserver

Avant de penser agrave concevoir notre logiciel il serait bon de voir quels eacuteleacutements nous

souhaitons conserver des solutions existantes Agrave cette fin leacuteleacutement le plus inteacuteressant

provient de XV-Pic En effet il permet de relier des objets entre eux par des flegraveches

dune maniegravere relativement simple Il serait donc inteacuteressant de pouvoir permettre de

deacutecrire des liens entre diffeacuterents objets par des points speacutecifiques agrave chacun dentre eux

De plus lalgorithme de description de chemins utiliseacute par Metapost et Asymptote est

extrecircmement efficace et utile et pourrait donc ecirctre utiliseacute directement par notre langage

Cela sera simple agrave impleacutementer eacutetant donneacute que nous souhaitons utiliser Asymptote pour

compiler vers Postscript

14 Diagrammes repreacutesentatifs du domaine

Finalement avant de pouvoir commencer agrave deacutefinir les besoins de notre hieacuterarchie il

nous faut obtenir une deacutefinition valide et complegravete de notre domaine Naturellement

il nest pas eacutevident de trouver une deacutefinition concregravete et objective dun diagramme en

informatique theacuteorique Nous devons donc nous rabattre sur une autre solution qui doit

tout de mecircme ecirctre la plus formelle possible

19

141 Lapproche de Knuth

Pour trouver une ideacutee nous nous ramegravenerons agrave la meacutethode que Donald Knuth a utiliseacutee

lorsquil a creacuteeacute TEX En effet il souhaitait creacuteer un logiciel qui ferait de laquo beauxraquo doshy

cuments Cela eacutetant un terme tregraves subjectif Knuth deacutecida de se deacutefinir un ensemble

de journaux scientifiques dont les publications eacutetaient du plus haut standard de qualiteacute

pour leacutepoque (Knuth 1999) Apregraves avoir obtenu ces diffeacuterents exemples il put saffairer

agrave essayer de reproduire une solution de cette qualiteacute Il devient donc eacutevident agrave la fin

du cycle de deacuteveloppement du logiciel que sa solution eacutetait coheacuterente et valide car elle

permettait dobtenir un reacutesultat de qualiteacute en comparaison agrave ce que nous pourrions

deacutejagrave deacutefinir comme eacutetant de qualiteacute

Nous pouvons donc chercher agrave suivre la mecircme meacutethode Afin de la respecter nous devons

trouver quelques livres dun haut niveau de qualiteacute et prendre certains diagrammes

que lon retrouve agrave linteacuterieur Cela nous permettra de retrouver les eacuteleacutements les plus

cruciaux de notre domaine

Plusieurs livres inteacuteressants soffrent agrave nous nous utiliserons entre autres laquo The Art

of Computer Programming raquo de Donald Knuth (Knuth 1968) Il est naturel quun des

livres les plus connus en informatique eacutecrit par Knuth de surcroicirct possegravede un haut

standard de qualiteacute Un autre livre important est le laquo livre du dragonraquo (Aho Sethi et

Ullman 1986) qui eacutetudie la theacuteorie de la compilation et est extrecircmement connu dans

son domaine De plus celui-ci renferme leacutetude de nombreuses structures de donneacutees ce

qui nous fournit de nombreux diagrammes de qualiteacute Finalement il existe aussi un livre

tregraves connu dans leacutetude des algorithmes (ce qui est aussi extrecircmement lieacute agrave leacutetude des

structures de donneacutees) qui sappelle laquo Introduction to Algorithmsraquo (Cormen et al

2001) Ces trois livres forment une base extrecircmement connue et de qualiteacute pour nos

diagrammes Nous avons extrait quinze (15) diffeacuterents diagrammes de ces livres

20

142 Description des exemples et des concepts preacutesents dans les diagrammes

Les diffeacuterents diagrammes que nous avons seacutelectionneacutes repreacutesentent diffeacuterentes strucshy

tures de donneacutees On y retrouve plusieurs arbres et graphes Les graphes sont de plushy

sieurs types allant dun graphe standard agrave des graphes dexeacutecution De plus certaines

structures preacutesentes plus rarement se retrouvent dans notre ensemble Entre autres on

retrouve un diagramme de Venn qui bien que conceptuellement simple est toujours

relativement complexe lorsque nous souhaitons le reacutealiser avec un logiciel On retrouve

aussi des arbres linguistiques qui ne sont pas neacutecessairement complexes mais surtout

longs agrave reacutealiser

Cet ensemble de diagrammes nous permet de couvrir lensemble des structures de

donneacutees importantes en informatique theacuteorique et en matheacutematiques discregravetes Il existe

dautres structures de donneacutees mais celles-ci peuvent toujours ecirctre impleacutementeacutees seacutepashy

reacutement eacutetant donneacute que nous souhaitons faire une hieacuterarchie aiseacutement extensible Nous

remarquons surtout dans nos exemples quun des eacuteleacutements les plus importants est de

pouvoir r~lier convenablement les_diffeacuterents eacuteleacutements (dans un graphe par exemple)

Comme il sagit de quelque chose qui est toujours preacutesent il sagira dun des points les

plus importants agrave deacutevelopper pour notre hieacuterarchie

CHAPITRE II

STRUCTURE ET SOLUTION INFORMATIQUE

Afin de deacutevelopper un produit qui convient agrave nos besoins nous aurons besoin quil soit

structureacute adeacutequatement Cela implique principalement la construction de la hieacuterarchie

dobjets du domaine Il faut deacuteterminer quels sont les eacuteleacutements rechercheacutes dans notre

solution trouver une meacutethode de deacuteveloppement formelle et adeacutequate puis la reacutealiser

correctement Cela assurera une solution de qualiteacute

21 Objectifs dune structure dans une solution informatique

En premier lieu il nous faut justifier le besoin dune meacutethode de deacuteveloppement forshy

melle et solide En effet lin logiciel en informatique est tregraves diffeacuterent dun problegraveme

matheacutematique standard Une deacutemarche matheacutematique se ramegravene agrave un concept bien

connu la preuve Cela reurond la reacutesolution du problegraveme creacutedible agrave condition que la

preuve soit bonne Par contre nous verrons quun problegraveme informatique ne peut ecirctre

reacutesolu agrave laide dune simple preuve

211 Les diffeacuterentes composantes dune solution informatique

Une solution agrave un problegraveme informatique possegravede diffeacuterents eacuteleacutements Chacun dentre

eux possegravedent un certain degreacute de formalisme qui affecte lensemble de la solution

22

Algorithmes

Les algorithmes sont les eacuteleacutements les plus formels dune solution informatique On peut

dire quils se ramegravenent agrave la partie matheacutematique dun problegraveme informatique en quelque

sorte Composeacute dune seacuterie dopeacuterations aux comportements bien deacutefinis le reacutesultat dun

algorithme est preacutevisible Eacutetant donneacute la possibiliteacute de preacutevoir le comportement dun

algorithme agrave partir de ses entreacutees il est possible de deacutemontrer que lalgorithme fournit

exactement les reacutesultats rechercheacutes Il suffit en effet de prouver que agrave chaque entreacutee

possible on obtient la sortie qui serait logiquement attendue de lalgorithme On peut

penser par exemple agrave un algorithme de tri qui pour chaque ensemble de nombres

retourne les nombres en ordre croissant

Malgreacute tout un algorithme en informatique nest pas parfait En effet si le temps

dexeacutecution dun algorithme pour des entreacutees standards est beaucoup trop eacuteleveacute il ne

sera pas utiliseacute peu importe quil donne le bon reacutesultat Le temps dopeacuteration et la

quantiteacute despace meacutemoire sont les deux principales contraintes qui entrent en ligne de

compte pour les diffeacuterents algorithmes dune solution informatique

Solutions technologiques

Lautre partie extrecircmement importante de tout logiciel informatique est le choix des

technologies utiliseacutees En effet les programmes informatiques ne sont pas directement

creacuteeacutes agrave partir de circuit eacutelectriques Chaque couche dabstraction suppleacutementaire (cirshy

cuits logiques code assembleur programmation de haut niveau) limite les possibiliteacutes

du programmeur et vient avec certains avantages et certains inconveacutenients Le fait de

ne pas utiliser une solution deacutejagrave existante peut permettre une solution plus puissante

mais agrave un coucirct de deacuteveloppement potentiellement beaucoup plus eacuteleveacute Il est aussi posshy

sible avec un certain ensemble de choix technologiques de ne pas pouvoir obtenir un

effet rechercheacute dans une solution Cela explique pourquoi nous avons deacutecideacute dutiliser

Asymptote Il nous fournit un accegraves agrave JbTEX deacutejagrave codeacute ainsi quune traduction comshy

plexe vers un fichier image Postscript La reacutealisation de ces diffeacuterents eacuteleacutements de

23

code aurait significativement augmenteacute la complexiteacute de notre tacircche

Imperfection de toute solution informatique

Eacutetant donneacute les limitations des outils technologiques agrave notre disposition nous sommes

obligeacutes de constater que toute solution informatique est imparfaite De plus plusieurs

contraintes donneacutees agrave des systegravemes informatiques sont geacuteneacuteralement vagues et peuvent

ecirctre interpreacuteteacutees diffeacuteremment en fonction de lutilisateur Par exemple nous souhaitons

reacutealiser un outil simple dutilisation mais puissant et extensible Naturellement plus

un langage est puissant plus il devient complexe Un utilisateur peut trouver un outil

tregraves simple alors quun autre le trouvera incompreacutehensible Dautres points comme la

qualiteacute de documentation la courbe dapprentissage et lagestion aiseacutee des erreurs sont

des critegraveres qui possegravedent une bonne part de subjectiviteacute Ce ne sont toutefois pas

neacutecegravessairement de mauvais critegraveres Il faut simplement chercher selon une deacutefinition la

plus proche possible dun utilisateur moyen agrave maximiser les diffeacuterents paramegravetres

Ce genre de contraintes relegraveve geacuteneacuteralement du geacutenie logiciel Bien que ce meacutemoire ne

constitue pas un travail de geacutenie logiciel nous sommes obligeacutes demprunter quelques

eacuteleacutements agrave ce domaine afin dobtenir un reacutesultat adeacutequat

212 Consideacuterations pour une meacutethodologie de deacuteveloppement

Avant de choisir notre meacutethodologie il est bon de veacuterifier les objectifs rechercheacutes dans

lutilisation dune telle meacutethode de deacuteveloppement Cela nous permettra de deacutegager les

eacuteleacutements importants agrave garder en tecircte tout au long du deacuteveloppement de la hieacuterarchie

Un des eacuteleacutements les plus importants est dobtenir une structure efficace pour deacutecrire

nos diagrammes Lautre eacuteleacutement crucial est dobtenir une hieacuterarchie qui repreacutesente

adeacutequatement le domaine De preacutefeacuterence elle doit ecirctre complegravete et dun usage naturel

On entend par lagrave que les eacuteleacutements sont suffisamment preacutecis et proches deacuteleacutements stanshy

dards et connus du domaine que toutes les opeacuterations soient laquo naturellesraquo pour une

personne qui ne connaicirct pas le langage Il nexiste malheureusement pas de mesure pour

24

deacuteterminer si une hieacuterarchie est naturelle ou non Toutefois si chaque section est reacutefleacutechie

de maniegravere formelle le reacutesultat final devrait ecirctre naturel Certaines consideacuterations mishy

neures peuvent ecirctre plus ou moins mesureacutees comme la longueur du code et les noms

adeacutequats de fonctions

22 La programmation orienteacutee-objet

La programmation orienteacutee-objet est un des pheacutenomegravenes tregraves importants en informashy

tique Depuis sa creacuteation elle est devenue de plus en plus populaire eacutetant donneacute la faciliteacute

de deacuteveloppement dans une telle meacutethode Le fait dutiliser une solution orienteacutee-objet

(au contraire de Metapost ou Asymptote) ne sest pas fait de faccedilon arbitraire Il est

donc de mise dexposer les diffeacuterents avantages qui nous ont pousseacutes agrave choisir un tel

paradigme pour notre logiciel

221 Concepts de bases

La structure de base en programmation orienteacutee-objet est naturellement lobjet Celuishy

ci est deacutefini comme eacutetant une structure de donneacutees qui regroupe des donneacutees et des

meacutethodes (Saunders 1989) Bien quil ne sagit pas dun critegravere obligatoire la plushy

part des langages de programmation creacuteent les objets agrave partir dune classe qui deacutefinit

les diffeacuterents champs et meacutethodes preacutesents et leurs effets Les objets forment donc le

minimum requis pour avoir un langage objet

En tant que tel cet ensemble de concepts est assez minimaliste Il existe plusieurs autres

eacuteleacutements qui sont preacutesents agrave un degreacute plus ou moins grand dans les langages agrave objets

Ceux-ci forment donc en quelque sorte la base de la programmation orienteacutee-objet

(Pierce 2002)

- Lencapsulation des donneacutees cest-agrave-dire camoufler les donneacutees dans une structure

speacutecifique (lobjet)

- Lheacuteritage qui permet de deacutefinir un objet comme eacutetant une installce speacutecifique dun

autre objet On peut appliquer le mecircme raisonnement agrave deux classes On dit alors

25

quune classe heacuterite dune classe de base Celle-ci possegravede exactement le mecircme corps

que sa classe de base mais peut rajouter ou modifier certaines proprieacuteteacutes Il sagit

dun des aspects les plus importants dans le deacuteveloppement dune hieacuterarchie

- Le polymorphisme qui nous permet de creacuteer des proprieacuteteacutes qui varient en fonction

des sous-classes Par exemple une classe Nombre pourrait avoir une meacutethode daddishy

tion alors que ses sous-classes Entiegraveres et Reacuteelles redeacutefiniraient cette meacutethode en

fonction de leur impleacutementation speacutecifique Cela nous permet par la suite de prendre

deux nombres et de les additionner peu importe quil sagisse de reacuteels ou dentiers

222 Diffeacuterence avec la programmation baseacutee-objet

Les diffeacuterentes prioriteacutes eacutenumeacutereacutees ci-haut sont les eacuteleacutements de base qui nous permettent

de creacuteer une hieacuterarchie de qualiteacute Il sagit de la raison principale justifiant de ne pas

utiliser Asymptote pour creacuteer la hieacuterarchie En effet celui-ci est un langage baseacute-objet

La diffeacuterence principale est quun langage baseacute-objet ne neacutecessite pas limpleacutementation

de lheacuteritage ou du polymorphisme (Saunders 1989) Asymptote de son cocircteacute possegravede un

heacuteritage de structure minimal mais pas de polymorphisme Cette diffeacuterence est cruciale

car cet eacuteleacutement est neacutecessaire pour la creacuteation dune hieacuterarchie dans des contraintes

acceptables

En effet une chose importante est dajouter des objets dans les diagrammes Par

exemple supposons que nous avons une classe Conteneur Celui-ci doit pouvoir conteshy

nir des Cercles des Carreacutes des Triangles etc Sil fallait eacutecrire une fonction pour

ajouter chacune des formes le travail deviendrait eacutenormeacutement complexe et impossible

agrave eacutetendre pour lusager final Avec le polymorphisme il suffit deacutecrire une fonction qui

permet dajouter une Forme quelconque

23 Meacutethode pour la conceptualisation dune hieacuterarchie

Nous deacutecrirons ici la meacutethode que nous avons utiliseacute Il sagit de DMT (pour Dbj ect

Modeling Technique)

26

231 Origine de la meacutethode

Cette meacutethode fut deacuteveloppeacutee principalement par James Rumbaugh (mais avec laide de

plusieurs personnes) (Rumbaugh et al 1991) en 1991 Celui-ci est principalement connu

comme eacutetant un des auteurs de la norme UML qui est devenu le scheacutema de modeacutelisation

objet standard et utiliseacute par tous les programmeurs objets (Group 1999) Il est agrave noter

que cette meacutethode est une meacutethode danalyse complegravete pour toute la dureacutee de vie du

logiciel Nous naurons par contre besoin que de la partie analyse de cette meacutethode

232 Les diffeacuterentes eacutetapes de conceptualisation

La premiegravere partie de cette meacutethode a deacutejagrave eacuteteacute effectueacutee implicitement lorsque nous

avons rechercheacute nos diagrammes relatifs du domaine Habituellement il est suggeacutereacute

deacutecrire un texte reacutesumant lensemble du domaine mais dans notre cas il est plus

approprieacute de reacutesumer notre domaine avec des diagrammes Par la suite il faut prendre

le temps de faire ressortir les diffeacuterentes classes dobjets qui font parties du domaine et

prendre le temps de bien les deacutefini~middot On eacuteliminera les classes vagues ou redondantes par

la suite

La prochaine eacutetape consiste agrave deacutefinir les diffeacuterentes associations entre les classes Par

exemple une classe Employeacute et une classe Compagnie seraient lieacutees par lassociation

travaille pour Par la suite on identifie les attributs (ou les champs) des diffeacuterentes

classes en eacutevitant les attributs dimpleacutementation Finalement on raffine le modegravele en

ajoutant lheacuteritage des classes Cela permet de simplifier significativement la hieacuterarchie

Cela fournit une hieacuterarchie complegravete de notre domaine Par contre rien ne deacutemontre

quelle est correcte Afin de la veacuterifier il suffit danalyser les diffeacuterents cas typiques de

notre problegraveme regarder le reacutesultat obtenu et relever toute erreur Dans notre cas il

sagit de coder (seulement en terme de la hieacuterarchie) les diffeacuterents diagrammes et veacuterifier

si nous consideacuterons le tout satisfaisant Par la suite nous pourrons reacuteiteacuterer le mecircme

proceacutedeacute jusquagrave obtenir satisfaction Nous serons ainsi assureacutes davoir une hieacuterarchie

27

adapteacutee agrave notre domaine et complegravete

24 Deacuteveloppement de la hieacuterarchie

Maintenant que nous avons une meacutethodologie correcte nous pouvons creacuteer notre hieacutershy

archie Le fait de sassurer de sa compleacutetude nous permettra de ne pas rencontrer de

problegravemes complexes lors de la phase dimpleacutementation du logiciel

241 Extraction des diffeacuterents concepts

Les concepts du domaine (qui se ramegravenent agrave des classes) se divisent en plusieurs cateacuteshy

gories Une des principales est le domaine des formes Une forme peut ecirctre un carreacute

un cercle etc Une autre cateacutegorie importante est formeacutee des points qui peuvent ecirctre

deacutefinis de plusieurs maniegraveres diffeacuterentes Finalement une autre section importante est

formeacutee des structures de conteneurs incluant les Canvas (pour contenir des objets) et

des Drawing (pour reacutefeacuterencer des objets)

Eacutetant donneacute le nombre relativement faible de formes distinctes il ne nous est pas apparu

utile de faire plusieurs cateacutegories de formes distinctes En effet une seacuteparation entre les

courbes fermeacutees et ouvertes peut nous permettre de factoriser un ou deux eacuteleacutements de

code sans toutefois ecirctre significatif ou reacuteellement utile (eacutetant donneacute quil nexiste pas

vraiment de forme standard deacutefinie par une courbe ouverte)

242 Eacuteleacutements particuliers

Plusieurs eacuteleacutements particuliers se sont reacuteveacuteleacutes complexes agrave modeacuteliser dans notre hieacuterarshy

chie Nous abordons ici les principales difficulteacutes rencontreacutees ainsi que les solutions pour

les reacutegler

28

Creacuteation et placement dobjets

Leacuteleacutement le plus important de notre hieacuterarchie est de pouvoir structurer les objets

que nous souhaitons positionner Nous avons donc creacuteeacute une classe Canvas Le nom est

inspireacute du mot canevas en peinture eacutetant donneacute que nous avons apposeacute des restrictions

similaires agrave ce domaine En effet nous avons deacutecideacute que lorsquun objet est placeacute dans

un canevas il ne peut ecirctre enleveacute ou modifieacute Cela nous permettra plus tard de faire

des calculs pour les points de reacutefeacuterence plus aiseacutement De plus un canevas doit pouvoir

posseacuteder des sous-canevas Pour cela il nous faut une classe geacuteneacuterale qui deacutecrit tout

eacuteleacutement pouvant ecirctre ajouteacute dans un canevas

Cela est reacutesolu avec lintroduction dune classe Shape Celle-ci repreacutesente toute forme

qui peut ecirctre dessineacutee quelle soit simple ou complexe Un Canvas est une forme afin

de sassurer de pouvoir positionner des sous-canevas Une implication particuliegravere de

notre choix est quune Shape ne possegravede pas de position Il sagit dune forme abstraite

qui peut ecirctre positionneacutee agrave un certain endroit Cela implique aussi quil est possible de

prendre une Shape et de la placer agrave plusieurs end_roits distincts Lorsquelle est ajouteacutee

dans un Canvas une Shape est copieacutee ce qui empecircche toute modification subseacutequente

de la forme

Objets multiples

Lorsquil sagit de creacuteer des diagrammes freacutequemment il est tregraves probable que plusieurs

eacuteleacutements soient similaires Par exemple si nous creacuteons un arbre avec des cercles comme

sommets il sagit toujours en quelque sorte du mecircme cercle De plus si nous creacuteons

un sous-canevas et que nous le positionnons agrave plusieurs endroits certaines formes deshy

viennent automatiquement deacutedoubleacutes Il devient donc primordial pour nous de pouvoir

reacuteutiliser un eacuteleacutement que nous avons deacutejagrave deacutefini afin deacuteviter la creacuteation agrave reacutepeacutetition

dobjets

Or nous avons deacutejagrave speacutecifieacute quil eacutetait possible de positionner plusieurs fois le mecircme

29

objet Cela est vrai mais il y a une limitation En effet ces objets ne peuvent pas ecirctre

reacutefeacuterenceacutes Si nous souhaitons connaicirctre un objet celui-ci doit pouvoir ecirctre distingueacute

dun autre Il nous faut donc une classe qui repreacutesente une forme agrave un endroit preacutecis

Pour cela nous avons creacuteeacute la classe Drawing Celle-ci permet de repreacutesenter une Shape

agrave un endroit bien preacutecis dans un canevas Cela fait toutefois que les eacuteleacutements dans un

sous-canevas multiple restent identiques Nous verrons bientocirct la solution agrave ce problegraveme

Points de reacutefeacuterence

Un des eacuteleacutements les plus complexes relevait du fait de fournir des points de reacutefeacuterence

En effet faire de simples chemins entre des coordonneacutees en valeurs absolues neacutetait pas

suffisant mecircme sil est possible dadditionner ses points La solution souhaiteacutee eacutetait de

permettre de deacutefinir des points de reacutefeacuterence ceux-ci pouvant ecirctre obtenus agrave partir de

lobjet lui-mecircme Par exemple un cercle pourrait retourner son point nord

Un eacuteleacutement fondamental causait problegraveme la fonction pour acceacuteder au point doit ecirctre

deacutefinie dans la forme (par exemple dans la classe Circle) Par contre une forme en

tant que telle ne possegravede pas de position speacutecifique Par conseacutequent son point nest

pas deacutefini non plus Pour cela il faudrait obtenir un Drawing Par contre un Drawing

ne peut pas posseacuteder la deacutefinition de chaque fonction daccegraves agrave un point pour chaque

forme Cela est contre-intuitif Il faut donc demander agrave la forme lorsquon appelle pour

obtenir un point de prendre le Drawing suppleacutementaire en paramegravetre Notre intention

est lorsque nous eacutecrirons un langage au-dessus de la hieacuterarchie de pouvoir reacutegler ce

problegraveme

Chemins de reacutefeacuterence

Finalement il nous reste un leacuteger problegraveme Nous pouvons maintenant faire une reacutefeacuteshy

rence agrave un objet disons a et obtenir un point speacutecifique de cet objet Par contre cela

nest pas suffisant dans un cas bien preacutecis Disons que a est dans le canevas b Ensuite b

est placeacute agrave deux reprises dans le canevas c obtenant deux Drawing diffeacuterents cl et c2

30

Nous ne pouvons pas acceacuteder agrave a car il est repreacutesenteacute seulement en fonction de b Pour

reacutegler le problegraveme il faut faire un chemin de reacutefeacuterence (disons cl b a dans le langage

final) Pour cela nous fournirons la possibiliteacute de partir dun Drawing et den obtenir

un autre (agrave condition quil sagisse dun Canvas naturellement) Cela va mettre agrave jour

la position relative de lobjet par rapport agrave un niveau de profondeur suppleacutementaire

En acceacutedant agrave cette fonction aussi souvent que neacutecessaire il est possible de reacutefeacuterencer

un objet peu importe son degreacute de profondeur reacuteel Cela nous permet donc de faire

des liens complexes entre nimporte quel objet (voire mecircme des objets de profondeur

diffeacuterentes)

31

CHAPITRE III

EacuteLEacuteMENTS GRAPHIQUES

Dans ce chapitre nous deacutefinissons les eacuteleacutements graphiques requis pour faire des dessins

informatiques dont les courbes de Beacutezier ainsi que les splines cubiques Les proprieacuteteacutes

importantes de ces courbes sont deacutemontreacutees De plus une preuve est fournie de la

possibiliteacute dapproximer adeacutequatement un cercle avec des splines cubiques Finalement

nous discuterons du fonctionnement des diffeacuterentes solutions informatiques en terme de

structure telles que PDF et Asymptote

Courbes et segments en informatique

Naturellement les eacuteleacutements les plus importants dans des dessins informatiques sont les

segments et les courbes Pour des besoins de simpliciteacute nous essaierons de les inteacutegrer

dans la mecircme deacutefinition en traitant les segments comme un cas particulier des courbes

Nous donnons agrave cette courbe geacuteneacuterale le nom de chemin

Le premier problegraveme lorsque nous voulons faire des courbes en informatique est la

meacutethode pour les repreacutesenter Lecirctre humain peut tracer une infiniteacute de courbes disshy

tinctes sans avoir besoin de la deacutecrire avec preacutecision Par contre lorsquon entre dans le

domaine de linformatique il faut non seulement ecirctre capable den faire une description

mais celle-ci doit ecirctre la plus petite possible

Une des meacutethodes de repreacutesentation est sous la forme de pixels (JI et Kelley 2007)

Cette meacutethode implique de repreacutesenter un plan continu par un ensemble de points disshy

32

crets appeleacutes pixels Cela permet de repreacutesenter plusieurs formes de dessins extrecircmement

complexes et est utiliseacute dans certains logiciels dimages

Une autre meacutethode est la meacutethode vectorielle Cest la plus populaire Au lieu de

repreacutesenter directement le dessin tel quil apparaicirct on fournit une description du dessin

agrave partir de quelques concepts tregraves simples (points segments et cercles par exemple)

Lorsque lutilisateur souhaite voir le dessin un logiciel traduit la description en pixels

pour leacutecran

La derniegravere meacutethode possegravede plusieurs avantages La description dun dessin est souvent

beaucoup plus compacte que si on deacutecrit le dessin pixel par pixel De plus la description

conserve la preacutecision du dessin peu importe la reacutesolution agrave laquelle il est preacutesenteacute Par

exemple si nous prenons un ensemble de pixels et quon lagrandit plusieurs fois il est

tregraves probable que nous ayons perdu beaucoup dinformations Il nous faut par contre

veacuterifier la puissance reacuteelle dune telle meacutethode Nous devons donc introduire une des

structures utiliseacutees pour la description vectorielle

32 Courbes de Beacutezier

Une courbe de Beacutezier est un concept relativement simple deacuteveloppeacute indeacutependamment

par Paul de Casteljau et Pierre Beacutezier entre 1959 et 1962 Ces deux personnes avaient

pour objectif de creacuteer des repreacutesentations par ordinateur de voitures pour les compagnies

Citroen et Renault respectivement (Jr et Kelley 2007)

321 Deacutefinition

Soit Po Pl P2 Pn E 1R2 un ensemble de points dans un plan carteacutesien typique

Ceux-ci sont appeleacutes des points de controcircle Soit t E IR et 0 lt t 1 La courbe de

Beacutezier de degreacute n des points Po agrave Pn est deacutefinie par la formule suivante

B t - n ( n

) 1 - t n-ttt

pPohmiddotPn ( ) - ~ i ( ) t (31) t=O

33

Le chemin est deacutefini pour les valeurs entre 0 et 1 de t Cette formule peut sembler

leacutegegraverement arbitraire et complexe pour une forme supposeacutement simple Une seconde

deacutefinition reacutecursive cette fois-ci simplifie beaucoup la formule

322 Deacutefinition alternative

Bp =p (32)

BpOPl Pn(t) = (1 - t)BpOPl Pn-l (t) + tBplhPn (33)

Cette deacutefinition alternative se ramegravene agrave dire quune courbe de Beacutezier est une intershy

polation lineacuteaire entre deux courbes de Beacutezier de degreacute infeacuterieur La deacutemonstration se

ramegravene agrave quelques manipulations bien simples et est laisseacutee en exercice au lecteur

Nous pouvons analyser les formules pour diffeacuterents degreacutes Par exemple une formule de

Beacutezier de degreacute 1 nest quune droite

BPoPl (t) = (1 - t)Po + tP] (34)

Alors quune courbe de degreacute 2 se ramegravene agrave une parabole

(35)

Finalement une courbe de Beacutezier cubique (de degreacute 3) fournit une courbe relativement

complexe qui commence agrave Po et termine agrave P3

--- ---

34

P P

0

P

Po - ____ _ - - P2

Po - - - - - - - - - - - - - - - - - - - - - - - shyPo P2 P3

(a) lineacuteaire (b) quadratique (c) cubique

Figure 31 Courbes de Beacutezier lineacuteaire quadratique et cubique

Eacutevidemment il ny a pas davantages significatifs agrave utiliser une courbe de Beacutezier lineacuteaire

Les courbes de Beacutezier quadratique sont quant agrave elles utiliseacutees lors de la geacuteneacuteration

de police TrueType (Apple Computer Inc 1996) Finalement les courbes de Beacutezier

cubiques sont utiliseacutees dans Postscript (Adobe Systems Incorporated 2010a) et dans la

plupart des produits Jb1EX tel que Metafont (Knuth 1986) Ces logiciels utilisent en

fait une combinaison de courbes de Beacutezier appeleacutees splines que nous verrons dans la

section suivante

323 Proprieacuteteacutes dune courbe de Beacutezier

En regardant les diffeacuterentes courbes nous pouvons aiseacutement voir quelques proprieacuteteacutes

Entre autres il y a interpolation des points de deacutepart et de fin Cela peut se deacutemontrer

aiseacutement en calculant B(uuml) et B(l) qui donne respectivement Po et Pn De plus les

autres points ne semblent pas ecirctre interpoleacutes Il sagit ici dun cas geacuteneacuteral (les points

peuvent ecirctre interpoleacutes sils sont colineacuteaires)

Une autre proprieacuteteacute inteacuteressante des courbes de Beacutezier est son invariance par transforshy

mation affine Cela se ramegravene au theacuteoregraveme suivant Dans le cadre de ce theacuteoregraveme nous

devrons transformer les coordonneacutees des points de controcircles des courbes de Beacutezier en

coordonneacutees projectives homogegravenes Ceci se ramegravene agrave rajouter un axe agrave chacun de nos

points dont la valeur sera toujours 1

35

Theacuteoregraveme dinvariance affine

Soit BpOPl Pn(t) une courbe de Beacutezier Soit M une matrice 3 par 3 repTeacutesentant une

transformation affine Alors on a que la courbe est invari(Lnte par lapplication de M

cest-agrave-dire MBpoPlPn(t) = BMPolvIPl lvIPn(t)

Pour le prouver il suffit de deacutevelopper la formule

NI BpoP1Pn (t) = M t (~) (1 - tt-ieuml Pi 1=0

= tM(~) (1- tt-itiPi 1=0

= t (~) (1- t)n-iti(MPi ) 1=0

Ce theacuteoregraveme implique que pour transformer une courbe de 8eacutezier il suffit dappliquer la

transformation agrave chaque point de controcircle et de calculer une nouvelle courbe de 8eacutezier

Donc une courbe de Beacutezier est entiegraverement deacutefinie par ses points de controcircle Cela fait

quelle est tregraves pratique en informatique car elle ne requiert que peu despace pour la

deacutefinir (ie seulement les n + 1 points de controcircle) De plus il est tregraves simple de geacuteneacuterer

une courbe de Beacutezier car il suffit dutiliser la formule pour autant de valeurs de t que

nous avons besoin de preacutecision dans la courbe En conservant linformation avec cette

meacutethode nous conservons une courbe sans aucune perte dinformation Cela signifie que

nous pouvons agrandir la reacutesolution de la courbe autant que nous le souhaitons et il

sagira toujours dune belle ligne courbe Cette proprieacuteteacute est extrecircmement inteacuteressante

en informatique

36

324 Deacutesavantages des courbes de Beacutezier

Les courbes de Beacutezier sont utiliseacutees dans beaucoup de domaines Par contre elles

possegravedent quelques deacutesavantages peu inteacuteressants Le plus important est probablement

labsence de controcircle local Cela sexprime par le fait que degraves que lon souhaite modifier

une courbe de Beacutezier agrave un endroit particulier tout le reste de la courbe est modifieacute au

passage Cela se deacutemontre par le fait que si 0 lt t lt 1 on a alors que

Cela implique que chaque point de controcircle de la courbe de Beacutezier a une influence (aussi

minime soit-elle) sur lensemble de la courbe Le reacutesultat est que les courbes de Beacutezier

seules sont difficiles agrave utiliser et longues agrave eacutevaluer si on utilise trop de points de controcircle

33 Splines cubiques

La solution agrave ce problegraveme est lutilisation de splines cubiques Lideacutee de base dune spline

est que si une seule courbe cause trop de problegravemes il est probablement mieux dutiliser

plusieurs courbes mais qui fonctionnent seulement dans un domaine plus petit Plus

formellement une spline cubique (aussi appeleacute B-spline cubique) est composeacute de

- un ensemble de valeurs ti pour 0 S i S m - 1 ougrave m repreacutesente le nombre de noeuds

On appelle aussi ces valeurs le vecteur de noeud Les t forment une suite monotone

croissante et sont tous des valeurs reacuteelles entre 0 et l

- L + l points de controcircle

- Une valeur entiegravere n qui repreacutesente lordre de la fonction B-sp1ine Une spline doit

respecter la condition n S m - 2

On deacutefinit une spline par la fonction suivante

37

m-n-2

S(t) = L Pibin(t) tE [01] i=O

ou dans le cas speacutecifique dune spline de degreacute 3

3

S(t) = L Pi bi 3(t) tE [01] i=O

Les bin repreacutesentent les bases de la B-spline (pour Basis Spline) Celles-ci sont deacutefinies

par la fonction reacutecursive suivante

bjoU) ~ sinon

Il sagit dune eacutequation complexe et nous ne nous y attarderons pas trop Quelques

deacutetails sont inteacuteressants agrave noter Entre autre il est inteacuteressant de constater que si lon

utilise n + 1 points de controcircle et que les noeuds sont n noeuds valant zeacutero et n noeuds

valant 1 le B-spline deacutegeacutenegravere en une courbe de Beurozier Il sagit donc dune extension

des capaciteacutes des courbes de Beacutezier

Le problegraveme principal eacutevoqueacute par les courbes de Beacutezier est que lutilisateur lors de

la creacuteation dune courbe manquait de controcircle local Il serait donc inteacuteressant que les

B-splines nous permettent de reacutegler ce problegraveme Lorsquon regarde la deacutefinition de la

base bi on remarque que celle-ci se ramegravene toujours au cas de base qui peut ecirctre aou

1 selon que nous sommes dans un domaine restreint ou non Comme il sagit du seul

facteur de Pi il est naturel daffirmer que le controcirc~e est plus localiseacute quavant Dautres

proprieacuteteacutes inteacuteressantes sont

- Pour tout t la somme de tout les bi(t) est 1

38

C5 C4 C3 -----~---- ----~-----

-----~---- ----~-----

Cg ClO Cn

Figure 32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier

- Un B-spline dordre m sera neacutecessairement Cm - 2 cest-agrave-dire quelle possegravede 2 ordres

de deacuteriyeacutees continues pour son domaine de deacutefinition _

- Tout comme les courbes de Beacutezier les B-splines sont invariants par transformation

affine On peut donc appliquer une courbe en appliquant tout simplement la transshy

formation sur les points de controcircle et en calculant le nouveau B-spline

34 Le cas dun cercle

Avec les outils que nous posseacutedons nous ne sommes pas en capaciteacute de dessiner un

cercle exact Cela nest pas grave eacutetant donneacute que nous pouvons tout de mecircme tenter de

lapproximer Pour ce faire nous utiliserons une spline cubique posseacutedant quatre points

(est nord ouest et sud respectivement) Chaque courbe de Beacute7i~r sera donc identique

aux autres agrave une rotation pregraves Il reste donc agrave deacuteterminer les points de controcircle agrave utiliser

Pour cela prenons le premier quadrant du cercle Nous passons du point Cl (10) agrave

C4 (0 1) Il nous faut deacuteterminer deux points de controcircle C2 et C3 Pour commencer

39

nous pouvons supposer de maniegravere tout agrave fait arbitraire que C2 se situe sur la tangente

de Cl et C3 sur la tangente de C4 Cela nous donne donc le scheacutema suivant

C4 C3 ----- ----~-----

1

1

1

1

TC2 1

1

1

i

Figure 33 Quart de cercle approximeacute par une courbe de Beacutezier

On a donc C2(1 k) et C3(k 1) ougrave k est une variable agrave deacuteterminer Afin de la deacuteterminer

nous devons donner une information suppleacutementaire Par exemple nous pouvons preacuteshy

supposer que le point agrave 45 degreacutes C(O5) doit ecirctre eacutevalueacute exactement par la courbe de

Beacutezier cest-agrave-dire C(O5) = (1 1) Nous obtenons donc la restriction

C(uuml5) = (1 - t)3CI + 3(1 - t)2tC2 + 3(1 - t)t2C3 + t3C4

1 3 3 1 = -Cl + -C2 + -C3 + -C4

8 8 8 8

ce qui nous permet dobtenir leacutegaliteacute

v2v2 1 3 3 1 (- -) = -Cl + -C2 + -C3 + -C4 (37)22 8 8 8 8

ce qui nous fournit apregraves substitution des valeurs des points deux fois leacutequation

v2 1 3k-=-+- (38)2 2 8

40

ce qui nous fournit apregraves reacutesolution

k = ~(J2 - 1) 0552285

Cela nous fournit donc une courbe de Beacutezier qui approxime notre cercle Il reste agrave voir

la preacutecision de cette approximation

Pour ce faire nous devrons comparer larc de cercle que nous venons de creacuteer agrave un cercle

reacuteel Afin dy arriver nous consideacutererons chaque valeur de notre arc comme eacutetant un

vecteur dont nous devrons calculer la longueur Plus cette longueur est proche de 1

plus nous avons une estimation reacutealiste Nous calculons donc

Par la suite une analyse des deacuteriveacutees nous permet de conclure que cette fonction dans

lintervalle t E [01] possegravede des m(iximu_ms agrave _t = 0 agrave tr~is reprises _(au deacutebut et agrave la

fin eacutetant donneacute la proprieacuteteacute naturelle des courbes de Beacutezier celle au milieu est due agrave

notre contrainte) Finalement elle possegravede deux (2) minimums agrave t = 0211 et t = 0789

et lerreur avec un cercle standard est de 0000273 Une telle variation sur un cercle

de rayon 1 est minime Il sagit dune variation maximale infeacuterieure agrave 003 Cela

signifie donc pour un cercle posseacutedant un rayon de 4000 pixels il y aura une variation

maximale de 12 pixels ce qui est indeacutetectable pour la taille du cercle Cela en fait une

bonne estimation pour cette section du cercle Nous pouvons naturellement suivre le

mecircme raisonnement pour les sections restantes

Il est aussi agrave noter que notre estimation nest pas la meilleure Notre choix de demander

leacutegaliteacute agrave 45 degreacutes est arbitraire et toute lerreur se retrouve dans le cocircteacute neacutegatif De

meilleures estimations ont eacuteteacute effectueacutees (Riskus 2006) avec des reacutesultats amenant une

preacutecision jusquagrave 25 plus grande (Lancaster 2005)

41

0--------------r--7T-----------------rl 08 (1

-000005

-000010

-000015

-000020

-000025

Figure 34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence

35 Structures informatiques dans les solutions deacutejagrave existantes

Maintenant que nous savons comment fonctionne les diffeacuterents modes de repreacutesentation

des dessins en informatique il faut analyser plus en deacutetail comment fonctionne les

logiciels dont nous allons nous servir En effet il nous faudra adapter nos structures de

bas niveau agrave celles disponibles dans les langages dont nous nous servirons Pour cela

nous allons analyser deux parties distinctes un format de fichier (PDF) ainsi quun

42

langage intermeacutediaire (Asymptote)

351 Postscript et PDF

En premier lieu il convient de comprendre comment fonctionne le format de fichier final

que nous utiliserons ]1EX permet de geacuteneacuterer plusieurs formats de fichier diffeacuterents

Pendant longtemps le plus populaire aura eacuteteacute Postscript creacuteeacute par Adobe Systems Cela

eacutetait principalement lieacute aux imprimantes qui fonctionnaient directement avec ce format

De nos jours le format PDF est beaucoup plus populaire bien quayant une base tregraves

proche de celle de Postscript

Postscript a eacuteteacute inventeacute par John Warnock et Charles Geschke en 1982 (Adobe Systems

Incorporated 1994) Lorsquil a eacuteteacute creacuteeacute il servait agrave faire la description de pages pour

impression Il se distingue comme eacutetant un langage de programmation complet mais

rarement utiliseacute directement En effet Postscript est difficile agrave utiliser car il utilise la

notation polonaise inverse Par exemple on exprime lappel de fonction j(a b c) de la

faccedilon suivante

abc f

Cette meacutethode rend lanalyse dun programme extrecircmement rapide et convivial pour

le logiciel qui linterpregravete car celui-ci est directement lieacute agrave la structure dune pile

dexeacutecution Par contre lanalyse dun tel programme par un humain est complexe

La plupart du temps Postscript eacutetait donc utiliseacute comme un langage de description

final pour un fichier

Il existait deux types de structures utiliseacutes en Postscript pour mettre des dessins sur une

page Le premier eacutetait lajout de texte Cela est intrinsegravequement lieacute agrave la description des

polices qui deacutepasse le cadre de ce meacutemoire Par contre pour faire un dessin quelconque

le format utilisait les chemins qui sont deacutecrits soit par des segments soit par des courbes

de Beacutezier cubiques On note donc le deacutesavantage de lutilisation dune courbe de Beacutezier

soit labsence de controcircle local

43

Quant agrave lui PDF a eacuteteacute creacuteeacute en 1993 (Adobe Systems Incorporated 2010b) Agrave travers les

gains de populariteacute le format PDF est devenue en 2008 un standard ISO (International

Organization for Standardization 2008) Cela en fait donc un format de document

standard extrecircmement inteacuteressant Alors que Postscript a eacuteteacute creacuteeacute pour des documents

qui devaient ecirctre imprimeacutes PDF a eacuteteacute conccedilu pour la description de documents plus

dynamiques cest-agrave-dire la possibiliteacute dajouter des eacuteleacutements multimeacutedias au document

Aussi il est possible de deacutecrire chaque page indeacutependamment des suivantes En effet

comme Postscript deacutecrivait des documents dimpression il est normal de connaicirctre la

page de deacutepart avant dimprimer la suivante En PDF chaque page est totalement

indeacutependante du reste du document

Pour la description deacuteleacutements graphiques les structures de base sont essentiellement

les mecircmes que Postscript Quelques eacuteleacutements comme la transparence cest-agrave-dire quun

eacuteleacutement cacheacute par un autre eacuteleacutement contribue au reacutesultat final ont eacuteteacute ajouteacutes mais les

eacuteleacutements graphiques de bas niveau sont identiques

352 Asymptote

Comme nous lavons dit preacuteceacutedemment tout ramener agrave des courbes de Beacutezier creacutee un

problegraveme de controcircle local des courbes Il faut donc utiliser une meacutethode pour donner

du controcircle agrave lutilisateur Pour cela nous utiliserons Asymptote Les structures de

bas niveau de Asymptote sont identiques agrave celles de PDF eacutetant donneacute quil convertit

directement les chemins Asymptote en chemins PDF Par contre Asymptote impleacutemente

un algorithme (Bowman 2007) originellement deacuteveloppeacute par Donald Knuth qui permet

de deacutecrire un chemin en fonction des points par lesquels il passe Asymptote utilise donc

des splines cubiques (qui ne sont pas neacutecessairement des B-splines toutefois)

Cet algorithme est complexe et en dehors du cadre de ce meacutemoire mais peut ecirctre

reacutesumeacute comme eacutetant un algorithme de choix des points de controcircle En effet une courbe

de Beacutezier cubique est deacutefinie par 4 points Le premier et le dernier sont interpoleacutes de

maniegravere exacte Ce que lalgorithme fait est quil prend un ensemble de points qui

44

seront tous interpoleacutes disons Pl P2 P3 P4 Ensuite pour chaque paire conseacutecutive de

points (donc (Pl P2 ) (P2 P3) et (P3 P4)) il geacuteneacuterera une courbe de Beacutezier cubique

La partie la plus importante de lalgorithme consiste agrave prendre toutes les informations

fournies par lutilisateur (les points de controcircle ainsi que des options qui deacutefinissent la

courbe comme les deacuteriveacutees agrave certains endroits ou des informations comme la tension qui

laisse lalgorithme calculer lui-mecircme les deacuteriveacutees agrave partir dun indice reacuteel simple) afin de

calculer pour chaque courbe de Beacutezier cubique les deux points de controcircle manquants

En laissant agrave lutilisateur le pouvoir de deacutecider seulement les points ougrave la courbe passe

le travail est simplifieacute mais permet tout de mecircme de terminer avec un ensemble de

courbes de Beacutezier

CHAPITRE IV

THEacuteORIE DES LANGAGES INFORMATIQUES

La creacuteation dun langage de programmation nest pas une mince tacircche Il faut donc

sassurer de le construire sur des bases theacuteoriques solides Nous preacutesenterons ici les

eacuteleacutements theacuteoriques importants de la theacuteorie des langages ainsi que leurs applications

dans le domaine de la compilation Nous preacutesenterons aussi loutil SableCC que nous

avons utiliseacute dans le cadre de notre langage ainsi quun bref exposeacute sur les langages

reacuteflexifs

La theacuteorie des langages est un sujet vaste et extrecircmement complexe Un meacutemoire comshy

plet pourrait ecirctre reacutedigeacute seulement sur les aspects theacuteoriques des automates reacuteguliers

Afin de compresser tout ce contenu dans un seul chapitre les eacuteleacutements seront mentionneacutes

sans preuve Nous recommandons toutefois au lecteur curieux et assidu de consulter les

reacutefeacuterences de ce chapitre pour des preuves et une couverture plus complegravete du sujet

41 Theacuteorie des langages et automates

Dans un premier temps nous devrons deacuteterminer ce quest formellement un langage

Par la suite nous analyserons une structure de donneacutees qui est intimement lieacutee agrave ce

sujet les automates

46

411 Les eacuteleacutements de base dun langage (Aho Sethi et Ullman 1986)

Alphabet et lettre

Un alphabet est un ensemble (au sens matheacutematique du mot) de symboles appeleacutes

lettres Un alphabet est fini et non-vide Par exemple lalphabet latin standard ainsi

que lensemble O I constituent des alphabets

Mot

Un mot dun alphabet A peut ecirctre un des trois cas suivants

- le mot vide euro formeacute daucune lettre

- une lettre de lalphabet A

- Toute suite finie de lettres aOal an ougrave chaque ai fait partie de lalphabet A

Il est agrave noter que les deux premiers sont en fait des cas speacutecifiques du dernier bien quils

sont souvent seacutepareacutes pour raison de clarteacute Dans le dernier cas on dit que les caractegraveres

sont lieacutes par lopeacuteration de concateacutenation

Langage

Un langage au sens le plus geacuteneacuteral possible est un ensemble de mots Celui-ci peut ecirctre

fini ou infini La plupart des exemples inteacuteressants (un langage de programmation par

exemple) est un langage infini En effet il existe une infiniteacute de programmes diffeacuterents

tout comme il existe une infiniteacute de nombres binaires

412 Exp esson reacutegnli r

Les expressions reacuteguliegraveres forment un outil de travail extrecircmement important en inshy

formatique De nombreux outils ainsi que certains langages (grep perl ) leurs sont

consacreacutes

47

On peut reacutesumer les expressions reacuteguliegraveres comme eacutetant une meacutethode afin de deacutecrire

un langage infini par une expression fini On utilisera dans la construction certaines

opeacuterations qui nous donneront des proprieacuteteacutes inteacuteressantes pour le langage final Tout

mot qui peut ecirctre construit agrave partir de ces regravegles fait automatiquement partie du langage

Constantes

Leacuteleacutement de base dune expression reacuteguliegravere est une constante Celle-ci est deacutefinie agrave

partir dune lettre de lalphabet et deacutefinit un seul mot la constante elle-mecircme Par

conseacutequent lexpression reacuteguliegravere a de lalphabet ab repreacutesente le langage a Il est

agrave noter que nous pouvons aussi utiliser le mot vide comme une constante repreacutesentant

lensemble vide

Concateacutenation

Lopeacuteration de concateacutenation est une opeacuteration sur les mots qui permet de creacuteer des

expressions reacuteguliegraveres plus longues agrave partir de deux expressions reacuteguliegraveres valides Le

reacutesultat de lexpression reacuteguliegravere A concateacuteneacutee agrave B est donc nimporte quel mot de A

concateacuteneacute agrave nimporte quel mot de B Par exemple ab est une expression reacuteguliegravere qui

repreacutesente un langage agrave un mot ab

Union

Lunion des expressions reacuteguliegraveres est une opeacuteration qui correspond agrave lunion ensemshy

bliste Lors de lunion de A et de B (deacutefini comme (AIB)) nous pouvons choisir nimshy

porte quel eacuteleacutement de A ou de B comme un mot valide Par exemple (alb)b repreacutesente

le langage contenant deux mots ab bb

Fermeture de Kleene

La fermeture de Kleene est une opeacuteration beaucoup plus inteacuteressante Celle-ci utilise

une expression reacuteguliegravere A Le reacutesultat de la fermeture noteacute A est la concateacutenation

48

dun nombre fini deacuteleacutements de A avec possibiliteacute de reacutepeacutetitions Par exemples pour

ab toute chaicircne de a finie possiblement de longueur zeacutero suivie dun b fait partie du

langage Lexpression reacuteguliegravere (alb) repreacutesente nimporte quelle chaicircne finie de a ou de

b

Les langages que nous pouvons geacuteneacuterer avec des expressions reacuteguliegraveres sont assez riches

bien quinsuffisants pour geacuteneacuterer un langage de programmation (Aho Sethi et Ullman

1986)

413 Automates

Avant de pouvoir expliquer agrave quoi servent les expressions reacuteguliegraveres nous devons discuter

des automates une structure dune importance cruciale en informatique

Automate fini

yn automate fini (Ullman Hopcroft et Motwani 1~79) est un quintuplet composeacute de

cinq eacuteleacutements

- Un ensemble fini deacutetats E

- Un alphabet fini A

- Un ou plusieurs eacutetats de deacutepart d (selon que lautomate est deacuteterministe ou non)

- Un ensemble deacutetats dit finaux F

- Une relation de transition T ccedil E x A x E Cela deacutefinit une maniegravere de passer dun

eacutetat agrave un autre lors de lapparition dun symbole speacutecifique

On repreacutesente en geacuteneacuteral un automate par un graphe avec des flegraveches nommeacutees Les

flegraveches repreacutesentent la relation de transition alors que les sommets repreacutesentent les

eacutetats dans E On repreacutesente un eacutetat initial par une flegraveche qui ne part pas dun eacutetat

Finalement on repreacutesente un eacutetat final par un cercle double Par exemple lautomate

suivant accepte lensemble des mots qui sont composeacutes dune seacuterie de a (possiblement

nulle) suivi dun b Donc les mots b ab et aab serait des mots valides par rapport agrave

49

cet automate

Figure 41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b

Lensemble T peut prendre plusieurs formes en fonction du deacuteterminisme de lautomate

comme nous allons maintenant le voir

Automate non-deacuteterministe

Un automate non-deacuteterministe peut posseacuteder plusieurs eacutetats de deacutepart De plus son

ensemble de transitions T est quelconque Il peut donc exister pour un eacutetat e et un

symbole a plusieurs eacutetats e tels que (e a e) E T

Un automate non-deacuteterministe peut ecirctre vu comme une forme de graphe dans lequel on

peut se promener en utilisant certaines transitions La suite des symboles des transitions

que nous utilisons forment un mot Lensemble des mots obtenus par une suite de transhy

sitions allant dun eacutetat initial agrave un eacutetat final constitue le langage de lautomate Dans

un automate non-deacuteterministe il peut neacuteanmoins exister pour le mecircme mot plusieurs

chemins diffeacuterents deacutebutant dans un eacutetat initial Il est important de noter quun mot

est accepteacute degraves quun de ces chemins se termine dans un eacutetat final

Automate deacuteterministe

Un automate non-deacuteterministe nous permet de creacuteer des langages mais le fait davoir

plus dun choix pour le mecircme symbole peut sembler inquieacutetant surtout lorsquil sagit

dinformatique Nous pouvons donc deacutefinir un automate deacuteterministe plus simple Celuishy

50

ci possegravede un seul eacutetat de deacutepart et son ensemble de transitions T assure que pour

chaque symbole il ny a quun seul eacutetat suivant possible Il ny a donc pour chaque mot

quun seul chemin possible agrave partir de leacutetat initial Plus formellement lautomate sera

deacuteterministe si pour tout e E E et a E A il y a un seul e E E tel que (e a e) ET

Le reacuteflexe naturel serait de croire quen enlevant le non-deacuteterminisme dun automate

celui-ci devient beaucoup moins puissant permettant de repreacutesenter beaucoup moins

de langages Or il nen est rien Il a eacuteteacute prouveacute (malheureusement en trop de pages

pour ce meacutemoire) que nimporte quel automate non-deacuteterministe peut ecirctre rameneacute agrave

un automate deacuteterministe quitte agrave voir le nombre deacutetats de lautomate augmenter

exponentiellement Nous pouvons donc toujours creacuteer un automate non-deacuteterministe et

laisser la tacircche agrave un ordinateur de creacuteer un automate deacuteterministe agrave partir de celui-ci

(Ullman Hopcroft et Motwani 1979)

Exeacutecution dun automate et contraintes temporelles

La meacutethode dexeacutecution dun automate deacuteterministe est assez simple Nous lui fournisshy

sons un mot dune certaine longueur disons n Nous deacutemarrons de leacutetat initial et chaque

lettre repreacutesente un choix agrave faire dans lautomate Comme lautomate est deacuteterministe

il ny a quune possibiliteacute agrave explorer Si nous ne pouvons plus avancer avant la fin du

mot celui-ci ne fait pas partie du langage de lautomate Si nous parvenons agrave avancer

jusquau bout et que nous ne sommes pas dans un eacutetat final il nen fait pas partie non

plus Par contre si leacutetat est final nous avons trouveacute un mot du langage Co me le mot

possegravede n lettres nous aurons au maximum n choix agrave faire rendant lalgorithme dapshy

partenance agrave un temps dexeacutecution lineacuteaire Un algorithme lineacuteaire est naturellement

extrecircmement inteacuteressant en informatique car nous voulons un programme qui sexeacutecute

dans un temps raisonnable

51

414 Lien entre langage reacutegulier et automate fini

Nous connaissons donc maintenant deux meacutethodes pour creacuteer un langage Les expresshy

sions reacuteguliegraveres ainsi que les automates Un automate est difficile agrave concevoir pour un

ecirctre humain mais extrecircmement rapide dutilisation par un ordinateur Une expression

reacuteguliegravere est complexe pour un ordinateur mais aiseacutee agrave concevoir par un ecirctre humain Il

nous faut donc voir si nous pouvons obtenir des proprieacuteteacutes communes agrave ces deux outils

Le lien

Il existe en effet un lien qui unit ces deux structures Celui-ci est extrecircmement fort

lensemble des langages quil est possible de geacuteneacuterer avec des expressions reacuteguliegraveres est

exactement le mecircme ensemble que ceux qui peuvent ecirctre geacuteneacutereacutes par un automate fini

deacuteterministe Cela implique que pour chaque expression reacuteguliegravere nous pouvons troushy

ver un automate qui repreacutesente le mecircme langage Cela est vrai aussi en sens inverse

Par contre il ne sagit pas dune bijection car plusieurs expressions reacuteguliegraveres peuvent

correspondre au mecircme automate (par exemple a et aamiddot) Il existe un algorithme permetshy

tant de transformer une expression reacuteguliegravere en automate mais celui-ci est complexe et

deacutepasse le cadre de ce meacutemoire Nous pouvons toutefois mentionner que cet algorithme

est relativement lent (sexeacutecute en O(2m ) ou m est la longueur de lexpression reacuteguliegravere)

mais permet par la suite de trouver si un mot fait partie dun langage en temps lineacuteaire

(McNaughton et Yamada 1960)

Importance dun tel lien

Ce lien est un eacuteleacutement crucial dans la capaciteacute dun ordinateur agrave travailler avec des lanshy

gages de programmation En effet cela permet aux creacuteateurs de langages de deacutecrire des

mots agrave partir dexpressions reacuteguliegraveres (quils comprennent) et de laisser un programme

creacuteer des automates qui peuvent reconnaicirctre ces symboles (un if ou un for mais aussi

des variables) dans des programmes Cela permet donc de creacuteer une partie importante

dun langage quon appelle lanalyse lexicale Cela permet agrave partir de lutilisation de

52

lautomate creacuteeacute par des expressions reacuteguliegraveres de transformer un texte en une suite de

symboles plus speacutecifiques Par exemple le texte

if a 1 then true else faIse

pourrait ecirctre traduit par la suite de symboles suivants

IF VAR EQ NUM THEN BD DL ELSE BDDL FININSTR

Cette eacutetape lanalyse lexicale est cruciale agrave la suite de lanalyse dun programme Les

automates nous sont toutefois utiles non seulement pour les mots cleacutes mais aussi pour

des eacuteleacutements plus complexes comme des variables Une variable est souvent identifieacutee

comme eacutetant une lettre suivie dune suite de caractegraveres quelconques (sauf exception tel

quun espace)

Malgreacute tout il existe certains eacuteleacutements quun automate ne peut reconnaicirctre Un exemple

classique est le parentheacutesage eacutequilibreacute (une suite de parenthegraveses telle que c~aque pashy

renthegravese ouvrante est associeacute agrave une parenthegravese fermante et agrave nimporte quel moment il

nexiste pas plus de fermantes que douvrantes) Il est en effet impossible aux automates

de faire le lien entre les deux types de parenthegraveses (Ullman Hopcroft et Motwani 1979)

Pour cela il nous faudra utiliser des structures plus complexes

42 Grammaires

Ces structures sont les grammaires Il est possible de les voir comme eacutetant une forme

beaucoup plus geacuteneacuterale des expressions reacuteguliegraveres Avec cette structure nous pourrons

nous assurer quun programme est bien formeacute cest-agrave-dire creacuteer un arbre repreacutesentant

la structure dun programme un peu comme la structure dune phrase

421 Deacutefinition dune grammaire formelle

Une grammaire est constitueacutee de quatre eacuteleacutements

53

- Un ensemble fini de terminaux Ceux-ci sont des symboles repreacutesentant les lettres

dun langage Par conseacutequent on peut aussi appeler les terminaux lalphabet dune

grammaire

- Un ensemble fini de non-terminaux Habituellement repreacutesenteacute par des majuscules

(par des symboles diffeacuterents des terminaux) pour des raisons de clarteacute ceux-ci repreacuteshy

sentent des eacutetats intermeacutediaires de la grammaire

- Un non-terminal de deacutepart parmi lensemble deacutecrit plus haut

- Un ensemble de regravegles de production Celles-ci vont varier selon la cateacutegorie de langage

choisie mais de maniegravere geacuteneacuterale une regravegle de production est une paire ordonneacutee

dont chaque eacuteleacutement est composeacute dune suite de terminaux et de non-terminaux (par

exemple aB -t aAa)

Le fait de repreacutesenter une regravegle de production avec une flegraveche permet den expliciter le

rocircle transformer une suite de caractegraveres en une autre Lutilisation dune grammaire

consiste donc agrave deacutemarrer avec le non-terminal de deacutepart puis dappliquer une suite de

regravegles de production pour modifier le non-termina Lorsquon obtient un mot formeacute

uniquement de terminaux il sagit dun mot du langage repreacutesenteacute par la grammaire

Par exemple

S -gt aA

A -gt b

repreacutesente un langage contenant le seul mot ab On applique doEn effet unc un proceacutedeacute

de deacuterivation (en appliquant chaque regravegle) Par exemple une deacuterivation possible du mot

ab dans ce contexte (la seule dailleurs) est la suite suivante

S (deacutepart)

S -gt aA (application de S -gt aA)

aA -gt ab (application de A -gt b)

54

422 Hieacuterarchie de Chomsky

La deacutefinition que nOlis avons donneacutee preacuteceacutedemment dun langage est beaucoup trop

geacuteneacuterale pour nous fournir des proprieacuteteacutes inteacuteressantes Afin de deacutegager des proprieacuteteacutes

inteacuteressantes nous deacutefinissons plusieurs cateacutegories Plusieurs noms sont utiliseacutes pour

chaque cateacutegorie mais nous nous limiterons agrave utiliser ceux deacutefinis par le linguiste Noam

Chomsky (Chomsky 1956) Chacune de ces cateacutegories sera deacutecrite par les proprieacuteteacutes de

sa grammaire Il est agrave noter que nous avons neacutegligeacute certaines cateacutegories de langages qui

ne sont pas lieacutees au domaine

Langage reacutegulier

Un langage reacutegulier est eacutequivalent aux expressions reacuteguliegraveres Les regravegles de production

de la grammaire doivent ecirctre de la forme

A -) Ba

A -) a

ou

A -) aB

A -) a

avec A et B des non-terminaux et a un termina Il est agrave noter que toutes les regravegles

dune grammaire doivent ecirctre soit du premier cas soit du deuxiegraveme cas On les appelle

reacutecursives agrave gauche ou agrave droite respectivement

Langage non-contextuel

Un langage non-contextuel est un peu plus complexe quun langage reacutegulier Les regravegles

de production de la grammaire doivent ecirctre de la forme

55

A -) B

avec A un non-terminal et B une suite de terminaux et de non-terminaux Le deacutetail

le plus important est de noter que les langages non-contextuels permettent de creacuteer un

systegraveme de parenthegraveses eacutequilibreacutees En effet voici une grammaire qui accepte seulement

un parentheacutesage eacutequilibreacute

P -) pp

P -) CP)

P -)

Il est eacutevident quune grammaire reacuteguliegravere ne peut geacuteneacuterer ce genre de langage Par contre

un parentheacutesage eacutequilibreacute est extrecircmement important dans le domaine de la compilashy

tion afin dexprimer clairement les ideacutees dun programmeur et plus speacutecifiquement

permettre deacutecrire des formules matheacutematiques complexes compreacutehensibles par lOlmiddotdishy

nateur

Langage contextuel

Les langages contextuels ne sont pas utiliseacutes en geacuteneacuteral en compilation car ils sont

beaucoup plus lents Les regravegles de production de la grammaire doivent ecirctre de la forme

ABC -) ADC

ougrave B est un non-terminal A et C sont des non-terminaux ou le mot vide et D est un

non-terminal (mais pas le mot vide) On voit clairement ici dougrave vient le nom de ce type

de langage B est transformeacute en fonction de ce qui est autour de lui (son contexte)

423 Utiliteacute dans les langages de programmation

La prochaine tacircche dans la creacuteation dun langage est danalyser la structure de notre

programme Pour effectuer cette tacircche nous pouvons utiliser une grammaire non-conshy

56

textuelle Agrave cette fin nous pouvons nous assurer que les eacutequations sont correctement

formeacutees que les instructions sont valides etc

Dans un autre ordre dideacutee la hieacuterarchie de Chomsky possegravede aussi des liens avec les

machines de Turing qui sont elles-mecircmes intimement lieacutees agrave la theacuteorie de la complexiteacute

(Davis Sigal et Weyuker 1994) Ce domaine est extrecircmement vaste et le lecteur pourra

trouver dans les reacutefeacuterences plusieurs excellents ouvrages pour sinitier agrave ce domaine (Dhu

et Ko 2000)

43 SableCC

Bien quil est tregraves inteacuteressant deacutetudier les algorithmes de compilation limpleacutementation

de chacun de ces algorithmes deacutepasse largement le cadre de ce meacutemoire Il nous faut

donc trouver une meacutethode afin de creacuteer notre langage de programmation Plusieurs

outils soffrent agrave nous mais notre choix sarrecirctera sur SableCC

431 Quest-ce que S~bleCC

SabieCC est ce quon appelle un compilateur de compilateurs (Gagnon 1998) Un comshy

pilateur de compilateurs est un programme qui permet agrave partir dune deacutefinition absshy

traite dun langage de programmation dobtenir un compilateur pour ce langage Plus

speacutecifiquement le programme reacutesultant nous permettra dobtenir larbre syntaxique

dun programme ce qui nous permettra de lanalyser reacutecursivement et de lexeacutecuter (ou

bien de le transformer dans un langage diffeacuterent selon le cas) Les formes abstraites que

requiert un compilateur de compilateurs sont justement les expressions reacuteguliegraveres (pour

deacutecouvrir les symboles) et les grammaires non-contextuelles (pour lanalyse syntaxique

des symboles obtenus preacuteceacutedemment)

432 Avantages de SableCC

Bien que SabieCC nest pas le compilateur de compilateurs le plus connu il possegravede

plusieurs aspects inteacuteressants Premiegraverement comparativement agrave ses compeacutetiteurs plus

57

acircgeacutes SabieCC est eacutecrit dans un paradigme orienteacute-objet Cela rend le compilateur beaushy

coup plus simple agrave utiliser De plus le logiciel geacutenegravere automatiquement un ensemble de

classes (dans un choix de plusieurs langages) qui permet de traiter aiseacutement et claishy

rement avec des concepts modernes les arbres syntaxiques reacutesultant de lanalyse du

programme

44 Langage reacuteflexif

Finalement une fois que nous avons obtenu un arbre syntaxique et que nous savons que

notre langage est bien formeacute il nous reste la reacuteflexiviteacute agrave prendre en compte En effet

nous ne voulons pas reacuteeacutecrire inutilement dans notre langage chaque fonction qui existe

deacutejagrave en Java Nous pourrons les utiliser avec un langage reacuteflexif Une autre possibiliteacute

dun langage reacuteflexif est de deacuteleacuteguer agrave SDDL la creacuteation de classes Cela permet agrave lutilishy

sateur de reacutefeacuterencer nimporte quelle classe Java sans avoir agrave changer le code de SDDL

lui-mecircme Cela serait impossible sans un langage reacuteflexif

441 Deacutefinition dun langage reacuteflexif

Un langage reacuteflexif (Sobel et Friedman 1996) est un langage qui est capable soit de

- Examiner son eacutetat cette proprieacuteteacute est appeleacutee introspection

- Modifier son eacutetat cette proprieacuteteacute est appeleacutee intercession

Lintrospection permet agrave un langage de connaicirctre entre autres les classes quil utilise

ainsi que les meacutethodes et les paramegravetres Lintercession beaucoup plus puissante pershy

mettrait par exemple cie rajouter modifier ou supprimer des classes etou meacutethodes

Pour nos besoins nous sommes naturellement inteacuteresseacutes par lintercession

442 Avantages

Lavantage le plus clair de lutilisation de la reacuteflexiviteacute est la reacuteutilisation du code En

effet toutes les fonctionnaliteacutes du langage infeacuterieur (Java dans ce cas-ci) peuvent ecirctre

58

automatiquement passeacutees au langage supeacuterieur Cela eacutevite davoir agrave reacuteeacutecrire du code

pour chaque nouvel eacuteleacutement agrave ajouter

Un autre avantage assez explicite est de permettre agrave des utilisateurs un peu plus aguerri

de lier du code des deux niveaux de langage ensemble En effet si un utilisateur creacutee

une structure de donneacutees en Java il peut toujours se servir exactement de la mecircme

classe dans le langage supeacuterieur sans avoir agrave faire la moindre modification au langage

supeacuterieur lui-mecircme Il est donc clair quun langage qui utilise la reacuteflexiviteacute peut devenir

tregraves puissant

443 Deacutesavantages

Certains deacutesavantages accompagnent aussi la reacuteflexiviteacute Un des plus importants est la

contrainte de seacutecuriteacute En effet si un utilisateur peut appeler nimporte quelle classe

Java agrave partir du langage supeacuterieur il peut tregraves aiseacutement appeler des fonctions qui cassent

le programme si un controcircle suffisamment important nest pas effectueacute par le logiciel Il

peut aussi sans causer d~s problegravem_es de seacutec~riteacute confondre un usager en provoquant

des effets de bord sur leacutetat du logiciel cest-agrave-dire modifier des proprieacuteteacutes du reste du

programme sans neacutecessairement que cela paraisse

Un autre deacutesavantage eacutevident est quun utilisateur qui souhaite utilicirc3er les fonctions du

langage infeacuterieur doit en quelque sorte connaicirctre celui-ci Cela implique donc lapprenshy

tissage dun deuxiegraveme langage ce qui en soit peut paraicirctre trop pour des utilisateurs

plus traditionnels

Lorsquon analyse froidement les avantages et les inconveacutenients on voit que les avanshy

tages sont beaucoup plus importants En effet le projet eacutetant limiteacute dans le temps et

dans le personnel il est en quelque sorte impossible de fournir des librairies de foncshy

tions suffisamment complegravetes pour les utilisateurs Se brancher sur les librairies Java

fournit automatiquement tout ce dont nous avons besoin et donne accegraves agrave une quantiteacute

innombrable de projets deacutejagrave creacuteeacutes dans ce langage

CHAPITRE V

MISE EN OEUVRE DE LA SOLUTION

Maintenant que nous avons des bases theacuteoriques solides ainsi quune hieacuterarchie bien

adapteacutee agrave nos besoins nous pouyons commencer agrave impleacutementer notre solution Cela

implique premiegraverement la creacuteation de notre hieacuterarchie objet en Java Deuxiegravemement

nous devons impleacutementer une grammaire afin de deacutecrire SDDL Finalement il faut

ajouter du code afin dimpleacutementer certaines proprieacuteteacutes voulues pour notre langage Il

est agrave noter que nous avons inclus en annexe un diagramme de notre hieacuterarchie ainsi que

la grammaire complegravete de SDDL

51 Eacuteleacutements de langage en SDDL

511 Impleacutementation de la hieacuterarchie

Limpleacutementation de la hieacuterarchie eacutetant seacutepareacutee du reste du langage il est normal de

commencer avec celle-ci eacutetant donneacute quelle repreacutesente le module le plus important de

notre projet Cela nous permet de le tester au fur et agrave mesure avant de commencer agrave

creacuteer un langage de plus haut niveau qui lutilise

Un des problegravemes les plus importants du deacuteveloppement de la hieacuterarchie fut de deacuteveshy

lopper correctement la deacutefinition et laccegraves agrave des points speacutecifiques de certains objets

Comme lideacutee eacutetait de permettre dobtenir une quantiteacute essentiellement illimiteacutee de

points diffeacuterents il fallait une meacutethode robuste et efficace

60

Notre meacutethode implique de fournir des informations par rapport au dessin englobant agrave

chaque sous-dessin Cela est requis car un objet preacutesent agrave plusieurs endroits diffeacuterents

auquel on demande un point speacutecifique se bute agrave une ambiguiumlteacute Mecircme en utilisant

seulement un Drawing qui est techniquement une instance unique dune forme il faut

faire attention En effet si on a un Drawing dun cercle qui est agrave linteacuterieur dune

ellipse par exemple nous pourrions deacutecider de placer cette ellipse agrave plusieurs endroits

Nous aurions donc le mecircme problegraveme dambiguiumlteacute du positionnement des points Afin

de remeacutedier agrave ce problegraveme nous avons fourni au Drawing sa position agrave linteacuterieur du

diagramme Lorsquil est copieacute nous navons quagrave changer linformation pour que le

positionnement soit correct

512 Grammaire

Le deacuteveloppement de la grammaire fut naturellement une section cruciale du deacutevelopshy

pement de SDDL Comme nous avions deacutejagrave deacuteveloppeacute des objectifs speacutecifiques pour la

forme du langage la creacuteation fut relativement directe Quelques eacuteleacutements importants

ont toutefois ducirc ecirctre ajouteacutes en cours de route En particulier des eacuteleacutements seacuteparateurs

ont eacuteteacute dune importance cruciale Il aurait donc pu ecirctre souhaitable de diminuer la

verbositeacute en enlevant des parenthegraveses ou des virgules mais cela cause (dans la plupart

des cas) des problegravemes au niveau de lambiguiumlteacute de la grammaire (tel que nous lavons

vu preacuteceacutedemment)

Nous avons aussi deacutecideacute de deacutecreacuteter quune expression geacuteneacuterale est une instruction Cela

peut sembler contre-intuitif car une expression (comme 2 + 2) ne semble pas ecirctre une

instruction La raison derriegravere ce changement est le dessin de chemin En effet nous

pouvons deacuteterminer un chemin (Path) comme nimporte quel autre objet Par contre

cela implique de lajouter par la suite seacutepareacutement agrave un canevas Cela semble contreshy

intuitif nous voyons souvent les liens entre les objets comme eacutetant des liens de niveau

supeacuterieur (bref faits dans le canevas principal) Pour lier a et b il semble plus logique

deacutecrire

61

a--b

que

lien = a--b

put lien in main

Afin de reacutegler ce problegraveme nous avons deacutecideacute de laisser les expressions ecirctre des insshy

tructions Cela fait que deacutefinir une ligne (comme a--b) devient automatiquement une

instruction valide Celle-ci sera traiteacutee comme un cas speacutecial afin decirctre placeacutee direcshy

tement au centre du canevas principal Cela implique aussi comme nous le verrons

plus tard de rajouter du code afin de sassurer que les expressions qui ne sont pas des

instructions soient refuseacutees par le programme

stm = exp exp sc 1 assign id assign exp sc 1 while while_kwd exp do_kwd (stms] stm end_kwd sc 1 if if_kwd exp then_kwd (stms] stm else_part end_kwd sc 1 for for_kwd id from~kwd (low_bound] exp to_kwd (up_bound] exp

do_kwd (stms] stm end_kwd sc 1 return return_kwd exp sc

Figure 51 Extrait de la grammaire de SDDL pour une instruction

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage

Plusieurs proprieacuteteacutes de SDDL ne venaient pas directement avec la grammaire Celles-ci

ont neacutecessiteacute un traitement bien particulier en fonction de la proprieacuteteacute rechercheacutee

Typage

La grammaire de SDDL indique clairement que le langage est agrave typage dynamique eacutetant

donneacute que les creacuteations de variables ne permettent pas de donner un type Le mecircme

62

pheacutenomegravene est preacutesent dans la deacutefinition des fonctions Par contre le fait de souhaiter

un typage dynamique implique lajout dune large section de code deacutedieacutee agrave la veacuterification

de type Chaque opeacuteration ne peut ecirctre appliqueacutee quagrave certains types deacuteleacutements et donc

avant deffectuer lopeacuteration il faut veacuterifier si le type est valide

Eacuteleacutements objets

Impleacutementer tous les principes dun langage orienteacute-objet est un travail de longue hashy

leine Par contre eacutetant donneacute que notre objectif eacutetait de simplifier le langage de desshy

cription final nous avons deacutecideacute de ne pas permettre la creacuteation de nouvelles classes

agrave linteacuterieur de SDDL Cela implique que nous pouvons releacuteguer la creacuteation de classes

uniquement au langage Java Cela a donc grandement faciliteacute la tacircche car nous navions

pas besoin dimpleacutementer la tregraves grande majoriteacute des concepts objets que nous laquo emshy

pruntons raquo agrave Java

Eacutelimination de la verbositeacute

Une bonne partie de leacutelimination de la verbositeacute vient de la conception mecircme du lanshy

gage En effet le fait de releacuteguer la deacutefinition des classes agrave Java ainsi que de creacuteer le

typage dynamique ont purement par choix eacutelimineacute une bonne partie de la verbositeacute

Quelques eacuteleacutements suppleacutementaires ont permis deacuteliminer un excegraves de verbositeacute On

note entre autres le fait de deacutefinir la description du diagramme sans le speacutecifier dans le

cadre dune fonction Un autre pheacutenomegravene important est davoir deacutecideacute de promouvoir

les points et certaines fonctions relieacutees agrave leacutetat de primitive naturelle du langage En

effet une addition entre un point a et b seffectue

c = a + b

au lieu de en Java

AbstractPoint c aadd(b)

63

Cela peut sembler comme un maigre gain mais lorsquappliqueacute agrave un calcul complexe

impliquant des points (par exemple le calcul dune combinaison lineacuteaire) les gains

combineacutes rendent le code extrecircmement clair

AbstractPoint c = amultiply(1030)add(bmultiply(2030))

c = (a 30 + 20 b 30)

Figure 52 Code Java et SDDL pour calculer une combinaison lineacuteaire

52 Reacutealisation en Java

Afin de reacutealiser SDDL il a bien sucircr fallu eacutecrire une grammaire mais beaucoup de code

autour sert agrave inteacutegrer la grammaire au restant des fonctionnaliteacutes de notre hieacuterarchie

Ce code fut complegravetement eacutecrit en Java et remplit plusieurs fonctions

521 Traverseacutee de larbre grammatical et exeacutecution

La grande majoriteacute du code Java suppleacutementaire eacutecrit a servi agrave permettre la traverseacutee

de larbre grammatical creacuteeacute par notre grammaire Cette traverseacutee permet en quelque

sorte lexeacutecution du code SDDL et est donc cruciale Pour la plupart il sagit dune trashy

verseacutee en profondeur relativement classique Quelques petits deacutetails retiennent toutefois

lattention

- Certains morceaux de code ne doivent pas ecirctre exeacutecuteacutes et ont donc un comportement

speacutecial Cest le cas des deacutefinitions de fonctions qui ne sont exeacutecuteacutees quagrave lappel On

meacutemorise donc en quelque sorte une partie de larbre grammatical et lors dun appel

on transfegravere le controcircle dexeacutecution agrave cette partie Eacutevidemment lors de la lecture de

la deacutefinition de la fonction il faut stocker quelques informations sur nos fonctions

dans une structure deacutefinie agrave cet effet (un Methodlnf0)

- Certaines opeacuterations ont plusieurs sens distincts qui ne peuvent ecirctre speacutecifieacutes dans la

grammaire La seacutemantique dune telle opeacuteration napparaicirct clairement quau moment

de la lecture de lopeacuteration (dans notre cas agrave lexeacutecut ion) Un exemple serait le

64

symbole daddition Bien que sa grammaire soit tregraves claire il peut sagir dune addition

de nombres mais aussi dune addition de points ou dune concateacutenation de chaicircnes

de caractegraveres Il est donc neacutecessaire agrave lexeacutecution de veacuterifier la classe de chaque objet

requis par lopeacuteration afin de trouver la bonne seacutemantique pour lopeacuteration si une

telle seacutemantique existe Si aucune nest trouveacutee on peut alors soulever une erreur

selon le meacutecanisme standard (par exemple additionner un point et une chaicircne de

caractegraveres)

- Certaines expressions grammaticalement correctes ne sont valides que sous certaines

conditions Par exemple nimporte quelle expression (exp) est accepteacutee comme eacutetant

une instruction (stm) grammaticalement valide Par exemple linstruction 2 + 2 va

ecirctre accepteacutee par la grammaire Par contre elle na pas de sens car elle naccomplit rien

du tout Il faut donc sassurer de veacuterifier dans la traverseacutee que lexeacutecution est leacutegale

Dans ce cas-ci il faut sassurer que lexpression de niveau supeacuterieur (une addition)

est valide pour ecirctre une instruction Dans un tel cas une erreur serait souleveacutee encore

selon le meacutecanisme standard

522 Deacutefinition dobjets quelconques

Une partie moins grande du code est consacreacutee agrave linteacutegration de la hieacuterarchie de SDDL

dans la deacutefinition du langage Comme nous souhaitions utiliser des classes quelconques

nous avons utiliseacute la reacuteflexiviteacute Java telle que nous le deacutecrivions plus tocirct Cela implique

de reacutecupeacuterer les noms des fonctions et des classes lors de leurs utilisations Toutes les

veacuterifications seffectuent agrave lexeacutecution Nous savons donc seulement si une classe A existe

bel et bien lorsque nous essayons de creacuteer un objet agrave partir de celle-ci De plus chaque

fonction appeleacutee sur un objet de classe A nest veacuterifieacutee que lors de son utilisation

Habituellement la solution aurait eacuteteacute de veacuterifier avant lexeacutecution lexistence de chaque

classe ainsi que les fonctions de chaque classe pour sassurer que lexeacutecution soit correcte

Dans notre cas la veacuterification agrave lexeacutecution est suffisante car les programmes sont tregraves

courts

De plus quelques contraintes ont ducirc ecirctre ajouteacutees afin de sassurer Clue seules les parties

65

Override public void caseADrawingTermCADrawingTerm node)

String className = nodegetClassName() getText()

try

thiscurrentExpressionClass ClassforName(sddlhierarchy + className)

thiscurrentExpressionValue = thiscurrentExpressionClassgetConstructor() newlnstance()

catch(NoSuchMethodException e)

throw new InterpreterException( cl ass Il + className + is ill-defined (no base constructor) nodegetClassName())

catch(Exception e)

throw new InterpreterException(unable to load + className +

Il class (maybe it does not exist) nodegetClassName())

Figure 53 Code reacuteflexif pour creacuteer une forme quelconque

requises de Java sont exposeacutees agrave lutilisateur final La restriction principale est de ne

creacuteer que des objets qui font partie du paquet sddl hierarchy Il est toutefois agrave

noter que cela nisole pas totalement le reste de Java car il est tout agrave fait possible de

creacuteer une classe qui permet dacceacuteder agrave Java complegravetement

523 Gestion des erreurs

La gestion des erreurs seffectue au travers des meacutecanismes deacutejagrave mis en place par Java

cest-agrave-dire les exceptions Une classe speacutecifique aux exceptions de linterpreacuteteur a eacuteteacute

creacuteeacutee qui permet de speacutecifier non seulement un message mais aussi un noeud bien

speacutecifique dans larbre grammatical afin didentifier lendroit ougrave lerreur a eacuteteacute deacutecouverte

66

Cela est extrecircmement utile afin de permettre agrave lutilisateur de corriger la majoriteacute de

ses erreurs

De plus une partie du code de gestion derreurs sert agrave repreacutesenter la pile dexeacutecution

En effet afin didentifier la source dun problegraveme il est important de pouvoir savoir

quelles fonctions sont impliqueacutees Nous pouvons donc identifier la ligne de chaque appel

au moment ougrave lerreur sest produite et ainsi identifier des problegravemes entre autres dans

le cas des fonctions reacutecursives

524 Structures de support

Dimportances mineures la plupart de ces structures servent agrave geacuterer lexeacutecution des

meacutethodes

- La classe Frame repreacutesente le cadre dexeacutecution dune fonction Cette classe permet

dobtenir des fonctions reacutecursives car on peut imbriquer un Frame dans un autre

- La classe Methodlnfo repreacutesente une fonction deacutefinie agrave linteacuterieur de SDDL Elle

permet de transfeacuterer lexeacutecution agrave la deacutefinition fournie par lutilisateur et regroupe

les informations geacuteneacuteralement utiles agrave la veacuterification seacutemantique (nom paramegravetres

etc)

- La classe PrimitiveMethodlnfo repreacutesente une fonction de Java accessible par la

reacuteflexiviteacute Elle fournit aussi quelques informations pour la veacuterification seacutemantique

- La classe MethodTable fournit une table pour geacuterer lensemble des fonctions afin

dacceacuteder directement agrave une fonction agrave partir de son nom

53 Accegraves agrave Postscript PDP et B-1EX

531 Postscript

Afin de reacutealiser correctement notre langage nous avions besoin dacceacuteder agrave diffeacuterentes

technologies Eacutetant donneacute que nous voulons terminer avec des dessins en format Postshy

script il devient important de pouvoir fournir aiseacutement du code dans ce format Il

67

sagit toutefois dun format relativement complexe et il devient donc long et complexe

de fournir une traduction valide pour chacun de nos diffeacuterents concepts

Le problegraveme principal de Postscript est quil possegravede un ensemble de primitives de tregraves

bas niveau En effet afin de dessiner une courbe la seule meacutethode possible est lutishy

lisation de courbes de Beacutezier avec des points de controcircle qui doivent ecirctre fournis agrave

lavance Comme nous lavons vu preacuteceacutedemment les courbes de Beacutezier sont tregraves prashy

tiques pour lordinateur mais peu pratique pour [utilisateur car la speacutecification de

points de controcircles qui ne sont pas interpoleacutes est peu intuitive De plus afin de faire

des courbes quelconques il faut les seacuteparer en plusieurs courbes de Beacutezier de tailles

infeacuterieures

Il existe des algorithmes qui permettent de prendre des courbes et de les seacuteparer en

sections adeacutequates Un de ces algorithmes est impleacutementeacute en Asymptote (Bowman

2007) Il est donc naturel afin deacuteviter davoir agrave reacuteimpleacutementer un algorithme aussi

complexe dutiliser Asymptote pour obtenir nos courbes de faccedilon systeacutematique

532 PDF

Le format PDF possegravede lavantage dinteacutegrer plusieurs fonctions multimeacutedias telles que

les liens les videacuteos les formulaires (Adobe Systems Incorporated 2006) etc Malgreacute

tout PDF outre les quelques ajouts nommeacutes ci-haut est essentiellement similaire agrave

Postscript Eacutevidemment les nombreuses possibiliteacutes fournies par le format PDF sont

deacutesirables (inteacutegrer des videacuteos agrave des notes de cours par exemple) Il existe toutefois

de nombreux convertisseurs qui peuvent prendre un fichier Postscript et le mettre au

format PDF Par contre cette conversion ne permet pas dajouter les fonctionnaliteacutes

PDF qui nous inteacuteressent Il devient donc crucial dobtenir une meacutethode pour fournir

des images directement au format PDF Encore lagrave le fait de passer par Asymptote

nous donne une solution rapide et eacuteleacutegante car le fait de fournir du PDF est inclus

dans le logiciel En geacuteneacuterant directement du Asymptote nous pourrions donc obtenir

automatiquement le format rechercheacute

68

533 ~1lE)C

Leacuteleacutement le plus crucial du langage que nous recherchions au deacutebut eacutetait de pouvoir

utiliser du texte tel que mis en forme par UTEX dans nos diagrammes Un tel besoin

implique plusieurs problegravemes

Premiegraverement un texte UTEX est conserveacute sous la forme dune chaicircne de caractegraveres

standard Par contre apregraves avoir eacuteteacute traiteacute le reacutesultat obtenu est une boicircte contenant

le texte mis en forme La taille de cette boicircte est deacutetermineacutee lors de la mise en page

et ne peut donc pas ecirctre deacutetermineacutee directement par notre programme Or si nous ne

connaissons pas la taille exacte de notre boicircte de texte il est impossible de positionner

un texte par une position autre que son coin supeacuterieur gauche Cela est un comportement

peu inteacuteressant eacutetant donneacute que dans de nombreux graphes on place le texte au centre

dun sommet (donc par exemple le centre de la boicircte sera placeacute au centre dune ellipse)

Afin de pallier agrave ce problegraveme il faudrait demander agrave UTEX de creacuteer les boicirctes une

premiegravere fois et de nous fournir les tailles des boicirctes Par la suite il faudrait geacuteneacuterer

une page UTEX de la bonne taille avec nos dessins puis dire agrave UIEX de geacuteneacuterer les

boicirctes de textes aux endroits que nous aurons calculeacute entre temps Bien que viable

cette meacutethode implique beaucoup de code et de cas diffeacuterents (laccegraves agrave IbIEX par un

programme externe va varier dun systegraveme dexploitation agrave lautre entre autres) Eacutetant

donneacute quAsymptote fournit deacutejagrave un accegraves agrave I5IEX agrave linteacuterieur du logiciel le travail

requis pour lutilisation de I5TEX est de beaucoup diminueacute

534 Geacuteneacuteration du code Asymptote

Afin davoir une solution valide il ne reste donc pl s quagrave nnecter not e so ution agrave

Asymptote Pour le faire nous devons premiegraverement geacuteneacuterer un fichier de code Asympshy

tote valide pour par la suite le faire valider en appelant le programme de maniegravere

externe Eacutetant donneacute que le projet a eacuteteacute eacutecrit speacutecifiquement pour fournir du code

Asymptote une solution simple a eacuteteacute utiliseacutee afin deacutecrire le code le canevas principal

69

public void draw(AbstractPoint location PrintWriter out)

AbstractPoint pl locationadd(new Point (radius 00)) AbstractPoint p2 locationadd(new Point(OO radius)) AbstractPoint p3 locationadd(new Pointe-radius 00)) AbstractPoint p4 locationadd(new Point(OO -radius))

outprintln(draw( + p1so1veO + + p2solveO + + p3solveO + + p4solveO + cycle))

Figure 54 Code pour geacuteneacuterer du code Asymptote pour un cercle

sera appeleacute agrave ecirctre dessineacute qui appellera reacutecursivement chacun de ses sous-canevas

La geacuteneacuteration du code Asymptote a eacuteteacute reacuteserveacutee dans une fonction draw speacutecifique agrave

chaque forme (Shape) qui eacutecrit dans un fichier ouvert fourni en paramegravetre Un exemple

dune telle meacutethode pour la classe Circle est illustreacute agrave la figure 54

Une telle meacutethode est simple mais suffisante pour nos besoins Bien sucircr agrave long terme

une solution plus robuste devrait simposer En effet comme leacutecriture du fichier est

faite directement lors de lexeacutecution les objets doivent ecirctre appeleacutes exactement dans

lordre dont ils sont deacutependants Par exemple un segment dessineacute entre deux cercles

doit ecirctre dessineacute apregraves les cercles car sinon les reacutefeacuterences seront absentes Dans ce cas-ci

le segment va toujours ecirctre deacutefinie par la suite Par contre si nous voulions rajouter

la possibiliteacute dutiliser des extensions dAsymptote cela impliquerait de les eacutecrire au

deacutebut du fichier Il est impossible de le faire avec cette solution

Une solution plus robuste serait dutiliser un outil lieacute agrave SabieCC qui est ObjectMacro

(Gagnon 2009) Cette extension nous permet de simplifier la geacuteneacuteration de code et

deacutecrire agrave des endroits arbitraires dans un fichier agrave laide de macros et de programmation

objet Cela nous permettrait aussi deacutetendre la geacuteneacuteration de code agrave plusieurs formats

diffeacuterents par exemple geacuteneacuterer directement du code PDF au lieu de geacuteneacuterer du code

70

Asymptote

61

CHAPITRE VI

REacuteALISATION DES DIAGRAMMES EN SDDL

Maintenant que nous avons notre programme complet et fonctionnel il faut veacuterifier son

efficaciteacute Nous proceacutedons en deux temps Premiegraverement il faut revenir agrave nos dessins

de base et les coder avec notre logiciel Par la suite il faut aussi les analyser en fonction

des diffeacuterents facteurs cruciaux que nous avons eacutenumeacutereacutes dans les chapitres preacuteceacutedents

Nous pourrons donc agrave partir de cela conclure si le logiciel savegravere efficace pour nos

besoins ou si certains problegravemes lempecircchent de fonctionner adeacutequatement

Naturellement nous avons pris le temps dappliquer cette analyse agrave chacun des dessins

dans notre base de diagrammes du domaine Par manque despace nous nanalyserons

dans ce chapitre que trois dessins Une attention particuliegravere a eacuteteacute porteacutee au choix de

ces dessins afin de repreacutesenter un eacuteventail assez large des capaciteacutes du logiciel et des

diffeacuterents eacuteleacutements cruciaux agrave obtenir dans la description dun diagramme Tous les

diagrammes sont disponibles en annexe avec code sans analyse deacutetailleacutee toutefois

Analyse du code des diagrammes existants

Pour faire notre analyse nous devons premiegraverement obtenir chaque dessin Dans ce cas

nous utiliserons un diagramme tireacute du domaine de la compilation Cela nous fournit un

graphe relativement standard avec un niveau de complexiteacute inteacuteressant sans toutefois

ecirctre trop complexe Par la suite nOlis analyserons un diagramme repreacutesentant une strucshy

ture de tableau Cela montre la capaciteacute du logiciel de travailler avec des structures de

72

donneacutees geacuteneacuterales Finalement nous effectuerons lanalyse dun diagramme de Venn qui

nest a priori pas supporteacute par le logiciel afin de voir la complexiteacute dun diagramme

totalement geacuteneacuteral et qui sort des conventions preacute-eacutetablies par le logiciel

611 Rappel des objectifs cruciaux agrave observer

Naturellement afin de faire une analyse rationnelle de notre solution il faut se remeacuteshy

morer les diffeacuterents objectifs que nous nous eacutetions fixeacutes Les plus importants eacutetaient les

suivants

- Inteacutegration avec Jb1EX Eacutetant donneacute le design de notre solution ce point est naturelshy

lement reacutealiseacute dans tous les diagrammes

- Description de structures Il nous faut pouvoir deacutecrire une structure de maniegravere aiseacutee

Le fait decirctre aiseacute est naturellement subjectif mais nous pouvons ramener le tout au

fait quil soit plus simple de deacutecrire dans notre logiciel Wle structure que dutiliser les

primitives de base du langage Par exemple il est plus aiseacute de deacutecrire une structure

en parlant de boicirctes et de liens quen parlant de lignes et de courbes

- Hieacuterarchie solide et extensible Nous ne testerons pas lextensibiliteacute de la solution car

elle a deacutejagrave eacuteteacute deacutemontreacutee Toutefois les diffeacuterents codes nous permettront danalyser

agrave quel point nous utilisons la hieacuterarchie que nous avons construite et agrave quel point elle

est reacuteellement pratique

Nous avions aussi dautres objectifs de moindre importance

- Gestion des erreurs Il nest pas possible avec du code compleacuteteacute de tester la gestion des

erreurs Lauteur peut toutefois garantir que sans la gestion des erreurs une grande

quantiteacute de temps aurait eacuteteacute perdu dans la reacutedaction du code des diagrammes et ce

malgreacute la connaissance profonde du langage sous-jacent

- Langage fluide et clair Cela peut ecirctre testeacute par le lecteur en regardant le code Si

une analyse rapide lui permet de comprendre le sens du code alors celui-ci est clair

Naturellement lauteur ne peut effectuer cette analyse par lui-mecircme Bien que nous

ne puissions en faire une analyse scientifique en inspectant le code reacutesultant nous

73

sommes confiants que la syntaxe que nous avons choisie est claire et permet dexprimer

clairement les concepts sous-jacents au langage

- Qualiteacute de la documentation et courbe dapprentissage Il sagit ici dun autre eacuteleacutement

que nous pouvons difficilement aborder par nous-mecircmes Cela ne sera pas pris en

compte dans notre analyse

Selon ces diffeacuterents facteurs nous voyons que nous devrons surtout nous concentrer sur

la structure geacuteneacuterale du code ainsi que sur sa complexiteacute Le code doit ecirctre facile agrave

lire tout en permettant de compacter un maximum dinformation dans un minimum

despace

612 Diagramme de compilation

Notre premier dessin est tireacute dun livre de compilation Il sagit dun automate assez

standard et repreacutesente donc un bon diagramme moyen afin de voir les capaciteacutes de

notre logiciel

Figure 61 Diagramme dautomate de compilation

Quelques points importants sont agrave noter dans ce dessin Premiegraverement on note la

creacuteation dune structure sous-jacente (composeacutee dune ellipse et deux cercles) Par la

74

circlel Circle with [radius = 100] circle2 Circ le with [radius = 120] ellipse Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (1000 500) in main d3 put form at (1000 -500) in main put Text with [text $N(p_l)$] at (1000 1000) in main put Text with [text $N(p_2)$] at (1000 500) in main put Text with [text dotsJ at (100000) in main put Text with [text I$N(p_n)$J at (1000 -500) in main

put Text with [text = $s_O$J at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt(coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt(coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt(coord of anglePoint(1800) in maind3circle)

Figure 62 Code pour le diagramme dautomate

suite cette forme est appliqueacutee agrave plusieurs reprises dans le dessin Cela deacutemontre que

dans ce cas-ci il est possible de creacuteer et dutiliser des structures dun certain degreacute de

complexiteacute

On note aussi lutilisation des variables pour reacutecupeacuterer les dessins afin de pouvoir les

reacutefeacuterencer plus tard Cette eacutetape est aussi simple que lassignation agrave une variable Par

la suite on peut noter les flegraveches qui sont traceacutees agrave partir de points deacutefinis agrave partir de

certains cercles La structure mecircme est extrecircmement explicite dans ce cas et rend la

compreacutehension du dessin tregraves simple On reacutecupegravere aussi finalement les points formeacutes agrave

un certain angle dun cercle

75

La complexiteacute du diagramme est beaucoup plus simple quelle ne le serait avec des

primitives de base En effet les seuls dessins explicites que nous devons effectuer par

points sont les flegraveches De plus ces flegraveches sont relativement simples puisque nous navons

rien agrave speacutecifier pour le bout de flegraveche seulement les extreacutemiteacutes Pour le reste les formes

sont soient deacutefinies agrave partir de notre hieacuterarchie (comme les cercles ou les ellipses) ou

bien par un collage de formes plus simples (comme pour la forme form) Les points sont

obtenus par des accegraves structureacutes et fournissent donc des valeurs exactes rendant ces

opeacuterations extrecircmement rapides agrave eacutecrire pour lusager

On note toutefois quil existe certains eacuteleacutements dans le code qui auraient pu ecirctre simshy

plifieacutes afin de rendre le code encore plus compact En effet nous remarquons la preacutesence

de beaucoup de valeurs explicites alors quil aurait eacuteteacute possible de les remplacer par des

variables afin de rendre le tout plus clair

Un eacuteleacutement qui aurait pu amener une touche de simplification aurait eacuteteacute dutiliser des

listes ou des boucles afin dinseacuterer plus aiseacutement les objets Par exemple la structure

complexe aurait pu ecirctre ajouteacutee plusieurs fois par une boucle for avec des positions

calculeacutees en fonction de lindex Nous sommes toutefois davis que malgreacute lameacutelioration

possible que cela fournit au code il est peu probable que les utilisateurs finaux prennent

le temps de faire ce genre de modification et utiliseront fort probablement plus des

positions relatives avec une seacuterie dappels sauf si le nombre dobjets agrave positionner

devenait grand (par exemple une dizaine dobjets)

En geacuteneacuteral nous pouvons toutefois consideacuterer que ce diagramme est simplifieacute de beaushy

coup par lutilisation de notre solution La grande part du code est explicite et la strucshy

ture est tregraves simple agrave observer en regardant uniquement le code Mecircme si tout nest pas

parfait il y a clairement avantage agrave utiliser le logiciel pour coder cet automate

613 Diagramme de tableau

Notre second dessin est tireacute dun livre sur les structures de donneacutees Il repreacutesente

leacutevolution dune structure de donneacutee simple (un tableau) agrave travers certaines modifishy

76

cations

a ab 1 0 2 8 (lime

1 -10

3 7

iuml

Figure 63 Diagramme de tableau

Un des points les plus inteacuteressants de ce dessin est lutilisation dune fonction Elle place

une forme dans un canevas agrave plusieurs endroits speacutecifiques en fonction dune position de

deacutepart et dun vecteur de translation Cela nous permet de placer une forme identique

(un carreacute) plusieurs fois de suite ce qui nous donne limpression quil sagit en reacutealiteacute

dun tableau

Un autre point qui est tregraves important dans ce dessin est que les nombreux carreacutes sont

en fait tous des instances du mecircme deacutefini au deacutebut Cela permet de modifier lensemble

des carreacutes aiseacutement en ne modifiant que les proprieacuteteacutes de celui de base Pour le reste du

dessin il sagit surtout dun ensemble de flegraveches et de textes positionneacutes agrave des endroits

speacutecifiques

En analysant le code on voit une ameacutelioration claire provoqueacutee par le fait dutilishy

ser une fonction pour placer les carreacutes Cela nous permet de simplifier de beaucoup

les appels et les reacutepeacutetitions Nous pouvons toutefois noter que quelques ameacuteliorations

suppleacutementaires pourraient ecirctre apporteacutees En effet une classe aurait pu ecirctre eacutecrite en

Java pour repreacutesenter un tableau agrave lhorizontale ou agrave la verticale Cela aurait pu simshy

plifier significativement le code du dessin en combinant dans la structure le texte et

les carreacutes utiliseacutes pour repreacutesenter le tableau lui-mecircme De plus les flegraveches auraient pu

ecirctre deacutetermineacutees agrave partir de points obtenus du tableau lui-mecircme (par exemple le coin

supeacuterieur droit ou supeacuterieur gauche) auxquels nous aurions ajouteacute un vecentierteur de

deacuteplacement

77

fun dropMany(f n s v c) for i from 1 to n do

put f at (s + (i - 1) v) in c end

square = Square with [length = 200] changeVec = (00 -200) dropMany (square 4 (00 00) changeVec main)

dropMany(square 3 (500 00) changeVec main) dropMany(square 1 (1000 00) changeVec main)

dropMany (square 1 (1500 00) changeVec main) put Text with [text=O] at (00 00) in main

put Text with [text=l] at (00 -200) in main put Text with [text=3] at (00 -400) in main

put Text with [text=7] at (00 -600) in main put Text with [text=bf a] at (500200) in main put Text with [text=2] at (500 00) in main

put Text with [text=4] at (500 -200) in main put Text with [text=7] at (500 -400) in main

put Text with [text=7] at 0000 00) in main put Text with [text=bf $a-b-+$] at 0500 200) in main

put Text with [text=8] at 0500 00) in main put Text with [text=none] at (2000 00) in main

020 100)-gt(380 100) (620 100)-gt(880 100)

(1120 100)-gt0380100) 0620 100)-gt0880100)

Figure 64 Code pour le diagramme de tableau

Avec ces changements le code aurait pu ecirctre beaucoup plus compact Bien que cette

option soit reacutealisable nous ne lavons pas impleacutementeacutee car il eacutetait important de limiter

ce quun usager peut creacuteer sans lutilisation de Java Cela est ducirc au fait que notre objectif

est que seulles utilisateurs experts se servent de Java afin dameacuteliorer le logiciel Le code

est tout de mecircme significativement meilleur que de placer tout agrave la main ce qui nous

permet de conclure agrave lefficaciteacute de notre logiciel dans le cas dune structure geacuteneacuterale

78

614 Diagramme de Venn

Notre dernier dessin est une structure qui ressemble beaucoup plus agrave un dessin geacuteneacuteral

cest-agrave-dire un diagramme de Venn La forme dun tel diagramme fait quil est extrecircmeshy

ment complexe deacutecrire une classe qui permet de dessiner automatiquement ce type de

structure et quil vaut mieux creacuteer les formes une par une comme on le ferait agrave la main

Cela nous permettra danalyser si les choses simples agrave dessiner agrave la main demeurent

facile agrave reacutealiser avec notre logiciel

A

Figure 65 Diagramme de Venn

Ce dessin ne possegravede pas beaucoup de grands points dinteacuterecirct En effet la structure ne

peut pas vraiment ecirctre geacuteneacutereacutee automatiquement par un algorithme alors elle est entreacutee

manuellement On remarque tout de mecircme lutilisation de plusieurs sous-canevas afin

de simplifier le placement des objets qui sont agrave linteacuterieur dautres

Naturellement eacutetant donneacute que la structure doit ecirctre deacutecrite manuellement le code

nest pas plus court que lutilisation de primitives de base Par contre cela est comshy

penseacute par un niveau de clarteacute supeacuterieur eacutetant donneacute lutilisation des canevas afin de

regrouper les eacuteleacutements dans des ensembles respectifs Cfla permet de positionner tous

les eacuteleacutements en valeurs relatives au lieu dabsolues ce qui simplifie de beaucoup le travail

de positionnement

De plus le fait de pouvoir stocker les eacuteleacutements dans des variables nous permet de les

identifier par diffeacuterents noms significatifs ce que des primitives de base comme celles

79

circle = Circle with [radius = 100] bigcircle = Circ le with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvas1 put circle at 050 150) in canvas1 put Text with [text = H] at 050 150) in canvas1 put circle at (-150 150) in canvas1 put Text with [text J] at (-150 150) in canvas1 put Text with [text = B] at (00 -150) in canvas1

put bigcircle in canvas2 put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = F] at 050 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = E] ac (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvas1 at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = A] at (00 -300) in main put bigellipse in main

Figure 66 Code du diagramme de Venn

de PDF ne nous permet pas de faiTe Nous pouvons donc en conclure que mecircme pour

les structures difficiles agrave repreacutesenter notre logiciel fournit tout de mecircme un nombre

significatif davantages

Preacutesentation du produit final

Une fois que nous avons pu confirmer que notre logiciel eacutetait efficace il ne restait plus

quagrave le faire connaicirctre Nous preacutesentons donc ici un reacutesumeacute des efforts qui ont eacuteteacute

effectueacutes afin damener le logiciel agrave la connaissance de la communauteacute gIEX

62

80

621 Statistiques et documentation

En premier lieu avant de pouvoir preacutesenter notre solution il nous fallait la documenter

correctement En effet leffort de deacuteveloppement nous aura permis de deacutevelopper un

produit de tregraves grande taille La taille totale du travail se limite agrave environ 10 megs mais

cela implique plus de 6300 lignes de code deacuteveloppeacutees speacutecifiquement pour le projet

(cela incluant les commentaires mais excluant tout le code geacuteneacutereacute par SableCC qui est

tregraves exhaustif) Avec une taille aussi significative il est tout simplement impensable de

sattendre agrave ce quun utilisateur analyse le code afin de trouver ce qui va reacutepondre agrave ses

besoins

Pour cela nous avons pris le temps de reacutediger une documentation interne Elle consiste agrave

documenter chaque classe de notre hieacuterarchie ainsi que chaque fonction disponibles Cela

fournit des renseignements complets pour quelquun qui cherche un eacuteleacutement speacutecifique

du langage

622 Preacutesentation

Par la suite nous avons reacutedigeacute une preacutesentation pour la confeacuterence TUG 2010 que nous

avons preacutesenteacutee le 28 juin 2010 agrave San Francisco devant des membres tregraves influents de

la communauteacute JbTEX dont Donald Knuth le creacuteateur original de TEX La confeacuterence

nous a permis de nous mettre au pouls des besoins de la communauteacute et de linteacuterecirct

quils portent agrave un tel projet La reacuteponse se voulait enthousiaste particuliegraverement de

la part du preacutesentateur dAsymptote John Bowman La confeacuterence est disponible sur

le site de River Valley (Bourgeois 2010) (malheureusement sans videacuteo eacutetant donneacute un

problegraveme dopeacutemt ur)

Bien quil sagisse dun eacuteleacutement tregraves important dans la preacutesentation dun projet une

confeacuterence ne rejoint pas beaucoup de monde Pour combler ce besoin nous avons aussi

reacutedigeacute un article pour la revue TUGBoat (Bourgeois et Villemaire 2010a) qui est la

revue principale de la communauteacute JbTEX Nous avons inclus larticle en annexe Cela

81

nous a permis de rejoindre un public beaucoup plus grand quune simple preacutesentation

devant public

623 Site web

Finalement afin de faciliter la distribution de notre logiciel nous avons deacuteveloppeacute un site

web (Bourgeois et Villemaire 2uuml1uumlb) pour accompagner la preacutesentation et permettre le

teacuteleacutechargement Le site contient aussi toute notre documentation ainsi que les contenus

des preacutesentations et articles que nous avons mentionneacutes plus haut Nous avons aussi pris

le temps de fournir quelques exemples suppleacutementaires afin de montrer lattrait direct

de SDDL

63 Conclusion de notre analyse

Nous concluons que notre solution est efficace et quelle respecte agrave diffeacuterents niveaux

les critegraveres que nous nous eacutetions fixeacutes au deacutepart Il sagit dune hieacuterarchie dobjets facile

et extensible accompagneacutee dune syntaxe claire et fluide Avec lajout de la gestion des

erreurs et sa capaciteacute agrave deacutecrire plusieurs formes de structures notre logiciel permet de

simplifier la repreacutesentation des diagrammes classiques du domaine Nous en venons donc

agrave la conclusion que notre solution respecte les diffeacuterents critegraveres et nous pouvons donc

consideacuterer notre solution comme eacutetant valide

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CONCLUSIOK

La creacuteation de diagrammes structureacutes comme nous avons pu le constater tout au long

de ce meacutemoire est un sujet tregraves complexe Bien quil puisse de prime abord necirctre vu

que comme la capaciteacute de faire des petits dessins simples nous remarquons rapidement

que les deacutecrire tels que nous les voyons est beaucoup plus difficile quil y parait

Entre autres nous avons pu constater que les diagrammes sont penseacutes de maniegravere

extrecircmement abstraites En effet dans un arbre nous ne voyons pas une seacuterie de somshy

mets relieacutes par des points mais bel et bien un arbre seulement Cette capaciteacute agrave abstraire

la forme du contenu est extrecircmement pratique pour un ecirctre humain mais pas tregraves utile

pour un ordinateur Il est extrecircmement difficile dessayer de saffranchir du besoin de

speacutecifier la forme lorsquon veut creacuteer un diagramme

Il en est de mecircme avec IbTEX duquel nous nous sommes inspireacute Bien que le logiciel

puisse faire la forme de maniegravere adeacutequate dans plusieurs cas ces derniers savegraverent tregraves

speacutecifiques et plus souvent quautrement la possibiliteacute dobtenir un niveau accru de

controcircle sur la forme est souhaitable Dautre part la question du positionnement dun

texte scientifique dans une page a eacuteteacute abondamment eacutetudieacute (entre autre par la creacuteation

de TEX) alors que le bon positionnement dun diagramme la eacuteteacute beaucoup moins Il

est donc probleacutematique de se deacutebarrasser de cet eacuteleacutement de forme dans nimporte quel

logiciel de creacuteation de diagrammes

Cela nous amegravene donc agrave la question naturelle de savoir si notre logiciel savegravere une solushy

tion valide agrave notre probleacutematique initiale En effet bien que notre analyse deacutemontre que

la creacuteation de dessins devient plus simple nous ne pouvons affirmer que nous eacutecrivons

ce que nous pensons du diagramme

- -

84

Or comme la question est de veacuterifier la validiteacute de notre solution nous reacutepondrons par

laffirmative Mecircme si elle nest pas parfaite un degreacute de complexiteacute se trouve eacutelimineacute

malgreacute tout Il est tout de mecircme possible pour un utilisateur de penser en des termes plus

abstraits mecircme sil ne sagit pas du niveau dabstraction optimal De plus eacutetant donneacute

que nous avons creacuteeacute notre solution pour ecirctre extensible il est possible daugmenter le

niveau dabstraction avec la contribution de la communauteacute Bien que la solution ne soit

pas parfaite et aurait pu jouir dameacuteliorations subseacutequentes lobjectif principal eacutetait de

deacutevelopper un langage qui simplifiait la description de diagrammes structureacutes et cela

fut atteint

Naturellement eacutetant donneacute les limites de temps et de complexiteacute plusieurs pistes de

deacuteveloppements suppleacutementaires nont pu ecirctre utiliseacutees En effet nous nous sommes

limiteacutes agrave la description dune image statique Il est toutefois tregraves utile de pouvoir creacuteer

des images dynamiques La possibiliteacute de creacuteer des seacutequences de mouvements agrave linteacuterieur

dun diagramme aurait pu rendre notre outil plus inteacuteressant De plus lUl outil de

geacuteneacuteration automatique de graphes ou darbres mecircme imparfait pourrait fournir des

choix suppleacutementaires agrave un utilisateur qui souhaite obtenir un reacutesultat rapidement sans

toutefois rechercher un reacutesultat parfait

Il est toutefois bon de noter que bien quil soit long et complexe deffectuer de tels

ajouts notre logiciel a eacuteteacute penseacute en fonction de pouvoir ecirctre eacutetendu par lutilisateur Il

est donc tout agrave fait possible de pouvoir eacuteventuellement fournir de telles fonctionnaliteacutes

dans une version future du programme Dici lagrave celui-ci suffira amplement agrave la creacuteation

de diagrammes simples

APPENDICE A

PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

Nous incluons ici larticle complet que nous avons reacutedigeacute agrave propos de notre logiciel

afin den faire la promotion aupregraves de la communauteacute TEX et JbTEX Cet article qui fut

preacutesenteacute dans Tugboat la revue du TEX Users Group tel que mentionneacute preacuteceacutedemment

compleacutemente la preacutesentation qui fut effectueacutee lors de la confeacuterence du mecircme groupe

agrave San Francisco Larticle est essentiellement une introduction pragmatique pour un

utilisateur final et fournit donc plusieurs exemples inteacuteressants dutilisation tout en

deacutecrivant briegravevement les diffeacuterents concepts importants qui ont meneacutes le deacuteveloppement

de SDDL Il sagit de la version finale tel que Jarticle apparait dans le numeacutero de Tugboat

206

Drawing structured diagrams with SDDL

Mathieu Bourgeois and Roger Villemaire

Abstract

We present SOOL a Structured Diagram Description Language aimed at producing graphical representashytions for discrete mathematics and computer science SDDL allows combining graphical objects (circles lines arrows ) and lbTEX boxes to produce diashygrams representing discrete structures such as graphs trees etc with an easy-to-use domain specific lanshyguage

1 What is SDDL

SDDL Structured Diagram Description Language is a high-level domain specific language tailored for diagrams that have an inherent structure Examples of these might be trees graphs and automata Any diagram that is naturally structured can be described in SDOL However it was designed especially for data structures appearing in computer science and discrete mathematics

The main objective of this language is to realize drawings in a natural and structured way Mainly one describes a drawing in SOOL in a way that is simishylar to drawing on a blackboard For example specific shapes (like circles ellipses texts boxes) are drawn at positions that can be either absolute or relative to specific points on already placed shapes Since we aim at mathematical drawings text is handled through lbTEX

Since exhibiting the structure of a diagram is esshysential to our purpose SOOL uses an object-oriented hierarchy completely written in Java under our high-levellanguage Having shapes as objects makes structuring of diagrams easier and more intuitive since most shapes are explicitly represented by a class Furthermore extension by the end user is quite feasible since Java is a well-known language

At the lower level SDDL uses another graphishycal description language for lbTEX namely Asympshytote [1] Our tool produces Asymptote code which is finally converted to an encapsulated PostScript (eps) vector file

2 Canvas and shapes

A diagram in SDDL is defined by a main Canvas It is just like a standard painting canvas in the sense that we can place (or paint) different things on it as much as we like The things we can place inside a Canvas are Shapes Thus for creating a Hello world diagram we would use the following

put Text with [text = Hello worldJ in main

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

resulting in

Hello world

In this example Text is a Shape and it posshysesses a property text which is the JbTEX string used to render the text Each Shape defines a cershytain number of such properties

SDDL permits the definition of variables It is a dynamically typed language so variables dont have to be declared before being used Variables make it possible to reuse the same Shape at multiple locations For example

a = Circle with [radius = 100] put a at (-75 00) in main put a at (75 00) in main

m In this example we specify the location where we want our Shape to be If a location is not specified with the at clause the Shape will be placed at the point of origin of the current Canvas which is its center

One important thing to note is that once a Shape has been put in a Canvas it is immutable It cannot be modified or removed A Shape can be modified alter it has been drawn on a Canvas but this will have an effect only on later use of this object and will not modify the actual Canvas in any way a Shape always appears in a Canvas as it was at the moment it was added

When a Shape is created every property specishyfied by the user is set in the given order It is not necessary to specify ail properties at once nor to set ail of them Most of the properties have appropriate default values However sorne properties if not set will yield strange results For example a circle with no radius property set will have a defaul radius of O Usually property order is irrelevant For instance giving for an ellipse the radius along the x-axis or the y-axis first will yield exactly the saille result

a = Ellipse a = a with [xradius 200] a = a with [yradius 100] put a in main

o 3 Structuring multiple canvases

Every diagram consists of a main Canvas However we can define other Canvas objects if we wish An additional Canvas can be introduced using a typical variable assignment However when a put command is used SODL checks to see if the canvas variable is

4

207 TUGboat Volume 31 (2010) No 2

already defined If it isnt it automatically creates an empty Canvas for use

One of the main reasons to use other Canvases is to create an explicit structure in our diagram Since a Canvas is a Shape once a sub-Canvas has been created it can be placed inside the main Canvas or any other one for that matter This will ensure that everything that is defined inside our sub-Canvas will be placed at the proper position in the final diagram However any Canvas that has been defined but is not linked directly or indirectly with the main Canvas will not be drawn in the final diagram

As an example lets say we want to make a diagram that consists of two identical eyes Instead of defining two identical objects we will create one in a Canvas named form and put it at different positions inside our main Canvas Our eye consists of a circle and an ellipse both with the same center Ali we need to do for this is place them at the default position of the Canvas Finally we can take this subshyCanvas and place it at the two positions required a ~ Circle with [radius~100]

b ~ Ellipse with [xradius~200 yradius~100]

put a in form put b in form put form at (-200 00) in main put form at (200 00) in main

Paths

SDDL offers support for the description of paths The way in which they are described is similar in syntax with MetaPost and Asymptote though with sorne variations A Path shape is described by linking points together with specific linking symbols To draw a line between two points the line symbol - shycan be used To link sorne points using a curve use the curved line symbol - which will use Asymptotes positioning algorithms to create a nice-looking curve which passes through those points For the moment user control over the curve is limited to beginning and ending tangents but could be expanded

pl ~ a--b--c p2 ~ a-b-c

One of the other things you may want to do with a Path is to create an Arrow out of it SDDL defines symbols for forward backward and bidirectional arshyrows for both linear and curved lines Right now however support is restricted to forward arrows

pl ~ alt-b--c-gtd p2 alt-b-c-gtd p3 alt-gtb p4 aCgtb

Once a Path is defined it can be used as any other Shape However one of the main things that you want ta do is ta put your Path somewhere For this you can write something Iike this p ~ (00 00) -- (100 100) put p in main

This is the standard way to add Shapes ta a Canvas However since Paths are usually used to link different Shapes together in the main Canvas special handling is done in SDDL Namely a Path that is not explicitly assigned to a variable will be automatically placed in the main Canvas Therefore the Path will be directly placed in main without any explicit put expression Thus linking has its own special syntax which is more natural and convenient As an example this program (00 00) -- (100 100)

yields exactly the same result as the one just above Furthermore points can be added and multiplied by a scalar (as vectors) Using a dot to locate the origin of the drawing we can use the SDDL syntax ta create this example a ~ (100 100) a--20a-gt(300 00) a-(-10)a-(300 00)

ocirc Finally as we will now see Shapes also usually

define specifie points

5 Drawing and linking shapes together

Ta draw a diagram usually sorne shapes with a specific structure are first laid down Once that is done those objects are linked together with lines curves and arrows However these links must be made between specific positions usually derived from one or more specifie Shapes For example we may want to link the northwestern point of a rectangle with the point on a circle at an angle of 45 degrees These points could obviously be computed in advance However this becomes quite problematic when points are at peculiar angles or more complex relationships between points and Shapes are needed Worst of ail if the position or any other property of a Shape is changed ail computations will have to be redone

To ease object linking SDDL provides so-called reference points A reference point is a point that has no static value unlike points defined by a pair of two real numbers Instead a reference point is defined by its relationship to a specifie Shape appearing at a particular location As a matter of fact ail reference

Drawing structured diagrams with SDDL

208

points are defined along with the Shape because they are a natural part of it This ensures that we always have nice-looking lines at exactly the positions we want them to be

However a reference points exact position in a Canvas will depend on the Shapes position Worse since the same Shape can appears at multiple locashytions in the same Canvas we have to know which occurrence we are talking about

Therefore SDDL introcluces a feature called a Drawing A Drawing is an object that represents a Shape at a particular position Le a specifie occurshyrence of a Shape in a Canvas Whenever a Shape is put inside a Canvas a Drawing is returned and can be assigned to a variable This gives a way to uniquely identify every occurrence of a Shape apshypearing in a Canvas If the same Shape is placed twice two different Drawings will be returned each referring to a different occurrence of the same Shape

a = Circle with [radius = 100] dl = put a at (-100 00) in main d2 = put a at (100 00) in main

Once a drawing has been defined a way to access its points is needed SDDL defines a syntax for extracting points from drawings

coord of (coord) ( (args) ) in (drawing)

Here one specifies the kind of point to use (( coord) ) and any particular arguments required to obtain it The available points are Shape specifie so only those kinds of points which make sense for the particular Shape can be used For instance one can get a point at a particular angle on a Circle This is also an example where an additional argument is needed For instance anglePoint(450) will give the point at 45 degrees

Finally to reference the drawing from which we take the point its clrawing Path (a dot separatecl path) from the main diagram must be given

a = Circle with [radius = 100] dl = put a at (-75 00) in main d2 = put a at (75 00) in main (coord of anglePoint(OO) in maindl)

(coord of anglePoint(1800) in maind2)

m In this example a line between two identical circles is drawn The drawing Paths are simple here since both drawings are made directly in main Thus only main followed by the drawing name is needed

Simply giving a Drawing is not sufficient in order to make reference points non-ambiguous complete drawing Paths are required as we will now show Lets go back to the two eyes we drew previously

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

The eye was defined by a circle and an ellipse both put inside a sub-Canvas Now lets say we want to draw a line between the two circles Each of those circles is defined in the sub-Canvas and they are as a matter of fact the same Drawing a Adding a link between a and itself wauld add a link between the sub-Canvas circle and itself (what could this mean) Adding the sub-Canvas to the main Canvas twice as we did before would just duplicate this structure inside the main Canvas

But since a Canvas is a Shape we get a drawing when we put the sub-Canvas inside main We can therefore identify each inner circle by listing the drawings required to access them as shown in the following SDDL example Thus we can always link together Shapes that are deeply nested inside a subshyCanvas a = Circ le with [radius=100] b = Ellipse with [xradius=200 yradius=100] c = put a in form put b in form fl = put form at (-200 00) in main f2 = put form at (200 00) in main (coord of anglePoint(1800) in mainflc) -gt

(coord of anglePoint(OO) in mainf2c)

6 Programming constructs and lists

SDDL also defines typical programming constructs For instance Iists are created and elements accessed in a syntax similar to most other dynamic languages Since the content of a list is a general Java Dbject you can create a list of objects that are not of the same type Thus an assignment like l = [20 (00 00) [] a--b]

is perfectly legal even if not typically very useful A more typical use of Iists would be list = [(00 00) (100 100)] 1= list[O] 12 = list [1]

1--12

Lists are nice but to use them properly adeshyquate programming canstructs are needed such as for and while loops SODL defines those permitting us to draw arrays of Shapes or riAfine points through a simple list

The ability to use loops significantly simplifies many diagrams in computer science In this example we first define a Iist of points Afterward using a for loop we link those points into a linear Path a = [(100 100) (200 100)

(200 200) (100 200)] for i from 0 to 2 do

209 TUGboat Volume 31 (2010) No 2

a[i]--a[H1)

end

Alternatively we coulcl get the same result using the following while loop i = 0 hile i 1= 3 do

a [il --a [i+1] i = i + 1

end

7 Functions

SDDL also permits the creation of functiolli inside the code Those must be written before the diagram description A SDDL function is defined with the keyword fun The list of arguments does not need to be typed only named The return type (if it exists) does not need to be specified either To cali the function in the resulting code a typical C-like cali is used fun dropManyCs i v n c)

for j from 1 to n do put s at i + jv in c

end

circle = Circ le vith [radius = 50] dropManyCcircle COO 00)

C50 00) 100 main)

(rtttt3JJJ) In this case we define a function that drops

many instances of a Shape s at different positions on a Canvas c The positions of the Shape are detershymined by an initial point i and a translation vector v Finally the number of Shapes placed is also given as a parameter n Each Shape is then placed at the initial point translated by the translation vector a certain number of times This permits us to create many circles along one line

One important point is the parameter for the Canvas in which we place the Shapes However we pass main as our parameter The reason for this is that SDDL does not possess global variables A function can only access its parameters and variables that have been defined inside the function Thus trying to place something in main From inside a funcshytion will yield an errer message saying the variable main is unknown

8 Primitives

SDDL as mentioned before is written in Java One of the nice features of Java is its libraries Many classes have been written for any number of different tasks and the number of functions and algorithms implemented is astonishing To rewrite libraries that are already defined in Java or to link them one by

one in SDDL seemed pointless It is much nicer to directly use those functions since theyre already there

Since Java is a reftexive language in the sense that the program knows about itself and can modify itself at will functions can be dynamically accessed at runtime We already use this feature to simplify the definition of the SDDL interpreter the interpreter doesnt have to know every possible type of Shape in order to work Using these same mechanisms permits loading classes at runtime and gives the user the power to cali From inside SDDL any Java function

This is done through so-called primitives which are defined using the keyword primitive followed by the name of the function as it will appear in SDDL Following that two strings are given one for the package in which the function is defined and one for the name of the function as it was defined in Java Any primitive declaration must be made prior to any function definition

Lets look at an example One of the main things a diagram description language would require is sorne basic mathematics and geometry libraries Java possesses a nice java lang math package which we would like to use especially the sin and cos funcshytions For this we will need to define two primitives primitive static sin javalangMath sin primitive static cos javalangMath cos

Once they are defined they can be called just like any other SDDL functions In this case we will use those functions to place circles around an invisible circle for i from 1 to 6 do

put Circle vith [radius = 50] at C200 cos(i 314 30) 200 sin(i 314 30raquo

in main end

00 o 0 00

9 A concrete example

Now that we have ail our tools lets use SDDL to describe a simple diagram of an automaton This is the complete code along with the resulting image circlel Circle vith [radius = 100] circle2 Circle vith [radius = 120] ellipse Ellipse vith [xradius = 500

yradius = 200] circle = put circlel at (-300 00) in form put circlel at C300 00) in form put circle2 at (300 00) in form

Drawing structured diagrams with SDDL

210

put ellipse in form

dl = put form at (1000 1000) in main d2 = put form at (1000 500) in main d3 = put form at (1000 -500) in main put Text with [text=$N(p_1)$]

at (1000 1000) in main put Text with [text=$N(p_2)$]

at (1000 500) in main put Text with [text=dots]

at (100000) in main put Text with [text=$N(p_n)$]

at (1000 -500) in main

put Text with [text = $s_O$] at (00 200) in main

d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle) (coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle) (coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

10 Modifying the hierarchy by adding shapes

Using what has been described above most diagrams can be created However many simplifications can be made and sorne domains may find it relevant to add classes specifie to their trade SDDL eases the modification of the Java hierarchy underneath the language by using reftexivity Any user who respects sorne basic guidelines will be able to have its class work automatica11y in SDDL without any specifie linking required

To do this every class must possess a certain number of properties Those properties are defined through setters and getters For instance for the

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

radius of a circle these are called setRadius and getRadius Any property that follows this rule will be accessible

Furthermore an empty constructor must also be defined that sets as much as possible default values for a11 properties of the defined Shape There are also sorne small functions to be defined like the draw and obtainPath functions Any reference points must also be defined with a function to obtain them

As an example lets say we would like to add a class to represent a cloud A cloud will have a number of spikes and a size The class definition (without function definition) that we would require would be the following

public class Cloud extends Shape double size int numberOfSpikes public Cloud() public void setSize(double size) public double getSize() public void setNumberOfSpikes(int n) public int getNumberOfSpikes() public void draw(AbstractPoint a

PrintWriter w) public Path obtainPath()

11 Future additions and availability

SDDL is available now at httpwwwinfo2uqam cal -villemaire_rReChereacuteheSDDL It is funcshytional though not by any means complete Many additional Shapes couid be added (in particular tree and graph classes) and options could be added to existing classes Development of the application conshytinues for the time being and a more thorough version will be made available

References

[1] John C Bowman and Andy Hammerlindl Asymptote A vector graphies language TUGboat The Communications of the TEX Users Group 29288-294 2008

o Mathieu Bourgeois Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada bourgeois dot mathieu dot 2 (at)

courrier dot uqam dot ca

o Roger Villemaire Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada villemaire dot roger (at) uqam dot ca httpintrainfouqamca

personnelsMembersvillemaire_r

APPENDICE B

PREacuteSENTATION DE LA GRAMMAIRE DE SDDL

Nous preacutesentons ici le contenu entier de la grammaire de SDDL tel que reacutealiseacute avec

SableCC Tous les eacuteleacutements du langage sont lagrave agrave lexception de la reacuteflexiviteacute dont les

deacutetails de code sont situeacutes dans la partie Java de notre projet

Package sddlsyntax

Helpers

any [O Oxffff]

tab 9 li 10 cr = 13

upper [ A 2 ]

lower [ a z]

digit [ 0 9]

name char = upper 1 lower 1 digit -

string_char = [[32 126] - ]

= J bulldot

not star = [any-] not_star_not_slash = [not_star - l]

Tokens

92

put_kwd = put at_kwd = at in_kwd = in fit_kwd = fit around_kwd = around if_kwd = if

while_kwd = while true_kwd = true false_kwd = false then_kwd = then else_kwd = else for_kwd = for from_kwd = from end_kwd = end to kwd to by_kwd = by do_kwd = do with_kwd = with and_kwd = and or_kwd = or fun_kwd = fun return_kwd = return primitive_kwd = primitive call_kwd = call static_kwd = static coord_kwd = coord of _kwd = of get_kwd = get

scaled_kwd = scaled slanted_kwd = slanted rotated_kwd = rotated translated_kwd = translated

straight_line_kwd = -- curved_line_kwd = - straight_fwd_arrow_kwd = -gt curved_fwd_arrow_kwd = -gt straight_bwd_arrow_kwd = (- curved_bwd_arrow_kwd = (- straight_bidir_arrow_kwd = (-gt curved_bidir_arrow_kwd = (-gt

93

plus = + minus = -

mult = div =

eq = == neq = = lt lt gt = gt leq lt= geq gt= not assign = =

dot = dot

l br = - r br ( l _par = ) r_par =

l cr = [ )

-r_cr = J

sc = comma =

id = lower name_char class_name = upper name_char

integer = (-) digit+ real = (-) digit+ dot digit+

) ) Il J )Ilstring string_char

blank = 1 tab 1 cr 1 If 1 cr If comment not_star ( (not_star_not_slash not_star))

Ignored Tokens

blank comment

Productions

file = [primitives] primitive [functions] function [stms] stm

94

primitive =

primitive_kwd static_kwd id [class_name] string [func_name] string signature sc

signature = l_par type_list r_par

type_li st = string [additional_types] additional_type

additional_type comma string

function = fun_kwd id l_par id_list r_par l_br [stms]stm r_br

id_list =

id [additional_ids] additional_id

additional id comma id

stm = exp exp sc 1

assign id assign exp sc 1

while while_kwd exp do_kwd [stms] stm end_kwd sc Il if if_kwd exp then_kwd [stms] stm else_part end_kwd sc 1

for for_kwd id from_kwd [low_bound] exp to_kwd [up_bound] exp do_kwd [stms] stm end_kwd sc 1

return return_kwd exp sc

else_part = else_kwd [stms] stm

exp = or exp or_kwd and_exp simple and_exp

and_exp = and and_exp and_kwd line_exp 1

simple line_exp

line_exp line line_exp line_op eq_exp with_part 1

95

1

1

simple eq_exp

line_op =

straight_Iine straight_line_kwd 1

curved_line curved_Iine_kwd 1

straight_fwd_arrow straight_fwd_arrow_kwd curved_fwd_arrow curved_fwd_arrow_kwd 1

straight_bwd_arrow straight_bwd_arrow_kwd curved_bwd_arrow curved_bwd_arrow_kwd 1

straight_bidir_arrow straight_bidir_arrow_kwd curved_bidir_arrow curved_bidir_arrow_kwd

eq_exp = eq [left] cmp_exp eq [right] cmp_exp 1

neq [left] cmp_exp neq [right] cmp_exp simple cmp_exp

cmp_exp = lt [left] add_exp lt [right] add_exp 1

gt [left] add_exp gt [right] add_exp 1

leq [left] add_exp leq [right] add_exp geq [left] add_exp geq [right] add_exp simple add_exp

add_exp = add add_exp plus mul_exp 1

minus add_exp minus mul_exp simple mul_exp

mul_exp =

mult mul_exp mult left_unary_exp div mul_exp div left_unary_exp simple left_unary_exp

left_unary_exp = not not left_unary_exp get get_kwd id from_kwd left_unary_exp put put_kwd exp at_part in_kwd left_unary_exp fit fit_kwd class_Dame around_kwd left_uoary_exp coord coord_kwd of_kwd id l_par

arg_Iist r_par in_kwd left_unary_exp 1

simple right_exp

96

right_exp = calI right_exp dot id l_par arg_Iist r_par 1

index right_exp l_cr exp r_cr 1

scaled right_exp scaled_kwd l_par eq_exp r_par slanted right_exp slanted_kwd l_par

[xslant] exp comma [yslant] eq_exp r_par rotated right_exp rotated_kwd l_par eq_exp r_par 1

translated right_exp translated_kwd l_par [xtranslate] term comma [ytranslate] eq_exp r_par 1

simple term

term =

par l_par exp r_par 1

point l_par [x_value] exp comma [y_value] exp r_par 1

drawing class_name with_part 1

var id 1

int integer 1

real real 1

true true_kwd 1

false false_kwd string string 1

list l_cr arg_Iist r_cr 1

static_call id l_par arg_Iist r_par

arg_Iist = exp [additional_args] additional_arg

additional_arg comma exp

with_part = with_kwd l cr options r_cr

options = option [additional_options] additional_option

additional_option comma option

option = id assign exp

APPENDICE C

PREacuteSENTATION DE LA HIEacuteRARCHIE

Nous preacutesentons ici la description complegravete de notre hieacuterarchie objet en Java Le tout est

deacutecrit agrave laide dun diagramme UML Toutefois afin de faciliter le formatage nous avons

seacutepareacute le tout en deux sections Le premier diagramme contient les noms des classes ainsi

que leurs relations dheacuteritage Par apregraves tous les diagrammes suivants repreacutesentent le

contenu speacutecifique de chaque classe sans les relations entre classes Ceci nous permet

dobtenir une vue densemble des classes tout en obtenant des deacutetails cruciaux sur

limpleacutementation de chaque classe

98

l -llill Pa aj f1 1 Sh middotisVIsible boolampan

+draw(locaton AbstractPoint oot PniltWriBl) void

+lsVlsigtle() boolean +copyO Shape +obtalnPathO Path

Drawlna

-numberOIDrawinm int =0 middotdrawingNumber (nt -dependendes DrawingD middotpointsDellned AbsttactPolntD middothasBeenDrawn booLean middotshape Shape dmWingName string middotdrowingPositlon AbstractPoint -position AbstnldPolnt

+Orawlog(s Shape) +Shape(s S~ location AbsbaclPoint) +setPositlcn(positlon AbslradPoinl) void +seIDraloVingName(nsme slJfng) void +gelName() string +geISUbDrawlng(name string) ~ Drawlng +re~~Jri~)slring

+addDeflO8dPoint(point AbstractPolnl) Int +hasBeenDraWn() booIean +lsDrawn() booIean +canBeDlBWn() booIean +getShape() Shape fdraw(Jocafion AbslraclPolnt out PrlnlWriler) void +obtainPathO Path -tdp(other Orawilg) AbslractPoilt

uare length double

+Squate() ~s ( ~ le)

ell-eoatMength double) void +getlongthO bulldouble +dmw(locabmiddotoo AbstrampctPoint out PrnMYler) void +obtainPath() Path ffOPY() Shape

99

Rectangle

-lengIh double -wldth double -100 KI boeacuteIean

+Rectangle() +Rectangle(length double wldth double) +selleogth~ength double) void +setWldth(Width double) void +seIRound(rlaquo)Ulld booIegravean) void +getlengtb( doubIe +getMdth() double +getRound() booIeao +getNorth(d Dmwlog) RefPoint lttget5outh(d Drawlng) RefPolnl +getwest(d DlaWlng) RefPoint +gelEaat(d Drawlng) RefPoinl +gelNorthwest(d Drawllg) RefPoInt +gelNortheast(d Drawlng) R1tfPolnt lttgetSou1hwe$(d Drawlng) RefPoInt +get5outheast(d Drawilg) RefPoklt +dl8wlocalion Absl18ctPoiIt Ougravet ~Mhl81 void ii)blainPathO ~ Path

CIrcIe

middotradlus double

+Clœ() +Clrcle(radlus double)

+COPYO Shape +setRadlus(radius ~ double) void +getRadius() double +getAnglePolnt(d Omwilg angle double) RefPoInt +dmwlocation AbstradPoirlt our AiltKtler) VOiCI iOblailPath() Path

ElIID8e

middotxradlus double middotyradlus double

+Ellpse() +copyO bullShape +setXRadlus(r double) void +setYRadIus(r doublrt) void -gelXRadlus() double +geIYRadius() double +draw(txalJon AbstractPomt out PrinMbl8l) IIOIumld iOblainPathO Path

100

Lino point1 AbslractPoln1 middotpoint2 AbstractPoint

+L1oe() +Llne(point1 AbstractPoint poill2 AbstractPolnt) +COPYO Shape +dmw(locaIJon AbsIroctPoinl out PrnIWril9f) void +selPolnt1 (poInl1 AbsttactPoint) void +seIPoill2(poinl2 AbslractPoinl) void +getPolnl1 () AbslraclPoinl tiJotPolnl2() AbstraclPolntn_~

EqTrtanale middotsim double

-EqTriangleQ +EqTrlangle(size double) +cOPYO Shape +setSlze(slze double) void +gets1ze() double +d18W(Jocolion AbstTadPoinl out Ptil1Wfit8f) void +oblalllPalhll Path

middotpath Path bulltext string middotposIlIon double -dir Poilt middotabsohJle boolean middothasTexl boolean

+Arrav(path Palh) +copyO Shape TCl(( ex s n~ U blo dn 010 aosolute boolean) void seISlartingTangcnl(dlr Poinl) void

seIEndflgTangenl(dir Potnt) void tgelPalhO Palh +obtalnPath Path

101

cany -canvasLlst Carwas(J -canvasPontLIsl AbstractPoinllJ daWVigUsl DrawingD dlawilgPolnlUst AbsJaCtPolntO middotIsMaIn booean canvasPosltion bullAbstmetPoint

+CsnYaS() copYO Shape +seteanvasPositIoR(posllon AbslraclPotnt) VOId +setMaln() void +f8Mai1() booIean +addShape(S Shapeloca1ion AbstradPoItit) Drawilg l+a~pe(S Shape IocagravetJon AllstraclPolnl name slring) DraNklg +getOtawiDg(I Inl) D1awlng ~elDtawfng(namamp string) bull Drawilg tgelOl8WIngiocal1on(namo stlllllJ) AbsllaclPoilt ~olDmwlngOrNull(name string) Drawilg tgelOrawinglocation(l int) AbslractPolnt o+getNumberOfDrawlngs() int +dl8w(location AbstrodPonr oui PrintwrllerJ void +dmwMain(oul PrinlWrllGr) void +drawCanvaa(locatlon AbSlractPoinl remalnlllQDraws Drawlna Il out Prlntwriter) void

Path -Bst AbstractPolnllJ middothasASIartilgTangent boolean -hasAEndhlgTangent booIean -startiogTangent Point middotendingTangent Point middot1sU1ear boolean

+PathO Psth(Ust AbstraclPoint 0) +Path(Dst Ab~tPolnt Q startingTangent Polnt endlngTangenl Point) +cOPYO Sh8p6 +addPoinl(poiumlnl Abstl8ClPoint) void +seIUnear() void +IsUnearO booloao +getPolnt(l Inl) AbsIraclPcInl +getPolnts() AbsIlaCPoht 0 o+getNumberOlPolnts() Rt +cyc1B() void -thasASI8rthgTangent() boolean +hasAEndingTangentO booIoan +getStattilgTangenlO PoiIl +getEndlngTangent() Polnl 4uumllSlartingTangenl(stllllngTangent Peint) w1d +seIEndIllQTangent(encliigTangenl ~nt) void +psthValue() strilg +dmwJocalion AbslradPoItlI oot FilMtJrer) void

102

Text

-told slfng

ImiddotTexl() +Texl(lext string) +sotText(tegravext string) void iil8tTeld() string +draw(Jocalion AbstroctPoJnl oof PrinWriter) void ~btalnPath() Path +CODV(J ShsD9

AbsctPolnl +altfd(second AbstraclPoinl) AbslractPolnt -tmulliply(multipier double) AbstraclPolnt +eombine(perœntage double second AbstraclPolnl) AbstractPoint +solvfJ() slrillg +COfNIJ AbslradPoinl

Point -x double y doub19

+POIcirclIO +POIOI(x double y double) +solvo() slting -+IoSlflngO string~ n bull

RefPolnt -mf8teflœDrawlng Drawlng -poIntNumbef Int

+RefPoint(referenceDrawing DraYIing poiolNu ber Illl) +SoNe() stmg +COPYO AbstroctPDAcirclf

lnauudJonPoint p Path

-q Palh

+lnlCfSecllonPoint(p Palh q Path) +COPYO AbstrampcfPoitlt +soIve() string

103

Un Point -point AbsbaclPoint -pIampStmg string -endStrlng string -value double

+UnaryMapPolnl(poInt AbstradPoInt) +ScW9() string +setMapTypeMultlpIy(vallJe double) void +c Abslr8ctPoinI

Bln oint frstPoint Absll8clPoinl secoodPoInt AbstrootPoint -pceSIring string -middIeSlrIng Itlfno -endString string

+8ilatyMapPolnt(fkstPoiIt Abstmc1Po1nt secondPolnt AbslraetPointl +cOPYO bull AbstraetPOOI +soAte() string +selMapTypeAddO void

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

APPENDICE D

PREacuteSENTATION DES DIAGRAMMES CHOISIS

Cet annexe comprend lensemble des quinze (15) diagrammes que nous avons choisis

comme base de qualiteacute pour notre projet Tel que mentionneacute preacuteceacutedemment nous avons

inclus agrave la fois le code de chaque diagramme en SDDL ainsi que le diagramme reacutesultant

Aucune analyse nest effectueacute pour ces dessins agrave lexception de ceux deacutejagrave analyseacutes au

chapitre 6

Start box triangle = EqTriangle with [size = 400J put triangle at (00 -100) in main put Text with [text = StartJ at (00 -50) in main

El box rectanglePos = (00 -500) rectangle = Rectangle with [length = 1600 width = 300J put rectangle at rectanglePos in main put Text with [text El J at rectanglePos - (600 00) in main put Text with [text $a leftarrow O$J

at rectanglePos + (-300 50) in main put Text with [text $b leftarrow l$J

at rectanglePos + (-300 -50) in main put Text with [text $a leftarrow l$J

at rectanglePos + (100 50) in main put Text with [text $b leftarrow O$J

at rectanglePos + (100 -50) in main put Text with [text $c leftarrow m$J

at rectanglePos + (500 50) in main put Text with [text $d leftarrow n$J

106

at rectanglePos + (500 -50) in main

1 E2 box 1 rectangle2Pos = (00 -1000) put rectangle at rectangle2Pos in main put Text with [text = E2 ] at rectangle2Pos (600 00) in main put Text with [text = $q leftarrow quotient(c div d)$]

at rectangle2Pos + (100 50) in main put Text with [text = $r leftarrow remainderCc div d)$]

at rectangle2Pos + (100 -50) in main

1 Round E3 box 1 rectangle3Pos = (00 -1500) roundRectangle = Rectangle with [length = 800 width 250

round = true] put roundRectangle at rectangle3Pos in main put Text with [text = E3 $r = O$] at rectangle3Pos in main

1 Stop box 1 stopPos = (1500 -1700) put triangle at stopPos in main put Text with [text = Stop] at stopPos + (00 50) in main

1 E4 box 1 rectangle4Pos = (00 -2000) put Rectangle with [length = 1600 width = 400]

at rectangle4Pos in main put Text with [text = E4] at rectangle4Pos + (-700 00) in main put Text with [text = $c leftarrow d d leftarrow r$]

at rectangle4Pos + (100 120) in main put Text with

[text = $t leftarrow a a leftarrow a a leftarrow t - qa$] at rectangle4Pos + (100 00) in main

put Text with [text = $t leftarrow b b leftarrow b b leftarrow t - qb$ ] at rectangle4Pos + (100 -120) in main

(00 -100) -) rectanglePos + (00 150) rectanglePos + (00 -150) -) rectangle2Pos + (00150) rectangle2Pos + (00 -150) -) rectangle3Pos + (00125) rectangle3Pos + (00 -125) -) rectangle4Pos + (00200) rectangle4Pos + (00 -200) -- rectangle4Pos + (00 -500)

rectangle4Pos + (-1000 -500) -- rectangle2Pos + (-1000 00) -) rectangle2Pos + (-800 00)

107

rectangle3Pos + (400 00) -gt rectangle3Pos + (1410 00) put Text with [text Yes] at rectangle3Pos + (480 -50) in main put Text with [text = No] at rectangle3Pos + (-80 -175) in main

Placing text notes put Text with [text Al $m gt 0 n gt 0$] at (3000 00) in main put Text with [text A2 $c=mgtO d=ngtO$] at (3000 -340) in main put Text with [text $a=b=O a=b=l$] at (3000 -460) in main put Text with [text A3 $am + bn = d am + b$]

at (3000 -740) in main put Text with [text = $0 leq r lt d gcd(dc) g$]

at (3000 -860) in main put Text with [text = A4 $am + bn d = gcd(m n)$]

at (3000 -1200) in main put Text with [text = A5 $am + bn d am + b$]

at (3000 -1540) in main put Text with [text = $0 lt r lt d gcd(cd) = g$]

at (3000 -1660) in main put Text with [text = A6 $am + bn = d am + b$]

at (3000 -1940) in main put Text with [text = $gcd(c d) = gcd(m n)$]

at (3000 -2060) in main

(2500 00)-(2000 -50)-(1500 -150)-gt(00 -200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -400)-(2000 -450)-(1500 -650)-gt(00 -700) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -800)-(2000 -850)-(1500 -1150)-gt(00 -1200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2200 -1200)-(2000 -1200)-(1500 -1250) -gtrectangle3Pos + (900 00) with [startingTangent = (-10 00) endingTangent (-10 -10)]

(2250 -1600)-(2000 -1700)-(1500 -1900) -(1000 -1750)-gt(00 -1700) with [startingTangent = (-10 00) endingTangent (-10 00)]

(2250 -2000)-(1500 -2200)-gt(00 -2400) with [startingTangent = (-10 00) endingTangent (-10 00)]

108

~-- Al m gt On gt O

A2 c = m gt 0 d = n gt 0 a = b = 0 a = b = 1

A3 am + bn = dam + bdeg~ T lt dgcd(dc) = 9 E2

_--- A4 am + bn = d = gcd(m n)

A5 am + bn = dam + b Sto 0lt T lt dgcd(cd) = 9

Cf- d d f- T A6 am + bn = d am + bE4 t f- a a f- a a f- t - qa gcd(cd) =gcd(mn)t f- b b f- b b f- t - qb

primitive static sin javalangMath sin primitive static cos javalangMath cos primitive static sqrt javalangMath sqrt

fun ellipseCangle length width) return Clength cosCangle 20 31415 3600)

width sinCangle 20 31415 3600))

fun ellipseDeriveCangle length width) length2 = length length width2 = width width sinus = sinCangle 31415 1800) sinus2 = sinus sinus cosinus = cosCangle 31415 1800) cosinus2 = cosinus cosinus x = -10 Clength sinus)

sqrtCwidth2 cosinus2 + length2 sinus2) y = Cwidth cosinus) sqrtCwidth2 cosinus2 + length2 sinus2) return Cxy)

avail = Text with [text=AVAIL] link = Text with [text=LINKCP)] t = Text with [text=T]

109

put avail at ellipse(900 1000 500) in main put t at ellipse(1800 1000 500) in main put link at ellipse(OO 1000 500) in main

(ellipse(70 1000 500))-(ellipse(450 1000 500)) -gt(ellipse(750 1000 500))

(ellipse(1050 1000 500))-(ellipse(1350 1000 500)) -gt(ellipse(1730 1000 500))

(ellipse(1930 1000 500))-(ellipse(2700 1000 500)) -gt(ellipse(3550 1000 500))

AVAIL

~ T LINK(P)

primitive static sin javalangMatb sin primitive static cos javalangMatb cos

fun circular(angle radius) return (radius cos(31415 angle 1 1800)

radius sin(31415 angle 1 1800))

circleradius = 400 circle = Circle with [radius=100] g Text with [text=G] r = Text with [text=R] y Text with [text=Y]

put circle at (circular(300 circleradius)) in main put r at (circular(300 circleradius)) in main put circle at (circular(900 circleradius)) in main put r at (circular(900 circleradius)) in main put circle at (circular(1500 circleradius)) in main put g at (circular(1500 circleradius)) in main put circle at (circular(2100 circleradius)) in main put g at (circular(2100 circleradius)) in main put circle at (circular(2700 circleradius)) in main

110

put g at (circular(2700 circleradius)) in main put circle at (circular(3300 circleradius)) in main put y at (circular(3300 circleradius)) in main

(circular(450 circleradius))-(circular(600 circleradius)) -gt(circular(750 circleradius))

(circular(1050 circleradius))-(circular(1200 circleradius)) -gt(circular(1350 circleradius))

(circular(1650 circleradius))-(circular(1800 circleradius)) -gt(circular(1950 circleradius))

(circular(2250 circleradius))-(circular(2400 circleradius)) -gt(circular(2550 circleradius))

(circular(2850 circleradius))-(circular(3000 circleradius)) -gt(circular(3150 circleradius))

(circular(3450 circleradius))-(circular(OO circleradius)) -gt(circular(150 circleradius))

put Text with [text=tinyNEXTR] at (circular(900 circleradius)) + (00 150) in main

put Text with [text=tinyNEXTG] at (circular(-900 circleradius)) + (00 -150) in main

put Text with [text=tinyCURRENT] at (circular(-300 circleradius))+ (1~0 -150) in main

NEXTR

NEXTG

fun left(d)

return 016 coord of west in drectangle + 084 coord of east in drectangle

fun right(d)

return 016 coord of east in drectangle +

111

084 coord of west in drectangle

rectanglel = Rectangle with [length=600 width=200) rectangle2 = Rectangle with [length=200 width=200) circle = Circ le with [radius=10) put rectanglel in form rectangle = put rectangle2 in form put circle at (-200 00) in form put circle at (200 00) in form

dl = put form at (00 00) in main d2 = put form at (-600 -500) in main put Text with [text=IA) at (-600 -500) in main d3 = put form at (-1200 -1000) in main put Text with [text=IB) at (-1200 -1000) in main d4 = put form at (-1800 -1500) in main put Text with [text=ID) at (-1800 -1500) in main d5 = put form at (-600 -1500) in main put Text with [text=IE) at (-600 -1500) in main d6 = put form at (00 -1000) in main put Text with [text=IC) at (00 -1000) in main d7 = put form at (600 -1500) in main put Text with [text=f) at (600 -1500) in main d8 = put form at (-400 -2000) in main put Text with [text=IG) at (-400 -2000) in main dg = put form at (300 -2000) in main put Text with [text=IH) at (300 -2000) in main dl0 = put form at (1000 -2000) in main put Text with [text=JI) at (1000 -2000) in main

(left(dl))-gt(coord of north in d2rectangle) (right(dl))-gt(coord of east in dlrectangle + (00 50)) (left(d2))-gt(coord of north in d3rectangle) (right(d2))-gt(coord of north in d5rectangle) (left(d3))-gt(coord of north in d4rectangle) (right(d3))-gt(coord of south in d2rectangle) (left(d4))-gt(coord of west in dlrectangle + (00 50)) (right(d4))-gt(coord of south in d3rectangle) (left(d5))-gt(coord of north in d6rectangle) (right(d5))-gt(coord of north in d7rectangle) (left(d6))-gt(coord of south in d2rectangle) (right(d6))-gt(coord of north in d8rectangle)

112

(left(d7raquo-gt(coord of north in d9rectangle) (right(d7raquo-gt(coord of north in dl0rectangle) (left(dSraquo-gt(coord of south in d6rectangle) (right(d8raquo-gt(coord of south in d5rectangle) (left(d9raquo-gt(coord of south in d5rectangle) (right(d9raquo-gt(coord of south in d7rectangle) (left(dl0raquo-gt(coord of south in d7rectangle) (right(dl0raquo-gt(coord of south in dlrectangle + (100 00raquo

put Text wi th [text=List head] at coord of north in dlrectangle + (00 50) in main

circle = Circle with [radius = 100] bigcircle = Circle with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvasl put circle at 050 150) in canvasl put Text with [text = H] at 050 150) in canvasl put circle at (-150 150) in canvasl put Text with [text J] at (-150 150) in canvasl put Text with [text = B] at (00 -150) in canvasl

put bigcircle in canvas2

113

put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = Fil] at (150 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = liE] at (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvasl at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = Ali] at (00 -300) in main put bigellipse in main

A

fun drawBinaryTree(d s 0 dh dv n)

put s at a in d put 0-(0 + (-10 dh -10 dvraquo in d put 0-(0 + (db -10 dvraquo in d if (n == 1)

then return 0 else drawBinaryTree(d sa + (-10 dh -10 dv) db 20 dv n - 1) drawBinaryTree(d s a + (db -10 dv) db 20 dv n - 1) end

(0000)--(0000)

114

orlgln = (00 00) dv = 200 dh = 1000 bullet = Circle with [radius = 20) drawBinaryTree(main bullet origin dh dv 7)

bullet = Circle with [radius = 20] put bullet in main put bullet at (-300 -300) in main put bullet at (-600 -600) in main put bullet at (00 -600) in main put bullet at (300 -300) in main

(00 00)--(-300 -300) (00 00)--(300 -300) (-300 -300)--(-600-600) (-300 -300)--(00 -600)

(-100 00)-(-500 -300)-(-650 -650)-(-300 -400)shy(50-650)-(00-500)-(-150-300)-(-100 -200)shy(00-100)-(250-320)-(350-350)shy(320 -270)-gt(100 00)

circlel Circle with [radius 100]

lL5

circle2 = Circle with [radius = 120] ellipse = Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (100 0 500) in main d3 put form at (1000 -500) in main put Text with [text I$N(p_1)$] at (1000 1000) in main put Text with [text I$N(p_2)$] at (1000 500) in main put Text with [text dots] at (100 0 o 0) in main put Text with [text $N(p_n)$] at (1000 -500) in main

put Text with [text $S_O$] at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

sa

fun dropMany(f n s v c) for i from 10 to n do

put f at (s + (i - 10) v) in c

116

end

square = Square with [length=200] changeVec = (00 -200) dropMany(square 40 (00 00) changeVec main) dropMany(square 30 (500 00) changeVec main) dropMany(square 10 (1000 00) changeVec main) dropMany(square 10 (1500 00) changeVec main) put Text with [text=IO] at (00 00) in main put Text with [text=ll] at (00 -200) in main put Text with [text=13] at (00 -400) in main put Text with [text=17] at (00 -600) in main put Text with [text=bf ail] at (500 200) in main put Text with [text=12] at (500 00) in main put Text with [text=14] at (500 -200) in main put Text with [text=17] at (500 -400) in main put Text with [text=17] at (1000 00) in main put Text with [text=bf $a~b~+$] at (1500 200) in main put Text with [text=18] at (1500 00) in main put Text with [text=none ] at (2000 00) in main

(120 100)-gt(380 100) (620 100)-gt(880 100) (112 0 10 0) - gt(138 0 10 0) (1620 100)-gt(1880 100)

a ab+

~ -m-0-0-none 7

put Text with [text=IS] in main put Text with [text=A] at (00 -200) in main put Text with [text=B] at (00 -400) in main put Text with [text=$alpha$] at (-600 -600) in main put Text with [text=$beta$] at (-300 -600) in main put Text with [text=$gamma$] at (00 -600) in main put Text with [text=$y$] at (300 -600) in main put Text with [text=$z$] at (600 -600) in main

117

(-50 -50)--(-700 -540)--(-500 -540) (50 -50)--(700 -540)--(500 -540) (-50 -250)--(-400 -540)--(-200 -540) (50 -250)--(400 -540)--(200 -540) (-50 -450)--(-100 -540)--(100 -540)--(50 -450)

put Text with [text=D] in main

put Text with [text=T] at (-500 -500) in main put Text with [text=bf real] at (-500 -900) in main put Text with [text=4] at (-350 -500) in main put Text with [text= type] at (-150 -500) in main

put Text with [text=L] at (500 -500) in main put Text with [text=inh] at 050 -500) in main put Text with [text=5] at (350 -500) in main put Text with [text=6] at (650 -500) in main put Text with [text=entry] at (850 -500) in main

put Text with [text=bf $id_3$] at (900 -900) in main put Text with [text=bf ] at (500 -900) in main put Text with [text=3] at 0050 -900) in main put Text with [text=entry] at 0350 -900) in main

put Text with [text=L ] at (00 -1000) in main put Text with [text=inh] at (-350 -1000) in main put Text with [text=7] at (-150 -1000) in main put Text with [text=8] at 050 -1000) in main put Text with [text=entry] at (350 -1000) in main

put Text with [text=bf ] at (00 -1400) in main put Text with [text=bf $id_2$] at (400 -1400) in main put Text with [text=2] at (550 -1400) in main put Text with [text=entry] at (750 -1400) in main

put Text with [text=L] at (-500 -1500) in main

118

put Text with [text=inh] at (-850 -1500) in main put Text with [text=19] at (-650 -1500) in main put Text with [text=110] at (-350 -1500) in main put Text with [text= ent ry] at (-150 -1500) in main

put Text with [text=bf $id_l$] at (-500 -1900) in main put Text with [text=ll] at (-350 -1900) in main put Text with [text= ent ry ] at (-150 -1900) in main

(-100 -100)--(-400 -400) (-500 -600)--(-500 -800) (100 -100)--(400-400) (500 -600)--(500 -800) (600 -600)--(800 -800) (400 -600)--(100 -900) (100 -1100)--(400 -1300) (00 -1100)--(00 -1300) (-100 -1100)--(-400 -1400) (-500 -1600)--(-500 -1800)

(-300 -400)-(00 -300)-gt(300 -400) (400 -600)-(500 -650)-gt(600 -600) (950 -800)-gt(700 -600) (300 -600)-gt(-50 -900) (-100 -1100)-(00-1150)-gt(100 -1100) (450 -1300)-gt(200 -1100) (-200 -1100)-gt(-550 -1400) (-550 -1500)-(-500 -1550)-gt(-450 -1500) (-350 -1800)-gt(-350 -1600)

119

D

~ T 4 type inh 5 L 6 entry

entryrL ~~3 inh 7 L 8 entry

~2entrY inh 9 JJ lOentry

1 t id l 1 entry

circle = Circle with (radius=100J bigcircle = Circle with (radius=SOOJ

cl put circle at (00 200) c2 put circle at (200 00) c3 put circle at (-200 00) c4 put circle at (00 -200) bcl = put bigcircle in graphl

cS = put circle at (00 200) c6 = put circle at (00 -200) bc2 = put bigcircle in graph2

c7 put circle at (00 lS0)

in graphl in graphl in graphl in graphl

in graph2 in graph2

in graph3 c8 put circle at (200 -200) in graph3 c9 put circle at (-200 -200) in graph3 bc3 = put bigcircle in graph3

gl put graphl in main g2 put graph2 at (-1000 -1500) in main g3 put graph3 at (1000 -1000) in main

1 lines in first drawing (coord of anglePoint(900) in mainglc4)-gt

(coord of anglePoint(2700) in mainglcl) (coord of anglePoint(1800) in mainglcl)-gt

(coord of anglePoint(900) in mainglc3) (coord of anglePoint(OO) in mainglcl)-gt

120

(eoord of anglePoint(900) in maingle2) (eoord of anglePoint(2700) in maingle3)-gt

(eoord of anglePoint(1800) in maingle4) (eoord of anglePoint(2700) in maingle2)-gt

(eoord of anglePoint(OO) in maingle4)

(eoord of anglePoint(2700) in maingle3)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(1800) in maingle4)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(OO) in maingle2)shy(eoord of anglePoint(3450) in mainglbel)

lines in seeond drawing (eoord of anglePoint(2700) in maing2e5)-gt

(eoord of anglePoint(900) in maing2e6) erdl = eoord of anglePoint(1800) in maing2e6 erd2 = eoord of anglePoint(1800) in maing2e5 erdl-((erdl + erd2)20 + (-200 00))-gterd2

(eoord of anglePoint(900) in maing2e5)shy(eoord of anglePoint(900) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(450) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(OO) in maing2be2)

(eoord of anglePoint(OO) in maing2e6)shy(eoord of anglePoint(OO) in maing2be2)

lines in third drawing (eoord of anglePoint(1800) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e9) (eoord of anglePoint(OO) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e8) (eoord of anglePoint(OO) in maing3e9)-gt

(eoord of anglePoint(1800) in maing3e8) crd3 = eoord of anglePoint(OO) in maing3e8 erd4 = eoord of anglePoint(900) in maing3e7 erd3-(erd3 + erd4) 20 + (200 200)-gterd4

erd4--(eoord of anglePoint(1050) in maing3be3) (eoord of anglePoint(1800) in maing3e7)-shy

(eoord of anglePoint(1850) in maing3be3) (coord of anglePoint(1800) in maing3e9)-shy

121

(coord of anglePoint(1750) in maing3bc3)

lines between drawings (coord of anglePoint(2250) in mainglbcl)-gt

(coord of anglePoint(900) in maing2bc2) (coord of anglePoint(3450) in mainglbcl)-gt

(coord of anglePoint(1050) in maing3bc3) (coord of anglePoint(OO) in maing2bc2)-gt

(coord of anglePoint(1850) in maing3bc3) crd5 = coor~ of anglePoint(1750) in maing3bc3 crd6 = coord of anglePoint(450) in maing2bc2 crd5-(crd5 + crd6) 20 + (000 300)-gtcrd6

Texts crdTextl coord of anglePoint(1350) in mainglbcl + (-200 00) crdText2 = coord of anglePoint(1350) in maing2bc2 + (-100 100) crdText3 = coord of anglePoint(450) in maing3bc3 + (100 100) put Text with [text=$R_l$] at crdTextl in main put Text with [text=$R_2$] at crdText2 in main put Text with [text=$R_3$] at crdText3 in main

primitive getClip sddlhierarchyDrawing clip primitive setVisible sddlhierarchyShape setVisible

122

1 clip takes 3 drawings and a canvas first is a line second and third are two shapes which intersect line will draw a line between the intersection points the line creates with the two shapes 1

fun clip(dl d2 d3 canvas)

dlsetVisible(false) drawl = put dl in canvas cl = drawlgetClip(d2) c2 = drawlgetClip(d3) put cl--c2 in canvas

circle Circle with [radius=100] dl = put circle in main put Text with [text=14] in main d2 = put circle at (-400 -400) in main put Text with [text=13] at (-400 -400) in main d3 = put circle at (-700 -800) in main put Text with [text=12] at (-700 -800) in main d4 = put circle at (400 -400) in main put Text with [text=18] at (400 -400) in main d5 = put circle at (150 -800) in main put Text with [text=17] at 050 -800) in main d6 = put circle at (650 -800) in main put Text with [text=110] at (650 -800) in main d7 = put circle at (220 00) in main put Text with [text=14] at (220 00) in main d8 = put circle at (620 -400) in main put Text with [text=18] at (620 -400) in main dg = put circle at (370 -800) in main put Text with [text=7] at (370 -800) in main dl0 = put circle at (00 -1200) in main put Text with [text=5J at (00 -1200) in main

Il = (00 00)--(-400 -400) clip(ll dl d2 main) 12 = (-400 -400)--(-700 -800) clip(12 d2 d3 main) 13 = (00 00)--(400 -400) clip(13 dl d4 main) 14 = (400 -400)--(150 -800)

123

clip(14 d4 d5 main) 15 = (400 -400)--(650 -SOO) clip(15 d4 d6 main) 16 = (220 00)--(-400 -400) clip(16 d7 d2 main) 17 = (220 00)--(620 -400) clip(17 d7 dS main) lS = (620 -400)--(650 -SOO) clip(lS dS d6 main) 19 = (620 -400)--(370 -SOO) clip(19 dS d9 main) 110 = (370 -800)--(00 -1200) clip(110 dg d10 main)

2

5

fun niceArrow(c dMain dLeft dRight) firstPoint = coord of southwest in dMainrectangle + (30 30) secondPoint = coord of southeast in dMainrectangle + (-30 30)

firstEnd = coord of north in dLeftrectangle secondEnd = coord of north in dRightrectangle

put firstPoint-gtfirstEnd in c put secondPoint-gtsecondEnd in c

point1 firstPoint 50 60 + secondPoint 10 60 point2 firstPoint 40 60 + secondPoint 20 60 point3 firstPoint 30 60 + secondPoint 30 60 point4 firstPoint 20 60 + secondPoint 40 60 point5 firstPoint 10 60 + secondPoint 50 60

put (coord of southwest in dMainrectangle + (-25 25))shy(coord of south in dMainrectangle + (00 -50))shy

124

(coord of southeast in dMainrectangle + (25 25)) in c

put pointl--(pointl + (-1 0 30 -10 70)) in c put point2--(point2 + (-1 0 10 -10 85)) in c put point3--(point3 + (00 -10 90)) in c put point4--(point4 + (1 0 -10 85)) in c put point5--(point5 + (30 -1 0 70)) in c

put Text with [text=smallt] at point3 + (00 -130) in c

rect = Rectangle with [length=300 width=200] r = put rect in main put Text with [text=ll] in main rectangle = put rect in form put Text with [text=$t-l$] in form

dl = put form at (-1400 -500) in main dll = put form at (-2000 -1000) in main dlr = put form at (-800 -1000) in main dlll put form at (-2300 -1500) in main dllr put form at (-1700 -1500) in main dlrl put form at (-1100 -1500) in main dlrr put form at (-500 -1500) in main

dr = put form at (1400 -500) in main drr = put form at (2000 -1000) in main drl = put forro at (800 -1000) in main drrr put form at (2300 -1500) in main drrl put form at (1700 -1500) in main drlr put form at (1100 -1500) in main drll put form at (500 -1500) in main

put Text with [text=l root[T]] at (-300 300) in main (-300 240)-gt(coord of north in mainr)

dots = Text with [text=dots] put dots at (-1400 -1000) in main put dots at (-2000 -1500) in main put dots at (-SOO -1500) in main put dots at (1400 -1000) in main put dots at (2000 -1500) in main put dots at (800 -1500) in main

125

(coord of southwest in mainr + (30 30))-gt (coord of north in maindlrectangle)

(coord of southeast in mainr + (-30 30))-gt (coord of north in maindrrectangle)

niceArrow(main dl dll dlr) niceArrow(main dll dlll dllr) niceArrow(main dlr dlrl dlrr) niceArrow(main dr drl drr) niceArrow(main drl drll drlr) niceArrow(main drr drrl drrr)

root[T]

rect = put Rectangle with [length=600 width=200l in form put Rectangle with [length=200 width=200] at (200 00) in form bullet = put Circle with [radius=10] at (200 00) in form

put Text with [text=IF] in main

fl put form at (700 00) in main f2 put form at (1500 00) in main f3 put form at (2300 00) in main f4 put form at (3100 00) in main

(coord of anglePoint(OO) in mainflbullet)-gt (coord of west in mainf2rect)

(coord of anglePoint(OO) in mainf2bullet)-gt (coord of west in mainf3rect)

(coord of anglePoint(OO) in mainf3bullet)-gt (coord of west in mainf4rect)

126

ptW = coord of west in mainflrect ptE = coord of east in mainf4rect

ptW + (-300 OO)-gtptW ptE + (300 OO)-gtptE

put Text with [text=R] at (3800 00) in main

ptS = coord of anglePoint(2700) in mainf4bullet ptS2 = ptS + (00 -350)

ptS--ptS2 ptS2 + (-50 00)--ptS2 + (50 00) ptS2 + (-35 -20)--ptS2 + (35 -20) ptS2 + (-20 -40)--ptS2 + (20 -40)

BIBLIOGRAPHIE

Adobe Systems Incorporated 1994 PostScript Language Reference Manual http j jwwwadobecomjproductsjpostscriptjpdfsjPLRMpdf

-- 2006 PDF Reference Version 17 Adobe Systems Incorporated 6th eacutedition

-- 201Oa Adobe Postscript 3 http j jwwwadobecomjproductsjpostscriptj

2010b PDF Developer Corner PDF Reference http j jwwwadobecomjdevnetjpdfjpdLreferencehtm1

Aho A V R Sethi et J D Ullman 1986 Compilers Principles Techniques and Tools Addison-Wesley

American Mathematical Society 2008 Why Do We Recommend LaTeX http j jwwwamsorgjpublicationsjauthorsjtexjlatexbenefits

Apple Computer Inc 1996 The TrueType Reference Manu al Apple Computer Inc Cupertino California

Bourgeois M 2010 Introduction to Drawing Diagrams with SDDL httpj jrivershyvalley tvjintroduction-to-drawing-structured-diagrams-in-sddlj

Bourgeois M et R Villemaire 201Oa laquoDrawing Structured Diagrams with SDDL raquo

TUGBoat vol 31 no 2 p 206-210

-- 201Ob SDDL http j jwwwinfo2uqamca-villemaireJjRecherchejSDDLj

Bowman J C 2007 laquoThe 3D Asymptote Generalization of Metapost Beacutezier Interposhylation raquo Proceedings in Applied Mathematics and Mechanics

Chomsky N 1956 laquoThree Models for the Description of Language raquo Information Theory IRE Transactions on vol 2 no 3 p 113-124

Cormen T A C E Leiserson R L Rivest et C Stein 2001 Introduction to Algoshyrithms The MIT Press

Davis M R Sigal et E Weyuker 1994 Computability Complexity and Languages Pundamentals of Theoretical Computer Science Morgan Kaufmann

Dhu D-Z et K-I Ko 2000 Theory of Computational Complexity Wiley

Gagnon Eacute 1998 laquoSableCC an Object-Oriented Compiler Framework raquo Meacutemoire de maicirctrise McGill University

128

-- 2009 ObjeetMacro - SableCC httpsableccorgwikiObjectMacro

Group O M 1999 Unified Modeling Language (version 13) Rapport Object Manashygement Group

Hammerlindl A J Bowman et T Prince 2010a Asymptote httpasympshytotesourceforgenet

-- 20lOb Asymptote The Veetor Graphies Language httpasympshytotesourceforgenet asymptote pdf

Hobby J 1992 laquo A Users Manual for MetaPost raquo Computing Science Technical Report vol 162

International Organization for Standardization 2008 Document Management - Elecshytronic Document File Format for Long-Term Preservation - Part 1 Use of PDF 14 (PDF A-1) ISO 19005-1 2005

Jr F S H et S M Kelley 2007 Computer Graphics using GpenGL Prentice-Hall 3e eacutedition

Knuth D 1968 The Art of Computer Programming Addison-Wesley

-- 1984 The TeXbook Reading Mass Addison-Wesley

-- 1986 The Metafontbook Reading Mass Addison-Wesley

-- 1999 Digital Typography Stanford California Center for the Study of Language and Information

Lamport L et D Bibby 1986 LATEX A Document Preparation System T 260 Citeseer

Lancaster D 2005 Approximating a Circle or an Ellipse using Four Bezier Cubic Splines Rapport Synergetics

Maplesoft 2010 Maple 14 User Manual

McNaughton R et H Yamada 1960 laquoRegular Expressions and State Graphs for Automata raquo -IRE Transactions on Electronic Computers no l p 39-47

Object Management Group 2009 UML httpwwwumlorgj

Oracle 2010 Java httpwwwjavacomj

Pierce B C 2002 Types and Programming Languages MIT Press

Riskus A 2006 laquoApproximation of a Cubic Bezier Curve by Circular Arcs and Vice Versa raquo Information Technology and Control vol 35 no 4 p 371-378

Rose K H 2008 XY-pic Home Page httptugorgapplicationsjXy-picj

129

Rose K H et al 2010 laquoXY-pic Users Guide raquo DIKU Universiteacute de Copenhague vol 1

Rumbaugh J M Blaha W Premerlani F Eddy et W Lorensen 1991 ObjectshyOriented Modeling and Design Prentiee-Hall

Saunders J H 1989 laquoA Survey of Objeet-Oriented Programming Languages raquo JOOP Journal of Object-Oriented Programming vol 1

Sabel J et D Friedman 1996 An Introduction to Refiection-Oriented Programming San Francisco Reflection 96

TeX Users Group 2009 MetaPost - TeX User Groups httptugorgmetaposthtml

TIOBE Software 2008 Tiobe Index httpwwwtiobecomindexphpcontentshy paperinfo tpeiindexhtml

Ullman J J Hopcroft et R Motwani 1979 Introduction to Automata Theory Lanshyguages and Computation Addison-Wesley

Van Zandt T 1993a PSTricks-PostScript Macros for Generie TEX httpwwwtexuniyaracrudocpsLugpdf

-- 1993b laquoPSTricks PostScript Macros for Generie 1EX Users Guide raquo Version 093 a http jjwww tug orgjapplicationsjPSTricks

Page 6: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux

vii

42 Grammaires 52

421 Deacutefinition dune grammaire formelle 52

422 Hieacuterarchie de Chomsky 54

423 Utiliteacute dans les langages de programmation 55

43 SableCC 56

431 Quest-ce que SabieCC 56

432 Avantages de SabieCC 56

44 Langage reacuteflexif 57

441 Deacutefinition dun langage reacuteflexif 57

442 Avantages 57

443 Deacutesavantages 58

CHAPITRE V MISE EN OEUVRE DE LA SOLUTION 59

51 Eacuteleacutements de langage en SDDL 59

511 Impleacutementation de la hieacuterarchie 59

512 Grammaire 60

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage 61

52 Reacutealisation en Java 63

521 Traverseacutee de larbre grammatical et exeacutecution 63

522 Deacutefinition dobjets quelconques 64

523 Gestion des erreurs 65

524 Structures de support 66

53 Accegraves agrave Postscript PDF et gTEX 66

531 Postscript 66

532 PDF 67

533 g1EX- 68

534 Geacuteneacuteration du code Asymptote 68

CHAPITRE VI REacuteALISATION DES DIAGRAMMES EN SDDL 71

61 Analyse du code des diagrammes existants 71

Vlll

611 Rappel des objectifs cruciaux agrave observer

612 Diagramme de compilation

613 Diagramme de tableau

614 Diagramme de Venn

62 Preacutesentation du produit final

621 Statistiques et documentation

622 Preacutesentation

623 Site web

63 Conclusion de notre analyse

CONCLUSION

APPENDICE A PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

APPENDICE B PREacuteSENTATION DE LA GRAMMAIRE DE SOOL

APPENDICE C PREacuteSENTATION DE LA HIEacuteRARCHIE

APPENDICE D PREacuteSENTATION DES DIAGRAMMES CHOISIS

BIBLIOGRAPHIE

72

73

75

78

79

80

80

81

81

83

85

91

97

105 shy

127

LISTE DES FIGURES

Figure Page

11 Code XY-pic pour un diagramme 14

12 Diagramme reacutesultant du code XY-pic 14

13 Code Metapost pour dessiner un triangle 15

14 Diagramme reacutesultant du code Metapost 15

15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin 16

16 Diagramme reacutesultant du code Asymptote 16

31 Courbes de Beacutezier lineacuteaire quadratique et cubique 34

32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier 38

33 Quart de cercle approximeacute par une courbe de Beacutezier 39

34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence 41

41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b 49

51 Extrait de la grammaire de SDDL pour une instruction 61

52 Code Java et SDDL pour calculer une combinaison lineacuteaire 63

53 Code reacuteflexif pour creacuteer une forme quelconque 65

54 Code pour geacuteneacuterer du code Asymptote pour un cercle 69

61 Diagramme dautomate de compilation 73

62 Code pour le diagramme dautomate 74

63 Diagramme de tableau 76

64 Code pour le diagramme de tableau 77

65 Diagramme de Venn 78

x

66 Code du diagramme de Venn 79

REacuteSUMEacute

Dans ce meacutemoire nous analysons la description de diagrammes structureacutes dans le domaine des matheacutematiques discregravetes et de linformatique theacuteorique Cette analyse seffectue agrave partir de meacutethodes eacutetablies du geacutenie logiciel Nous trouvons un ensemble de proprieacuteteacutes que nous recherchons dans une solution informatique nous permettant de creacuteer ces diagrammes Nous analysons aussi les outils classiques agrave partir des proprieacuteteacutes preacuteceacutedentes qui nous permettent de reacutealiser ces diagrammes dans un environnement I51EX Nous observons que ces outils ne sont pas aussi puissants quils le pourraient en fonction des proprieacuteteacutes eacutetablies par notre analyse

Par la suite en nous basant sur les meacutethodes de repreacutesentation graphique des courbes et sur la theacuteorie des langages informatiques nous jetons les bases dun lanshyguage de description Nous preacutesentons aussi un outil deacuteveloppeacute en Java qui nous pershymet de deacutecrire aiseacutement nos diagrammes dinformatique theacuteorique et de matheacutematiques discregravetes agrave partir dune hieacuterarchie dobjets claire et extensible Nous avons impleacutementeacute les eacuteleacutements essentiels de notre langage en SDDL (Structured Diagram Description Lanshyguage) Nous lavons aussi valideacute agrave laide dexemples repreacutesentatifs tireacutes de sources daushytoriteacute Nous avons finalement preacutesenteacute notre solution dans le cadre de la confeacuterence TUG 2010 Nous lavons aussi preacutesenteacute avec un article dans la revue du TeX Users Groups TUG

Mots cleacutes diagrammes informatique theacuteorique matheacutematiques discregravetes langage

INTRODUCTION

Le logiciel de mise en page de document U1EX est devenu llne reacutefeacuterence pour la creacuteation

de documents matheacutematiques (American Mathematical Society 2008) Plusieurs raisons

suscitent cet inteacuterecirct une structure naturelle permettant de repreacutesenter clairement ses

ideacutees le formatage automatique de qualiteacute et un reacutesultat final de qualiteacute professionnelle

agrave un coucirct moindre

Un traiteacute matheacutematique peut contenir plusieurs types dobjets textes formules grashy

phiques diagrammes etc Dans le cas preacutesent nous nous inteacuteressons principalement agrave

la repreacutesentation de diagrammes Par diagramme on entend un dessin qui possegravede une

structure discregravete sous-jacente (souvent combinatoire mais pas obligatoirement) Un

exemple simple serait un graphe ou un arbre

Agrave partir du moment ougrave nous nous inteacuteressons agrave ces diagrammes et agrave leur repreacutesentation

il devient inteacuteressant de voir ce que U1EX nous fournit afin de geacuteneacuterer des structures

de qualiteacute En effet les diagrammes sont essentiels agrave la transmission effective des ideacutees

et des reacutesultats en informatique et en matheacutematiques discregravetes De plus la consistance

nous oblige agrave chercher agrave faire nos diagrammes agrave partir dun modegravele coheacuterent Entre

autres il nous faut conserver la mecircme police dans les diagrammes et dans le texte

en plus davoir accegraves aux symboles matheacutematiques Nous pourrions aussi importer des

diagrammes exteacuterieurs agrave U1EX mais les reacutesultats obtenus ne serait pas consistant avec

le texte Nous devons donc chercher agrave obtenir une meacutethode de repreacutesentation adeacutequate

pour nos diagrammes

Bien sucircr il existe deacutejagrave plusieurs solutions agrave ce problegraveme Il nous faut donc les analyser

avec soin avec des critegraveres formels Cela implique de reacutepertorier les diffeacuterents paquets

U1EX permettant de faire du dessin avec leurs diffeacuterentes proprieacuteteacutes Il faut ensuite

2

ajouter les logiciels qui utilisent JbTEX indirectement donc qui nen font pas partie

mais sen servent tout de mecircme Cela nous donne une vue densemble complegravete des

solutions deacutejagrave existantes agrave notre problegraveme

Ensuite avant de penser agrave analyser ces solutions nous devons deacuteterminer ce que nous

voulons exactement Agrave cette fin nous avons analyseacute le processus qua utiliseacute Donald

Knuth creacuteateur de TEX agrave la base de Jb1EX afin de mateacuterialiser son logiciel de formatage

Nous devons aussi utiliser un ensemble de contraintes agrave soumettre agrave nos diffeacuterentes

solutions Il eacutetait essentiel dutiliser Jb1EX pour le formatage du texte mais aussi pour

la clarteacute deacutecriture la qualiteacute de la documentation et la capaciteacute de creacuteer aiseacutement des

structures Par la suite il devient aiseacute et tregraves formel danalyser chacunes des diffeacuterentes

solutions proposeacutees

Malheureusement cette analyse nous a permis de constater quaucune solution neacutetait

suffisamment bonne pour satisfaire nos besoins La plupart des paquets eacutetaient trop

simples alors que plusieurs eacutetaieentiernt composeacutes de macros rendant la veacuterification de

code quasi impossible Quelques solutions (telles que XY-Pic (Rose 2008) Metapost

(TeX Users Group 2009) et Asymptote (Hammerlindl Bowman- et Prince 2010a))

fournissaient de nombreuses ideacutees inteacuteressantes mais aucune ne convenait parfaitement

agrave nos besoins Nous en sommes donc venus agrave la conclusion que la meilleure solution

serait de creacuteer notre propre solution tout en reacuteutilisant les ideacutees deacuteveloppeacutees par les

solutions preacuteceacutedentes

Afin de creacuteer une solution robuste nous avons deacutecideacute de creacuteer une hieacuterarchie orienteacutee obshy

jet afin de repreacutesenter les diffeacuterentes structures du domaine des matheacutematiques discregravetes

et de linformatique theacuteorique Cela se justifie par le fait que les hieacuterarchies objets aushy

delagrave de leurs avantages possegravedent des meacutethodes de conceptualisation formelles et bien

deacutefinies Nous avons utiliseacute la meacutethode favoriseacutee par James Rumbaugh (Rumbaugh

et al 1991) un des creacuteateurs de UML (Object Management Group 2009)

Ce processus demande en tout premier lieu une analyse du domaine afin dobtenir les

structures principales Par la suite les liens entre les diffeacuterentes classes sont analyseacutes en

3

fonction des besoins respectifs Finalement apregraves plusieurs iteacuterations et simplifications

cette meacutethode foumit une hieacuterarchie complegravete Par contre elle doit par la suite ecirctre

adapteacutee aux speacutecificiteacutes du langage dimpleacutementation

Notre hieacuterarchie a eacuteteacute deacuteveloppeacutee autour de plusieurs concepts importants Certains

sont naturellement lieacutes au domaine dutilisation Par exemple un point est une structure

naturelle pour la description de positions dans un diagramme Le mecircme raisonnement

sapplique pour des formes geacuteomeacutetriques de base comme le cercle le carreacute et lellipse

Certains objets sont des simplifications de concepts communs Par exemple un point

abstrait est un point qui peut ecirctre deacutetermineacute de maniegravere absolue ou relative Une forme

est une classe de base repreacutesentant lensemble des objets qui peuvent ecirctre dessineacutes Il

existe aussi un dessin qui repreacutesente une forme agrave un endroit particulier

Bien que cela pourrait deacuteterminer complegravetement notre domaine afin davoir une hieacuteshy

rarchie complegravete il faut inclure certains eacuteleacutements de structure Par exemple bien que

nous puissions deacuteterminer assez aiseacutement ce quest un cercle la maniegravere de le deacutecrire

pour ecirctre dessineacute nest pas aussi simple Il en est de mecircme pour des formes courbes

plus complexes ainsi que des courbes de maniegravere geacuteneacuterale car un ordinateur ne peut pas

repreacutesenter aiseacutement toutes formes de chemin Nous pouvons creacuteer un concept geacuteneacuteral

de chemin mais celui-ci doit se ramener agrave la reacutealiteacute dun ordinateur

Cela est deacutetermineacute en analysant deux choses le format de document PDF et la desshy

cription de chemin dAsymptote Le premier utilise des splines cubiques comme eacuteleacutement

de base pour deacutecrire les courbes dans un document Cest inteacuteressant mais limitatif

Asymptote de son cocircteacute prend une description complexe mais preacutecise dune courbe et

en deacuteduit un ensemble de splines cubiques quil est possible de placer dans un docushy

ment PDF ensuite Nous en concluons que le bon chemin agrave prendre est probablement

dimpleacutementer comme structure de base des chemins tels que deacutecrits par Asymptote

avec une structure de splines cubiques

Par contre certaines questions theacuteoriques surviennent lors de cette analyse Le grand

problegraveme relegraveve de la puissance dexpression des splines cubiques En effet nous verrons

4

que les splines cubiques sont puissantes mais pas suffisamment puissantes pour deacutecrire

un cercle une forme geacuteomeacutetrique pourtant extrecircmement simple Nous verrons par contre

par la suite quil est possible de deacutecrire ce mecircme cercle avec des splines cubiques avec

une preacutecision acceptable pour la creacuteation de documents papier malgreacute son inexactitude

Afin dadapter la hieacuterarchie un langage dimpleacutementation a ducirc ecirctre choisi Eacutetant donneacute

les contraintes de temps il fucirct deacutecideacute de reacuteutiliser un langage de description de diashy

grammes deacutejagrave existant Asymptote Lutilisation de ce langage nous permet dobtenir

des primitives simples et un accegraves agrave Jb1EX deacutejagrave deacutetermineacute ce qui diminue de beaucoup la

charge de travail De plus Asymptote nous permet de creacuteer nos images reacutesultantes dans

les formats Postscript (Adobe Systems Incorporated 2010a) et PDF (Adobe Systems

Incorporated 2010b) sans avoir agrave reacutealiser nous-mecircmes du code de tregraves bas niveau

Eacutevidemment si Asymptote fournissait tout ce dont nous avions besoin nous naurions

pas besoin dutiliser autre chose Par contre cest un langage baseacute sur les structures

(Hammerlindl Bowman et Prince 201Ob) au lieu des objets Cela implique que notre

hieacuterarchie ne peut ecirctre construite agrave laide de lheacuteritage objet Eacutetant donneacute la complexiteacute

que cela engendrerait un langage suppleacutementaire doit-ecirctre utiliseacute pour-la creacuteation de

la hieacuterarchie Cela nous amegravene donc agrave choisir Java (Oracle 2010) Une recherche de la

compagnie TIOBE considegravere Java comme eacutetant le langage le plus utiliseacute au moment de

la preacutesente reacutedaction (TIOBE Software 2008)

Avant de consideacuterer le deacuteveloppement dun nouveau langage la premiegravere chose agrave faire

consiste agrave consideacuterer ce agrave quoi nous voulons quil ressemble Afin de reacutealiser cette eacutetape

nous avons analyseacute notre base de diagrammes en donnant une description la plus proche

possible dun langage de programmation En simplifiant chaque description autant que

possible nous avons pu extraire quelques concepts de base importants pour la descripshy

tion de nos diagrammes De plus certaines contraintes suppleacutementaires peuvent ecirctre

ajouteacutees qui deacutependent plus de limpleacutementation que de la theacuteorie En quelque sorte

il faut pour reacutealiser notre projet nous baser sur des technologies qui ont fait leurs

preuves

5

Afin de deacutevelopper notre langage il nous faut des concepts pour le deacutecrire Cela sefshy

fectue agrave laide de la theacuteorie des langages et des automates Plus particuliegraverement nous

utiliserons les grammaires afin de faccedilonner un langage qui convient agrave nos besoins tout en

eacutetant simple agrave analyser par un programme informatique agrave laide dun logiciel speacutecialiseacute

SabieCC (Gagnon 1998) Nous verrons que les grammaires nous permettent de deacutecrire

complegravetement notre langage afin decirctre analyseacute par ordinateur

Une fois que nous avons notre langage final il ne reste plus quagrave veacuterifier les reacutesultats

obtenus Afin de boucler la boucle nous avons reacutealiseacute la programmation de chacun des

diagrammes que nous avions choisis au deacutepart pour notre base de tests Une fois ceuxshy

ci reacutealiseacutes il ne restait plus quagrave analyser les diffeacuterences entre les deux et voir si les

reacutesultats obtenus eacutetaient satisfaisants Cela nous permet de deacutemontrer quil sagit dune

solution naturelle et efficace eacutetant donneacute que nous pouvons creacuteer les objets de notre

domaine pour produire des diagrammes de grande qualiteacute

Le reste de ce meacutemoire est structureacute comme suit Le chapitre 1 expose la probleacutematique

et les objectifs rechercheacutes Le chapitre 2 introduit la creacuteation de notre solution inforshy

matique et plus speacutecifiquement de la hieacuterarchie objet Le chapitre 3 deacutecrit la theacuteorie

matheacutematique derriegravere la description de courbes et segments par ordinateur Le chapitre

4 expose les dessous de la theacuteorie des langages que nous utilisons afin de creacuteer SOOL

Le chapitre 5 expose la creacuteation du langage au-dessus de la hieacuterarchie Finalement le

chapitre 6 analyse le reacutesultat final afin de voir si le tout reacutepond aux objectifs deacutefinis au

deacutepart

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CHAPITRE l

PROBLEacuteMATIQUE ET OBJECTIFS

Dans ce chapitre nous nous eacutetendrons sm une deacutefinition correcte et complegravete de la

probleacutematique ainsi que sur les objectifs que nous souhaitons atteindre Nous verrons

aussi une analyse des solutions qui existent deacutejagrave et les raisons qui nous poussent agrave

deacutevelopper notre propre solution Finalement nous deacutefinirons une base de diagrammes

aptes agrave repreacutesenter adeacutequatement nos objectifs

11 Description de la probleacutematique

111 Les notes de cours une mise en contexte

Ce projet fut motiveacute principalement par la reacutedaction de notes de cours En effet

dans un milieu universitaire (particuliegraverement pour les eacutetudiants au baccalaureacuteat mais

eacutegalement pour les eacutelegraveves de cycles supeacuterieurs) il est extrecircmement utile de pouvoir

utiliser des notes de cours de quali teacute

La creacuteation de notes de cours adapteacutees vient tout de mecircme avec quelques problegravemes

Premiegraverement surtout en informatique la plupart des livres sont eacutecrits en anglais Cela

implique souvent de devoir eacutecrire nos propres versions sous la forme de notes de cours

De plus linformatique est un domaine qui eacutevolue agrave un rythme fulgurant Cela implique

que des notes adeacutequates et adapteacutees doivent ecirctre agrave jour Comme certains eacuteleacutements en

informatique peuvent eacutevoluer agrave chaque anneacutee voire plus vite il faut ecirctre capable deacutecrire

extrecircmement rapidement des textes si nous souhaitons quils soient utiles un tant soit

8

peu

Cela nous amegravene agrave notre probleacutematique principale plusieurs cours neacutecessitent un supshy

port plus complexe que simplement des mots agrave savoir des dessins et des diagrammes

voire des animations Cela est requis dans plusieurs cours en informatique theacuteorique

particuliegraverement dans leacutetude des structures de donneacutees et des algorithmes Il nous faut

donc une meacutethode rapide et efficace pour creacuteer des diagrammes agrave placer dans nos notes

de cours

112 Domaine dapplication eacutelargi

Bien eacutevidemment cibler purement les notes de cours et les structures de donneacutees nest

quun point de deacutepart Nous pouvons eacutelargir notre domaine dapplication agrave des diashy

grammes structureacutes cest-agrave-dire un dessin qui possegravede une structure sous-jacente crushy

ciale au point de pouvoir necirctre deacutecrit quagrave partir de cette structure Par exemple

un graphe est un ensemble de sommets eacutetiqueteacutes relieacutes ensemble par des flegraveches Tout

dessin de graphe est donc un dagramm~ selon notye deacutefiniton Dun_autre cocirct~ une

peinture possegravede parfois une structure mais celle-ci est largement insuffisante pour

deacutecrire loeuvre Par exemple pertgtonne noserait deacutecrire un Picasso comme eacutetant un

amas de cercles et de carreacutes de diffeacuterentes couleurs

Lensemble des structures que nous visons se rapporte donc essentiellement agrave deux

domaines linformatique theacuteorique et les matheacutematiques discregravetes Linformatique

theacuteorique est surtout deacutefinie par les structures de donneacutees et les algorithmes (et tout

sujet sy reliant) Les matheacutematiques discregravetes sont surtout deacutefinies par la theacuteorie des

graphes et la combinatoire Nous neacutegligeons ici volontairement les matheacutematiques contishy

nues pour deux raisons La premiegravere est quune structure de taille infinie peut souvent

ecirctre repreacutesenteacutee par une structure finie (donc discregravete) La seconde est que les besoins

en matheacutematiques continues sont largement diffeacuterents des besoins en matheacutematiques

discregravetes En effet dessiner le graphe dune fonction de deux variables est un sujet comshy

plexe mais totalement diffeacuterent de creacuteer un graphe Afin de rendre nos besoins plus

9

speacutecifiques nous eacuteviterons ce genre de dessins qui possegravedent deacutejagrave de nombreux logiciels

pour les reacutealiser (entre autres Maple) (Maplesoft 2010)

12 Description des objectifs rechercheacutes

La premiegravere partie de notre travail consiste agrave deacutecrire les objectifs que nous souhaitons

atteindre dans notre creacuteation de diagrammes En effet plusieurs paramegravetres importants

peuvent ecirctre utiliseacutes Il est donc important de ne pas perdre de vue lensemble tout en

donnant la prioriteacute agrave certains eacuteleacutements

121 Inteacutegration avec ~IEX

Ib1EX est un langage de description de documents texte Creacuteeacute agrave lorigine sous la forme

de TEX par Donald Knuth (Knuth 1984) puis modifieacute par Leslie Lamport (Lamport

et Bibby 1986) celui-ci est rapidement devenu un standard dans la reacutedaction darticles

scientifiques dans plusieurs domaines Bien quutiliseacute surtout pour la reacutedaction darticles

il a eacuteteacute preacutevu au deacutepart pour la reacutedaction de livres Il se distingue par sa capaciteacute agrave

creacuteer aiseacutement du contenu matheacutematique et le fait de soccuper du contenu en laissant

le logiciel soccuper de la mise en page du texte Il est si populaire que de nombreux

meacutemoires incluant celui-ci sont eacutecrits agrave partir de Ib1EX

Eacutetant donneacute que le monde des matheacutematiques et de linformatique theacuteorique utilise

abondamment Ib1EX il est important quun logiciel de creacuteation de diagrammes pershy

mette de lutiliser En effet si notre objectif est de creacuteer du contenu de qualiteacute professhy

sionnelle il faut que les polices soient constantes au travers de notre article (ou de nos

notes de cours) Naturellement plusieurs diagrammes vont contenir du texte Il faut

donc pour ecirctre consistant geacuteneacuterer ce texte avec Ib1EX afin davoir une forme standard

pour lensemble du document De plus il est tout agrave fait possible de vouloir mettre des

symboles matheacutematiques dans un diagramme (par exemple un symbole dinteacutegrale) Si

le texte est geacuteneacutereacute avec Ib1EX cela vient automatiquement Sinon il devient tregraves difficile

dobtenir un texte de belle qualiteacute Il sagit donc dun besoin primordial

10

122 Description de structures

Un autre eacuteleacutement extrecircmement important que nous recherchons est de pouvoir faire

adeacutequatement la description de diffeacuterentes structures Eacutetant donneacute que les diagrammes

sont composeacutes de structures il faut pouvoir en creacuteer aiseacutement et les relier de maniegravere

aiseacutee Cela implique quelques petites contraintes entre autres de pouvoir utiliser des

variables pour conserver les structures en question Ideacutealement la solution la plus solide

en terme de description de structures utiliserait lorienteacute-objet Une des composantes

les plus importantes dune solution orienteacutee objet est la preacutesence dune hieacuterarchie de

classes dobjets

123 Hieacuterarchie solide et extensible

Un objectif que nous recherchons est que le langage nous fournisse une hieacuterarchie dobshy

jets (ou de structures) de qualiteacute afin de pouvoir creacuteer une grande quantiteacute de diashy

grammes agrave partir deacuteleacutements de cette hieacuterarchie Une hieacuterarchie peut ecirctre deacutecrite comme

eacutetant une structure permettant dinteacutegrer facilemen~ de nouveau~ aspects sans_avoir agrave

dupliquer inutilement du code Il serait aussi important quelle puisse ecirctre eacutetendue si cershy

tains eacuteleacutements suppleacutementaires sont neacutecessaires Par exemple il pourrait ecirctre inteacuteressant

pour des gens en geacutenie eacutelectrique de pouvoir faire des diagrammes eacutelectriques malgreacute

le fait que cela ne fait pas partie de nos contraintes de deacutepart Cela pourrait ecirctre ajouteacute

par extension du systegraveme

124 Objectifs moindres

Gestion des erreurs

Dans des notes de cours il est freacutequent davoir des diagrammes Par contre eacutecrire

un diagramme peut saveacuterer plus compliqueacute que deacutecrire du texte Comme plusieurs

utilisateurs potentiels ne seront pas des experts du systegraveme il faut que les erreurs soient

deacutetecteacutees et traiteacutees de maniegravere adeacutequate Cela assure agrave lutilisateur final une expeacuterience

11

plaisante en speacutecifiant les erreurs quil commet et des meacutethodes pour les reacuteparer Sil

faut que lutilisateur cherche pendant des heures pour trouver la petite erreur quil a

commise il va tout simplement cesser dutiliser le logiciel

Langage fluide et clair

Bien que moins important le fait davoir un langage clair est excellent pour attirer les

utilisateurs vers ce systegraveme En effet si le langage est un gribouillis incompreacutehensible il

sera fort probablement dur dapprentissage et difficile agrave aborder Par fluide et clair nous

entendons que le langage soit jusquagrave un certain point compreacutehensible pour quelquun

qui ne connaicirct pas le systegraveme

Qualiteacute de la documentation et courbe dapprentissage

Finalement il faut quune documentation existe et quelle soit complegravete De preacutefeacuterence

une bonne documentation contiendra un reacutepertoire de toutes les fonctionnaliteacutes mais

aussi des tutoriels avec des exemples codeacutes de cas standards Cela incite les utilisateurs

agrave essayer le logiciel en prenant un exemple et en ladaptant agrave leurs besoins Cela amegravene

(avec les autres objectifs) agrave un langage simple dapprentissage mais tout de mecircme

puissant Comme notre objectif est de trouver une solution simple il faut que nimporte

qui puisse commencer agrave sen servir rapidement sans avoir besoin de lire lensemble de

la documentation

13 Analyse des solutions existantes

Naturellement une fois que nous savons ce que nous recherchons il nous faut analyser

toutes les solutions qui existent deacutejagrave Cela nous permettra didentifier une solution qui

est deacutejagrave fonctionnelle ou au mieux une qui pourra ecirctre eacutetendue ou utiliseacutee afin de

simplifier le travail de creacuteation si besoin est Au minimum nous pourrons extraire les

concepts inteacuteressants de chaque solution et voir sil est possible de les inteacutegrer agrave notre

solution

12

131 Paquets f1TEX standards

Eacutetant donneacute limportance de lutilisation de JbIEX les premiegraveres solutions sont celles

disponibles agrave linteacuterieur mecircme de fbIEX Celles-ci sont appeleacutees des paquets Plusieurs

paquets diffeacuterents existent et bon nombre dentre eux sont des solutions bricoleacutees et

donc incomplegravetes

Dans les solutions inteacuteressantes on note premiegraverement la preacutesence de la commande

picture Celle-ci a eacuteteacute ajouteacutee dans TEX par Donald Knuth comme tme solution agrave tout

oubli potentiel dans son systegraveme Cette commande prend du texte quelconque et le passe

par la suite au pilote qui compile le document Cela permet entre autres de transfeacuterer

des informations au pilote qui compile en Postscript et permet donc lutilisation de toute

la force de Postscript dans la reacutedaction de dessin Un gros problegraveme de cette solution

est que le texte agrave eacutecrire deacutepend du pilote utiliseacute limitant de beaucoup son utilisation

Il est tout de mecircme devenu la base de nombreux paquets qui se servent de Postscript

Plusieurs solutions ont aussi eacuteteacute deacuteveloppeacutees pour toutes sortes de domaines On retrouve

entre autres des-diagrammes de-Peynmann et deuml Lewis (feyn et-lewis) des dia-grammes

de flots (nassflow) et des arbres linguistiques (xyling rst qtree et lingtrees)

Naturellement ces solutions ne conviennent pas car elles sont pour des domaines trop

speacutecifiques par rapport agrave notre objectif

Une solution dun domaine plus geacuteneacuteral qui se deacutemarque est le paquet PSTricks (Van

Zandt 1993a) Creacuteeacute en 1993 par le professeur Timothy Van Zandt celui-ci est devenu

tregraves populaire au fil des anneacutees eacutetant donneacute les nombreuses possibiliteacutes qui existent en

Postscript Un des grands avantages est sa documentation qui est tregraves prolifique et tregraves

claire (Van Zandt 1993b)

Cela est bien inteacuteressant mais malheureusement PSTricks souffre du mecircme problegraveme

que chaque paquet interne agrave JbTEXmiddot Il est fait agrave partir de macros En effet TEX a eacuteteacute eacutecrit

complegravetement agrave partir de macros Il sagit dlm meacutecanisme de remplacement textuel ougrave

lon deacutefinit une entreacutee et toutes les occurrences de cette entreacutee sont remplaceacutees par une

13

sortie bien speacutecifique Comme une macro est toujours remplaceacutee par son contenu avant

decirctre analyseacutee plus en deacutetail toute forme derreur se retrouve agrave un niveau extrecircmement

bas Cela fait que nimporte quelle erreur est quasi impossible agrave cerner correctement

rendant le travail de lutilisateur qui souhaite apprendre tregraves complexe De plus le fait

de fournir le Postscript directement agrave lutilisateur rend celui-ci tregraves puissant mais tregraves

dangereux Finalement bien que de nombreuses formes soient disponibles il nexiste

pas de hieacuterarchie en tant que telle dans PSTricks ce qui le rend impossible agrave eacutetendre

132 )(J(-pic

Une autre solution inteacuteressante peut ecirctre retrouveacutee agrave linteacuterieur de gTEX Il sagit

de XV-pic un paquet eacutecrit par Kristoffer H Rose (Rose et al 2010) Ce paquet

a eacuteteacute creacuteeacute speacutecifiquement pour la description de diagrammes agrave linteacuterieur de gTEX

et possegravede une documentation exhaustive Malheureusement cette documentation est

extrecircmement complexe mecircme pour un utilisateur avanceacute XV-pic utilise principalement

des boicirctes gTEX positionneacutees agrave diffeacuterents endroits afin de creacuteer les diagrammes Ceuxshy

ci sont par la suite relieacutes par diffeacuterents objets puis deacutecoreacutes Cela fournit un reacutesultat

final de qualiteacute XV-pic possegravede entre autres un mode pour creacuteer des diagrammes en

positionnant les eacuteleacutements dans une matrice Cela rend les dessins plus simples concepshy

tuellement mais pas toujours positionneacutes adeacutequatement XV-pic permet aussi de faire

du positionnement relatif agrave dautres objets ce qui peut ecirctre tregraves pratique Comme nous

pouvons le voir dans lexemple suivant XV-pic est tregraves pratique dans les reacutesultats quil

nous permet dobtenir mais sa syntaxe laisse de beaucoup agrave deacutesirer

Par contre les deacutefauts de XV-pic sont extrecircmement visibles En premier lieu la syntaxe

du langage est extrecircmement difficile agrave comprendre car elle est baseacutee sur la composition

de nombreux caractegraveres speacuteciaux De plus comme il sagit dun paquet gTEX le tout

est impleacutementeacute agrave laide de macros et rend donc la recherche derreur laborieuse (surshy

tout lorsquon prend en compte la syntaxe deacutejagrave difficile agrave utiliser) Cela rend XV-pic

inapte agrave lutilisation par quelquun qui ne souhaite pas investir trop de temps dans son

apprentissage Finalement les nombreux modes de dessins sont souvent incompatibles

14

xymatrix U ar_[ddr]_y ar-[drr]-x

argt[dr] I-(xy) amp X times_Z y ar[d]-q ar[r]_p amp X ar[d]_f amp y ar[r]-g

amp Z

Figure 11 Code XY-pic pour un diagramme

Figure 12 Diagramme reacutesultant du code XY-pic

entre eux et ne peuvent souvent pas ecirctre utiliseacutes dans un mecircme dessin

133 Metapost

Eacutetant donneacute le problegraveme commun agrave tous les paquets agrave linteacuterieur de JgEX la solution la

plus logique serait dessayer den sortir Cela a donneacute le logiciel Metapost (Hobby 1992)

Celui-ci a eacuteteacute inspireacute de Metafont (Knuth 1986) que Knuth a utiliseacute pour dessiner des

polices pour EX Une des grandes avanceacutees du langage est la description de courbes

Celui-ci reacuteutilise un algorithme de Knuth qui permet de deacutecrire des courbes tout en

en controcirclant les diffeacuterents paramegravetres De plus comme le logiciel nest pas reacutedigeacute en

macros il permet de deacutetecter de maniegravere adeacutequate les erreurs de lusager Nous pouvons

deacutejagrave voir dans le code fourni en exemple quil sagit dun langage beaucoup plus clair

que XV-pic

15

beginfig(l)

pair A B C A=(OO) B=(lcmO) C=(Olcm) draw A--B--C--cycle

endfig

Figure 13 Code Metapost pour dessiner un triangle

Figure 14 Diagramme reacutesultant du code Metapost

Par contre quelques problegravemes se deacutegagent de Metapost Premiegraverement le langage ne

permet pas limpleacutementation dune hieacuterarchie solide Cela ne serait pas un problegraveme sil

en existait deacutejagrave une mais ce nest pas le cas En effet les diagrammes ont fait lobjet

dune extension du langage mais rien de tregraves deacuteveloppeacute Il est donc faisable de faire

des diagrammes mais il ne sagit pas neacutecessairement dune solution agrave toute eacutepreuve

De plus comme toutes les coordonneacutees du langage sont donneacutees en valeur absolue cela

limite les possibiliteacutes du langage (entre autres en ne pouvant utiliser des points deacutefinis

par des objets)

134 Asymptote

Une autre possibiliteacute se retrouve dans le logiciel Asymptote qui se deacutefinit comme eacutetant

Wl langage inspireacute de Metapost (Hammerlindl Bowman et Prince 2010b) Il est donc

aussi externe agrave g1EX mais aussi inspireacute du langage de programmation CH Cela lui

confegravere la creacuteation de structures avanceacutees et la creacuteation de fonctions complexes De

plus une documentation exhaustive et un traitement des erreurs de qualiteacute en font une

solution robuste

Malheureusement comme Metapost Asymptote pose quelques problegravemes En effet ce

16

size(3cm) draw(unitsquare) labelC l $A$ (00) SW)

labelC $B$ Cl 0) SE) label ($C$ Cl 1) NE)

label ($0$ (01) NW)

Figure 15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin

( )

il

Figure 16 Diagramme reacutesultant du code Asymptote

logiciel fut eacutecrit avec les matheacutematiques continues et la geacuteomeacutetrie comme domaine

dutilisation Ce nest pas Lill problegraveme en tant que tel (Asymptote le fait tregraves bien)

mais cela fait que la- creacuteation de diagrammes discrets nest pas vraiment deacuteveloppeacutee

Il faudrait donc ecirctre capable de creacuteer une hieacuterarchie de structures pour la creacuteation de

diagrammes Eacutetant donneacute le support des structures posseacutedant des fonctions internes il

devrait ecirctre possible dajouter cette possibiliteacute agrave Asymptote

Malheureusement ce nest pas preacutesentement reacutealisable agrave linteacuterieur du langage En efshy

fet Asymptote est un langage baseacute objet Cela signifie quil possegravede des structures qui

ressemblent agrave une description typique dun objet mais pas toutes les proprieacuteteacutes imshy

portantes qui se rattachent agrave un langage agrave objets standard comme Java ou C++ Plus

particuliegraverement cest labsence de polymorphisme qui cause problegraveme En effet la

creacuteation dune hieacuterarchie implique de creacuteer des liens entre les diffeacuterentes structures Par

exemple un cercle un triangle et un nuage sont toutes des formes avec certaines proshy

prieacuteteacutes similaires Il nous faut donc avoir des fonctions qui prennent des formes comme

paramegravetres Si nous avons une fonction f qui prend une forme nous souhaiterions eacutecrire

une seule fonction

17

fCforme)

Malheureusement en Asymptote il faudrait eacutecrire une fonction pour chaque forme

distincte comme cela

fCcercle)

fCcarre)

fCnuage)

Cela rend la creacuteation dune hieacuterarchie extrecircmement difficile car pour chaque fonction

utilisant un objet plus geacuteneacuteral il nous faut eacutecrire plusieurs fois cette fonction De plus

cela rend lexpansion par lusager de la hieacuterarchie essentiellement impossible car il doit

rajouter des cas pour chaque fonction deacutefinie preacuteceacutedemment en plus dajouter son nouvel

objet dans la hieacuterarchie Cela est difficilement souhaitable

135 Conclusion de lanalyse

Afin den venir agrave une conclusion adeacutequate il faut se ramener aux objectifs rechercheacutes

Cela nous permet de rapidement eacuteliminer les solutions internes agrave Ib-TEX eacutetant donneacute

la complexiteacute de la gestion des erreurs (et indirectement la courbe dapprentissage du

langage) Cela nous laisse comme solution Metapost et Asymptote Naturellement le

langage Asymptote est plus eacutevolueacute que celui de Metapost et fournit des eacuteleacutements de

programmation plus inteacuteressants Cela implique donc quil nous permet plus aiseacutement

de construire nos structures tant deacutesireacutees

Par contre Asymptote ne fournit pas une solution suffisante eacutetant donneacute quil ne possegravede

pas une hieacuterarchie dobjets adapteacutee aux diagrammes De plus eacutetant donneacute que le langage

est baseacute objet il sera beaucoup trop compliqueacute dy implanter une hieacuterarchie Nous en

venons donc agrave la conclusion que le mieux serait dutiliser Asymptote qui nous fournit un

ensemble de services complexes (impleacutementation des chemins liens avec Ib-TEX etc )

et de limpleacutementer avec un langage de plus haut niveau

18

Java devient un choix inteacuteressant pour cette tacircche En effet cest un langage connu dans

lindustrie et simple dapprentissage Il sagit dun langage de programmation objet qui

nous permettra agrave coup sucircr dimpleacutementer une hieacuterarchie solide Par contre ce langage

possegravede quelqu~s petits problegravemes comme un tregraves haut niveau de verbositeacute et beaucoup

deacuteleacutements non requis pour la description de diagrammes

Nous en sommes donc venus agrave la conclusion que la meilleure solution serait dutiliser

Java mais dimpleacutementer par-dessus celui-ci un langage deacutedieacute qui eacuteliminerait tout ce

qui nest pas requis pour la description des diagrammes Nous appellerons ce langage

SDDL pour Structured Diagram Description Language

Concepts inteacuteressants agrave conserver

Avant de penser agrave concevoir notre logiciel il serait bon de voir quels eacuteleacutements nous

souhaitons conserver des solutions existantes Agrave cette fin leacuteleacutement le plus inteacuteressant

provient de XV-Pic En effet il permet de relier des objets entre eux par des flegraveches

dune maniegravere relativement simple Il serait donc inteacuteressant de pouvoir permettre de

deacutecrire des liens entre diffeacuterents objets par des points speacutecifiques agrave chacun dentre eux

De plus lalgorithme de description de chemins utiliseacute par Metapost et Asymptote est

extrecircmement efficace et utile et pourrait donc ecirctre utiliseacute directement par notre langage

Cela sera simple agrave impleacutementer eacutetant donneacute que nous souhaitons utiliser Asymptote pour

compiler vers Postscript

14 Diagrammes repreacutesentatifs du domaine

Finalement avant de pouvoir commencer agrave deacutefinir les besoins de notre hieacuterarchie il

nous faut obtenir une deacutefinition valide et complegravete de notre domaine Naturellement

il nest pas eacutevident de trouver une deacutefinition concregravete et objective dun diagramme en

informatique theacuteorique Nous devons donc nous rabattre sur une autre solution qui doit

tout de mecircme ecirctre la plus formelle possible

19

141 Lapproche de Knuth

Pour trouver une ideacutee nous nous ramegravenerons agrave la meacutethode que Donald Knuth a utiliseacutee

lorsquil a creacuteeacute TEX En effet il souhaitait creacuteer un logiciel qui ferait de laquo beauxraquo doshy

cuments Cela eacutetant un terme tregraves subjectif Knuth deacutecida de se deacutefinir un ensemble

de journaux scientifiques dont les publications eacutetaient du plus haut standard de qualiteacute

pour leacutepoque (Knuth 1999) Apregraves avoir obtenu ces diffeacuterents exemples il put saffairer

agrave essayer de reproduire une solution de cette qualiteacute Il devient donc eacutevident agrave la fin

du cycle de deacuteveloppement du logiciel que sa solution eacutetait coheacuterente et valide car elle

permettait dobtenir un reacutesultat de qualiteacute en comparaison agrave ce que nous pourrions

deacutejagrave deacutefinir comme eacutetant de qualiteacute

Nous pouvons donc chercher agrave suivre la mecircme meacutethode Afin de la respecter nous devons

trouver quelques livres dun haut niveau de qualiteacute et prendre certains diagrammes

que lon retrouve agrave linteacuterieur Cela nous permettra de retrouver les eacuteleacutements les plus

cruciaux de notre domaine

Plusieurs livres inteacuteressants soffrent agrave nous nous utiliserons entre autres laquo The Art

of Computer Programming raquo de Donald Knuth (Knuth 1968) Il est naturel quun des

livres les plus connus en informatique eacutecrit par Knuth de surcroicirct possegravede un haut

standard de qualiteacute Un autre livre important est le laquo livre du dragonraquo (Aho Sethi et

Ullman 1986) qui eacutetudie la theacuteorie de la compilation et est extrecircmement connu dans

son domaine De plus celui-ci renferme leacutetude de nombreuses structures de donneacutees ce

qui nous fournit de nombreux diagrammes de qualiteacute Finalement il existe aussi un livre

tregraves connu dans leacutetude des algorithmes (ce qui est aussi extrecircmement lieacute agrave leacutetude des

structures de donneacutees) qui sappelle laquo Introduction to Algorithmsraquo (Cormen et al

2001) Ces trois livres forment une base extrecircmement connue et de qualiteacute pour nos

diagrammes Nous avons extrait quinze (15) diffeacuterents diagrammes de ces livres

20

142 Description des exemples et des concepts preacutesents dans les diagrammes

Les diffeacuterents diagrammes que nous avons seacutelectionneacutes repreacutesentent diffeacuterentes strucshy

tures de donneacutees On y retrouve plusieurs arbres et graphes Les graphes sont de plushy

sieurs types allant dun graphe standard agrave des graphes dexeacutecution De plus certaines

structures preacutesentes plus rarement se retrouvent dans notre ensemble Entre autres on

retrouve un diagramme de Venn qui bien que conceptuellement simple est toujours

relativement complexe lorsque nous souhaitons le reacutealiser avec un logiciel On retrouve

aussi des arbres linguistiques qui ne sont pas neacutecessairement complexes mais surtout

longs agrave reacutealiser

Cet ensemble de diagrammes nous permet de couvrir lensemble des structures de

donneacutees importantes en informatique theacuteorique et en matheacutematiques discregravetes Il existe

dautres structures de donneacutees mais celles-ci peuvent toujours ecirctre impleacutementeacutees seacutepashy

reacutement eacutetant donneacute que nous souhaitons faire une hieacuterarchie aiseacutement extensible Nous

remarquons surtout dans nos exemples quun des eacuteleacutements les plus importants est de

pouvoir r~lier convenablement les_diffeacuterents eacuteleacutements (dans un graphe par exemple)

Comme il sagit de quelque chose qui est toujours preacutesent il sagira dun des points les

plus importants agrave deacutevelopper pour notre hieacuterarchie

CHAPITRE II

STRUCTURE ET SOLUTION INFORMATIQUE

Afin de deacutevelopper un produit qui convient agrave nos besoins nous aurons besoin quil soit

structureacute adeacutequatement Cela implique principalement la construction de la hieacuterarchie

dobjets du domaine Il faut deacuteterminer quels sont les eacuteleacutements rechercheacutes dans notre

solution trouver une meacutethode de deacuteveloppement formelle et adeacutequate puis la reacutealiser

correctement Cela assurera une solution de qualiteacute

21 Objectifs dune structure dans une solution informatique

En premier lieu il nous faut justifier le besoin dune meacutethode de deacuteveloppement forshy

melle et solide En effet lin logiciel en informatique est tregraves diffeacuterent dun problegraveme

matheacutematique standard Une deacutemarche matheacutematique se ramegravene agrave un concept bien

connu la preuve Cela reurond la reacutesolution du problegraveme creacutedible agrave condition que la

preuve soit bonne Par contre nous verrons quun problegraveme informatique ne peut ecirctre

reacutesolu agrave laide dune simple preuve

211 Les diffeacuterentes composantes dune solution informatique

Une solution agrave un problegraveme informatique possegravede diffeacuterents eacuteleacutements Chacun dentre

eux possegravedent un certain degreacute de formalisme qui affecte lensemble de la solution

22

Algorithmes

Les algorithmes sont les eacuteleacutements les plus formels dune solution informatique On peut

dire quils se ramegravenent agrave la partie matheacutematique dun problegraveme informatique en quelque

sorte Composeacute dune seacuterie dopeacuterations aux comportements bien deacutefinis le reacutesultat dun

algorithme est preacutevisible Eacutetant donneacute la possibiliteacute de preacutevoir le comportement dun

algorithme agrave partir de ses entreacutees il est possible de deacutemontrer que lalgorithme fournit

exactement les reacutesultats rechercheacutes Il suffit en effet de prouver que agrave chaque entreacutee

possible on obtient la sortie qui serait logiquement attendue de lalgorithme On peut

penser par exemple agrave un algorithme de tri qui pour chaque ensemble de nombres

retourne les nombres en ordre croissant

Malgreacute tout un algorithme en informatique nest pas parfait En effet si le temps

dexeacutecution dun algorithme pour des entreacutees standards est beaucoup trop eacuteleveacute il ne

sera pas utiliseacute peu importe quil donne le bon reacutesultat Le temps dopeacuteration et la

quantiteacute despace meacutemoire sont les deux principales contraintes qui entrent en ligne de

compte pour les diffeacuterents algorithmes dune solution informatique

Solutions technologiques

Lautre partie extrecircmement importante de tout logiciel informatique est le choix des

technologies utiliseacutees En effet les programmes informatiques ne sont pas directement

creacuteeacutes agrave partir de circuit eacutelectriques Chaque couche dabstraction suppleacutementaire (cirshy

cuits logiques code assembleur programmation de haut niveau) limite les possibiliteacutes

du programmeur et vient avec certains avantages et certains inconveacutenients Le fait de

ne pas utiliser une solution deacutejagrave existante peut permettre une solution plus puissante

mais agrave un coucirct de deacuteveloppement potentiellement beaucoup plus eacuteleveacute Il est aussi posshy

sible avec un certain ensemble de choix technologiques de ne pas pouvoir obtenir un

effet rechercheacute dans une solution Cela explique pourquoi nous avons deacutecideacute dutiliser

Asymptote Il nous fournit un accegraves agrave JbTEX deacutejagrave codeacute ainsi quune traduction comshy

plexe vers un fichier image Postscript La reacutealisation de ces diffeacuterents eacuteleacutements de

23

code aurait significativement augmenteacute la complexiteacute de notre tacircche

Imperfection de toute solution informatique

Eacutetant donneacute les limitations des outils technologiques agrave notre disposition nous sommes

obligeacutes de constater que toute solution informatique est imparfaite De plus plusieurs

contraintes donneacutees agrave des systegravemes informatiques sont geacuteneacuteralement vagues et peuvent

ecirctre interpreacuteteacutees diffeacuteremment en fonction de lutilisateur Par exemple nous souhaitons

reacutealiser un outil simple dutilisation mais puissant et extensible Naturellement plus

un langage est puissant plus il devient complexe Un utilisateur peut trouver un outil

tregraves simple alors quun autre le trouvera incompreacutehensible Dautres points comme la

qualiteacute de documentation la courbe dapprentissage et lagestion aiseacutee des erreurs sont

des critegraveres qui possegravedent une bonne part de subjectiviteacute Ce ne sont toutefois pas

neacutecegravessairement de mauvais critegraveres Il faut simplement chercher selon une deacutefinition la

plus proche possible dun utilisateur moyen agrave maximiser les diffeacuterents paramegravetres

Ce genre de contraintes relegraveve geacuteneacuteralement du geacutenie logiciel Bien que ce meacutemoire ne

constitue pas un travail de geacutenie logiciel nous sommes obligeacutes demprunter quelques

eacuteleacutements agrave ce domaine afin dobtenir un reacutesultat adeacutequat

212 Consideacuterations pour une meacutethodologie de deacuteveloppement

Avant de choisir notre meacutethodologie il est bon de veacuterifier les objectifs rechercheacutes dans

lutilisation dune telle meacutethode de deacuteveloppement Cela nous permettra de deacutegager les

eacuteleacutements importants agrave garder en tecircte tout au long du deacuteveloppement de la hieacuterarchie

Un des eacuteleacutements les plus importants est dobtenir une structure efficace pour deacutecrire

nos diagrammes Lautre eacuteleacutement crucial est dobtenir une hieacuterarchie qui repreacutesente

adeacutequatement le domaine De preacutefeacuterence elle doit ecirctre complegravete et dun usage naturel

On entend par lagrave que les eacuteleacutements sont suffisamment preacutecis et proches deacuteleacutements stanshy

dards et connus du domaine que toutes les opeacuterations soient laquo naturellesraquo pour une

personne qui ne connaicirct pas le langage Il nexiste malheureusement pas de mesure pour

24

deacuteterminer si une hieacuterarchie est naturelle ou non Toutefois si chaque section est reacutefleacutechie

de maniegravere formelle le reacutesultat final devrait ecirctre naturel Certaines consideacuterations mishy

neures peuvent ecirctre plus ou moins mesureacutees comme la longueur du code et les noms

adeacutequats de fonctions

22 La programmation orienteacutee-objet

La programmation orienteacutee-objet est un des pheacutenomegravenes tregraves importants en informashy

tique Depuis sa creacuteation elle est devenue de plus en plus populaire eacutetant donneacute la faciliteacute

de deacuteveloppement dans une telle meacutethode Le fait dutiliser une solution orienteacutee-objet

(au contraire de Metapost ou Asymptote) ne sest pas fait de faccedilon arbitraire Il est

donc de mise dexposer les diffeacuterents avantages qui nous ont pousseacutes agrave choisir un tel

paradigme pour notre logiciel

221 Concepts de bases

La structure de base en programmation orienteacutee-objet est naturellement lobjet Celuishy

ci est deacutefini comme eacutetant une structure de donneacutees qui regroupe des donneacutees et des

meacutethodes (Saunders 1989) Bien quil ne sagit pas dun critegravere obligatoire la plushy

part des langages de programmation creacuteent les objets agrave partir dune classe qui deacutefinit

les diffeacuterents champs et meacutethodes preacutesents et leurs effets Les objets forment donc le

minimum requis pour avoir un langage objet

En tant que tel cet ensemble de concepts est assez minimaliste Il existe plusieurs autres

eacuteleacutements qui sont preacutesents agrave un degreacute plus ou moins grand dans les langages agrave objets

Ceux-ci forment donc en quelque sorte la base de la programmation orienteacutee-objet

(Pierce 2002)

- Lencapsulation des donneacutees cest-agrave-dire camoufler les donneacutees dans une structure

speacutecifique (lobjet)

- Lheacuteritage qui permet de deacutefinir un objet comme eacutetant une installce speacutecifique dun

autre objet On peut appliquer le mecircme raisonnement agrave deux classes On dit alors

25

quune classe heacuterite dune classe de base Celle-ci possegravede exactement le mecircme corps

que sa classe de base mais peut rajouter ou modifier certaines proprieacuteteacutes Il sagit

dun des aspects les plus importants dans le deacuteveloppement dune hieacuterarchie

- Le polymorphisme qui nous permet de creacuteer des proprieacuteteacutes qui varient en fonction

des sous-classes Par exemple une classe Nombre pourrait avoir une meacutethode daddishy

tion alors que ses sous-classes Entiegraveres et Reacuteelles redeacutefiniraient cette meacutethode en

fonction de leur impleacutementation speacutecifique Cela nous permet par la suite de prendre

deux nombres et de les additionner peu importe quil sagisse de reacuteels ou dentiers

222 Diffeacuterence avec la programmation baseacutee-objet

Les diffeacuterentes prioriteacutes eacutenumeacutereacutees ci-haut sont les eacuteleacutements de base qui nous permettent

de creacuteer une hieacuterarchie de qualiteacute Il sagit de la raison principale justifiant de ne pas

utiliser Asymptote pour creacuteer la hieacuterarchie En effet celui-ci est un langage baseacute-objet

La diffeacuterence principale est quun langage baseacute-objet ne neacutecessite pas limpleacutementation

de lheacuteritage ou du polymorphisme (Saunders 1989) Asymptote de son cocircteacute possegravede un

heacuteritage de structure minimal mais pas de polymorphisme Cette diffeacuterence est cruciale

car cet eacuteleacutement est neacutecessaire pour la creacuteation dune hieacuterarchie dans des contraintes

acceptables

En effet une chose importante est dajouter des objets dans les diagrammes Par

exemple supposons que nous avons une classe Conteneur Celui-ci doit pouvoir conteshy

nir des Cercles des Carreacutes des Triangles etc Sil fallait eacutecrire une fonction pour

ajouter chacune des formes le travail deviendrait eacutenormeacutement complexe et impossible

agrave eacutetendre pour lusager final Avec le polymorphisme il suffit deacutecrire une fonction qui

permet dajouter une Forme quelconque

23 Meacutethode pour la conceptualisation dune hieacuterarchie

Nous deacutecrirons ici la meacutethode que nous avons utiliseacute Il sagit de DMT (pour Dbj ect

Modeling Technique)

26

231 Origine de la meacutethode

Cette meacutethode fut deacuteveloppeacutee principalement par James Rumbaugh (mais avec laide de

plusieurs personnes) (Rumbaugh et al 1991) en 1991 Celui-ci est principalement connu

comme eacutetant un des auteurs de la norme UML qui est devenu le scheacutema de modeacutelisation

objet standard et utiliseacute par tous les programmeurs objets (Group 1999) Il est agrave noter

que cette meacutethode est une meacutethode danalyse complegravete pour toute la dureacutee de vie du

logiciel Nous naurons par contre besoin que de la partie analyse de cette meacutethode

232 Les diffeacuterentes eacutetapes de conceptualisation

La premiegravere partie de cette meacutethode a deacutejagrave eacuteteacute effectueacutee implicitement lorsque nous

avons rechercheacute nos diagrammes relatifs du domaine Habituellement il est suggeacutereacute

deacutecrire un texte reacutesumant lensemble du domaine mais dans notre cas il est plus

approprieacute de reacutesumer notre domaine avec des diagrammes Par la suite il faut prendre

le temps de faire ressortir les diffeacuterentes classes dobjets qui font parties du domaine et

prendre le temps de bien les deacutefini~middot On eacuteliminera les classes vagues ou redondantes par

la suite

La prochaine eacutetape consiste agrave deacutefinir les diffeacuterentes associations entre les classes Par

exemple une classe Employeacute et une classe Compagnie seraient lieacutees par lassociation

travaille pour Par la suite on identifie les attributs (ou les champs) des diffeacuterentes

classes en eacutevitant les attributs dimpleacutementation Finalement on raffine le modegravele en

ajoutant lheacuteritage des classes Cela permet de simplifier significativement la hieacuterarchie

Cela fournit une hieacuterarchie complegravete de notre domaine Par contre rien ne deacutemontre

quelle est correcte Afin de la veacuterifier il suffit danalyser les diffeacuterents cas typiques de

notre problegraveme regarder le reacutesultat obtenu et relever toute erreur Dans notre cas il

sagit de coder (seulement en terme de la hieacuterarchie) les diffeacuterents diagrammes et veacuterifier

si nous consideacuterons le tout satisfaisant Par la suite nous pourrons reacuteiteacuterer le mecircme

proceacutedeacute jusquagrave obtenir satisfaction Nous serons ainsi assureacutes davoir une hieacuterarchie

27

adapteacutee agrave notre domaine et complegravete

24 Deacuteveloppement de la hieacuterarchie

Maintenant que nous avons une meacutethodologie correcte nous pouvons creacuteer notre hieacutershy

archie Le fait de sassurer de sa compleacutetude nous permettra de ne pas rencontrer de

problegravemes complexes lors de la phase dimpleacutementation du logiciel

241 Extraction des diffeacuterents concepts

Les concepts du domaine (qui se ramegravenent agrave des classes) se divisent en plusieurs cateacuteshy

gories Une des principales est le domaine des formes Une forme peut ecirctre un carreacute

un cercle etc Une autre cateacutegorie importante est formeacutee des points qui peuvent ecirctre

deacutefinis de plusieurs maniegraveres diffeacuterentes Finalement une autre section importante est

formeacutee des structures de conteneurs incluant les Canvas (pour contenir des objets) et

des Drawing (pour reacutefeacuterencer des objets)

Eacutetant donneacute le nombre relativement faible de formes distinctes il ne nous est pas apparu

utile de faire plusieurs cateacutegories de formes distinctes En effet une seacuteparation entre les

courbes fermeacutees et ouvertes peut nous permettre de factoriser un ou deux eacuteleacutements de

code sans toutefois ecirctre significatif ou reacuteellement utile (eacutetant donneacute quil nexiste pas

vraiment de forme standard deacutefinie par une courbe ouverte)

242 Eacuteleacutements particuliers

Plusieurs eacuteleacutements particuliers se sont reacuteveacuteleacutes complexes agrave modeacuteliser dans notre hieacuterarshy

chie Nous abordons ici les principales difficulteacutes rencontreacutees ainsi que les solutions pour

les reacutegler

28

Creacuteation et placement dobjets

Leacuteleacutement le plus important de notre hieacuterarchie est de pouvoir structurer les objets

que nous souhaitons positionner Nous avons donc creacuteeacute une classe Canvas Le nom est

inspireacute du mot canevas en peinture eacutetant donneacute que nous avons apposeacute des restrictions

similaires agrave ce domaine En effet nous avons deacutecideacute que lorsquun objet est placeacute dans

un canevas il ne peut ecirctre enleveacute ou modifieacute Cela nous permettra plus tard de faire

des calculs pour les points de reacutefeacuterence plus aiseacutement De plus un canevas doit pouvoir

posseacuteder des sous-canevas Pour cela il nous faut une classe geacuteneacuterale qui deacutecrit tout

eacuteleacutement pouvant ecirctre ajouteacute dans un canevas

Cela est reacutesolu avec lintroduction dune classe Shape Celle-ci repreacutesente toute forme

qui peut ecirctre dessineacutee quelle soit simple ou complexe Un Canvas est une forme afin

de sassurer de pouvoir positionner des sous-canevas Une implication particuliegravere de

notre choix est quune Shape ne possegravede pas de position Il sagit dune forme abstraite

qui peut ecirctre positionneacutee agrave un certain endroit Cela implique aussi quil est possible de

prendre une Shape et de la placer agrave plusieurs end_roits distincts Lorsquelle est ajouteacutee

dans un Canvas une Shape est copieacutee ce qui empecircche toute modification subseacutequente

de la forme

Objets multiples

Lorsquil sagit de creacuteer des diagrammes freacutequemment il est tregraves probable que plusieurs

eacuteleacutements soient similaires Par exemple si nous creacuteons un arbre avec des cercles comme

sommets il sagit toujours en quelque sorte du mecircme cercle De plus si nous creacuteons

un sous-canevas et que nous le positionnons agrave plusieurs endroits certaines formes deshy

viennent automatiquement deacutedoubleacutes Il devient donc primordial pour nous de pouvoir

reacuteutiliser un eacuteleacutement que nous avons deacutejagrave deacutefini afin deacuteviter la creacuteation agrave reacutepeacutetition

dobjets

Or nous avons deacutejagrave speacutecifieacute quil eacutetait possible de positionner plusieurs fois le mecircme

29

objet Cela est vrai mais il y a une limitation En effet ces objets ne peuvent pas ecirctre

reacutefeacuterenceacutes Si nous souhaitons connaicirctre un objet celui-ci doit pouvoir ecirctre distingueacute

dun autre Il nous faut donc une classe qui repreacutesente une forme agrave un endroit preacutecis

Pour cela nous avons creacuteeacute la classe Drawing Celle-ci permet de repreacutesenter une Shape

agrave un endroit bien preacutecis dans un canevas Cela fait toutefois que les eacuteleacutements dans un

sous-canevas multiple restent identiques Nous verrons bientocirct la solution agrave ce problegraveme

Points de reacutefeacuterence

Un des eacuteleacutements les plus complexes relevait du fait de fournir des points de reacutefeacuterence

En effet faire de simples chemins entre des coordonneacutees en valeurs absolues neacutetait pas

suffisant mecircme sil est possible dadditionner ses points La solution souhaiteacutee eacutetait de

permettre de deacutefinir des points de reacutefeacuterence ceux-ci pouvant ecirctre obtenus agrave partir de

lobjet lui-mecircme Par exemple un cercle pourrait retourner son point nord

Un eacuteleacutement fondamental causait problegraveme la fonction pour acceacuteder au point doit ecirctre

deacutefinie dans la forme (par exemple dans la classe Circle) Par contre une forme en

tant que telle ne possegravede pas de position speacutecifique Par conseacutequent son point nest

pas deacutefini non plus Pour cela il faudrait obtenir un Drawing Par contre un Drawing

ne peut pas posseacuteder la deacutefinition de chaque fonction daccegraves agrave un point pour chaque

forme Cela est contre-intuitif Il faut donc demander agrave la forme lorsquon appelle pour

obtenir un point de prendre le Drawing suppleacutementaire en paramegravetre Notre intention

est lorsque nous eacutecrirons un langage au-dessus de la hieacuterarchie de pouvoir reacutegler ce

problegraveme

Chemins de reacutefeacuterence

Finalement il nous reste un leacuteger problegraveme Nous pouvons maintenant faire une reacutefeacuteshy

rence agrave un objet disons a et obtenir un point speacutecifique de cet objet Par contre cela

nest pas suffisant dans un cas bien preacutecis Disons que a est dans le canevas b Ensuite b

est placeacute agrave deux reprises dans le canevas c obtenant deux Drawing diffeacuterents cl et c2

30

Nous ne pouvons pas acceacuteder agrave a car il est repreacutesenteacute seulement en fonction de b Pour

reacutegler le problegraveme il faut faire un chemin de reacutefeacuterence (disons cl b a dans le langage

final) Pour cela nous fournirons la possibiliteacute de partir dun Drawing et den obtenir

un autre (agrave condition quil sagisse dun Canvas naturellement) Cela va mettre agrave jour

la position relative de lobjet par rapport agrave un niveau de profondeur suppleacutementaire

En acceacutedant agrave cette fonction aussi souvent que neacutecessaire il est possible de reacutefeacuterencer

un objet peu importe son degreacute de profondeur reacuteel Cela nous permet donc de faire

des liens complexes entre nimporte quel objet (voire mecircme des objets de profondeur

diffeacuterentes)

31

CHAPITRE III

EacuteLEacuteMENTS GRAPHIQUES

Dans ce chapitre nous deacutefinissons les eacuteleacutements graphiques requis pour faire des dessins

informatiques dont les courbes de Beacutezier ainsi que les splines cubiques Les proprieacuteteacutes

importantes de ces courbes sont deacutemontreacutees De plus une preuve est fournie de la

possibiliteacute dapproximer adeacutequatement un cercle avec des splines cubiques Finalement

nous discuterons du fonctionnement des diffeacuterentes solutions informatiques en terme de

structure telles que PDF et Asymptote

Courbes et segments en informatique

Naturellement les eacuteleacutements les plus importants dans des dessins informatiques sont les

segments et les courbes Pour des besoins de simpliciteacute nous essaierons de les inteacutegrer

dans la mecircme deacutefinition en traitant les segments comme un cas particulier des courbes

Nous donnons agrave cette courbe geacuteneacuterale le nom de chemin

Le premier problegraveme lorsque nous voulons faire des courbes en informatique est la

meacutethode pour les repreacutesenter Lecirctre humain peut tracer une infiniteacute de courbes disshy

tinctes sans avoir besoin de la deacutecrire avec preacutecision Par contre lorsquon entre dans le

domaine de linformatique il faut non seulement ecirctre capable den faire une description

mais celle-ci doit ecirctre la plus petite possible

Une des meacutethodes de repreacutesentation est sous la forme de pixels (JI et Kelley 2007)

Cette meacutethode implique de repreacutesenter un plan continu par un ensemble de points disshy

32

crets appeleacutes pixels Cela permet de repreacutesenter plusieurs formes de dessins extrecircmement

complexes et est utiliseacute dans certains logiciels dimages

Une autre meacutethode est la meacutethode vectorielle Cest la plus populaire Au lieu de

repreacutesenter directement le dessin tel quil apparaicirct on fournit une description du dessin

agrave partir de quelques concepts tregraves simples (points segments et cercles par exemple)

Lorsque lutilisateur souhaite voir le dessin un logiciel traduit la description en pixels

pour leacutecran

La derniegravere meacutethode possegravede plusieurs avantages La description dun dessin est souvent

beaucoup plus compacte que si on deacutecrit le dessin pixel par pixel De plus la description

conserve la preacutecision du dessin peu importe la reacutesolution agrave laquelle il est preacutesenteacute Par

exemple si nous prenons un ensemble de pixels et quon lagrandit plusieurs fois il est

tregraves probable que nous ayons perdu beaucoup dinformations Il nous faut par contre

veacuterifier la puissance reacuteelle dune telle meacutethode Nous devons donc introduire une des

structures utiliseacutees pour la description vectorielle

32 Courbes de Beacutezier

Une courbe de Beacutezier est un concept relativement simple deacuteveloppeacute indeacutependamment

par Paul de Casteljau et Pierre Beacutezier entre 1959 et 1962 Ces deux personnes avaient

pour objectif de creacuteer des repreacutesentations par ordinateur de voitures pour les compagnies

Citroen et Renault respectivement (Jr et Kelley 2007)

321 Deacutefinition

Soit Po Pl P2 Pn E 1R2 un ensemble de points dans un plan carteacutesien typique

Ceux-ci sont appeleacutes des points de controcircle Soit t E IR et 0 lt t 1 La courbe de

Beacutezier de degreacute n des points Po agrave Pn est deacutefinie par la formule suivante

B t - n ( n

) 1 - t n-ttt

pPohmiddotPn ( ) - ~ i ( ) t (31) t=O

33

Le chemin est deacutefini pour les valeurs entre 0 et 1 de t Cette formule peut sembler

leacutegegraverement arbitraire et complexe pour une forme supposeacutement simple Une seconde

deacutefinition reacutecursive cette fois-ci simplifie beaucoup la formule

322 Deacutefinition alternative

Bp =p (32)

BpOPl Pn(t) = (1 - t)BpOPl Pn-l (t) + tBplhPn (33)

Cette deacutefinition alternative se ramegravene agrave dire quune courbe de Beacutezier est une intershy

polation lineacuteaire entre deux courbes de Beacutezier de degreacute infeacuterieur La deacutemonstration se

ramegravene agrave quelques manipulations bien simples et est laisseacutee en exercice au lecteur

Nous pouvons analyser les formules pour diffeacuterents degreacutes Par exemple une formule de

Beacutezier de degreacute 1 nest quune droite

BPoPl (t) = (1 - t)Po + tP] (34)

Alors quune courbe de degreacute 2 se ramegravene agrave une parabole

(35)

Finalement une courbe de Beacutezier cubique (de degreacute 3) fournit une courbe relativement

complexe qui commence agrave Po et termine agrave P3

--- ---

34

P P

0

P

Po - ____ _ - - P2

Po - - - - - - - - - - - - - - - - - - - - - - - shyPo P2 P3

(a) lineacuteaire (b) quadratique (c) cubique

Figure 31 Courbes de Beacutezier lineacuteaire quadratique et cubique

Eacutevidemment il ny a pas davantages significatifs agrave utiliser une courbe de Beacutezier lineacuteaire

Les courbes de Beacutezier quadratique sont quant agrave elles utiliseacutees lors de la geacuteneacuteration

de police TrueType (Apple Computer Inc 1996) Finalement les courbes de Beacutezier

cubiques sont utiliseacutees dans Postscript (Adobe Systems Incorporated 2010a) et dans la

plupart des produits Jb1EX tel que Metafont (Knuth 1986) Ces logiciels utilisent en

fait une combinaison de courbes de Beacutezier appeleacutees splines que nous verrons dans la

section suivante

323 Proprieacuteteacutes dune courbe de Beacutezier

En regardant les diffeacuterentes courbes nous pouvons aiseacutement voir quelques proprieacuteteacutes

Entre autres il y a interpolation des points de deacutepart et de fin Cela peut se deacutemontrer

aiseacutement en calculant B(uuml) et B(l) qui donne respectivement Po et Pn De plus les

autres points ne semblent pas ecirctre interpoleacutes Il sagit ici dun cas geacuteneacuteral (les points

peuvent ecirctre interpoleacutes sils sont colineacuteaires)

Une autre proprieacuteteacute inteacuteressante des courbes de Beacutezier est son invariance par transforshy

mation affine Cela se ramegravene au theacuteoregraveme suivant Dans le cadre de ce theacuteoregraveme nous

devrons transformer les coordonneacutees des points de controcircles des courbes de Beacutezier en

coordonneacutees projectives homogegravenes Ceci se ramegravene agrave rajouter un axe agrave chacun de nos

points dont la valeur sera toujours 1

35

Theacuteoregraveme dinvariance affine

Soit BpOPl Pn(t) une courbe de Beacutezier Soit M une matrice 3 par 3 repTeacutesentant une

transformation affine Alors on a que la courbe est invari(Lnte par lapplication de M

cest-agrave-dire MBpoPlPn(t) = BMPolvIPl lvIPn(t)

Pour le prouver il suffit de deacutevelopper la formule

NI BpoP1Pn (t) = M t (~) (1 - tt-ieuml Pi 1=0

= tM(~) (1- tt-itiPi 1=0

= t (~) (1- t)n-iti(MPi ) 1=0

Ce theacuteoregraveme implique que pour transformer une courbe de 8eacutezier il suffit dappliquer la

transformation agrave chaque point de controcircle et de calculer une nouvelle courbe de 8eacutezier

Donc une courbe de Beacutezier est entiegraverement deacutefinie par ses points de controcircle Cela fait

quelle est tregraves pratique en informatique car elle ne requiert que peu despace pour la

deacutefinir (ie seulement les n + 1 points de controcircle) De plus il est tregraves simple de geacuteneacuterer

une courbe de Beacutezier car il suffit dutiliser la formule pour autant de valeurs de t que

nous avons besoin de preacutecision dans la courbe En conservant linformation avec cette

meacutethode nous conservons une courbe sans aucune perte dinformation Cela signifie que

nous pouvons agrandir la reacutesolution de la courbe autant que nous le souhaitons et il

sagira toujours dune belle ligne courbe Cette proprieacuteteacute est extrecircmement inteacuteressante

en informatique

36

324 Deacutesavantages des courbes de Beacutezier

Les courbes de Beacutezier sont utiliseacutees dans beaucoup de domaines Par contre elles

possegravedent quelques deacutesavantages peu inteacuteressants Le plus important est probablement

labsence de controcircle local Cela sexprime par le fait que degraves que lon souhaite modifier

une courbe de Beacutezier agrave un endroit particulier tout le reste de la courbe est modifieacute au

passage Cela se deacutemontre par le fait que si 0 lt t lt 1 on a alors que

Cela implique que chaque point de controcircle de la courbe de Beacutezier a une influence (aussi

minime soit-elle) sur lensemble de la courbe Le reacutesultat est que les courbes de Beacutezier

seules sont difficiles agrave utiliser et longues agrave eacutevaluer si on utilise trop de points de controcircle

33 Splines cubiques

La solution agrave ce problegraveme est lutilisation de splines cubiques Lideacutee de base dune spline

est que si une seule courbe cause trop de problegravemes il est probablement mieux dutiliser

plusieurs courbes mais qui fonctionnent seulement dans un domaine plus petit Plus

formellement une spline cubique (aussi appeleacute B-spline cubique) est composeacute de

- un ensemble de valeurs ti pour 0 S i S m - 1 ougrave m repreacutesente le nombre de noeuds

On appelle aussi ces valeurs le vecteur de noeud Les t forment une suite monotone

croissante et sont tous des valeurs reacuteelles entre 0 et l

- L + l points de controcircle

- Une valeur entiegravere n qui repreacutesente lordre de la fonction B-sp1ine Une spline doit

respecter la condition n S m - 2

On deacutefinit une spline par la fonction suivante

37

m-n-2

S(t) = L Pibin(t) tE [01] i=O

ou dans le cas speacutecifique dune spline de degreacute 3

3

S(t) = L Pi bi 3(t) tE [01] i=O

Les bin repreacutesentent les bases de la B-spline (pour Basis Spline) Celles-ci sont deacutefinies

par la fonction reacutecursive suivante

bjoU) ~ sinon

Il sagit dune eacutequation complexe et nous ne nous y attarderons pas trop Quelques

deacutetails sont inteacuteressants agrave noter Entre autre il est inteacuteressant de constater que si lon

utilise n + 1 points de controcircle et que les noeuds sont n noeuds valant zeacutero et n noeuds

valant 1 le B-spline deacutegeacutenegravere en une courbe de Beurozier Il sagit donc dune extension

des capaciteacutes des courbes de Beacutezier

Le problegraveme principal eacutevoqueacute par les courbes de Beacutezier est que lutilisateur lors de

la creacuteation dune courbe manquait de controcircle local Il serait donc inteacuteressant que les

B-splines nous permettent de reacutegler ce problegraveme Lorsquon regarde la deacutefinition de la

base bi on remarque que celle-ci se ramegravene toujours au cas de base qui peut ecirctre aou

1 selon que nous sommes dans un domaine restreint ou non Comme il sagit du seul

facteur de Pi il est naturel daffirmer que le controcirc~e est plus localiseacute quavant Dautres

proprieacuteteacutes inteacuteressantes sont

- Pour tout t la somme de tout les bi(t) est 1

38

C5 C4 C3 -----~---- ----~-----

-----~---- ----~-----

Cg ClO Cn

Figure 32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier

- Un B-spline dordre m sera neacutecessairement Cm - 2 cest-agrave-dire quelle possegravede 2 ordres

de deacuteriyeacutees continues pour son domaine de deacutefinition _

- Tout comme les courbes de Beacutezier les B-splines sont invariants par transformation

affine On peut donc appliquer une courbe en appliquant tout simplement la transshy

formation sur les points de controcircle et en calculant le nouveau B-spline

34 Le cas dun cercle

Avec les outils que nous posseacutedons nous ne sommes pas en capaciteacute de dessiner un

cercle exact Cela nest pas grave eacutetant donneacute que nous pouvons tout de mecircme tenter de

lapproximer Pour ce faire nous utiliserons une spline cubique posseacutedant quatre points

(est nord ouest et sud respectivement) Chaque courbe de Beacute7i~r sera donc identique

aux autres agrave une rotation pregraves Il reste donc agrave deacuteterminer les points de controcircle agrave utiliser

Pour cela prenons le premier quadrant du cercle Nous passons du point Cl (10) agrave

C4 (0 1) Il nous faut deacuteterminer deux points de controcircle C2 et C3 Pour commencer

39

nous pouvons supposer de maniegravere tout agrave fait arbitraire que C2 se situe sur la tangente

de Cl et C3 sur la tangente de C4 Cela nous donne donc le scheacutema suivant

C4 C3 ----- ----~-----

1

1

1

1

TC2 1

1

1

i

Figure 33 Quart de cercle approximeacute par une courbe de Beacutezier

On a donc C2(1 k) et C3(k 1) ougrave k est une variable agrave deacuteterminer Afin de la deacuteterminer

nous devons donner une information suppleacutementaire Par exemple nous pouvons preacuteshy

supposer que le point agrave 45 degreacutes C(O5) doit ecirctre eacutevalueacute exactement par la courbe de

Beacutezier cest-agrave-dire C(O5) = (1 1) Nous obtenons donc la restriction

C(uuml5) = (1 - t)3CI + 3(1 - t)2tC2 + 3(1 - t)t2C3 + t3C4

1 3 3 1 = -Cl + -C2 + -C3 + -C4

8 8 8 8

ce qui nous permet dobtenir leacutegaliteacute

v2v2 1 3 3 1 (- -) = -Cl + -C2 + -C3 + -C4 (37)22 8 8 8 8

ce qui nous fournit apregraves substitution des valeurs des points deux fois leacutequation

v2 1 3k-=-+- (38)2 2 8

40

ce qui nous fournit apregraves reacutesolution

k = ~(J2 - 1) 0552285

Cela nous fournit donc une courbe de Beacutezier qui approxime notre cercle Il reste agrave voir

la preacutecision de cette approximation

Pour ce faire nous devrons comparer larc de cercle que nous venons de creacuteer agrave un cercle

reacuteel Afin dy arriver nous consideacutererons chaque valeur de notre arc comme eacutetant un

vecteur dont nous devrons calculer la longueur Plus cette longueur est proche de 1

plus nous avons une estimation reacutealiste Nous calculons donc

Par la suite une analyse des deacuteriveacutees nous permet de conclure que cette fonction dans

lintervalle t E [01] possegravede des m(iximu_ms agrave _t = 0 agrave tr~is reprises _(au deacutebut et agrave la

fin eacutetant donneacute la proprieacuteteacute naturelle des courbes de Beacutezier celle au milieu est due agrave

notre contrainte) Finalement elle possegravede deux (2) minimums agrave t = 0211 et t = 0789

et lerreur avec un cercle standard est de 0000273 Une telle variation sur un cercle

de rayon 1 est minime Il sagit dune variation maximale infeacuterieure agrave 003 Cela

signifie donc pour un cercle posseacutedant un rayon de 4000 pixels il y aura une variation

maximale de 12 pixels ce qui est indeacutetectable pour la taille du cercle Cela en fait une

bonne estimation pour cette section du cercle Nous pouvons naturellement suivre le

mecircme raisonnement pour les sections restantes

Il est aussi agrave noter que notre estimation nest pas la meilleure Notre choix de demander

leacutegaliteacute agrave 45 degreacutes est arbitraire et toute lerreur se retrouve dans le cocircteacute neacutegatif De

meilleures estimations ont eacuteteacute effectueacutees (Riskus 2006) avec des reacutesultats amenant une

preacutecision jusquagrave 25 plus grande (Lancaster 2005)

41

0--------------r--7T-----------------rl 08 (1

-000005

-000010

-000015

-000020

-000025

Figure 34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence

35 Structures informatiques dans les solutions deacutejagrave existantes

Maintenant que nous savons comment fonctionne les diffeacuterents modes de repreacutesentation

des dessins en informatique il faut analyser plus en deacutetail comment fonctionne les

logiciels dont nous allons nous servir En effet il nous faudra adapter nos structures de

bas niveau agrave celles disponibles dans les langages dont nous nous servirons Pour cela

nous allons analyser deux parties distinctes un format de fichier (PDF) ainsi quun

42

langage intermeacutediaire (Asymptote)

351 Postscript et PDF

En premier lieu il convient de comprendre comment fonctionne le format de fichier final

que nous utiliserons ]1EX permet de geacuteneacuterer plusieurs formats de fichier diffeacuterents

Pendant longtemps le plus populaire aura eacuteteacute Postscript creacuteeacute par Adobe Systems Cela

eacutetait principalement lieacute aux imprimantes qui fonctionnaient directement avec ce format

De nos jours le format PDF est beaucoup plus populaire bien quayant une base tregraves

proche de celle de Postscript

Postscript a eacuteteacute inventeacute par John Warnock et Charles Geschke en 1982 (Adobe Systems

Incorporated 1994) Lorsquil a eacuteteacute creacuteeacute il servait agrave faire la description de pages pour

impression Il se distingue comme eacutetant un langage de programmation complet mais

rarement utiliseacute directement En effet Postscript est difficile agrave utiliser car il utilise la

notation polonaise inverse Par exemple on exprime lappel de fonction j(a b c) de la

faccedilon suivante

abc f

Cette meacutethode rend lanalyse dun programme extrecircmement rapide et convivial pour

le logiciel qui linterpregravete car celui-ci est directement lieacute agrave la structure dune pile

dexeacutecution Par contre lanalyse dun tel programme par un humain est complexe

La plupart du temps Postscript eacutetait donc utiliseacute comme un langage de description

final pour un fichier

Il existait deux types de structures utiliseacutes en Postscript pour mettre des dessins sur une

page Le premier eacutetait lajout de texte Cela est intrinsegravequement lieacute agrave la description des

polices qui deacutepasse le cadre de ce meacutemoire Par contre pour faire un dessin quelconque

le format utilisait les chemins qui sont deacutecrits soit par des segments soit par des courbes

de Beacutezier cubiques On note donc le deacutesavantage de lutilisation dune courbe de Beacutezier

soit labsence de controcircle local

43

Quant agrave lui PDF a eacuteteacute creacuteeacute en 1993 (Adobe Systems Incorporated 2010b) Agrave travers les

gains de populariteacute le format PDF est devenue en 2008 un standard ISO (International

Organization for Standardization 2008) Cela en fait donc un format de document

standard extrecircmement inteacuteressant Alors que Postscript a eacuteteacute creacuteeacute pour des documents

qui devaient ecirctre imprimeacutes PDF a eacuteteacute conccedilu pour la description de documents plus

dynamiques cest-agrave-dire la possibiliteacute dajouter des eacuteleacutements multimeacutedias au document

Aussi il est possible de deacutecrire chaque page indeacutependamment des suivantes En effet

comme Postscript deacutecrivait des documents dimpression il est normal de connaicirctre la

page de deacutepart avant dimprimer la suivante En PDF chaque page est totalement

indeacutependante du reste du document

Pour la description deacuteleacutements graphiques les structures de base sont essentiellement

les mecircmes que Postscript Quelques eacuteleacutements comme la transparence cest-agrave-dire quun

eacuteleacutement cacheacute par un autre eacuteleacutement contribue au reacutesultat final ont eacuteteacute ajouteacutes mais les

eacuteleacutements graphiques de bas niveau sont identiques

352 Asymptote

Comme nous lavons dit preacuteceacutedemment tout ramener agrave des courbes de Beacutezier creacutee un

problegraveme de controcircle local des courbes Il faut donc utiliser une meacutethode pour donner

du controcircle agrave lutilisateur Pour cela nous utiliserons Asymptote Les structures de

bas niveau de Asymptote sont identiques agrave celles de PDF eacutetant donneacute quil convertit

directement les chemins Asymptote en chemins PDF Par contre Asymptote impleacutemente

un algorithme (Bowman 2007) originellement deacuteveloppeacute par Donald Knuth qui permet

de deacutecrire un chemin en fonction des points par lesquels il passe Asymptote utilise donc

des splines cubiques (qui ne sont pas neacutecessairement des B-splines toutefois)

Cet algorithme est complexe et en dehors du cadre de ce meacutemoire mais peut ecirctre

reacutesumeacute comme eacutetant un algorithme de choix des points de controcircle En effet une courbe

de Beacutezier cubique est deacutefinie par 4 points Le premier et le dernier sont interpoleacutes de

maniegravere exacte Ce que lalgorithme fait est quil prend un ensemble de points qui

44

seront tous interpoleacutes disons Pl P2 P3 P4 Ensuite pour chaque paire conseacutecutive de

points (donc (Pl P2 ) (P2 P3) et (P3 P4)) il geacuteneacuterera une courbe de Beacutezier cubique

La partie la plus importante de lalgorithme consiste agrave prendre toutes les informations

fournies par lutilisateur (les points de controcircle ainsi que des options qui deacutefinissent la

courbe comme les deacuteriveacutees agrave certains endroits ou des informations comme la tension qui

laisse lalgorithme calculer lui-mecircme les deacuteriveacutees agrave partir dun indice reacuteel simple) afin de

calculer pour chaque courbe de Beacutezier cubique les deux points de controcircle manquants

En laissant agrave lutilisateur le pouvoir de deacutecider seulement les points ougrave la courbe passe

le travail est simplifieacute mais permet tout de mecircme de terminer avec un ensemble de

courbes de Beacutezier

CHAPITRE IV

THEacuteORIE DES LANGAGES INFORMATIQUES

La creacuteation dun langage de programmation nest pas une mince tacircche Il faut donc

sassurer de le construire sur des bases theacuteoriques solides Nous preacutesenterons ici les

eacuteleacutements theacuteoriques importants de la theacuteorie des langages ainsi que leurs applications

dans le domaine de la compilation Nous preacutesenterons aussi loutil SableCC que nous

avons utiliseacute dans le cadre de notre langage ainsi quun bref exposeacute sur les langages

reacuteflexifs

La theacuteorie des langages est un sujet vaste et extrecircmement complexe Un meacutemoire comshy

plet pourrait ecirctre reacutedigeacute seulement sur les aspects theacuteoriques des automates reacuteguliers

Afin de compresser tout ce contenu dans un seul chapitre les eacuteleacutements seront mentionneacutes

sans preuve Nous recommandons toutefois au lecteur curieux et assidu de consulter les

reacutefeacuterences de ce chapitre pour des preuves et une couverture plus complegravete du sujet

41 Theacuteorie des langages et automates

Dans un premier temps nous devrons deacuteterminer ce quest formellement un langage

Par la suite nous analyserons une structure de donneacutees qui est intimement lieacutee agrave ce

sujet les automates

46

411 Les eacuteleacutements de base dun langage (Aho Sethi et Ullman 1986)

Alphabet et lettre

Un alphabet est un ensemble (au sens matheacutematique du mot) de symboles appeleacutes

lettres Un alphabet est fini et non-vide Par exemple lalphabet latin standard ainsi

que lensemble O I constituent des alphabets

Mot

Un mot dun alphabet A peut ecirctre un des trois cas suivants

- le mot vide euro formeacute daucune lettre

- une lettre de lalphabet A

- Toute suite finie de lettres aOal an ougrave chaque ai fait partie de lalphabet A

Il est agrave noter que les deux premiers sont en fait des cas speacutecifiques du dernier bien quils

sont souvent seacutepareacutes pour raison de clarteacute Dans le dernier cas on dit que les caractegraveres

sont lieacutes par lopeacuteration de concateacutenation

Langage

Un langage au sens le plus geacuteneacuteral possible est un ensemble de mots Celui-ci peut ecirctre

fini ou infini La plupart des exemples inteacuteressants (un langage de programmation par

exemple) est un langage infini En effet il existe une infiniteacute de programmes diffeacuterents

tout comme il existe une infiniteacute de nombres binaires

412 Exp esson reacutegnli r

Les expressions reacuteguliegraveres forment un outil de travail extrecircmement important en inshy

formatique De nombreux outils ainsi que certains langages (grep perl ) leurs sont

consacreacutes

47

On peut reacutesumer les expressions reacuteguliegraveres comme eacutetant une meacutethode afin de deacutecrire

un langage infini par une expression fini On utilisera dans la construction certaines

opeacuterations qui nous donneront des proprieacuteteacutes inteacuteressantes pour le langage final Tout

mot qui peut ecirctre construit agrave partir de ces regravegles fait automatiquement partie du langage

Constantes

Leacuteleacutement de base dune expression reacuteguliegravere est une constante Celle-ci est deacutefinie agrave

partir dune lettre de lalphabet et deacutefinit un seul mot la constante elle-mecircme Par

conseacutequent lexpression reacuteguliegravere a de lalphabet ab repreacutesente le langage a Il est

agrave noter que nous pouvons aussi utiliser le mot vide comme une constante repreacutesentant

lensemble vide

Concateacutenation

Lopeacuteration de concateacutenation est une opeacuteration sur les mots qui permet de creacuteer des

expressions reacuteguliegraveres plus longues agrave partir de deux expressions reacuteguliegraveres valides Le

reacutesultat de lexpression reacuteguliegravere A concateacuteneacutee agrave B est donc nimporte quel mot de A

concateacuteneacute agrave nimporte quel mot de B Par exemple ab est une expression reacuteguliegravere qui

repreacutesente un langage agrave un mot ab

Union

Lunion des expressions reacuteguliegraveres est une opeacuteration qui correspond agrave lunion ensemshy

bliste Lors de lunion de A et de B (deacutefini comme (AIB)) nous pouvons choisir nimshy

porte quel eacuteleacutement de A ou de B comme un mot valide Par exemple (alb)b repreacutesente

le langage contenant deux mots ab bb

Fermeture de Kleene

La fermeture de Kleene est une opeacuteration beaucoup plus inteacuteressante Celle-ci utilise

une expression reacuteguliegravere A Le reacutesultat de la fermeture noteacute A est la concateacutenation

48

dun nombre fini deacuteleacutements de A avec possibiliteacute de reacutepeacutetitions Par exemples pour

ab toute chaicircne de a finie possiblement de longueur zeacutero suivie dun b fait partie du

langage Lexpression reacuteguliegravere (alb) repreacutesente nimporte quelle chaicircne finie de a ou de

b

Les langages que nous pouvons geacuteneacuterer avec des expressions reacuteguliegraveres sont assez riches

bien quinsuffisants pour geacuteneacuterer un langage de programmation (Aho Sethi et Ullman

1986)

413 Automates

Avant de pouvoir expliquer agrave quoi servent les expressions reacuteguliegraveres nous devons discuter

des automates une structure dune importance cruciale en informatique

Automate fini

yn automate fini (Ullman Hopcroft et Motwani 1~79) est un quintuplet composeacute de

cinq eacuteleacutements

- Un ensemble fini deacutetats E

- Un alphabet fini A

- Un ou plusieurs eacutetats de deacutepart d (selon que lautomate est deacuteterministe ou non)

- Un ensemble deacutetats dit finaux F

- Une relation de transition T ccedil E x A x E Cela deacutefinit une maniegravere de passer dun

eacutetat agrave un autre lors de lapparition dun symbole speacutecifique

On repreacutesente en geacuteneacuteral un automate par un graphe avec des flegraveches nommeacutees Les

flegraveches repreacutesentent la relation de transition alors que les sommets repreacutesentent les

eacutetats dans E On repreacutesente un eacutetat initial par une flegraveche qui ne part pas dun eacutetat

Finalement on repreacutesente un eacutetat final par un cercle double Par exemple lautomate

suivant accepte lensemble des mots qui sont composeacutes dune seacuterie de a (possiblement

nulle) suivi dun b Donc les mots b ab et aab serait des mots valides par rapport agrave

49

cet automate

Figure 41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b

Lensemble T peut prendre plusieurs formes en fonction du deacuteterminisme de lautomate

comme nous allons maintenant le voir

Automate non-deacuteterministe

Un automate non-deacuteterministe peut posseacuteder plusieurs eacutetats de deacutepart De plus son

ensemble de transitions T est quelconque Il peut donc exister pour un eacutetat e et un

symbole a plusieurs eacutetats e tels que (e a e) E T

Un automate non-deacuteterministe peut ecirctre vu comme une forme de graphe dans lequel on

peut se promener en utilisant certaines transitions La suite des symboles des transitions

que nous utilisons forment un mot Lensemble des mots obtenus par une suite de transhy

sitions allant dun eacutetat initial agrave un eacutetat final constitue le langage de lautomate Dans

un automate non-deacuteterministe il peut neacuteanmoins exister pour le mecircme mot plusieurs

chemins diffeacuterents deacutebutant dans un eacutetat initial Il est important de noter quun mot

est accepteacute degraves quun de ces chemins se termine dans un eacutetat final

Automate deacuteterministe

Un automate non-deacuteterministe nous permet de creacuteer des langages mais le fait davoir

plus dun choix pour le mecircme symbole peut sembler inquieacutetant surtout lorsquil sagit

dinformatique Nous pouvons donc deacutefinir un automate deacuteterministe plus simple Celuishy

50

ci possegravede un seul eacutetat de deacutepart et son ensemble de transitions T assure que pour

chaque symbole il ny a quun seul eacutetat suivant possible Il ny a donc pour chaque mot

quun seul chemin possible agrave partir de leacutetat initial Plus formellement lautomate sera

deacuteterministe si pour tout e E E et a E A il y a un seul e E E tel que (e a e) ET

Le reacuteflexe naturel serait de croire quen enlevant le non-deacuteterminisme dun automate

celui-ci devient beaucoup moins puissant permettant de repreacutesenter beaucoup moins

de langages Or il nen est rien Il a eacuteteacute prouveacute (malheureusement en trop de pages

pour ce meacutemoire) que nimporte quel automate non-deacuteterministe peut ecirctre rameneacute agrave

un automate deacuteterministe quitte agrave voir le nombre deacutetats de lautomate augmenter

exponentiellement Nous pouvons donc toujours creacuteer un automate non-deacuteterministe et

laisser la tacircche agrave un ordinateur de creacuteer un automate deacuteterministe agrave partir de celui-ci

(Ullman Hopcroft et Motwani 1979)

Exeacutecution dun automate et contraintes temporelles

La meacutethode dexeacutecution dun automate deacuteterministe est assez simple Nous lui fournisshy

sons un mot dune certaine longueur disons n Nous deacutemarrons de leacutetat initial et chaque

lettre repreacutesente un choix agrave faire dans lautomate Comme lautomate est deacuteterministe

il ny a quune possibiliteacute agrave explorer Si nous ne pouvons plus avancer avant la fin du

mot celui-ci ne fait pas partie du langage de lautomate Si nous parvenons agrave avancer

jusquau bout et que nous ne sommes pas dans un eacutetat final il nen fait pas partie non

plus Par contre si leacutetat est final nous avons trouveacute un mot du langage Co me le mot

possegravede n lettres nous aurons au maximum n choix agrave faire rendant lalgorithme dapshy

partenance agrave un temps dexeacutecution lineacuteaire Un algorithme lineacuteaire est naturellement

extrecircmement inteacuteressant en informatique car nous voulons un programme qui sexeacutecute

dans un temps raisonnable

51

414 Lien entre langage reacutegulier et automate fini

Nous connaissons donc maintenant deux meacutethodes pour creacuteer un langage Les expresshy

sions reacuteguliegraveres ainsi que les automates Un automate est difficile agrave concevoir pour un

ecirctre humain mais extrecircmement rapide dutilisation par un ordinateur Une expression

reacuteguliegravere est complexe pour un ordinateur mais aiseacutee agrave concevoir par un ecirctre humain Il

nous faut donc voir si nous pouvons obtenir des proprieacuteteacutes communes agrave ces deux outils

Le lien

Il existe en effet un lien qui unit ces deux structures Celui-ci est extrecircmement fort

lensemble des langages quil est possible de geacuteneacuterer avec des expressions reacuteguliegraveres est

exactement le mecircme ensemble que ceux qui peuvent ecirctre geacuteneacutereacutes par un automate fini

deacuteterministe Cela implique que pour chaque expression reacuteguliegravere nous pouvons troushy

ver un automate qui repreacutesente le mecircme langage Cela est vrai aussi en sens inverse

Par contre il ne sagit pas dune bijection car plusieurs expressions reacuteguliegraveres peuvent

correspondre au mecircme automate (par exemple a et aamiddot) Il existe un algorithme permetshy

tant de transformer une expression reacuteguliegravere en automate mais celui-ci est complexe et

deacutepasse le cadre de ce meacutemoire Nous pouvons toutefois mentionner que cet algorithme

est relativement lent (sexeacutecute en O(2m ) ou m est la longueur de lexpression reacuteguliegravere)

mais permet par la suite de trouver si un mot fait partie dun langage en temps lineacuteaire

(McNaughton et Yamada 1960)

Importance dun tel lien

Ce lien est un eacuteleacutement crucial dans la capaciteacute dun ordinateur agrave travailler avec des lanshy

gages de programmation En effet cela permet aux creacuteateurs de langages de deacutecrire des

mots agrave partir dexpressions reacuteguliegraveres (quils comprennent) et de laisser un programme

creacuteer des automates qui peuvent reconnaicirctre ces symboles (un if ou un for mais aussi

des variables) dans des programmes Cela permet donc de creacuteer une partie importante

dun langage quon appelle lanalyse lexicale Cela permet agrave partir de lutilisation de

52

lautomate creacuteeacute par des expressions reacuteguliegraveres de transformer un texte en une suite de

symboles plus speacutecifiques Par exemple le texte

if a 1 then true else faIse

pourrait ecirctre traduit par la suite de symboles suivants

IF VAR EQ NUM THEN BD DL ELSE BDDL FININSTR

Cette eacutetape lanalyse lexicale est cruciale agrave la suite de lanalyse dun programme Les

automates nous sont toutefois utiles non seulement pour les mots cleacutes mais aussi pour

des eacuteleacutements plus complexes comme des variables Une variable est souvent identifieacutee

comme eacutetant une lettre suivie dune suite de caractegraveres quelconques (sauf exception tel

quun espace)

Malgreacute tout il existe certains eacuteleacutements quun automate ne peut reconnaicirctre Un exemple

classique est le parentheacutesage eacutequilibreacute (une suite de parenthegraveses telle que c~aque pashy

renthegravese ouvrante est associeacute agrave une parenthegravese fermante et agrave nimporte quel moment il

nexiste pas plus de fermantes que douvrantes) Il est en effet impossible aux automates

de faire le lien entre les deux types de parenthegraveses (Ullman Hopcroft et Motwani 1979)

Pour cela il nous faudra utiliser des structures plus complexes

42 Grammaires

Ces structures sont les grammaires Il est possible de les voir comme eacutetant une forme

beaucoup plus geacuteneacuterale des expressions reacuteguliegraveres Avec cette structure nous pourrons

nous assurer quun programme est bien formeacute cest-agrave-dire creacuteer un arbre repreacutesentant

la structure dun programme un peu comme la structure dune phrase

421 Deacutefinition dune grammaire formelle

Une grammaire est constitueacutee de quatre eacuteleacutements

53

- Un ensemble fini de terminaux Ceux-ci sont des symboles repreacutesentant les lettres

dun langage Par conseacutequent on peut aussi appeler les terminaux lalphabet dune

grammaire

- Un ensemble fini de non-terminaux Habituellement repreacutesenteacute par des majuscules

(par des symboles diffeacuterents des terminaux) pour des raisons de clarteacute ceux-ci repreacuteshy

sentent des eacutetats intermeacutediaires de la grammaire

- Un non-terminal de deacutepart parmi lensemble deacutecrit plus haut

- Un ensemble de regravegles de production Celles-ci vont varier selon la cateacutegorie de langage

choisie mais de maniegravere geacuteneacuterale une regravegle de production est une paire ordonneacutee

dont chaque eacuteleacutement est composeacute dune suite de terminaux et de non-terminaux (par

exemple aB -t aAa)

Le fait de repreacutesenter une regravegle de production avec une flegraveche permet den expliciter le

rocircle transformer une suite de caractegraveres en une autre Lutilisation dune grammaire

consiste donc agrave deacutemarrer avec le non-terminal de deacutepart puis dappliquer une suite de

regravegles de production pour modifier le non-termina Lorsquon obtient un mot formeacute

uniquement de terminaux il sagit dun mot du langage repreacutesenteacute par la grammaire

Par exemple

S -gt aA

A -gt b

repreacutesente un langage contenant le seul mot ab On applique doEn effet unc un proceacutedeacute

de deacuterivation (en appliquant chaque regravegle) Par exemple une deacuterivation possible du mot

ab dans ce contexte (la seule dailleurs) est la suite suivante

S (deacutepart)

S -gt aA (application de S -gt aA)

aA -gt ab (application de A -gt b)

54

422 Hieacuterarchie de Chomsky

La deacutefinition que nOlis avons donneacutee preacuteceacutedemment dun langage est beaucoup trop

geacuteneacuterale pour nous fournir des proprieacuteteacutes inteacuteressantes Afin de deacutegager des proprieacuteteacutes

inteacuteressantes nous deacutefinissons plusieurs cateacutegories Plusieurs noms sont utiliseacutes pour

chaque cateacutegorie mais nous nous limiterons agrave utiliser ceux deacutefinis par le linguiste Noam

Chomsky (Chomsky 1956) Chacune de ces cateacutegories sera deacutecrite par les proprieacuteteacutes de

sa grammaire Il est agrave noter que nous avons neacutegligeacute certaines cateacutegories de langages qui

ne sont pas lieacutees au domaine

Langage reacutegulier

Un langage reacutegulier est eacutequivalent aux expressions reacuteguliegraveres Les regravegles de production

de la grammaire doivent ecirctre de la forme

A -) Ba

A -) a

ou

A -) aB

A -) a

avec A et B des non-terminaux et a un termina Il est agrave noter que toutes les regravegles

dune grammaire doivent ecirctre soit du premier cas soit du deuxiegraveme cas On les appelle

reacutecursives agrave gauche ou agrave droite respectivement

Langage non-contextuel

Un langage non-contextuel est un peu plus complexe quun langage reacutegulier Les regravegles

de production de la grammaire doivent ecirctre de la forme

55

A -) B

avec A un non-terminal et B une suite de terminaux et de non-terminaux Le deacutetail

le plus important est de noter que les langages non-contextuels permettent de creacuteer un

systegraveme de parenthegraveses eacutequilibreacutees En effet voici une grammaire qui accepte seulement

un parentheacutesage eacutequilibreacute

P -) pp

P -) CP)

P -)

Il est eacutevident quune grammaire reacuteguliegravere ne peut geacuteneacuterer ce genre de langage Par contre

un parentheacutesage eacutequilibreacute est extrecircmement important dans le domaine de la compilashy

tion afin dexprimer clairement les ideacutees dun programmeur et plus speacutecifiquement

permettre deacutecrire des formules matheacutematiques complexes compreacutehensibles par lOlmiddotdishy

nateur

Langage contextuel

Les langages contextuels ne sont pas utiliseacutes en geacuteneacuteral en compilation car ils sont

beaucoup plus lents Les regravegles de production de la grammaire doivent ecirctre de la forme

ABC -) ADC

ougrave B est un non-terminal A et C sont des non-terminaux ou le mot vide et D est un

non-terminal (mais pas le mot vide) On voit clairement ici dougrave vient le nom de ce type

de langage B est transformeacute en fonction de ce qui est autour de lui (son contexte)

423 Utiliteacute dans les langages de programmation

La prochaine tacircche dans la creacuteation dun langage est danalyser la structure de notre

programme Pour effectuer cette tacircche nous pouvons utiliser une grammaire non-conshy

56

textuelle Agrave cette fin nous pouvons nous assurer que les eacutequations sont correctement

formeacutees que les instructions sont valides etc

Dans un autre ordre dideacutee la hieacuterarchie de Chomsky possegravede aussi des liens avec les

machines de Turing qui sont elles-mecircmes intimement lieacutees agrave la theacuteorie de la complexiteacute

(Davis Sigal et Weyuker 1994) Ce domaine est extrecircmement vaste et le lecteur pourra

trouver dans les reacutefeacuterences plusieurs excellents ouvrages pour sinitier agrave ce domaine (Dhu

et Ko 2000)

43 SableCC

Bien quil est tregraves inteacuteressant deacutetudier les algorithmes de compilation limpleacutementation

de chacun de ces algorithmes deacutepasse largement le cadre de ce meacutemoire Il nous faut

donc trouver une meacutethode afin de creacuteer notre langage de programmation Plusieurs

outils soffrent agrave nous mais notre choix sarrecirctera sur SableCC

431 Quest-ce que S~bleCC

SabieCC est ce quon appelle un compilateur de compilateurs (Gagnon 1998) Un comshy

pilateur de compilateurs est un programme qui permet agrave partir dune deacutefinition absshy

traite dun langage de programmation dobtenir un compilateur pour ce langage Plus

speacutecifiquement le programme reacutesultant nous permettra dobtenir larbre syntaxique

dun programme ce qui nous permettra de lanalyser reacutecursivement et de lexeacutecuter (ou

bien de le transformer dans un langage diffeacuterent selon le cas) Les formes abstraites que

requiert un compilateur de compilateurs sont justement les expressions reacuteguliegraveres (pour

deacutecouvrir les symboles) et les grammaires non-contextuelles (pour lanalyse syntaxique

des symboles obtenus preacuteceacutedemment)

432 Avantages de SableCC

Bien que SabieCC nest pas le compilateur de compilateurs le plus connu il possegravede

plusieurs aspects inteacuteressants Premiegraverement comparativement agrave ses compeacutetiteurs plus

57

acircgeacutes SabieCC est eacutecrit dans un paradigme orienteacute-objet Cela rend le compilateur beaushy

coup plus simple agrave utiliser De plus le logiciel geacutenegravere automatiquement un ensemble de

classes (dans un choix de plusieurs langages) qui permet de traiter aiseacutement et claishy

rement avec des concepts modernes les arbres syntaxiques reacutesultant de lanalyse du

programme

44 Langage reacuteflexif

Finalement une fois que nous avons obtenu un arbre syntaxique et que nous savons que

notre langage est bien formeacute il nous reste la reacuteflexiviteacute agrave prendre en compte En effet

nous ne voulons pas reacuteeacutecrire inutilement dans notre langage chaque fonction qui existe

deacutejagrave en Java Nous pourrons les utiliser avec un langage reacuteflexif Une autre possibiliteacute

dun langage reacuteflexif est de deacuteleacuteguer agrave SDDL la creacuteation de classes Cela permet agrave lutilishy

sateur de reacutefeacuterencer nimporte quelle classe Java sans avoir agrave changer le code de SDDL

lui-mecircme Cela serait impossible sans un langage reacuteflexif

441 Deacutefinition dun langage reacuteflexif

Un langage reacuteflexif (Sobel et Friedman 1996) est un langage qui est capable soit de

- Examiner son eacutetat cette proprieacuteteacute est appeleacutee introspection

- Modifier son eacutetat cette proprieacuteteacute est appeleacutee intercession

Lintrospection permet agrave un langage de connaicirctre entre autres les classes quil utilise

ainsi que les meacutethodes et les paramegravetres Lintercession beaucoup plus puissante pershy

mettrait par exemple cie rajouter modifier ou supprimer des classes etou meacutethodes

Pour nos besoins nous sommes naturellement inteacuteresseacutes par lintercession

442 Avantages

Lavantage le plus clair de lutilisation de la reacuteflexiviteacute est la reacuteutilisation du code En

effet toutes les fonctionnaliteacutes du langage infeacuterieur (Java dans ce cas-ci) peuvent ecirctre

58

automatiquement passeacutees au langage supeacuterieur Cela eacutevite davoir agrave reacuteeacutecrire du code

pour chaque nouvel eacuteleacutement agrave ajouter

Un autre avantage assez explicite est de permettre agrave des utilisateurs un peu plus aguerri

de lier du code des deux niveaux de langage ensemble En effet si un utilisateur creacutee

une structure de donneacutees en Java il peut toujours se servir exactement de la mecircme

classe dans le langage supeacuterieur sans avoir agrave faire la moindre modification au langage

supeacuterieur lui-mecircme Il est donc clair quun langage qui utilise la reacuteflexiviteacute peut devenir

tregraves puissant

443 Deacutesavantages

Certains deacutesavantages accompagnent aussi la reacuteflexiviteacute Un des plus importants est la

contrainte de seacutecuriteacute En effet si un utilisateur peut appeler nimporte quelle classe

Java agrave partir du langage supeacuterieur il peut tregraves aiseacutement appeler des fonctions qui cassent

le programme si un controcircle suffisamment important nest pas effectueacute par le logiciel Il

peut aussi sans causer d~s problegravem_es de seacutec~riteacute confondre un usager en provoquant

des effets de bord sur leacutetat du logiciel cest-agrave-dire modifier des proprieacuteteacutes du reste du

programme sans neacutecessairement que cela paraisse

Un autre deacutesavantage eacutevident est quun utilisateur qui souhaite utilicirc3er les fonctions du

langage infeacuterieur doit en quelque sorte connaicirctre celui-ci Cela implique donc lapprenshy

tissage dun deuxiegraveme langage ce qui en soit peut paraicirctre trop pour des utilisateurs

plus traditionnels

Lorsquon analyse froidement les avantages et les inconveacutenients on voit que les avanshy

tages sont beaucoup plus importants En effet le projet eacutetant limiteacute dans le temps et

dans le personnel il est en quelque sorte impossible de fournir des librairies de foncshy

tions suffisamment complegravetes pour les utilisateurs Se brancher sur les librairies Java

fournit automatiquement tout ce dont nous avons besoin et donne accegraves agrave une quantiteacute

innombrable de projets deacutejagrave creacuteeacutes dans ce langage

CHAPITRE V

MISE EN OEUVRE DE LA SOLUTION

Maintenant que nous avons des bases theacuteoriques solides ainsi quune hieacuterarchie bien

adapteacutee agrave nos besoins nous pouyons commencer agrave impleacutementer notre solution Cela

implique premiegraverement la creacuteation de notre hieacuterarchie objet en Java Deuxiegravemement

nous devons impleacutementer une grammaire afin de deacutecrire SDDL Finalement il faut

ajouter du code afin dimpleacutementer certaines proprieacuteteacutes voulues pour notre langage Il

est agrave noter que nous avons inclus en annexe un diagramme de notre hieacuterarchie ainsi que

la grammaire complegravete de SDDL

51 Eacuteleacutements de langage en SDDL

511 Impleacutementation de la hieacuterarchie

Limpleacutementation de la hieacuterarchie eacutetant seacutepareacutee du reste du langage il est normal de

commencer avec celle-ci eacutetant donneacute quelle repreacutesente le module le plus important de

notre projet Cela nous permet de le tester au fur et agrave mesure avant de commencer agrave

creacuteer un langage de plus haut niveau qui lutilise

Un des problegravemes les plus importants du deacuteveloppement de la hieacuterarchie fut de deacuteveshy

lopper correctement la deacutefinition et laccegraves agrave des points speacutecifiques de certains objets

Comme lideacutee eacutetait de permettre dobtenir une quantiteacute essentiellement illimiteacutee de

points diffeacuterents il fallait une meacutethode robuste et efficace

60

Notre meacutethode implique de fournir des informations par rapport au dessin englobant agrave

chaque sous-dessin Cela est requis car un objet preacutesent agrave plusieurs endroits diffeacuterents

auquel on demande un point speacutecifique se bute agrave une ambiguiumlteacute Mecircme en utilisant

seulement un Drawing qui est techniquement une instance unique dune forme il faut

faire attention En effet si on a un Drawing dun cercle qui est agrave linteacuterieur dune

ellipse par exemple nous pourrions deacutecider de placer cette ellipse agrave plusieurs endroits

Nous aurions donc le mecircme problegraveme dambiguiumlteacute du positionnement des points Afin

de remeacutedier agrave ce problegraveme nous avons fourni au Drawing sa position agrave linteacuterieur du

diagramme Lorsquil est copieacute nous navons quagrave changer linformation pour que le

positionnement soit correct

512 Grammaire

Le deacuteveloppement de la grammaire fut naturellement une section cruciale du deacutevelopshy

pement de SDDL Comme nous avions deacutejagrave deacuteveloppeacute des objectifs speacutecifiques pour la

forme du langage la creacuteation fut relativement directe Quelques eacuteleacutements importants

ont toutefois ducirc ecirctre ajouteacutes en cours de route En particulier des eacuteleacutements seacuteparateurs

ont eacuteteacute dune importance cruciale Il aurait donc pu ecirctre souhaitable de diminuer la

verbositeacute en enlevant des parenthegraveses ou des virgules mais cela cause (dans la plupart

des cas) des problegravemes au niveau de lambiguiumlteacute de la grammaire (tel que nous lavons

vu preacuteceacutedemment)

Nous avons aussi deacutecideacute de deacutecreacuteter quune expression geacuteneacuterale est une instruction Cela

peut sembler contre-intuitif car une expression (comme 2 + 2) ne semble pas ecirctre une

instruction La raison derriegravere ce changement est le dessin de chemin En effet nous

pouvons deacuteterminer un chemin (Path) comme nimporte quel autre objet Par contre

cela implique de lajouter par la suite seacutepareacutement agrave un canevas Cela semble contreshy

intuitif nous voyons souvent les liens entre les objets comme eacutetant des liens de niveau

supeacuterieur (bref faits dans le canevas principal) Pour lier a et b il semble plus logique

deacutecrire

61

a--b

que

lien = a--b

put lien in main

Afin de reacutegler ce problegraveme nous avons deacutecideacute de laisser les expressions ecirctre des insshy

tructions Cela fait que deacutefinir une ligne (comme a--b) devient automatiquement une

instruction valide Celle-ci sera traiteacutee comme un cas speacutecial afin decirctre placeacutee direcshy

tement au centre du canevas principal Cela implique aussi comme nous le verrons

plus tard de rajouter du code afin de sassurer que les expressions qui ne sont pas des

instructions soient refuseacutees par le programme

stm = exp exp sc 1 assign id assign exp sc 1 while while_kwd exp do_kwd (stms] stm end_kwd sc 1 if if_kwd exp then_kwd (stms] stm else_part end_kwd sc 1 for for_kwd id from~kwd (low_bound] exp to_kwd (up_bound] exp

do_kwd (stms] stm end_kwd sc 1 return return_kwd exp sc

Figure 51 Extrait de la grammaire de SDDL pour une instruction

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage

Plusieurs proprieacuteteacutes de SDDL ne venaient pas directement avec la grammaire Celles-ci

ont neacutecessiteacute un traitement bien particulier en fonction de la proprieacuteteacute rechercheacutee

Typage

La grammaire de SDDL indique clairement que le langage est agrave typage dynamique eacutetant

donneacute que les creacuteations de variables ne permettent pas de donner un type Le mecircme

62

pheacutenomegravene est preacutesent dans la deacutefinition des fonctions Par contre le fait de souhaiter

un typage dynamique implique lajout dune large section de code deacutedieacutee agrave la veacuterification

de type Chaque opeacuteration ne peut ecirctre appliqueacutee quagrave certains types deacuteleacutements et donc

avant deffectuer lopeacuteration il faut veacuterifier si le type est valide

Eacuteleacutements objets

Impleacutementer tous les principes dun langage orienteacute-objet est un travail de longue hashy

leine Par contre eacutetant donneacute que notre objectif eacutetait de simplifier le langage de desshy

cription final nous avons deacutecideacute de ne pas permettre la creacuteation de nouvelles classes

agrave linteacuterieur de SDDL Cela implique que nous pouvons releacuteguer la creacuteation de classes

uniquement au langage Java Cela a donc grandement faciliteacute la tacircche car nous navions

pas besoin dimpleacutementer la tregraves grande majoriteacute des concepts objets que nous laquo emshy

pruntons raquo agrave Java

Eacutelimination de la verbositeacute

Une bonne partie de leacutelimination de la verbositeacute vient de la conception mecircme du lanshy

gage En effet le fait de releacuteguer la deacutefinition des classes agrave Java ainsi que de creacuteer le

typage dynamique ont purement par choix eacutelimineacute une bonne partie de la verbositeacute

Quelques eacuteleacutements suppleacutementaires ont permis deacuteliminer un excegraves de verbositeacute On

note entre autres le fait de deacutefinir la description du diagramme sans le speacutecifier dans le

cadre dune fonction Un autre pheacutenomegravene important est davoir deacutecideacute de promouvoir

les points et certaines fonctions relieacutees agrave leacutetat de primitive naturelle du langage En

effet une addition entre un point a et b seffectue

c = a + b

au lieu de en Java

AbstractPoint c aadd(b)

63

Cela peut sembler comme un maigre gain mais lorsquappliqueacute agrave un calcul complexe

impliquant des points (par exemple le calcul dune combinaison lineacuteaire) les gains

combineacutes rendent le code extrecircmement clair

AbstractPoint c = amultiply(1030)add(bmultiply(2030))

c = (a 30 + 20 b 30)

Figure 52 Code Java et SDDL pour calculer une combinaison lineacuteaire

52 Reacutealisation en Java

Afin de reacutealiser SDDL il a bien sucircr fallu eacutecrire une grammaire mais beaucoup de code

autour sert agrave inteacutegrer la grammaire au restant des fonctionnaliteacutes de notre hieacuterarchie

Ce code fut complegravetement eacutecrit en Java et remplit plusieurs fonctions

521 Traverseacutee de larbre grammatical et exeacutecution

La grande majoriteacute du code Java suppleacutementaire eacutecrit a servi agrave permettre la traverseacutee

de larbre grammatical creacuteeacute par notre grammaire Cette traverseacutee permet en quelque

sorte lexeacutecution du code SDDL et est donc cruciale Pour la plupart il sagit dune trashy

verseacutee en profondeur relativement classique Quelques petits deacutetails retiennent toutefois

lattention

- Certains morceaux de code ne doivent pas ecirctre exeacutecuteacutes et ont donc un comportement

speacutecial Cest le cas des deacutefinitions de fonctions qui ne sont exeacutecuteacutees quagrave lappel On

meacutemorise donc en quelque sorte une partie de larbre grammatical et lors dun appel

on transfegravere le controcircle dexeacutecution agrave cette partie Eacutevidemment lors de la lecture de

la deacutefinition de la fonction il faut stocker quelques informations sur nos fonctions

dans une structure deacutefinie agrave cet effet (un Methodlnf0)

- Certaines opeacuterations ont plusieurs sens distincts qui ne peuvent ecirctre speacutecifieacutes dans la

grammaire La seacutemantique dune telle opeacuteration napparaicirct clairement quau moment

de la lecture de lopeacuteration (dans notre cas agrave lexeacutecut ion) Un exemple serait le

64

symbole daddition Bien que sa grammaire soit tregraves claire il peut sagir dune addition

de nombres mais aussi dune addition de points ou dune concateacutenation de chaicircnes

de caractegraveres Il est donc neacutecessaire agrave lexeacutecution de veacuterifier la classe de chaque objet

requis par lopeacuteration afin de trouver la bonne seacutemantique pour lopeacuteration si une

telle seacutemantique existe Si aucune nest trouveacutee on peut alors soulever une erreur

selon le meacutecanisme standard (par exemple additionner un point et une chaicircne de

caractegraveres)

- Certaines expressions grammaticalement correctes ne sont valides que sous certaines

conditions Par exemple nimporte quelle expression (exp) est accepteacutee comme eacutetant

une instruction (stm) grammaticalement valide Par exemple linstruction 2 + 2 va

ecirctre accepteacutee par la grammaire Par contre elle na pas de sens car elle naccomplit rien

du tout Il faut donc sassurer de veacuterifier dans la traverseacutee que lexeacutecution est leacutegale

Dans ce cas-ci il faut sassurer que lexpression de niveau supeacuterieur (une addition)

est valide pour ecirctre une instruction Dans un tel cas une erreur serait souleveacutee encore

selon le meacutecanisme standard

522 Deacutefinition dobjets quelconques

Une partie moins grande du code est consacreacutee agrave linteacutegration de la hieacuterarchie de SDDL

dans la deacutefinition du langage Comme nous souhaitions utiliser des classes quelconques

nous avons utiliseacute la reacuteflexiviteacute Java telle que nous le deacutecrivions plus tocirct Cela implique

de reacutecupeacuterer les noms des fonctions et des classes lors de leurs utilisations Toutes les

veacuterifications seffectuent agrave lexeacutecution Nous savons donc seulement si une classe A existe

bel et bien lorsque nous essayons de creacuteer un objet agrave partir de celle-ci De plus chaque

fonction appeleacutee sur un objet de classe A nest veacuterifieacutee que lors de son utilisation

Habituellement la solution aurait eacuteteacute de veacuterifier avant lexeacutecution lexistence de chaque

classe ainsi que les fonctions de chaque classe pour sassurer que lexeacutecution soit correcte

Dans notre cas la veacuterification agrave lexeacutecution est suffisante car les programmes sont tregraves

courts

De plus quelques contraintes ont ducirc ecirctre ajouteacutees afin de sassurer Clue seules les parties

65

Override public void caseADrawingTermCADrawingTerm node)

String className = nodegetClassName() getText()

try

thiscurrentExpressionClass ClassforName(sddlhierarchy + className)

thiscurrentExpressionValue = thiscurrentExpressionClassgetConstructor() newlnstance()

catch(NoSuchMethodException e)

throw new InterpreterException( cl ass Il + className + is ill-defined (no base constructor) nodegetClassName())

catch(Exception e)

throw new InterpreterException(unable to load + className +

Il class (maybe it does not exist) nodegetClassName())

Figure 53 Code reacuteflexif pour creacuteer une forme quelconque

requises de Java sont exposeacutees agrave lutilisateur final La restriction principale est de ne

creacuteer que des objets qui font partie du paquet sddl hierarchy Il est toutefois agrave

noter que cela nisole pas totalement le reste de Java car il est tout agrave fait possible de

creacuteer une classe qui permet dacceacuteder agrave Java complegravetement

523 Gestion des erreurs

La gestion des erreurs seffectue au travers des meacutecanismes deacutejagrave mis en place par Java

cest-agrave-dire les exceptions Une classe speacutecifique aux exceptions de linterpreacuteteur a eacuteteacute

creacuteeacutee qui permet de speacutecifier non seulement un message mais aussi un noeud bien

speacutecifique dans larbre grammatical afin didentifier lendroit ougrave lerreur a eacuteteacute deacutecouverte

66

Cela est extrecircmement utile afin de permettre agrave lutilisateur de corriger la majoriteacute de

ses erreurs

De plus une partie du code de gestion derreurs sert agrave repreacutesenter la pile dexeacutecution

En effet afin didentifier la source dun problegraveme il est important de pouvoir savoir

quelles fonctions sont impliqueacutees Nous pouvons donc identifier la ligne de chaque appel

au moment ougrave lerreur sest produite et ainsi identifier des problegravemes entre autres dans

le cas des fonctions reacutecursives

524 Structures de support

Dimportances mineures la plupart de ces structures servent agrave geacuterer lexeacutecution des

meacutethodes

- La classe Frame repreacutesente le cadre dexeacutecution dune fonction Cette classe permet

dobtenir des fonctions reacutecursives car on peut imbriquer un Frame dans un autre

- La classe Methodlnfo repreacutesente une fonction deacutefinie agrave linteacuterieur de SDDL Elle

permet de transfeacuterer lexeacutecution agrave la deacutefinition fournie par lutilisateur et regroupe

les informations geacuteneacuteralement utiles agrave la veacuterification seacutemantique (nom paramegravetres

etc)

- La classe PrimitiveMethodlnfo repreacutesente une fonction de Java accessible par la

reacuteflexiviteacute Elle fournit aussi quelques informations pour la veacuterification seacutemantique

- La classe MethodTable fournit une table pour geacuterer lensemble des fonctions afin

dacceacuteder directement agrave une fonction agrave partir de son nom

53 Accegraves agrave Postscript PDP et B-1EX

531 Postscript

Afin de reacutealiser correctement notre langage nous avions besoin dacceacuteder agrave diffeacuterentes

technologies Eacutetant donneacute que nous voulons terminer avec des dessins en format Postshy

script il devient important de pouvoir fournir aiseacutement du code dans ce format Il

67

sagit toutefois dun format relativement complexe et il devient donc long et complexe

de fournir une traduction valide pour chacun de nos diffeacuterents concepts

Le problegraveme principal de Postscript est quil possegravede un ensemble de primitives de tregraves

bas niveau En effet afin de dessiner une courbe la seule meacutethode possible est lutishy

lisation de courbes de Beacutezier avec des points de controcircle qui doivent ecirctre fournis agrave

lavance Comme nous lavons vu preacuteceacutedemment les courbes de Beacutezier sont tregraves prashy

tiques pour lordinateur mais peu pratique pour [utilisateur car la speacutecification de

points de controcircles qui ne sont pas interpoleacutes est peu intuitive De plus afin de faire

des courbes quelconques il faut les seacuteparer en plusieurs courbes de Beacutezier de tailles

infeacuterieures

Il existe des algorithmes qui permettent de prendre des courbes et de les seacuteparer en

sections adeacutequates Un de ces algorithmes est impleacutementeacute en Asymptote (Bowman

2007) Il est donc naturel afin deacuteviter davoir agrave reacuteimpleacutementer un algorithme aussi

complexe dutiliser Asymptote pour obtenir nos courbes de faccedilon systeacutematique

532 PDF

Le format PDF possegravede lavantage dinteacutegrer plusieurs fonctions multimeacutedias telles que

les liens les videacuteos les formulaires (Adobe Systems Incorporated 2006) etc Malgreacute

tout PDF outre les quelques ajouts nommeacutes ci-haut est essentiellement similaire agrave

Postscript Eacutevidemment les nombreuses possibiliteacutes fournies par le format PDF sont

deacutesirables (inteacutegrer des videacuteos agrave des notes de cours par exemple) Il existe toutefois

de nombreux convertisseurs qui peuvent prendre un fichier Postscript et le mettre au

format PDF Par contre cette conversion ne permet pas dajouter les fonctionnaliteacutes

PDF qui nous inteacuteressent Il devient donc crucial dobtenir une meacutethode pour fournir

des images directement au format PDF Encore lagrave le fait de passer par Asymptote

nous donne une solution rapide et eacuteleacutegante car le fait de fournir du PDF est inclus

dans le logiciel En geacuteneacuterant directement du Asymptote nous pourrions donc obtenir

automatiquement le format rechercheacute

68

533 ~1lE)C

Leacuteleacutement le plus crucial du langage que nous recherchions au deacutebut eacutetait de pouvoir

utiliser du texte tel que mis en forme par UTEX dans nos diagrammes Un tel besoin

implique plusieurs problegravemes

Premiegraverement un texte UTEX est conserveacute sous la forme dune chaicircne de caractegraveres

standard Par contre apregraves avoir eacuteteacute traiteacute le reacutesultat obtenu est une boicircte contenant

le texte mis en forme La taille de cette boicircte est deacutetermineacutee lors de la mise en page

et ne peut donc pas ecirctre deacutetermineacutee directement par notre programme Or si nous ne

connaissons pas la taille exacte de notre boicircte de texte il est impossible de positionner

un texte par une position autre que son coin supeacuterieur gauche Cela est un comportement

peu inteacuteressant eacutetant donneacute que dans de nombreux graphes on place le texte au centre

dun sommet (donc par exemple le centre de la boicircte sera placeacute au centre dune ellipse)

Afin de pallier agrave ce problegraveme il faudrait demander agrave UTEX de creacuteer les boicirctes une

premiegravere fois et de nous fournir les tailles des boicirctes Par la suite il faudrait geacuteneacuterer

une page UTEX de la bonne taille avec nos dessins puis dire agrave UIEX de geacuteneacuterer les

boicirctes de textes aux endroits que nous aurons calculeacute entre temps Bien que viable

cette meacutethode implique beaucoup de code et de cas diffeacuterents (laccegraves agrave IbIEX par un

programme externe va varier dun systegraveme dexploitation agrave lautre entre autres) Eacutetant

donneacute quAsymptote fournit deacutejagrave un accegraves agrave I5IEX agrave linteacuterieur du logiciel le travail

requis pour lutilisation de I5TEX est de beaucoup diminueacute

534 Geacuteneacuteration du code Asymptote

Afin davoir une solution valide il ne reste donc pl s quagrave nnecter not e so ution agrave

Asymptote Pour le faire nous devons premiegraverement geacuteneacuterer un fichier de code Asympshy

tote valide pour par la suite le faire valider en appelant le programme de maniegravere

externe Eacutetant donneacute que le projet a eacuteteacute eacutecrit speacutecifiquement pour fournir du code

Asymptote une solution simple a eacuteteacute utiliseacutee afin deacutecrire le code le canevas principal

69

public void draw(AbstractPoint location PrintWriter out)

AbstractPoint pl locationadd(new Point (radius 00)) AbstractPoint p2 locationadd(new Point(OO radius)) AbstractPoint p3 locationadd(new Pointe-radius 00)) AbstractPoint p4 locationadd(new Point(OO -radius))

outprintln(draw( + p1so1veO + + p2solveO + + p3solveO + + p4solveO + cycle))

Figure 54 Code pour geacuteneacuterer du code Asymptote pour un cercle

sera appeleacute agrave ecirctre dessineacute qui appellera reacutecursivement chacun de ses sous-canevas

La geacuteneacuteration du code Asymptote a eacuteteacute reacuteserveacutee dans une fonction draw speacutecifique agrave

chaque forme (Shape) qui eacutecrit dans un fichier ouvert fourni en paramegravetre Un exemple

dune telle meacutethode pour la classe Circle est illustreacute agrave la figure 54

Une telle meacutethode est simple mais suffisante pour nos besoins Bien sucircr agrave long terme

une solution plus robuste devrait simposer En effet comme leacutecriture du fichier est

faite directement lors de lexeacutecution les objets doivent ecirctre appeleacutes exactement dans

lordre dont ils sont deacutependants Par exemple un segment dessineacute entre deux cercles

doit ecirctre dessineacute apregraves les cercles car sinon les reacutefeacuterences seront absentes Dans ce cas-ci

le segment va toujours ecirctre deacutefinie par la suite Par contre si nous voulions rajouter

la possibiliteacute dutiliser des extensions dAsymptote cela impliquerait de les eacutecrire au

deacutebut du fichier Il est impossible de le faire avec cette solution

Une solution plus robuste serait dutiliser un outil lieacute agrave SabieCC qui est ObjectMacro

(Gagnon 2009) Cette extension nous permet de simplifier la geacuteneacuteration de code et

deacutecrire agrave des endroits arbitraires dans un fichier agrave laide de macros et de programmation

objet Cela nous permettrait aussi deacutetendre la geacuteneacuteration de code agrave plusieurs formats

diffeacuterents par exemple geacuteneacuterer directement du code PDF au lieu de geacuteneacuterer du code

70

Asymptote

61

CHAPITRE VI

REacuteALISATION DES DIAGRAMMES EN SDDL

Maintenant que nous avons notre programme complet et fonctionnel il faut veacuterifier son

efficaciteacute Nous proceacutedons en deux temps Premiegraverement il faut revenir agrave nos dessins

de base et les coder avec notre logiciel Par la suite il faut aussi les analyser en fonction

des diffeacuterents facteurs cruciaux que nous avons eacutenumeacutereacutes dans les chapitres preacuteceacutedents

Nous pourrons donc agrave partir de cela conclure si le logiciel savegravere efficace pour nos

besoins ou si certains problegravemes lempecircchent de fonctionner adeacutequatement

Naturellement nous avons pris le temps dappliquer cette analyse agrave chacun des dessins

dans notre base de diagrammes du domaine Par manque despace nous nanalyserons

dans ce chapitre que trois dessins Une attention particuliegravere a eacuteteacute porteacutee au choix de

ces dessins afin de repreacutesenter un eacuteventail assez large des capaciteacutes du logiciel et des

diffeacuterents eacuteleacutements cruciaux agrave obtenir dans la description dun diagramme Tous les

diagrammes sont disponibles en annexe avec code sans analyse deacutetailleacutee toutefois

Analyse du code des diagrammes existants

Pour faire notre analyse nous devons premiegraverement obtenir chaque dessin Dans ce cas

nous utiliserons un diagramme tireacute du domaine de la compilation Cela nous fournit un

graphe relativement standard avec un niveau de complexiteacute inteacuteressant sans toutefois

ecirctre trop complexe Par la suite nOlis analyserons un diagramme repreacutesentant une strucshy

ture de tableau Cela montre la capaciteacute du logiciel de travailler avec des structures de

72

donneacutees geacuteneacuterales Finalement nous effectuerons lanalyse dun diagramme de Venn qui

nest a priori pas supporteacute par le logiciel afin de voir la complexiteacute dun diagramme

totalement geacuteneacuteral et qui sort des conventions preacute-eacutetablies par le logiciel

611 Rappel des objectifs cruciaux agrave observer

Naturellement afin de faire une analyse rationnelle de notre solution il faut se remeacuteshy

morer les diffeacuterents objectifs que nous nous eacutetions fixeacutes Les plus importants eacutetaient les

suivants

- Inteacutegration avec Jb1EX Eacutetant donneacute le design de notre solution ce point est naturelshy

lement reacutealiseacute dans tous les diagrammes

- Description de structures Il nous faut pouvoir deacutecrire une structure de maniegravere aiseacutee

Le fait decirctre aiseacute est naturellement subjectif mais nous pouvons ramener le tout au

fait quil soit plus simple de deacutecrire dans notre logiciel Wle structure que dutiliser les

primitives de base du langage Par exemple il est plus aiseacute de deacutecrire une structure

en parlant de boicirctes et de liens quen parlant de lignes et de courbes

- Hieacuterarchie solide et extensible Nous ne testerons pas lextensibiliteacute de la solution car

elle a deacutejagrave eacuteteacute deacutemontreacutee Toutefois les diffeacuterents codes nous permettront danalyser

agrave quel point nous utilisons la hieacuterarchie que nous avons construite et agrave quel point elle

est reacuteellement pratique

Nous avions aussi dautres objectifs de moindre importance

- Gestion des erreurs Il nest pas possible avec du code compleacuteteacute de tester la gestion des

erreurs Lauteur peut toutefois garantir que sans la gestion des erreurs une grande

quantiteacute de temps aurait eacuteteacute perdu dans la reacutedaction du code des diagrammes et ce

malgreacute la connaissance profonde du langage sous-jacent

- Langage fluide et clair Cela peut ecirctre testeacute par le lecteur en regardant le code Si

une analyse rapide lui permet de comprendre le sens du code alors celui-ci est clair

Naturellement lauteur ne peut effectuer cette analyse par lui-mecircme Bien que nous

ne puissions en faire une analyse scientifique en inspectant le code reacutesultant nous

73

sommes confiants que la syntaxe que nous avons choisie est claire et permet dexprimer

clairement les concepts sous-jacents au langage

- Qualiteacute de la documentation et courbe dapprentissage Il sagit ici dun autre eacuteleacutement

que nous pouvons difficilement aborder par nous-mecircmes Cela ne sera pas pris en

compte dans notre analyse

Selon ces diffeacuterents facteurs nous voyons que nous devrons surtout nous concentrer sur

la structure geacuteneacuterale du code ainsi que sur sa complexiteacute Le code doit ecirctre facile agrave

lire tout en permettant de compacter un maximum dinformation dans un minimum

despace

612 Diagramme de compilation

Notre premier dessin est tireacute dun livre de compilation Il sagit dun automate assez

standard et repreacutesente donc un bon diagramme moyen afin de voir les capaciteacutes de

notre logiciel

Figure 61 Diagramme dautomate de compilation

Quelques points importants sont agrave noter dans ce dessin Premiegraverement on note la

creacuteation dune structure sous-jacente (composeacutee dune ellipse et deux cercles) Par la

74

circlel Circle with [radius = 100] circle2 Circ le with [radius = 120] ellipse Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (1000 500) in main d3 put form at (1000 -500) in main put Text with [text $N(p_l)$] at (1000 1000) in main put Text with [text $N(p_2)$] at (1000 500) in main put Text with [text dotsJ at (100000) in main put Text with [text I$N(p_n)$J at (1000 -500) in main

put Text with [text = $s_O$J at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt(coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt(coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt(coord of anglePoint(1800) in maind3circle)

Figure 62 Code pour le diagramme dautomate

suite cette forme est appliqueacutee agrave plusieurs reprises dans le dessin Cela deacutemontre que

dans ce cas-ci il est possible de creacuteer et dutiliser des structures dun certain degreacute de

complexiteacute

On note aussi lutilisation des variables pour reacutecupeacuterer les dessins afin de pouvoir les

reacutefeacuterencer plus tard Cette eacutetape est aussi simple que lassignation agrave une variable Par

la suite on peut noter les flegraveches qui sont traceacutees agrave partir de points deacutefinis agrave partir de

certains cercles La structure mecircme est extrecircmement explicite dans ce cas et rend la

compreacutehension du dessin tregraves simple On reacutecupegravere aussi finalement les points formeacutes agrave

un certain angle dun cercle

75

La complexiteacute du diagramme est beaucoup plus simple quelle ne le serait avec des

primitives de base En effet les seuls dessins explicites que nous devons effectuer par

points sont les flegraveches De plus ces flegraveches sont relativement simples puisque nous navons

rien agrave speacutecifier pour le bout de flegraveche seulement les extreacutemiteacutes Pour le reste les formes

sont soient deacutefinies agrave partir de notre hieacuterarchie (comme les cercles ou les ellipses) ou

bien par un collage de formes plus simples (comme pour la forme form) Les points sont

obtenus par des accegraves structureacutes et fournissent donc des valeurs exactes rendant ces

opeacuterations extrecircmement rapides agrave eacutecrire pour lusager

On note toutefois quil existe certains eacuteleacutements dans le code qui auraient pu ecirctre simshy

plifieacutes afin de rendre le code encore plus compact En effet nous remarquons la preacutesence

de beaucoup de valeurs explicites alors quil aurait eacuteteacute possible de les remplacer par des

variables afin de rendre le tout plus clair

Un eacuteleacutement qui aurait pu amener une touche de simplification aurait eacuteteacute dutiliser des

listes ou des boucles afin dinseacuterer plus aiseacutement les objets Par exemple la structure

complexe aurait pu ecirctre ajouteacutee plusieurs fois par une boucle for avec des positions

calculeacutees en fonction de lindex Nous sommes toutefois davis que malgreacute lameacutelioration

possible que cela fournit au code il est peu probable que les utilisateurs finaux prennent

le temps de faire ce genre de modification et utiliseront fort probablement plus des

positions relatives avec une seacuterie dappels sauf si le nombre dobjets agrave positionner

devenait grand (par exemple une dizaine dobjets)

En geacuteneacuteral nous pouvons toutefois consideacuterer que ce diagramme est simplifieacute de beaushy

coup par lutilisation de notre solution La grande part du code est explicite et la strucshy

ture est tregraves simple agrave observer en regardant uniquement le code Mecircme si tout nest pas

parfait il y a clairement avantage agrave utiliser le logiciel pour coder cet automate

613 Diagramme de tableau

Notre second dessin est tireacute dun livre sur les structures de donneacutees Il repreacutesente

leacutevolution dune structure de donneacutee simple (un tableau) agrave travers certaines modifishy

76

cations

a ab 1 0 2 8 (lime

1 -10

3 7

iuml

Figure 63 Diagramme de tableau

Un des points les plus inteacuteressants de ce dessin est lutilisation dune fonction Elle place

une forme dans un canevas agrave plusieurs endroits speacutecifiques en fonction dune position de

deacutepart et dun vecteur de translation Cela nous permet de placer une forme identique

(un carreacute) plusieurs fois de suite ce qui nous donne limpression quil sagit en reacutealiteacute

dun tableau

Un autre point qui est tregraves important dans ce dessin est que les nombreux carreacutes sont

en fait tous des instances du mecircme deacutefini au deacutebut Cela permet de modifier lensemble

des carreacutes aiseacutement en ne modifiant que les proprieacuteteacutes de celui de base Pour le reste du

dessin il sagit surtout dun ensemble de flegraveches et de textes positionneacutes agrave des endroits

speacutecifiques

En analysant le code on voit une ameacutelioration claire provoqueacutee par le fait dutilishy

ser une fonction pour placer les carreacutes Cela nous permet de simplifier de beaucoup

les appels et les reacutepeacutetitions Nous pouvons toutefois noter que quelques ameacuteliorations

suppleacutementaires pourraient ecirctre apporteacutees En effet une classe aurait pu ecirctre eacutecrite en

Java pour repreacutesenter un tableau agrave lhorizontale ou agrave la verticale Cela aurait pu simshy

plifier significativement le code du dessin en combinant dans la structure le texte et

les carreacutes utiliseacutes pour repreacutesenter le tableau lui-mecircme De plus les flegraveches auraient pu

ecirctre deacutetermineacutees agrave partir de points obtenus du tableau lui-mecircme (par exemple le coin

supeacuterieur droit ou supeacuterieur gauche) auxquels nous aurions ajouteacute un vecentierteur de

deacuteplacement

77

fun dropMany(f n s v c) for i from 1 to n do

put f at (s + (i - 1) v) in c end

square = Square with [length = 200] changeVec = (00 -200) dropMany (square 4 (00 00) changeVec main)

dropMany(square 3 (500 00) changeVec main) dropMany(square 1 (1000 00) changeVec main)

dropMany (square 1 (1500 00) changeVec main) put Text with [text=O] at (00 00) in main

put Text with [text=l] at (00 -200) in main put Text with [text=3] at (00 -400) in main

put Text with [text=7] at (00 -600) in main put Text with [text=bf a] at (500200) in main put Text with [text=2] at (500 00) in main

put Text with [text=4] at (500 -200) in main put Text with [text=7] at (500 -400) in main

put Text with [text=7] at 0000 00) in main put Text with [text=bf $a-b-+$] at 0500 200) in main

put Text with [text=8] at 0500 00) in main put Text with [text=none] at (2000 00) in main

020 100)-gt(380 100) (620 100)-gt(880 100)

(1120 100)-gt0380100) 0620 100)-gt0880100)

Figure 64 Code pour le diagramme de tableau

Avec ces changements le code aurait pu ecirctre beaucoup plus compact Bien que cette

option soit reacutealisable nous ne lavons pas impleacutementeacutee car il eacutetait important de limiter

ce quun usager peut creacuteer sans lutilisation de Java Cela est ducirc au fait que notre objectif

est que seulles utilisateurs experts se servent de Java afin dameacuteliorer le logiciel Le code

est tout de mecircme significativement meilleur que de placer tout agrave la main ce qui nous

permet de conclure agrave lefficaciteacute de notre logiciel dans le cas dune structure geacuteneacuterale

78

614 Diagramme de Venn

Notre dernier dessin est une structure qui ressemble beaucoup plus agrave un dessin geacuteneacuteral

cest-agrave-dire un diagramme de Venn La forme dun tel diagramme fait quil est extrecircmeshy

ment complexe deacutecrire une classe qui permet de dessiner automatiquement ce type de

structure et quil vaut mieux creacuteer les formes une par une comme on le ferait agrave la main

Cela nous permettra danalyser si les choses simples agrave dessiner agrave la main demeurent

facile agrave reacutealiser avec notre logiciel

A

Figure 65 Diagramme de Venn

Ce dessin ne possegravede pas beaucoup de grands points dinteacuterecirct En effet la structure ne

peut pas vraiment ecirctre geacuteneacutereacutee automatiquement par un algorithme alors elle est entreacutee

manuellement On remarque tout de mecircme lutilisation de plusieurs sous-canevas afin

de simplifier le placement des objets qui sont agrave linteacuterieur dautres

Naturellement eacutetant donneacute que la structure doit ecirctre deacutecrite manuellement le code

nest pas plus court que lutilisation de primitives de base Par contre cela est comshy

penseacute par un niveau de clarteacute supeacuterieur eacutetant donneacute lutilisation des canevas afin de

regrouper les eacuteleacutements dans des ensembles respectifs Cfla permet de positionner tous

les eacuteleacutements en valeurs relatives au lieu dabsolues ce qui simplifie de beaucoup le travail

de positionnement

De plus le fait de pouvoir stocker les eacuteleacutements dans des variables nous permet de les

identifier par diffeacuterents noms significatifs ce que des primitives de base comme celles

79

circle = Circle with [radius = 100] bigcircle = Circ le with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvas1 put circle at 050 150) in canvas1 put Text with [text = H] at 050 150) in canvas1 put circle at (-150 150) in canvas1 put Text with [text J] at (-150 150) in canvas1 put Text with [text = B] at (00 -150) in canvas1

put bigcircle in canvas2 put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = F] at 050 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = E] ac (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvas1 at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = A] at (00 -300) in main put bigellipse in main

Figure 66 Code du diagramme de Venn

de PDF ne nous permet pas de faiTe Nous pouvons donc en conclure que mecircme pour

les structures difficiles agrave repreacutesenter notre logiciel fournit tout de mecircme un nombre

significatif davantages

Preacutesentation du produit final

Une fois que nous avons pu confirmer que notre logiciel eacutetait efficace il ne restait plus

quagrave le faire connaicirctre Nous preacutesentons donc ici un reacutesumeacute des efforts qui ont eacuteteacute

effectueacutes afin damener le logiciel agrave la connaissance de la communauteacute gIEX

62

80

621 Statistiques et documentation

En premier lieu avant de pouvoir preacutesenter notre solution il nous fallait la documenter

correctement En effet leffort de deacuteveloppement nous aura permis de deacutevelopper un

produit de tregraves grande taille La taille totale du travail se limite agrave environ 10 megs mais

cela implique plus de 6300 lignes de code deacuteveloppeacutees speacutecifiquement pour le projet

(cela incluant les commentaires mais excluant tout le code geacuteneacutereacute par SableCC qui est

tregraves exhaustif) Avec une taille aussi significative il est tout simplement impensable de

sattendre agrave ce quun utilisateur analyse le code afin de trouver ce qui va reacutepondre agrave ses

besoins

Pour cela nous avons pris le temps de reacutediger une documentation interne Elle consiste agrave

documenter chaque classe de notre hieacuterarchie ainsi que chaque fonction disponibles Cela

fournit des renseignements complets pour quelquun qui cherche un eacuteleacutement speacutecifique

du langage

622 Preacutesentation

Par la suite nous avons reacutedigeacute une preacutesentation pour la confeacuterence TUG 2010 que nous

avons preacutesenteacutee le 28 juin 2010 agrave San Francisco devant des membres tregraves influents de

la communauteacute JbTEX dont Donald Knuth le creacuteateur original de TEX La confeacuterence

nous a permis de nous mettre au pouls des besoins de la communauteacute et de linteacuterecirct

quils portent agrave un tel projet La reacuteponse se voulait enthousiaste particuliegraverement de

la part du preacutesentateur dAsymptote John Bowman La confeacuterence est disponible sur

le site de River Valley (Bourgeois 2010) (malheureusement sans videacuteo eacutetant donneacute un

problegraveme dopeacutemt ur)

Bien quil sagisse dun eacuteleacutement tregraves important dans la preacutesentation dun projet une

confeacuterence ne rejoint pas beaucoup de monde Pour combler ce besoin nous avons aussi

reacutedigeacute un article pour la revue TUGBoat (Bourgeois et Villemaire 2010a) qui est la

revue principale de la communauteacute JbTEX Nous avons inclus larticle en annexe Cela

81

nous a permis de rejoindre un public beaucoup plus grand quune simple preacutesentation

devant public

623 Site web

Finalement afin de faciliter la distribution de notre logiciel nous avons deacuteveloppeacute un site

web (Bourgeois et Villemaire 2uuml1uumlb) pour accompagner la preacutesentation et permettre le

teacuteleacutechargement Le site contient aussi toute notre documentation ainsi que les contenus

des preacutesentations et articles que nous avons mentionneacutes plus haut Nous avons aussi pris

le temps de fournir quelques exemples suppleacutementaires afin de montrer lattrait direct

de SDDL

63 Conclusion de notre analyse

Nous concluons que notre solution est efficace et quelle respecte agrave diffeacuterents niveaux

les critegraveres que nous nous eacutetions fixeacutes au deacutepart Il sagit dune hieacuterarchie dobjets facile

et extensible accompagneacutee dune syntaxe claire et fluide Avec lajout de la gestion des

erreurs et sa capaciteacute agrave deacutecrire plusieurs formes de structures notre logiciel permet de

simplifier la repreacutesentation des diagrammes classiques du domaine Nous en venons donc

agrave la conclusion que notre solution respecte les diffeacuterents critegraveres et nous pouvons donc

consideacuterer notre solution comme eacutetant valide

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CONCLUSIOK

La creacuteation de diagrammes structureacutes comme nous avons pu le constater tout au long

de ce meacutemoire est un sujet tregraves complexe Bien quil puisse de prime abord necirctre vu

que comme la capaciteacute de faire des petits dessins simples nous remarquons rapidement

que les deacutecrire tels que nous les voyons est beaucoup plus difficile quil y parait

Entre autres nous avons pu constater que les diagrammes sont penseacutes de maniegravere

extrecircmement abstraites En effet dans un arbre nous ne voyons pas une seacuterie de somshy

mets relieacutes par des points mais bel et bien un arbre seulement Cette capaciteacute agrave abstraire

la forme du contenu est extrecircmement pratique pour un ecirctre humain mais pas tregraves utile

pour un ordinateur Il est extrecircmement difficile dessayer de saffranchir du besoin de

speacutecifier la forme lorsquon veut creacuteer un diagramme

Il en est de mecircme avec IbTEX duquel nous nous sommes inspireacute Bien que le logiciel

puisse faire la forme de maniegravere adeacutequate dans plusieurs cas ces derniers savegraverent tregraves

speacutecifiques et plus souvent quautrement la possibiliteacute dobtenir un niveau accru de

controcircle sur la forme est souhaitable Dautre part la question du positionnement dun

texte scientifique dans une page a eacuteteacute abondamment eacutetudieacute (entre autre par la creacuteation

de TEX) alors que le bon positionnement dun diagramme la eacuteteacute beaucoup moins Il

est donc probleacutematique de se deacutebarrasser de cet eacuteleacutement de forme dans nimporte quel

logiciel de creacuteation de diagrammes

Cela nous amegravene donc agrave la question naturelle de savoir si notre logiciel savegravere une solushy

tion valide agrave notre probleacutematique initiale En effet bien que notre analyse deacutemontre que

la creacuteation de dessins devient plus simple nous ne pouvons affirmer que nous eacutecrivons

ce que nous pensons du diagramme

- -

84

Or comme la question est de veacuterifier la validiteacute de notre solution nous reacutepondrons par

laffirmative Mecircme si elle nest pas parfaite un degreacute de complexiteacute se trouve eacutelimineacute

malgreacute tout Il est tout de mecircme possible pour un utilisateur de penser en des termes plus

abstraits mecircme sil ne sagit pas du niveau dabstraction optimal De plus eacutetant donneacute

que nous avons creacuteeacute notre solution pour ecirctre extensible il est possible daugmenter le

niveau dabstraction avec la contribution de la communauteacute Bien que la solution ne soit

pas parfaite et aurait pu jouir dameacuteliorations subseacutequentes lobjectif principal eacutetait de

deacutevelopper un langage qui simplifiait la description de diagrammes structureacutes et cela

fut atteint

Naturellement eacutetant donneacute les limites de temps et de complexiteacute plusieurs pistes de

deacuteveloppements suppleacutementaires nont pu ecirctre utiliseacutees En effet nous nous sommes

limiteacutes agrave la description dune image statique Il est toutefois tregraves utile de pouvoir creacuteer

des images dynamiques La possibiliteacute de creacuteer des seacutequences de mouvements agrave linteacuterieur

dun diagramme aurait pu rendre notre outil plus inteacuteressant De plus lUl outil de

geacuteneacuteration automatique de graphes ou darbres mecircme imparfait pourrait fournir des

choix suppleacutementaires agrave un utilisateur qui souhaite obtenir un reacutesultat rapidement sans

toutefois rechercher un reacutesultat parfait

Il est toutefois bon de noter que bien quil soit long et complexe deffectuer de tels

ajouts notre logiciel a eacuteteacute penseacute en fonction de pouvoir ecirctre eacutetendu par lutilisateur Il

est donc tout agrave fait possible de pouvoir eacuteventuellement fournir de telles fonctionnaliteacutes

dans une version future du programme Dici lagrave celui-ci suffira amplement agrave la creacuteation

de diagrammes simples

APPENDICE A

PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

Nous incluons ici larticle complet que nous avons reacutedigeacute agrave propos de notre logiciel

afin den faire la promotion aupregraves de la communauteacute TEX et JbTEX Cet article qui fut

preacutesenteacute dans Tugboat la revue du TEX Users Group tel que mentionneacute preacuteceacutedemment

compleacutemente la preacutesentation qui fut effectueacutee lors de la confeacuterence du mecircme groupe

agrave San Francisco Larticle est essentiellement une introduction pragmatique pour un

utilisateur final et fournit donc plusieurs exemples inteacuteressants dutilisation tout en

deacutecrivant briegravevement les diffeacuterents concepts importants qui ont meneacutes le deacuteveloppement

de SDDL Il sagit de la version finale tel que Jarticle apparait dans le numeacutero de Tugboat

206

Drawing structured diagrams with SDDL

Mathieu Bourgeois and Roger Villemaire

Abstract

We present SOOL a Structured Diagram Description Language aimed at producing graphical representashytions for discrete mathematics and computer science SDDL allows combining graphical objects (circles lines arrows ) and lbTEX boxes to produce diashygrams representing discrete structures such as graphs trees etc with an easy-to-use domain specific lanshyguage

1 What is SDDL

SDDL Structured Diagram Description Language is a high-level domain specific language tailored for diagrams that have an inherent structure Examples of these might be trees graphs and automata Any diagram that is naturally structured can be described in SDOL However it was designed especially for data structures appearing in computer science and discrete mathematics

The main objective of this language is to realize drawings in a natural and structured way Mainly one describes a drawing in SOOL in a way that is simishylar to drawing on a blackboard For example specific shapes (like circles ellipses texts boxes) are drawn at positions that can be either absolute or relative to specific points on already placed shapes Since we aim at mathematical drawings text is handled through lbTEX

Since exhibiting the structure of a diagram is esshysential to our purpose SOOL uses an object-oriented hierarchy completely written in Java under our high-levellanguage Having shapes as objects makes structuring of diagrams easier and more intuitive since most shapes are explicitly represented by a class Furthermore extension by the end user is quite feasible since Java is a well-known language

At the lower level SDDL uses another graphishycal description language for lbTEX namely Asympshytote [1] Our tool produces Asymptote code which is finally converted to an encapsulated PostScript (eps) vector file

2 Canvas and shapes

A diagram in SDDL is defined by a main Canvas It is just like a standard painting canvas in the sense that we can place (or paint) different things on it as much as we like The things we can place inside a Canvas are Shapes Thus for creating a Hello world diagram we would use the following

put Text with [text = Hello worldJ in main

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

resulting in

Hello world

In this example Text is a Shape and it posshysesses a property text which is the JbTEX string used to render the text Each Shape defines a cershytain number of such properties

SDDL permits the definition of variables It is a dynamically typed language so variables dont have to be declared before being used Variables make it possible to reuse the same Shape at multiple locations For example

a = Circle with [radius = 100] put a at (-75 00) in main put a at (75 00) in main

m In this example we specify the location where we want our Shape to be If a location is not specified with the at clause the Shape will be placed at the point of origin of the current Canvas which is its center

One important thing to note is that once a Shape has been put in a Canvas it is immutable It cannot be modified or removed A Shape can be modified alter it has been drawn on a Canvas but this will have an effect only on later use of this object and will not modify the actual Canvas in any way a Shape always appears in a Canvas as it was at the moment it was added

When a Shape is created every property specishyfied by the user is set in the given order It is not necessary to specify ail properties at once nor to set ail of them Most of the properties have appropriate default values However sorne properties if not set will yield strange results For example a circle with no radius property set will have a defaul radius of O Usually property order is irrelevant For instance giving for an ellipse the radius along the x-axis or the y-axis first will yield exactly the saille result

a = Ellipse a = a with [xradius 200] a = a with [yradius 100] put a in main

o 3 Structuring multiple canvases

Every diagram consists of a main Canvas However we can define other Canvas objects if we wish An additional Canvas can be introduced using a typical variable assignment However when a put command is used SODL checks to see if the canvas variable is

4

207 TUGboat Volume 31 (2010) No 2

already defined If it isnt it automatically creates an empty Canvas for use

One of the main reasons to use other Canvases is to create an explicit structure in our diagram Since a Canvas is a Shape once a sub-Canvas has been created it can be placed inside the main Canvas or any other one for that matter This will ensure that everything that is defined inside our sub-Canvas will be placed at the proper position in the final diagram However any Canvas that has been defined but is not linked directly or indirectly with the main Canvas will not be drawn in the final diagram

As an example lets say we want to make a diagram that consists of two identical eyes Instead of defining two identical objects we will create one in a Canvas named form and put it at different positions inside our main Canvas Our eye consists of a circle and an ellipse both with the same center Ali we need to do for this is place them at the default position of the Canvas Finally we can take this subshyCanvas and place it at the two positions required a ~ Circle with [radius~100]

b ~ Ellipse with [xradius~200 yradius~100]

put a in form put b in form put form at (-200 00) in main put form at (200 00) in main

Paths

SDDL offers support for the description of paths The way in which they are described is similar in syntax with MetaPost and Asymptote though with sorne variations A Path shape is described by linking points together with specific linking symbols To draw a line between two points the line symbol - shycan be used To link sorne points using a curve use the curved line symbol - which will use Asymptotes positioning algorithms to create a nice-looking curve which passes through those points For the moment user control over the curve is limited to beginning and ending tangents but could be expanded

pl ~ a--b--c p2 ~ a-b-c

One of the other things you may want to do with a Path is to create an Arrow out of it SDDL defines symbols for forward backward and bidirectional arshyrows for both linear and curved lines Right now however support is restricted to forward arrows

pl ~ alt-b--c-gtd p2 alt-b-c-gtd p3 alt-gtb p4 aCgtb

Once a Path is defined it can be used as any other Shape However one of the main things that you want ta do is ta put your Path somewhere For this you can write something Iike this p ~ (00 00) -- (100 100) put p in main

This is the standard way to add Shapes ta a Canvas However since Paths are usually used to link different Shapes together in the main Canvas special handling is done in SDDL Namely a Path that is not explicitly assigned to a variable will be automatically placed in the main Canvas Therefore the Path will be directly placed in main without any explicit put expression Thus linking has its own special syntax which is more natural and convenient As an example this program (00 00) -- (100 100)

yields exactly the same result as the one just above Furthermore points can be added and multiplied by a scalar (as vectors) Using a dot to locate the origin of the drawing we can use the SDDL syntax ta create this example a ~ (100 100) a--20a-gt(300 00) a-(-10)a-(300 00)

ocirc Finally as we will now see Shapes also usually

define specifie points

5 Drawing and linking shapes together

Ta draw a diagram usually sorne shapes with a specific structure are first laid down Once that is done those objects are linked together with lines curves and arrows However these links must be made between specific positions usually derived from one or more specifie Shapes For example we may want to link the northwestern point of a rectangle with the point on a circle at an angle of 45 degrees These points could obviously be computed in advance However this becomes quite problematic when points are at peculiar angles or more complex relationships between points and Shapes are needed Worst of ail if the position or any other property of a Shape is changed ail computations will have to be redone

To ease object linking SDDL provides so-called reference points A reference point is a point that has no static value unlike points defined by a pair of two real numbers Instead a reference point is defined by its relationship to a specifie Shape appearing at a particular location As a matter of fact ail reference

Drawing structured diagrams with SDDL

208

points are defined along with the Shape because they are a natural part of it This ensures that we always have nice-looking lines at exactly the positions we want them to be

However a reference points exact position in a Canvas will depend on the Shapes position Worse since the same Shape can appears at multiple locashytions in the same Canvas we have to know which occurrence we are talking about

Therefore SDDL introcluces a feature called a Drawing A Drawing is an object that represents a Shape at a particular position Le a specifie occurshyrence of a Shape in a Canvas Whenever a Shape is put inside a Canvas a Drawing is returned and can be assigned to a variable This gives a way to uniquely identify every occurrence of a Shape apshypearing in a Canvas If the same Shape is placed twice two different Drawings will be returned each referring to a different occurrence of the same Shape

a = Circle with [radius = 100] dl = put a at (-100 00) in main d2 = put a at (100 00) in main

Once a drawing has been defined a way to access its points is needed SDDL defines a syntax for extracting points from drawings

coord of (coord) ( (args) ) in (drawing)

Here one specifies the kind of point to use (( coord) ) and any particular arguments required to obtain it The available points are Shape specifie so only those kinds of points which make sense for the particular Shape can be used For instance one can get a point at a particular angle on a Circle This is also an example where an additional argument is needed For instance anglePoint(450) will give the point at 45 degrees

Finally to reference the drawing from which we take the point its clrawing Path (a dot separatecl path) from the main diagram must be given

a = Circle with [radius = 100] dl = put a at (-75 00) in main d2 = put a at (75 00) in main (coord of anglePoint(OO) in maindl)

(coord of anglePoint(1800) in maind2)

m In this example a line between two identical circles is drawn The drawing Paths are simple here since both drawings are made directly in main Thus only main followed by the drawing name is needed

Simply giving a Drawing is not sufficient in order to make reference points non-ambiguous complete drawing Paths are required as we will now show Lets go back to the two eyes we drew previously

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

The eye was defined by a circle and an ellipse both put inside a sub-Canvas Now lets say we want to draw a line between the two circles Each of those circles is defined in the sub-Canvas and they are as a matter of fact the same Drawing a Adding a link between a and itself wauld add a link between the sub-Canvas circle and itself (what could this mean) Adding the sub-Canvas to the main Canvas twice as we did before would just duplicate this structure inside the main Canvas

But since a Canvas is a Shape we get a drawing when we put the sub-Canvas inside main We can therefore identify each inner circle by listing the drawings required to access them as shown in the following SDDL example Thus we can always link together Shapes that are deeply nested inside a subshyCanvas a = Circ le with [radius=100] b = Ellipse with [xradius=200 yradius=100] c = put a in form put b in form fl = put form at (-200 00) in main f2 = put form at (200 00) in main (coord of anglePoint(1800) in mainflc) -gt

(coord of anglePoint(OO) in mainf2c)

6 Programming constructs and lists

SDDL also defines typical programming constructs For instance Iists are created and elements accessed in a syntax similar to most other dynamic languages Since the content of a list is a general Java Dbject you can create a list of objects that are not of the same type Thus an assignment like l = [20 (00 00) [] a--b]

is perfectly legal even if not typically very useful A more typical use of Iists would be list = [(00 00) (100 100)] 1= list[O] 12 = list [1]

1--12

Lists are nice but to use them properly adeshyquate programming canstructs are needed such as for and while loops SODL defines those permitting us to draw arrays of Shapes or riAfine points through a simple list

The ability to use loops significantly simplifies many diagrams in computer science In this example we first define a Iist of points Afterward using a for loop we link those points into a linear Path a = [(100 100) (200 100)

(200 200) (100 200)] for i from 0 to 2 do

209 TUGboat Volume 31 (2010) No 2

a[i]--a[H1)

end

Alternatively we coulcl get the same result using the following while loop i = 0 hile i 1= 3 do

a [il --a [i+1] i = i + 1

end

7 Functions

SDDL also permits the creation of functiolli inside the code Those must be written before the diagram description A SDDL function is defined with the keyword fun The list of arguments does not need to be typed only named The return type (if it exists) does not need to be specified either To cali the function in the resulting code a typical C-like cali is used fun dropManyCs i v n c)

for j from 1 to n do put s at i + jv in c

end

circle = Circ le vith [radius = 50] dropManyCcircle COO 00)

C50 00) 100 main)

(rtttt3JJJ) In this case we define a function that drops

many instances of a Shape s at different positions on a Canvas c The positions of the Shape are detershymined by an initial point i and a translation vector v Finally the number of Shapes placed is also given as a parameter n Each Shape is then placed at the initial point translated by the translation vector a certain number of times This permits us to create many circles along one line

One important point is the parameter for the Canvas in which we place the Shapes However we pass main as our parameter The reason for this is that SDDL does not possess global variables A function can only access its parameters and variables that have been defined inside the function Thus trying to place something in main From inside a funcshytion will yield an errer message saying the variable main is unknown

8 Primitives

SDDL as mentioned before is written in Java One of the nice features of Java is its libraries Many classes have been written for any number of different tasks and the number of functions and algorithms implemented is astonishing To rewrite libraries that are already defined in Java or to link them one by

one in SDDL seemed pointless It is much nicer to directly use those functions since theyre already there

Since Java is a reftexive language in the sense that the program knows about itself and can modify itself at will functions can be dynamically accessed at runtime We already use this feature to simplify the definition of the SDDL interpreter the interpreter doesnt have to know every possible type of Shape in order to work Using these same mechanisms permits loading classes at runtime and gives the user the power to cali From inside SDDL any Java function

This is done through so-called primitives which are defined using the keyword primitive followed by the name of the function as it will appear in SDDL Following that two strings are given one for the package in which the function is defined and one for the name of the function as it was defined in Java Any primitive declaration must be made prior to any function definition

Lets look at an example One of the main things a diagram description language would require is sorne basic mathematics and geometry libraries Java possesses a nice java lang math package which we would like to use especially the sin and cos funcshytions For this we will need to define two primitives primitive static sin javalangMath sin primitive static cos javalangMath cos

Once they are defined they can be called just like any other SDDL functions In this case we will use those functions to place circles around an invisible circle for i from 1 to 6 do

put Circle vith [radius = 50] at C200 cos(i 314 30) 200 sin(i 314 30raquo

in main end

00 o 0 00

9 A concrete example

Now that we have ail our tools lets use SDDL to describe a simple diagram of an automaton This is the complete code along with the resulting image circlel Circle vith [radius = 100] circle2 Circle vith [radius = 120] ellipse Ellipse vith [xradius = 500

yradius = 200] circle = put circlel at (-300 00) in form put circlel at C300 00) in form put circle2 at (300 00) in form

Drawing structured diagrams with SDDL

210

put ellipse in form

dl = put form at (1000 1000) in main d2 = put form at (1000 500) in main d3 = put form at (1000 -500) in main put Text with [text=$N(p_1)$]

at (1000 1000) in main put Text with [text=$N(p_2)$]

at (1000 500) in main put Text with [text=dots]

at (100000) in main put Text with [text=$N(p_n)$]

at (1000 -500) in main

put Text with [text = $s_O$] at (00 200) in main

d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle) (coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle) (coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

10 Modifying the hierarchy by adding shapes

Using what has been described above most diagrams can be created However many simplifications can be made and sorne domains may find it relevant to add classes specifie to their trade SDDL eases the modification of the Java hierarchy underneath the language by using reftexivity Any user who respects sorne basic guidelines will be able to have its class work automatica11y in SDDL without any specifie linking required

To do this every class must possess a certain number of properties Those properties are defined through setters and getters For instance for the

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

radius of a circle these are called setRadius and getRadius Any property that follows this rule will be accessible

Furthermore an empty constructor must also be defined that sets as much as possible default values for a11 properties of the defined Shape There are also sorne small functions to be defined like the draw and obtainPath functions Any reference points must also be defined with a function to obtain them

As an example lets say we would like to add a class to represent a cloud A cloud will have a number of spikes and a size The class definition (without function definition) that we would require would be the following

public class Cloud extends Shape double size int numberOfSpikes public Cloud() public void setSize(double size) public double getSize() public void setNumberOfSpikes(int n) public int getNumberOfSpikes() public void draw(AbstractPoint a

PrintWriter w) public Path obtainPath()

11 Future additions and availability

SDDL is available now at httpwwwinfo2uqam cal -villemaire_rReChereacuteheSDDL It is funcshytional though not by any means complete Many additional Shapes couid be added (in particular tree and graph classes) and options could be added to existing classes Development of the application conshytinues for the time being and a more thorough version will be made available

References

[1] John C Bowman and Andy Hammerlindl Asymptote A vector graphies language TUGboat The Communications of the TEX Users Group 29288-294 2008

o Mathieu Bourgeois Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada bourgeois dot mathieu dot 2 (at)

courrier dot uqam dot ca

o Roger Villemaire Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada villemaire dot roger (at) uqam dot ca httpintrainfouqamca

personnelsMembersvillemaire_r

APPENDICE B

PREacuteSENTATION DE LA GRAMMAIRE DE SDDL

Nous preacutesentons ici le contenu entier de la grammaire de SDDL tel que reacutealiseacute avec

SableCC Tous les eacuteleacutements du langage sont lagrave agrave lexception de la reacuteflexiviteacute dont les

deacutetails de code sont situeacutes dans la partie Java de notre projet

Package sddlsyntax

Helpers

any [O Oxffff]

tab 9 li 10 cr = 13

upper [ A 2 ]

lower [ a z]

digit [ 0 9]

name char = upper 1 lower 1 digit -

string_char = [[32 126] - ]

= J bulldot

not star = [any-] not_star_not_slash = [not_star - l]

Tokens

92

put_kwd = put at_kwd = at in_kwd = in fit_kwd = fit around_kwd = around if_kwd = if

while_kwd = while true_kwd = true false_kwd = false then_kwd = then else_kwd = else for_kwd = for from_kwd = from end_kwd = end to kwd to by_kwd = by do_kwd = do with_kwd = with and_kwd = and or_kwd = or fun_kwd = fun return_kwd = return primitive_kwd = primitive call_kwd = call static_kwd = static coord_kwd = coord of _kwd = of get_kwd = get

scaled_kwd = scaled slanted_kwd = slanted rotated_kwd = rotated translated_kwd = translated

straight_line_kwd = -- curved_line_kwd = - straight_fwd_arrow_kwd = -gt curved_fwd_arrow_kwd = -gt straight_bwd_arrow_kwd = (- curved_bwd_arrow_kwd = (- straight_bidir_arrow_kwd = (-gt curved_bidir_arrow_kwd = (-gt

93

plus = + minus = -

mult = div =

eq = == neq = = lt lt gt = gt leq lt= geq gt= not assign = =

dot = dot

l br = - r br ( l _par = ) r_par =

l cr = [ )

-r_cr = J

sc = comma =

id = lower name_char class_name = upper name_char

integer = (-) digit+ real = (-) digit+ dot digit+

) ) Il J )Ilstring string_char

blank = 1 tab 1 cr 1 If 1 cr If comment not_star ( (not_star_not_slash not_star))

Ignored Tokens

blank comment

Productions

file = [primitives] primitive [functions] function [stms] stm

94

primitive =

primitive_kwd static_kwd id [class_name] string [func_name] string signature sc

signature = l_par type_list r_par

type_li st = string [additional_types] additional_type

additional_type comma string

function = fun_kwd id l_par id_list r_par l_br [stms]stm r_br

id_list =

id [additional_ids] additional_id

additional id comma id

stm = exp exp sc 1

assign id assign exp sc 1

while while_kwd exp do_kwd [stms] stm end_kwd sc Il if if_kwd exp then_kwd [stms] stm else_part end_kwd sc 1

for for_kwd id from_kwd [low_bound] exp to_kwd [up_bound] exp do_kwd [stms] stm end_kwd sc 1

return return_kwd exp sc

else_part = else_kwd [stms] stm

exp = or exp or_kwd and_exp simple and_exp

and_exp = and and_exp and_kwd line_exp 1

simple line_exp

line_exp line line_exp line_op eq_exp with_part 1

95

1

1

simple eq_exp

line_op =

straight_Iine straight_line_kwd 1

curved_line curved_Iine_kwd 1

straight_fwd_arrow straight_fwd_arrow_kwd curved_fwd_arrow curved_fwd_arrow_kwd 1

straight_bwd_arrow straight_bwd_arrow_kwd curved_bwd_arrow curved_bwd_arrow_kwd 1

straight_bidir_arrow straight_bidir_arrow_kwd curved_bidir_arrow curved_bidir_arrow_kwd

eq_exp = eq [left] cmp_exp eq [right] cmp_exp 1

neq [left] cmp_exp neq [right] cmp_exp simple cmp_exp

cmp_exp = lt [left] add_exp lt [right] add_exp 1

gt [left] add_exp gt [right] add_exp 1

leq [left] add_exp leq [right] add_exp geq [left] add_exp geq [right] add_exp simple add_exp

add_exp = add add_exp plus mul_exp 1

minus add_exp minus mul_exp simple mul_exp

mul_exp =

mult mul_exp mult left_unary_exp div mul_exp div left_unary_exp simple left_unary_exp

left_unary_exp = not not left_unary_exp get get_kwd id from_kwd left_unary_exp put put_kwd exp at_part in_kwd left_unary_exp fit fit_kwd class_Dame around_kwd left_uoary_exp coord coord_kwd of_kwd id l_par

arg_Iist r_par in_kwd left_unary_exp 1

simple right_exp

96

right_exp = calI right_exp dot id l_par arg_Iist r_par 1

index right_exp l_cr exp r_cr 1

scaled right_exp scaled_kwd l_par eq_exp r_par slanted right_exp slanted_kwd l_par

[xslant] exp comma [yslant] eq_exp r_par rotated right_exp rotated_kwd l_par eq_exp r_par 1

translated right_exp translated_kwd l_par [xtranslate] term comma [ytranslate] eq_exp r_par 1

simple term

term =

par l_par exp r_par 1

point l_par [x_value] exp comma [y_value] exp r_par 1

drawing class_name with_part 1

var id 1

int integer 1

real real 1

true true_kwd 1

false false_kwd string string 1

list l_cr arg_Iist r_cr 1

static_call id l_par arg_Iist r_par

arg_Iist = exp [additional_args] additional_arg

additional_arg comma exp

with_part = with_kwd l cr options r_cr

options = option [additional_options] additional_option

additional_option comma option

option = id assign exp

APPENDICE C

PREacuteSENTATION DE LA HIEacuteRARCHIE

Nous preacutesentons ici la description complegravete de notre hieacuterarchie objet en Java Le tout est

deacutecrit agrave laide dun diagramme UML Toutefois afin de faciliter le formatage nous avons

seacutepareacute le tout en deux sections Le premier diagramme contient les noms des classes ainsi

que leurs relations dheacuteritage Par apregraves tous les diagrammes suivants repreacutesentent le

contenu speacutecifique de chaque classe sans les relations entre classes Ceci nous permet

dobtenir une vue densemble des classes tout en obtenant des deacutetails cruciaux sur

limpleacutementation de chaque classe

98

l -llill Pa aj f1 1 Sh middotisVIsible boolampan

+draw(locaton AbstractPoint oot PniltWriBl) void

+lsVlsigtle() boolean +copyO Shape +obtalnPathO Path

Drawlna

-numberOIDrawinm int =0 middotdrawingNumber (nt -dependendes DrawingD middotpointsDellned AbsttactPolntD middothasBeenDrawn booLean middotshape Shape dmWingName string middotdrowingPositlon AbstractPoint -position AbstnldPolnt

+Orawlog(s Shape) +Shape(s S~ location AbsbaclPoint) +setPositlcn(positlon AbslradPoinl) void +seIDraloVingName(nsme slJfng) void +gelName() string +geISUbDrawlng(name string) ~ Drawlng +re~~Jri~)slring

+addDeflO8dPoint(point AbstractPolnl) Int +hasBeenDraWn() booIean +lsDrawn() booIean +canBeDlBWn() booIean +getShape() Shape fdraw(Jocafion AbslraclPolnt out PrlnlWriler) void +obtainPathO Path -tdp(other Orawilg) AbslractPoilt

uare length double

+Squate() ~s ( ~ le)

ell-eoatMength double) void +getlongthO bulldouble +dmw(locabmiddotoo AbstrampctPoint out PrnMYler) void +obtainPath() Path ffOPY() Shape

99

Rectangle

-lengIh double -wldth double -100 KI boeacuteIean

+Rectangle() +Rectangle(length double wldth double) +selleogth~ength double) void +setWldth(Width double) void +seIRound(rlaquo)Ulld booIegravean) void +getlengtb( doubIe +getMdth() double +getRound() booIeao +getNorth(d Dmwlog) RefPoint lttget5outh(d Drawlng) RefPolnl +getwest(d DlaWlng) RefPoint +gelEaat(d Drawlng) RefPoinl +gelNorthwest(d Drawllg) RefPoInt +gelNortheast(d Drawlng) R1tfPolnt lttgetSou1hwe$(d Drawlng) RefPoInt +get5outheast(d Drawilg) RefPoklt +dl8wlocalion Absl18ctPoiIt Ougravet ~Mhl81 void ii)blainPathO ~ Path

CIrcIe

middotradlus double

+Clœ() +Clrcle(radlus double)

+COPYO Shape +setRadlus(radius ~ double) void +getRadius() double +getAnglePolnt(d Omwilg angle double) RefPoInt +dmwlocation AbstradPoirlt our AiltKtler) VOiCI iOblailPath() Path

ElIID8e

middotxradlus double middotyradlus double

+Ellpse() +copyO bullShape +setXRadlus(r double) void +setYRadIus(r doublrt) void -gelXRadlus() double +geIYRadius() double +draw(txalJon AbstractPomt out PrinMbl8l) IIOIumld iOblainPathO Path

100

Lino point1 AbslractPoln1 middotpoint2 AbstractPoint

+L1oe() +Llne(point1 AbstractPoint poill2 AbstractPolnt) +COPYO Shape +dmw(locaIJon AbsIroctPoinl out PrnIWril9f) void +selPolnt1 (poInl1 AbsttactPoint) void +seIPoill2(poinl2 AbslractPoinl) void +getPolnl1 () AbslraclPoinl tiJotPolnl2() AbstraclPolntn_~

EqTrtanale middotsim double

-EqTriangleQ +EqTrlangle(size double) +cOPYO Shape +setSlze(slze double) void +gets1ze() double +d18W(Jocolion AbstTadPoinl out Ptil1Wfit8f) void +oblalllPalhll Path

middotpath Path bulltext string middotposIlIon double -dir Poilt middotabsohJle boolean middothasTexl boolean

+Arrav(path Palh) +copyO Shape TCl(( ex s n~ U blo dn 010 aosolute boolean) void seISlartingTangcnl(dlr Poinl) void

seIEndflgTangenl(dir Potnt) void tgelPalhO Palh +obtalnPath Path

101

cany -canvasLlst Carwas(J -canvasPontLIsl AbstractPoinllJ daWVigUsl DrawingD dlawilgPolnlUst AbsJaCtPolntO middotIsMaIn booean canvasPosltion bullAbstmetPoint

+CsnYaS() copYO Shape +seteanvasPositIoR(posllon AbslraclPotnt) VOId +setMaln() void +f8Mai1() booIean +addShape(S Shapeloca1ion AbstradPoItit) Drawilg l+a~pe(S Shape IocagravetJon AllstraclPolnl name slring) DraNklg +getOtawiDg(I Inl) D1awlng ~elDtawfng(namamp string) bull Drawilg tgelOl8WIngiocal1on(namo stlllllJ) AbsllaclPoilt ~olDmwlngOrNull(name string) Drawilg tgelOrawinglocation(l int) AbslractPolnt o+getNumberOfDrawlngs() int +dl8w(location AbstrodPonr oui PrintwrllerJ void +dmwMain(oul PrinlWrllGr) void +drawCanvaa(locatlon AbSlractPoinl remalnlllQDraws Drawlna Il out Prlntwriter) void

Path -Bst AbstractPolnllJ middothasASIartilgTangent boolean -hasAEndhlgTangent booIean -startiogTangent Point middotendingTangent Point middot1sU1ear boolean

+PathO Psth(Ust AbstraclPoint 0) +Path(Dst Ab~tPolnt Q startingTangent Polnt endlngTangenl Point) +cOPYO Sh8p6 +addPoinl(poiumlnl Abstl8ClPoint) void +seIUnear() void +IsUnearO booloao +getPolnt(l Inl) AbsIraclPcInl +getPolnts() AbsIlaCPoht 0 o+getNumberOlPolnts() Rt +cyc1B() void -thasASI8rthgTangent() boolean +hasAEndingTangentO booIoan +getStattilgTangenlO PoiIl +getEndlngTangent() Polnl 4uumllSlartingTangenl(stllllngTangent Peint) w1d +seIEndIllQTangent(encliigTangenl ~nt) void +psthValue() strilg +dmwJocalion AbslradPoItlI oot FilMtJrer) void

102

Text

-told slfng

ImiddotTexl() +Texl(lext string) +sotText(tegravext string) void iil8tTeld() string +draw(Jocalion AbstroctPoJnl oof PrinWriter) void ~btalnPath() Path +CODV(J ShsD9

AbsctPolnl +altfd(second AbstraclPoinl) AbslractPolnt -tmulliply(multipier double) AbstraclPolnt +eombine(perœntage double second AbstraclPolnl) AbstractPoint +solvfJ() slrillg +COfNIJ AbslradPoinl

Point -x double y doub19

+POIcirclIO +POIOI(x double y double) +solvo() slting -+IoSlflngO string~ n bull

RefPolnt -mf8teflœDrawlng Drawlng -poIntNumbef Int

+RefPoint(referenceDrawing DraYIing poiolNu ber Illl) +SoNe() stmg +COPYO AbstroctPDAcirclf

lnauudJonPoint p Path

-q Palh

+lnlCfSecllonPoint(p Palh q Path) +COPYO AbstrampcfPoitlt +soIve() string

103

Un Point -point AbsbaclPoint -pIampStmg string -endStrlng string -value double

+UnaryMapPolnl(poInt AbstradPoInt) +ScW9() string +setMapTypeMultlpIy(vallJe double) void +c Abslr8ctPoinI

Bln oint frstPoint Absll8clPoinl secoodPoInt AbstrootPoint -pceSIring string -middIeSlrIng Itlfno -endString string

+8ilatyMapPolnt(fkstPoiIt Abstmc1Po1nt secondPolnt AbslraetPointl +cOPYO bull AbstraetPOOI +soAte() string +selMapTypeAddO void

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

APPENDICE D

PREacuteSENTATION DES DIAGRAMMES CHOISIS

Cet annexe comprend lensemble des quinze (15) diagrammes que nous avons choisis

comme base de qualiteacute pour notre projet Tel que mentionneacute preacuteceacutedemment nous avons

inclus agrave la fois le code de chaque diagramme en SDDL ainsi que le diagramme reacutesultant

Aucune analyse nest effectueacute pour ces dessins agrave lexception de ceux deacutejagrave analyseacutes au

chapitre 6

Start box triangle = EqTriangle with [size = 400J put triangle at (00 -100) in main put Text with [text = StartJ at (00 -50) in main

El box rectanglePos = (00 -500) rectangle = Rectangle with [length = 1600 width = 300J put rectangle at rectanglePos in main put Text with [text El J at rectanglePos - (600 00) in main put Text with [text $a leftarrow O$J

at rectanglePos + (-300 50) in main put Text with [text $b leftarrow l$J

at rectanglePos + (-300 -50) in main put Text with [text $a leftarrow l$J

at rectanglePos + (100 50) in main put Text with [text $b leftarrow O$J

at rectanglePos + (100 -50) in main put Text with [text $c leftarrow m$J

at rectanglePos + (500 50) in main put Text with [text $d leftarrow n$J

106

at rectanglePos + (500 -50) in main

1 E2 box 1 rectangle2Pos = (00 -1000) put rectangle at rectangle2Pos in main put Text with [text = E2 ] at rectangle2Pos (600 00) in main put Text with [text = $q leftarrow quotient(c div d)$]

at rectangle2Pos + (100 50) in main put Text with [text = $r leftarrow remainderCc div d)$]

at rectangle2Pos + (100 -50) in main

1 Round E3 box 1 rectangle3Pos = (00 -1500) roundRectangle = Rectangle with [length = 800 width 250

round = true] put roundRectangle at rectangle3Pos in main put Text with [text = E3 $r = O$] at rectangle3Pos in main

1 Stop box 1 stopPos = (1500 -1700) put triangle at stopPos in main put Text with [text = Stop] at stopPos + (00 50) in main

1 E4 box 1 rectangle4Pos = (00 -2000) put Rectangle with [length = 1600 width = 400]

at rectangle4Pos in main put Text with [text = E4] at rectangle4Pos + (-700 00) in main put Text with [text = $c leftarrow d d leftarrow r$]

at rectangle4Pos + (100 120) in main put Text with

[text = $t leftarrow a a leftarrow a a leftarrow t - qa$] at rectangle4Pos + (100 00) in main

put Text with [text = $t leftarrow b b leftarrow b b leftarrow t - qb$ ] at rectangle4Pos + (100 -120) in main

(00 -100) -) rectanglePos + (00 150) rectanglePos + (00 -150) -) rectangle2Pos + (00150) rectangle2Pos + (00 -150) -) rectangle3Pos + (00125) rectangle3Pos + (00 -125) -) rectangle4Pos + (00200) rectangle4Pos + (00 -200) -- rectangle4Pos + (00 -500)

rectangle4Pos + (-1000 -500) -- rectangle2Pos + (-1000 00) -) rectangle2Pos + (-800 00)

107

rectangle3Pos + (400 00) -gt rectangle3Pos + (1410 00) put Text with [text Yes] at rectangle3Pos + (480 -50) in main put Text with [text = No] at rectangle3Pos + (-80 -175) in main

Placing text notes put Text with [text Al $m gt 0 n gt 0$] at (3000 00) in main put Text with [text A2 $c=mgtO d=ngtO$] at (3000 -340) in main put Text with [text $a=b=O a=b=l$] at (3000 -460) in main put Text with [text A3 $am + bn = d am + b$]

at (3000 -740) in main put Text with [text = $0 leq r lt d gcd(dc) g$]

at (3000 -860) in main put Text with [text = A4 $am + bn d = gcd(m n)$]

at (3000 -1200) in main put Text with [text = A5 $am + bn d am + b$]

at (3000 -1540) in main put Text with [text = $0 lt r lt d gcd(cd) = g$]

at (3000 -1660) in main put Text with [text = A6 $am + bn = d am + b$]

at (3000 -1940) in main put Text with [text = $gcd(c d) = gcd(m n)$]

at (3000 -2060) in main

(2500 00)-(2000 -50)-(1500 -150)-gt(00 -200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -400)-(2000 -450)-(1500 -650)-gt(00 -700) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -800)-(2000 -850)-(1500 -1150)-gt(00 -1200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2200 -1200)-(2000 -1200)-(1500 -1250) -gtrectangle3Pos + (900 00) with [startingTangent = (-10 00) endingTangent (-10 -10)]

(2250 -1600)-(2000 -1700)-(1500 -1900) -(1000 -1750)-gt(00 -1700) with [startingTangent = (-10 00) endingTangent (-10 00)]

(2250 -2000)-(1500 -2200)-gt(00 -2400) with [startingTangent = (-10 00) endingTangent (-10 00)]

108

~-- Al m gt On gt O

A2 c = m gt 0 d = n gt 0 a = b = 0 a = b = 1

A3 am + bn = dam + bdeg~ T lt dgcd(dc) = 9 E2

_--- A4 am + bn = d = gcd(m n)

A5 am + bn = dam + b Sto 0lt T lt dgcd(cd) = 9

Cf- d d f- T A6 am + bn = d am + bE4 t f- a a f- a a f- t - qa gcd(cd) =gcd(mn)t f- b b f- b b f- t - qb

primitive static sin javalangMath sin primitive static cos javalangMath cos primitive static sqrt javalangMath sqrt

fun ellipseCangle length width) return Clength cosCangle 20 31415 3600)

width sinCangle 20 31415 3600))

fun ellipseDeriveCangle length width) length2 = length length width2 = width width sinus = sinCangle 31415 1800) sinus2 = sinus sinus cosinus = cosCangle 31415 1800) cosinus2 = cosinus cosinus x = -10 Clength sinus)

sqrtCwidth2 cosinus2 + length2 sinus2) y = Cwidth cosinus) sqrtCwidth2 cosinus2 + length2 sinus2) return Cxy)

avail = Text with [text=AVAIL] link = Text with [text=LINKCP)] t = Text with [text=T]

109

put avail at ellipse(900 1000 500) in main put t at ellipse(1800 1000 500) in main put link at ellipse(OO 1000 500) in main

(ellipse(70 1000 500))-(ellipse(450 1000 500)) -gt(ellipse(750 1000 500))

(ellipse(1050 1000 500))-(ellipse(1350 1000 500)) -gt(ellipse(1730 1000 500))

(ellipse(1930 1000 500))-(ellipse(2700 1000 500)) -gt(ellipse(3550 1000 500))

AVAIL

~ T LINK(P)

primitive static sin javalangMatb sin primitive static cos javalangMatb cos

fun circular(angle radius) return (radius cos(31415 angle 1 1800)

radius sin(31415 angle 1 1800))

circleradius = 400 circle = Circle with [radius=100] g Text with [text=G] r = Text with [text=R] y Text with [text=Y]

put circle at (circular(300 circleradius)) in main put r at (circular(300 circleradius)) in main put circle at (circular(900 circleradius)) in main put r at (circular(900 circleradius)) in main put circle at (circular(1500 circleradius)) in main put g at (circular(1500 circleradius)) in main put circle at (circular(2100 circleradius)) in main put g at (circular(2100 circleradius)) in main put circle at (circular(2700 circleradius)) in main

110

put g at (circular(2700 circleradius)) in main put circle at (circular(3300 circleradius)) in main put y at (circular(3300 circleradius)) in main

(circular(450 circleradius))-(circular(600 circleradius)) -gt(circular(750 circleradius))

(circular(1050 circleradius))-(circular(1200 circleradius)) -gt(circular(1350 circleradius))

(circular(1650 circleradius))-(circular(1800 circleradius)) -gt(circular(1950 circleradius))

(circular(2250 circleradius))-(circular(2400 circleradius)) -gt(circular(2550 circleradius))

(circular(2850 circleradius))-(circular(3000 circleradius)) -gt(circular(3150 circleradius))

(circular(3450 circleradius))-(circular(OO circleradius)) -gt(circular(150 circleradius))

put Text with [text=tinyNEXTR] at (circular(900 circleradius)) + (00 150) in main

put Text with [text=tinyNEXTG] at (circular(-900 circleradius)) + (00 -150) in main

put Text with [text=tinyCURRENT] at (circular(-300 circleradius))+ (1~0 -150) in main

NEXTR

NEXTG

fun left(d)

return 016 coord of west in drectangle + 084 coord of east in drectangle

fun right(d)

return 016 coord of east in drectangle +

111

084 coord of west in drectangle

rectanglel = Rectangle with [length=600 width=200) rectangle2 = Rectangle with [length=200 width=200) circle = Circ le with [radius=10) put rectanglel in form rectangle = put rectangle2 in form put circle at (-200 00) in form put circle at (200 00) in form

dl = put form at (00 00) in main d2 = put form at (-600 -500) in main put Text with [text=IA) at (-600 -500) in main d3 = put form at (-1200 -1000) in main put Text with [text=IB) at (-1200 -1000) in main d4 = put form at (-1800 -1500) in main put Text with [text=ID) at (-1800 -1500) in main d5 = put form at (-600 -1500) in main put Text with [text=IE) at (-600 -1500) in main d6 = put form at (00 -1000) in main put Text with [text=IC) at (00 -1000) in main d7 = put form at (600 -1500) in main put Text with [text=f) at (600 -1500) in main d8 = put form at (-400 -2000) in main put Text with [text=IG) at (-400 -2000) in main dg = put form at (300 -2000) in main put Text with [text=IH) at (300 -2000) in main dl0 = put form at (1000 -2000) in main put Text with [text=JI) at (1000 -2000) in main

(left(dl))-gt(coord of north in d2rectangle) (right(dl))-gt(coord of east in dlrectangle + (00 50)) (left(d2))-gt(coord of north in d3rectangle) (right(d2))-gt(coord of north in d5rectangle) (left(d3))-gt(coord of north in d4rectangle) (right(d3))-gt(coord of south in d2rectangle) (left(d4))-gt(coord of west in dlrectangle + (00 50)) (right(d4))-gt(coord of south in d3rectangle) (left(d5))-gt(coord of north in d6rectangle) (right(d5))-gt(coord of north in d7rectangle) (left(d6))-gt(coord of south in d2rectangle) (right(d6))-gt(coord of north in d8rectangle)

112

(left(d7raquo-gt(coord of north in d9rectangle) (right(d7raquo-gt(coord of north in dl0rectangle) (left(dSraquo-gt(coord of south in d6rectangle) (right(d8raquo-gt(coord of south in d5rectangle) (left(d9raquo-gt(coord of south in d5rectangle) (right(d9raquo-gt(coord of south in d7rectangle) (left(dl0raquo-gt(coord of south in d7rectangle) (right(dl0raquo-gt(coord of south in dlrectangle + (100 00raquo

put Text wi th [text=List head] at coord of north in dlrectangle + (00 50) in main

circle = Circle with [radius = 100] bigcircle = Circle with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvasl put circle at 050 150) in canvasl put Text with [text = H] at 050 150) in canvasl put circle at (-150 150) in canvasl put Text with [text J] at (-150 150) in canvasl put Text with [text = B] at (00 -150) in canvasl

put bigcircle in canvas2

113

put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = Fil] at (150 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = liE] at (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvasl at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = Ali] at (00 -300) in main put bigellipse in main

A

fun drawBinaryTree(d s 0 dh dv n)

put s at a in d put 0-(0 + (-10 dh -10 dvraquo in d put 0-(0 + (db -10 dvraquo in d if (n == 1)

then return 0 else drawBinaryTree(d sa + (-10 dh -10 dv) db 20 dv n - 1) drawBinaryTree(d s a + (db -10 dv) db 20 dv n - 1) end

(0000)--(0000)

114

orlgln = (00 00) dv = 200 dh = 1000 bullet = Circle with [radius = 20) drawBinaryTree(main bullet origin dh dv 7)

bullet = Circle with [radius = 20] put bullet in main put bullet at (-300 -300) in main put bullet at (-600 -600) in main put bullet at (00 -600) in main put bullet at (300 -300) in main

(00 00)--(-300 -300) (00 00)--(300 -300) (-300 -300)--(-600-600) (-300 -300)--(00 -600)

(-100 00)-(-500 -300)-(-650 -650)-(-300 -400)shy(50-650)-(00-500)-(-150-300)-(-100 -200)shy(00-100)-(250-320)-(350-350)shy(320 -270)-gt(100 00)

circlel Circle with [radius 100]

lL5

circle2 = Circle with [radius = 120] ellipse = Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (100 0 500) in main d3 put form at (1000 -500) in main put Text with [text I$N(p_1)$] at (1000 1000) in main put Text with [text I$N(p_2)$] at (1000 500) in main put Text with [text dots] at (100 0 o 0) in main put Text with [text $N(p_n)$] at (1000 -500) in main

put Text with [text $S_O$] at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

sa

fun dropMany(f n s v c) for i from 10 to n do

put f at (s + (i - 10) v) in c

116

end

square = Square with [length=200] changeVec = (00 -200) dropMany(square 40 (00 00) changeVec main) dropMany(square 30 (500 00) changeVec main) dropMany(square 10 (1000 00) changeVec main) dropMany(square 10 (1500 00) changeVec main) put Text with [text=IO] at (00 00) in main put Text with [text=ll] at (00 -200) in main put Text with [text=13] at (00 -400) in main put Text with [text=17] at (00 -600) in main put Text with [text=bf ail] at (500 200) in main put Text with [text=12] at (500 00) in main put Text with [text=14] at (500 -200) in main put Text with [text=17] at (500 -400) in main put Text with [text=17] at (1000 00) in main put Text with [text=bf $a~b~+$] at (1500 200) in main put Text with [text=18] at (1500 00) in main put Text with [text=none ] at (2000 00) in main

(120 100)-gt(380 100) (620 100)-gt(880 100) (112 0 10 0) - gt(138 0 10 0) (1620 100)-gt(1880 100)

a ab+

~ -m-0-0-none 7

put Text with [text=IS] in main put Text with [text=A] at (00 -200) in main put Text with [text=B] at (00 -400) in main put Text with [text=$alpha$] at (-600 -600) in main put Text with [text=$beta$] at (-300 -600) in main put Text with [text=$gamma$] at (00 -600) in main put Text with [text=$y$] at (300 -600) in main put Text with [text=$z$] at (600 -600) in main

117

(-50 -50)--(-700 -540)--(-500 -540) (50 -50)--(700 -540)--(500 -540) (-50 -250)--(-400 -540)--(-200 -540) (50 -250)--(400 -540)--(200 -540) (-50 -450)--(-100 -540)--(100 -540)--(50 -450)

put Text with [text=D] in main

put Text with [text=T] at (-500 -500) in main put Text with [text=bf real] at (-500 -900) in main put Text with [text=4] at (-350 -500) in main put Text with [text= type] at (-150 -500) in main

put Text with [text=L] at (500 -500) in main put Text with [text=inh] at 050 -500) in main put Text with [text=5] at (350 -500) in main put Text with [text=6] at (650 -500) in main put Text with [text=entry] at (850 -500) in main

put Text with [text=bf $id_3$] at (900 -900) in main put Text with [text=bf ] at (500 -900) in main put Text with [text=3] at 0050 -900) in main put Text with [text=entry] at 0350 -900) in main

put Text with [text=L ] at (00 -1000) in main put Text with [text=inh] at (-350 -1000) in main put Text with [text=7] at (-150 -1000) in main put Text with [text=8] at 050 -1000) in main put Text with [text=entry] at (350 -1000) in main

put Text with [text=bf ] at (00 -1400) in main put Text with [text=bf $id_2$] at (400 -1400) in main put Text with [text=2] at (550 -1400) in main put Text with [text=entry] at (750 -1400) in main

put Text with [text=L] at (-500 -1500) in main

118

put Text with [text=inh] at (-850 -1500) in main put Text with [text=19] at (-650 -1500) in main put Text with [text=110] at (-350 -1500) in main put Text with [text= ent ry] at (-150 -1500) in main

put Text with [text=bf $id_l$] at (-500 -1900) in main put Text with [text=ll] at (-350 -1900) in main put Text with [text= ent ry ] at (-150 -1900) in main

(-100 -100)--(-400 -400) (-500 -600)--(-500 -800) (100 -100)--(400-400) (500 -600)--(500 -800) (600 -600)--(800 -800) (400 -600)--(100 -900) (100 -1100)--(400 -1300) (00 -1100)--(00 -1300) (-100 -1100)--(-400 -1400) (-500 -1600)--(-500 -1800)

(-300 -400)-(00 -300)-gt(300 -400) (400 -600)-(500 -650)-gt(600 -600) (950 -800)-gt(700 -600) (300 -600)-gt(-50 -900) (-100 -1100)-(00-1150)-gt(100 -1100) (450 -1300)-gt(200 -1100) (-200 -1100)-gt(-550 -1400) (-550 -1500)-(-500 -1550)-gt(-450 -1500) (-350 -1800)-gt(-350 -1600)

119

D

~ T 4 type inh 5 L 6 entry

entryrL ~~3 inh 7 L 8 entry

~2entrY inh 9 JJ lOentry

1 t id l 1 entry

circle = Circle with (radius=100J bigcircle = Circle with (radius=SOOJ

cl put circle at (00 200) c2 put circle at (200 00) c3 put circle at (-200 00) c4 put circle at (00 -200) bcl = put bigcircle in graphl

cS = put circle at (00 200) c6 = put circle at (00 -200) bc2 = put bigcircle in graph2

c7 put circle at (00 lS0)

in graphl in graphl in graphl in graphl

in graph2 in graph2

in graph3 c8 put circle at (200 -200) in graph3 c9 put circle at (-200 -200) in graph3 bc3 = put bigcircle in graph3

gl put graphl in main g2 put graph2 at (-1000 -1500) in main g3 put graph3 at (1000 -1000) in main

1 lines in first drawing (coord of anglePoint(900) in mainglc4)-gt

(coord of anglePoint(2700) in mainglcl) (coord of anglePoint(1800) in mainglcl)-gt

(coord of anglePoint(900) in mainglc3) (coord of anglePoint(OO) in mainglcl)-gt

120

(eoord of anglePoint(900) in maingle2) (eoord of anglePoint(2700) in maingle3)-gt

(eoord of anglePoint(1800) in maingle4) (eoord of anglePoint(2700) in maingle2)-gt

(eoord of anglePoint(OO) in maingle4)

(eoord of anglePoint(2700) in maingle3)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(1800) in maingle4)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(OO) in maingle2)shy(eoord of anglePoint(3450) in mainglbel)

lines in seeond drawing (eoord of anglePoint(2700) in maing2e5)-gt

(eoord of anglePoint(900) in maing2e6) erdl = eoord of anglePoint(1800) in maing2e6 erd2 = eoord of anglePoint(1800) in maing2e5 erdl-((erdl + erd2)20 + (-200 00))-gterd2

(eoord of anglePoint(900) in maing2e5)shy(eoord of anglePoint(900) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(450) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(OO) in maing2be2)

(eoord of anglePoint(OO) in maing2e6)shy(eoord of anglePoint(OO) in maing2be2)

lines in third drawing (eoord of anglePoint(1800) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e9) (eoord of anglePoint(OO) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e8) (eoord of anglePoint(OO) in maing3e9)-gt

(eoord of anglePoint(1800) in maing3e8) crd3 = eoord of anglePoint(OO) in maing3e8 erd4 = eoord of anglePoint(900) in maing3e7 erd3-(erd3 + erd4) 20 + (200 200)-gterd4

erd4--(eoord of anglePoint(1050) in maing3be3) (eoord of anglePoint(1800) in maing3e7)-shy

(eoord of anglePoint(1850) in maing3be3) (coord of anglePoint(1800) in maing3e9)-shy

121

(coord of anglePoint(1750) in maing3bc3)

lines between drawings (coord of anglePoint(2250) in mainglbcl)-gt

(coord of anglePoint(900) in maing2bc2) (coord of anglePoint(3450) in mainglbcl)-gt

(coord of anglePoint(1050) in maing3bc3) (coord of anglePoint(OO) in maing2bc2)-gt

(coord of anglePoint(1850) in maing3bc3) crd5 = coor~ of anglePoint(1750) in maing3bc3 crd6 = coord of anglePoint(450) in maing2bc2 crd5-(crd5 + crd6) 20 + (000 300)-gtcrd6

Texts crdTextl coord of anglePoint(1350) in mainglbcl + (-200 00) crdText2 = coord of anglePoint(1350) in maing2bc2 + (-100 100) crdText3 = coord of anglePoint(450) in maing3bc3 + (100 100) put Text with [text=$R_l$] at crdTextl in main put Text with [text=$R_2$] at crdText2 in main put Text with [text=$R_3$] at crdText3 in main

primitive getClip sddlhierarchyDrawing clip primitive setVisible sddlhierarchyShape setVisible

122

1 clip takes 3 drawings and a canvas first is a line second and third are two shapes which intersect line will draw a line between the intersection points the line creates with the two shapes 1

fun clip(dl d2 d3 canvas)

dlsetVisible(false) drawl = put dl in canvas cl = drawlgetClip(d2) c2 = drawlgetClip(d3) put cl--c2 in canvas

circle Circle with [radius=100] dl = put circle in main put Text with [text=14] in main d2 = put circle at (-400 -400) in main put Text with [text=13] at (-400 -400) in main d3 = put circle at (-700 -800) in main put Text with [text=12] at (-700 -800) in main d4 = put circle at (400 -400) in main put Text with [text=18] at (400 -400) in main d5 = put circle at (150 -800) in main put Text with [text=17] at 050 -800) in main d6 = put circle at (650 -800) in main put Text with [text=110] at (650 -800) in main d7 = put circle at (220 00) in main put Text with [text=14] at (220 00) in main d8 = put circle at (620 -400) in main put Text with [text=18] at (620 -400) in main dg = put circle at (370 -800) in main put Text with [text=7] at (370 -800) in main dl0 = put circle at (00 -1200) in main put Text with [text=5J at (00 -1200) in main

Il = (00 00)--(-400 -400) clip(ll dl d2 main) 12 = (-400 -400)--(-700 -800) clip(12 d2 d3 main) 13 = (00 00)--(400 -400) clip(13 dl d4 main) 14 = (400 -400)--(150 -800)

123

clip(14 d4 d5 main) 15 = (400 -400)--(650 -SOO) clip(15 d4 d6 main) 16 = (220 00)--(-400 -400) clip(16 d7 d2 main) 17 = (220 00)--(620 -400) clip(17 d7 dS main) lS = (620 -400)--(650 -SOO) clip(lS dS d6 main) 19 = (620 -400)--(370 -SOO) clip(19 dS d9 main) 110 = (370 -800)--(00 -1200) clip(110 dg d10 main)

2

5

fun niceArrow(c dMain dLeft dRight) firstPoint = coord of southwest in dMainrectangle + (30 30) secondPoint = coord of southeast in dMainrectangle + (-30 30)

firstEnd = coord of north in dLeftrectangle secondEnd = coord of north in dRightrectangle

put firstPoint-gtfirstEnd in c put secondPoint-gtsecondEnd in c

point1 firstPoint 50 60 + secondPoint 10 60 point2 firstPoint 40 60 + secondPoint 20 60 point3 firstPoint 30 60 + secondPoint 30 60 point4 firstPoint 20 60 + secondPoint 40 60 point5 firstPoint 10 60 + secondPoint 50 60

put (coord of southwest in dMainrectangle + (-25 25))shy(coord of south in dMainrectangle + (00 -50))shy

124

(coord of southeast in dMainrectangle + (25 25)) in c

put pointl--(pointl + (-1 0 30 -10 70)) in c put point2--(point2 + (-1 0 10 -10 85)) in c put point3--(point3 + (00 -10 90)) in c put point4--(point4 + (1 0 -10 85)) in c put point5--(point5 + (30 -1 0 70)) in c

put Text with [text=smallt] at point3 + (00 -130) in c

rect = Rectangle with [length=300 width=200] r = put rect in main put Text with [text=ll] in main rectangle = put rect in form put Text with [text=$t-l$] in form

dl = put form at (-1400 -500) in main dll = put form at (-2000 -1000) in main dlr = put form at (-800 -1000) in main dlll put form at (-2300 -1500) in main dllr put form at (-1700 -1500) in main dlrl put form at (-1100 -1500) in main dlrr put form at (-500 -1500) in main

dr = put form at (1400 -500) in main drr = put form at (2000 -1000) in main drl = put forro at (800 -1000) in main drrr put form at (2300 -1500) in main drrl put form at (1700 -1500) in main drlr put form at (1100 -1500) in main drll put form at (500 -1500) in main

put Text with [text=l root[T]] at (-300 300) in main (-300 240)-gt(coord of north in mainr)

dots = Text with [text=dots] put dots at (-1400 -1000) in main put dots at (-2000 -1500) in main put dots at (-SOO -1500) in main put dots at (1400 -1000) in main put dots at (2000 -1500) in main put dots at (800 -1500) in main

125

(coord of southwest in mainr + (30 30))-gt (coord of north in maindlrectangle)

(coord of southeast in mainr + (-30 30))-gt (coord of north in maindrrectangle)

niceArrow(main dl dll dlr) niceArrow(main dll dlll dllr) niceArrow(main dlr dlrl dlrr) niceArrow(main dr drl drr) niceArrow(main drl drll drlr) niceArrow(main drr drrl drrr)

root[T]

rect = put Rectangle with [length=600 width=200l in form put Rectangle with [length=200 width=200] at (200 00) in form bullet = put Circle with [radius=10] at (200 00) in form

put Text with [text=IF] in main

fl put form at (700 00) in main f2 put form at (1500 00) in main f3 put form at (2300 00) in main f4 put form at (3100 00) in main

(coord of anglePoint(OO) in mainflbullet)-gt (coord of west in mainf2rect)

(coord of anglePoint(OO) in mainf2bullet)-gt (coord of west in mainf3rect)

(coord of anglePoint(OO) in mainf3bullet)-gt (coord of west in mainf4rect)

126

ptW = coord of west in mainflrect ptE = coord of east in mainf4rect

ptW + (-300 OO)-gtptW ptE + (300 OO)-gtptE

put Text with [text=R] at (3800 00) in main

ptS = coord of anglePoint(2700) in mainf4bullet ptS2 = ptS + (00 -350)

ptS--ptS2 ptS2 + (-50 00)--ptS2 + (50 00) ptS2 + (-35 -20)--ptS2 + (35 -20) ptS2 + (-20 -40)--ptS2 + (20 -40)

BIBLIOGRAPHIE

Adobe Systems Incorporated 1994 PostScript Language Reference Manual http j jwwwadobecomjproductsjpostscriptjpdfsjPLRMpdf

-- 2006 PDF Reference Version 17 Adobe Systems Incorporated 6th eacutedition

-- 201Oa Adobe Postscript 3 http j jwwwadobecomjproductsjpostscriptj

2010b PDF Developer Corner PDF Reference http j jwwwadobecomjdevnetjpdfjpdLreferencehtm1

Aho A V R Sethi et J D Ullman 1986 Compilers Principles Techniques and Tools Addison-Wesley

American Mathematical Society 2008 Why Do We Recommend LaTeX http j jwwwamsorgjpublicationsjauthorsjtexjlatexbenefits

Apple Computer Inc 1996 The TrueType Reference Manu al Apple Computer Inc Cupertino California

Bourgeois M 2010 Introduction to Drawing Diagrams with SDDL httpj jrivershyvalley tvjintroduction-to-drawing-structured-diagrams-in-sddlj

Bourgeois M et R Villemaire 201Oa laquoDrawing Structured Diagrams with SDDL raquo

TUGBoat vol 31 no 2 p 206-210

-- 201Ob SDDL http j jwwwinfo2uqamca-villemaireJjRecherchejSDDLj

Bowman J C 2007 laquoThe 3D Asymptote Generalization of Metapost Beacutezier Interposhylation raquo Proceedings in Applied Mathematics and Mechanics

Chomsky N 1956 laquoThree Models for the Description of Language raquo Information Theory IRE Transactions on vol 2 no 3 p 113-124

Cormen T A C E Leiserson R L Rivest et C Stein 2001 Introduction to Algoshyrithms The MIT Press

Davis M R Sigal et E Weyuker 1994 Computability Complexity and Languages Pundamentals of Theoretical Computer Science Morgan Kaufmann

Dhu D-Z et K-I Ko 2000 Theory of Computational Complexity Wiley

Gagnon Eacute 1998 laquoSableCC an Object-Oriented Compiler Framework raquo Meacutemoire de maicirctrise McGill University

128

-- 2009 ObjeetMacro - SableCC httpsableccorgwikiObjectMacro

Group O M 1999 Unified Modeling Language (version 13) Rapport Object Manashygement Group

Hammerlindl A J Bowman et T Prince 2010a Asymptote httpasympshytotesourceforgenet

-- 20lOb Asymptote The Veetor Graphies Language httpasympshytotesourceforgenet asymptote pdf

Hobby J 1992 laquo A Users Manual for MetaPost raquo Computing Science Technical Report vol 162

International Organization for Standardization 2008 Document Management - Elecshytronic Document File Format for Long-Term Preservation - Part 1 Use of PDF 14 (PDF A-1) ISO 19005-1 2005

Jr F S H et S M Kelley 2007 Computer Graphics using GpenGL Prentice-Hall 3e eacutedition

Knuth D 1968 The Art of Computer Programming Addison-Wesley

-- 1984 The TeXbook Reading Mass Addison-Wesley

-- 1986 The Metafontbook Reading Mass Addison-Wesley

-- 1999 Digital Typography Stanford California Center for the Study of Language and Information

Lamport L et D Bibby 1986 LATEX A Document Preparation System T 260 Citeseer

Lancaster D 2005 Approximating a Circle or an Ellipse using Four Bezier Cubic Splines Rapport Synergetics

Maplesoft 2010 Maple 14 User Manual

McNaughton R et H Yamada 1960 laquoRegular Expressions and State Graphs for Automata raquo -IRE Transactions on Electronic Computers no l p 39-47

Object Management Group 2009 UML httpwwwumlorgj

Oracle 2010 Java httpwwwjavacomj

Pierce B C 2002 Types and Programming Languages MIT Press

Riskus A 2006 laquoApproximation of a Cubic Bezier Curve by Circular Arcs and Vice Versa raquo Information Technology and Control vol 35 no 4 p 371-378

Rose K H 2008 XY-pic Home Page httptugorgapplicationsjXy-picj

129

Rose K H et al 2010 laquoXY-pic Users Guide raquo DIKU Universiteacute de Copenhague vol 1

Rumbaugh J M Blaha W Premerlani F Eddy et W Lorensen 1991 ObjectshyOriented Modeling and Design Prentiee-Hall

Saunders J H 1989 laquoA Survey of Objeet-Oriented Programming Languages raquo JOOP Journal of Object-Oriented Programming vol 1

Sabel J et D Friedman 1996 An Introduction to Refiection-Oriented Programming San Francisco Reflection 96

TeX Users Group 2009 MetaPost - TeX User Groups httptugorgmetaposthtml

TIOBE Software 2008 Tiobe Index httpwwwtiobecomindexphpcontentshy paperinfo tpeiindexhtml

Ullman J J Hopcroft et R Motwani 1979 Introduction to Automata Theory Lanshyguages and Computation Addison-Wesley

Van Zandt T 1993a PSTricks-PostScript Macros for Generie TEX httpwwwtexuniyaracrudocpsLugpdf

-- 1993b laquoPSTricks PostScript Macros for Generie 1EX Users Guide raquo Version 093 a http jjwww tug orgjapplicationsjPSTricks

Page 7: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux

Vlll

611 Rappel des objectifs cruciaux agrave observer

612 Diagramme de compilation

613 Diagramme de tableau

614 Diagramme de Venn

62 Preacutesentation du produit final

621 Statistiques et documentation

622 Preacutesentation

623 Site web

63 Conclusion de notre analyse

CONCLUSION

APPENDICE A PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

APPENDICE B PREacuteSENTATION DE LA GRAMMAIRE DE SOOL

APPENDICE C PREacuteSENTATION DE LA HIEacuteRARCHIE

APPENDICE D PREacuteSENTATION DES DIAGRAMMES CHOISIS

BIBLIOGRAPHIE

72

73

75

78

79

80

80

81

81

83

85

91

97

105 shy

127

LISTE DES FIGURES

Figure Page

11 Code XY-pic pour un diagramme 14

12 Diagramme reacutesultant du code XY-pic 14

13 Code Metapost pour dessiner un triangle 15

14 Diagramme reacutesultant du code Metapost 15

15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin 16

16 Diagramme reacutesultant du code Asymptote 16

31 Courbes de Beacutezier lineacuteaire quadratique et cubique 34

32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier 38

33 Quart de cercle approximeacute par une courbe de Beacutezier 39

34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence 41

41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b 49

51 Extrait de la grammaire de SDDL pour une instruction 61

52 Code Java et SDDL pour calculer une combinaison lineacuteaire 63

53 Code reacuteflexif pour creacuteer une forme quelconque 65

54 Code pour geacuteneacuterer du code Asymptote pour un cercle 69

61 Diagramme dautomate de compilation 73

62 Code pour le diagramme dautomate 74

63 Diagramme de tableau 76

64 Code pour le diagramme de tableau 77

65 Diagramme de Venn 78

x

66 Code du diagramme de Venn 79

REacuteSUMEacute

Dans ce meacutemoire nous analysons la description de diagrammes structureacutes dans le domaine des matheacutematiques discregravetes et de linformatique theacuteorique Cette analyse seffectue agrave partir de meacutethodes eacutetablies du geacutenie logiciel Nous trouvons un ensemble de proprieacuteteacutes que nous recherchons dans une solution informatique nous permettant de creacuteer ces diagrammes Nous analysons aussi les outils classiques agrave partir des proprieacuteteacutes preacuteceacutedentes qui nous permettent de reacutealiser ces diagrammes dans un environnement I51EX Nous observons que ces outils ne sont pas aussi puissants quils le pourraient en fonction des proprieacuteteacutes eacutetablies par notre analyse

Par la suite en nous basant sur les meacutethodes de repreacutesentation graphique des courbes et sur la theacuteorie des langages informatiques nous jetons les bases dun lanshyguage de description Nous preacutesentons aussi un outil deacuteveloppeacute en Java qui nous pershymet de deacutecrire aiseacutement nos diagrammes dinformatique theacuteorique et de matheacutematiques discregravetes agrave partir dune hieacuterarchie dobjets claire et extensible Nous avons impleacutementeacute les eacuteleacutements essentiels de notre langage en SDDL (Structured Diagram Description Lanshyguage) Nous lavons aussi valideacute agrave laide dexemples repreacutesentatifs tireacutes de sources daushytoriteacute Nous avons finalement preacutesenteacute notre solution dans le cadre de la confeacuterence TUG 2010 Nous lavons aussi preacutesenteacute avec un article dans la revue du TeX Users Groups TUG

Mots cleacutes diagrammes informatique theacuteorique matheacutematiques discregravetes langage

INTRODUCTION

Le logiciel de mise en page de document U1EX est devenu llne reacutefeacuterence pour la creacuteation

de documents matheacutematiques (American Mathematical Society 2008) Plusieurs raisons

suscitent cet inteacuterecirct une structure naturelle permettant de repreacutesenter clairement ses

ideacutees le formatage automatique de qualiteacute et un reacutesultat final de qualiteacute professionnelle

agrave un coucirct moindre

Un traiteacute matheacutematique peut contenir plusieurs types dobjets textes formules grashy

phiques diagrammes etc Dans le cas preacutesent nous nous inteacuteressons principalement agrave

la repreacutesentation de diagrammes Par diagramme on entend un dessin qui possegravede une

structure discregravete sous-jacente (souvent combinatoire mais pas obligatoirement) Un

exemple simple serait un graphe ou un arbre

Agrave partir du moment ougrave nous nous inteacuteressons agrave ces diagrammes et agrave leur repreacutesentation

il devient inteacuteressant de voir ce que U1EX nous fournit afin de geacuteneacuterer des structures

de qualiteacute En effet les diagrammes sont essentiels agrave la transmission effective des ideacutees

et des reacutesultats en informatique et en matheacutematiques discregravetes De plus la consistance

nous oblige agrave chercher agrave faire nos diagrammes agrave partir dun modegravele coheacuterent Entre

autres il nous faut conserver la mecircme police dans les diagrammes et dans le texte

en plus davoir accegraves aux symboles matheacutematiques Nous pourrions aussi importer des

diagrammes exteacuterieurs agrave U1EX mais les reacutesultats obtenus ne serait pas consistant avec

le texte Nous devons donc chercher agrave obtenir une meacutethode de repreacutesentation adeacutequate

pour nos diagrammes

Bien sucircr il existe deacutejagrave plusieurs solutions agrave ce problegraveme Il nous faut donc les analyser

avec soin avec des critegraveres formels Cela implique de reacutepertorier les diffeacuterents paquets

U1EX permettant de faire du dessin avec leurs diffeacuterentes proprieacuteteacutes Il faut ensuite

2

ajouter les logiciels qui utilisent JbTEX indirectement donc qui nen font pas partie

mais sen servent tout de mecircme Cela nous donne une vue densemble complegravete des

solutions deacutejagrave existantes agrave notre problegraveme

Ensuite avant de penser agrave analyser ces solutions nous devons deacuteterminer ce que nous

voulons exactement Agrave cette fin nous avons analyseacute le processus qua utiliseacute Donald

Knuth creacuteateur de TEX agrave la base de Jb1EX afin de mateacuterialiser son logiciel de formatage

Nous devons aussi utiliser un ensemble de contraintes agrave soumettre agrave nos diffeacuterentes

solutions Il eacutetait essentiel dutiliser Jb1EX pour le formatage du texte mais aussi pour

la clarteacute deacutecriture la qualiteacute de la documentation et la capaciteacute de creacuteer aiseacutement des

structures Par la suite il devient aiseacute et tregraves formel danalyser chacunes des diffeacuterentes

solutions proposeacutees

Malheureusement cette analyse nous a permis de constater quaucune solution neacutetait

suffisamment bonne pour satisfaire nos besoins La plupart des paquets eacutetaient trop

simples alors que plusieurs eacutetaieentiernt composeacutes de macros rendant la veacuterification de

code quasi impossible Quelques solutions (telles que XY-Pic (Rose 2008) Metapost

(TeX Users Group 2009) et Asymptote (Hammerlindl Bowman- et Prince 2010a))

fournissaient de nombreuses ideacutees inteacuteressantes mais aucune ne convenait parfaitement

agrave nos besoins Nous en sommes donc venus agrave la conclusion que la meilleure solution

serait de creacuteer notre propre solution tout en reacuteutilisant les ideacutees deacuteveloppeacutees par les

solutions preacuteceacutedentes

Afin de creacuteer une solution robuste nous avons deacutecideacute de creacuteer une hieacuterarchie orienteacutee obshy

jet afin de repreacutesenter les diffeacuterentes structures du domaine des matheacutematiques discregravetes

et de linformatique theacuteorique Cela se justifie par le fait que les hieacuterarchies objets aushy

delagrave de leurs avantages possegravedent des meacutethodes de conceptualisation formelles et bien

deacutefinies Nous avons utiliseacute la meacutethode favoriseacutee par James Rumbaugh (Rumbaugh

et al 1991) un des creacuteateurs de UML (Object Management Group 2009)

Ce processus demande en tout premier lieu une analyse du domaine afin dobtenir les

structures principales Par la suite les liens entre les diffeacuterentes classes sont analyseacutes en

3

fonction des besoins respectifs Finalement apregraves plusieurs iteacuterations et simplifications

cette meacutethode foumit une hieacuterarchie complegravete Par contre elle doit par la suite ecirctre

adapteacutee aux speacutecificiteacutes du langage dimpleacutementation

Notre hieacuterarchie a eacuteteacute deacuteveloppeacutee autour de plusieurs concepts importants Certains

sont naturellement lieacutes au domaine dutilisation Par exemple un point est une structure

naturelle pour la description de positions dans un diagramme Le mecircme raisonnement

sapplique pour des formes geacuteomeacutetriques de base comme le cercle le carreacute et lellipse

Certains objets sont des simplifications de concepts communs Par exemple un point

abstrait est un point qui peut ecirctre deacutetermineacute de maniegravere absolue ou relative Une forme

est une classe de base repreacutesentant lensemble des objets qui peuvent ecirctre dessineacutes Il

existe aussi un dessin qui repreacutesente une forme agrave un endroit particulier

Bien que cela pourrait deacuteterminer complegravetement notre domaine afin davoir une hieacuteshy

rarchie complegravete il faut inclure certains eacuteleacutements de structure Par exemple bien que

nous puissions deacuteterminer assez aiseacutement ce quest un cercle la maniegravere de le deacutecrire

pour ecirctre dessineacute nest pas aussi simple Il en est de mecircme pour des formes courbes

plus complexes ainsi que des courbes de maniegravere geacuteneacuterale car un ordinateur ne peut pas

repreacutesenter aiseacutement toutes formes de chemin Nous pouvons creacuteer un concept geacuteneacuteral

de chemin mais celui-ci doit se ramener agrave la reacutealiteacute dun ordinateur

Cela est deacutetermineacute en analysant deux choses le format de document PDF et la desshy

cription de chemin dAsymptote Le premier utilise des splines cubiques comme eacuteleacutement

de base pour deacutecrire les courbes dans un document Cest inteacuteressant mais limitatif

Asymptote de son cocircteacute prend une description complexe mais preacutecise dune courbe et

en deacuteduit un ensemble de splines cubiques quil est possible de placer dans un docushy

ment PDF ensuite Nous en concluons que le bon chemin agrave prendre est probablement

dimpleacutementer comme structure de base des chemins tels que deacutecrits par Asymptote

avec une structure de splines cubiques

Par contre certaines questions theacuteoriques surviennent lors de cette analyse Le grand

problegraveme relegraveve de la puissance dexpression des splines cubiques En effet nous verrons

4

que les splines cubiques sont puissantes mais pas suffisamment puissantes pour deacutecrire

un cercle une forme geacuteomeacutetrique pourtant extrecircmement simple Nous verrons par contre

par la suite quil est possible de deacutecrire ce mecircme cercle avec des splines cubiques avec

une preacutecision acceptable pour la creacuteation de documents papier malgreacute son inexactitude

Afin dadapter la hieacuterarchie un langage dimpleacutementation a ducirc ecirctre choisi Eacutetant donneacute

les contraintes de temps il fucirct deacutecideacute de reacuteutiliser un langage de description de diashy

grammes deacutejagrave existant Asymptote Lutilisation de ce langage nous permet dobtenir

des primitives simples et un accegraves agrave Jb1EX deacutejagrave deacutetermineacute ce qui diminue de beaucoup la

charge de travail De plus Asymptote nous permet de creacuteer nos images reacutesultantes dans

les formats Postscript (Adobe Systems Incorporated 2010a) et PDF (Adobe Systems

Incorporated 2010b) sans avoir agrave reacutealiser nous-mecircmes du code de tregraves bas niveau

Eacutevidemment si Asymptote fournissait tout ce dont nous avions besoin nous naurions

pas besoin dutiliser autre chose Par contre cest un langage baseacute sur les structures

(Hammerlindl Bowman et Prince 201Ob) au lieu des objets Cela implique que notre

hieacuterarchie ne peut ecirctre construite agrave laide de lheacuteritage objet Eacutetant donneacute la complexiteacute

que cela engendrerait un langage suppleacutementaire doit-ecirctre utiliseacute pour-la creacuteation de

la hieacuterarchie Cela nous amegravene donc agrave choisir Java (Oracle 2010) Une recherche de la

compagnie TIOBE considegravere Java comme eacutetant le langage le plus utiliseacute au moment de

la preacutesente reacutedaction (TIOBE Software 2008)

Avant de consideacuterer le deacuteveloppement dun nouveau langage la premiegravere chose agrave faire

consiste agrave consideacuterer ce agrave quoi nous voulons quil ressemble Afin de reacutealiser cette eacutetape

nous avons analyseacute notre base de diagrammes en donnant une description la plus proche

possible dun langage de programmation En simplifiant chaque description autant que

possible nous avons pu extraire quelques concepts de base importants pour la descripshy

tion de nos diagrammes De plus certaines contraintes suppleacutementaires peuvent ecirctre

ajouteacutees qui deacutependent plus de limpleacutementation que de la theacuteorie En quelque sorte

il faut pour reacutealiser notre projet nous baser sur des technologies qui ont fait leurs

preuves

5

Afin de deacutevelopper notre langage il nous faut des concepts pour le deacutecrire Cela sefshy

fectue agrave laide de la theacuteorie des langages et des automates Plus particuliegraverement nous

utiliserons les grammaires afin de faccedilonner un langage qui convient agrave nos besoins tout en

eacutetant simple agrave analyser par un programme informatique agrave laide dun logiciel speacutecialiseacute

SabieCC (Gagnon 1998) Nous verrons que les grammaires nous permettent de deacutecrire

complegravetement notre langage afin decirctre analyseacute par ordinateur

Une fois que nous avons notre langage final il ne reste plus quagrave veacuterifier les reacutesultats

obtenus Afin de boucler la boucle nous avons reacutealiseacute la programmation de chacun des

diagrammes que nous avions choisis au deacutepart pour notre base de tests Une fois ceuxshy

ci reacutealiseacutes il ne restait plus quagrave analyser les diffeacuterences entre les deux et voir si les

reacutesultats obtenus eacutetaient satisfaisants Cela nous permet de deacutemontrer quil sagit dune

solution naturelle et efficace eacutetant donneacute que nous pouvons creacuteer les objets de notre

domaine pour produire des diagrammes de grande qualiteacute

Le reste de ce meacutemoire est structureacute comme suit Le chapitre 1 expose la probleacutematique

et les objectifs rechercheacutes Le chapitre 2 introduit la creacuteation de notre solution inforshy

matique et plus speacutecifiquement de la hieacuterarchie objet Le chapitre 3 deacutecrit la theacuteorie

matheacutematique derriegravere la description de courbes et segments par ordinateur Le chapitre

4 expose les dessous de la theacuteorie des langages que nous utilisons afin de creacuteer SOOL

Le chapitre 5 expose la creacuteation du langage au-dessus de la hieacuterarchie Finalement le

chapitre 6 analyse le reacutesultat final afin de voir si le tout reacutepond aux objectifs deacutefinis au

deacutepart

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CHAPITRE l

PROBLEacuteMATIQUE ET OBJECTIFS

Dans ce chapitre nous nous eacutetendrons sm une deacutefinition correcte et complegravete de la

probleacutematique ainsi que sur les objectifs que nous souhaitons atteindre Nous verrons

aussi une analyse des solutions qui existent deacutejagrave et les raisons qui nous poussent agrave

deacutevelopper notre propre solution Finalement nous deacutefinirons une base de diagrammes

aptes agrave repreacutesenter adeacutequatement nos objectifs

11 Description de la probleacutematique

111 Les notes de cours une mise en contexte

Ce projet fut motiveacute principalement par la reacutedaction de notes de cours En effet

dans un milieu universitaire (particuliegraverement pour les eacutetudiants au baccalaureacuteat mais

eacutegalement pour les eacutelegraveves de cycles supeacuterieurs) il est extrecircmement utile de pouvoir

utiliser des notes de cours de quali teacute

La creacuteation de notes de cours adapteacutees vient tout de mecircme avec quelques problegravemes

Premiegraverement surtout en informatique la plupart des livres sont eacutecrits en anglais Cela

implique souvent de devoir eacutecrire nos propres versions sous la forme de notes de cours

De plus linformatique est un domaine qui eacutevolue agrave un rythme fulgurant Cela implique

que des notes adeacutequates et adapteacutees doivent ecirctre agrave jour Comme certains eacuteleacutements en

informatique peuvent eacutevoluer agrave chaque anneacutee voire plus vite il faut ecirctre capable deacutecrire

extrecircmement rapidement des textes si nous souhaitons quils soient utiles un tant soit

8

peu

Cela nous amegravene agrave notre probleacutematique principale plusieurs cours neacutecessitent un supshy

port plus complexe que simplement des mots agrave savoir des dessins et des diagrammes

voire des animations Cela est requis dans plusieurs cours en informatique theacuteorique

particuliegraverement dans leacutetude des structures de donneacutees et des algorithmes Il nous faut

donc une meacutethode rapide et efficace pour creacuteer des diagrammes agrave placer dans nos notes

de cours

112 Domaine dapplication eacutelargi

Bien eacutevidemment cibler purement les notes de cours et les structures de donneacutees nest

quun point de deacutepart Nous pouvons eacutelargir notre domaine dapplication agrave des diashy

grammes structureacutes cest-agrave-dire un dessin qui possegravede une structure sous-jacente crushy

ciale au point de pouvoir necirctre deacutecrit quagrave partir de cette structure Par exemple

un graphe est un ensemble de sommets eacutetiqueteacutes relieacutes ensemble par des flegraveches Tout

dessin de graphe est donc un dagramm~ selon notye deacutefiniton Dun_autre cocirct~ une

peinture possegravede parfois une structure mais celle-ci est largement insuffisante pour

deacutecrire loeuvre Par exemple pertgtonne noserait deacutecrire un Picasso comme eacutetant un

amas de cercles et de carreacutes de diffeacuterentes couleurs

Lensemble des structures que nous visons se rapporte donc essentiellement agrave deux

domaines linformatique theacuteorique et les matheacutematiques discregravetes Linformatique

theacuteorique est surtout deacutefinie par les structures de donneacutees et les algorithmes (et tout

sujet sy reliant) Les matheacutematiques discregravetes sont surtout deacutefinies par la theacuteorie des

graphes et la combinatoire Nous neacutegligeons ici volontairement les matheacutematiques contishy

nues pour deux raisons La premiegravere est quune structure de taille infinie peut souvent

ecirctre repreacutesenteacutee par une structure finie (donc discregravete) La seconde est que les besoins

en matheacutematiques continues sont largement diffeacuterents des besoins en matheacutematiques

discregravetes En effet dessiner le graphe dune fonction de deux variables est un sujet comshy

plexe mais totalement diffeacuterent de creacuteer un graphe Afin de rendre nos besoins plus

9

speacutecifiques nous eacuteviterons ce genre de dessins qui possegravedent deacutejagrave de nombreux logiciels

pour les reacutealiser (entre autres Maple) (Maplesoft 2010)

12 Description des objectifs rechercheacutes

La premiegravere partie de notre travail consiste agrave deacutecrire les objectifs que nous souhaitons

atteindre dans notre creacuteation de diagrammes En effet plusieurs paramegravetres importants

peuvent ecirctre utiliseacutes Il est donc important de ne pas perdre de vue lensemble tout en

donnant la prioriteacute agrave certains eacuteleacutements

121 Inteacutegration avec ~IEX

Ib1EX est un langage de description de documents texte Creacuteeacute agrave lorigine sous la forme

de TEX par Donald Knuth (Knuth 1984) puis modifieacute par Leslie Lamport (Lamport

et Bibby 1986) celui-ci est rapidement devenu un standard dans la reacutedaction darticles

scientifiques dans plusieurs domaines Bien quutiliseacute surtout pour la reacutedaction darticles

il a eacuteteacute preacutevu au deacutepart pour la reacutedaction de livres Il se distingue par sa capaciteacute agrave

creacuteer aiseacutement du contenu matheacutematique et le fait de soccuper du contenu en laissant

le logiciel soccuper de la mise en page du texte Il est si populaire que de nombreux

meacutemoires incluant celui-ci sont eacutecrits agrave partir de Ib1EX

Eacutetant donneacute que le monde des matheacutematiques et de linformatique theacuteorique utilise

abondamment Ib1EX il est important quun logiciel de creacuteation de diagrammes pershy

mette de lutiliser En effet si notre objectif est de creacuteer du contenu de qualiteacute professhy

sionnelle il faut que les polices soient constantes au travers de notre article (ou de nos

notes de cours) Naturellement plusieurs diagrammes vont contenir du texte Il faut

donc pour ecirctre consistant geacuteneacuterer ce texte avec Ib1EX afin davoir une forme standard

pour lensemble du document De plus il est tout agrave fait possible de vouloir mettre des

symboles matheacutematiques dans un diagramme (par exemple un symbole dinteacutegrale) Si

le texte est geacuteneacutereacute avec Ib1EX cela vient automatiquement Sinon il devient tregraves difficile

dobtenir un texte de belle qualiteacute Il sagit donc dun besoin primordial

10

122 Description de structures

Un autre eacuteleacutement extrecircmement important que nous recherchons est de pouvoir faire

adeacutequatement la description de diffeacuterentes structures Eacutetant donneacute que les diagrammes

sont composeacutes de structures il faut pouvoir en creacuteer aiseacutement et les relier de maniegravere

aiseacutee Cela implique quelques petites contraintes entre autres de pouvoir utiliser des

variables pour conserver les structures en question Ideacutealement la solution la plus solide

en terme de description de structures utiliserait lorienteacute-objet Une des composantes

les plus importantes dune solution orienteacutee objet est la preacutesence dune hieacuterarchie de

classes dobjets

123 Hieacuterarchie solide et extensible

Un objectif que nous recherchons est que le langage nous fournisse une hieacuterarchie dobshy

jets (ou de structures) de qualiteacute afin de pouvoir creacuteer une grande quantiteacute de diashy

grammes agrave partir deacuteleacutements de cette hieacuterarchie Une hieacuterarchie peut ecirctre deacutecrite comme

eacutetant une structure permettant dinteacutegrer facilemen~ de nouveau~ aspects sans_avoir agrave

dupliquer inutilement du code Il serait aussi important quelle puisse ecirctre eacutetendue si cershy

tains eacuteleacutements suppleacutementaires sont neacutecessaires Par exemple il pourrait ecirctre inteacuteressant

pour des gens en geacutenie eacutelectrique de pouvoir faire des diagrammes eacutelectriques malgreacute

le fait que cela ne fait pas partie de nos contraintes de deacutepart Cela pourrait ecirctre ajouteacute

par extension du systegraveme

124 Objectifs moindres

Gestion des erreurs

Dans des notes de cours il est freacutequent davoir des diagrammes Par contre eacutecrire

un diagramme peut saveacuterer plus compliqueacute que deacutecrire du texte Comme plusieurs

utilisateurs potentiels ne seront pas des experts du systegraveme il faut que les erreurs soient

deacutetecteacutees et traiteacutees de maniegravere adeacutequate Cela assure agrave lutilisateur final une expeacuterience

11

plaisante en speacutecifiant les erreurs quil commet et des meacutethodes pour les reacuteparer Sil

faut que lutilisateur cherche pendant des heures pour trouver la petite erreur quil a

commise il va tout simplement cesser dutiliser le logiciel

Langage fluide et clair

Bien que moins important le fait davoir un langage clair est excellent pour attirer les

utilisateurs vers ce systegraveme En effet si le langage est un gribouillis incompreacutehensible il

sera fort probablement dur dapprentissage et difficile agrave aborder Par fluide et clair nous

entendons que le langage soit jusquagrave un certain point compreacutehensible pour quelquun

qui ne connaicirct pas le systegraveme

Qualiteacute de la documentation et courbe dapprentissage

Finalement il faut quune documentation existe et quelle soit complegravete De preacutefeacuterence

une bonne documentation contiendra un reacutepertoire de toutes les fonctionnaliteacutes mais

aussi des tutoriels avec des exemples codeacutes de cas standards Cela incite les utilisateurs

agrave essayer le logiciel en prenant un exemple et en ladaptant agrave leurs besoins Cela amegravene

(avec les autres objectifs) agrave un langage simple dapprentissage mais tout de mecircme

puissant Comme notre objectif est de trouver une solution simple il faut que nimporte

qui puisse commencer agrave sen servir rapidement sans avoir besoin de lire lensemble de

la documentation

13 Analyse des solutions existantes

Naturellement une fois que nous savons ce que nous recherchons il nous faut analyser

toutes les solutions qui existent deacutejagrave Cela nous permettra didentifier une solution qui

est deacutejagrave fonctionnelle ou au mieux une qui pourra ecirctre eacutetendue ou utiliseacutee afin de

simplifier le travail de creacuteation si besoin est Au minimum nous pourrons extraire les

concepts inteacuteressants de chaque solution et voir sil est possible de les inteacutegrer agrave notre

solution

12

131 Paquets f1TEX standards

Eacutetant donneacute limportance de lutilisation de JbIEX les premiegraveres solutions sont celles

disponibles agrave linteacuterieur mecircme de fbIEX Celles-ci sont appeleacutees des paquets Plusieurs

paquets diffeacuterents existent et bon nombre dentre eux sont des solutions bricoleacutees et

donc incomplegravetes

Dans les solutions inteacuteressantes on note premiegraverement la preacutesence de la commande

picture Celle-ci a eacuteteacute ajouteacutee dans TEX par Donald Knuth comme tme solution agrave tout

oubli potentiel dans son systegraveme Cette commande prend du texte quelconque et le passe

par la suite au pilote qui compile le document Cela permet entre autres de transfeacuterer

des informations au pilote qui compile en Postscript et permet donc lutilisation de toute

la force de Postscript dans la reacutedaction de dessin Un gros problegraveme de cette solution

est que le texte agrave eacutecrire deacutepend du pilote utiliseacute limitant de beaucoup son utilisation

Il est tout de mecircme devenu la base de nombreux paquets qui se servent de Postscript

Plusieurs solutions ont aussi eacuteteacute deacuteveloppeacutees pour toutes sortes de domaines On retrouve

entre autres des-diagrammes de-Peynmann et deuml Lewis (feyn et-lewis) des dia-grammes

de flots (nassflow) et des arbres linguistiques (xyling rst qtree et lingtrees)

Naturellement ces solutions ne conviennent pas car elles sont pour des domaines trop

speacutecifiques par rapport agrave notre objectif

Une solution dun domaine plus geacuteneacuteral qui se deacutemarque est le paquet PSTricks (Van

Zandt 1993a) Creacuteeacute en 1993 par le professeur Timothy Van Zandt celui-ci est devenu

tregraves populaire au fil des anneacutees eacutetant donneacute les nombreuses possibiliteacutes qui existent en

Postscript Un des grands avantages est sa documentation qui est tregraves prolifique et tregraves

claire (Van Zandt 1993b)

Cela est bien inteacuteressant mais malheureusement PSTricks souffre du mecircme problegraveme

que chaque paquet interne agrave JbTEXmiddot Il est fait agrave partir de macros En effet TEX a eacuteteacute eacutecrit

complegravetement agrave partir de macros Il sagit dlm meacutecanisme de remplacement textuel ougrave

lon deacutefinit une entreacutee et toutes les occurrences de cette entreacutee sont remplaceacutees par une

13

sortie bien speacutecifique Comme une macro est toujours remplaceacutee par son contenu avant

decirctre analyseacutee plus en deacutetail toute forme derreur se retrouve agrave un niveau extrecircmement

bas Cela fait que nimporte quelle erreur est quasi impossible agrave cerner correctement

rendant le travail de lutilisateur qui souhaite apprendre tregraves complexe De plus le fait

de fournir le Postscript directement agrave lutilisateur rend celui-ci tregraves puissant mais tregraves

dangereux Finalement bien que de nombreuses formes soient disponibles il nexiste

pas de hieacuterarchie en tant que telle dans PSTricks ce qui le rend impossible agrave eacutetendre

132 )(J(-pic

Une autre solution inteacuteressante peut ecirctre retrouveacutee agrave linteacuterieur de gTEX Il sagit

de XV-pic un paquet eacutecrit par Kristoffer H Rose (Rose et al 2010) Ce paquet

a eacuteteacute creacuteeacute speacutecifiquement pour la description de diagrammes agrave linteacuterieur de gTEX

et possegravede une documentation exhaustive Malheureusement cette documentation est

extrecircmement complexe mecircme pour un utilisateur avanceacute XV-pic utilise principalement

des boicirctes gTEX positionneacutees agrave diffeacuterents endroits afin de creacuteer les diagrammes Ceuxshy

ci sont par la suite relieacutes par diffeacuterents objets puis deacutecoreacutes Cela fournit un reacutesultat

final de qualiteacute XV-pic possegravede entre autres un mode pour creacuteer des diagrammes en

positionnant les eacuteleacutements dans une matrice Cela rend les dessins plus simples concepshy

tuellement mais pas toujours positionneacutes adeacutequatement XV-pic permet aussi de faire

du positionnement relatif agrave dautres objets ce qui peut ecirctre tregraves pratique Comme nous

pouvons le voir dans lexemple suivant XV-pic est tregraves pratique dans les reacutesultats quil

nous permet dobtenir mais sa syntaxe laisse de beaucoup agrave deacutesirer

Par contre les deacutefauts de XV-pic sont extrecircmement visibles En premier lieu la syntaxe

du langage est extrecircmement difficile agrave comprendre car elle est baseacutee sur la composition

de nombreux caractegraveres speacuteciaux De plus comme il sagit dun paquet gTEX le tout

est impleacutementeacute agrave laide de macros et rend donc la recherche derreur laborieuse (surshy

tout lorsquon prend en compte la syntaxe deacutejagrave difficile agrave utiliser) Cela rend XV-pic

inapte agrave lutilisation par quelquun qui ne souhaite pas investir trop de temps dans son

apprentissage Finalement les nombreux modes de dessins sont souvent incompatibles

14

xymatrix U ar_[ddr]_y ar-[drr]-x

argt[dr] I-(xy) amp X times_Z y ar[d]-q ar[r]_p amp X ar[d]_f amp y ar[r]-g

amp Z

Figure 11 Code XY-pic pour un diagramme

Figure 12 Diagramme reacutesultant du code XY-pic

entre eux et ne peuvent souvent pas ecirctre utiliseacutes dans un mecircme dessin

133 Metapost

Eacutetant donneacute le problegraveme commun agrave tous les paquets agrave linteacuterieur de JgEX la solution la

plus logique serait dessayer den sortir Cela a donneacute le logiciel Metapost (Hobby 1992)

Celui-ci a eacuteteacute inspireacute de Metafont (Knuth 1986) que Knuth a utiliseacute pour dessiner des

polices pour EX Une des grandes avanceacutees du langage est la description de courbes

Celui-ci reacuteutilise un algorithme de Knuth qui permet de deacutecrire des courbes tout en

en controcirclant les diffeacuterents paramegravetres De plus comme le logiciel nest pas reacutedigeacute en

macros il permet de deacutetecter de maniegravere adeacutequate les erreurs de lusager Nous pouvons

deacutejagrave voir dans le code fourni en exemple quil sagit dun langage beaucoup plus clair

que XV-pic

15

beginfig(l)

pair A B C A=(OO) B=(lcmO) C=(Olcm) draw A--B--C--cycle

endfig

Figure 13 Code Metapost pour dessiner un triangle

Figure 14 Diagramme reacutesultant du code Metapost

Par contre quelques problegravemes se deacutegagent de Metapost Premiegraverement le langage ne

permet pas limpleacutementation dune hieacuterarchie solide Cela ne serait pas un problegraveme sil

en existait deacutejagrave une mais ce nest pas le cas En effet les diagrammes ont fait lobjet

dune extension du langage mais rien de tregraves deacuteveloppeacute Il est donc faisable de faire

des diagrammes mais il ne sagit pas neacutecessairement dune solution agrave toute eacutepreuve

De plus comme toutes les coordonneacutees du langage sont donneacutees en valeur absolue cela

limite les possibiliteacutes du langage (entre autres en ne pouvant utiliser des points deacutefinis

par des objets)

134 Asymptote

Une autre possibiliteacute se retrouve dans le logiciel Asymptote qui se deacutefinit comme eacutetant

Wl langage inspireacute de Metapost (Hammerlindl Bowman et Prince 2010b) Il est donc

aussi externe agrave g1EX mais aussi inspireacute du langage de programmation CH Cela lui

confegravere la creacuteation de structures avanceacutees et la creacuteation de fonctions complexes De

plus une documentation exhaustive et un traitement des erreurs de qualiteacute en font une

solution robuste

Malheureusement comme Metapost Asymptote pose quelques problegravemes En effet ce

16

size(3cm) draw(unitsquare) labelC l $A$ (00) SW)

labelC $B$ Cl 0) SE) label ($C$ Cl 1) NE)

label ($0$ (01) NW)

Figure 15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin

( )

il

Figure 16 Diagramme reacutesultant du code Asymptote

logiciel fut eacutecrit avec les matheacutematiques continues et la geacuteomeacutetrie comme domaine

dutilisation Ce nest pas Lill problegraveme en tant que tel (Asymptote le fait tregraves bien)

mais cela fait que la- creacuteation de diagrammes discrets nest pas vraiment deacuteveloppeacutee

Il faudrait donc ecirctre capable de creacuteer une hieacuterarchie de structures pour la creacuteation de

diagrammes Eacutetant donneacute le support des structures posseacutedant des fonctions internes il

devrait ecirctre possible dajouter cette possibiliteacute agrave Asymptote

Malheureusement ce nest pas preacutesentement reacutealisable agrave linteacuterieur du langage En efshy

fet Asymptote est un langage baseacute objet Cela signifie quil possegravede des structures qui

ressemblent agrave une description typique dun objet mais pas toutes les proprieacuteteacutes imshy

portantes qui se rattachent agrave un langage agrave objets standard comme Java ou C++ Plus

particuliegraverement cest labsence de polymorphisme qui cause problegraveme En effet la

creacuteation dune hieacuterarchie implique de creacuteer des liens entre les diffeacuterentes structures Par

exemple un cercle un triangle et un nuage sont toutes des formes avec certaines proshy

prieacuteteacutes similaires Il nous faut donc avoir des fonctions qui prennent des formes comme

paramegravetres Si nous avons une fonction f qui prend une forme nous souhaiterions eacutecrire

une seule fonction

17

fCforme)

Malheureusement en Asymptote il faudrait eacutecrire une fonction pour chaque forme

distincte comme cela

fCcercle)

fCcarre)

fCnuage)

Cela rend la creacuteation dune hieacuterarchie extrecircmement difficile car pour chaque fonction

utilisant un objet plus geacuteneacuteral il nous faut eacutecrire plusieurs fois cette fonction De plus

cela rend lexpansion par lusager de la hieacuterarchie essentiellement impossible car il doit

rajouter des cas pour chaque fonction deacutefinie preacuteceacutedemment en plus dajouter son nouvel

objet dans la hieacuterarchie Cela est difficilement souhaitable

135 Conclusion de lanalyse

Afin den venir agrave une conclusion adeacutequate il faut se ramener aux objectifs rechercheacutes

Cela nous permet de rapidement eacuteliminer les solutions internes agrave Ib-TEX eacutetant donneacute

la complexiteacute de la gestion des erreurs (et indirectement la courbe dapprentissage du

langage) Cela nous laisse comme solution Metapost et Asymptote Naturellement le

langage Asymptote est plus eacutevolueacute que celui de Metapost et fournit des eacuteleacutements de

programmation plus inteacuteressants Cela implique donc quil nous permet plus aiseacutement

de construire nos structures tant deacutesireacutees

Par contre Asymptote ne fournit pas une solution suffisante eacutetant donneacute quil ne possegravede

pas une hieacuterarchie dobjets adapteacutee aux diagrammes De plus eacutetant donneacute que le langage

est baseacute objet il sera beaucoup trop compliqueacute dy implanter une hieacuterarchie Nous en

venons donc agrave la conclusion que le mieux serait dutiliser Asymptote qui nous fournit un

ensemble de services complexes (impleacutementation des chemins liens avec Ib-TEX etc )

et de limpleacutementer avec un langage de plus haut niveau

18

Java devient un choix inteacuteressant pour cette tacircche En effet cest un langage connu dans

lindustrie et simple dapprentissage Il sagit dun langage de programmation objet qui

nous permettra agrave coup sucircr dimpleacutementer une hieacuterarchie solide Par contre ce langage

possegravede quelqu~s petits problegravemes comme un tregraves haut niveau de verbositeacute et beaucoup

deacuteleacutements non requis pour la description de diagrammes

Nous en sommes donc venus agrave la conclusion que la meilleure solution serait dutiliser

Java mais dimpleacutementer par-dessus celui-ci un langage deacutedieacute qui eacuteliminerait tout ce

qui nest pas requis pour la description des diagrammes Nous appellerons ce langage

SDDL pour Structured Diagram Description Language

Concepts inteacuteressants agrave conserver

Avant de penser agrave concevoir notre logiciel il serait bon de voir quels eacuteleacutements nous

souhaitons conserver des solutions existantes Agrave cette fin leacuteleacutement le plus inteacuteressant

provient de XV-Pic En effet il permet de relier des objets entre eux par des flegraveches

dune maniegravere relativement simple Il serait donc inteacuteressant de pouvoir permettre de

deacutecrire des liens entre diffeacuterents objets par des points speacutecifiques agrave chacun dentre eux

De plus lalgorithme de description de chemins utiliseacute par Metapost et Asymptote est

extrecircmement efficace et utile et pourrait donc ecirctre utiliseacute directement par notre langage

Cela sera simple agrave impleacutementer eacutetant donneacute que nous souhaitons utiliser Asymptote pour

compiler vers Postscript

14 Diagrammes repreacutesentatifs du domaine

Finalement avant de pouvoir commencer agrave deacutefinir les besoins de notre hieacuterarchie il

nous faut obtenir une deacutefinition valide et complegravete de notre domaine Naturellement

il nest pas eacutevident de trouver une deacutefinition concregravete et objective dun diagramme en

informatique theacuteorique Nous devons donc nous rabattre sur une autre solution qui doit

tout de mecircme ecirctre la plus formelle possible

19

141 Lapproche de Knuth

Pour trouver une ideacutee nous nous ramegravenerons agrave la meacutethode que Donald Knuth a utiliseacutee

lorsquil a creacuteeacute TEX En effet il souhaitait creacuteer un logiciel qui ferait de laquo beauxraquo doshy

cuments Cela eacutetant un terme tregraves subjectif Knuth deacutecida de se deacutefinir un ensemble

de journaux scientifiques dont les publications eacutetaient du plus haut standard de qualiteacute

pour leacutepoque (Knuth 1999) Apregraves avoir obtenu ces diffeacuterents exemples il put saffairer

agrave essayer de reproduire une solution de cette qualiteacute Il devient donc eacutevident agrave la fin

du cycle de deacuteveloppement du logiciel que sa solution eacutetait coheacuterente et valide car elle

permettait dobtenir un reacutesultat de qualiteacute en comparaison agrave ce que nous pourrions

deacutejagrave deacutefinir comme eacutetant de qualiteacute

Nous pouvons donc chercher agrave suivre la mecircme meacutethode Afin de la respecter nous devons

trouver quelques livres dun haut niveau de qualiteacute et prendre certains diagrammes

que lon retrouve agrave linteacuterieur Cela nous permettra de retrouver les eacuteleacutements les plus

cruciaux de notre domaine

Plusieurs livres inteacuteressants soffrent agrave nous nous utiliserons entre autres laquo The Art

of Computer Programming raquo de Donald Knuth (Knuth 1968) Il est naturel quun des

livres les plus connus en informatique eacutecrit par Knuth de surcroicirct possegravede un haut

standard de qualiteacute Un autre livre important est le laquo livre du dragonraquo (Aho Sethi et

Ullman 1986) qui eacutetudie la theacuteorie de la compilation et est extrecircmement connu dans

son domaine De plus celui-ci renferme leacutetude de nombreuses structures de donneacutees ce

qui nous fournit de nombreux diagrammes de qualiteacute Finalement il existe aussi un livre

tregraves connu dans leacutetude des algorithmes (ce qui est aussi extrecircmement lieacute agrave leacutetude des

structures de donneacutees) qui sappelle laquo Introduction to Algorithmsraquo (Cormen et al

2001) Ces trois livres forment une base extrecircmement connue et de qualiteacute pour nos

diagrammes Nous avons extrait quinze (15) diffeacuterents diagrammes de ces livres

20

142 Description des exemples et des concepts preacutesents dans les diagrammes

Les diffeacuterents diagrammes que nous avons seacutelectionneacutes repreacutesentent diffeacuterentes strucshy

tures de donneacutees On y retrouve plusieurs arbres et graphes Les graphes sont de plushy

sieurs types allant dun graphe standard agrave des graphes dexeacutecution De plus certaines

structures preacutesentes plus rarement se retrouvent dans notre ensemble Entre autres on

retrouve un diagramme de Venn qui bien que conceptuellement simple est toujours

relativement complexe lorsque nous souhaitons le reacutealiser avec un logiciel On retrouve

aussi des arbres linguistiques qui ne sont pas neacutecessairement complexes mais surtout

longs agrave reacutealiser

Cet ensemble de diagrammes nous permet de couvrir lensemble des structures de

donneacutees importantes en informatique theacuteorique et en matheacutematiques discregravetes Il existe

dautres structures de donneacutees mais celles-ci peuvent toujours ecirctre impleacutementeacutees seacutepashy

reacutement eacutetant donneacute que nous souhaitons faire une hieacuterarchie aiseacutement extensible Nous

remarquons surtout dans nos exemples quun des eacuteleacutements les plus importants est de

pouvoir r~lier convenablement les_diffeacuterents eacuteleacutements (dans un graphe par exemple)

Comme il sagit de quelque chose qui est toujours preacutesent il sagira dun des points les

plus importants agrave deacutevelopper pour notre hieacuterarchie

CHAPITRE II

STRUCTURE ET SOLUTION INFORMATIQUE

Afin de deacutevelopper un produit qui convient agrave nos besoins nous aurons besoin quil soit

structureacute adeacutequatement Cela implique principalement la construction de la hieacuterarchie

dobjets du domaine Il faut deacuteterminer quels sont les eacuteleacutements rechercheacutes dans notre

solution trouver une meacutethode de deacuteveloppement formelle et adeacutequate puis la reacutealiser

correctement Cela assurera une solution de qualiteacute

21 Objectifs dune structure dans une solution informatique

En premier lieu il nous faut justifier le besoin dune meacutethode de deacuteveloppement forshy

melle et solide En effet lin logiciel en informatique est tregraves diffeacuterent dun problegraveme

matheacutematique standard Une deacutemarche matheacutematique se ramegravene agrave un concept bien

connu la preuve Cela reurond la reacutesolution du problegraveme creacutedible agrave condition que la

preuve soit bonne Par contre nous verrons quun problegraveme informatique ne peut ecirctre

reacutesolu agrave laide dune simple preuve

211 Les diffeacuterentes composantes dune solution informatique

Une solution agrave un problegraveme informatique possegravede diffeacuterents eacuteleacutements Chacun dentre

eux possegravedent un certain degreacute de formalisme qui affecte lensemble de la solution

22

Algorithmes

Les algorithmes sont les eacuteleacutements les plus formels dune solution informatique On peut

dire quils se ramegravenent agrave la partie matheacutematique dun problegraveme informatique en quelque

sorte Composeacute dune seacuterie dopeacuterations aux comportements bien deacutefinis le reacutesultat dun

algorithme est preacutevisible Eacutetant donneacute la possibiliteacute de preacutevoir le comportement dun

algorithme agrave partir de ses entreacutees il est possible de deacutemontrer que lalgorithme fournit

exactement les reacutesultats rechercheacutes Il suffit en effet de prouver que agrave chaque entreacutee

possible on obtient la sortie qui serait logiquement attendue de lalgorithme On peut

penser par exemple agrave un algorithme de tri qui pour chaque ensemble de nombres

retourne les nombres en ordre croissant

Malgreacute tout un algorithme en informatique nest pas parfait En effet si le temps

dexeacutecution dun algorithme pour des entreacutees standards est beaucoup trop eacuteleveacute il ne

sera pas utiliseacute peu importe quil donne le bon reacutesultat Le temps dopeacuteration et la

quantiteacute despace meacutemoire sont les deux principales contraintes qui entrent en ligne de

compte pour les diffeacuterents algorithmes dune solution informatique

Solutions technologiques

Lautre partie extrecircmement importante de tout logiciel informatique est le choix des

technologies utiliseacutees En effet les programmes informatiques ne sont pas directement

creacuteeacutes agrave partir de circuit eacutelectriques Chaque couche dabstraction suppleacutementaire (cirshy

cuits logiques code assembleur programmation de haut niveau) limite les possibiliteacutes

du programmeur et vient avec certains avantages et certains inconveacutenients Le fait de

ne pas utiliser une solution deacutejagrave existante peut permettre une solution plus puissante

mais agrave un coucirct de deacuteveloppement potentiellement beaucoup plus eacuteleveacute Il est aussi posshy

sible avec un certain ensemble de choix technologiques de ne pas pouvoir obtenir un

effet rechercheacute dans une solution Cela explique pourquoi nous avons deacutecideacute dutiliser

Asymptote Il nous fournit un accegraves agrave JbTEX deacutejagrave codeacute ainsi quune traduction comshy

plexe vers un fichier image Postscript La reacutealisation de ces diffeacuterents eacuteleacutements de

23

code aurait significativement augmenteacute la complexiteacute de notre tacircche

Imperfection de toute solution informatique

Eacutetant donneacute les limitations des outils technologiques agrave notre disposition nous sommes

obligeacutes de constater que toute solution informatique est imparfaite De plus plusieurs

contraintes donneacutees agrave des systegravemes informatiques sont geacuteneacuteralement vagues et peuvent

ecirctre interpreacuteteacutees diffeacuteremment en fonction de lutilisateur Par exemple nous souhaitons

reacutealiser un outil simple dutilisation mais puissant et extensible Naturellement plus

un langage est puissant plus il devient complexe Un utilisateur peut trouver un outil

tregraves simple alors quun autre le trouvera incompreacutehensible Dautres points comme la

qualiteacute de documentation la courbe dapprentissage et lagestion aiseacutee des erreurs sont

des critegraveres qui possegravedent une bonne part de subjectiviteacute Ce ne sont toutefois pas

neacutecegravessairement de mauvais critegraveres Il faut simplement chercher selon une deacutefinition la

plus proche possible dun utilisateur moyen agrave maximiser les diffeacuterents paramegravetres

Ce genre de contraintes relegraveve geacuteneacuteralement du geacutenie logiciel Bien que ce meacutemoire ne

constitue pas un travail de geacutenie logiciel nous sommes obligeacutes demprunter quelques

eacuteleacutements agrave ce domaine afin dobtenir un reacutesultat adeacutequat

212 Consideacuterations pour une meacutethodologie de deacuteveloppement

Avant de choisir notre meacutethodologie il est bon de veacuterifier les objectifs rechercheacutes dans

lutilisation dune telle meacutethode de deacuteveloppement Cela nous permettra de deacutegager les

eacuteleacutements importants agrave garder en tecircte tout au long du deacuteveloppement de la hieacuterarchie

Un des eacuteleacutements les plus importants est dobtenir une structure efficace pour deacutecrire

nos diagrammes Lautre eacuteleacutement crucial est dobtenir une hieacuterarchie qui repreacutesente

adeacutequatement le domaine De preacutefeacuterence elle doit ecirctre complegravete et dun usage naturel

On entend par lagrave que les eacuteleacutements sont suffisamment preacutecis et proches deacuteleacutements stanshy

dards et connus du domaine que toutes les opeacuterations soient laquo naturellesraquo pour une

personne qui ne connaicirct pas le langage Il nexiste malheureusement pas de mesure pour

24

deacuteterminer si une hieacuterarchie est naturelle ou non Toutefois si chaque section est reacutefleacutechie

de maniegravere formelle le reacutesultat final devrait ecirctre naturel Certaines consideacuterations mishy

neures peuvent ecirctre plus ou moins mesureacutees comme la longueur du code et les noms

adeacutequats de fonctions

22 La programmation orienteacutee-objet

La programmation orienteacutee-objet est un des pheacutenomegravenes tregraves importants en informashy

tique Depuis sa creacuteation elle est devenue de plus en plus populaire eacutetant donneacute la faciliteacute

de deacuteveloppement dans une telle meacutethode Le fait dutiliser une solution orienteacutee-objet

(au contraire de Metapost ou Asymptote) ne sest pas fait de faccedilon arbitraire Il est

donc de mise dexposer les diffeacuterents avantages qui nous ont pousseacutes agrave choisir un tel

paradigme pour notre logiciel

221 Concepts de bases

La structure de base en programmation orienteacutee-objet est naturellement lobjet Celuishy

ci est deacutefini comme eacutetant une structure de donneacutees qui regroupe des donneacutees et des

meacutethodes (Saunders 1989) Bien quil ne sagit pas dun critegravere obligatoire la plushy

part des langages de programmation creacuteent les objets agrave partir dune classe qui deacutefinit

les diffeacuterents champs et meacutethodes preacutesents et leurs effets Les objets forment donc le

minimum requis pour avoir un langage objet

En tant que tel cet ensemble de concepts est assez minimaliste Il existe plusieurs autres

eacuteleacutements qui sont preacutesents agrave un degreacute plus ou moins grand dans les langages agrave objets

Ceux-ci forment donc en quelque sorte la base de la programmation orienteacutee-objet

(Pierce 2002)

- Lencapsulation des donneacutees cest-agrave-dire camoufler les donneacutees dans une structure

speacutecifique (lobjet)

- Lheacuteritage qui permet de deacutefinir un objet comme eacutetant une installce speacutecifique dun

autre objet On peut appliquer le mecircme raisonnement agrave deux classes On dit alors

25

quune classe heacuterite dune classe de base Celle-ci possegravede exactement le mecircme corps

que sa classe de base mais peut rajouter ou modifier certaines proprieacuteteacutes Il sagit

dun des aspects les plus importants dans le deacuteveloppement dune hieacuterarchie

- Le polymorphisme qui nous permet de creacuteer des proprieacuteteacutes qui varient en fonction

des sous-classes Par exemple une classe Nombre pourrait avoir une meacutethode daddishy

tion alors que ses sous-classes Entiegraveres et Reacuteelles redeacutefiniraient cette meacutethode en

fonction de leur impleacutementation speacutecifique Cela nous permet par la suite de prendre

deux nombres et de les additionner peu importe quil sagisse de reacuteels ou dentiers

222 Diffeacuterence avec la programmation baseacutee-objet

Les diffeacuterentes prioriteacutes eacutenumeacutereacutees ci-haut sont les eacuteleacutements de base qui nous permettent

de creacuteer une hieacuterarchie de qualiteacute Il sagit de la raison principale justifiant de ne pas

utiliser Asymptote pour creacuteer la hieacuterarchie En effet celui-ci est un langage baseacute-objet

La diffeacuterence principale est quun langage baseacute-objet ne neacutecessite pas limpleacutementation

de lheacuteritage ou du polymorphisme (Saunders 1989) Asymptote de son cocircteacute possegravede un

heacuteritage de structure minimal mais pas de polymorphisme Cette diffeacuterence est cruciale

car cet eacuteleacutement est neacutecessaire pour la creacuteation dune hieacuterarchie dans des contraintes

acceptables

En effet une chose importante est dajouter des objets dans les diagrammes Par

exemple supposons que nous avons une classe Conteneur Celui-ci doit pouvoir conteshy

nir des Cercles des Carreacutes des Triangles etc Sil fallait eacutecrire une fonction pour

ajouter chacune des formes le travail deviendrait eacutenormeacutement complexe et impossible

agrave eacutetendre pour lusager final Avec le polymorphisme il suffit deacutecrire une fonction qui

permet dajouter une Forme quelconque

23 Meacutethode pour la conceptualisation dune hieacuterarchie

Nous deacutecrirons ici la meacutethode que nous avons utiliseacute Il sagit de DMT (pour Dbj ect

Modeling Technique)

26

231 Origine de la meacutethode

Cette meacutethode fut deacuteveloppeacutee principalement par James Rumbaugh (mais avec laide de

plusieurs personnes) (Rumbaugh et al 1991) en 1991 Celui-ci est principalement connu

comme eacutetant un des auteurs de la norme UML qui est devenu le scheacutema de modeacutelisation

objet standard et utiliseacute par tous les programmeurs objets (Group 1999) Il est agrave noter

que cette meacutethode est une meacutethode danalyse complegravete pour toute la dureacutee de vie du

logiciel Nous naurons par contre besoin que de la partie analyse de cette meacutethode

232 Les diffeacuterentes eacutetapes de conceptualisation

La premiegravere partie de cette meacutethode a deacutejagrave eacuteteacute effectueacutee implicitement lorsque nous

avons rechercheacute nos diagrammes relatifs du domaine Habituellement il est suggeacutereacute

deacutecrire un texte reacutesumant lensemble du domaine mais dans notre cas il est plus

approprieacute de reacutesumer notre domaine avec des diagrammes Par la suite il faut prendre

le temps de faire ressortir les diffeacuterentes classes dobjets qui font parties du domaine et

prendre le temps de bien les deacutefini~middot On eacuteliminera les classes vagues ou redondantes par

la suite

La prochaine eacutetape consiste agrave deacutefinir les diffeacuterentes associations entre les classes Par

exemple une classe Employeacute et une classe Compagnie seraient lieacutees par lassociation

travaille pour Par la suite on identifie les attributs (ou les champs) des diffeacuterentes

classes en eacutevitant les attributs dimpleacutementation Finalement on raffine le modegravele en

ajoutant lheacuteritage des classes Cela permet de simplifier significativement la hieacuterarchie

Cela fournit une hieacuterarchie complegravete de notre domaine Par contre rien ne deacutemontre

quelle est correcte Afin de la veacuterifier il suffit danalyser les diffeacuterents cas typiques de

notre problegraveme regarder le reacutesultat obtenu et relever toute erreur Dans notre cas il

sagit de coder (seulement en terme de la hieacuterarchie) les diffeacuterents diagrammes et veacuterifier

si nous consideacuterons le tout satisfaisant Par la suite nous pourrons reacuteiteacuterer le mecircme

proceacutedeacute jusquagrave obtenir satisfaction Nous serons ainsi assureacutes davoir une hieacuterarchie

27

adapteacutee agrave notre domaine et complegravete

24 Deacuteveloppement de la hieacuterarchie

Maintenant que nous avons une meacutethodologie correcte nous pouvons creacuteer notre hieacutershy

archie Le fait de sassurer de sa compleacutetude nous permettra de ne pas rencontrer de

problegravemes complexes lors de la phase dimpleacutementation du logiciel

241 Extraction des diffeacuterents concepts

Les concepts du domaine (qui se ramegravenent agrave des classes) se divisent en plusieurs cateacuteshy

gories Une des principales est le domaine des formes Une forme peut ecirctre un carreacute

un cercle etc Une autre cateacutegorie importante est formeacutee des points qui peuvent ecirctre

deacutefinis de plusieurs maniegraveres diffeacuterentes Finalement une autre section importante est

formeacutee des structures de conteneurs incluant les Canvas (pour contenir des objets) et

des Drawing (pour reacutefeacuterencer des objets)

Eacutetant donneacute le nombre relativement faible de formes distinctes il ne nous est pas apparu

utile de faire plusieurs cateacutegories de formes distinctes En effet une seacuteparation entre les

courbes fermeacutees et ouvertes peut nous permettre de factoriser un ou deux eacuteleacutements de

code sans toutefois ecirctre significatif ou reacuteellement utile (eacutetant donneacute quil nexiste pas

vraiment de forme standard deacutefinie par une courbe ouverte)

242 Eacuteleacutements particuliers

Plusieurs eacuteleacutements particuliers se sont reacuteveacuteleacutes complexes agrave modeacuteliser dans notre hieacuterarshy

chie Nous abordons ici les principales difficulteacutes rencontreacutees ainsi que les solutions pour

les reacutegler

28

Creacuteation et placement dobjets

Leacuteleacutement le plus important de notre hieacuterarchie est de pouvoir structurer les objets

que nous souhaitons positionner Nous avons donc creacuteeacute une classe Canvas Le nom est

inspireacute du mot canevas en peinture eacutetant donneacute que nous avons apposeacute des restrictions

similaires agrave ce domaine En effet nous avons deacutecideacute que lorsquun objet est placeacute dans

un canevas il ne peut ecirctre enleveacute ou modifieacute Cela nous permettra plus tard de faire

des calculs pour les points de reacutefeacuterence plus aiseacutement De plus un canevas doit pouvoir

posseacuteder des sous-canevas Pour cela il nous faut une classe geacuteneacuterale qui deacutecrit tout

eacuteleacutement pouvant ecirctre ajouteacute dans un canevas

Cela est reacutesolu avec lintroduction dune classe Shape Celle-ci repreacutesente toute forme

qui peut ecirctre dessineacutee quelle soit simple ou complexe Un Canvas est une forme afin

de sassurer de pouvoir positionner des sous-canevas Une implication particuliegravere de

notre choix est quune Shape ne possegravede pas de position Il sagit dune forme abstraite

qui peut ecirctre positionneacutee agrave un certain endroit Cela implique aussi quil est possible de

prendre une Shape et de la placer agrave plusieurs end_roits distincts Lorsquelle est ajouteacutee

dans un Canvas une Shape est copieacutee ce qui empecircche toute modification subseacutequente

de la forme

Objets multiples

Lorsquil sagit de creacuteer des diagrammes freacutequemment il est tregraves probable que plusieurs

eacuteleacutements soient similaires Par exemple si nous creacuteons un arbre avec des cercles comme

sommets il sagit toujours en quelque sorte du mecircme cercle De plus si nous creacuteons

un sous-canevas et que nous le positionnons agrave plusieurs endroits certaines formes deshy

viennent automatiquement deacutedoubleacutes Il devient donc primordial pour nous de pouvoir

reacuteutiliser un eacuteleacutement que nous avons deacutejagrave deacutefini afin deacuteviter la creacuteation agrave reacutepeacutetition

dobjets

Or nous avons deacutejagrave speacutecifieacute quil eacutetait possible de positionner plusieurs fois le mecircme

29

objet Cela est vrai mais il y a une limitation En effet ces objets ne peuvent pas ecirctre

reacutefeacuterenceacutes Si nous souhaitons connaicirctre un objet celui-ci doit pouvoir ecirctre distingueacute

dun autre Il nous faut donc une classe qui repreacutesente une forme agrave un endroit preacutecis

Pour cela nous avons creacuteeacute la classe Drawing Celle-ci permet de repreacutesenter une Shape

agrave un endroit bien preacutecis dans un canevas Cela fait toutefois que les eacuteleacutements dans un

sous-canevas multiple restent identiques Nous verrons bientocirct la solution agrave ce problegraveme

Points de reacutefeacuterence

Un des eacuteleacutements les plus complexes relevait du fait de fournir des points de reacutefeacuterence

En effet faire de simples chemins entre des coordonneacutees en valeurs absolues neacutetait pas

suffisant mecircme sil est possible dadditionner ses points La solution souhaiteacutee eacutetait de

permettre de deacutefinir des points de reacutefeacuterence ceux-ci pouvant ecirctre obtenus agrave partir de

lobjet lui-mecircme Par exemple un cercle pourrait retourner son point nord

Un eacuteleacutement fondamental causait problegraveme la fonction pour acceacuteder au point doit ecirctre

deacutefinie dans la forme (par exemple dans la classe Circle) Par contre une forme en

tant que telle ne possegravede pas de position speacutecifique Par conseacutequent son point nest

pas deacutefini non plus Pour cela il faudrait obtenir un Drawing Par contre un Drawing

ne peut pas posseacuteder la deacutefinition de chaque fonction daccegraves agrave un point pour chaque

forme Cela est contre-intuitif Il faut donc demander agrave la forme lorsquon appelle pour

obtenir un point de prendre le Drawing suppleacutementaire en paramegravetre Notre intention

est lorsque nous eacutecrirons un langage au-dessus de la hieacuterarchie de pouvoir reacutegler ce

problegraveme

Chemins de reacutefeacuterence

Finalement il nous reste un leacuteger problegraveme Nous pouvons maintenant faire une reacutefeacuteshy

rence agrave un objet disons a et obtenir un point speacutecifique de cet objet Par contre cela

nest pas suffisant dans un cas bien preacutecis Disons que a est dans le canevas b Ensuite b

est placeacute agrave deux reprises dans le canevas c obtenant deux Drawing diffeacuterents cl et c2

30

Nous ne pouvons pas acceacuteder agrave a car il est repreacutesenteacute seulement en fonction de b Pour

reacutegler le problegraveme il faut faire un chemin de reacutefeacuterence (disons cl b a dans le langage

final) Pour cela nous fournirons la possibiliteacute de partir dun Drawing et den obtenir

un autre (agrave condition quil sagisse dun Canvas naturellement) Cela va mettre agrave jour

la position relative de lobjet par rapport agrave un niveau de profondeur suppleacutementaire

En acceacutedant agrave cette fonction aussi souvent que neacutecessaire il est possible de reacutefeacuterencer

un objet peu importe son degreacute de profondeur reacuteel Cela nous permet donc de faire

des liens complexes entre nimporte quel objet (voire mecircme des objets de profondeur

diffeacuterentes)

31

CHAPITRE III

EacuteLEacuteMENTS GRAPHIQUES

Dans ce chapitre nous deacutefinissons les eacuteleacutements graphiques requis pour faire des dessins

informatiques dont les courbes de Beacutezier ainsi que les splines cubiques Les proprieacuteteacutes

importantes de ces courbes sont deacutemontreacutees De plus une preuve est fournie de la

possibiliteacute dapproximer adeacutequatement un cercle avec des splines cubiques Finalement

nous discuterons du fonctionnement des diffeacuterentes solutions informatiques en terme de

structure telles que PDF et Asymptote

Courbes et segments en informatique

Naturellement les eacuteleacutements les plus importants dans des dessins informatiques sont les

segments et les courbes Pour des besoins de simpliciteacute nous essaierons de les inteacutegrer

dans la mecircme deacutefinition en traitant les segments comme un cas particulier des courbes

Nous donnons agrave cette courbe geacuteneacuterale le nom de chemin

Le premier problegraveme lorsque nous voulons faire des courbes en informatique est la

meacutethode pour les repreacutesenter Lecirctre humain peut tracer une infiniteacute de courbes disshy

tinctes sans avoir besoin de la deacutecrire avec preacutecision Par contre lorsquon entre dans le

domaine de linformatique il faut non seulement ecirctre capable den faire une description

mais celle-ci doit ecirctre la plus petite possible

Une des meacutethodes de repreacutesentation est sous la forme de pixels (JI et Kelley 2007)

Cette meacutethode implique de repreacutesenter un plan continu par un ensemble de points disshy

32

crets appeleacutes pixels Cela permet de repreacutesenter plusieurs formes de dessins extrecircmement

complexes et est utiliseacute dans certains logiciels dimages

Une autre meacutethode est la meacutethode vectorielle Cest la plus populaire Au lieu de

repreacutesenter directement le dessin tel quil apparaicirct on fournit une description du dessin

agrave partir de quelques concepts tregraves simples (points segments et cercles par exemple)

Lorsque lutilisateur souhaite voir le dessin un logiciel traduit la description en pixels

pour leacutecran

La derniegravere meacutethode possegravede plusieurs avantages La description dun dessin est souvent

beaucoup plus compacte que si on deacutecrit le dessin pixel par pixel De plus la description

conserve la preacutecision du dessin peu importe la reacutesolution agrave laquelle il est preacutesenteacute Par

exemple si nous prenons un ensemble de pixels et quon lagrandit plusieurs fois il est

tregraves probable que nous ayons perdu beaucoup dinformations Il nous faut par contre

veacuterifier la puissance reacuteelle dune telle meacutethode Nous devons donc introduire une des

structures utiliseacutees pour la description vectorielle

32 Courbes de Beacutezier

Une courbe de Beacutezier est un concept relativement simple deacuteveloppeacute indeacutependamment

par Paul de Casteljau et Pierre Beacutezier entre 1959 et 1962 Ces deux personnes avaient

pour objectif de creacuteer des repreacutesentations par ordinateur de voitures pour les compagnies

Citroen et Renault respectivement (Jr et Kelley 2007)

321 Deacutefinition

Soit Po Pl P2 Pn E 1R2 un ensemble de points dans un plan carteacutesien typique

Ceux-ci sont appeleacutes des points de controcircle Soit t E IR et 0 lt t 1 La courbe de

Beacutezier de degreacute n des points Po agrave Pn est deacutefinie par la formule suivante

B t - n ( n

) 1 - t n-ttt

pPohmiddotPn ( ) - ~ i ( ) t (31) t=O

33

Le chemin est deacutefini pour les valeurs entre 0 et 1 de t Cette formule peut sembler

leacutegegraverement arbitraire et complexe pour une forme supposeacutement simple Une seconde

deacutefinition reacutecursive cette fois-ci simplifie beaucoup la formule

322 Deacutefinition alternative

Bp =p (32)

BpOPl Pn(t) = (1 - t)BpOPl Pn-l (t) + tBplhPn (33)

Cette deacutefinition alternative se ramegravene agrave dire quune courbe de Beacutezier est une intershy

polation lineacuteaire entre deux courbes de Beacutezier de degreacute infeacuterieur La deacutemonstration se

ramegravene agrave quelques manipulations bien simples et est laisseacutee en exercice au lecteur

Nous pouvons analyser les formules pour diffeacuterents degreacutes Par exemple une formule de

Beacutezier de degreacute 1 nest quune droite

BPoPl (t) = (1 - t)Po + tP] (34)

Alors quune courbe de degreacute 2 se ramegravene agrave une parabole

(35)

Finalement une courbe de Beacutezier cubique (de degreacute 3) fournit une courbe relativement

complexe qui commence agrave Po et termine agrave P3

--- ---

34

P P

0

P

Po - ____ _ - - P2

Po - - - - - - - - - - - - - - - - - - - - - - - shyPo P2 P3

(a) lineacuteaire (b) quadratique (c) cubique

Figure 31 Courbes de Beacutezier lineacuteaire quadratique et cubique

Eacutevidemment il ny a pas davantages significatifs agrave utiliser une courbe de Beacutezier lineacuteaire

Les courbes de Beacutezier quadratique sont quant agrave elles utiliseacutees lors de la geacuteneacuteration

de police TrueType (Apple Computer Inc 1996) Finalement les courbes de Beacutezier

cubiques sont utiliseacutees dans Postscript (Adobe Systems Incorporated 2010a) et dans la

plupart des produits Jb1EX tel que Metafont (Knuth 1986) Ces logiciels utilisent en

fait une combinaison de courbes de Beacutezier appeleacutees splines que nous verrons dans la

section suivante

323 Proprieacuteteacutes dune courbe de Beacutezier

En regardant les diffeacuterentes courbes nous pouvons aiseacutement voir quelques proprieacuteteacutes

Entre autres il y a interpolation des points de deacutepart et de fin Cela peut se deacutemontrer

aiseacutement en calculant B(uuml) et B(l) qui donne respectivement Po et Pn De plus les

autres points ne semblent pas ecirctre interpoleacutes Il sagit ici dun cas geacuteneacuteral (les points

peuvent ecirctre interpoleacutes sils sont colineacuteaires)

Une autre proprieacuteteacute inteacuteressante des courbes de Beacutezier est son invariance par transforshy

mation affine Cela se ramegravene au theacuteoregraveme suivant Dans le cadre de ce theacuteoregraveme nous

devrons transformer les coordonneacutees des points de controcircles des courbes de Beacutezier en

coordonneacutees projectives homogegravenes Ceci se ramegravene agrave rajouter un axe agrave chacun de nos

points dont la valeur sera toujours 1

35

Theacuteoregraveme dinvariance affine

Soit BpOPl Pn(t) une courbe de Beacutezier Soit M une matrice 3 par 3 repTeacutesentant une

transformation affine Alors on a que la courbe est invari(Lnte par lapplication de M

cest-agrave-dire MBpoPlPn(t) = BMPolvIPl lvIPn(t)

Pour le prouver il suffit de deacutevelopper la formule

NI BpoP1Pn (t) = M t (~) (1 - tt-ieuml Pi 1=0

= tM(~) (1- tt-itiPi 1=0

= t (~) (1- t)n-iti(MPi ) 1=0

Ce theacuteoregraveme implique que pour transformer une courbe de 8eacutezier il suffit dappliquer la

transformation agrave chaque point de controcircle et de calculer une nouvelle courbe de 8eacutezier

Donc une courbe de Beacutezier est entiegraverement deacutefinie par ses points de controcircle Cela fait

quelle est tregraves pratique en informatique car elle ne requiert que peu despace pour la

deacutefinir (ie seulement les n + 1 points de controcircle) De plus il est tregraves simple de geacuteneacuterer

une courbe de Beacutezier car il suffit dutiliser la formule pour autant de valeurs de t que

nous avons besoin de preacutecision dans la courbe En conservant linformation avec cette

meacutethode nous conservons une courbe sans aucune perte dinformation Cela signifie que

nous pouvons agrandir la reacutesolution de la courbe autant que nous le souhaitons et il

sagira toujours dune belle ligne courbe Cette proprieacuteteacute est extrecircmement inteacuteressante

en informatique

36

324 Deacutesavantages des courbes de Beacutezier

Les courbes de Beacutezier sont utiliseacutees dans beaucoup de domaines Par contre elles

possegravedent quelques deacutesavantages peu inteacuteressants Le plus important est probablement

labsence de controcircle local Cela sexprime par le fait que degraves que lon souhaite modifier

une courbe de Beacutezier agrave un endroit particulier tout le reste de la courbe est modifieacute au

passage Cela se deacutemontre par le fait que si 0 lt t lt 1 on a alors que

Cela implique que chaque point de controcircle de la courbe de Beacutezier a une influence (aussi

minime soit-elle) sur lensemble de la courbe Le reacutesultat est que les courbes de Beacutezier

seules sont difficiles agrave utiliser et longues agrave eacutevaluer si on utilise trop de points de controcircle

33 Splines cubiques

La solution agrave ce problegraveme est lutilisation de splines cubiques Lideacutee de base dune spline

est que si une seule courbe cause trop de problegravemes il est probablement mieux dutiliser

plusieurs courbes mais qui fonctionnent seulement dans un domaine plus petit Plus

formellement une spline cubique (aussi appeleacute B-spline cubique) est composeacute de

- un ensemble de valeurs ti pour 0 S i S m - 1 ougrave m repreacutesente le nombre de noeuds

On appelle aussi ces valeurs le vecteur de noeud Les t forment une suite monotone

croissante et sont tous des valeurs reacuteelles entre 0 et l

- L + l points de controcircle

- Une valeur entiegravere n qui repreacutesente lordre de la fonction B-sp1ine Une spline doit

respecter la condition n S m - 2

On deacutefinit une spline par la fonction suivante

37

m-n-2

S(t) = L Pibin(t) tE [01] i=O

ou dans le cas speacutecifique dune spline de degreacute 3

3

S(t) = L Pi bi 3(t) tE [01] i=O

Les bin repreacutesentent les bases de la B-spline (pour Basis Spline) Celles-ci sont deacutefinies

par la fonction reacutecursive suivante

bjoU) ~ sinon

Il sagit dune eacutequation complexe et nous ne nous y attarderons pas trop Quelques

deacutetails sont inteacuteressants agrave noter Entre autre il est inteacuteressant de constater que si lon

utilise n + 1 points de controcircle et que les noeuds sont n noeuds valant zeacutero et n noeuds

valant 1 le B-spline deacutegeacutenegravere en une courbe de Beurozier Il sagit donc dune extension

des capaciteacutes des courbes de Beacutezier

Le problegraveme principal eacutevoqueacute par les courbes de Beacutezier est que lutilisateur lors de

la creacuteation dune courbe manquait de controcircle local Il serait donc inteacuteressant que les

B-splines nous permettent de reacutegler ce problegraveme Lorsquon regarde la deacutefinition de la

base bi on remarque que celle-ci se ramegravene toujours au cas de base qui peut ecirctre aou

1 selon que nous sommes dans un domaine restreint ou non Comme il sagit du seul

facteur de Pi il est naturel daffirmer que le controcirc~e est plus localiseacute quavant Dautres

proprieacuteteacutes inteacuteressantes sont

- Pour tout t la somme de tout les bi(t) est 1

38

C5 C4 C3 -----~---- ----~-----

-----~---- ----~-----

Cg ClO Cn

Figure 32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier

- Un B-spline dordre m sera neacutecessairement Cm - 2 cest-agrave-dire quelle possegravede 2 ordres

de deacuteriyeacutees continues pour son domaine de deacutefinition _

- Tout comme les courbes de Beacutezier les B-splines sont invariants par transformation

affine On peut donc appliquer une courbe en appliquant tout simplement la transshy

formation sur les points de controcircle et en calculant le nouveau B-spline

34 Le cas dun cercle

Avec les outils que nous posseacutedons nous ne sommes pas en capaciteacute de dessiner un

cercle exact Cela nest pas grave eacutetant donneacute que nous pouvons tout de mecircme tenter de

lapproximer Pour ce faire nous utiliserons une spline cubique posseacutedant quatre points

(est nord ouest et sud respectivement) Chaque courbe de Beacute7i~r sera donc identique

aux autres agrave une rotation pregraves Il reste donc agrave deacuteterminer les points de controcircle agrave utiliser

Pour cela prenons le premier quadrant du cercle Nous passons du point Cl (10) agrave

C4 (0 1) Il nous faut deacuteterminer deux points de controcircle C2 et C3 Pour commencer

39

nous pouvons supposer de maniegravere tout agrave fait arbitraire que C2 se situe sur la tangente

de Cl et C3 sur la tangente de C4 Cela nous donne donc le scheacutema suivant

C4 C3 ----- ----~-----

1

1

1

1

TC2 1

1

1

i

Figure 33 Quart de cercle approximeacute par une courbe de Beacutezier

On a donc C2(1 k) et C3(k 1) ougrave k est une variable agrave deacuteterminer Afin de la deacuteterminer

nous devons donner une information suppleacutementaire Par exemple nous pouvons preacuteshy

supposer que le point agrave 45 degreacutes C(O5) doit ecirctre eacutevalueacute exactement par la courbe de

Beacutezier cest-agrave-dire C(O5) = (1 1) Nous obtenons donc la restriction

C(uuml5) = (1 - t)3CI + 3(1 - t)2tC2 + 3(1 - t)t2C3 + t3C4

1 3 3 1 = -Cl + -C2 + -C3 + -C4

8 8 8 8

ce qui nous permet dobtenir leacutegaliteacute

v2v2 1 3 3 1 (- -) = -Cl + -C2 + -C3 + -C4 (37)22 8 8 8 8

ce qui nous fournit apregraves substitution des valeurs des points deux fois leacutequation

v2 1 3k-=-+- (38)2 2 8

40

ce qui nous fournit apregraves reacutesolution

k = ~(J2 - 1) 0552285

Cela nous fournit donc une courbe de Beacutezier qui approxime notre cercle Il reste agrave voir

la preacutecision de cette approximation

Pour ce faire nous devrons comparer larc de cercle que nous venons de creacuteer agrave un cercle

reacuteel Afin dy arriver nous consideacutererons chaque valeur de notre arc comme eacutetant un

vecteur dont nous devrons calculer la longueur Plus cette longueur est proche de 1

plus nous avons une estimation reacutealiste Nous calculons donc

Par la suite une analyse des deacuteriveacutees nous permet de conclure que cette fonction dans

lintervalle t E [01] possegravede des m(iximu_ms agrave _t = 0 agrave tr~is reprises _(au deacutebut et agrave la

fin eacutetant donneacute la proprieacuteteacute naturelle des courbes de Beacutezier celle au milieu est due agrave

notre contrainte) Finalement elle possegravede deux (2) minimums agrave t = 0211 et t = 0789

et lerreur avec un cercle standard est de 0000273 Une telle variation sur un cercle

de rayon 1 est minime Il sagit dune variation maximale infeacuterieure agrave 003 Cela

signifie donc pour un cercle posseacutedant un rayon de 4000 pixels il y aura une variation

maximale de 12 pixels ce qui est indeacutetectable pour la taille du cercle Cela en fait une

bonne estimation pour cette section du cercle Nous pouvons naturellement suivre le

mecircme raisonnement pour les sections restantes

Il est aussi agrave noter que notre estimation nest pas la meilleure Notre choix de demander

leacutegaliteacute agrave 45 degreacutes est arbitraire et toute lerreur se retrouve dans le cocircteacute neacutegatif De

meilleures estimations ont eacuteteacute effectueacutees (Riskus 2006) avec des reacutesultats amenant une

preacutecision jusquagrave 25 plus grande (Lancaster 2005)

41

0--------------r--7T-----------------rl 08 (1

-000005

-000010

-000015

-000020

-000025

Figure 34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence

35 Structures informatiques dans les solutions deacutejagrave existantes

Maintenant que nous savons comment fonctionne les diffeacuterents modes de repreacutesentation

des dessins en informatique il faut analyser plus en deacutetail comment fonctionne les

logiciels dont nous allons nous servir En effet il nous faudra adapter nos structures de

bas niveau agrave celles disponibles dans les langages dont nous nous servirons Pour cela

nous allons analyser deux parties distinctes un format de fichier (PDF) ainsi quun

42

langage intermeacutediaire (Asymptote)

351 Postscript et PDF

En premier lieu il convient de comprendre comment fonctionne le format de fichier final

que nous utiliserons ]1EX permet de geacuteneacuterer plusieurs formats de fichier diffeacuterents

Pendant longtemps le plus populaire aura eacuteteacute Postscript creacuteeacute par Adobe Systems Cela

eacutetait principalement lieacute aux imprimantes qui fonctionnaient directement avec ce format

De nos jours le format PDF est beaucoup plus populaire bien quayant une base tregraves

proche de celle de Postscript

Postscript a eacuteteacute inventeacute par John Warnock et Charles Geschke en 1982 (Adobe Systems

Incorporated 1994) Lorsquil a eacuteteacute creacuteeacute il servait agrave faire la description de pages pour

impression Il se distingue comme eacutetant un langage de programmation complet mais

rarement utiliseacute directement En effet Postscript est difficile agrave utiliser car il utilise la

notation polonaise inverse Par exemple on exprime lappel de fonction j(a b c) de la

faccedilon suivante

abc f

Cette meacutethode rend lanalyse dun programme extrecircmement rapide et convivial pour

le logiciel qui linterpregravete car celui-ci est directement lieacute agrave la structure dune pile

dexeacutecution Par contre lanalyse dun tel programme par un humain est complexe

La plupart du temps Postscript eacutetait donc utiliseacute comme un langage de description

final pour un fichier

Il existait deux types de structures utiliseacutes en Postscript pour mettre des dessins sur une

page Le premier eacutetait lajout de texte Cela est intrinsegravequement lieacute agrave la description des

polices qui deacutepasse le cadre de ce meacutemoire Par contre pour faire un dessin quelconque

le format utilisait les chemins qui sont deacutecrits soit par des segments soit par des courbes

de Beacutezier cubiques On note donc le deacutesavantage de lutilisation dune courbe de Beacutezier

soit labsence de controcircle local

43

Quant agrave lui PDF a eacuteteacute creacuteeacute en 1993 (Adobe Systems Incorporated 2010b) Agrave travers les

gains de populariteacute le format PDF est devenue en 2008 un standard ISO (International

Organization for Standardization 2008) Cela en fait donc un format de document

standard extrecircmement inteacuteressant Alors que Postscript a eacuteteacute creacuteeacute pour des documents

qui devaient ecirctre imprimeacutes PDF a eacuteteacute conccedilu pour la description de documents plus

dynamiques cest-agrave-dire la possibiliteacute dajouter des eacuteleacutements multimeacutedias au document

Aussi il est possible de deacutecrire chaque page indeacutependamment des suivantes En effet

comme Postscript deacutecrivait des documents dimpression il est normal de connaicirctre la

page de deacutepart avant dimprimer la suivante En PDF chaque page est totalement

indeacutependante du reste du document

Pour la description deacuteleacutements graphiques les structures de base sont essentiellement

les mecircmes que Postscript Quelques eacuteleacutements comme la transparence cest-agrave-dire quun

eacuteleacutement cacheacute par un autre eacuteleacutement contribue au reacutesultat final ont eacuteteacute ajouteacutes mais les

eacuteleacutements graphiques de bas niveau sont identiques

352 Asymptote

Comme nous lavons dit preacuteceacutedemment tout ramener agrave des courbes de Beacutezier creacutee un

problegraveme de controcircle local des courbes Il faut donc utiliser une meacutethode pour donner

du controcircle agrave lutilisateur Pour cela nous utiliserons Asymptote Les structures de

bas niveau de Asymptote sont identiques agrave celles de PDF eacutetant donneacute quil convertit

directement les chemins Asymptote en chemins PDF Par contre Asymptote impleacutemente

un algorithme (Bowman 2007) originellement deacuteveloppeacute par Donald Knuth qui permet

de deacutecrire un chemin en fonction des points par lesquels il passe Asymptote utilise donc

des splines cubiques (qui ne sont pas neacutecessairement des B-splines toutefois)

Cet algorithme est complexe et en dehors du cadre de ce meacutemoire mais peut ecirctre

reacutesumeacute comme eacutetant un algorithme de choix des points de controcircle En effet une courbe

de Beacutezier cubique est deacutefinie par 4 points Le premier et le dernier sont interpoleacutes de

maniegravere exacte Ce que lalgorithme fait est quil prend un ensemble de points qui

44

seront tous interpoleacutes disons Pl P2 P3 P4 Ensuite pour chaque paire conseacutecutive de

points (donc (Pl P2 ) (P2 P3) et (P3 P4)) il geacuteneacuterera une courbe de Beacutezier cubique

La partie la plus importante de lalgorithme consiste agrave prendre toutes les informations

fournies par lutilisateur (les points de controcircle ainsi que des options qui deacutefinissent la

courbe comme les deacuteriveacutees agrave certains endroits ou des informations comme la tension qui

laisse lalgorithme calculer lui-mecircme les deacuteriveacutees agrave partir dun indice reacuteel simple) afin de

calculer pour chaque courbe de Beacutezier cubique les deux points de controcircle manquants

En laissant agrave lutilisateur le pouvoir de deacutecider seulement les points ougrave la courbe passe

le travail est simplifieacute mais permet tout de mecircme de terminer avec un ensemble de

courbes de Beacutezier

CHAPITRE IV

THEacuteORIE DES LANGAGES INFORMATIQUES

La creacuteation dun langage de programmation nest pas une mince tacircche Il faut donc

sassurer de le construire sur des bases theacuteoriques solides Nous preacutesenterons ici les

eacuteleacutements theacuteoriques importants de la theacuteorie des langages ainsi que leurs applications

dans le domaine de la compilation Nous preacutesenterons aussi loutil SableCC que nous

avons utiliseacute dans le cadre de notre langage ainsi quun bref exposeacute sur les langages

reacuteflexifs

La theacuteorie des langages est un sujet vaste et extrecircmement complexe Un meacutemoire comshy

plet pourrait ecirctre reacutedigeacute seulement sur les aspects theacuteoriques des automates reacuteguliers

Afin de compresser tout ce contenu dans un seul chapitre les eacuteleacutements seront mentionneacutes

sans preuve Nous recommandons toutefois au lecteur curieux et assidu de consulter les

reacutefeacuterences de ce chapitre pour des preuves et une couverture plus complegravete du sujet

41 Theacuteorie des langages et automates

Dans un premier temps nous devrons deacuteterminer ce quest formellement un langage

Par la suite nous analyserons une structure de donneacutees qui est intimement lieacutee agrave ce

sujet les automates

46

411 Les eacuteleacutements de base dun langage (Aho Sethi et Ullman 1986)

Alphabet et lettre

Un alphabet est un ensemble (au sens matheacutematique du mot) de symboles appeleacutes

lettres Un alphabet est fini et non-vide Par exemple lalphabet latin standard ainsi

que lensemble O I constituent des alphabets

Mot

Un mot dun alphabet A peut ecirctre un des trois cas suivants

- le mot vide euro formeacute daucune lettre

- une lettre de lalphabet A

- Toute suite finie de lettres aOal an ougrave chaque ai fait partie de lalphabet A

Il est agrave noter que les deux premiers sont en fait des cas speacutecifiques du dernier bien quils

sont souvent seacutepareacutes pour raison de clarteacute Dans le dernier cas on dit que les caractegraveres

sont lieacutes par lopeacuteration de concateacutenation

Langage

Un langage au sens le plus geacuteneacuteral possible est un ensemble de mots Celui-ci peut ecirctre

fini ou infini La plupart des exemples inteacuteressants (un langage de programmation par

exemple) est un langage infini En effet il existe une infiniteacute de programmes diffeacuterents

tout comme il existe une infiniteacute de nombres binaires

412 Exp esson reacutegnli r

Les expressions reacuteguliegraveres forment un outil de travail extrecircmement important en inshy

formatique De nombreux outils ainsi que certains langages (grep perl ) leurs sont

consacreacutes

47

On peut reacutesumer les expressions reacuteguliegraveres comme eacutetant une meacutethode afin de deacutecrire

un langage infini par une expression fini On utilisera dans la construction certaines

opeacuterations qui nous donneront des proprieacuteteacutes inteacuteressantes pour le langage final Tout

mot qui peut ecirctre construit agrave partir de ces regravegles fait automatiquement partie du langage

Constantes

Leacuteleacutement de base dune expression reacuteguliegravere est une constante Celle-ci est deacutefinie agrave

partir dune lettre de lalphabet et deacutefinit un seul mot la constante elle-mecircme Par

conseacutequent lexpression reacuteguliegravere a de lalphabet ab repreacutesente le langage a Il est

agrave noter que nous pouvons aussi utiliser le mot vide comme une constante repreacutesentant

lensemble vide

Concateacutenation

Lopeacuteration de concateacutenation est une opeacuteration sur les mots qui permet de creacuteer des

expressions reacuteguliegraveres plus longues agrave partir de deux expressions reacuteguliegraveres valides Le

reacutesultat de lexpression reacuteguliegravere A concateacuteneacutee agrave B est donc nimporte quel mot de A

concateacuteneacute agrave nimporte quel mot de B Par exemple ab est une expression reacuteguliegravere qui

repreacutesente un langage agrave un mot ab

Union

Lunion des expressions reacuteguliegraveres est une opeacuteration qui correspond agrave lunion ensemshy

bliste Lors de lunion de A et de B (deacutefini comme (AIB)) nous pouvons choisir nimshy

porte quel eacuteleacutement de A ou de B comme un mot valide Par exemple (alb)b repreacutesente

le langage contenant deux mots ab bb

Fermeture de Kleene

La fermeture de Kleene est une opeacuteration beaucoup plus inteacuteressante Celle-ci utilise

une expression reacuteguliegravere A Le reacutesultat de la fermeture noteacute A est la concateacutenation

48

dun nombre fini deacuteleacutements de A avec possibiliteacute de reacutepeacutetitions Par exemples pour

ab toute chaicircne de a finie possiblement de longueur zeacutero suivie dun b fait partie du

langage Lexpression reacuteguliegravere (alb) repreacutesente nimporte quelle chaicircne finie de a ou de

b

Les langages que nous pouvons geacuteneacuterer avec des expressions reacuteguliegraveres sont assez riches

bien quinsuffisants pour geacuteneacuterer un langage de programmation (Aho Sethi et Ullman

1986)

413 Automates

Avant de pouvoir expliquer agrave quoi servent les expressions reacuteguliegraveres nous devons discuter

des automates une structure dune importance cruciale en informatique

Automate fini

yn automate fini (Ullman Hopcroft et Motwani 1~79) est un quintuplet composeacute de

cinq eacuteleacutements

- Un ensemble fini deacutetats E

- Un alphabet fini A

- Un ou plusieurs eacutetats de deacutepart d (selon que lautomate est deacuteterministe ou non)

- Un ensemble deacutetats dit finaux F

- Une relation de transition T ccedil E x A x E Cela deacutefinit une maniegravere de passer dun

eacutetat agrave un autre lors de lapparition dun symbole speacutecifique

On repreacutesente en geacuteneacuteral un automate par un graphe avec des flegraveches nommeacutees Les

flegraveches repreacutesentent la relation de transition alors que les sommets repreacutesentent les

eacutetats dans E On repreacutesente un eacutetat initial par une flegraveche qui ne part pas dun eacutetat

Finalement on repreacutesente un eacutetat final par un cercle double Par exemple lautomate

suivant accepte lensemble des mots qui sont composeacutes dune seacuterie de a (possiblement

nulle) suivi dun b Donc les mots b ab et aab serait des mots valides par rapport agrave

49

cet automate

Figure 41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b

Lensemble T peut prendre plusieurs formes en fonction du deacuteterminisme de lautomate

comme nous allons maintenant le voir

Automate non-deacuteterministe

Un automate non-deacuteterministe peut posseacuteder plusieurs eacutetats de deacutepart De plus son

ensemble de transitions T est quelconque Il peut donc exister pour un eacutetat e et un

symbole a plusieurs eacutetats e tels que (e a e) E T

Un automate non-deacuteterministe peut ecirctre vu comme une forme de graphe dans lequel on

peut se promener en utilisant certaines transitions La suite des symboles des transitions

que nous utilisons forment un mot Lensemble des mots obtenus par une suite de transhy

sitions allant dun eacutetat initial agrave un eacutetat final constitue le langage de lautomate Dans

un automate non-deacuteterministe il peut neacuteanmoins exister pour le mecircme mot plusieurs

chemins diffeacuterents deacutebutant dans un eacutetat initial Il est important de noter quun mot

est accepteacute degraves quun de ces chemins se termine dans un eacutetat final

Automate deacuteterministe

Un automate non-deacuteterministe nous permet de creacuteer des langages mais le fait davoir

plus dun choix pour le mecircme symbole peut sembler inquieacutetant surtout lorsquil sagit

dinformatique Nous pouvons donc deacutefinir un automate deacuteterministe plus simple Celuishy

50

ci possegravede un seul eacutetat de deacutepart et son ensemble de transitions T assure que pour

chaque symbole il ny a quun seul eacutetat suivant possible Il ny a donc pour chaque mot

quun seul chemin possible agrave partir de leacutetat initial Plus formellement lautomate sera

deacuteterministe si pour tout e E E et a E A il y a un seul e E E tel que (e a e) ET

Le reacuteflexe naturel serait de croire quen enlevant le non-deacuteterminisme dun automate

celui-ci devient beaucoup moins puissant permettant de repreacutesenter beaucoup moins

de langages Or il nen est rien Il a eacuteteacute prouveacute (malheureusement en trop de pages

pour ce meacutemoire) que nimporte quel automate non-deacuteterministe peut ecirctre rameneacute agrave

un automate deacuteterministe quitte agrave voir le nombre deacutetats de lautomate augmenter

exponentiellement Nous pouvons donc toujours creacuteer un automate non-deacuteterministe et

laisser la tacircche agrave un ordinateur de creacuteer un automate deacuteterministe agrave partir de celui-ci

(Ullman Hopcroft et Motwani 1979)

Exeacutecution dun automate et contraintes temporelles

La meacutethode dexeacutecution dun automate deacuteterministe est assez simple Nous lui fournisshy

sons un mot dune certaine longueur disons n Nous deacutemarrons de leacutetat initial et chaque

lettre repreacutesente un choix agrave faire dans lautomate Comme lautomate est deacuteterministe

il ny a quune possibiliteacute agrave explorer Si nous ne pouvons plus avancer avant la fin du

mot celui-ci ne fait pas partie du langage de lautomate Si nous parvenons agrave avancer

jusquau bout et que nous ne sommes pas dans un eacutetat final il nen fait pas partie non

plus Par contre si leacutetat est final nous avons trouveacute un mot du langage Co me le mot

possegravede n lettres nous aurons au maximum n choix agrave faire rendant lalgorithme dapshy

partenance agrave un temps dexeacutecution lineacuteaire Un algorithme lineacuteaire est naturellement

extrecircmement inteacuteressant en informatique car nous voulons un programme qui sexeacutecute

dans un temps raisonnable

51

414 Lien entre langage reacutegulier et automate fini

Nous connaissons donc maintenant deux meacutethodes pour creacuteer un langage Les expresshy

sions reacuteguliegraveres ainsi que les automates Un automate est difficile agrave concevoir pour un

ecirctre humain mais extrecircmement rapide dutilisation par un ordinateur Une expression

reacuteguliegravere est complexe pour un ordinateur mais aiseacutee agrave concevoir par un ecirctre humain Il

nous faut donc voir si nous pouvons obtenir des proprieacuteteacutes communes agrave ces deux outils

Le lien

Il existe en effet un lien qui unit ces deux structures Celui-ci est extrecircmement fort

lensemble des langages quil est possible de geacuteneacuterer avec des expressions reacuteguliegraveres est

exactement le mecircme ensemble que ceux qui peuvent ecirctre geacuteneacutereacutes par un automate fini

deacuteterministe Cela implique que pour chaque expression reacuteguliegravere nous pouvons troushy

ver un automate qui repreacutesente le mecircme langage Cela est vrai aussi en sens inverse

Par contre il ne sagit pas dune bijection car plusieurs expressions reacuteguliegraveres peuvent

correspondre au mecircme automate (par exemple a et aamiddot) Il existe un algorithme permetshy

tant de transformer une expression reacuteguliegravere en automate mais celui-ci est complexe et

deacutepasse le cadre de ce meacutemoire Nous pouvons toutefois mentionner que cet algorithme

est relativement lent (sexeacutecute en O(2m ) ou m est la longueur de lexpression reacuteguliegravere)

mais permet par la suite de trouver si un mot fait partie dun langage en temps lineacuteaire

(McNaughton et Yamada 1960)

Importance dun tel lien

Ce lien est un eacuteleacutement crucial dans la capaciteacute dun ordinateur agrave travailler avec des lanshy

gages de programmation En effet cela permet aux creacuteateurs de langages de deacutecrire des

mots agrave partir dexpressions reacuteguliegraveres (quils comprennent) et de laisser un programme

creacuteer des automates qui peuvent reconnaicirctre ces symboles (un if ou un for mais aussi

des variables) dans des programmes Cela permet donc de creacuteer une partie importante

dun langage quon appelle lanalyse lexicale Cela permet agrave partir de lutilisation de

52

lautomate creacuteeacute par des expressions reacuteguliegraveres de transformer un texte en une suite de

symboles plus speacutecifiques Par exemple le texte

if a 1 then true else faIse

pourrait ecirctre traduit par la suite de symboles suivants

IF VAR EQ NUM THEN BD DL ELSE BDDL FININSTR

Cette eacutetape lanalyse lexicale est cruciale agrave la suite de lanalyse dun programme Les

automates nous sont toutefois utiles non seulement pour les mots cleacutes mais aussi pour

des eacuteleacutements plus complexes comme des variables Une variable est souvent identifieacutee

comme eacutetant une lettre suivie dune suite de caractegraveres quelconques (sauf exception tel

quun espace)

Malgreacute tout il existe certains eacuteleacutements quun automate ne peut reconnaicirctre Un exemple

classique est le parentheacutesage eacutequilibreacute (une suite de parenthegraveses telle que c~aque pashy

renthegravese ouvrante est associeacute agrave une parenthegravese fermante et agrave nimporte quel moment il

nexiste pas plus de fermantes que douvrantes) Il est en effet impossible aux automates

de faire le lien entre les deux types de parenthegraveses (Ullman Hopcroft et Motwani 1979)

Pour cela il nous faudra utiliser des structures plus complexes

42 Grammaires

Ces structures sont les grammaires Il est possible de les voir comme eacutetant une forme

beaucoup plus geacuteneacuterale des expressions reacuteguliegraveres Avec cette structure nous pourrons

nous assurer quun programme est bien formeacute cest-agrave-dire creacuteer un arbre repreacutesentant

la structure dun programme un peu comme la structure dune phrase

421 Deacutefinition dune grammaire formelle

Une grammaire est constitueacutee de quatre eacuteleacutements

53

- Un ensemble fini de terminaux Ceux-ci sont des symboles repreacutesentant les lettres

dun langage Par conseacutequent on peut aussi appeler les terminaux lalphabet dune

grammaire

- Un ensemble fini de non-terminaux Habituellement repreacutesenteacute par des majuscules

(par des symboles diffeacuterents des terminaux) pour des raisons de clarteacute ceux-ci repreacuteshy

sentent des eacutetats intermeacutediaires de la grammaire

- Un non-terminal de deacutepart parmi lensemble deacutecrit plus haut

- Un ensemble de regravegles de production Celles-ci vont varier selon la cateacutegorie de langage

choisie mais de maniegravere geacuteneacuterale une regravegle de production est une paire ordonneacutee

dont chaque eacuteleacutement est composeacute dune suite de terminaux et de non-terminaux (par

exemple aB -t aAa)

Le fait de repreacutesenter une regravegle de production avec une flegraveche permet den expliciter le

rocircle transformer une suite de caractegraveres en une autre Lutilisation dune grammaire

consiste donc agrave deacutemarrer avec le non-terminal de deacutepart puis dappliquer une suite de

regravegles de production pour modifier le non-termina Lorsquon obtient un mot formeacute

uniquement de terminaux il sagit dun mot du langage repreacutesenteacute par la grammaire

Par exemple

S -gt aA

A -gt b

repreacutesente un langage contenant le seul mot ab On applique doEn effet unc un proceacutedeacute

de deacuterivation (en appliquant chaque regravegle) Par exemple une deacuterivation possible du mot

ab dans ce contexte (la seule dailleurs) est la suite suivante

S (deacutepart)

S -gt aA (application de S -gt aA)

aA -gt ab (application de A -gt b)

54

422 Hieacuterarchie de Chomsky

La deacutefinition que nOlis avons donneacutee preacuteceacutedemment dun langage est beaucoup trop

geacuteneacuterale pour nous fournir des proprieacuteteacutes inteacuteressantes Afin de deacutegager des proprieacuteteacutes

inteacuteressantes nous deacutefinissons plusieurs cateacutegories Plusieurs noms sont utiliseacutes pour

chaque cateacutegorie mais nous nous limiterons agrave utiliser ceux deacutefinis par le linguiste Noam

Chomsky (Chomsky 1956) Chacune de ces cateacutegories sera deacutecrite par les proprieacuteteacutes de

sa grammaire Il est agrave noter que nous avons neacutegligeacute certaines cateacutegories de langages qui

ne sont pas lieacutees au domaine

Langage reacutegulier

Un langage reacutegulier est eacutequivalent aux expressions reacuteguliegraveres Les regravegles de production

de la grammaire doivent ecirctre de la forme

A -) Ba

A -) a

ou

A -) aB

A -) a

avec A et B des non-terminaux et a un termina Il est agrave noter que toutes les regravegles

dune grammaire doivent ecirctre soit du premier cas soit du deuxiegraveme cas On les appelle

reacutecursives agrave gauche ou agrave droite respectivement

Langage non-contextuel

Un langage non-contextuel est un peu plus complexe quun langage reacutegulier Les regravegles

de production de la grammaire doivent ecirctre de la forme

55

A -) B

avec A un non-terminal et B une suite de terminaux et de non-terminaux Le deacutetail

le plus important est de noter que les langages non-contextuels permettent de creacuteer un

systegraveme de parenthegraveses eacutequilibreacutees En effet voici une grammaire qui accepte seulement

un parentheacutesage eacutequilibreacute

P -) pp

P -) CP)

P -)

Il est eacutevident quune grammaire reacuteguliegravere ne peut geacuteneacuterer ce genre de langage Par contre

un parentheacutesage eacutequilibreacute est extrecircmement important dans le domaine de la compilashy

tion afin dexprimer clairement les ideacutees dun programmeur et plus speacutecifiquement

permettre deacutecrire des formules matheacutematiques complexes compreacutehensibles par lOlmiddotdishy

nateur

Langage contextuel

Les langages contextuels ne sont pas utiliseacutes en geacuteneacuteral en compilation car ils sont

beaucoup plus lents Les regravegles de production de la grammaire doivent ecirctre de la forme

ABC -) ADC

ougrave B est un non-terminal A et C sont des non-terminaux ou le mot vide et D est un

non-terminal (mais pas le mot vide) On voit clairement ici dougrave vient le nom de ce type

de langage B est transformeacute en fonction de ce qui est autour de lui (son contexte)

423 Utiliteacute dans les langages de programmation

La prochaine tacircche dans la creacuteation dun langage est danalyser la structure de notre

programme Pour effectuer cette tacircche nous pouvons utiliser une grammaire non-conshy

56

textuelle Agrave cette fin nous pouvons nous assurer que les eacutequations sont correctement

formeacutees que les instructions sont valides etc

Dans un autre ordre dideacutee la hieacuterarchie de Chomsky possegravede aussi des liens avec les

machines de Turing qui sont elles-mecircmes intimement lieacutees agrave la theacuteorie de la complexiteacute

(Davis Sigal et Weyuker 1994) Ce domaine est extrecircmement vaste et le lecteur pourra

trouver dans les reacutefeacuterences plusieurs excellents ouvrages pour sinitier agrave ce domaine (Dhu

et Ko 2000)

43 SableCC

Bien quil est tregraves inteacuteressant deacutetudier les algorithmes de compilation limpleacutementation

de chacun de ces algorithmes deacutepasse largement le cadre de ce meacutemoire Il nous faut

donc trouver une meacutethode afin de creacuteer notre langage de programmation Plusieurs

outils soffrent agrave nous mais notre choix sarrecirctera sur SableCC

431 Quest-ce que S~bleCC

SabieCC est ce quon appelle un compilateur de compilateurs (Gagnon 1998) Un comshy

pilateur de compilateurs est un programme qui permet agrave partir dune deacutefinition absshy

traite dun langage de programmation dobtenir un compilateur pour ce langage Plus

speacutecifiquement le programme reacutesultant nous permettra dobtenir larbre syntaxique

dun programme ce qui nous permettra de lanalyser reacutecursivement et de lexeacutecuter (ou

bien de le transformer dans un langage diffeacuterent selon le cas) Les formes abstraites que

requiert un compilateur de compilateurs sont justement les expressions reacuteguliegraveres (pour

deacutecouvrir les symboles) et les grammaires non-contextuelles (pour lanalyse syntaxique

des symboles obtenus preacuteceacutedemment)

432 Avantages de SableCC

Bien que SabieCC nest pas le compilateur de compilateurs le plus connu il possegravede

plusieurs aspects inteacuteressants Premiegraverement comparativement agrave ses compeacutetiteurs plus

57

acircgeacutes SabieCC est eacutecrit dans un paradigme orienteacute-objet Cela rend le compilateur beaushy

coup plus simple agrave utiliser De plus le logiciel geacutenegravere automatiquement un ensemble de

classes (dans un choix de plusieurs langages) qui permet de traiter aiseacutement et claishy

rement avec des concepts modernes les arbres syntaxiques reacutesultant de lanalyse du

programme

44 Langage reacuteflexif

Finalement une fois que nous avons obtenu un arbre syntaxique et que nous savons que

notre langage est bien formeacute il nous reste la reacuteflexiviteacute agrave prendre en compte En effet

nous ne voulons pas reacuteeacutecrire inutilement dans notre langage chaque fonction qui existe

deacutejagrave en Java Nous pourrons les utiliser avec un langage reacuteflexif Une autre possibiliteacute

dun langage reacuteflexif est de deacuteleacuteguer agrave SDDL la creacuteation de classes Cela permet agrave lutilishy

sateur de reacutefeacuterencer nimporte quelle classe Java sans avoir agrave changer le code de SDDL

lui-mecircme Cela serait impossible sans un langage reacuteflexif

441 Deacutefinition dun langage reacuteflexif

Un langage reacuteflexif (Sobel et Friedman 1996) est un langage qui est capable soit de

- Examiner son eacutetat cette proprieacuteteacute est appeleacutee introspection

- Modifier son eacutetat cette proprieacuteteacute est appeleacutee intercession

Lintrospection permet agrave un langage de connaicirctre entre autres les classes quil utilise

ainsi que les meacutethodes et les paramegravetres Lintercession beaucoup plus puissante pershy

mettrait par exemple cie rajouter modifier ou supprimer des classes etou meacutethodes

Pour nos besoins nous sommes naturellement inteacuteresseacutes par lintercession

442 Avantages

Lavantage le plus clair de lutilisation de la reacuteflexiviteacute est la reacuteutilisation du code En

effet toutes les fonctionnaliteacutes du langage infeacuterieur (Java dans ce cas-ci) peuvent ecirctre

58

automatiquement passeacutees au langage supeacuterieur Cela eacutevite davoir agrave reacuteeacutecrire du code

pour chaque nouvel eacuteleacutement agrave ajouter

Un autre avantage assez explicite est de permettre agrave des utilisateurs un peu plus aguerri

de lier du code des deux niveaux de langage ensemble En effet si un utilisateur creacutee

une structure de donneacutees en Java il peut toujours se servir exactement de la mecircme

classe dans le langage supeacuterieur sans avoir agrave faire la moindre modification au langage

supeacuterieur lui-mecircme Il est donc clair quun langage qui utilise la reacuteflexiviteacute peut devenir

tregraves puissant

443 Deacutesavantages

Certains deacutesavantages accompagnent aussi la reacuteflexiviteacute Un des plus importants est la

contrainte de seacutecuriteacute En effet si un utilisateur peut appeler nimporte quelle classe

Java agrave partir du langage supeacuterieur il peut tregraves aiseacutement appeler des fonctions qui cassent

le programme si un controcircle suffisamment important nest pas effectueacute par le logiciel Il

peut aussi sans causer d~s problegravem_es de seacutec~riteacute confondre un usager en provoquant

des effets de bord sur leacutetat du logiciel cest-agrave-dire modifier des proprieacuteteacutes du reste du

programme sans neacutecessairement que cela paraisse

Un autre deacutesavantage eacutevident est quun utilisateur qui souhaite utilicirc3er les fonctions du

langage infeacuterieur doit en quelque sorte connaicirctre celui-ci Cela implique donc lapprenshy

tissage dun deuxiegraveme langage ce qui en soit peut paraicirctre trop pour des utilisateurs

plus traditionnels

Lorsquon analyse froidement les avantages et les inconveacutenients on voit que les avanshy

tages sont beaucoup plus importants En effet le projet eacutetant limiteacute dans le temps et

dans le personnel il est en quelque sorte impossible de fournir des librairies de foncshy

tions suffisamment complegravetes pour les utilisateurs Se brancher sur les librairies Java

fournit automatiquement tout ce dont nous avons besoin et donne accegraves agrave une quantiteacute

innombrable de projets deacutejagrave creacuteeacutes dans ce langage

CHAPITRE V

MISE EN OEUVRE DE LA SOLUTION

Maintenant que nous avons des bases theacuteoriques solides ainsi quune hieacuterarchie bien

adapteacutee agrave nos besoins nous pouyons commencer agrave impleacutementer notre solution Cela

implique premiegraverement la creacuteation de notre hieacuterarchie objet en Java Deuxiegravemement

nous devons impleacutementer une grammaire afin de deacutecrire SDDL Finalement il faut

ajouter du code afin dimpleacutementer certaines proprieacuteteacutes voulues pour notre langage Il

est agrave noter que nous avons inclus en annexe un diagramme de notre hieacuterarchie ainsi que

la grammaire complegravete de SDDL

51 Eacuteleacutements de langage en SDDL

511 Impleacutementation de la hieacuterarchie

Limpleacutementation de la hieacuterarchie eacutetant seacutepareacutee du reste du langage il est normal de

commencer avec celle-ci eacutetant donneacute quelle repreacutesente le module le plus important de

notre projet Cela nous permet de le tester au fur et agrave mesure avant de commencer agrave

creacuteer un langage de plus haut niveau qui lutilise

Un des problegravemes les plus importants du deacuteveloppement de la hieacuterarchie fut de deacuteveshy

lopper correctement la deacutefinition et laccegraves agrave des points speacutecifiques de certains objets

Comme lideacutee eacutetait de permettre dobtenir une quantiteacute essentiellement illimiteacutee de

points diffeacuterents il fallait une meacutethode robuste et efficace

60

Notre meacutethode implique de fournir des informations par rapport au dessin englobant agrave

chaque sous-dessin Cela est requis car un objet preacutesent agrave plusieurs endroits diffeacuterents

auquel on demande un point speacutecifique se bute agrave une ambiguiumlteacute Mecircme en utilisant

seulement un Drawing qui est techniquement une instance unique dune forme il faut

faire attention En effet si on a un Drawing dun cercle qui est agrave linteacuterieur dune

ellipse par exemple nous pourrions deacutecider de placer cette ellipse agrave plusieurs endroits

Nous aurions donc le mecircme problegraveme dambiguiumlteacute du positionnement des points Afin

de remeacutedier agrave ce problegraveme nous avons fourni au Drawing sa position agrave linteacuterieur du

diagramme Lorsquil est copieacute nous navons quagrave changer linformation pour que le

positionnement soit correct

512 Grammaire

Le deacuteveloppement de la grammaire fut naturellement une section cruciale du deacutevelopshy

pement de SDDL Comme nous avions deacutejagrave deacuteveloppeacute des objectifs speacutecifiques pour la

forme du langage la creacuteation fut relativement directe Quelques eacuteleacutements importants

ont toutefois ducirc ecirctre ajouteacutes en cours de route En particulier des eacuteleacutements seacuteparateurs

ont eacuteteacute dune importance cruciale Il aurait donc pu ecirctre souhaitable de diminuer la

verbositeacute en enlevant des parenthegraveses ou des virgules mais cela cause (dans la plupart

des cas) des problegravemes au niveau de lambiguiumlteacute de la grammaire (tel que nous lavons

vu preacuteceacutedemment)

Nous avons aussi deacutecideacute de deacutecreacuteter quune expression geacuteneacuterale est une instruction Cela

peut sembler contre-intuitif car une expression (comme 2 + 2) ne semble pas ecirctre une

instruction La raison derriegravere ce changement est le dessin de chemin En effet nous

pouvons deacuteterminer un chemin (Path) comme nimporte quel autre objet Par contre

cela implique de lajouter par la suite seacutepareacutement agrave un canevas Cela semble contreshy

intuitif nous voyons souvent les liens entre les objets comme eacutetant des liens de niveau

supeacuterieur (bref faits dans le canevas principal) Pour lier a et b il semble plus logique

deacutecrire

61

a--b

que

lien = a--b

put lien in main

Afin de reacutegler ce problegraveme nous avons deacutecideacute de laisser les expressions ecirctre des insshy

tructions Cela fait que deacutefinir une ligne (comme a--b) devient automatiquement une

instruction valide Celle-ci sera traiteacutee comme un cas speacutecial afin decirctre placeacutee direcshy

tement au centre du canevas principal Cela implique aussi comme nous le verrons

plus tard de rajouter du code afin de sassurer que les expressions qui ne sont pas des

instructions soient refuseacutees par le programme

stm = exp exp sc 1 assign id assign exp sc 1 while while_kwd exp do_kwd (stms] stm end_kwd sc 1 if if_kwd exp then_kwd (stms] stm else_part end_kwd sc 1 for for_kwd id from~kwd (low_bound] exp to_kwd (up_bound] exp

do_kwd (stms] stm end_kwd sc 1 return return_kwd exp sc

Figure 51 Extrait de la grammaire de SDDL pour une instruction

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage

Plusieurs proprieacuteteacutes de SDDL ne venaient pas directement avec la grammaire Celles-ci

ont neacutecessiteacute un traitement bien particulier en fonction de la proprieacuteteacute rechercheacutee

Typage

La grammaire de SDDL indique clairement que le langage est agrave typage dynamique eacutetant

donneacute que les creacuteations de variables ne permettent pas de donner un type Le mecircme

62

pheacutenomegravene est preacutesent dans la deacutefinition des fonctions Par contre le fait de souhaiter

un typage dynamique implique lajout dune large section de code deacutedieacutee agrave la veacuterification

de type Chaque opeacuteration ne peut ecirctre appliqueacutee quagrave certains types deacuteleacutements et donc

avant deffectuer lopeacuteration il faut veacuterifier si le type est valide

Eacuteleacutements objets

Impleacutementer tous les principes dun langage orienteacute-objet est un travail de longue hashy

leine Par contre eacutetant donneacute que notre objectif eacutetait de simplifier le langage de desshy

cription final nous avons deacutecideacute de ne pas permettre la creacuteation de nouvelles classes

agrave linteacuterieur de SDDL Cela implique que nous pouvons releacuteguer la creacuteation de classes

uniquement au langage Java Cela a donc grandement faciliteacute la tacircche car nous navions

pas besoin dimpleacutementer la tregraves grande majoriteacute des concepts objets que nous laquo emshy

pruntons raquo agrave Java

Eacutelimination de la verbositeacute

Une bonne partie de leacutelimination de la verbositeacute vient de la conception mecircme du lanshy

gage En effet le fait de releacuteguer la deacutefinition des classes agrave Java ainsi que de creacuteer le

typage dynamique ont purement par choix eacutelimineacute une bonne partie de la verbositeacute

Quelques eacuteleacutements suppleacutementaires ont permis deacuteliminer un excegraves de verbositeacute On

note entre autres le fait de deacutefinir la description du diagramme sans le speacutecifier dans le

cadre dune fonction Un autre pheacutenomegravene important est davoir deacutecideacute de promouvoir

les points et certaines fonctions relieacutees agrave leacutetat de primitive naturelle du langage En

effet une addition entre un point a et b seffectue

c = a + b

au lieu de en Java

AbstractPoint c aadd(b)

63

Cela peut sembler comme un maigre gain mais lorsquappliqueacute agrave un calcul complexe

impliquant des points (par exemple le calcul dune combinaison lineacuteaire) les gains

combineacutes rendent le code extrecircmement clair

AbstractPoint c = amultiply(1030)add(bmultiply(2030))

c = (a 30 + 20 b 30)

Figure 52 Code Java et SDDL pour calculer une combinaison lineacuteaire

52 Reacutealisation en Java

Afin de reacutealiser SDDL il a bien sucircr fallu eacutecrire une grammaire mais beaucoup de code

autour sert agrave inteacutegrer la grammaire au restant des fonctionnaliteacutes de notre hieacuterarchie

Ce code fut complegravetement eacutecrit en Java et remplit plusieurs fonctions

521 Traverseacutee de larbre grammatical et exeacutecution

La grande majoriteacute du code Java suppleacutementaire eacutecrit a servi agrave permettre la traverseacutee

de larbre grammatical creacuteeacute par notre grammaire Cette traverseacutee permet en quelque

sorte lexeacutecution du code SDDL et est donc cruciale Pour la plupart il sagit dune trashy

verseacutee en profondeur relativement classique Quelques petits deacutetails retiennent toutefois

lattention

- Certains morceaux de code ne doivent pas ecirctre exeacutecuteacutes et ont donc un comportement

speacutecial Cest le cas des deacutefinitions de fonctions qui ne sont exeacutecuteacutees quagrave lappel On

meacutemorise donc en quelque sorte une partie de larbre grammatical et lors dun appel

on transfegravere le controcircle dexeacutecution agrave cette partie Eacutevidemment lors de la lecture de

la deacutefinition de la fonction il faut stocker quelques informations sur nos fonctions

dans une structure deacutefinie agrave cet effet (un Methodlnf0)

- Certaines opeacuterations ont plusieurs sens distincts qui ne peuvent ecirctre speacutecifieacutes dans la

grammaire La seacutemantique dune telle opeacuteration napparaicirct clairement quau moment

de la lecture de lopeacuteration (dans notre cas agrave lexeacutecut ion) Un exemple serait le

64

symbole daddition Bien que sa grammaire soit tregraves claire il peut sagir dune addition

de nombres mais aussi dune addition de points ou dune concateacutenation de chaicircnes

de caractegraveres Il est donc neacutecessaire agrave lexeacutecution de veacuterifier la classe de chaque objet

requis par lopeacuteration afin de trouver la bonne seacutemantique pour lopeacuteration si une

telle seacutemantique existe Si aucune nest trouveacutee on peut alors soulever une erreur

selon le meacutecanisme standard (par exemple additionner un point et une chaicircne de

caractegraveres)

- Certaines expressions grammaticalement correctes ne sont valides que sous certaines

conditions Par exemple nimporte quelle expression (exp) est accepteacutee comme eacutetant

une instruction (stm) grammaticalement valide Par exemple linstruction 2 + 2 va

ecirctre accepteacutee par la grammaire Par contre elle na pas de sens car elle naccomplit rien

du tout Il faut donc sassurer de veacuterifier dans la traverseacutee que lexeacutecution est leacutegale

Dans ce cas-ci il faut sassurer que lexpression de niveau supeacuterieur (une addition)

est valide pour ecirctre une instruction Dans un tel cas une erreur serait souleveacutee encore

selon le meacutecanisme standard

522 Deacutefinition dobjets quelconques

Une partie moins grande du code est consacreacutee agrave linteacutegration de la hieacuterarchie de SDDL

dans la deacutefinition du langage Comme nous souhaitions utiliser des classes quelconques

nous avons utiliseacute la reacuteflexiviteacute Java telle que nous le deacutecrivions plus tocirct Cela implique

de reacutecupeacuterer les noms des fonctions et des classes lors de leurs utilisations Toutes les

veacuterifications seffectuent agrave lexeacutecution Nous savons donc seulement si une classe A existe

bel et bien lorsque nous essayons de creacuteer un objet agrave partir de celle-ci De plus chaque

fonction appeleacutee sur un objet de classe A nest veacuterifieacutee que lors de son utilisation

Habituellement la solution aurait eacuteteacute de veacuterifier avant lexeacutecution lexistence de chaque

classe ainsi que les fonctions de chaque classe pour sassurer que lexeacutecution soit correcte

Dans notre cas la veacuterification agrave lexeacutecution est suffisante car les programmes sont tregraves

courts

De plus quelques contraintes ont ducirc ecirctre ajouteacutees afin de sassurer Clue seules les parties

65

Override public void caseADrawingTermCADrawingTerm node)

String className = nodegetClassName() getText()

try

thiscurrentExpressionClass ClassforName(sddlhierarchy + className)

thiscurrentExpressionValue = thiscurrentExpressionClassgetConstructor() newlnstance()

catch(NoSuchMethodException e)

throw new InterpreterException( cl ass Il + className + is ill-defined (no base constructor) nodegetClassName())

catch(Exception e)

throw new InterpreterException(unable to load + className +

Il class (maybe it does not exist) nodegetClassName())

Figure 53 Code reacuteflexif pour creacuteer une forme quelconque

requises de Java sont exposeacutees agrave lutilisateur final La restriction principale est de ne

creacuteer que des objets qui font partie du paquet sddl hierarchy Il est toutefois agrave

noter que cela nisole pas totalement le reste de Java car il est tout agrave fait possible de

creacuteer une classe qui permet dacceacuteder agrave Java complegravetement

523 Gestion des erreurs

La gestion des erreurs seffectue au travers des meacutecanismes deacutejagrave mis en place par Java

cest-agrave-dire les exceptions Une classe speacutecifique aux exceptions de linterpreacuteteur a eacuteteacute

creacuteeacutee qui permet de speacutecifier non seulement un message mais aussi un noeud bien

speacutecifique dans larbre grammatical afin didentifier lendroit ougrave lerreur a eacuteteacute deacutecouverte

66

Cela est extrecircmement utile afin de permettre agrave lutilisateur de corriger la majoriteacute de

ses erreurs

De plus une partie du code de gestion derreurs sert agrave repreacutesenter la pile dexeacutecution

En effet afin didentifier la source dun problegraveme il est important de pouvoir savoir

quelles fonctions sont impliqueacutees Nous pouvons donc identifier la ligne de chaque appel

au moment ougrave lerreur sest produite et ainsi identifier des problegravemes entre autres dans

le cas des fonctions reacutecursives

524 Structures de support

Dimportances mineures la plupart de ces structures servent agrave geacuterer lexeacutecution des

meacutethodes

- La classe Frame repreacutesente le cadre dexeacutecution dune fonction Cette classe permet

dobtenir des fonctions reacutecursives car on peut imbriquer un Frame dans un autre

- La classe Methodlnfo repreacutesente une fonction deacutefinie agrave linteacuterieur de SDDL Elle

permet de transfeacuterer lexeacutecution agrave la deacutefinition fournie par lutilisateur et regroupe

les informations geacuteneacuteralement utiles agrave la veacuterification seacutemantique (nom paramegravetres

etc)

- La classe PrimitiveMethodlnfo repreacutesente une fonction de Java accessible par la

reacuteflexiviteacute Elle fournit aussi quelques informations pour la veacuterification seacutemantique

- La classe MethodTable fournit une table pour geacuterer lensemble des fonctions afin

dacceacuteder directement agrave une fonction agrave partir de son nom

53 Accegraves agrave Postscript PDP et B-1EX

531 Postscript

Afin de reacutealiser correctement notre langage nous avions besoin dacceacuteder agrave diffeacuterentes

technologies Eacutetant donneacute que nous voulons terminer avec des dessins en format Postshy

script il devient important de pouvoir fournir aiseacutement du code dans ce format Il

67

sagit toutefois dun format relativement complexe et il devient donc long et complexe

de fournir une traduction valide pour chacun de nos diffeacuterents concepts

Le problegraveme principal de Postscript est quil possegravede un ensemble de primitives de tregraves

bas niveau En effet afin de dessiner une courbe la seule meacutethode possible est lutishy

lisation de courbes de Beacutezier avec des points de controcircle qui doivent ecirctre fournis agrave

lavance Comme nous lavons vu preacuteceacutedemment les courbes de Beacutezier sont tregraves prashy

tiques pour lordinateur mais peu pratique pour [utilisateur car la speacutecification de

points de controcircles qui ne sont pas interpoleacutes est peu intuitive De plus afin de faire

des courbes quelconques il faut les seacuteparer en plusieurs courbes de Beacutezier de tailles

infeacuterieures

Il existe des algorithmes qui permettent de prendre des courbes et de les seacuteparer en

sections adeacutequates Un de ces algorithmes est impleacutementeacute en Asymptote (Bowman

2007) Il est donc naturel afin deacuteviter davoir agrave reacuteimpleacutementer un algorithme aussi

complexe dutiliser Asymptote pour obtenir nos courbes de faccedilon systeacutematique

532 PDF

Le format PDF possegravede lavantage dinteacutegrer plusieurs fonctions multimeacutedias telles que

les liens les videacuteos les formulaires (Adobe Systems Incorporated 2006) etc Malgreacute

tout PDF outre les quelques ajouts nommeacutes ci-haut est essentiellement similaire agrave

Postscript Eacutevidemment les nombreuses possibiliteacutes fournies par le format PDF sont

deacutesirables (inteacutegrer des videacuteos agrave des notes de cours par exemple) Il existe toutefois

de nombreux convertisseurs qui peuvent prendre un fichier Postscript et le mettre au

format PDF Par contre cette conversion ne permet pas dajouter les fonctionnaliteacutes

PDF qui nous inteacuteressent Il devient donc crucial dobtenir une meacutethode pour fournir

des images directement au format PDF Encore lagrave le fait de passer par Asymptote

nous donne une solution rapide et eacuteleacutegante car le fait de fournir du PDF est inclus

dans le logiciel En geacuteneacuterant directement du Asymptote nous pourrions donc obtenir

automatiquement le format rechercheacute

68

533 ~1lE)C

Leacuteleacutement le plus crucial du langage que nous recherchions au deacutebut eacutetait de pouvoir

utiliser du texte tel que mis en forme par UTEX dans nos diagrammes Un tel besoin

implique plusieurs problegravemes

Premiegraverement un texte UTEX est conserveacute sous la forme dune chaicircne de caractegraveres

standard Par contre apregraves avoir eacuteteacute traiteacute le reacutesultat obtenu est une boicircte contenant

le texte mis en forme La taille de cette boicircte est deacutetermineacutee lors de la mise en page

et ne peut donc pas ecirctre deacutetermineacutee directement par notre programme Or si nous ne

connaissons pas la taille exacte de notre boicircte de texte il est impossible de positionner

un texte par une position autre que son coin supeacuterieur gauche Cela est un comportement

peu inteacuteressant eacutetant donneacute que dans de nombreux graphes on place le texte au centre

dun sommet (donc par exemple le centre de la boicircte sera placeacute au centre dune ellipse)

Afin de pallier agrave ce problegraveme il faudrait demander agrave UTEX de creacuteer les boicirctes une

premiegravere fois et de nous fournir les tailles des boicirctes Par la suite il faudrait geacuteneacuterer

une page UTEX de la bonne taille avec nos dessins puis dire agrave UIEX de geacuteneacuterer les

boicirctes de textes aux endroits que nous aurons calculeacute entre temps Bien que viable

cette meacutethode implique beaucoup de code et de cas diffeacuterents (laccegraves agrave IbIEX par un

programme externe va varier dun systegraveme dexploitation agrave lautre entre autres) Eacutetant

donneacute quAsymptote fournit deacutejagrave un accegraves agrave I5IEX agrave linteacuterieur du logiciel le travail

requis pour lutilisation de I5TEX est de beaucoup diminueacute

534 Geacuteneacuteration du code Asymptote

Afin davoir une solution valide il ne reste donc pl s quagrave nnecter not e so ution agrave

Asymptote Pour le faire nous devons premiegraverement geacuteneacuterer un fichier de code Asympshy

tote valide pour par la suite le faire valider en appelant le programme de maniegravere

externe Eacutetant donneacute que le projet a eacuteteacute eacutecrit speacutecifiquement pour fournir du code

Asymptote une solution simple a eacuteteacute utiliseacutee afin deacutecrire le code le canevas principal

69

public void draw(AbstractPoint location PrintWriter out)

AbstractPoint pl locationadd(new Point (radius 00)) AbstractPoint p2 locationadd(new Point(OO radius)) AbstractPoint p3 locationadd(new Pointe-radius 00)) AbstractPoint p4 locationadd(new Point(OO -radius))

outprintln(draw( + p1so1veO + + p2solveO + + p3solveO + + p4solveO + cycle))

Figure 54 Code pour geacuteneacuterer du code Asymptote pour un cercle

sera appeleacute agrave ecirctre dessineacute qui appellera reacutecursivement chacun de ses sous-canevas

La geacuteneacuteration du code Asymptote a eacuteteacute reacuteserveacutee dans une fonction draw speacutecifique agrave

chaque forme (Shape) qui eacutecrit dans un fichier ouvert fourni en paramegravetre Un exemple

dune telle meacutethode pour la classe Circle est illustreacute agrave la figure 54

Une telle meacutethode est simple mais suffisante pour nos besoins Bien sucircr agrave long terme

une solution plus robuste devrait simposer En effet comme leacutecriture du fichier est

faite directement lors de lexeacutecution les objets doivent ecirctre appeleacutes exactement dans

lordre dont ils sont deacutependants Par exemple un segment dessineacute entre deux cercles

doit ecirctre dessineacute apregraves les cercles car sinon les reacutefeacuterences seront absentes Dans ce cas-ci

le segment va toujours ecirctre deacutefinie par la suite Par contre si nous voulions rajouter

la possibiliteacute dutiliser des extensions dAsymptote cela impliquerait de les eacutecrire au

deacutebut du fichier Il est impossible de le faire avec cette solution

Une solution plus robuste serait dutiliser un outil lieacute agrave SabieCC qui est ObjectMacro

(Gagnon 2009) Cette extension nous permet de simplifier la geacuteneacuteration de code et

deacutecrire agrave des endroits arbitraires dans un fichier agrave laide de macros et de programmation

objet Cela nous permettrait aussi deacutetendre la geacuteneacuteration de code agrave plusieurs formats

diffeacuterents par exemple geacuteneacuterer directement du code PDF au lieu de geacuteneacuterer du code

70

Asymptote

61

CHAPITRE VI

REacuteALISATION DES DIAGRAMMES EN SDDL

Maintenant que nous avons notre programme complet et fonctionnel il faut veacuterifier son

efficaciteacute Nous proceacutedons en deux temps Premiegraverement il faut revenir agrave nos dessins

de base et les coder avec notre logiciel Par la suite il faut aussi les analyser en fonction

des diffeacuterents facteurs cruciaux que nous avons eacutenumeacutereacutes dans les chapitres preacuteceacutedents

Nous pourrons donc agrave partir de cela conclure si le logiciel savegravere efficace pour nos

besoins ou si certains problegravemes lempecircchent de fonctionner adeacutequatement

Naturellement nous avons pris le temps dappliquer cette analyse agrave chacun des dessins

dans notre base de diagrammes du domaine Par manque despace nous nanalyserons

dans ce chapitre que trois dessins Une attention particuliegravere a eacuteteacute porteacutee au choix de

ces dessins afin de repreacutesenter un eacuteventail assez large des capaciteacutes du logiciel et des

diffeacuterents eacuteleacutements cruciaux agrave obtenir dans la description dun diagramme Tous les

diagrammes sont disponibles en annexe avec code sans analyse deacutetailleacutee toutefois

Analyse du code des diagrammes existants

Pour faire notre analyse nous devons premiegraverement obtenir chaque dessin Dans ce cas

nous utiliserons un diagramme tireacute du domaine de la compilation Cela nous fournit un

graphe relativement standard avec un niveau de complexiteacute inteacuteressant sans toutefois

ecirctre trop complexe Par la suite nOlis analyserons un diagramme repreacutesentant une strucshy

ture de tableau Cela montre la capaciteacute du logiciel de travailler avec des structures de

72

donneacutees geacuteneacuterales Finalement nous effectuerons lanalyse dun diagramme de Venn qui

nest a priori pas supporteacute par le logiciel afin de voir la complexiteacute dun diagramme

totalement geacuteneacuteral et qui sort des conventions preacute-eacutetablies par le logiciel

611 Rappel des objectifs cruciaux agrave observer

Naturellement afin de faire une analyse rationnelle de notre solution il faut se remeacuteshy

morer les diffeacuterents objectifs que nous nous eacutetions fixeacutes Les plus importants eacutetaient les

suivants

- Inteacutegration avec Jb1EX Eacutetant donneacute le design de notre solution ce point est naturelshy

lement reacutealiseacute dans tous les diagrammes

- Description de structures Il nous faut pouvoir deacutecrire une structure de maniegravere aiseacutee

Le fait decirctre aiseacute est naturellement subjectif mais nous pouvons ramener le tout au

fait quil soit plus simple de deacutecrire dans notre logiciel Wle structure que dutiliser les

primitives de base du langage Par exemple il est plus aiseacute de deacutecrire une structure

en parlant de boicirctes et de liens quen parlant de lignes et de courbes

- Hieacuterarchie solide et extensible Nous ne testerons pas lextensibiliteacute de la solution car

elle a deacutejagrave eacuteteacute deacutemontreacutee Toutefois les diffeacuterents codes nous permettront danalyser

agrave quel point nous utilisons la hieacuterarchie que nous avons construite et agrave quel point elle

est reacuteellement pratique

Nous avions aussi dautres objectifs de moindre importance

- Gestion des erreurs Il nest pas possible avec du code compleacuteteacute de tester la gestion des

erreurs Lauteur peut toutefois garantir que sans la gestion des erreurs une grande

quantiteacute de temps aurait eacuteteacute perdu dans la reacutedaction du code des diagrammes et ce

malgreacute la connaissance profonde du langage sous-jacent

- Langage fluide et clair Cela peut ecirctre testeacute par le lecteur en regardant le code Si

une analyse rapide lui permet de comprendre le sens du code alors celui-ci est clair

Naturellement lauteur ne peut effectuer cette analyse par lui-mecircme Bien que nous

ne puissions en faire une analyse scientifique en inspectant le code reacutesultant nous

73

sommes confiants que la syntaxe que nous avons choisie est claire et permet dexprimer

clairement les concepts sous-jacents au langage

- Qualiteacute de la documentation et courbe dapprentissage Il sagit ici dun autre eacuteleacutement

que nous pouvons difficilement aborder par nous-mecircmes Cela ne sera pas pris en

compte dans notre analyse

Selon ces diffeacuterents facteurs nous voyons que nous devrons surtout nous concentrer sur

la structure geacuteneacuterale du code ainsi que sur sa complexiteacute Le code doit ecirctre facile agrave

lire tout en permettant de compacter un maximum dinformation dans un minimum

despace

612 Diagramme de compilation

Notre premier dessin est tireacute dun livre de compilation Il sagit dun automate assez

standard et repreacutesente donc un bon diagramme moyen afin de voir les capaciteacutes de

notre logiciel

Figure 61 Diagramme dautomate de compilation

Quelques points importants sont agrave noter dans ce dessin Premiegraverement on note la

creacuteation dune structure sous-jacente (composeacutee dune ellipse et deux cercles) Par la

74

circlel Circle with [radius = 100] circle2 Circ le with [radius = 120] ellipse Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (1000 500) in main d3 put form at (1000 -500) in main put Text with [text $N(p_l)$] at (1000 1000) in main put Text with [text $N(p_2)$] at (1000 500) in main put Text with [text dotsJ at (100000) in main put Text with [text I$N(p_n)$J at (1000 -500) in main

put Text with [text = $s_O$J at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt(coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt(coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt(coord of anglePoint(1800) in maind3circle)

Figure 62 Code pour le diagramme dautomate

suite cette forme est appliqueacutee agrave plusieurs reprises dans le dessin Cela deacutemontre que

dans ce cas-ci il est possible de creacuteer et dutiliser des structures dun certain degreacute de

complexiteacute

On note aussi lutilisation des variables pour reacutecupeacuterer les dessins afin de pouvoir les

reacutefeacuterencer plus tard Cette eacutetape est aussi simple que lassignation agrave une variable Par

la suite on peut noter les flegraveches qui sont traceacutees agrave partir de points deacutefinis agrave partir de

certains cercles La structure mecircme est extrecircmement explicite dans ce cas et rend la

compreacutehension du dessin tregraves simple On reacutecupegravere aussi finalement les points formeacutes agrave

un certain angle dun cercle

75

La complexiteacute du diagramme est beaucoup plus simple quelle ne le serait avec des

primitives de base En effet les seuls dessins explicites que nous devons effectuer par

points sont les flegraveches De plus ces flegraveches sont relativement simples puisque nous navons

rien agrave speacutecifier pour le bout de flegraveche seulement les extreacutemiteacutes Pour le reste les formes

sont soient deacutefinies agrave partir de notre hieacuterarchie (comme les cercles ou les ellipses) ou

bien par un collage de formes plus simples (comme pour la forme form) Les points sont

obtenus par des accegraves structureacutes et fournissent donc des valeurs exactes rendant ces

opeacuterations extrecircmement rapides agrave eacutecrire pour lusager

On note toutefois quil existe certains eacuteleacutements dans le code qui auraient pu ecirctre simshy

plifieacutes afin de rendre le code encore plus compact En effet nous remarquons la preacutesence

de beaucoup de valeurs explicites alors quil aurait eacuteteacute possible de les remplacer par des

variables afin de rendre le tout plus clair

Un eacuteleacutement qui aurait pu amener une touche de simplification aurait eacuteteacute dutiliser des

listes ou des boucles afin dinseacuterer plus aiseacutement les objets Par exemple la structure

complexe aurait pu ecirctre ajouteacutee plusieurs fois par une boucle for avec des positions

calculeacutees en fonction de lindex Nous sommes toutefois davis que malgreacute lameacutelioration

possible que cela fournit au code il est peu probable que les utilisateurs finaux prennent

le temps de faire ce genre de modification et utiliseront fort probablement plus des

positions relatives avec une seacuterie dappels sauf si le nombre dobjets agrave positionner

devenait grand (par exemple une dizaine dobjets)

En geacuteneacuteral nous pouvons toutefois consideacuterer que ce diagramme est simplifieacute de beaushy

coup par lutilisation de notre solution La grande part du code est explicite et la strucshy

ture est tregraves simple agrave observer en regardant uniquement le code Mecircme si tout nest pas

parfait il y a clairement avantage agrave utiliser le logiciel pour coder cet automate

613 Diagramme de tableau

Notre second dessin est tireacute dun livre sur les structures de donneacutees Il repreacutesente

leacutevolution dune structure de donneacutee simple (un tableau) agrave travers certaines modifishy

76

cations

a ab 1 0 2 8 (lime

1 -10

3 7

iuml

Figure 63 Diagramme de tableau

Un des points les plus inteacuteressants de ce dessin est lutilisation dune fonction Elle place

une forme dans un canevas agrave plusieurs endroits speacutecifiques en fonction dune position de

deacutepart et dun vecteur de translation Cela nous permet de placer une forme identique

(un carreacute) plusieurs fois de suite ce qui nous donne limpression quil sagit en reacutealiteacute

dun tableau

Un autre point qui est tregraves important dans ce dessin est que les nombreux carreacutes sont

en fait tous des instances du mecircme deacutefini au deacutebut Cela permet de modifier lensemble

des carreacutes aiseacutement en ne modifiant que les proprieacuteteacutes de celui de base Pour le reste du

dessin il sagit surtout dun ensemble de flegraveches et de textes positionneacutes agrave des endroits

speacutecifiques

En analysant le code on voit une ameacutelioration claire provoqueacutee par le fait dutilishy

ser une fonction pour placer les carreacutes Cela nous permet de simplifier de beaucoup

les appels et les reacutepeacutetitions Nous pouvons toutefois noter que quelques ameacuteliorations

suppleacutementaires pourraient ecirctre apporteacutees En effet une classe aurait pu ecirctre eacutecrite en

Java pour repreacutesenter un tableau agrave lhorizontale ou agrave la verticale Cela aurait pu simshy

plifier significativement le code du dessin en combinant dans la structure le texte et

les carreacutes utiliseacutes pour repreacutesenter le tableau lui-mecircme De plus les flegraveches auraient pu

ecirctre deacutetermineacutees agrave partir de points obtenus du tableau lui-mecircme (par exemple le coin

supeacuterieur droit ou supeacuterieur gauche) auxquels nous aurions ajouteacute un vecentierteur de

deacuteplacement

77

fun dropMany(f n s v c) for i from 1 to n do

put f at (s + (i - 1) v) in c end

square = Square with [length = 200] changeVec = (00 -200) dropMany (square 4 (00 00) changeVec main)

dropMany(square 3 (500 00) changeVec main) dropMany(square 1 (1000 00) changeVec main)

dropMany (square 1 (1500 00) changeVec main) put Text with [text=O] at (00 00) in main

put Text with [text=l] at (00 -200) in main put Text with [text=3] at (00 -400) in main

put Text with [text=7] at (00 -600) in main put Text with [text=bf a] at (500200) in main put Text with [text=2] at (500 00) in main

put Text with [text=4] at (500 -200) in main put Text with [text=7] at (500 -400) in main

put Text with [text=7] at 0000 00) in main put Text with [text=bf $a-b-+$] at 0500 200) in main

put Text with [text=8] at 0500 00) in main put Text with [text=none] at (2000 00) in main

020 100)-gt(380 100) (620 100)-gt(880 100)

(1120 100)-gt0380100) 0620 100)-gt0880100)

Figure 64 Code pour le diagramme de tableau

Avec ces changements le code aurait pu ecirctre beaucoup plus compact Bien que cette

option soit reacutealisable nous ne lavons pas impleacutementeacutee car il eacutetait important de limiter

ce quun usager peut creacuteer sans lutilisation de Java Cela est ducirc au fait que notre objectif

est que seulles utilisateurs experts se servent de Java afin dameacuteliorer le logiciel Le code

est tout de mecircme significativement meilleur que de placer tout agrave la main ce qui nous

permet de conclure agrave lefficaciteacute de notre logiciel dans le cas dune structure geacuteneacuterale

78

614 Diagramme de Venn

Notre dernier dessin est une structure qui ressemble beaucoup plus agrave un dessin geacuteneacuteral

cest-agrave-dire un diagramme de Venn La forme dun tel diagramme fait quil est extrecircmeshy

ment complexe deacutecrire une classe qui permet de dessiner automatiquement ce type de

structure et quil vaut mieux creacuteer les formes une par une comme on le ferait agrave la main

Cela nous permettra danalyser si les choses simples agrave dessiner agrave la main demeurent

facile agrave reacutealiser avec notre logiciel

A

Figure 65 Diagramme de Venn

Ce dessin ne possegravede pas beaucoup de grands points dinteacuterecirct En effet la structure ne

peut pas vraiment ecirctre geacuteneacutereacutee automatiquement par un algorithme alors elle est entreacutee

manuellement On remarque tout de mecircme lutilisation de plusieurs sous-canevas afin

de simplifier le placement des objets qui sont agrave linteacuterieur dautres

Naturellement eacutetant donneacute que la structure doit ecirctre deacutecrite manuellement le code

nest pas plus court que lutilisation de primitives de base Par contre cela est comshy

penseacute par un niveau de clarteacute supeacuterieur eacutetant donneacute lutilisation des canevas afin de

regrouper les eacuteleacutements dans des ensembles respectifs Cfla permet de positionner tous

les eacuteleacutements en valeurs relatives au lieu dabsolues ce qui simplifie de beaucoup le travail

de positionnement

De plus le fait de pouvoir stocker les eacuteleacutements dans des variables nous permet de les

identifier par diffeacuterents noms significatifs ce que des primitives de base comme celles

79

circle = Circle with [radius = 100] bigcircle = Circ le with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvas1 put circle at 050 150) in canvas1 put Text with [text = H] at 050 150) in canvas1 put circle at (-150 150) in canvas1 put Text with [text J] at (-150 150) in canvas1 put Text with [text = B] at (00 -150) in canvas1

put bigcircle in canvas2 put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = F] at 050 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = E] ac (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvas1 at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = A] at (00 -300) in main put bigellipse in main

Figure 66 Code du diagramme de Venn

de PDF ne nous permet pas de faiTe Nous pouvons donc en conclure que mecircme pour

les structures difficiles agrave repreacutesenter notre logiciel fournit tout de mecircme un nombre

significatif davantages

Preacutesentation du produit final

Une fois que nous avons pu confirmer que notre logiciel eacutetait efficace il ne restait plus

quagrave le faire connaicirctre Nous preacutesentons donc ici un reacutesumeacute des efforts qui ont eacuteteacute

effectueacutes afin damener le logiciel agrave la connaissance de la communauteacute gIEX

62

80

621 Statistiques et documentation

En premier lieu avant de pouvoir preacutesenter notre solution il nous fallait la documenter

correctement En effet leffort de deacuteveloppement nous aura permis de deacutevelopper un

produit de tregraves grande taille La taille totale du travail se limite agrave environ 10 megs mais

cela implique plus de 6300 lignes de code deacuteveloppeacutees speacutecifiquement pour le projet

(cela incluant les commentaires mais excluant tout le code geacuteneacutereacute par SableCC qui est

tregraves exhaustif) Avec une taille aussi significative il est tout simplement impensable de

sattendre agrave ce quun utilisateur analyse le code afin de trouver ce qui va reacutepondre agrave ses

besoins

Pour cela nous avons pris le temps de reacutediger une documentation interne Elle consiste agrave

documenter chaque classe de notre hieacuterarchie ainsi que chaque fonction disponibles Cela

fournit des renseignements complets pour quelquun qui cherche un eacuteleacutement speacutecifique

du langage

622 Preacutesentation

Par la suite nous avons reacutedigeacute une preacutesentation pour la confeacuterence TUG 2010 que nous

avons preacutesenteacutee le 28 juin 2010 agrave San Francisco devant des membres tregraves influents de

la communauteacute JbTEX dont Donald Knuth le creacuteateur original de TEX La confeacuterence

nous a permis de nous mettre au pouls des besoins de la communauteacute et de linteacuterecirct

quils portent agrave un tel projet La reacuteponse se voulait enthousiaste particuliegraverement de

la part du preacutesentateur dAsymptote John Bowman La confeacuterence est disponible sur

le site de River Valley (Bourgeois 2010) (malheureusement sans videacuteo eacutetant donneacute un

problegraveme dopeacutemt ur)

Bien quil sagisse dun eacuteleacutement tregraves important dans la preacutesentation dun projet une

confeacuterence ne rejoint pas beaucoup de monde Pour combler ce besoin nous avons aussi

reacutedigeacute un article pour la revue TUGBoat (Bourgeois et Villemaire 2010a) qui est la

revue principale de la communauteacute JbTEX Nous avons inclus larticle en annexe Cela

81

nous a permis de rejoindre un public beaucoup plus grand quune simple preacutesentation

devant public

623 Site web

Finalement afin de faciliter la distribution de notre logiciel nous avons deacuteveloppeacute un site

web (Bourgeois et Villemaire 2uuml1uumlb) pour accompagner la preacutesentation et permettre le

teacuteleacutechargement Le site contient aussi toute notre documentation ainsi que les contenus

des preacutesentations et articles que nous avons mentionneacutes plus haut Nous avons aussi pris

le temps de fournir quelques exemples suppleacutementaires afin de montrer lattrait direct

de SDDL

63 Conclusion de notre analyse

Nous concluons que notre solution est efficace et quelle respecte agrave diffeacuterents niveaux

les critegraveres que nous nous eacutetions fixeacutes au deacutepart Il sagit dune hieacuterarchie dobjets facile

et extensible accompagneacutee dune syntaxe claire et fluide Avec lajout de la gestion des

erreurs et sa capaciteacute agrave deacutecrire plusieurs formes de structures notre logiciel permet de

simplifier la repreacutesentation des diagrammes classiques du domaine Nous en venons donc

agrave la conclusion que notre solution respecte les diffeacuterents critegraveres et nous pouvons donc

consideacuterer notre solution comme eacutetant valide

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CONCLUSIOK

La creacuteation de diagrammes structureacutes comme nous avons pu le constater tout au long

de ce meacutemoire est un sujet tregraves complexe Bien quil puisse de prime abord necirctre vu

que comme la capaciteacute de faire des petits dessins simples nous remarquons rapidement

que les deacutecrire tels que nous les voyons est beaucoup plus difficile quil y parait

Entre autres nous avons pu constater que les diagrammes sont penseacutes de maniegravere

extrecircmement abstraites En effet dans un arbre nous ne voyons pas une seacuterie de somshy

mets relieacutes par des points mais bel et bien un arbre seulement Cette capaciteacute agrave abstraire

la forme du contenu est extrecircmement pratique pour un ecirctre humain mais pas tregraves utile

pour un ordinateur Il est extrecircmement difficile dessayer de saffranchir du besoin de

speacutecifier la forme lorsquon veut creacuteer un diagramme

Il en est de mecircme avec IbTEX duquel nous nous sommes inspireacute Bien que le logiciel

puisse faire la forme de maniegravere adeacutequate dans plusieurs cas ces derniers savegraverent tregraves

speacutecifiques et plus souvent quautrement la possibiliteacute dobtenir un niveau accru de

controcircle sur la forme est souhaitable Dautre part la question du positionnement dun

texte scientifique dans une page a eacuteteacute abondamment eacutetudieacute (entre autre par la creacuteation

de TEX) alors que le bon positionnement dun diagramme la eacuteteacute beaucoup moins Il

est donc probleacutematique de se deacutebarrasser de cet eacuteleacutement de forme dans nimporte quel

logiciel de creacuteation de diagrammes

Cela nous amegravene donc agrave la question naturelle de savoir si notre logiciel savegravere une solushy

tion valide agrave notre probleacutematique initiale En effet bien que notre analyse deacutemontre que

la creacuteation de dessins devient plus simple nous ne pouvons affirmer que nous eacutecrivons

ce que nous pensons du diagramme

- -

84

Or comme la question est de veacuterifier la validiteacute de notre solution nous reacutepondrons par

laffirmative Mecircme si elle nest pas parfaite un degreacute de complexiteacute se trouve eacutelimineacute

malgreacute tout Il est tout de mecircme possible pour un utilisateur de penser en des termes plus

abstraits mecircme sil ne sagit pas du niveau dabstraction optimal De plus eacutetant donneacute

que nous avons creacuteeacute notre solution pour ecirctre extensible il est possible daugmenter le

niveau dabstraction avec la contribution de la communauteacute Bien que la solution ne soit

pas parfaite et aurait pu jouir dameacuteliorations subseacutequentes lobjectif principal eacutetait de

deacutevelopper un langage qui simplifiait la description de diagrammes structureacutes et cela

fut atteint

Naturellement eacutetant donneacute les limites de temps et de complexiteacute plusieurs pistes de

deacuteveloppements suppleacutementaires nont pu ecirctre utiliseacutees En effet nous nous sommes

limiteacutes agrave la description dune image statique Il est toutefois tregraves utile de pouvoir creacuteer

des images dynamiques La possibiliteacute de creacuteer des seacutequences de mouvements agrave linteacuterieur

dun diagramme aurait pu rendre notre outil plus inteacuteressant De plus lUl outil de

geacuteneacuteration automatique de graphes ou darbres mecircme imparfait pourrait fournir des

choix suppleacutementaires agrave un utilisateur qui souhaite obtenir un reacutesultat rapidement sans

toutefois rechercher un reacutesultat parfait

Il est toutefois bon de noter que bien quil soit long et complexe deffectuer de tels

ajouts notre logiciel a eacuteteacute penseacute en fonction de pouvoir ecirctre eacutetendu par lutilisateur Il

est donc tout agrave fait possible de pouvoir eacuteventuellement fournir de telles fonctionnaliteacutes

dans une version future du programme Dici lagrave celui-ci suffira amplement agrave la creacuteation

de diagrammes simples

APPENDICE A

PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

Nous incluons ici larticle complet que nous avons reacutedigeacute agrave propos de notre logiciel

afin den faire la promotion aupregraves de la communauteacute TEX et JbTEX Cet article qui fut

preacutesenteacute dans Tugboat la revue du TEX Users Group tel que mentionneacute preacuteceacutedemment

compleacutemente la preacutesentation qui fut effectueacutee lors de la confeacuterence du mecircme groupe

agrave San Francisco Larticle est essentiellement une introduction pragmatique pour un

utilisateur final et fournit donc plusieurs exemples inteacuteressants dutilisation tout en

deacutecrivant briegravevement les diffeacuterents concepts importants qui ont meneacutes le deacuteveloppement

de SDDL Il sagit de la version finale tel que Jarticle apparait dans le numeacutero de Tugboat

206

Drawing structured diagrams with SDDL

Mathieu Bourgeois and Roger Villemaire

Abstract

We present SOOL a Structured Diagram Description Language aimed at producing graphical representashytions for discrete mathematics and computer science SDDL allows combining graphical objects (circles lines arrows ) and lbTEX boxes to produce diashygrams representing discrete structures such as graphs trees etc with an easy-to-use domain specific lanshyguage

1 What is SDDL

SDDL Structured Diagram Description Language is a high-level domain specific language tailored for diagrams that have an inherent structure Examples of these might be trees graphs and automata Any diagram that is naturally structured can be described in SDOL However it was designed especially for data structures appearing in computer science and discrete mathematics

The main objective of this language is to realize drawings in a natural and structured way Mainly one describes a drawing in SOOL in a way that is simishylar to drawing on a blackboard For example specific shapes (like circles ellipses texts boxes) are drawn at positions that can be either absolute or relative to specific points on already placed shapes Since we aim at mathematical drawings text is handled through lbTEX

Since exhibiting the structure of a diagram is esshysential to our purpose SOOL uses an object-oriented hierarchy completely written in Java under our high-levellanguage Having shapes as objects makes structuring of diagrams easier and more intuitive since most shapes are explicitly represented by a class Furthermore extension by the end user is quite feasible since Java is a well-known language

At the lower level SDDL uses another graphishycal description language for lbTEX namely Asympshytote [1] Our tool produces Asymptote code which is finally converted to an encapsulated PostScript (eps) vector file

2 Canvas and shapes

A diagram in SDDL is defined by a main Canvas It is just like a standard painting canvas in the sense that we can place (or paint) different things on it as much as we like The things we can place inside a Canvas are Shapes Thus for creating a Hello world diagram we would use the following

put Text with [text = Hello worldJ in main

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

resulting in

Hello world

In this example Text is a Shape and it posshysesses a property text which is the JbTEX string used to render the text Each Shape defines a cershytain number of such properties

SDDL permits the definition of variables It is a dynamically typed language so variables dont have to be declared before being used Variables make it possible to reuse the same Shape at multiple locations For example

a = Circle with [radius = 100] put a at (-75 00) in main put a at (75 00) in main

m In this example we specify the location where we want our Shape to be If a location is not specified with the at clause the Shape will be placed at the point of origin of the current Canvas which is its center

One important thing to note is that once a Shape has been put in a Canvas it is immutable It cannot be modified or removed A Shape can be modified alter it has been drawn on a Canvas but this will have an effect only on later use of this object and will not modify the actual Canvas in any way a Shape always appears in a Canvas as it was at the moment it was added

When a Shape is created every property specishyfied by the user is set in the given order It is not necessary to specify ail properties at once nor to set ail of them Most of the properties have appropriate default values However sorne properties if not set will yield strange results For example a circle with no radius property set will have a defaul radius of O Usually property order is irrelevant For instance giving for an ellipse the radius along the x-axis or the y-axis first will yield exactly the saille result

a = Ellipse a = a with [xradius 200] a = a with [yradius 100] put a in main

o 3 Structuring multiple canvases

Every diagram consists of a main Canvas However we can define other Canvas objects if we wish An additional Canvas can be introduced using a typical variable assignment However when a put command is used SODL checks to see if the canvas variable is

4

207 TUGboat Volume 31 (2010) No 2

already defined If it isnt it automatically creates an empty Canvas for use

One of the main reasons to use other Canvases is to create an explicit structure in our diagram Since a Canvas is a Shape once a sub-Canvas has been created it can be placed inside the main Canvas or any other one for that matter This will ensure that everything that is defined inside our sub-Canvas will be placed at the proper position in the final diagram However any Canvas that has been defined but is not linked directly or indirectly with the main Canvas will not be drawn in the final diagram

As an example lets say we want to make a diagram that consists of two identical eyes Instead of defining two identical objects we will create one in a Canvas named form and put it at different positions inside our main Canvas Our eye consists of a circle and an ellipse both with the same center Ali we need to do for this is place them at the default position of the Canvas Finally we can take this subshyCanvas and place it at the two positions required a ~ Circle with [radius~100]

b ~ Ellipse with [xradius~200 yradius~100]

put a in form put b in form put form at (-200 00) in main put form at (200 00) in main

Paths

SDDL offers support for the description of paths The way in which they are described is similar in syntax with MetaPost and Asymptote though with sorne variations A Path shape is described by linking points together with specific linking symbols To draw a line between two points the line symbol - shycan be used To link sorne points using a curve use the curved line symbol - which will use Asymptotes positioning algorithms to create a nice-looking curve which passes through those points For the moment user control over the curve is limited to beginning and ending tangents but could be expanded

pl ~ a--b--c p2 ~ a-b-c

One of the other things you may want to do with a Path is to create an Arrow out of it SDDL defines symbols for forward backward and bidirectional arshyrows for both linear and curved lines Right now however support is restricted to forward arrows

pl ~ alt-b--c-gtd p2 alt-b-c-gtd p3 alt-gtb p4 aCgtb

Once a Path is defined it can be used as any other Shape However one of the main things that you want ta do is ta put your Path somewhere For this you can write something Iike this p ~ (00 00) -- (100 100) put p in main

This is the standard way to add Shapes ta a Canvas However since Paths are usually used to link different Shapes together in the main Canvas special handling is done in SDDL Namely a Path that is not explicitly assigned to a variable will be automatically placed in the main Canvas Therefore the Path will be directly placed in main without any explicit put expression Thus linking has its own special syntax which is more natural and convenient As an example this program (00 00) -- (100 100)

yields exactly the same result as the one just above Furthermore points can be added and multiplied by a scalar (as vectors) Using a dot to locate the origin of the drawing we can use the SDDL syntax ta create this example a ~ (100 100) a--20a-gt(300 00) a-(-10)a-(300 00)

ocirc Finally as we will now see Shapes also usually

define specifie points

5 Drawing and linking shapes together

Ta draw a diagram usually sorne shapes with a specific structure are first laid down Once that is done those objects are linked together with lines curves and arrows However these links must be made between specific positions usually derived from one or more specifie Shapes For example we may want to link the northwestern point of a rectangle with the point on a circle at an angle of 45 degrees These points could obviously be computed in advance However this becomes quite problematic when points are at peculiar angles or more complex relationships between points and Shapes are needed Worst of ail if the position or any other property of a Shape is changed ail computations will have to be redone

To ease object linking SDDL provides so-called reference points A reference point is a point that has no static value unlike points defined by a pair of two real numbers Instead a reference point is defined by its relationship to a specifie Shape appearing at a particular location As a matter of fact ail reference

Drawing structured diagrams with SDDL

208

points are defined along with the Shape because they are a natural part of it This ensures that we always have nice-looking lines at exactly the positions we want them to be

However a reference points exact position in a Canvas will depend on the Shapes position Worse since the same Shape can appears at multiple locashytions in the same Canvas we have to know which occurrence we are talking about

Therefore SDDL introcluces a feature called a Drawing A Drawing is an object that represents a Shape at a particular position Le a specifie occurshyrence of a Shape in a Canvas Whenever a Shape is put inside a Canvas a Drawing is returned and can be assigned to a variable This gives a way to uniquely identify every occurrence of a Shape apshypearing in a Canvas If the same Shape is placed twice two different Drawings will be returned each referring to a different occurrence of the same Shape

a = Circle with [radius = 100] dl = put a at (-100 00) in main d2 = put a at (100 00) in main

Once a drawing has been defined a way to access its points is needed SDDL defines a syntax for extracting points from drawings

coord of (coord) ( (args) ) in (drawing)

Here one specifies the kind of point to use (( coord) ) and any particular arguments required to obtain it The available points are Shape specifie so only those kinds of points which make sense for the particular Shape can be used For instance one can get a point at a particular angle on a Circle This is also an example where an additional argument is needed For instance anglePoint(450) will give the point at 45 degrees

Finally to reference the drawing from which we take the point its clrawing Path (a dot separatecl path) from the main diagram must be given

a = Circle with [radius = 100] dl = put a at (-75 00) in main d2 = put a at (75 00) in main (coord of anglePoint(OO) in maindl)

(coord of anglePoint(1800) in maind2)

m In this example a line between two identical circles is drawn The drawing Paths are simple here since both drawings are made directly in main Thus only main followed by the drawing name is needed

Simply giving a Drawing is not sufficient in order to make reference points non-ambiguous complete drawing Paths are required as we will now show Lets go back to the two eyes we drew previously

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

The eye was defined by a circle and an ellipse both put inside a sub-Canvas Now lets say we want to draw a line between the two circles Each of those circles is defined in the sub-Canvas and they are as a matter of fact the same Drawing a Adding a link between a and itself wauld add a link between the sub-Canvas circle and itself (what could this mean) Adding the sub-Canvas to the main Canvas twice as we did before would just duplicate this structure inside the main Canvas

But since a Canvas is a Shape we get a drawing when we put the sub-Canvas inside main We can therefore identify each inner circle by listing the drawings required to access them as shown in the following SDDL example Thus we can always link together Shapes that are deeply nested inside a subshyCanvas a = Circ le with [radius=100] b = Ellipse with [xradius=200 yradius=100] c = put a in form put b in form fl = put form at (-200 00) in main f2 = put form at (200 00) in main (coord of anglePoint(1800) in mainflc) -gt

(coord of anglePoint(OO) in mainf2c)

6 Programming constructs and lists

SDDL also defines typical programming constructs For instance Iists are created and elements accessed in a syntax similar to most other dynamic languages Since the content of a list is a general Java Dbject you can create a list of objects that are not of the same type Thus an assignment like l = [20 (00 00) [] a--b]

is perfectly legal even if not typically very useful A more typical use of Iists would be list = [(00 00) (100 100)] 1= list[O] 12 = list [1]

1--12

Lists are nice but to use them properly adeshyquate programming canstructs are needed such as for and while loops SODL defines those permitting us to draw arrays of Shapes or riAfine points through a simple list

The ability to use loops significantly simplifies many diagrams in computer science In this example we first define a Iist of points Afterward using a for loop we link those points into a linear Path a = [(100 100) (200 100)

(200 200) (100 200)] for i from 0 to 2 do

209 TUGboat Volume 31 (2010) No 2

a[i]--a[H1)

end

Alternatively we coulcl get the same result using the following while loop i = 0 hile i 1= 3 do

a [il --a [i+1] i = i + 1

end

7 Functions

SDDL also permits the creation of functiolli inside the code Those must be written before the diagram description A SDDL function is defined with the keyword fun The list of arguments does not need to be typed only named The return type (if it exists) does not need to be specified either To cali the function in the resulting code a typical C-like cali is used fun dropManyCs i v n c)

for j from 1 to n do put s at i + jv in c

end

circle = Circ le vith [radius = 50] dropManyCcircle COO 00)

C50 00) 100 main)

(rtttt3JJJ) In this case we define a function that drops

many instances of a Shape s at different positions on a Canvas c The positions of the Shape are detershymined by an initial point i and a translation vector v Finally the number of Shapes placed is also given as a parameter n Each Shape is then placed at the initial point translated by the translation vector a certain number of times This permits us to create many circles along one line

One important point is the parameter for the Canvas in which we place the Shapes However we pass main as our parameter The reason for this is that SDDL does not possess global variables A function can only access its parameters and variables that have been defined inside the function Thus trying to place something in main From inside a funcshytion will yield an errer message saying the variable main is unknown

8 Primitives

SDDL as mentioned before is written in Java One of the nice features of Java is its libraries Many classes have been written for any number of different tasks and the number of functions and algorithms implemented is astonishing To rewrite libraries that are already defined in Java or to link them one by

one in SDDL seemed pointless It is much nicer to directly use those functions since theyre already there

Since Java is a reftexive language in the sense that the program knows about itself and can modify itself at will functions can be dynamically accessed at runtime We already use this feature to simplify the definition of the SDDL interpreter the interpreter doesnt have to know every possible type of Shape in order to work Using these same mechanisms permits loading classes at runtime and gives the user the power to cali From inside SDDL any Java function

This is done through so-called primitives which are defined using the keyword primitive followed by the name of the function as it will appear in SDDL Following that two strings are given one for the package in which the function is defined and one for the name of the function as it was defined in Java Any primitive declaration must be made prior to any function definition

Lets look at an example One of the main things a diagram description language would require is sorne basic mathematics and geometry libraries Java possesses a nice java lang math package which we would like to use especially the sin and cos funcshytions For this we will need to define two primitives primitive static sin javalangMath sin primitive static cos javalangMath cos

Once they are defined they can be called just like any other SDDL functions In this case we will use those functions to place circles around an invisible circle for i from 1 to 6 do

put Circle vith [radius = 50] at C200 cos(i 314 30) 200 sin(i 314 30raquo

in main end

00 o 0 00

9 A concrete example

Now that we have ail our tools lets use SDDL to describe a simple diagram of an automaton This is the complete code along with the resulting image circlel Circle vith [radius = 100] circle2 Circle vith [radius = 120] ellipse Ellipse vith [xradius = 500

yradius = 200] circle = put circlel at (-300 00) in form put circlel at C300 00) in form put circle2 at (300 00) in form

Drawing structured diagrams with SDDL

210

put ellipse in form

dl = put form at (1000 1000) in main d2 = put form at (1000 500) in main d3 = put form at (1000 -500) in main put Text with [text=$N(p_1)$]

at (1000 1000) in main put Text with [text=$N(p_2)$]

at (1000 500) in main put Text with [text=dots]

at (100000) in main put Text with [text=$N(p_n)$]

at (1000 -500) in main

put Text with [text = $s_O$] at (00 200) in main

d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle) (coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle) (coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

10 Modifying the hierarchy by adding shapes

Using what has been described above most diagrams can be created However many simplifications can be made and sorne domains may find it relevant to add classes specifie to their trade SDDL eases the modification of the Java hierarchy underneath the language by using reftexivity Any user who respects sorne basic guidelines will be able to have its class work automatica11y in SDDL without any specifie linking required

To do this every class must possess a certain number of properties Those properties are defined through setters and getters For instance for the

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

radius of a circle these are called setRadius and getRadius Any property that follows this rule will be accessible

Furthermore an empty constructor must also be defined that sets as much as possible default values for a11 properties of the defined Shape There are also sorne small functions to be defined like the draw and obtainPath functions Any reference points must also be defined with a function to obtain them

As an example lets say we would like to add a class to represent a cloud A cloud will have a number of spikes and a size The class definition (without function definition) that we would require would be the following

public class Cloud extends Shape double size int numberOfSpikes public Cloud() public void setSize(double size) public double getSize() public void setNumberOfSpikes(int n) public int getNumberOfSpikes() public void draw(AbstractPoint a

PrintWriter w) public Path obtainPath()

11 Future additions and availability

SDDL is available now at httpwwwinfo2uqam cal -villemaire_rReChereacuteheSDDL It is funcshytional though not by any means complete Many additional Shapes couid be added (in particular tree and graph classes) and options could be added to existing classes Development of the application conshytinues for the time being and a more thorough version will be made available

References

[1] John C Bowman and Andy Hammerlindl Asymptote A vector graphies language TUGboat The Communications of the TEX Users Group 29288-294 2008

o Mathieu Bourgeois Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada bourgeois dot mathieu dot 2 (at)

courrier dot uqam dot ca

o Roger Villemaire Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada villemaire dot roger (at) uqam dot ca httpintrainfouqamca

personnelsMembersvillemaire_r

APPENDICE B

PREacuteSENTATION DE LA GRAMMAIRE DE SDDL

Nous preacutesentons ici le contenu entier de la grammaire de SDDL tel que reacutealiseacute avec

SableCC Tous les eacuteleacutements du langage sont lagrave agrave lexception de la reacuteflexiviteacute dont les

deacutetails de code sont situeacutes dans la partie Java de notre projet

Package sddlsyntax

Helpers

any [O Oxffff]

tab 9 li 10 cr = 13

upper [ A 2 ]

lower [ a z]

digit [ 0 9]

name char = upper 1 lower 1 digit -

string_char = [[32 126] - ]

= J bulldot

not star = [any-] not_star_not_slash = [not_star - l]

Tokens

92

put_kwd = put at_kwd = at in_kwd = in fit_kwd = fit around_kwd = around if_kwd = if

while_kwd = while true_kwd = true false_kwd = false then_kwd = then else_kwd = else for_kwd = for from_kwd = from end_kwd = end to kwd to by_kwd = by do_kwd = do with_kwd = with and_kwd = and or_kwd = or fun_kwd = fun return_kwd = return primitive_kwd = primitive call_kwd = call static_kwd = static coord_kwd = coord of _kwd = of get_kwd = get

scaled_kwd = scaled slanted_kwd = slanted rotated_kwd = rotated translated_kwd = translated

straight_line_kwd = -- curved_line_kwd = - straight_fwd_arrow_kwd = -gt curved_fwd_arrow_kwd = -gt straight_bwd_arrow_kwd = (- curved_bwd_arrow_kwd = (- straight_bidir_arrow_kwd = (-gt curved_bidir_arrow_kwd = (-gt

93

plus = + minus = -

mult = div =

eq = == neq = = lt lt gt = gt leq lt= geq gt= not assign = =

dot = dot

l br = - r br ( l _par = ) r_par =

l cr = [ )

-r_cr = J

sc = comma =

id = lower name_char class_name = upper name_char

integer = (-) digit+ real = (-) digit+ dot digit+

) ) Il J )Ilstring string_char

blank = 1 tab 1 cr 1 If 1 cr If comment not_star ( (not_star_not_slash not_star))

Ignored Tokens

blank comment

Productions

file = [primitives] primitive [functions] function [stms] stm

94

primitive =

primitive_kwd static_kwd id [class_name] string [func_name] string signature sc

signature = l_par type_list r_par

type_li st = string [additional_types] additional_type

additional_type comma string

function = fun_kwd id l_par id_list r_par l_br [stms]stm r_br

id_list =

id [additional_ids] additional_id

additional id comma id

stm = exp exp sc 1

assign id assign exp sc 1

while while_kwd exp do_kwd [stms] stm end_kwd sc Il if if_kwd exp then_kwd [stms] stm else_part end_kwd sc 1

for for_kwd id from_kwd [low_bound] exp to_kwd [up_bound] exp do_kwd [stms] stm end_kwd sc 1

return return_kwd exp sc

else_part = else_kwd [stms] stm

exp = or exp or_kwd and_exp simple and_exp

and_exp = and and_exp and_kwd line_exp 1

simple line_exp

line_exp line line_exp line_op eq_exp with_part 1

95

1

1

simple eq_exp

line_op =

straight_Iine straight_line_kwd 1

curved_line curved_Iine_kwd 1

straight_fwd_arrow straight_fwd_arrow_kwd curved_fwd_arrow curved_fwd_arrow_kwd 1

straight_bwd_arrow straight_bwd_arrow_kwd curved_bwd_arrow curved_bwd_arrow_kwd 1

straight_bidir_arrow straight_bidir_arrow_kwd curved_bidir_arrow curved_bidir_arrow_kwd

eq_exp = eq [left] cmp_exp eq [right] cmp_exp 1

neq [left] cmp_exp neq [right] cmp_exp simple cmp_exp

cmp_exp = lt [left] add_exp lt [right] add_exp 1

gt [left] add_exp gt [right] add_exp 1

leq [left] add_exp leq [right] add_exp geq [left] add_exp geq [right] add_exp simple add_exp

add_exp = add add_exp plus mul_exp 1

minus add_exp minus mul_exp simple mul_exp

mul_exp =

mult mul_exp mult left_unary_exp div mul_exp div left_unary_exp simple left_unary_exp

left_unary_exp = not not left_unary_exp get get_kwd id from_kwd left_unary_exp put put_kwd exp at_part in_kwd left_unary_exp fit fit_kwd class_Dame around_kwd left_uoary_exp coord coord_kwd of_kwd id l_par

arg_Iist r_par in_kwd left_unary_exp 1

simple right_exp

96

right_exp = calI right_exp dot id l_par arg_Iist r_par 1

index right_exp l_cr exp r_cr 1

scaled right_exp scaled_kwd l_par eq_exp r_par slanted right_exp slanted_kwd l_par

[xslant] exp comma [yslant] eq_exp r_par rotated right_exp rotated_kwd l_par eq_exp r_par 1

translated right_exp translated_kwd l_par [xtranslate] term comma [ytranslate] eq_exp r_par 1

simple term

term =

par l_par exp r_par 1

point l_par [x_value] exp comma [y_value] exp r_par 1

drawing class_name with_part 1

var id 1

int integer 1

real real 1

true true_kwd 1

false false_kwd string string 1

list l_cr arg_Iist r_cr 1

static_call id l_par arg_Iist r_par

arg_Iist = exp [additional_args] additional_arg

additional_arg comma exp

with_part = with_kwd l cr options r_cr

options = option [additional_options] additional_option

additional_option comma option

option = id assign exp

APPENDICE C

PREacuteSENTATION DE LA HIEacuteRARCHIE

Nous preacutesentons ici la description complegravete de notre hieacuterarchie objet en Java Le tout est

deacutecrit agrave laide dun diagramme UML Toutefois afin de faciliter le formatage nous avons

seacutepareacute le tout en deux sections Le premier diagramme contient les noms des classes ainsi

que leurs relations dheacuteritage Par apregraves tous les diagrammes suivants repreacutesentent le

contenu speacutecifique de chaque classe sans les relations entre classes Ceci nous permet

dobtenir une vue densemble des classes tout en obtenant des deacutetails cruciaux sur

limpleacutementation de chaque classe

98

l -llill Pa aj f1 1 Sh middotisVIsible boolampan

+draw(locaton AbstractPoint oot PniltWriBl) void

+lsVlsigtle() boolean +copyO Shape +obtalnPathO Path

Drawlna

-numberOIDrawinm int =0 middotdrawingNumber (nt -dependendes DrawingD middotpointsDellned AbsttactPolntD middothasBeenDrawn booLean middotshape Shape dmWingName string middotdrowingPositlon AbstractPoint -position AbstnldPolnt

+Orawlog(s Shape) +Shape(s S~ location AbsbaclPoint) +setPositlcn(positlon AbslradPoinl) void +seIDraloVingName(nsme slJfng) void +gelName() string +geISUbDrawlng(name string) ~ Drawlng +re~~Jri~)slring

+addDeflO8dPoint(point AbstractPolnl) Int +hasBeenDraWn() booIean +lsDrawn() booIean +canBeDlBWn() booIean +getShape() Shape fdraw(Jocafion AbslraclPolnt out PrlnlWriler) void +obtainPathO Path -tdp(other Orawilg) AbslractPoilt

uare length double

+Squate() ~s ( ~ le)

ell-eoatMength double) void +getlongthO bulldouble +dmw(locabmiddotoo AbstrampctPoint out PrnMYler) void +obtainPath() Path ffOPY() Shape

99

Rectangle

-lengIh double -wldth double -100 KI boeacuteIean

+Rectangle() +Rectangle(length double wldth double) +selleogth~ength double) void +setWldth(Width double) void +seIRound(rlaquo)Ulld booIegravean) void +getlengtb( doubIe +getMdth() double +getRound() booIeao +getNorth(d Dmwlog) RefPoint lttget5outh(d Drawlng) RefPolnl +getwest(d DlaWlng) RefPoint +gelEaat(d Drawlng) RefPoinl +gelNorthwest(d Drawllg) RefPoInt +gelNortheast(d Drawlng) R1tfPolnt lttgetSou1hwe$(d Drawlng) RefPoInt +get5outheast(d Drawilg) RefPoklt +dl8wlocalion Absl18ctPoiIt Ougravet ~Mhl81 void ii)blainPathO ~ Path

CIrcIe

middotradlus double

+Clœ() +Clrcle(radlus double)

+COPYO Shape +setRadlus(radius ~ double) void +getRadius() double +getAnglePolnt(d Omwilg angle double) RefPoInt +dmwlocation AbstradPoirlt our AiltKtler) VOiCI iOblailPath() Path

ElIID8e

middotxradlus double middotyradlus double

+Ellpse() +copyO bullShape +setXRadlus(r double) void +setYRadIus(r doublrt) void -gelXRadlus() double +geIYRadius() double +draw(txalJon AbstractPomt out PrinMbl8l) IIOIumld iOblainPathO Path

100

Lino point1 AbslractPoln1 middotpoint2 AbstractPoint

+L1oe() +Llne(point1 AbstractPoint poill2 AbstractPolnt) +COPYO Shape +dmw(locaIJon AbsIroctPoinl out PrnIWril9f) void +selPolnt1 (poInl1 AbsttactPoint) void +seIPoill2(poinl2 AbslractPoinl) void +getPolnl1 () AbslraclPoinl tiJotPolnl2() AbstraclPolntn_~

EqTrtanale middotsim double

-EqTriangleQ +EqTrlangle(size double) +cOPYO Shape +setSlze(slze double) void +gets1ze() double +d18W(Jocolion AbstTadPoinl out Ptil1Wfit8f) void +oblalllPalhll Path

middotpath Path bulltext string middotposIlIon double -dir Poilt middotabsohJle boolean middothasTexl boolean

+Arrav(path Palh) +copyO Shape TCl(( ex s n~ U blo dn 010 aosolute boolean) void seISlartingTangcnl(dlr Poinl) void

seIEndflgTangenl(dir Potnt) void tgelPalhO Palh +obtalnPath Path

101

cany -canvasLlst Carwas(J -canvasPontLIsl AbstractPoinllJ daWVigUsl DrawingD dlawilgPolnlUst AbsJaCtPolntO middotIsMaIn booean canvasPosltion bullAbstmetPoint

+CsnYaS() copYO Shape +seteanvasPositIoR(posllon AbslraclPotnt) VOId +setMaln() void +f8Mai1() booIean +addShape(S Shapeloca1ion AbstradPoItit) Drawilg l+a~pe(S Shape IocagravetJon AllstraclPolnl name slring) DraNklg +getOtawiDg(I Inl) D1awlng ~elDtawfng(namamp string) bull Drawilg tgelOl8WIngiocal1on(namo stlllllJ) AbsllaclPoilt ~olDmwlngOrNull(name string) Drawilg tgelOrawinglocation(l int) AbslractPolnt o+getNumberOfDrawlngs() int +dl8w(location AbstrodPonr oui PrintwrllerJ void +dmwMain(oul PrinlWrllGr) void +drawCanvaa(locatlon AbSlractPoinl remalnlllQDraws Drawlna Il out Prlntwriter) void

Path -Bst AbstractPolnllJ middothasASIartilgTangent boolean -hasAEndhlgTangent booIean -startiogTangent Point middotendingTangent Point middot1sU1ear boolean

+PathO Psth(Ust AbstraclPoint 0) +Path(Dst Ab~tPolnt Q startingTangent Polnt endlngTangenl Point) +cOPYO Sh8p6 +addPoinl(poiumlnl Abstl8ClPoint) void +seIUnear() void +IsUnearO booloao +getPolnt(l Inl) AbsIraclPcInl +getPolnts() AbsIlaCPoht 0 o+getNumberOlPolnts() Rt +cyc1B() void -thasASI8rthgTangent() boolean +hasAEndingTangentO booIoan +getStattilgTangenlO PoiIl +getEndlngTangent() Polnl 4uumllSlartingTangenl(stllllngTangent Peint) w1d +seIEndIllQTangent(encliigTangenl ~nt) void +psthValue() strilg +dmwJocalion AbslradPoItlI oot FilMtJrer) void

102

Text

-told slfng

ImiddotTexl() +Texl(lext string) +sotText(tegravext string) void iil8tTeld() string +draw(Jocalion AbstroctPoJnl oof PrinWriter) void ~btalnPath() Path +CODV(J ShsD9

AbsctPolnl +altfd(second AbstraclPoinl) AbslractPolnt -tmulliply(multipier double) AbstraclPolnt +eombine(perœntage double second AbstraclPolnl) AbstractPoint +solvfJ() slrillg +COfNIJ AbslradPoinl

Point -x double y doub19

+POIcirclIO +POIOI(x double y double) +solvo() slting -+IoSlflngO string~ n bull

RefPolnt -mf8teflœDrawlng Drawlng -poIntNumbef Int

+RefPoint(referenceDrawing DraYIing poiolNu ber Illl) +SoNe() stmg +COPYO AbstroctPDAcirclf

lnauudJonPoint p Path

-q Palh

+lnlCfSecllonPoint(p Palh q Path) +COPYO AbstrampcfPoitlt +soIve() string

103

Un Point -point AbsbaclPoint -pIampStmg string -endStrlng string -value double

+UnaryMapPolnl(poInt AbstradPoInt) +ScW9() string +setMapTypeMultlpIy(vallJe double) void +c Abslr8ctPoinI

Bln oint frstPoint Absll8clPoinl secoodPoInt AbstrootPoint -pceSIring string -middIeSlrIng Itlfno -endString string

+8ilatyMapPolnt(fkstPoiIt Abstmc1Po1nt secondPolnt AbslraetPointl +cOPYO bull AbstraetPOOI +soAte() string +selMapTypeAddO void

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

APPENDICE D

PREacuteSENTATION DES DIAGRAMMES CHOISIS

Cet annexe comprend lensemble des quinze (15) diagrammes que nous avons choisis

comme base de qualiteacute pour notre projet Tel que mentionneacute preacuteceacutedemment nous avons

inclus agrave la fois le code de chaque diagramme en SDDL ainsi que le diagramme reacutesultant

Aucune analyse nest effectueacute pour ces dessins agrave lexception de ceux deacutejagrave analyseacutes au

chapitre 6

Start box triangle = EqTriangle with [size = 400J put triangle at (00 -100) in main put Text with [text = StartJ at (00 -50) in main

El box rectanglePos = (00 -500) rectangle = Rectangle with [length = 1600 width = 300J put rectangle at rectanglePos in main put Text with [text El J at rectanglePos - (600 00) in main put Text with [text $a leftarrow O$J

at rectanglePos + (-300 50) in main put Text with [text $b leftarrow l$J

at rectanglePos + (-300 -50) in main put Text with [text $a leftarrow l$J

at rectanglePos + (100 50) in main put Text with [text $b leftarrow O$J

at rectanglePos + (100 -50) in main put Text with [text $c leftarrow m$J

at rectanglePos + (500 50) in main put Text with [text $d leftarrow n$J

106

at rectanglePos + (500 -50) in main

1 E2 box 1 rectangle2Pos = (00 -1000) put rectangle at rectangle2Pos in main put Text with [text = E2 ] at rectangle2Pos (600 00) in main put Text with [text = $q leftarrow quotient(c div d)$]

at rectangle2Pos + (100 50) in main put Text with [text = $r leftarrow remainderCc div d)$]

at rectangle2Pos + (100 -50) in main

1 Round E3 box 1 rectangle3Pos = (00 -1500) roundRectangle = Rectangle with [length = 800 width 250

round = true] put roundRectangle at rectangle3Pos in main put Text with [text = E3 $r = O$] at rectangle3Pos in main

1 Stop box 1 stopPos = (1500 -1700) put triangle at stopPos in main put Text with [text = Stop] at stopPos + (00 50) in main

1 E4 box 1 rectangle4Pos = (00 -2000) put Rectangle with [length = 1600 width = 400]

at rectangle4Pos in main put Text with [text = E4] at rectangle4Pos + (-700 00) in main put Text with [text = $c leftarrow d d leftarrow r$]

at rectangle4Pos + (100 120) in main put Text with

[text = $t leftarrow a a leftarrow a a leftarrow t - qa$] at rectangle4Pos + (100 00) in main

put Text with [text = $t leftarrow b b leftarrow b b leftarrow t - qb$ ] at rectangle4Pos + (100 -120) in main

(00 -100) -) rectanglePos + (00 150) rectanglePos + (00 -150) -) rectangle2Pos + (00150) rectangle2Pos + (00 -150) -) rectangle3Pos + (00125) rectangle3Pos + (00 -125) -) rectangle4Pos + (00200) rectangle4Pos + (00 -200) -- rectangle4Pos + (00 -500)

rectangle4Pos + (-1000 -500) -- rectangle2Pos + (-1000 00) -) rectangle2Pos + (-800 00)

107

rectangle3Pos + (400 00) -gt rectangle3Pos + (1410 00) put Text with [text Yes] at rectangle3Pos + (480 -50) in main put Text with [text = No] at rectangle3Pos + (-80 -175) in main

Placing text notes put Text with [text Al $m gt 0 n gt 0$] at (3000 00) in main put Text with [text A2 $c=mgtO d=ngtO$] at (3000 -340) in main put Text with [text $a=b=O a=b=l$] at (3000 -460) in main put Text with [text A3 $am + bn = d am + b$]

at (3000 -740) in main put Text with [text = $0 leq r lt d gcd(dc) g$]

at (3000 -860) in main put Text with [text = A4 $am + bn d = gcd(m n)$]

at (3000 -1200) in main put Text with [text = A5 $am + bn d am + b$]

at (3000 -1540) in main put Text with [text = $0 lt r lt d gcd(cd) = g$]

at (3000 -1660) in main put Text with [text = A6 $am + bn = d am + b$]

at (3000 -1940) in main put Text with [text = $gcd(c d) = gcd(m n)$]

at (3000 -2060) in main

(2500 00)-(2000 -50)-(1500 -150)-gt(00 -200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -400)-(2000 -450)-(1500 -650)-gt(00 -700) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -800)-(2000 -850)-(1500 -1150)-gt(00 -1200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2200 -1200)-(2000 -1200)-(1500 -1250) -gtrectangle3Pos + (900 00) with [startingTangent = (-10 00) endingTangent (-10 -10)]

(2250 -1600)-(2000 -1700)-(1500 -1900) -(1000 -1750)-gt(00 -1700) with [startingTangent = (-10 00) endingTangent (-10 00)]

(2250 -2000)-(1500 -2200)-gt(00 -2400) with [startingTangent = (-10 00) endingTangent (-10 00)]

108

~-- Al m gt On gt O

A2 c = m gt 0 d = n gt 0 a = b = 0 a = b = 1

A3 am + bn = dam + bdeg~ T lt dgcd(dc) = 9 E2

_--- A4 am + bn = d = gcd(m n)

A5 am + bn = dam + b Sto 0lt T lt dgcd(cd) = 9

Cf- d d f- T A6 am + bn = d am + bE4 t f- a a f- a a f- t - qa gcd(cd) =gcd(mn)t f- b b f- b b f- t - qb

primitive static sin javalangMath sin primitive static cos javalangMath cos primitive static sqrt javalangMath sqrt

fun ellipseCangle length width) return Clength cosCangle 20 31415 3600)

width sinCangle 20 31415 3600))

fun ellipseDeriveCangle length width) length2 = length length width2 = width width sinus = sinCangle 31415 1800) sinus2 = sinus sinus cosinus = cosCangle 31415 1800) cosinus2 = cosinus cosinus x = -10 Clength sinus)

sqrtCwidth2 cosinus2 + length2 sinus2) y = Cwidth cosinus) sqrtCwidth2 cosinus2 + length2 sinus2) return Cxy)

avail = Text with [text=AVAIL] link = Text with [text=LINKCP)] t = Text with [text=T]

109

put avail at ellipse(900 1000 500) in main put t at ellipse(1800 1000 500) in main put link at ellipse(OO 1000 500) in main

(ellipse(70 1000 500))-(ellipse(450 1000 500)) -gt(ellipse(750 1000 500))

(ellipse(1050 1000 500))-(ellipse(1350 1000 500)) -gt(ellipse(1730 1000 500))

(ellipse(1930 1000 500))-(ellipse(2700 1000 500)) -gt(ellipse(3550 1000 500))

AVAIL

~ T LINK(P)

primitive static sin javalangMatb sin primitive static cos javalangMatb cos

fun circular(angle radius) return (radius cos(31415 angle 1 1800)

radius sin(31415 angle 1 1800))

circleradius = 400 circle = Circle with [radius=100] g Text with [text=G] r = Text with [text=R] y Text with [text=Y]

put circle at (circular(300 circleradius)) in main put r at (circular(300 circleradius)) in main put circle at (circular(900 circleradius)) in main put r at (circular(900 circleradius)) in main put circle at (circular(1500 circleradius)) in main put g at (circular(1500 circleradius)) in main put circle at (circular(2100 circleradius)) in main put g at (circular(2100 circleradius)) in main put circle at (circular(2700 circleradius)) in main

110

put g at (circular(2700 circleradius)) in main put circle at (circular(3300 circleradius)) in main put y at (circular(3300 circleradius)) in main

(circular(450 circleradius))-(circular(600 circleradius)) -gt(circular(750 circleradius))

(circular(1050 circleradius))-(circular(1200 circleradius)) -gt(circular(1350 circleradius))

(circular(1650 circleradius))-(circular(1800 circleradius)) -gt(circular(1950 circleradius))

(circular(2250 circleradius))-(circular(2400 circleradius)) -gt(circular(2550 circleradius))

(circular(2850 circleradius))-(circular(3000 circleradius)) -gt(circular(3150 circleradius))

(circular(3450 circleradius))-(circular(OO circleradius)) -gt(circular(150 circleradius))

put Text with [text=tinyNEXTR] at (circular(900 circleradius)) + (00 150) in main

put Text with [text=tinyNEXTG] at (circular(-900 circleradius)) + (00 -150) in main

put Text with [text=tinyCURRENT] at (circular(-300 circleradius))+ (1~0 -150) in main

NEXTR

NEXTG

fun left(d)

return 016 coord of west in drectangle + 084 coord of east in drectangle

fun right(d)

return 016 coord of east in drectangle +

111

084 coord of west in drectangle

rectanglel = Rectangle with [length=600 width=200) rectangle2 = Rectangle with [length=200 width=200) circle = Circ le with [radius=10) put rectanglel in form rectangle = put rectangle2 in form put circle at (-200 00) in form put circle at (200 00) in form

dl = put form at (00 00) in main d2 = put form at (-600 -500) in main put Text with [text=IA) at (-600 -500) in main d3 = put form at (-1200 -1000) in main put Text with [text=IB) at (-1200 -1000) in main d4 = put form at (-1800 -1500) in main put Text with [text=ID) at (-1800 -1500) in main d5 = put form at (-600 -1500) in main put Text with [text=IE) at (-600 -1500) in main d6 = put form at (00 -1000) in main put Text with [text=IC) at (00 -1000) in main d7 = put form at (600 -1500) in main put Text with [text=f) at (600 -1500) in main d8 = put form at (-400 -2000) in main put Text with [text=IG) at (-400 -2000) in main dg = put form at (300 -2000) in main put Text with [text=IH) at (300 -2000) in main dl0 = put form at (1000 -2000) in main put Text with [text=JI) at (1000 -2000) in main

(left(dl))-gt(coord of north in d2rectangle) (right(dl))-gt(coord of east in dlrectangle + (00 50)) (left(d2))-gt(coord of north in d3rectangle) (right(d2))-gt(coord of north in d5rectangle) (left(d3))-gt(coord of north in d4rectangle) (right(d3))-gt(coord of south in d2rectangle) (left(d4))-gt(coord of west in dlrectangle + (00 50)) (right(d4))-gt(coord of south in d3rectangle) (left(d5))-gt(coord of north in d6rectangle) (right(d5))-gt(coord of north in d7rectangle) (left(d6))-gt(coord of south in d2rectangle) (right(d6))-gt(coord of north in d8rectangle)

112

(left(d7raquo-gt(coord of north in d9rectangle) (right(d7raquo-gt(coord of north in dl0rectangle) (left(dSraquo-gt(coord of south in d6rectangle) (right(d8raquo-gt(coord of south in d5rectangle) (left(d9raquo-gt(coord of south in d5rectangle) (right(d9raquo-gt(coord of south in d7rectangle) (left(dl0raquo-gt(coord of south in d7rectangle) (right(dl0raquo-gt(coord of south in dlrectangle + (100 00raquo

put Text wi th [text=List head] at coord of north in dlrectangle + (00 50) in main

circle = Circle with [radius = 100] bigcircle = Circle with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvasl put circle at 050 150) in canvasl put Text with [text = H] at 050 150) in canvasl put circle at (-150 150) in canvasl put Text with [text J] at (-150 150) in canvasl put Text with [text = B] at (00 -150) in canvasl

put bigcircle in canvas2

113

put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = Fil] at (150 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = liE] at (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvasl at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = Ali] at (00 -300) in main put bigellipse in main

A

fun drawBinaryTree(d s 0 dh dv n)

put s at a in d put 0-(0 + (-10 dh -10 dvraquo in d put 0-(0 + (db -10 dvraquo in d if (n == 1)

then return 0 else drawBinaryTree(d sa + (-10 dh -10 dv) db 20 dv n - 1) drawBinaryTree(d s a + (db -10 dv) db 20 dv n - 1) end

(0000)--(0000)

114

orlgln = (00 00) dv = 200 dh = 1000 bullet = Circle with [radius = 20) drawBinaryTree(main bullet origin dh dv 7)

bullet = Circle with [radius = 20] put bullet in main put bullet at (-300 -300) in main put bullet at (-600 -600) in main put bullet at (00 -600) in main put bullet at (300 -300) in main

(00 00)--(-300 -300) (00 00)--(300 -300) (-300 -300)--(-600-600) (-300 -300)--(00 -600)

(-100 00)-(-500 -300)-(-650 -650)-(-300 -400)shy(50-650)-(00-500)-(-150-300)-(-100 -200)shy(00-100)-(250-320)-(350-350)shy(320 -270)-gt(100 00)

circlel Circle with [radius 100]

lL5

circle2 = Circle with [radius = 120] ellipse = Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (100 0 500) in main d3 put form at (1000 -500) in main put Text with [text I$N(p_1)$] at (1000 1000) in main put Text with [text I$N(p_2)$] at (1000 500) in main put Text with [text dots] at (100 0 o 0) in main put Text with [text $N(p_n)$] at (1000 -500) in main

put Text with [text $S_O$] at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

sa

fun dropMany(f n s v c) for i from 10 to n do

put f at (s + (i - 10) v) in c

116

end

square = Square with [length=200] changeVec = (00 -200) dropMany(square 40 (00 00) changeVec main) dropMany(square 30 (500 00) changeVec main) dropMany(square 10 (1000 00) changeVec main) dropMany(square 10 (1500 00) changeVec main) put Text with [text=IO] at (00 00) in main put Text with [text=ll] at (00 -200) in main put Text with [text=13] at (00 -400) in main put Text with [text=17] at (00 -600) in main put Text with [text=bf ail] at (500 200) in main put Text with [text=12] at (500 00) in main put Text with [text=14] at (500 -200) in main put Text with [text=17] at (500 -400) in main put Text with [text=17] at (1000 00) in main put Text with [text=bf $a~b~+$] at (1500 200) in main put Text with [text=18] at (1500 00) in main put Text with [text=none ] at (2000 00) in main

(120 100)-gt(380 100) (620 100)-gt(880 100) (112 0 10 0) - gt(138 0 10 0) (1620 100)-gt(1880 100)

a ab+

~ -m-0-0-none 7

put Text with [text=IS] in main put Text with [text=A] at (00 -200) in main put Text with [text=B] at (00 -400) in main put Text with [text=$alpha$] at (-600 -600) in main put Text with [text=$beta$] at (-300 -600) in main put Text with [text=$gamma$] at (00 -600) in main put Text with [text=$y$] at (300 -600) in main put Text with [text=$z$] at (600 -600) in main

117

(-50 -50)--(-700 -540)--(-500 -540) (50 -50)--(700 -540)--(500 -540) (-50 -250)--(-400 -540)--(-200 -540) (50 -250)--(400 -540)--(200 -540) (-50 -450)--(-100 -540)--(100 -540)--(50 -450)

put Text with [text=D] in main

put Text with [text=T] at (-500 -500) in main put Text with [text=bf real] at (-500 -900) in main put Text with [text=4] at (-350 -500) in main put Text with [text= type] at (-150 -500) in main

put Text with [text=L] at (500 -500) in main put Text with [text=inh] at 050 -500) in main put Text with [text=5] at (350 -500) in main put Text with [text=6] at (650 -500) in main put Text with [text=entry] at (850 -500) in main

put Text with [text=bf $id_3$] at (900 -900) in main put Text with [text=bf ] at (500 -900) in main put Text with [text=3] at 0050 -900) in main put Text with [text=entry] at 0350 -900) in main

put Text with [text=L ] at (00 -1000) in main put Text with [text=inh] at (-350 -1000) in main put Text with [text=7] at (-150 -1000) in main put Text with [text=8] at 050 -1000) in main put Text with [text=entry] at (350 -1000) in main

put Text with [text=bf ] at (00 -1400) in main put Text with [text=bf $id_2$] at (400 -1400) in main put Text with [text=2] at (550 -1400) in main put Text with [text=entry] at (750 -1400) in main

put Text with [text=L] at (-500 -1500) in main

118

put Text with [text=inh] at (-850 -1500) in main put Text with [text=19] at (-650 -1500) in main put Text with [text=110] at (-350 -1500) in main put Text with [text= ent ry] at (-150 -1500) in main

put Text with [text=bf $id_l$] at (-500 -1900) in main put Text with [text=ll] at (-350 -1900) in main put Text with [text= ent ry ] at (-150 -1900) in main

(-100 -100)--(-400 -400) (-500 -600)--(-500 -800) (100 -100)--(400-400) (500 -600)--(500 -800) (600 -600)--(800 -800) (400 -600)--(100 -900) (100 -1100)--(400 -1300) (00 -1100)--(00 -1300) (-100 -1100)--(-400 -1400) (-500 -1600)--(-500 -1800)

(-300 -400)-(00 -300)-gt(300 -400) (400 -600)-(500 -650)-gt(600 -600) (950 -800)-gt(700 -600) (300 -600)-gt(-50 -900) (-100 -1100)-(00-1150)-gt(100 -1100) (450 -1300)-gt(200 -1100) (-200 -1100)-gt(-550 -1400) (-550 -1500)-(-500 -1550)-gt(-450 -1500) (-350 -1800)-gt(-350 -1600)

119

D

~ T 4 type inh 5 L 6 entry

entryrL ~~3 inh 7 L 8 entry

~2entrY inh 9 JJ lOentry

1 t id l 1 entry

circle = Circle with (radius=100J bigcircle = Circle with (radius=SOOJ

cl put circle at (00 200) c2 put circle at (200 00) c3 put circle at (-200 00) c4 put circle at (00 -200) bcl = put bigcircle in graphl

cS = put circle at (00 200) c6 = put circle at (00 -200) bc2 = put bigcircle in graph2

c7 put circle at (00 lS0)

in graphl in graphl in graphl in graphl

in graph2 in graph2

in graph3 c8 put circle at (200 -200) in graph3 c9 put circle at (-200 -200) in graph3 bc3 = put bigcircle in graph3

gl put graphl in main g2 put graph2 at (-1000 -1500) in main g3 put graph3 at (1000 -1000) in main

1 lines in first drawing (coord of anglePoint(900) in mainglc4)-gt

(coord of anglePoint(2700) in mainglcl) (coord of anglePoint(1800) in mainglcl)-gt

(coord of anglePoint(900) in mainglc3) (coord of anglePoint(OO) in mainglcl)-gt

120

(eoord of anglePoint(900) in maingle2) (eoord of anglePoint(2700) in maingle3)-gt

(eoord of anglePoint(1800) in maingle4) (eoord of anglePoint(2700) in maingle2)-gt

(eoord of anglePoint(OO) in maingle4)

(eoord of anglePoint(2700) in maingle3)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(1800) in maingle4)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(OO) in maingle2)shy(eoord of anglePoint(3450) in mainglbel)

lines in seeond drawing (eoord of anglePoint(2700) in maing2e5)-gt

(eoord of anglePoint(900) in maing2e6) erdl = eoord of anglePoint(1800) in maing2e6 erd2 = eoord of anglePoint(1800) in maing2e5 erdl-((erdl + erd2)20 + (-200 00))-gterd2

(eoord of anglePoint(900) in maing2e5)shy(eoord of anglePoint(900) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(450) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(OO) in maing2be2)

(eoord of anglePoint(OO) in maing2e6)shy(eoord of anglePoint(OO) in maing2be2)

lines in third drawing (eoord of anglePoint(1800) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e9) (eoord of anglePoint(OO) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e8) (eoord of anglePoint(OO) in maing3e9)-gt

(eoord of anglePoint(1800) in maing3e8) crd3 = eoord of anglePoint(OO) in maing3e8 erd4 = eoord of anglePoint(900) in maing3e7 erd3-(erd3 + erd4) 20 + (200 200)-gterd4

erd4--(eoord of anglePoint(1050) in maing3be3) (eoord of anglePoint(1800) in maing3e7)-shy

(eoord of anglePoint(1850) in maing3be3) (coord of anglePoint(1800) in maing3e9)-shy

121

(coord of anglePoint(1750) in maing3bc3)

lines between drawings (coord of anglePoint(2250) in mainglbcl)-gt

(coord of anglePoint(900) in maing2bc2) (coord of anglePoint(3450) in mainglbcl)-gt

(coord of anglePoint(1050) in maing3bc3) (coord of anglePoint(OO) in maing2bc2)-gt

(coord of anglePoint(1850) in maing3bc3) crd5 = coor~ of anglePoint(1750) in maing3bc3 crd6 = coord of anglePoint(450) in maing2bc2 crd5-(crd5 + crd6) 20 + (000 300)-gtcrd6

Texts crdTextl coord of anglePoint(1350) in mainglbcl + (-200 00) crdText2 = coord of anglePoint(1350) in maing2bc2 + (-100 100) crdText3 = coord of anglePoint(450) in maing3bc3 + (100 100) put Text with [text=$R_l$] at crdTextl in main put Text with [text=$R_2$] at crdText2 in main put Text with [text=$R_3$] at crdText3 in main

primitive getClip sddlhierarchyDrawing clip primitive setVisible sddlhierarchyShape setVisible

122

1 clip takes 3 drawings and a canvas first is a line second and third are two shapes which intersect line will draw a line between the intersection points the line creates with the two shapes 1

fun clip(dl d2 d3 canvas)

dlsetVisible(false) drawl = put dl in canvas cl = drawlgetClip(d2) c2 = drawlgetClip(d3) put cl--c2 in canvas

circle Circle with [radius=100] dl = put circle in main put Text with [text=14] in main d2 = put circle at (-400 -400) in main put Text with [text=13] at (-400 -400) in main d3 = put circle at (-700 -800) in main put Text with [text=12] at (-700 -800) in main d4 = put circle at (400 -400) in main put Text with [text=18] at (400 -400) in main d5 = put circle at (150 -800) in main put Text with [text=17] at 050 -800) in main d6 = put circle at (650 -800) in main put Text with [text=110] at (650 -800) in main d7 = put circle at (220 00) in main put Text with [text=14] at (220 00) in main d8 = put circle at (620 -400) in main put Text with [text=18] at (620 -400) in main dg = put circle at (370 -800) in main put Text with [text=7] at (370 -800) in main dl0 = put circle at (00 -1200) in main put Text with [text=5J at (00 -1200) in main

Il = (00 00)--(-400 -400) clip(ll dl d2 main) 12 = (-400 -400)--(-700 -800) clip(12 d2 d3 main) 13 = (00 00)--(400 -400) clip(13 dl d4 main) 14 = (400 -400)--(150 -800)

123

clip(14 d4 d5 main) 15 = (400 -400)--(650 -SOO) clip(15 d4 d6 main) 16 = (220 00)--(-400 -400) clip(16 d7 d2 main) 17 = (220 00)--(620 -400) clip(17 d7 dS main) lS = (620 -400)--(650 -SOO) clip(lS dS d6 main) 19 = (620 -400)--(370 -SOO) clip(19 dS d9 main) 110 = (370 -800)--(00 -1200) clip(110 dg d10 main)

2

5

fun niceArrow(c dMain dLeft dRight) firstPoint = coord of southwest in dMainrectangle + (30 30) secondPoint = coord of southeast in dMainrectangle + (-30 30)

firstEnd = coord of north in dLeftrectangle secondEnd = coord of north in dRightrectangle

put firstPoint-gtfirstEnd in c put secondPoint-gtsecondEnd in c

point1 firstPoint 50 60 + secondPoint 10 60 point2 firstPoint 40 60 + secondPoint 20 60 point3 firstPoint 30 60 + secondPoint 30 60 point4 firstPoint 20 60 + secondPoint 40 60 point5 firstPoint 10 60 + secondPoint 50 60

put (coord of southwest in dMainrectangle + (-25 25))shy(coord of south in dMainrectangle + (00 -50))shy

124

(coord of southeast in dMainrectangle + (25 25)) in c

put pointl--(pointl + (-1 0 30 -10 70)) in c put point2--(point2 + (-1 0 10 -10 85)) in c put point3--(point3 + (00 -10 90)) in c put point4--(point4 + (1 0 -10 85)) in c put point5--(point5 + (30 -1 0 70)) in c

put Text with [text=smallt] at point3 + (00 -130) in c

rect = Rectangle with [length=300 width=200] r = put rect in main put Text with [text=ll] in main rectangle = put rect in form put Text with [text=$t-l$] in form

dl = put form at (-1400 -500) in main dll = put form at (-2000 -1000) in main dlr = put form at (-800 -1000) in main dlll put form at (-2300 -1500) in main dllr put form at (-1700 -1500) in main dlrl put form at (-1100 -1500) in main dlrr put form at (-500 -1500) in main

dr = put form at (1400 -500) in main drr = put form at (2000 -1000) in main drl = put forro at (800 -1000) in main drrr put form at (2300 -1500) in main drrl put form at (1700 -1500) in main drlr put form at (1100 -1500) in main drll put form at (500 -1500) in main

put Text with [text=l root[T]] at (-300 300) in main (-300 240)-gt(coord of north in mainr)

dots = Text with [text=dots] put dots at (-1400 -1000) in main put dots at (-2000 -1500) in main put dots at (-SOO -1500) in main put dots at (1400 -1000) in main put dots at (2000 -1500) in main put dots at (800 -1500) in main

125

(coord of southwest in mainr + (30 30))-gt (coord of north in maindlrectangle)

(coord of southeast in mainr + (-30 30))-gt (coord of north in maindrrectangle)

niceArrow(main dl dll dlr) niceArrow(main dll dlll dllr) niceArrow(main dlr dlrl dlrr) niceArrow(main dr drl drr) niceArrow(main drl drll drlr) niceArrow(main drr drrl drrr)

root[T]

rect = put Rectangle with [length=600 width=200l in form put Rectangle with [length=200 width=200] at (200 00) in form bullet = put Circle with [radius=10] at (200 00) in form

put Text with [text=IF] in main

fl put form at (700 00) in main f2 put form at (1500 00) in main f3 put form at (2300 00) in main f4 put form at (3100 00) in main

(coord of anglePoint(OO) in mainflbullet)-gt (coord of west in mainf2rect)

(coord of anglePoint(OO) in mainf2bullet)-gt (coord of west in mainf3rect)

(coord of anglePoint(OO) in mainf3bullet)-gt (coord of west in mainf4rect)

126

ptW = coord of west in mainflrect ptE = coord of east in mainf4rect

ptW + (-300 OO)-gtptW ptE + (300 OO)-gtptE

put Text with [text=R] at (3800 00) in main

ptS = coord of anglePoint(2700) in mainf4bullet ptS2 = ptS + (00 -350)

ptS--ptS2 ptS2 + (-50 00)--ptS2 + (50 00) ptS2 + (-35 -20)--ptS2 + (35 -20) ptS2 + (-20 -40)--ptS2 + (20 -40)

BIBLIOGRAPHIE

Adobe Systems Incorporated 1994 PostScript Language Reference Manual http j jwwwadobecomjproductsjpostscriptjpdfsjPLRMpdf

-- 2006 PDF Reference Version 17 Adobe Systems Incorporated 6th eacutedition

-- 201Oa Adobe Postscript 3 http j jwwwadobecomjproductsjpostscriptj

2010b PDF Developer Corner PDF Reference http j jwwwadobecomjdevnetjpdfjpdLreferencehtm1

Aho A V R Sethi et J D Ullman 1986 Compilers Principles Techniques and Tools Addison-Wesley

American Mathematical Society 2008 Why Do We Recommend LaTeX http j jwwwamsorgjpublicationsjauthorsjtexjlatexbenefits

Apple Computer Inc 1996 The TrueType Reference Manu al Apple Computer Inc Cupertino California

Bourgeois M 2010 Introduction to Drawing Diagrams with SDDL httpj jrivershyvalley tvjintroduction-to-drawing-structured-diagrams-in-sddlj

Bourgeois M et R Villemaire 201Oa laquoDrawing Structured Diagrams with SDDL raquo

TUGBoat vol 31 no 2 p 206-210

-- 201Ob SDDL http j jwwwinfo2uqamca-villemaireJjRecherchejSDDLj

Bowman J C 2007 laquoThe 3D Asymptote Generalization of Metapost Beacutezier Interposhylation raquo Proceedings in Applied Mathematics and Mechanics

Chomsky N 1956 laquoThree Models for the Description of Language raquo Information Theory IRE Transactions on vol 2 no 3 p 113-124

Cormen T A C E Leiserson R L Rivest et C Stein 2001 Introduction to Algoshyrithms The MIT Press

Davis M R Sigal et E Weyuker 1994 Computability Complexity and Languages Pundamentals of Theoretical Computer Science Morgan Kaufmann

Dhu D-Z et K-I Ko 2000 Theory of Computational Complexity Wiley

Gagnon Eacute 1998 laquoSableCC an Object-Oriented Compiler Framework raquo Meacutemoire de maicirctrise McGill University

128

-- 2009 ObjeetMacro - SableCC httpsableccorgwikiObjectMacro

Group O M 1999 Unified Modeling Language (version 13) Rapport Object Manashygement Group

Hammerlindl A J Bowman et T Prince 2010a Asymptote httpasympshytotesourceforgenet

-- 20lOb Asymptote The Veetor Graphies Language httpasympshytotesourceforgenet asymptote pdf

Hobby J 1992 laquo A Users Manual for MetaPost raquo Computing Science Technical Report vol 162

International Organization for Standardization 2008 Document Management - Elecshytronic Document File Format for Long-Term Preservation - Part 1 Use of PDF 14 (PDF A-1) ISO 19005-1 2005

Jr F S H et S M Kelley 2007 Computer Graphics using GpenGL Prentice-Hall 3e eacutedition

Knuth D 1968 The Art of Computer Programming Addison-Wesley

-- 1984 The TeXbook Reading Mass Addison-Wesley

-- 1986 The Metafontbook Reading Mass Addison-Wesley

-- 1999 Digital Typography Stanford California Center for the Study of Language and Information

Lamport L et D Bibby 1986 LATEX A Document Preparation System T 260 Citeseer

Lancaster D 2005 Approximating a Circle or an Ellipse using Four Bezier Cubic Splines Rapport Synergetics

Maplesoft 2010 Maple 14 User Manual

McNaughton R et H Yamada 1960 laquoRegular Expressions and State Graphs for Automata raquo -IRE Transactions on Electronic Computers no l p 39-47

Object Management Group 2009 UML httpwwwumlorgj

Oracle 2010 Java httpwwwjavacomj

Pierce B C 2002 Types and Programming Languages MIT Press

Riskus A 2006 laquoApproximation of a Cubic Bezier Curve by Circular Arcs and Vice Versa raquo Information Technology and Control vol 35 no 4 p 371-378

Rose K H 2008 XY-pic Home Page httptugorgapplicationsjXy-picj

129

Rose K H et al 2010 laquoXY-pic Users Guide raquo DIKU Universiteacute de Copenhague vol 1

Rumbaugh J M Blaha W Premerlani F Eddy et W Lorensen 1991 ObjectshyOriented Modeling and Design Prentiee-Hall

Saunders J H 1989 laquoA Survey of Objeet-Oriented Programming Languages raquo JOOP Journal of Object-Oriented Programming vol 1

Sabel J et D Friedman 1996 An Introduction to Refiection-Oriented Programming San Francisco Reflection 96

TeX Users Group 2009 MetaPost - TeX User Groups httptugorgmetaposthtml

TIOBE Software 2008 Tiobe Index httpwwwtiobecomindexphpcontentshy paperinfo tpeiindexhtml

Ullman J J Hopcroft et R Motwani 1979 Introduction to Automata Theory Lanshyguages and Computation Addison-Wesley

Van Zandt T 1993a PSTricks-PostScript Macros for Generie TEX httpwwwtexuniyaracrudocpsLugpdf

-- 1993b laquoPSTricks PostScript Macros for Generie 1EX Users Guide raquo Version 093 a http jjwww tug orgjapplicationsjPSTricks

Page 8: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux

LISTE DES FIGURES

Figure Page

11 Code XY-pic pour un diagramme 14

12 Diagramme reacutesultant du code XY-pic 14

13 Code Metapost pour dessiner un triangle 15

14 Diagramme reacutesultant du code Metapost 15

15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin 16

16 Diagramme reacutesultant du code Asymptote 16

31 Courbes de Beacutezier lineacuteaire quadratique et cubique 34

32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier 38

33 Quart de cercle approximeacute par une courbe de Beacutezier 39

34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence 41

41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b 49

51 Extrait de la grammaire de SDDL pour une instruction 61

52 Code Java et SDDL pour calculer une combinaison lineacuteaire 63

53 Code reacuteflexif pour creacuteer une forme quelconque 65

54 Code pour geacuteneacuterer du code Asymptote pour un cercle 69

61 Diagramme dautomate de compilation 73

62 Code pour le diagramme dautomate 74

63 Diagramme de tableau 76

64 Code pour le diagramme de tableau 77

65 Diagramme de Venn 78

x

66 Code du diagramme de Venn 79

REacuteSUMEacute

Dans ce meacutemoire nous analysons la description de diagrammes structureacutes dans le domaine des matheacutematiques discregravetes et de linformatique theacuteorique Cette analyse seffectue agrave partir de meacutethodes eacutetablies du geacutenie logiciel Nous trouvons un ensemble de proprieacuteteacutes que nous recherchons dans une solution informatique nous permettant de creacuteer ces diagrammes Nous analysons aussi les outils classiques agrave partir des proprieacuteteacutes preacuteceacutedentes qui nous permettent de reacutealiser ces diagrammes dans un environnement I51EX Nous observons que ces outils ne sont pas aussi puissants quils le pourraient en fonction des proprieacuteteacutes eacutetablies par notre analyse

Par la suite en nous basant sur les meacutethodes de repreacutesentation graphique des courbes et sur la theacuteorie des langages informatiques nous jetons les bases dun lanshyguage de description Nous preacutesentons aussi un outil deacuteveloppeacute en Java qui nous pershymet de deacutecrire aiseacutement nos diagrammes dinformatique theacuteorique et de matheacutematiques discregravetes agrave partir dune hieacuterarchie dobjets claire et extensible Nous avons impleacutementeacute les eacuteleacutements essentiels de notre langage en SDDL (Structured Diagram Description Lanshyguage) Nous lavons aussi valideacute agrave laide dexemples repreacutesentatifs tireacutes de sources daushytoriteacute Nous avons finalement preacutesenteacute notre solution dans le cadre de la confeacuterence TUG 2010 Nous lavons aussi preacutesenteacute avec un article dans la revue du TeX Users Groups TUG

Mots cleacutes diagrammes informatique theacuteorique matheacutematiques discregravetes langage

INTRODUCTION

Le logiciel de mise en page de document U1EX est devenu llne reacutefeacuterence pour la creacuteation

de documents matheacutematiques (American Mathematical Society 2008) Plusieurs raisons

suscitent cet inteacuterecirct une structure naturelle permettant de repreacutesenter clairement ses

ideacutees le formatage automatique de qualiteacute et un reacutesultat final de qualiteacute professionnelle

agrave un coucirct moindre

Un traiteacute matheacutematique peut contenir plusieurs types dobjets textes formules grashy

phiques diagrammes etc Dans le cas preacutesent nous nous inteacuteressons principalement agrave

la repreacutesentation de diagrammes Par diagramme on entend un dessin qui possegravede une

structure discregravete sous-jacente (souvent combinatoire mais pas obligatoirement) Un

exemple simple serait un graphe ou un arbre

Agrave partir du moment ougrave nous nous inteacuteressons agrave ces diagrammes et agrave leur repreacutesentation

il devient inteacuteressant de voir ce que U1EX nous fournit afin de geacuteneacuterer des structures

de qualiteacute En effet les diagrammes sont essentiels agrave la transmission effective des ideacutees

et des reacutesultats en informatique et en matheacutematiques discregravetes De plus la consistance

nous oblige agrave chercher agrave faire nos diagrammes agrave partir dun modegravele coheacuterent Entre

autres il nous faut conserver la mecircme police dans les diagrammes et dans le texte

en plus davoir accegraves aux symboles matheacutematiques Nous pourrions aussi importer des

diagrammes exteacuterieurs agrave U1EX mais les reacutesultats obtenus ne serait pas consistant avec

le texte Nous devons donc chercher agrave obtenir une meacutethode de repreacutesentation adeacutequate

pour nos diagrammes

Bien sucircr il existe deacutejagrave plusieurs solutions agrave ce problegraveme Il nous faut donc les analyser

avec soin avec des critegraveres formels Cela implique de reacutepertorier les diffeacuterents paquets

U1EX permettant de faire du dessin avec leurs diffeacuterentes proprieacuteteacutes Il faut ensuite

2

ajouter les logiciels qui utilisent JbTEX indirectement donc qui nen font pas partie

mais sen servent tout de mecircme Cela nous donne une vue densemble complegravete des

solutions deacutejagrave existantes agrave notre problegraveme

Ensuite avant de penser agrave analyser ces solutions nous devons deacuteterminer ce que nous

voulons exactement Agrave cette fin nous avons analyseacute le processus qua utiliseacute Donald

Knuth creacuteateur de TEX agrave la base de Jb1EX afin de mateacuterialiser son logiciel de formatage

Nous devons aussi utiliser un ensemble de contraintes agrave soumettre agrave nos diffeacuterentes

solutions Il eacutetait essentiel dutiliser Jb1EX pour le formatage du texte mais aussi pour

la clarteacute deacutecriture la qualiteacute de la documentation et la capaciteacute de creacuteer aiseacutement des

structures Par la suite il devient aiseacute et tregraves formel danalyser chacunes des diffeacuterentes

solutions proposeacutees

Malheureusement cette analyse nous a permis de constater quaucune solution neacutetait

suffisamment bonne pour satisfaire nos besoins La plupart des paquets eacutetaient trop

simples alors que plusieurs eacutetaieentiernt composeacutes de macros rendant la veacuterification de

code quasi impossible Quelques solutions (telles que XY-Pic (Rose 2008) Metapost

(TeX Users Group 2009) et Asymptote (Hammerlindl Bowman- et Prince 2010a))

fournissaient de nombreuses ideacutees inteacuteressantes mais aucune ne convenait parfaitement

agrave nos besoins Nous en sommes donc venus agrave la conclusion que la meilleure solution

serait de creacuteer notre propre solution tout en reacuteutilisant les ideacutees deacuteveloppeacutees par les

solutions preacuteceacutedentes

Afin de creacuteer une solution robuste nous avons deacutecideacute de creacuteer une hieacuterarchie orienteacutee obshy

jet afin de repreacutesenter les diffeacuterentes structures du domaine des matheacutematiques discregravetes

et de linformatique theacuteorique Cela se justifie par le fait que les hieacuterarchies objets aushy

delagrave de leurs avantages possegravedent des meacutethodes de conceptualisation formelles et bien

deacutefinies Nous avons utiliseacute la meacutethode favoriseacutee par James Rumbaugh (Rumbaugh

et al 1991) un des creacuteateurs de UML (Object Management Group 2009)

Ce processus demande en tout premier lieu une analyse du domaine afin dobtenir les

structures principales Par la suite les liens entre les diffeacuterentes classes sont analyseacutes en

3

fonction des besoins respectifs Finalement apregraves plusieurs iteacuterations et simplifications

cette meacutethode foumit une hieacuterarchie complegravete Par contre elle doit par la suite ecirctre

adapteacutee aux speacutecificiteacutes du langage dimpleacutementation

Notre hieacuterarchie a eacuteteacute deacuteveloppeacutee autour de plusieurs concepts importants Certains

sont naturellement lieacutes au domaine dutilisation Par exemple un point est une structure

naturelle pour la description de positions dans un diagramme Le mecircme raisonnement

sapplique pour des formes geacuteomeacutetriques de base comme le cercle le carreacute et lellipse

Certains objets sont des simplifications de concepts communs Par exemple un point

abstrait est un point qui peut ecirctre deacutetermineacute de maniegravere absolue ou relative Une forme

est une classe de base repreacutesentant lensemble des objets qui peuvent ecirctre dessineacutes Il

existe aussi un dessin qui repreacutesente une forme agrave un endroit particulier

Bien que cela pourrait deacuteterminer complegravetement notre domaine afin davoir une hieacuteshy

rarchie complegravete il faut inclure certains eacuteleacutements de structure Par exemple bien que

nous puissions deacuteterminer assez aiseacutement ce quest un cercle la maniegravere de le deacutecrire

pour ecirctre dessineacute nest pas aussi simple Il en est de mecircme pour des formes courbes

plus complexes ainsi que des courbes de maniegravere geacuteneacuterale car un ordinateur ne peut pas

repreacutesenter aiseacutement toutes formes de chemin Nous pouvons creacuteer un concept geacuteneacuteral

de chemin mais celui-ci doit se ramener agrave la reacutealiteacute dun ordinateur

Cela est deacutetermineacute en analysant deux choses le format de document PDF et la desshy

cription de chemin dAsymptote Le premier utilise des splines cubiques comme eacuteleacutement

de base pour deacutecrire les courbes dans un document Cest inteacuteressant mais limitatif

Asymptote de son cocircteacute prend une description complexe mais preacutecise dune courbe et

en deacuteduit un ensemble de splines cubiques quil est possible de placer dans un docushy

ment PDF ensuite Nous en concluons que le bon chemin agrave prendre est probablement

dimpleacutementer comme structure de base des chemins tels que deacutecrits par Asymptote

avec une structure de splines cubiques

Par contre certaines questions theacuteoriques surviennent lors de cette analyse Le grand

problegraveme relegraveve de la puissance dexpression des splines cubiques En effet nous verrons

4

que les splines cubiques sont puissantes mais pas suffisamment puissantes pour deacutecrire

un cercle une forme geacuteomeacutetrique pourtant extrecircmement simple Nous verrons par contre

par la suite quil est possible de deacutecrire ce mecircme cercle avec des splines cubiques avec

une preacutecision acceptable pour la creacuteation de documents papier malgreacute son inexactitude

Afin dadapter la hieacuterarchie un langage dimpleacutementation a ducirc ecirctre choisi Eacutetant donneacute

les contraintes de temps il fucirct deacutecideacute de reacuteutiliser un langage de description de diashy

grammes deacutejagrave existant Asymptote Lutilisation de ce langage nous permet dobtenir

des primitives simples et un accegraves agrave Jb1EX deacutejagrave deacutetermineacute ce qui diminue de beaucoup la

charge de travail De plus Asymptote nous permet de creacuteer nos images reacutesultantes dans

les formats Postscript (Adobe Systems Incorporated 2010a) et PDF (Adobe Systems

Incorporated 2010b) sans avoir agrave reacutealiser nous-mecircmes du code de tregraves bas niveau

Eacutevidemment si Asymptote fournissait tout ce dont nous avions besoin nous naurions

pas besoin dutiliser autre chose Par contre cest un langage baseacute sur les structures

(Hammerlindl Bowman et Prince 201Ob) au lieu des objets Cela implique que notre

hieacuterarchie ne peut ecirctre construite agrave laide de lheacuteritage objet Eacutetant donneacute la complexiteacute

que cela engendrerait un langage suppleacutementaire doit-ecirctre utiliseacute pour-la creacuteation de

la hieacuterarchie Cela nous amegravene donc agrave choisir Java (Oracle 2010) Une recherche de la

compagnie TIOBE considegravere Java comme eacutetant le langage le plus utiliseacute au moment de

la preacutesente reacutedaction (TIOBE Software 2008)

Avant de consideacuterer le deacuteveloppement dun nouveau langage la premiegravere chose agrave faire

consiste agrave consideacuterer ce agrave quoi nous voulons quil ressemble Afin de reacutealiser cette eacutetape

nous avons analyseacute notre base de diagrammes en donnant une description la plus proche

possible dun langage de programmation En simplifiant chaque description autant que

possible nous avons pu extraire quelques concepts de base importants pour la descripshy

tion de nos diagrammes De plus certaines contraintes suppleacutementaires peuvent ecirctre

ajouteacutees qui deacutependent plus de limpleacutementation que de la theacuteorie En quelque sorte

il faut pour reacutealiser notre projet nous baser sur des technologies qui ont fait leurs

preuves

5

Afin de deacutevelopper notre langage il nous faut des concepts pour le deacutecrire Cela sefshy

fectue agrave laide de la theacuteorie des langages et des automates Plus particuliegraverement nous

utiliserons les grammaires afin de faccedilonner un langage qui convient agrave nos besoins tout en

eacutetant simple agrave analyser par un programme informatique agrave laide dun logiciel speacutecialiseacute

SabieCC (Gagnon 1998) Nous verrons que les grammaires nous permettent de deacutecrire

complegravetement notre langage afin decirctre analyseacute par ordinateur

Une fois que nous avons notre langage final il ne reste plus quagrave veacuterifier les reacutesultats

obtenus Afin de boucler la boucle nous avons reacutealiseacute la programmation de chacun des

diagrammes que nous avions choisis au deacutepart pour notre base de tests Une fois ceuxshy

ci reacutealiseacutes il ne restait plus quagrave analyser les diffeacuterences entre les deux et voir si les

reacutesultats obtenus eacutetaient satisfaisants Cela nous permet de deacutemontrer quil sagit dune

solution naturelle et efficace eacutetant donneacute que nous pouvons creacuteer les objets de notre

domaine pour produire des diagrammes de grande qualiteacute

Le reste de ce meacutemoire est structureacute comme suit Le chapitre 1 expose la probleacutematique

et les objectifs rechercheacutes Le chapitre 2 introduit la creacuteation de notre solution inforshy

matique et plus speacutecifiquement de la hieacuterarchie objet Le chapitre 3 deacutecrit la theacuteorie

matheacutematique derriegravere la description de courbes et segments par ordinateur Le chapitre

4 expose les dessous de la theacuteorie des langages que nous utilisons afin de creacuteer SOOL

Le chapitre 5 expose la creacuteation du langage au-dessus de la hieacuterarchie Finalement le

chapitre 6 analyse le reacutesultat final afin de voir si le tout reacutepond aux objectifs deacutefinis au

deacutepart

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CHAPITRE l

PROBLEacuteMATIQUE ET OBJECTIFS

Dans ce chapitre nous nous eacutetendrons sm une deacutefinition correcte et complegravete de la

probleacutematique ainsi que sur les objectifs que nous souhaitons atteindre Nous verrons

aussi une analyse des solutions qui existent deacutejagrave et les raisons qui nous poussent agrave

deacutevelopper notre propre solution Finalement nous deacutefinirons une base de diagrammes

aptes agrave repreacutesenter adeacutequatement nos objectifs

11 Description de la probleacutematique

111 Les notes de cours une mise en contexte

Ce projet fut motiveacute principalement par la reacutedaction de notes de cours En effet

dans un milieu universitaire (particuliegraverement pour les eacutetudiants au baccalaureacuteat mais

eacutegalement pour les eacutelegraveves de cycles supeacuterieurs) il est extrecircmement utile de pouvoir

utiliser des notes de cours de quali teacute

La creacuteation de notes de cours adapteacutees vient tout de mecircme avec quelques problegravemes

Premiegraverement surtout en informatique la plupart des livres sont eacutecrits en anglais Cela

implique souvent de devoir eacutecrire nos propres versions sous la forme de notes de cours

De plus linformatique est un domaine qui eacutevolue agrave un rythme fulgurant Cela implique

que des notes adeacutequates et adapteacutees doivent ecirctre agrave jour Comme certains eacuteleacutements en

informatique peuvent eacutevoluer agrave chaque anneacutee voire plus vite il faut ecirctre capable deacutecrire

extrecircmement rapidement des textes si nous souhaitons quils soient utiles un tant soit

8

peu

Cela nous amegravene agrave notre probleacutematique principale plusieurs cours neacutecessitent un supshy

port plus complexe que simplement des mots agrave savoir des dessins et des diagrammes

voire des animations Cela est requis dans plusieurs cours en informatique theacuteorique

particuliegraverement dans leacutetude des structures de donneacutees et des algorithmes Il nous faut

donc une meacutethode rapide et efficace pour creacuteer des diagrammes agrave placer dans nos notes

de cours

112 Domaine dapplication eacutelargi

Bien eacutevidemment cibler purement les notes de cours et les structures de donneacutees nest

quun point de deacutepart Nous pouvons eacutelargir notre domaine dapplication agrave des diashy

grammes structureacutes cest-agrave-dire un dessin qui possegravede une structure sous-jacente crushy

ciale au point de pouvoir necirctre deacutecrit quagrave partir de cette structure Par exemple

un graphe est un ensemble de sommets eacutetiqueteacutes relieacutes ensemble par des flegraveches Tout

dessin de graphe est donc un dagramm~ selon notye deacutefiniton Dun_autre cocirct~ une

peinture possegravede parfois une structure mais celle-ci est largement insuffisante pour

deacutecrire loeuvre Par exemple pertgtonne noserait deacutecrire un Picasso comme eacutetant un

amas de cercles et de carreacutes de diffeacuterentes couleurs

Lensemble des structures que nous visons se rapporte donc essentiellement agrave deux

domaines linformatique theacuteorique et les matheacutematiques discregravetes Linformatique

theacuteorique est surtout deacutefinie par les structures de donneacutees et les algorithmes (et tout

sujet sy reliant) Les matheacutematiques discregravetes sont surtout deacutefinies par la theacuteorie des

graphes et la combinatoire Nous neacutegligeons ici volontairement les matheacutematiques contishy

nues pour deux raisons La premiegravere est quune structure de taille infinie peut souvent

ecirctre repreacutesenteacutee par une structure finie (donc discregravete) La seconde est que les besoins

en matheacutematiques continues sont largement diffeacuterents des besoins en matheacutematiques

discregravetes En effet dessiner le graphe dune fonction de deux variables est un sujet comshy

plexe mais totalement diffeacuterent de creacuteer un graphe Afin de rendre nos besoins plus

9

speacutecifiques nous eacuteviterons ce genre de dessins qui possegravedent deacutejagrave de nombreux logiciels

pour les reacutealiser (entre autres Maple) (Maplesoft 2010)

12 Description des objectifs rechercheacutes

La premiegravere partie de notre travail consiste agrave deacutecrire les objectifs que nous souhaitons

atteindre dans notre creacuteation de diagrammes En effet plusieurs paramegravetres importants

peuvent ecirctre utiliseacutes Il est donc important de ne pas perdre de vue lensemble tout en

donnant la prioriteacute agrave certains eacuteleacutements

121 Inteacutegration avec ~IEX

Ib1EX est un langage de description de documents texte Creacuteeacute agrave lorigine sous la forme

de TEX par Donald Knuth (Knuth 1984) puis modifieacute par Leslie Lamport (Lamport

et Bibby 1986) celui-ci est rapidement devenu un standard dans la reacutedaction darticles

scientifiques dans plusieurs domaines Bien quutiliseacute surtout pour la reacutedaction darticles

il a eacuteteacute preacutevu au deacutepart pour la reacutedaction de livres Il se distingue par sa capaciteacute agrave

creacuteer aiseacutement du contenu matheacutematique et le fait de soccuper du contenu en laissant

le logiciel soccuper de la mise en page du texte Il est si populaire que de nombreux

meacutemoires incluant celui-ci sont eacutecrits agrave partir de Ib1EX

Eacutetant donneacute que le monde des matheacutematiques et de linformatique theacuteorique utilise

abondamment Ib1EX il est important quun logiciel de creacuteation de diagrammes pershy

mette de lutiliser En effet si notre objectif est de creacuteer du contenu de qualiteacute professhy

sionnelle il faut que les polices soient constantes au travers de notre article (ou de nos

notes de cours) Naturellement plusieurs diagrammes vont contenir du texte Il faut

donc pour ecirctre consistant geacuteneacuterer ce texte avec Ib1EX afin davoir une forme standard

pour lensemble du document De plus il est tout agrave fait possible de vouloir mettre des

symboles matheacutematiques dans un diagramme (par exemple un symbole dinteacutegrale) Si

le texte est geacuteneacutereacute avec Ib1EX cela vient automatiquement Sinon il devient tregraves difficile

dobtenir un texte de belle qualiteacute Il sagit donc dun besoin primordial

10

122 Description de structures

Un autre eacuteleacutement extrecircmement important que nous recherchons est de pouvoir faire

adeacutequatement la description de diffeacuterentes structures Eacutetant donneacute que les diagrammes

sont composeacutes de structures il faut pouvoir en creacuteer aiseacutement et les relier de maniegravere

aiseacutee Cela implique quelques petites contraintes entre autres de pouvoir utiliser des

variables pour conserver les structures en question Ideacutealement la solution la plus solide

en terme de description de structures utiliserait lorienteacute-objet Une des composantes

les plus importantes dune solution orienteacutee objet est la preacutesence dune hieacuterarchie de

classes dobjets

123 Hieacuterarchie solide et extensible

Un objectif que nous recherchons est que le langage nous fournisse une hieacuterarchie dobshy

jets (ou de structures) de qualiteacute afin de pouvoir creacuteer une grande quantiteacute de diashy

grammes agrave partir deacuteleacutements de cette hieacuterarchie Une hieacuterarchie peut ecirctre deacutecrite comme

eacutetant une structure permettant dinteacutegrer facilemen~ de nouveau~ aspects sans_avoir agrave

dupliquer inutilement du code Il serait aussi important quelle puisse ecirctre eacutetendue si cershy

tains eacuteleacutements suppleacutementaires sont neacutecessaires Par exemple il pourrait ecirctre inteacuteressant

pour des gens en geacutenie eacutelectrique de pouvoir faire des diagrammes eacutelectriques malgreacute

le fait que cela ne fait pas partie de nos contraintes de deacutepart Cela pourrait ecirctre ajouteacute

par extension du systegraveme

124 Objectifs moindres

Gestion des erreurs

Dans des notes de cours il est freacutequent davoir des diagrammes Par contre eacutecrire

un diagramme peut saveacuterer plus compliqueacute que deacutecrire du texte Comme plusieurs

utilisateurs potentiels ne seront pas des experts du systegraveme il faut que les erreurs soient

deacutetecteacutees et traiteacutees de maniegravere adeacutequate Cela assure agrave lutilisateur final une expeacuterience

11

plaisante en speacutecifiant les erreurs quil commet et des meacutethodes pour les reacuteparer Sil

faut que lutilisateur cherche pendant des heures pour trouver la petite erreur quil a

commise il va tout simplement cesser dutiliser le logiciel

Langage fluide et clair

Bien que moins important le fait davoir un langage clair est excellent pour attirer les

utilisateurs vers ce systegraveme En effet si le langage est un gribouillis incompreacutehensible il

sera fort probablement dur dapprentissage et difficile agrave aborder Par fluide et clair nous

entendons que le langage soit jusquagrave un certain point compreacutehensible pour quelquun

qui ne connaicirct pas le systegraveme

Qualiteacute de la documentation et courbe dapprentissage

Finalement il faut quune documentation existe et quelle soit complegravete De preacutefeacuterence

une bonne documentation contiendra un reacutepertoire de toutes les fonctionnaliteacutes mais

aussi des tutoriels avec des exemples codeacutes de cas standards Cela incite les utilisateurs

agrave essayer le logiciel en prenant un exemple et en ladaptant agrave leurs besoins Cela amegravene

(avec les autres objectifs) agrave un langage simple dapprentissage mais tout de mecircme

puissant Comme notre objectif est de trouver une solution simple il faut que nimporte

qui puisse commencer agrave sen servir rapidement sans avoir besoin de lire lensemble de

la documentation

13 Analyse des solutions existantes

Naturellement une fois que nous savons ce que nous recherchons il nous faut analyser

toutes les solutions qui existent deacutejagrave Cela nous permettra didentifier une solution qui

est deacutejagrave fonctionnelle ou au mieux une qui pourra ecirctre eacutetendue ou utiliseacutee afin de

simplifier le travail de creacuteation si besoin est Au minimum nous pourrons extraire les

concepts inteacuteressants de chaque solution et voir sil est possible de les inteacutegrer agrave notre

solution

12

131 Paquets f1TEX standards

Eacutetant donneacute limportance de lutilisation de JbIEX les premiegraveres solutions sont celles

disponibles agrave linteacuterieur mecircme de fbIEX Celles-ci sont appeleacutees des paquets Plusieurs

paquets diffeacuterents existent et bon nombre dentre eux sont des solutions bricoleacutees et

donc incomplegravetes

Dans les solutions inteacuteressantes on note premiegraverement la preacutesence de la commande

picture Celle-ci a eacuteteacute ajouteacutee dans TEX par Donald Knuth comme tme solution agrave tout

oubli potentiel dans son systegraveme Cette commande prend du texte quelconque et le passe

par la suite au pilote qui compile le document Cela permet entre autres de transfeacuterer

des informations au pilote qui compile en Postscript et permet donc lutilisation de toute

la force de Postscript dans la reacutedaction de dessin Un gros problegraveme de cette solution

est que le texte agrave eacutecrire deacutepend du pilote utiliseacute limitant de beaucoup son utilisation

Il est tout de mecircme devenu la base de nombreux paquets qui se servent de Postscript

Plusieurs solutions ont aussi eacuteteacute deacuteveloppeacutees pour toutes sortes de domaines On retrouve

entre autres des-diagrammes de-Peynmann et deuml Lewis (feyn et-lewis) des dia-grammes

de flots (nassflow) et des arbres linguistiques (xyling rst qtree et lingtrees)

Naturellement ces solutions ne conviennent pas car elles sont pour des domaines trop

speacutecifiques par rapport agrave notre objectif

Une solution dun domaine plus geacuteneacuteral qui se deacutemarque est le paquet PSTricks (Van

Zandt 1993a) Creacuteeacute en 1993 par le professeur Timothy Van Zandt celui-ci est devenu

tregraves populaire au fil des anneacutees eacutetant donneacute les nombreuses possibiliteacutes qui existent en

Postscript Un des grands avantages est sa documentation qui est tregraves prolifique et tregraves

claire (Van Zandt 1993b)

Cela est bien inteacuteressant mais malheureusement PSTricks souffre du mecircme problegraveme

que chaque paquet interne agrave JbTEXmiddot Il est fait agrave partir de macros En effet TEX a eacuteteacute eacutecrit

complegravetement agrave partir de macros Il sagit dlm meacutecanisme de remplacement textuel ougrave

lon deacutefinit une entreacutee et toutes les occurrences de cette entreacutee sont remplaceacutees par une

13

sortie bien speacutecifique Comme une macro est toujours remplaceacutee par son contenu avant

decirctre analyseacutee plus en deacutetail toute forme derreur se retrouve agrave un niveau extrecircmement

bas Cela fait que nimporte quelle erreur est quasi impossible agrave cerner correctement

rendant le travail de lutilisateur qui souhaite apprendre tregraves complexe De plus le fait

de fournir le Postscript directement agrave lutilisateur rend celui-ci tregraves puissant mais tregraves

dangereux Finalement bien que de nombreuses formes soient disponibles il nexiste

pas de hieacuterarchie en tant que telle dans PSTricks ce qui le rend impossible agrave eacutetendre

132 )(J(-pic

Une autre solution inteacuteressante peut ecirctre retrouveacutee agrave linteacuterieur de gTEX Il sagit

de XV-pic un paquet eacutecrit par Kristoffer H Rose (Rose et al 2010) Ce paquet

a eacuteteacute creacuteeacute speacutecifiquement pour la description de diagrammes agrave linteacuterieur de gTEX

et possegravede une documentation exhaustive Malheureusement cette documentation est

extrecircmement complexe mecircme pour un utilisateur avanceacute XV-pic utilise principalement

des boicirctes gTEX positionneacutees agrave diffeacuterents endroits afin de creacuteer les diagrammes Ceuxshy

ci sont par la suite relieacutes par diffeacuterents objets puis deacutecoreacutes Cela fournit un reacutesultat

final de qualiteacute XV-pic possegravede entre autres un mode pour creacuteer des diagrammes en

positionnant les eacuteleacutements dans une matrice Cela rend les dessins plus simples concepshy

tuellement mais pas toujours positionneacutes adeacutequatement XV-pic permet aussi de faire

du positionnement relatif agrave dautres objets ce qui peut ecirctre tregraves pratique Comme nous

pouvons le voir dans lexemple suivant XV-pic est tregraves pratique dans les reacutesultats quil

nous permet dobtenir mais sa syntaxe laisse de beaucoup agrave deacutesirer

Par contre les deacutefauts de XV-pic sont extrecircmement visibles En premier lieu la syntaxe

du langage est extrecircmement difficile agrave comprendre car elle est baseacutee sur la composition

de nombreux caractegraveres speacuteciaux De plus comme il sagit dun paquet gTEX le tout

est impleacutementeacute agrave laide de macros et rend donc la recherche derreur laborieuse (surshy

tout lorsquon prend en compte la syntaxe deacutejagrave difficile agrave utiliser) Cela rend XV-pic

inapte agrave lutilisation par quelquun qui ne souhaite pas investir trop de temps dans son

apprentissage Finalement les nombreux modes de dessins sont souvent incompatibles

14

xymatrix U ar_[ddr]_y ar-[drr]-x

argt[dr] I-(xy) amp X times_Z y ar[d]-q ar[r]_p amp X ar[d]_f amp y ar[r]-g

amp Z

Figure 11 Code XY-pic pour un diagramme

Figure 12 Diagramme reacutesultant du code XY-pic

entre eux et ne peuvent souvent pas ecirctre utiliseacutes dans un mecircme dessin

133 Metapost

Eacutetant donneacute le problegraveme commun agrave tous les paquets agrave linteacuterieur de JgEX la solution la

plus logique serait dessayer den sortir Cela a donneacute le logiciel Metapost (Hobby 1992)

Celui-ci a eacuteteacute inspireacute de Metafont (Knuth 1986) que Knuth a utiliseacute pour dessiner des

polices pour EX Une des grandes avanceacutees du langage est la description de courbes

Celui-ci reacuteutilise un algorithme de Knuth qui permet de deacutecrire des courbes tout en

en controcirclant les diffeacuterents paramegravetres De plus comme le logiciel nest pas reacutedigeacute en

macros il permet de deacutetecter de maniegravere adeacutequate les erreurs de lusager Nous pouvons

deacutejagrave voir dans le code fourni en exemple quil sagit dun langage beaucoup plus clair

que XV-pic

15

beginfig(l)

pair A B C A=(OO) B=(lcmO) C=(Olcm) draw A--B--C--cycle

endfig

Figure 13 Code Metapost pour dessiner un triangle

Figure 14 Diagramme reacutesultant du code Metapost

Par contre quelques problegravemes se deacutegagent de Metapost Premiegraverement le langage ne

permet pas limpleacutementation dune hieacuterarchie solide Cela ne serait pas un problegraveme sil

en existait deacutejagrave une mais ce nest pas le cas En effet les diagrammes ont fait lobjet

dune extension du langage mais rien de tregraves deacuteveloppeacute Il est donc faisable de faire

des diagrammes mais il ne sagit pas neacutecessairement dune solution agrave toute eacutepreuve

De plus comme toutes les coordonneacutees du langage sont donneacutees en valeur absolue cela

limite les possibiliteacutes du langage (entre autres en ne pouvant utiliser des points deacutefinis

par des objets)

134 Asymptote

Une autre possibiliteacute se retrouve dans le logiciel Asymptote qui se deacutefinit comme eacutetant

Wl langage inspireacute de Metapost (Hammerlindl Bowman et Prince 2010b) Il est donc

aussi externe agrave g1EX mais aussi inspireacute du langage de programmation CH Cela lui

confegravere la creacuteation de structures avanceacutees et la creacuteation de fonctions complexes De

plus une documentation exhaustive et un traitement des erreurs de qualiteacute en font une

solution robuste

Malheureusement comme Metapost Asymptote pose quelques problegravemes En effet ce

16

size(3cm) draw(unitsquare) labelC l $A$ (00) SW)

labelC $B$ Cl 0) SE) label ($C$ Cl 1) NE)

label ($0$ (01) NW)

Figure 15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin

( )

il

Figure 16 Diagramme reacutesultant du code Asymptote

logiciel fut eacutecrit avec les matheacutematiques continues et la geacuteomeacutetrie comme domaine

dutilisation Ce nest pas Lill problegraveme en tant que tel (Asymptote le fait tregraves bien)

mais cela fait que la- creacuteation de diagrammes discrets nest pas vraiment deacuteveloppeacutee

Il faudrait donc ecirctre capable de creacuteer une hieacuterarchie de structures pour la creacuteation de

diagrammes Eacutetant donneacute le support des structures posseacutedant des fonctions internes il

devrait ecirctre possible dajouter cette possibiliteacute agrave Asymptote

Malheureusement ce nest pas preacutesentement reacutealisable agrave linteacuterieur du langage En efshy

fet Asymptote est un langage baseacute objet Cela signifie quil possegravede des structures qui

ressemblent agrave une description typique dun objet mais pas toutes les proprieacuteteacutes imshy

portantes qui se rattachent agrave un langage agrave objets standard comme Java ou C++ Plus

particuliegraverement cest labsence de polymorphisme qui cause problegraveme En effet la

creacuteation dune hieacuterarchie implique de creacuteer des liens entre les diffeacuterentes structures Par

exemple un cercle un triangle et un nuage sont toutes des formes avec certaines proshy

prieacuteteacutes similaires Il nous faut donc avoir des fonctions qui prennent des formes comme

paramegravetres Si nous avons une fonction f qui prend une forme nous souhaiterions eacutecrire

une seule fonction

17

fCforme)

Malheureusement en Asymptote il faudrait eacutecrire une fonction pour chaque forme

distincte comme cela

fCcercle)

fCcarre)

fCnuage)

Cela rend la creacuteation dune hieacuterarchie extrecircmement difficile car pour chaque fonction

utilisant un objet plus geacuteneacuteral il nous faut eacutecrire plusieurs fois cette fonction De plus

cela rend lexpansion par lusager de la hieacuterarchie essentiellement impossible car il doit

rajouter des cas pour chaque fonction deacutefinie preacuteceacutedemment en plus dajouter son nouvel

objet dans la hieacuterarchie Cela est difficilement souhaitable

135 Conclusion de lanalyse

Afin den venir agrave une conclusion adeacutequate il faut se ramener aux objectifs rechercheacutes

Cela nous permet de rapidement eacuteliminer les solutions internes agrave Ib-TEX eacutetant donneacute

la complexiteacute de la gestion des erreurs (et indirectement la courbe dapprentissage du

langage) Cela nous laisse comme solution Metapost et Asymptote Naturellement le

langage Asymptote est plus eacutevolueacute que celui de Metapost et fournit des eacuteleacutements de

programmation plus inteacuteressants Cela implique donc quil nous permet plus aiseacutement

de construire nos structures tant deacutesireacutees

Par contre Asymptote ne fournit pas une solution suffisante eacutetant donneacute quil ne possegravede

pas une hieacuterarchie dobjets adapteacutee aux diagrammes De plus eacutetant donneacute que le langage

est baseacute objet il sera beaucoup trop compliqueacute dy implanter une hieacuterarchie Nous en

venons donc agrave la conclusion que le mieux serait dutiliser Asymptote qui nous fournit un

ensemble de services complexes (impleacutementation des chemins liens avec Ib-TEX etc )

et de limpleacutementer avec un langage de plus haut niveau

18

Java devient un choix inteacuteressant pour cette tacircche En effet cest un langage connu dans

lindustrie et simple dapprentissage Il sagit dun langage de programmation objet qui

nous permettra agrave coup sucircr dimpleacutementer une hieacuterarchie solide Par contre ce langage

possegravede quelqu~s petits problegravemes comme un tregraves haut niveau de verbositeacute et beaucoup

deacuteleacutements non requis pour la description de diagrammes

Nous en sommes donc venus agrave la conclusion que la meilleure solution serait dutiliser

Java mais dimpleacutementer par-dessus celui-ci un langage deacutedieacute qui eacuteliminerait tout ce

qui nest pas requis pour la description des diagrammes Nous appellerons ce langage

SDDL pour Structured Diagram Description Language

Concepts inteacuteressants agrave conserver

Avant de penser agrave concevoir notre logiciel il serait bon de voir quels eacuteleacutements nous

souhaitons conserver des solutions existantes Agrave cette fin leacuteleacutement le plus inteacuteressant

provient de XV-Pic En effet il permet de relier des objets entre eux par des flegraveches

dune maniegravere relativement simple Il serait donc inteacuteressant de pouvoir permettre de

deacutecrire des liens entre diffeacuterents objets par des points speacutecifiques agrave chacun dentre eux

De plus lalgorithme de description de chemins utiliseacute par Metapost et Asymptote est

extrecircmement efficace et utile et pourrait donc ecirctre utiliseacute directement par notre langage

Cela sera simple agrave impleacutementer eacutetant donneacute que nous souhaitons utiliser Asymptote pour

compiler vers Postscript

14 Diagrammes repreacutesentatifs du domaine

Finalement avant de pouvoir commencer agrave deacutefinir les besoins de notre hieacuterarchie il

nous faut obtenir une deacutefinition valide et complegravete de notre domaine Naturellement

il nest pas eacutevident de trouver une deacutefinition concregravete et objective dun diagramme en

informatique theacuteorique Nous devons donc nous rabattre sur une autre solution qui doit

tout de mecircme ecirctre la plus formelle possible

19

141 Lapproche de Knuth

Pour trouver une ideacutee nous nous ramegravenerons agrave la meacutethode que Donald Knuth a utiliseacutee

lorsquil a creacuteeacute TEX En effet il souhaitait creacuteer un logiciel qui ferait de laquo beauxraquo doshy

cuments Cela eacutetant un terme tregraves subjectif Knuth deacutecida de se deacutefinir un ensemble

de journaux scientifiques dont les publications eacutetaient du plus haut standard de qualiteacute

pour leacutepoque (Knuth 1999) Apregraves avoir obtenu ces diffeacuterents exemples il put saffairer

agrave essayer de reproduire une solution de cette qualiteacute Il devient donc eacutevident agrave la fin

du cycle de deacuteveloppement du logiciel que sa solution eacutetait coheacuterente et valide car elle

permettait dobtenir un reacutesultat de qualiteacute en comparaison agrave ce que nous pourrions

deacutejagrave deacutefinir comme eacutetant de qualiteacute

Nous pouvons donc chercher agrave suivre la mecircme meacutethode Afin de la respecter nous devons

trouver quelques livres dun haut niveau de qualiteacute et prendre certains diagrammes

que lon retrouve agrave linteacuterieur Cela nous permettra de retrouver les eacuteleacutements les plus

cruciaux de notre domaine

Plusieurs livres inteacuteressants soffrent agrave nous nous utiliserons entre autres laquo The Art

of Computer Programming raquo de Donald Knuth (Knuth 1968) Il est naturel quun des

livres les plus connus en informatique eacutecrit par Knuth de surcroicirct possegravede un haut

standard de qualiteacute Un autre livre important est le laquo livre du dragonraquo (Aho Sethi et

Ullman 1986) qui eacutetudie la theacuteorie de la compilation et est extrecircmement connu dans

son domaine De plus celui-ci renferme leacutetude de nombreuses structures de donneacutees ce

qui nous fournit de nombreux diagrammes de qualiteacute Finalement il existe aussi un livre

tregraves connu dans leacutetude des algorithmes (ce qui est aussi extrecircmement lieacute agrave leacutetude des

structures de donneacutees) qui sappelle laquo Introduction to Algorithmsraquo (Cormen et al

2001) Ces trois livres forment une base extrecircmement connue et de qualiteacute pour nos

diagrammes Nous avons extrait quinze (15) diffeacuterents diagrammes de ces livres

20

142 Description des exemples et des concepts preacutesents dans les diagrammes

Les diffeacuterents diagrammes que nous avons seacutelectionneacutes repreacutesentent diffeacuterentes strucshy

tures de donneacutees On y retrouve plusieurs arbres et graphes Les graphes sont de plushy

sieurs types allant dun graphe standard agrave des graphes dexeacutecution De plus certaines

structures preacutesentes plus rarement se retrouvent dans notre ensemble Entre autres on

retrouve un diagramme de Venn qui bien que conceptuellement simple est toujours

relativement complexe lorsque nous souhaitons le reacutealiser avec un logiciel On retrouve

aussi des arbres linguistiques qui ne sont pas neacutecessairement complexes mais surtout

longs agrave reacutealiser

Cet ensemble de diagrammes nous permet de couvrir lensemble des structures de

donneacutees importantes en informatique theacuteorique et en matheacutematiques discregravetes Il existe

dautres structures de donneacutees mais celles-ci peuvent toujours ecirctre impleacutementeacutees seacutepashy

reacutement eacutetant donneacute que nous souhaitons faire une hieacuterarchie aiseacutement extensible Nous

remarquons surtout dans nos exemples quun des eacuteleacutements les plus importants est de

pouvoir r~lier convenablement les_diffeacuterents eacuteleacutements (dans un graphe par exemple)

Comme il sagit de quelque chose qui est toujours preacutesent il sagira dun des points les

plus importants agrave deacutevelopper pour notre hieacuterarchie

CHAPITRE II

STRUCTURE ET SOLUTION INFORMATIQUE

Afin de deacutevelopper un produit qui convient agrave nos besoins nous aurons besoin quil soit

structureacute adeacutequatement Cela implique principalement la construction de la hieacuterarchie

dobjets du domaine Il faut deacuteterminer quels sont les eacuteleacutements rechercheacutes dans notre

solution trouver une meacutethode de deacuteveloppement formelle et adeacutequate puis la reacutealiser

correctement Cela assurera une solution de qualiteacute

21 Objectifs dune structure dans une solution informatique

En premier lieu il nous faut justifier le besoin dune meacutethode de deacuteveloppement forshy

melle et solide En effet lin logiciel en informatique est tregraves diffeacuterent dun problegraveme

matheacutematique standard Une deacutemarche matheacutematique se ramegravene agrave un concept bien

connu la preuve Cela reurond la reacutesolution du problegraveme creacutedible agrave condition que la

preuve soit bonne Par contre nous verrons quun problegraveme informatique ne peut ecirctre

reacutesolu agrave laide dune simple preuve

211 Les diffeacuterentes composantes dune solution informatique

Une solution agrave un problegraveme informatique possegravede diffeacuterents eacuteleacutements Chacun dentre

eux possegravedent un certain degreacute de formalisme qui affecte lensemble de la solution

22

Algorithmes

Les algorithmes sont les eacuteleacutements les plus formels dune solution informatique On peut

dire quils se ramegravenent agrave la partie matheacutematique dun problegraveme informatique en quelque

sorte Composeacute dune seacuterie dopeacuterations aux comportements bien deacutefinis le reacutesultat dun

algorithme est preacutevisible Eacutetant donneacute la possibiliteacute de preacutevoir le comportement dun

algorithme agrave partir de ses entreacutees il est possible de deacutemontrer que lalgorithme fournit

exactement les reacutesultats rechercheacutes Il suffit en effet de prouver que agrave chaque entreacutee

possible on obtient la sortie qui serait logiquement attendue de lalgorithme On peut

penser par exemple agrave un algorithme de tri qui pour chaque ensemble de nombres

retourne les nombres en ordre croissant

Malgreacute tout un algorithme en informatique nest pas parfait En effet si le temps

dexeacutecution dun algorithme pour des entreacutees standards est beaucoup trop eacuteleveacute il ne

sera pas utiliseacute peu importe quil donne le bon reacutesultat Le temps dopeacuteration et la

quantiteacute despace meacutemoire sont les deux principales contraintes qui entrent en ligne de

compte pour les diffeacuterents algorithmes dune solution informatique

Solutions technologiques

Lautre partie extrecircmement importante de tout logiciel informatique est le choix des

technologies utiliseacutees En effet les programmes informatiques ne sont pas directement

creacuteeacutes agrave partir de circuit eacutelectriques Chaque couche dabstraction suppleacutementaire (cirshy

cuits logiques code assembleur programmation de haut niveau) limite les possibiliteacutes

du programmeur et vient avec certains avantages et certains inconveacutenients Le fait de

ne pas utiliser une solution deacutejagrave existante peut permettre une solution plus puissante

mais agrave un coucirct de deacuteveloppement potentiellement beaucoup plus eacuteleveacute Il est aussi posshy

sible avec un certain ensemble de choix technologiques de ne pas pouvoir obtenir un

effet rechercheacute dans une solution Cela explique pourquoi nous avons deacutecideacute dutiliser

Asymptote Il nous fournit un accegraves agrave JbTEX deacutejagrave codeacute ainsi quune traduction comshy

plexe vers un fichier image Postscript La reacutealisation de ces diffeacuterents eacuteleacutements de

23

code aurait significativement augmenteacute la complexiteacute de notre tacircche

Imperfection de toute solution informatique

Eacutetant donneacute les limitations des outils technologiques agrave notre disposition nous sommes

obligeacutes de constater que toute solution informatique est imparfaite De plus plusieurs

contraintes donneacutees agrave des systegravemes informatiques sont geacuteneacuteralement vagues et peuvent

ecirctre interpreacuteteacutees diffeacuteremment en fonction de lutilisateur Par exemple nous souhaitons

reacutealiser un outil simple dutilisation mais puissant et extensible Naturellement plus

un langage est puissant plus il devient complexe Un utilisateur peut trouver un outil

tregraves simple alors quun autre le trouvera incompreacutehensible Dautres points comme la

qualiteacute de documentation la courbe dapprentissage et lagestion aiseacutee des erreurs sont

des critegraveres qui possegravedent une bonne part de subjectiviteacute Ce ne sont toutefois pas

neacutecegravessairement de mauvais critegraveres Il faut simplement chercher selon une deacutefinition la

plus proche possible dun utilisateur moyen agrave maximiser les diffeacuterents paramegravetres

Ce genre de contraintes relegraveve geacuteneacuteralement du geacutenie logiciel Bien que ce meacutemoire ne

constitue pas un travail de geacutenie logiciel nous sommes obligeacutes demprunter quelques

eacuteleacutements agrave ce domaine afin dobtenir un reacutesultat adeacutequat

212 Consideacuterations pour une meacutethodologie de deacuteveloppement

Avant de choisir notre meacutethodologie il est bon de veacuterifier les objectifs rechercheacutes dans

lutilisation dune telle meacutethode de deacuteveloppement Cela nous permettra de deacutegager les

eacuteleacutements importants agrave garder en tecircte tout au long du deacuteveloppement de la hieacuterarchie

Un des eacuteleacutements les plus importants est dobtenir une structure efficace pour deacutecrire

nos diagrammes Lautre eacuteleacutement crucial est dobtenir une hieacuterarchie qui repreacutesente

adeacutequatement le domaine De preacutefeacuterence elle doit ecirctre complegravete et dun usage naturel

On entend par lagrave que les eacuteleacutements sont suffisamment preacutecis et proches deacuteleacutements stanshy

dards et connus du domaine que toutes les opeacuterations soient laquo naturellesraquo pour une

personne qui ne connaicirct pas le langage Il nexiste malheureusement pas de mesure pour

24

deacuteterminer si une hieacuterarchie est naturelle ou non Toutefois si chaque section est reacutefleacutechie

de maniegravere formelle le reacutesultat final devrait ecirctre naturel Certaines consideacuterations mishy

neures peuvent ecirctre plus ou moins mesureacutees comme la longueur du code et les noms

adeacutequats de fonctions

22 La programmation orienteacutee-objet

La programmation orienteacutee-objet est un des pheacutenomegravenes tregraves importants en informashy

tique Depuis sa creacuteation elle est devenue de plus en plus populaire eacutetant donneacute la faciliteacute

de deacuteveloppement dans une telle meacutethode Le fait dutiliser une solution orienteacutee-objet

(au contraire de Metapost ou Asymptote) ne sest pas fait de faccedilon arbitraire Il est

donc de mise dexposer les diffeacuterents avantages qui nous ont pousseacutes agrave choisir un tel

paradigme pour notre logiciel

221 Concepts de bases

La structure de base en programmation orienteacutee-objet est naturellement lobjet Celuishy

ci est deacutefini comme eacutetant une structure de donneacutees qui regroupe des donneacutees et des

meacutethodes (Saunders 1989) Bien quil ne sagit pas dun critegravere obligatoire la plushy

part des langages de programmation creacuteent les objets agrave partir dune classe qui deacutefinit

les diffeacuterents champs et meacutethodes preacutesents et leurs effets Les objets forment donc le

minimum requis pour avoir un langage objet

En tant que tel cet ensemble de concepts est assez minimaliste Il existe plusieurs autres

eacuteleacutements qui sont preacutesents agrave un degreacute plus ou moins grand dans les langages agrave objets

Ceux-ci forment donc en quelque sorte la base de la programmation orienteacutee-objet

(Pierce 2002)

- Lencapsulation des donneacutees cest-agrave-dire camoufler les donneacutees dans une structure

speacutecifique (lobjet)

- Lheacuteritage qui permet de deacutefinir un objet comme eacutetant une installce speacutecifique dun

autre objet On peut appliquer le mecircme raisonnement agrave deux classes On dit alors

25

quune classe heacuterite dune classe de base Celle-ci possegravede exactement le mecircme corps

que sa classe de base mais peut rajouter ou modifier certaines proprieacuteteacutes Il sagit

dun des aspects les plus importants dans le deacuteveloppement dune hieacuterarchie

- Le polymorphisme qui nous permet de creacuteer des proprieacuteteacutes qui varient en fonction

des sous-classes Par exemple une classe Nombre pourrait avoir une meacutethode daddishy

tion alors que ses sous-classes Entiegraveres et Reacuteelles redeacutefiniraient cette meacutethode en

fonction de leur impleacutementation speacutecifique Cela nous permet par la suite de prendre

deux nombres et de les additionner peu importe quil sagisse de reacuteels ou dentiers

222 Diffeacuterence avec la programmation baseacutee-objet

Les diffeacuterentes prioriteacutes eacutenumeacutereacutees ci-haut sont les eacuteleacutements de base qui nous permettent

de creacuteer une hieacuterarchie de qualiteacute Il sagit de la raison principale justifiant de ne pas

utiliser Asymptote pour creacuteer la hieacuterarchie En effet celui-ci est un langage baseacute-objet

La diffeacuterence principale est quun langage baseacute-objet ne neacutecessite pas limpleacutementation

de lheacuteritage ou du polymorphisme (Saunders 1989) Asymptote de son cocircteacute possegravede un

heacuteritage de structure minimal mais pas de polymorphisme Cette diffeacuterence est cruciale

car cet eacuteleacutement est neacutecessaire pour la creacuteation dune hieacuterarchie dans des contraintes

acceptables

En effet une chose importante est dajouter des objets dans les diagrammes Par

exemple supposons que nous avons une classe Conteneur Celui-ci doit pouvoir conteshy

nir des Cercles des Carreacutes des Triangles etc Sil fallait eacutecrire une fonction pour

ajouter chacune des formes le travail deviendrait eacutenormeacutement complexe et impossible

agrave eacutetendre pour lusager final Avec le polymorphisme il suffit deacutecrire une fonction qui

permet dajouter une Forme quelconque

23 Meacutethode pour la conceptualisation dune hieacuterarchie

Nous deacutecrirons ici la meacutethode que nous avons utiliseacute Il sagit de DMT (pour Dbj ect

Modeling Technique)

26

231 Origine de la meacutethode

Cette meacutethode fut deacuteveloppeacutee principalement par James Rumbaugh (mais avec laide de

plusieurs personnes) (Rumbaugh et al 1991) en 1991 Celui-ci est principalement connu

comme eacutetant un des auteurs de la norme UML qui est devenu le scheacutema de modeacutelisation

objet standard et utiliseacute par tous les programmeurs objets (Group 1999) Il est agrave noter

que cette meacutethode est une meacutethode danalyse complegravete pour toute la dureacutee de vie du

logiciel Nous naurons par contre besoin que de la partie analyse de cette meacutethode

232 Les diffeacuterentes eacutetapes de conceptualisation

La premiegravere partie de cette meacutethode a deacutejagrave eacuteteacute effectueacutee implicitement lorsque nous

avons rechercheacute nos diagrammes relatifs du domaine Habituellement il est suggeacutereacute

deacutecrire un texte reacutesumant lensemble du domaine mais dans notre cas il est plus

approprieacute de reacutesumer notre domaine avec des diagrammes Par la suite il faut prendre

le temps de faire ressortir les diffeacuterentes classes dobjets qui font parties du domaine et

prendre le temps de bien les deacutefini~middot On eacuteliminera les classes vagues ou redondantes par

la suite

La prochaine eacutetape consiste agrave deacutefinir les diffeacuterentes associations entre les classes Par

exemple une classe Employeacute et une classe Compagnie seraient lieacutees par lassociation

travaille pour Par la suite on identifie les attributs (ou les champs) des diffeacuterentes

classes en eacutevitant les attributs dimpleacutementation Finalement on raffine le modegravele en

ajoutant lheacuteritage des classes Cela permet de simplifier significativement la hieacuterarchie

Cela fournit une hieacuterarchie complegravete de notre domaine Par contre rien ne deacutemontre

quelle est correcte Afin de la veacuterifier il suffit danalyser les diffeacuterents cas typiques de

notre problegraveme regarder le reacutesultat obtenu et relever toute erreur Dans notre cas il

sagit de coder (seulement en terme de la hieacuterarchie) les diffeacuterents diagrammes et veacuterifier

si nous consideacuterons le tout satisfaisant Par la suite nous pourrons reacuteiteacuterer le mecircme

proceacutedeacute jusquagrave obtenir satisfaction Nous serons ainsi assureacutes davoir une hieacuterarchie

27

adapteacutee agrave notre domaine et complegravete

24 Deacuteveloppement de la hieacuterarchie

Maintenant que nous avons une meacutethodologie correcte nous pouvons creacuteer notre hieacutershy

archie Le fait de sassurer de sa compleacutetude nous permettra de ne pas rencontrer de

problegravemes complexes lors de la phase dimpleacutementation du logiciel

241 Extraction des diffeacuterents concepts

Les concepts du domaine (qui se ramegravenent agrave des classes) se divisent en plusieurs cateacuteshy

gories Une des principales est le domaine des formes Une forme peut ecirctre un carreacute

un cercle etc Une autre cateacutegorie importante est formeacutee des points qui peuvent ecirctre

deacutefinis de plusieurs maniegraveres diffeacuterentes Finalement une autre section importante est

formeacutee des structures de conteneurs incluant les Canvas (pour contenir des objets) et

des Drawing (pour reacutefeacuterencer des objets)

Eacutetant donneacute le nombre relativement faible de formes distinctes il ne nous est pas apparu

utile de faire plusieurs cateacutegories de formes distinctes En effet une seacuteparation entre les

courbes fermeacutees et ouvertes peut nous permettre de factoriser un ou deux eacuteleacutements de

code sans toutefois ecirctre significatif ou reacuteellement utile (eacutetant donneacute quil nexiste pas

vraiment de forme standard deacutefinie par une courbe ouverte)

242 Eacuteleacutements particuliers

Plusieurs eacuteleacutements particuliers se sont reacuteveacuteleacutes complexes agrave modeacuteliser dans notre hieacuterarshy

chie Nous abordons ici les principales difficulteacutes rencontreacutees ainsi que les solutions pour

les reacutegler

28

Creacuteation et placement dobjets

Leacuteleacutement le plus important de notre hieacuterarchie est de pouvoir structurer les objets

que nous souhaitons positionner Nous avons donc creacuteeacute une classe Canvas Le nom est

inspireacute du mot canevas en peinture eacutetant donneacute que nous avons apposeacute des restrictions

similaires agrave ce domaine En effet nous avons deacutecideacute que lorsquun objet est placeacute dans

un canevas il ne peut ecirctre enleveacute ou modifieacute Cela nous permettra plus tard de faire

des calculs pour les points de reacutefeacuterence plus aiseacutement De plus un canevas doit pouvoir

posseacuteder des sous-canevas Pour cela il nous faut une classe geacuteneacuterale qui deacutecrit tout

eacuteleacutement pouvant ecirctre ajouteacute dans un canevas

Cela est reacutesolu avec lintroduction dune classe Shape Celle-ci repreacutesente toute forme

qui peut ecirctre dessineacutee quelle soit simple ou complexe Un Canvas est une forme afin

de sassurer de pouvoir positionner des sous-canevas Une implication particuliegravere de

notre choix est quune Shape ne possegravede pas de position Il sagit dune forme abstraite

qui peut ecirctre positionneacutee agrave un certain endroit Cela implique aussi quil est possible de

prendre une Shape et de la placer agrave plusieurs end_roits distincts Lorsquelle est ajouteacutee

dans un Canvas une Shape est copieacutee ce qui empecircche toute modification subseacutequente

de la forme

Objets multiples

Lorsquil sagit de creacuteer des diagrammes freacutequemment il est tregraves probable que plusieurs

eacuteleacutements soient similaires Par exemple si nous creacuteons un arbre avec des cercles comme

sommets il sagit toujours en quelque sorte du mecircme cercle De plus si nous creacuteons

un sous-canevas et que nous le positionnons agrave plusieurs endroits certaines formes deshy

viennent automatiquement deacutedoubleacutes Il devient donc primordial pour nous de pouvoir

reacuteutiliser un eacuteleacutement que nous avons deacutejagrave deacutefini afin deacuteviter la creacuteation agrave reacutepeacutetition

dobjets

Or nous avons deacutejagrave speacutecifieacute quil eacutetait possible de positionner plusieurs fois le mecircme

29

objet Cela est vrai mais il y a une limitation En effet ces objets ne peuvent pas ecirctre

reacutefeacuterenceacutes Si nous souhaitons connaicirctre un objet celui-ci doit pouvoir ecirctre distingueacute

dun autre Il nous faut donc une classe qui repreacutesente une forme agrave un endroit preacutecis

Pour cela nous avons creacuteeacute la classe Drawing Celle-ci permet de repreacutesenter une Shape

agrave un endroit bien preacutecis dans un canevas Cela fait toutefois que les eacuteleacutements dans un

sous-canevas multiple restent identiques Nous verrons bientocirct la solution agrave ce problegraveme

Points de reacutefeacuterence

Un des eacuteleacutements les plus complexes relevait du fait de fournir des points de reacutefeacuterence

En effet faire de simples chemins entre des coordonneacutees en valeurs absolues neacutetait pas

suffisant mecircme sil est possible dadditionner ses points La solution souhaiteacutee eacutetait de

permettre de deacutefinir des points de reacutefeacuterence ceux-ci pouvant ecirctre obtenus agrave partir de

lobjet lui-mecircme Par exemple un cercle pourrait retourner son point nord

Un eacuteleacutement fondamental causait problegraveme la fonction pour acceacuteder au point doit ecirctre

deacutefinie dans la forme (par exemple dans la classe Circle) Par contre une forme en

tant que telle ne possegravede pas de position speacutecifique Par conseacutequent son point nest

pas deacutefini non plus Pour cela il faudrait obtenir un Drawing Par contre un Drawing

ne peut pas posseacuteder la deacutefinition de chaque fonction daccegraves agrave un point pour chaque

forme Cela est contre-intuitif Il faut donc demander agrave la forme lorsquon appelle pour

obtenir un point de prendre le Drawing suppleacutementaire en paramegravetre Notre intention

est lorsque nous eacutecrirons un langage au-dessus de la hieacuterarchie de pouvoir reacutegler ce

problegraveme

Chemins de reacutefeacuterence

Finalement il nous reste un leacuteger problegraveme Nous pouvons maintenant faire une reacutefeacuteshy

rence agrave un objet disons a et obtenir un point speacutecifique de cet objet Par contre cela

nest pas suffisant dans un cas bien preacutecis Disons que a est dans le canevas b Ensuite b

est placeacute agrave deux reprises dans le canevas c obtenant deux Drawing diffeacuterents cl et c2

30

Nous ne pouvons pas acceacuteder agrave a car il est repreacutesenteacute seulement en fonction de b Pour

reacutegler le problegraveme il faut faire un chemin de reacutefeacuterence (disons cl b a dans le langage

final) Pour cela nous fournirons la possibiliteacute de partir dun Drawing et den obtenir

un autre (agrave condition quil sagisse dun Canvas naturellement) Cela va mettre agrave jour

la position relative de lobjet par rapport agrave un niveau de profondeur suppleacutementaire

En acceacutedant agrave cette fonction aussi souvent que neacutecessaire il est possible de reacutefeacuterencer

un objet peu importe son degreacute de profondeur reacuteel Cela nous permet donc de faire

des liens complexes entre nimporte quel objet (voire mecircme des objets de profondeur

diffeacuterentes)

31

CHAPITRE III

EacuteLEacuteMENTS GRAPHIQUES

Dans ce chapitre nous deacutefinissons les eacuteleacutements graphiques requis pour faire des dessins

informatiques dont les courbes de Beacutezier ainsi que les splines cubiques Les proprieacuteteacutes

importantes de ces courbes sont deacutemontreacutees De plus une preuve est fournie de la

possibiliteacute dapproximer adeacutequatement un cercle avec des splines cubiques Finalement

nous discuterons du fonctionnement des diffeacuterentes solutions informatiques en terme de

structure telles que PDF et Asymptote

Courbes et segments en informatique

Naturellement les eacuteleacutements les plus importants dans des dessins informatiques sont les

segments et les courbes Pour des besoins de simpliciteacute nous essaierons de les inteacutegrer

dans la mecircme deacutefinition en traitant les segments comme un cas particulier des courbes

Nous donnons agrave cette courbe geacuteneacuterale le nom de chemin

Le premier problegraveme lorsque nous voulons faire des courbes en informatique est la

meacutethode pour les repreacutesenter Lecirctre humain peut tracer une infiniteacute de courbes disshy

tinctes sans avoir besoin de la deacutecrire avec preacutecision Par contre lorsquon entre dans le

domaine de linformatique il faut non seulement ecirctre capable den faire une description

mais celle-ci doit ecirctre la plus petite possible

Une des meacutethodes de repreacutesentation est sous la forme de pixels (JI et Kelley 2007)

Cette meacutethode implique de repreacutesenter un plan continu par un ensemble de points disshy

32

crets appeleacutes pixels Cela permet de repreacutesenter plusieurs formes de dessins extrecircmement

complexes et est utiliseacute dans certains logiciels dimages

Une autre meacutethode est la meacutethode vectorielle Cest la plus populaire Au lieu de

repreacutesenter directement le dessin tel quil apparaicirct on fournit une description du dessin

agrave partir de quelques concepts tregraves simples (points segments et cercles par exemple)

Lorsque lutilisateur souhaite voir le dessin un logiciel traduit la description en pixels

pour leacutecran

La derniegravere meacutethode possegravede plusieurs avantages La description dun dessin est souvent

beaucoup plus compacte que si on deacutecrit le dessin pixel par pixel De plus la description

conserve la preacutecision du dessin peu importe la reacutesolution agrave laquelle il est preacutesenteacute Par

exemple si nous prenons un ensemble de pixels et quon lagrandit plusieurs fois il est

tregraves probable que nous ayons perdu beaucoup dinformations Il nous faut par contre

veacuterifier la puissance reacuteelle dune telle meacutethode Nous devons donc introduire une des

structures utiliseacutees pour la description vectorielle

32 Courbes de Beacutezier

Une courbe de Beacutezier est un concept relativement simple deacuteveloppeacute indeacutependamment

par Paul de Casteljau et Pierre Beacutezier entre 1959 et 1962 Ces deux personnes avaient

pour objectif de creacuteer des repreacutesentations par ordinateur de voitures pour les compagnies

Citroen et Renault respectivement (Jr et Kelley 2007)

321 Deacutefinition

Soit Po Pl P2 Pn E 1R2 un ensemble de points dans un plan carteacutesien typique

Ceux-ci sont appeleacutes des points de controcircle Soit t E IR et 0 lt t 1 La courbe de

Beacutezier de degreacute n des points Po agrave Pn est deacutefinie par la formule suivante

B t - n ( n

) 1 - t n-ttt

pPohmiddotPn ( ) - ~ i ( ) t (31) t=O

33

Le chemin est deacutefini pour les valeurs entre 0 et 1 de t Cette formule peut sembler

leacutegegraverement arbitraire et complexe pour une forme supposeacutement simple Une seconde

deacutefinition reacutecursive cette fois-ci simplifie beaucoup la formule

322 Deacutefinition alternative

Bp =p (32)

BpOPl Pn(t) = (1 - t)BpOPl Pn-l (t) + tBplhPn (33)

Cette deacutefinition alternative se ramegravene agrave dire quune courbe de Beacutezier est une intershy

polation lineacuteaire entre deux courbes de Beacutezier de degreacute infeacuterieur La deacutemonstration se

ramegravene agrave quelques manipulations bien simples et est laisseacutee en exercice au lecteur

Nous pouvons analyser les formules pour diffeacuterents degreacutes Par exemple une formule de

Beacutezier de degreacute 1 nest quune droite

BPoPl (t) = (1 - t)Po + tP] (34)

Alors quune courbe de degreacute 2 se ramegravene agrave une parabole

(35)

Finalement une courbe de Beacutezier cubique (de degreacute 3) fournit une courbe relativement

complexe qui commence agrave Po et termine agrave P3

--- ---

34

P P

0

P

Po - ____ _ - - P2

Po - - - - - - - - - - - - - - - - - - - - - - - shyPo P2 P3

(a) lineacuteaire (b) quadratique (c) cubique

Figure 31 Courbes de Beacutezier lineacuteaire quadratique et cubique

Eacutevidemment il ny a pas davantages significatifs agrave utiliser une courbe de Beacutezier lineacuteaire

Les courbes de Beacutezier quadratique sont quant agrave elles utiliseacutees lors de la geacuteneacuteration

de police TrueType (Apple Computer Inc 1996) Finalement les courbes de Beacutezier

cubiques sont utiliseacutees dans Postscript (Adobe Systems Incorporated 2010a) et dans la

plupart des produits Jb1EX tel que Metafont (Knuth 1986) Ces logiciels utilisent en

fait une combinaison de courbes de Beacutezier appeleacutees splines que nous verrons dans la

section suivante

323 Proprieacuteteacutes dune courbe de Beacutezier

En regardant les diffeacuterentes courbes nous pouvons aiseacutement voir quelques proprieacuteteacutes

Entre autres il y a interpolation des points de deacutepart et de fin Cela peut se deacutemontrer

aiseacutement en calculant B(uuml) et B(l) qui donne respectivement Po et Pn De plus les

autres points ne semblent pas ecirctre interpoleacutes Il sagit ici dun cas geacuteneacuteral (les points

peuvent ecirctre interpoleacutes sils sont colineacuteaires)

Une autre proprieacuteteacute inteacuteressante des courbes de Beacutezier est son invariance par transforshy

mation affine Cela se ramegravene au theacuteoregraveme suivant Dans le cadre de ce theacuteoregraveme nous

devrons transformer les coordonneacutees des points de controcircles des courbes de Beacutezier en

coordonneacutees projectives homogegravenes Ceci se ramegravene agrave rajouter un axe agrave chacun de nos

points dont la valeur sera toujours 1

35

Theacuteoregraveme dinvariance affine

Soit BpOPl Pn(t) une courbe de Beacutezier Soit M une matrice 3 par 3 repTeacutesentant une

transformation affine Alors on a que la courbe est invari(Lnte par lapplication de M

cest-agrave-dire MBpoPlPn(t) = BMPolvIPl lvIPn(t)

Pour le prouver il suffit de deacutevelopper la formule

NI BpoP1Pn (t) = M t (~) (1 - tt-ieuml Pi 1=0

= tM(~) (1- tt-itiPi 1=0

= t (~) (1- t)n-iti(MPi ) 1=0

Ce theacuteoregraveme implique que pour transformer une courbe de 8eacutezier il suffit dappliquer la

transformation agrave chaque point de controcircle et de calculer une nouvelle courbe de 8eacutezier

Donc une courbe de Beacutezier est entiegraverement deacutefinie par ses points de controcircle Cela fait

quelle est tregraves pratique en informatique car elle ne requiert que peu despace pour la

deacutefinir (ie seulement les n + 1 points de controcircle) De plus il est tregraves simple de geacuteneacuterer

une courbe de Beacutezier car il suffit dutiliser la formule pour autant de valeurs de t que

nous avons besoin de preacutecision dans la courbe En conservant linformation avec cette

meacutethode nous conservons une courbe sans aucune perte dinformation Cela signifie que

nous pouvons agrandir la reacutesolution de la courbe autant que nous le souhaitons et il

sagira toujours dune belle ligne courbe Cette proprieacuteteacute est extrecircmement inteacuteressante

en informatique

36

324 Deacutesavantages des courbes de Beacutezier

Les courbes de Beacutezier sont utiliseacutees dans beaucoup de domaines Par contre elles

possegravedent quelques deacutesavantages peu inteacuteressants Le plus important est probablement

labsence de controcircle local Cela sexprime par le fait que degraves que lon souhaite modifier

une courbe de Beacutezier agrave un endroit particulier tout le reste de la courbe est modifieacute au

passage Cela se deacutemontre par le fait que si 0 lt t lt 1 on a alors que

Cela implique que chaque point de controcircle de la courbe de Beacutezier a une influence (aussi

minime soit-elle) sur lensemble de la courbe Le reacutesultat est que les courbes de Beacutezier

seules sont difficiles agrave utiliser et longues agrave eacutevaluer si on utilise trop de points de controcircle

33 Splines cubiques

La solution agrave ce problegraveme est lutilisation de splines cubiques Lideacutee de base dune spline

est que si une seule courbe cause trop de problegravemes il est probablement mieux dutiliser

plusieurs courbes mais qui fonctionnent seulement dans un domaine plus petit Plus

formellement une spline cubique (aussi appeleacute B-spline cubique) est composeacute de

- un ensemble de valeurs ti pour 0 S i S m - 1 ougrave m repreacutesente le nombre de noeuds

On appelle aussi ces valeurs le vecteur de noeud Les t forment une suite monotone

croissante et sont tous des valeurs reacuteelles entre 0 et l

- L + l points de controcircle

- Une valeur entiegravere n qui repreacutesente lordre de la fonction B-sp1ine Une spline doit

respecter la condition n S m - 2

On deacutefinit une spline par la fonction suivante

37

m-n-2

S(t) = L Pibin(t) tE [01] i=O

ou dans le cas speacutecifique dune spline de degreacute 3

3

S(t) = L Pi bi 3(t) tE [01] i=O

Les bin repreacutesentent les bases de la B-spline (pour Basis Spline) Celles-ci sont deacutefinies

par la fonction reacutecursive suivante

bjoU) ~ sinon

Il sagit dune eacutequation complexe et nous ne nous y attarderons pas trop Quelques

deacutetails sont inteacuteressants agrave noter Entre autre il est inteacuteressant de constater que si lon

utilise n + 1 points de controcircle et que les noeuds sont n noeuds valant zeacutero et n noeuds

valant 1 le B-spline deacutegeacutenegravere en une courbe de Beurozier Il sagit donc dune extension

des capaciteacutes des courbes de Beacutezier

Le problegraveme principal eacutevoqueacute par les courbes de Beacutezier est que lutilisateur lors de

la creacuteation dune courbe manquait de controcircle local Il serait donc inteacuteressant que les

B-splines nous permettent de reacutegler ce problegraveme Lorsquon regarde la deacutefinition de la

base bi on remarque que celle-ci se ramegravene toujours au cas de base qui peut ecirctre aou

1 selon que nous sommes dans un domaine restreint ou non Comme il sagit du seul

facteur de Pi il est naturel daffirmer que le controcirc~e est plus localiseacute quavant Dautres

proprieacuteteacutes inteacuteressantes sont

- Pour tout t la somme de tout les bi(t) est 1

38

C5 C4 C3 -----~---- ----~-----

-----~---- ----~-----

Cg ClO Cn

Figure 32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier

- Un B-spline dordre m sera neacutecessairement Cm - 2 cest-agrave-dire quelle possegravede 2 ordres

de deacuteriyeacutees continues pour son domaine de deacutefinition _

- Tout comme les courbes de Beacutezier les B-splines sont invariants par transformation

affine On peut donc appliquer une courbe en appliquant tout simplement la transshy

formation sur les points de controcircle et en calculant le nouveau B-spline

34 Le cas dun cercle

Avec les outils que nous posseacutedons nous ne sommes pas en capaciteacute de dessiner un

cercle exact Cela nest pas grave eacutetant donneacute que nous pouvons tout de mecircme tenter de

lapproximer Pour ce faire nous utiliserons une spline cubique posseacutedant quatre points

(est nord ouest et sud respectivement) Chaque courbe de Beacute7i~r sera donc identique

aux autres agrave une rotation pregraves Il reste donc agrave deacuteterminer les points de controcircle agrave utiliser

Pour cela prenons le premier quadrant du cercle Nous passons du point Cl (10) agrave

C4 (0 1) Il nous faut deacuteterminer deux points de controcircle C2 et C3 Pour commencer

39

nous pouvons supposer de maniegravere tout agrave fait arbitraire que C2 se situe sur la tangente

de Cl et C3 sur la tangente de C4 Cela nous donne donc le scheacutema suivant

C4 C3 ----- ----~-----

1

1

1

1

TC2 1

1

1

i

Figure 33 Quart de cercle approximeacute par une courbe de Beacutezier

On a donc C2(1 k) et C3(k 1) ougrave k est une variable agrave deacuteterminer Afin de la deacuteterminer

nous devons donner une information suppleacutementaire Par exemple nous pouvons preacuteshy

supposer que le point agrave 45 degreacutes C(O5) doit ecirctre eacutevalueacute exactement par la courbe de

Beacutezier cest-agrave-dire C(O5) = (1 1) Nous obtenons donc la restriction

C(uuml5) = (1 - t)3CI + 3(1 - t)2tC2 + 3(1 - t)t2C3 + t3C4

1 3 3 1 = -Cl + -C2 + -C3 + -C4

8 8 8 8

ce qui nous permet dobtenir leacutegaliteacute

v2v2 1 3 3 1 (- -) = -Cl + -C2 + -C3 + -C4 (37)22 8 8 8 8

ce qui nous fournit apregraves substitution des valeurs des points deux fois leacutequation

v2 1 3k-=-+- (38)2 2 8

40

ce qui nous fournit apregraves reacutesolution

k = ~(J2 - 1) 0552285

Cela nous fournit donc une courbe de Beacutezier qui approxime notre cercle Il reste agrave voir

la preacutecision de cette approximation

Pour ce faire nous devrons comparer larc de cercle que nous venons de creacuteer agrave un cercle

reacuteel Afin dy arriver nous consideacutererons chaque valeur de notre arc comme eacutetant un

vecteur dont nous devrons calculer la longueur Plus cette longueur est proche de 1

plus nous avons une estimation reacutealiste Nous calculons donc

Par la suite une analyse des deacuteriveacutees nous permet de conclure que cette fonction dans

lintervalle t E [01] possegravede des m(iximu_ms agrave _t = 0 agrave tr~is reprises _(au deacutebut et agrave la

fin eacutetant donneacute la proprieacuteteacute naturelle des courbes de Beacutezier celle au milieu est due agrave

notre contrainte) Finalement elle possegravede deux (2) minimums agrave t = 0211 et t = 0789

et lerreur avec un cercle standard est de 0000273 Une telle variation sur un cercle

de rayon 1 est minime Il sagit dune variation maximale infeacuterieure agrave 003 Cela

signifie donc pour un cercle posseacutedant un rayon de 4000 pixels il y aura une variation

maximale de 12 pixels ce qui est indeacutetectable pour la taille du cercle Cela en fait une

bonne estimation pour cette section du cercle Nous pouvons naturellement suivre le

mecircme raisonnement pour les sections restantes

Il est aussi agrave noter que notre estimation nest pas la meilleure Notre choix de demander

leacutegaliteacute agrave 45 degreacutes est arbitraire et toute lerreur se retrouve dans le cocircteacute neacutegatif De

meilleures estimations ont eacuteteacute effectueacutees (Riskus 2006) avec des reacutesultats amenant une

preacutecision jusquagrave 25 plus grande (Lancaster 2005)

41

0--------------r--7T-----------------rl 08 (1

-000005

-000010

-000015

-000020

-000025

Figure 34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence

35 Structures informatiques dans les solutions deacutejagrave existantes

Maintenant que nous savons comment fonctionne les diffeacuterents modes de repreacutesentation

des dessins en informatique il faut analyser plus en deacutetail comment fonctionne les

logiciels dont nous allons nous servir En effet il nous faudra adapter nos structures de

bas niveau agrave celles disponibles dans les langages dont nous nous servirons Pour cela

nous allons analyser deux parties distinctes un format de fichier (PDF) ainsi quun

42

langage intermeacutediaire (Asymptote)

351 Postscript et PDF

En premier lieu il convient de comprendre comment fonctionne le format de fichier final

que nous utiliserons ]1EX permet de geacuteneacuterer plusieurs formats de fichier diffeacuterents

Pendant longtemps le plus populaire aura eacuteteacute Postscript creacuteeacute par Adobe Systems Cela

eacutetait principalement lieacute aux imprimantes qui fonctionnaient directement avec ce format

De nos jours le format PDF est beaucoup plus populaire bien quayant une base tregraves

proche de celle de Postscript

Postscript a eacuteteacute inventeacute par John Warnock et Charles Geschke en 1982 (Adobe Systems

Incorporated 1994) Lorsquil a eacuteteacute creacuteeacute il servait agrave faire la description de pages pour

impression Il se distingue comme eacutetant un langage de programmation complet mais

rarement utiliseacute directement En effet Postscript est difficile agrave utiliser car il utilise la

notation polonaise inverse Par exemple on exprime lappel de fonction j(a b c) de la

faccedilon suivante

abc f

Cette meacutethode rend lanalyse dun programme extrecircmement rapide et convivial pour

le logiciel qui linterpregravete car celui-ci est directement lieacute agrave la structure dune pile

dexeacutecution Par contre lanalyse dun tel programme par un humain est complexe

La plupart du temps Postscript eacutetait donc utiliseacute comme un langage de description

final pour un fichier

Il existait deux types de structures utiliseacutes en Postscript pour mettre des dessins sur une

page Le premier eacutetait lajout de texte Cela est intrinsegravequement lieacute agrave la description des

polices qui deacutepasse le cadre de ce meacutemoire Par contre pour faire un dessin quelconque

le format utilisait les chemins qui sont deacutecrits soit par des segments soit par des courbes

de Beacutezier cubiques On note donc le deacutesavantage de lutilisation dune courbe de Beacutezier

soit labsence de controcircle local

43

Quant agrave lui PDF a eacuteteacute creacuteeacute en 1993 (Adobe Systems Incorporated 2010b) Agrave travers les

gains de populariteacute le format PDF est devenue en 2008 un standard ISO (International

Organization for Standardization 2008) Cela en fait donc un format de document

standard extrecircmement inteacuteressant Alors que Postscript a eacuteteacute creacuteeacute pour des documents

qui devaient ecirctre imprimeacutes PDF a eacuteteacute conccedilu pour la description de documents plus

dynamiques cest-agrave-dire la possibiliteacute dajouter des eacuteleacutements multimeacutedias au document

Aussi il est possible de deacutecrire chaque page indeacutependamment des suivantes En effet

comme Postscript deacutecrivait des documents dimpression il est normal de connaicirctre la

page de deacutepart avant dimprimer la suivante En PDF chaque page est totalement

indeacutependante du reste du document

Pour la description deacuteleacutements graphiques les structures de base sont essentiellement

les mecircmes que Postscript Quelques eacuteleacutements comme la transparence cest-agrave-dire quun

eacuteleacutement cacheacute par un autre eacuteleacutement contribue au reacutesultat final ont eacuteteacute ajouteacutes mais les

eacuteleacutements graphiques de bas niveau sont identiques

352 Asymptote

Comme nous lavons dit preacuteceacutedemment tout ramener agrave des courbes de Beacutezier creacutee un

problegraveme de controcircle local des courbes Il faut donc utiliser une meacutethode pour donner

du controcircle agrave lutilisateur Pour cela nous utiliserons Asymptote Les structures de

bas niveau de Asymptote sont identiques agrave celles de PDF eacutetant donneacute quil convertit

directement les chemins Asymptote en chemins PDF Par contre Asymptote impleacutemente

un algorithme (Bowman 2007) originellement deacuteveloppeacute par Donald Knuth qui permet

de deacutecrire un chemin en fonction des points par lesquels il passe Asymptote utilise donc

des splines cubiques (qui ne sont pas neacutecessairement des B-splines toutefois)

Cet algorithme est complexe et en dehors du cadre de ce meacutemoire mais peut ecirctre

reacutesumeacute comme eacutetant un algorithme de choix des points de controcircle En effet une courbe

de Beacutezier cubique est deacutefinie par 4 points Le premier et le dernier sont interpoleacutes de

maniegravere exacte Ce que lalgorithme fait est quil prend un ensemble de points qui

44

seront tous interpoleacutes disons Pl P2 P3 P4 Ensuite pour chaque paire conseacutecutive de

points (donc (Pl P2 ) (P2 P3) et (P3 P4)) il geacuteneacuterera une courbe de Beacutezier cubique

La partie la plus importante de lalgorithme consiste agrave prendre toutes les informations

fournies par lutilisateur (les points de controcircle ainsi que des options qui deacutefinissent la

courbe comme les deacuteriveacutees agrave certains endroits ou des informations comme la tension qui

laisse lalgorithme calculer lui-mecircme les deacuteriveacutees agrave partir dun indice reacuteel simple) afin de

calculer pour chaque courbe de Beacutezier cubique les deux points de controcircle manquants

En laissant agrave lutilisateur le pouvoir de deacutecider seulement les points ougrave la courbe passe

le travail est simplifieacute mais permet tout de mecircme de terminer avec un ensemble de

courbes de Beacutezier

CHAPITRE IV

THEacuteORIE DES LANGAGES INFORMATIQUES

La creacuteation dun langage de programmation nest pas une mince tacircche Il faut donc

sassurer de le construire sur des bases theacuteoriques solides Nous preacutesenterons ici les

eacuteleacutements theacuteoriques importants de la theacuteorie des langages ainsi que leurs applications

dans le domaine de la compilation Nous preacutesenterons aussi loutil SableCC que nous

avons utiliseacute dans le cadre de notre langage ainsi quun bref exposeacute sur les langages

reacuteflexifs

La theacuteorie des langages est un sujet vaste et extrecircmement complexe Un meacutemoire comshy

plet pourrait ecirctre reacutedigeacute seulement sur les aspects theacuteoriques des automates reacuteguliers

Afin de compresser tout ce contenu dans un seul chapitre les eacuteleacutements seront mentionneacutes

sans preuve Nous recommandons toutefois au lecteur curieux et assidu de consulter les

reacutefeacuterences de ce chapitre pour des preuves et une couverture plus complegravete du sujet

41 Theacuteorie des langages et automates

Dans un premier temps nous devrons deacuteterminer ce quest formellement un langage

Par la suite nous analyserons une structure de donneacutees qui est intimement lieacutee agrave ce

sujet les automates

46

411 Les eacuteleacutements de base dun langage (Aho Sethi et Ullman 1986)

Alphabet et lettre

Un alphabet est un ensemble (au sens matheacutematique du mot) de symboles appeleacutes

lettres Un alphabet est fini et non-vide Par exemple lalphabet latin standard ainsi

que lensemble O I constituent des alphabets

Mot

Un mot dun alphabet A peut ecirctre un des trois cas suivants

- le mot vide euro formeacute daucune lettre

- une lettre de lalphabet A

- Toute suite finie de lettres aOal an ougrave chaque ai fait partie de lalphabet A

Il est agrave noter que les deux premiers sont en fait des cas speacutecifiques du dernier bien quils

sont souvent seacutepareacutes pour raison de clarteacute Dans le dernier cas on dit que les caractegraveres

sont lieacutes par lopeacuteration de concateacutenation

Langage

Un langage au sens le plus geacuteneacuteral possible est un ensemble de mots Celui-ci peut ecirctre

fini ou infini La plupart des exemples inteacuteressants (un langage de programmation par

exemple) est un langage infini En effet il existe une infiniteacute de programmes diffeacuterents

tout comme il existe une infiniteacute de nombres binaires

412 Exp esson reacutegnli r

Les expressions reacuteguliegraveres forment un outil de travail extrecircmement important en inshy

formatique De nombreux outils ainsi que certains langages (grep perl ) leurs sont

consacreacutes

47

On peut reacutesumer les expressions reacuteguliegraveres comme eacutetant une meacutethode afin de deacutecrire

un langage infini par une expression fini On utilisera dans la construction certaines

opeacuterations qui nous donneront des proprieacuteteacutes inteacuteressantes pour le langage final Tout

mot qui peut ecirctre construit agrave partir de ces regravegles fait automatiquement partie du langage

Constantes

Leacuteleacutement de base dune expression reacuteguliegravere est une constante Celle-ci est deacutefinie agrave

partir dune lettre de lalphabet et deacutefinit un seul mot la constante elle-mecircme Par

conseacutequent lexpression reacuteguliegravere a de lalphabet ab repreacutesente le langage a Il est

agrave noter que nous pouvons aussi utiliser le mot vide comme une constante repreacutesentant

lensemble vide

Concateacutenation

Lopeacuteration de concateacutenation est une opeacuteration sur les mots qui permet de creacuteer des

expressions reacuteguliegraveres plus longues agrave partir de deux expressions reacuteguliegraveres valides Le

reacutesultat de lexpression reacuteguliegravere A concateacuteneacutee agrave B est donc nimporte quel mot de A

concateacuteneacute agrave nimporte quel mot de B Par exemple ab est une expression reacuteguliegravere qui

repreacutesente un langage agrave un mot ab

Union

Lunion des expressions reacuteguliegraveres est une opeacuteration qui correspond agrave lunion ensemshy

bliste Lors de lunion de A et de B (deacutefini comme (AIB)) nous pouvons choisir nimshy

porte quel eacuteleacutement de A ou de B comme un mot valide Par exemple (alb)b repreacutesente

le langage contenant deux mots ab bb

Fermeture de Kleene

La fermeture de Kleene est une opeacuteration beaucoup plus inteacuteressante Celle-ci utilise

une expression reacuteguliegravere A Le reacutesultat de la fermeture noteacute A est la concateacutenation

48

dun nombre fini deacuteleacutements de A avec possibiliteacute de reacutepeacutetitions Par exemples pour

ab toute chaicircne de a finie possiblement de longueur zeacutero suivie dun b fait partie du

langage Lexpression reacuteguliegravere (alb) repreacutesente nimporte quelle chaicircne finie de a ou de

b

Les langages que nous pouvons geacuteneacuterer avec des expressions reacuteguliegraveres sont assez riches

bien quinsuffisants pour geacuteneacuterer un langage de programmation (Aho Sethi et Ullman

1986)

413 Automates

Avant de pouvoir expliquer agrave quoi servent les expressions reacuteguliegraveres nous devons discuter

des automates une structure dune importance cruciale en informatique

Automate fini

yn automate fini (Ullman Hopcroft et Motwani 1~79) est un quintuplet composeacute de

cinq eacuteleacutements

- Un ensemble fini deacutetats E

- Un alphabet fini A

- Un ou plusieurs eacutetats de deacutepart d (selon que lautomate est deacuteterministe ou non)

- Un ensemble deacutetats dit finaux F

- Une relation de transition T ccedil E x A x E Cela deacutefinit une maniegravere de passer dun

eacutetat agrave un autre lors de lapparition dun symbole speacutecifique

On repreacutesente en geacuteneacuteral un automate par un graphe avec des flegraveches nommeacutees Les

flegraveches repreacutesentent la relation de transition alors que les sommets repreacutesentent les

eacutetats dans E On repreacutesente un eacutetat initial par une flegraveche qui ne part pas dun eacutetat

Finalement on repreacutesente un eacutetat final par un cercle double Par exemple lautomate

suivant accepte lensemble des mots qui sont composeacutes dune seacuterie de a (possiblement

nulle) suivi dun b Donc les mots b ab et aab serait des mots valides par rapport agrave

49

cet automate

Figure 41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b

Lensemble T peut prendre plusieurs formes en fonction du deacuteterminisme de lautomate

comme nous allons maintenant le voir

Automate non-deacuteterministe

Un automate non-deacuteterministe peut posseacuteder plusieurs eacutetats de deacutepart De plus son

ensemble de transitions T est quelconque Il peut donc exister pour un eacutetat e et un

symbole a plusieurs eacutetats e tels que (e a e) E T

Un automate non-deacuteterministe peut ecirctre vu comme une forme de graphe dans lequel on

peut se promener en utilisant certaines transitions La suite des symboles des transitions

que nous utilisons forment un mot Lensemble des mots obtenus par une suite de transhy

sitions allant dun eacutetat initial agrave un eacutetat final constitue le langage de lautomate Dans

un automate non-deacuteterministe il peut neacuteanmoins exister pour le mecircme mot plusieurs

chemins diffeacuterents deacutebutant dans un eacutetat initial Il est important de noter quun mot

est accepteacute degraves quun de ces chemins se termine dans un eacutetat final

Automate deacuteterministe

Un automate non-deacuteterministe nous permet de creacuteer des langages mais le fait davoir

plus dun choix pour le mecircme symbole peut sembler inquieacutetant surtout lorsquil sagit

dinformatique Nous pouvons donc deacutefinir un automate deacuteterministe plus simple Celuishy

50

ci possegravede un seul eacutetat de deacutepart et son ensemble de transitions T assure que pour

chaque symbole il ny a quun seul eacutetat suivant possible Il ny a donc pour chaque mot

quun seul chemin possible agrave partir de leacutetat initial Plus formellement lautomate sera

deacuteterministe si pour tout e E E et a E A il y a un seul e E E tel que (e a e) ET

Le reacuteflexe naturel serait de croire quen enlevant le non-deacuteterminisme dun automate

celui-ci devient beaucoup moins puissant permettant de repreacutesenter beaucoup moins

de langages Or il nen est rien Il a eacuteteacute prouveacute (malheureusement en trop de pages

pour ce meacutemoire) que nimporte quel automate non-deacuteterministe peut ecirctre rameneacute agrave

un automate deacuteterministe quitte agrave voir le nombre deacutetats de lautomate augmenter

exponentiellement Nous pouvons donc toujours creacuteer un automate non-deacuteterministe et

laisser la tacircche agrave un ordinateur de creacuteer un automate deacuteterministe agrave partir de celui-ci

(Ullman Hopcroft et Motwani 1979)

Exeacutecution dun automate et contraintes temporelles

La meacutethode dexeacutecution dun automate deacuteterministe est assez simple Nous lui fournisshy

sons un mot dune certaine longueur disons n Nous deacutemarrons de leacutetat initial et chaque

lettre repreacutesente un choix agrave faire dans lautomate Comme lautomate est deacuteterministe

il ny a quune possibiliteacute agrave explorer Si nous ne pouvons plus avancer avant la fin du

mot celui-ci ne fait pas partie du langage de lautomate Si nous parvenons agrave avancer

jusquau bout et que nous ne sommes pas dans un eacutetat final il nen fait pas partie non

plus Par contre si leacutetat est final nous avons trouveacute un mot du langage Co me le mot

possegravede n lettres nous aurons au maximum n choix agrave faire rendant lalgorithme dapshy

partenance agrave un temps dexeacutecution lineacuteaire Un algorithme lineacuteaire est naturellement

extrecircmement inteacuteressant en informatique car nous voulons un programme qui sexeacutecute

dans un temps raisonnable

51

414 Lien entre langage reacutegulier et automate fini

Nous connaissons donc maintenant deux meacutethodes pour creacuteer un langage Les expresshy

sions reacuteguliegraveres ainsi que les automates Un automate est difficile agrave concevoir pour un

ecirctre humain mais extrecircmement rapide dutilisation par un ordinateur Une expression

reacuteguliegravere est complexe pour un ordinateur mais aiseacutee agrave concevoir par un ecirctre humain Il

nous faut donc voir si nous pouvons obtenir des proprieacuteteacutes communes agrave ces deux outils

Le lien

Il existe en effet un lien qui unit ces deux structures Celui-ci est extrecircmement fort

lensemble des langages quil est possible de geacuteneacuterer avec des expressions reacuteguliegraveres est

exactement le mecircme ensemble que ceux qui peuvent ecirctre geacuteneacutereacutes par un automate fini

deacuteterministe Cela implique que pour chaque expression reacuteguliegravere nous pouvons troushy

ver un automate qui repreacutesente le mecircme langage Cela est vrai aussi en sens inverse

Par contre il ne sagit pas dune bijection car plusieurs expressions reacuteguliegraveres peuvent

correspondre au mecircme automate (par exemple a et aamiddot) Il existe un algorithme permetshy

tant de transformer une expression reacuteguliegravere en automate mais celui-ci est complexe et

deacutepasse le cadre de ce meacutemoire Nous pouvons toutefois mentionner que cet algorithme

est relativement lent (sexeacutecute en O(2m ) ou m est la longueur de lexpression reacuteguliegravere)

mais permet par la suite de trouver si un mot fait partie dun langage en temps lineacuteaire

(McNaughton et Yamada 1960)

Importance dun tel lien

Ce lien est un eacuteleacutement crucial dans la capaciteacute dun ordinateur agrave travailler avec des lanshy

gages de programmation En effet cela permet aux creacuteateurs de langages de deacutecrire des

mots agrave partir dexpressions reacuteguliegraveres (quils comprennent) et de laisser un programme

creacuteer des automates qui peuvent reconnaicirctre ces symboles (un if ou un for mais aussi

des variables) dans des programmes Cela permet donc de creacuteer une partie importante

dun langage quon appelle lanalyse lexicale Cela permet agrave partir de lutilisation de

52

lautomate creacuteeacute par des expressions reacuteguliegraveres de transformer un texte en une suite de

symboles plus speacutecifiques Par exemple le texte

if a 1 then true else faIse

pourrait ecirctre traduit par la suite de symboles suivants

IF VAR EQ NUM THEN BD DL ELSE BDDL FININSTR

Cette eacutetape lanalyse lexicale est cruciale agrave la suite de lanalyse dun programme Les

automates nous sont toutefois utiles non seulement pour les mots cleacutes mais aussi pour

des eacuteleacutements plus complexes comme des variables Une variable est souvent identifieacutee

comme eacutetant une lettre suivie dune suite de caractegraveres quelconques (sauf exception tel

quun espace)

Malgreacute tout il existe certains eacuteleacutements quun automate ne peut reconnaicirctre Un exemple

classique est le parentheacutesage eacutequilibreacute (une suite de parenthegraveses telle que c~aque pashy

renthegravese ouvrante est associeacute agrave une parenthegravese fermante et agrave nimporte quel moment il

nexiste pas plus de fermantes que douvrantes) Il est en effet impossible aux automates

de faire le lien entre les deux types de parenthegraveses (Ullman Hopcroft et Motwani 1979)

Pour cela il nous faudra utiliser des structures plus complexes

42 Grammaires

Ces structures sont les grammaires Il est possible de les voir comme eacutetant une forme

beaucoup plus geacuteneacuterale des expressions reacuteguliegraveres Avec cette structure nous pourrons

nous assurer quun programme est bien formeacute cest-agrave-dire creacuteer un arbre repreacutesentant

la structure dun programme un peu comme la structure dune phrase

421 Deacutefinition dune grammaire formelle

Une grammaire est constitueacutee de quatre eacuteleacutements

53

- Un ensemble fini de terminaux Ceux-ci sont des symboles repreacutesentant les lettres

dun langage Par conseacutequent on peut aussi appeler les terminaux lalphabet dune

grammaire

- Un ensemble fini de non-terminaux Habituellement repreacutesenteacute par des majuscules

(par des symboles diffeacuterents des terminaux) pour des raisons de clarteacute ceux-ci repreacuteshy

sentent des eacutetats intermeacutediaires de la grammaire

- Un non-terminal de deacutepart parmi lensemble deacutecrit plus haut

- Un ensemble de regravegles de production Celles-ci vont varier selon la cateacutegorie de langage

choisie mais de maniegravere geacuteneacuterale une regravegle de production est une paire ordonneacutee

dont chaque eacuteleacutement est composeacute dune suite de terminaux et de non-terminaux (par

exemple aB -t aAa)

Le fait de repreacutesenter une regravegle de production avec une flegraveche permet den expliciter le

rocircle transformer une suite de caractegraveres en une autre Lutilisation dune grammaire

consiste donc agrave deacutemarrer avec le non-terminal de deacutepart puis dappliquer une suite de

regravegles de production pour modifier le non-termina Lorsquon obtient un mot formeacute

uniquement de terminaux il sagit dun mot du langage repreacutesenteacute par la grammaire

Par exemple

S -gt aA

A -gt b

repreacutesente un langage contenant le seul mot ab On applique doEn effet unc un proceacutedeacute

de deacuterivation (en appliquant chaque regravegle) Par exemple une deacuterivation possible du mot

ab dans ce contexte (la seule dailleurs) est la suite suivante

S (deacutepart)

S -gt aA (application de S -gt aA)

aA -gt ab (application de A -gt b)

54

422 Hieacuterarchie de Chomsky

La deacutefinition que nOlis avons donneacutee preacuteceacutedemment dun langage est beaucoup trop

geacuteneacuterale pour nous fournir des proprieacuteteacutes inteacuteressantes Afin de deacutegager des proprieacuteteacutes

inteacuteressantes nous deacutefinissons plusieurs cateacutegories Plusieurs noms sont utiliseacutes pour

chaque cateacutegorie mais nous nous limiterons agrave utiliser ceux deacutefinis par le linguiste Noam

Chomsky (Chomsky 1956) Chacune de ces cateacutegories sera deacutecrite par les proprieacuteteacutes de

sa grammaire Il est agrave noter que nous avons neacutegligeacute certaines cateacutegories de langages qui

ne sont pas lieacutees au domaine

Langage reacutegulier

Un langage reacutegulier est eacutequivalent aux expressions reacuteguliegraveres Les regravegles de production

de la grammaire doivent ecirctre de la forme

A -) Ba

A -) a

ou

A -) aB

A -) a

avec A et B des non-terminaux et a un termina Il est agrave noter que toutes les regravegles

dune grammaire doivent ecirctre soit du premier cas soit du deuxiegraveme cas On les appelle

reacutecursives agrave gauche ou agrave droite respectivement

Langage non-contextuel

Un langage non-contextuel est un peu plus complexe quun langage reacutegulier Les regravegles

de production de la grammaire doivent ecirctre de la forme

55

A -) B

avec A un non-terminal et B une suite de terminaux et de non-terminaux Le deacutetail

le plus important est de noter que les langages non-contextuels permettent de creacuteer un

systegraveme de parenthegraveses eacutequilibreacutees En effet voici une grammaire qui accepte seulement

un parentheacutesage eacutequilibreacute

P -) pp

P -) CP)

P -)

Il est eacutevident quune grammaire reacuteguliegravere ne peut geacuteneacuterer ce genre de langage Par contre

un parentheacutesage eacutequilibreacute est extrecircmement important dans le domaine de la compilashy

tion afin dexprimer clairement les ideacutees dun programmeur et plus speacutecifiquement

permettre deacutecrire des formules matheacutematiques complexes compreacutehensibles par lOlmiddotdishy

nateur

Langage contextuel

Les langages contextuels ne sont pas utiliseacutes en geacuteneacuteral en compilation car ils sont

beaucoup plus lents Les regravegles de production de la grammaire doivent ecirctre de la forme

ABC -) ADC

ougrave B est un non-terminal A et C sont des non-terminaux ou le mot vide et D est un

non-terminal (mais pas le mot vide) On voit clairement ici dougrave vient le nom de ce type

de langage B est transformeacute en fonction de ce qui est autour de lui (son contexte)

423 Utiliteacute dans les langages de programmation

La prochaine tacircche dans la creacuteation dun langage est danalyser la structure de notre

programme Pour effectuer cette tacircche nous pouvons utiliser une grammaire non-conshy

56

textuelle Agrave cette fin nous pouvons nous assurer que les eacutequations sont correctement

formeacutees que les instructions sont valides etc

Dans un autre ordre dideacutee la hieacuterarchie de Chomsky possegravede aussi des liens avec les

machines de Turing qui sont elles-mecircmes intimement lieacutees agrave la theacuteorie de la complexiteacute

(Davis Sigal et Weyuker 1994) Ce domaine est extrecircmement vaste et le lecteur pourra

trouver dans les reacutefeacuterences plusieurs excellents ouvrages pour sinitier agrave ce domaine (Dhu

et Ko 2000)

43 SableCC

Bien quil est tregraves inteacuteressant deacutetudier les algorithmes de compilation limpleacutementation

de chacun de ces algorithmes deacutepasse largement le cadre de ce meacutemoire Il nous faut

donc trouver une meacutethode afin de creacuteer notre langage de programmation Plusieurs

outils soffrent agrave nous mais notre choix sarrecirctera sur SableCC

431 Quest-ce que S~bleCC

SabieCC est ce quon appelle un compilateur de compilateurs (Gagnon 1998) Un comshy

pilateur de compilateurs est un programme qui permet agrave partir dune deacutefinition absshy

traite dun langage de programmation dobtenir un compilateur pour ce langage Plus

speacutecifiquement le programme reacutesultant nous permettra dobtenir larbre syntaxique

dun programme ce qui nous permettra de lanalyser reacutecursivement et de lexeacutecuter (ou

bien de le transformer dans un langage diffeacuterent selon le cas) Les formes abstraites que

requiert un compilateur de compilateurs sont justement les expressions reacuteguliegraveres (pour

deacutecouvrir les symboles) et les grammaires non-contextuelles (pour lanalyse syntaxique

des symboles obtenus preacuteceacutedemment)

432 Avantages de SableCC

Bien que SabieCC nest pas le compilateur de compilateurs le plus connu il possegravede

plusieurs aspects inteacuteressants Premiegraverement comparativement agrave ses compeacutetiteurs plus

57

acircgeacutes SabieCC est eacutecrit dans un paradigme orienteacute-objet Cela rend le compilateur beaushy

coup plus simple agrave utiliser De plus le logiciel geacutenegravere automatiquement un ensemble de

classes (dans un choix de plusieurs langages) qui permet de traiter aiseacutement et claishy

rement avec des concepts modernes les arbres syntaxiques reacutesultant de lanalyse du

programme

44 Langage reacuteflexif

Finalement une fois que nous avons obtenu un arbre syntaxique et que nous savons que

notre langage est bien formeacute il nous reste la reacuteflexiviteacute agrave prendre en compte En effet

nous ne voulons pas reacuteeacutecrire inutilement dans notre langage chaque fonction qui existe

deacutejagrave en Java Nous pourrons les utiliser avec un langage reacuteflexif Une autre possibiliteacute

dun langage reacuteflexif est de deacuteleacuteguer agrave SDDL la creacuteation de classes Cela permet agrave lutilishy

sateur de reacutefeacuterencer nimporte quelle classe Java sans avoir agrave changer le code de SDDL

lui-mecircme Cela serait impossible sans un langage reacuteflexif

441 Deacutefinition dun langage reacuteflexif

Un langage reacuteflexif (Sobel et Friedman 1996) est un langage qui est capable soit de

- Examiner son eacutetat cette proprieacuteteacute est appeleacutee introspection

- Modifier son eacutetat cette proprieacuteteacute est appeleacutee intercession

Lintrospection permet agrave un langage de connaicirctre entre autres les classes quil utilise

ainsi que les meacutethodes et les paramegravetres Lintercession beaucoup plus puissante pershy

mettrait par exemple cie rajouter modifier ou supprimer des classes etou meacutethodes

Pour nos besoins nous sommes naturellement inteacuteresseacutes par lintercession

442 Avantages

Lavantage le plus clair de lutilisation de la reacuteflexiviteacute est la reacuteutilisation du code En

effet toutes les fonctionnaliteacutes du langage infeacuterieur (Java dans ce cas-ci) peuvent ecirctre

58

automatiquement passeacutees au langage supeacuterieur Cela eacutevite davoir agrave reacuteeacutecrire du code

pour chaque nouvel eacuteleacutement agrave ajouter

Un autre avantage assez explicite est de permettre agrave des utilisateurs un peu plus aguerri

de lier du code des deux niveaux de langage ensemble En effet si un utilisateur creacutee

une structure de donneacutees en Java il peut toujours se servir exactement de la mecircme

classe dans le langage supeacuterieur sans avoir agrave faire la moindre modification au langage

supeacuterieur lui-mecircme Il est donc clair quun langage qui utilise la reacuteflexiviteacute peut devenir

tregraves puissant

443 Deacutesavantages

Certains deacutesavantages accompagnent aussi la reacuteflexiviteacute Un des plus importants est la

contrainte de seacutecuriteacute En effet si un utilisateur peut appeler nimporte quelle classe

Java agrave partir du langage supeacuterieur il peut tregraves aiseacutement appeler des fonctions qui cassent

le programme si un controcircle suffisamment important nest pas effectueacute par le logiciel Il

peut aussi sans causer d~s problegravem_es de seacutec~riteacute confondre un usager en provoquant

des effets de bord sur leacutetat du logiciel cest-agrave-dire modifier des proprieacuteteacutes du reste du

programme sans neacutecessairement que cela paraisse

Un autre deacutesavantage eacutevident est quun utilisateur qui souhaite utilicirc3er les fonctions du

langage infeacuterieur doit en quelque sorte connaicirctre celui-ci Cela implique donc lapprenshy

tissage dun deuxiegraveme langage ce qui en soit peut paraicirctre trop pour des utilisateurs

plus traditionnels

Lorsquon analyse froidement les avantages et les inconveacutenients on voit que les avanshy

tages sont beaucoup plus importants En effet le projet eacutetant limiteacute dans le temps et

dans le personnel il est en quelque sorte impossible de fournir des librairies de foncshy

tions suffisamment complegravetes pour les utilisateurs Se brancher sur les librairies Java

fournit automatiquement tout ce dont nous avons besoin et donne accegraves agrave une quantiteacute

innombrable de projets deacutejagrave creacuteeacutes dans ce langage

CHAPITRE V

MISE EN OEUVRE DE LA SOLUTION

Maintenant que nous avons des bases theacuteoriques solides ainsi quune hieacuterarchie bien

adapteacutee agrave nos besoins nous pouyons commencer agrave impleacutementer notre solution Cela

implique premiegraverement la creacuteation de notre hieacuterarchie objet en Java Deuxiegravemement

nous devons impleacutementer une grammaire afin de deacutecrire SDDL Finalement il faut

ajouter du code afin dimpleacutementer certaines proprieacuteteacutes voulues pour notre langage Il

est agrave noter que nous avons inclus en annexe un diagramme de notre hieacuterarchie ainsi que

la grammaire complegravete de SDDL

51 Eacuteleacutements de langage en SDDL

511 Impleacutementation de la hieacuterarchie

Limpleacutementation de la hieacuterarchie eacutetant seacutepareacutee du reste du langage il est normal de

commencer avec celle-ci eacutetant donneacute quelle repreacutesente le module le plus important de

notre projet Cela nous permet de le tester au fur et agrave mesure avant de commencer agrave

creacuteer un langage de plus haut niveau qui lutilise

Un des problegravemes les plus importants du deacuteveloppement de la hieacuterarchie fut de deacuteveshy

lopper correctement la deacutefinition et laccegraves agrave des points speacutecifiques de certains objets

Comme lideacutee eacutetait de permettre dobtenir une quantiteacute essentiellement illimiteacutee de

points diffeacuterents il fallait une meacutethode robuste et efficace

60

Notre meacutethode implique de fournir des informations par rapport au dessin englobant agrave

chaque sous-dessin Cela est requis car un objet preacutesent agrave plusieurs endroits diffeacuterents

auquel on demande un point speacutecifique se bute agrave une ambiguiumlteacute Mecircme en utilisant

seulement un Drawing qui est techniquement une instance unique dune forme il faut

faire attention En effet si on a un Drawing dun cercle qui est agrave linteacuterieur dune

ellipse par exemple nous pourrions deacutecider de placer cette ellipse agrave plusieurs endroits

Nous aurions donc le mecircme problegraveme dambiguiumlteacute du positionnement des points Afin

de remeacutedier agrave ce problegraveme nous avons fourni au Drawing sa position agrave linteacuterieur du

diagramme Lorsquil est copieacute nous navons quagrave changer linformation pour que le

positionnement soit correct

512 Grammaire

Le deacuteveloppement de la grammaire fut naturellement une section cruciale du deacutevelopshy

pement de SDDL Comme nous avions deacutejagrave deacuteveloppeacute des objectifs speacutecifiques pour la

forme du langage la creacuteation fut relativement directe Quelques eacuteleacutements importants

ont toutefois ducirc ecirctre ajouteacutes en cours de route En particulier des eacuteleacutements seacuteparateurs

ont eacuteteacute dune importance cruciale Il aurait donc pu ecirctre souhaitable de diminuer la

verbositeacute en enlevant des parenthegraveses ou des virgules mais cela cause (dans la plupart

des cas) des problegravemes au niveau de lambiguiumlteacute de la grammaire (tel que nous lavons

vu preacuteceacutedemment)

Nous avons aussi deacutecideacute de deacutecreacuteter quune expression geacuteneacuterale est une instruction Cela

peut sembler contre-intuitif car une expression (comme 2 + 2) ne semble pas ecirctre une

instruction La raison derriegravere ce changement est le dessin de chemin En effet nous

pouvons deacuteterminer un chemin (Path) comme nimporte quel autre objet Par contre

cela implique de lajouter par la suite seacutepareacutement agrave un canevas Cela semble contreshy

intuitif nous voyons souvent les liens entre les objets comme eacutetant des liens de niveau

supeacuterieur (bref faits dans le canevas principal) Pour lier a et b il semble plus logique

deacutecrire

61

a--b

que

lien = a--b

put lien in main

Afin de reacutegler ce problegraveme nous avons deacutecideacute de laisser les expressions ecirctre des insshy

tructions Cela fait que deacutefinir une ligne (comme a--b) devient automatiquement une

instruction valide Celle-ci sera traiteacutee comme un cas speacutecial afin decirctre placeacutee direcshy

tement au centre du canevas principal Cela implique aussi comme nous le verrons

plus tard de rajouter du code afin de sassurer que les expressions qui ne sont pas des

instructions soient refuseacutees par le programme

stm = exp exp sc 1 assign id assign exp sc 1 while while_kwd exp do_kwd (stms] stm end_kwd sc 1 if if_kwd exp then_kwd (stms] stm else_part end_kwd sc 1 for for_kwd id from~kwd (low_bound] exp to_kwd (up_bound] exp

do_kwd (stms] stm end_kwd sc 1 return return_kwd exp sc

Figure 51 Extrait de la grammaire de SDDL pour une instruction

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage

Plusieurs proprieacuteteacutes de SDDL ne venaient pas directement avec la grammaire Celles-ci

ont neacutecessiteacute un traitement bien particulier en fonction de la proprieacuteteacute rechercheacutee

Typage

La grammaire de SDDL indique clairement que le langage est agrave typage dynamique eacutetant

donneacute que les creacuteations de variables ne permettent pas de donner un type Le mecircme

62

pheacutenomegravene est preacutesent dans la deacutefinition des fonctions Par contre le fait de souhaiter

un typage dynamique implique lajout dune large section de code deacutedieacutee agrave la veacuterification

de type Chaque opeacuteration ne peut ecirctre appliqueacutee quagrave certains types deacuteleacutements et donc

avant deffectuer lopeacuteration il faut veacuterifier si le type est valide

Eacuteleacutements objets

Impleacutementer tous les principes dun langage orienteacute-objet est un travail de longue hashy

leine Par contre eacutetant donneacute que notre objectif eacutetait de simplifier le langage de desshy

cription final nous avons deacutecideacute de ne pas permettre la creacuteation de nouvelles classes

agrave linteacuterieur de SDDL Cela implique que nous pouvons releacuteguer la creacuteation de classes

uniquement au langage Java Cela a donc grandement faciliteacute la tacircche car nous navions

pas besoin dimpleacutementer la tregraves grande majoriteacute des concepts objets que nous laquo emshy

pruntons raquo agrave Java

Eacutelimination de la verbositeacute

Une bonne partie de leacutelimination de la verbositeacute vient de la conception mecircme du lanshy

gage En effet le fait de releacuteguer la deacutefinition des classes agrave Java ainsi que de creacuteer le

typage dynamique ont purement par choix eacutelimineacute une bonne partie de la verbositeacute

Quelques eacuteleacutements suppleacutementaires ont permis deacuteliminer un excegraves de verbositeacute On

note entre autres le fait de deacutefinir la description du diagramme sans le speacutecifier dans le

cadre dune fonction Un autre pheacutenomegravene important est davoir deacutecideacute de promouvoir

les points et certaines fonctions relieacutees agrave leacutetat de primitive naturelle du langage En

effet une addition entre un point a et b seffectue

c = a + b

au lieu de en Java

AbstractPoint c aadd(b)

63

Cela peut sembler comme un maigre gain mais lorsquappliqueacute agrave un calcul complexe

impliquant des points (par exemple le calcul dune combinaison lineacuteaire) les gains

combineacutes rendent le code extrecircmement clair

AbstractPoint c = amultiply(1030)add(bmultiply(2030))

c = (a 30 + 20 b 30)

Figure 52 Code Java et SDDL pour calculer une combinaison lineacuteaire

52 Reacutealisation en Java

Afin de reacutealiser SDDL il a bien sucircr fallu eacutecrire une grammaire mais beaucoup de code

autour sert agrave inteacutegrer la grammaire au restant des fonctionnaliteacutes de notre hieacuterarchie

Ce code fut complegravetement eacutecrit en Java et remplit plusieurs fonctions

521 Traverseacutee de larbre grammatical et exeacutecution

La grande majoriteacute du code Java suppleacutementaire eacutecrit a servi agrave permettre la traverseacutee

de larbre grammatical creacuteeacute par notre grammaire Cette traverseacutee permet en quelque

sorte lexeacutecution du code SDDL et est donc cruciale Pour la plupart il sagit dune trashy

verseacutee en profondeur relativement classique Quelques petits deacutetails retiennent toutefois

lattention

- Certains morceaux de code ne doivent pas ecirctre exeacutecuteacutes et ont donc un comportement

speacutecial Cest le cas des deacutefinitions de fonctions qui ne sont exeacutecuteacutees quagrave lappel On

meacutemorise donc en quelque sorte une partie de larbre grammatical et lors dun appel

on transfegravere le controcircle dexeacutecution agrave cette partie Eacutevidemment lors de la lecture de

la deacutefinition de la fonction il faut stocker quelques informations sur nos fonctions

dans une structure deacutefinie agrave cet effet (un Methodlnf0)

- Certaines opeacuterations ont plusieurs sens distincts qui ne peuvent ecirctre speacutecifieacutes dans la

grammaire La seacutemantique dune telle opeacuteration napparaicirct clairement quau moment

de la lecture de lopeacuteration (dans notre cas agrave lexeacutecut ion) Un exemple serait le

64

symbole daddition Bien que sa grammaire soit tregraves claire il peut sagir dune addition

de nombres mais aussi dune addition de points ou dune concateacutenation de chaicircnes

de caractegraveres Il est donc neacutecessaire agrave lexeacutecution de veacuterifier la classe de chaque objet

requis par lopeacuteration afin de trouver la bonne seacutemantique pour lopeacuteration si une

telle seacutemantique existe Si aucune nest trouveacutee on peut alors soulever une erreur

selon le meacutecanisme standard (par exemple additionner un point et une chaicircne de

caractegraveres)

- Certaines expressions grammaticalement correctes ne sont valides que sous certaines

conditions Par exemple nimporte quelle expression (exp) est accepteacutee comme eacutetant

une instruction (stm) grammaticalement valide Par exemple linstruction 2 + 2 va

ecirctre accepteacutee par la grammaire Par contre elle na pas de sens car elle naccomplit rien

du tout Il faut donc sassurer de veacuterifier dans la traverseacutee que lexeacutecution est leacutegale

Dans ce cas-ci il faut sassurer que lexpression de niveau supeacuterieur (une addition)

est valide pour ecirctre une instruction Dans un tel cas une erreur serait souleveacutee encore

selon le meacutecanisme standard

522 Deacutefinition dobjets quelconques

Une partie moins grande du code est consacreacutee agrave linteacutegration de la hieacuterarchie de SDDL

dans la deacutefinition du langage Comme nous souhaitions utiliser des classes quelconques

nous avons utiliseacute la reacuteflexiviteacute Java telle que nous le deacutecrivions plus tocirct Cela implique

de reacutecupeacuterer les noms des fonctions et des classes lors de leurs utilisations Toutes les

veacuterifications seffectuent agrave lexeacutecution Nous savons donc seulement si une classe A existe

bel et bien lorsque nous essayons de creacuteer un objet agrave partir de celle-ci De plus chaque

fonction appeleacutee sur un objet de classe A nest veacuterifieacutee que lors de son utilisation

Habituellement la solution aurait eacuteteacute de veacuterifier avant lexeacutecution lexistence de chaque

classe ainsi que les fonctions de chaque classe pour sassurer que lexeacutecution soit correcte

Dans notre cas la veacuterification agrave lexeacutecution est suffisante car les programmes sont tregraves

courts

De plus quelques contraintes ont ducirc ecirctre ajouteacutees afin de sassurer Clue seules les parties

65

Override public void caseADrawingTermCADrawingTerm node)

String className = nodegetClassName() getText()

try

thiscurrentExpressionClass ClassforName(sddlhierarchy + className)

thiscurrentExpressionValue = thiscurrentExpressionClassgetConstructor() newlnstance()

catch(NoSuchMethodException e)

throw new InterpreterException( cl ass Il + className + is ill-defined (no base constructor) nodegetClassName())

catch(Exception e)

throw new InterpreterException(unable to load + className +

Il class (maybe it does not exist) nodegetClassName())

Figure 53 Code reacuteflexif pour creacuteer une forme quelconque

requises de Java sont exposeacutees agrave lutilisateur final La restriction principale est de ne

creacuteer que des objets qui font partie du paquet sddl hierarchy Il est toutefois agrave

noter que cela nisole pas totalement le reste de Java car il est tout agrave fait possible de

creacuteer une classe qui permet dacceacuteder agrave Java complegravetement

523 Gestion des erreurs

La gestion des erreurs seffectue au travers des meacutecanismes deacutejagrave mis en place par Java

cest-agrave-dire les exceptions Une classe speacutecifique aux exceptions de linterpreacuteteur a eacuteteacute

creacuteeacutee qui permet de speacutecifier non seulement un message mais aussi un noeud bien

speacutecifique dans larbre grammatical afin didentifier lendroit ougrave lerreur a eacuteteacute deacutecouverte

66

Cela est extrecircmement utile afin de permettre agrave lutilisateur de corriger la majoriteacute de

ses erreurs

De plus une partie du code de gestion derreurs sert agrave repreacutesenter la pile dexeacutecution

En effet afin didentifier la source dun problegraveme il est important de pouvoir savoir

quelles fonctions sont impliqueacutees Nous pouvons donc identifier la ligne de chaque appel

au moment ougrave lerreur sest produite et ainsi identifier des problegravemes entre autres dans

le cas des fonctions reacutecursives

524 Structures de support

Dimportances mineures la plupart de ces structures servent agrave geacuterer lexeacutecution des

meacutethodes

- La classe Frame repreacutesente le cadre dexeacutecution dune fonction Cette classe permet

dobtenir des fonctions reacutecursives car on peut imbriquer un Frame dans un autre

- La classe Methodlnfo repreacutesente une fonction deacutefinie agrave linteacuterieur de SDDL Elle

permet de transfeacuterer lexeacutecution agrave la deacutefinition fournie par lutilisateur et regroupe

les informations geacuteneacuteralement utiles agrave la veacuterification seacutemantique (nom paramegravetres

etc)

- La classe PrimitiveMethodlnfo repreacutesente une fonction de Java accessible par la

reacuteflexiviteacute Elle fournit aussi quelques informations pour la veacuterification seacutemantique

- La classe MethodTable fournit une table pour geacuterer lensemble des fonctions afin

dacceacuteder directement agrave une fonction agrave partir de son nom

53 Accegraves agrave Postscript PDP et B-1EX

531 Postscript

Afin de reacutealiser correctement notre langage nous avions besoin dacceacuteder agrave diffeacuterentes

technologies Eacutetant donneacute que nous voulons terminer avec des dessins en format Postshy

script il devient important de pouvoir fournir aiseacutement du code dans ce format Il

67

sagit toutefois dun format relativement complexe et il devient donc long et complexe

de fournir une traduction valide pour chacun de nos diffeacuterents concepts

Le problegraveme principal de Postscript est quil possegravede un ensemble de primitives de tregraves

bas niveau En effet afin de dessiner une courbe la seule meacutethode possible est lutishy

lisation de courbes de Beacutezier avec des points de controcircle qui doivent ecirctre fournis agrave

lavance Comme nous lavons vu preacuteceacutedemment les courbes de Beacutezier sont tregraves prashy

tiques pour lordinateur mais peu pratique pour [utilisateur car la speacutecification de

points de controcircles qui ne sont pas interpoleacutes est peu intuitive De plus afin de faire

des courbes quelconques il faut les seacuteparer en plusieurs courbes de Beacutezier de tailles

infeacuterieures

Il existe des algorithmes qui permettent de prendre des courbes et de les seacuteparer en

sections adeacutequates Un de ces algorithmes est impleacutementeacute en Asymptote (Bowman

2007) Il est donc naturel afin deacuteviter davoir agrave reacuteimpleacutementer un algorithme aussi

complexe dutiliser Asymptote pour obtenir nos courbes de faccedilon systeacutematique

532 PDF

Le format PDF possegravede lavantage dinteacutegrer plusieurs fonctions multimeacutedias telles que

les liens les videacuteos les formulaires (Adobe Systems Incorporated 2006) etc Malgreacute

tout PDF outre les quelques ajouts nommeacutes ci-haut est essentiellement similaire agrave

Postscript Eacutevidemment les nombreuses possibiliteacutes fournies par le format PDF sont

deacutesirables (inteacutegrer des videacuteos agrave des notes de cours par exemple) Il existe toutefois

de nombreux convertisseurs qui peuvent prendre un fichier Postscript et le mettre au

format PDF Par contre cette conversion ne permet pas dajouter les fonctionnaliteacutes

PDF qui nous inteacuteressent Il devient donc crucial dobtenir une meacutethode pour fournir

des images directement au format PDF Encore lagrave le fait de passer par Asymptote

nous donne une solution rapide et eacuteleacutegante car le fait de fournir du PDF est inclus

dans le logiciel En geacuteneacuterant directement du Asymptote nous pourrions donc obtenir

automatiquement le format rechercheacute

68

533 ~1lE)C

Leacuteleacutement le plus crucial du langage que nous recherchions au deacutebut eacutetait de pouvoir

utiliser du texte tel que mis en forme par UTEX dans nos diagrammes Un tel besoin

implique plusieurs problegravemes

Premiegraverement un texte UTEX est conserveacute sous la forme dune chaicircne de caractegraveres

standard Par contre apregraves avoir eacuteteacute traiteacute le reacutesultat obtenu est une boicircte contenant

le texte mis en forme La taille de cette boicircte est deacutetermineacutee lors de la mise en page

et ne peut donc pas ecirctre deacutetermineacutee directement par notre programme Or si nous ne

connaissons pas la taille exacte de notre boicircte de texte il est impossible de positionner

un texte par une position autre que son coin supeacuterieur gauche Cela est un comportement

peu inteacuteressant eacutetant donneacute que dans de nombreux graphes on place le texte au centre

dun sommet (donc par exemple le centre de la boicircte sera placeacute au centre dune ellipse)

Afin de pallier agrave ce problegraveme il faudrait demander agrave UTEX de creacuteer les boicirctes une

premiegravere fois et de nous fournir les tailles des boicirctes Par la suite il faudrait geacuteneacuterer

une page UTEX de la bonne taille avec nos dessins puis dire agrave UIEX de geacuteneacuterer les

boicirctes de textes aux endroits que nous aurons calculeacute entre temps Bien que viable

cette meacutethode implique beaucoup de code et de cas diffeacuterents (laccegraves agrave IbIEX par un

programme externe va varier dun systegraveme dexploitation agrave lautre entre autres) Eacutetant

donneacute quAsymptote fournit deacutejagrave un accegraves agrave I5IEX agrave linteacuterieur du logiciel le travail

requis pour lutilisation de I5TEX est de beaucoup diminueacute

534 Geacuteneacuteration du code Asymptote

Afin davoir une solution valide il ne reste donc pl s quagrave nnecter not e so ution agrave

Asymptote Pour le faire nous devons premiegraverement geacuteneacuterer un fichier de code Asympshy

tote valide pour par la suite le faire valider en appelant le programme de maniegravere

externe Eacutetant donneacute que le projet a eacuteteacute eacutecrit speacutecifiquement pour fournir du code

Asymptote une solution simple a eacuteteacute utiliseacutee afin deacutecrire le code le canevas principal

69

public void draw(AbstractPoint location PrintWriter out)

AbstractPoint pl locationadd(new Point (radius 00)) AbstractPoint p2 locationadd(new Point(OO radius)) AbstractPoint p3 locationadd(new Pointe-radius 00)) AbstractPoint p4 locationadd(new Point(OO -radius))

outprintln(draw( + p1so1veO + + p2solveO + + p3solveO + + p4solveO + cycle))

Figure 54 Code pour geacuteneacuterer du code Asymptote pour un cercle

sera appeleacute agrave ecirctre dessineacute qui appellera reacutecursivement chacun de ses sous-canevas

La geacuteneacuteration du code Asymptote a eacuteteacute reacuteserveacutee dans une fonction draw speacutecifique agrave

chaque forme (Shape) qui eacutecrit dans un fichier ouvert fourni en paramegravetre Un exemple

dune telle meacutethode pour la classe Circle est illustreacute agrave la figure 54

Une telle meacutethode est simple mais suffisante pour nos besoins Bien sucircr agrave long terme

une solution plus robuste devrait simposer En effet comme leacutecriture du fichier est

faite directement lors de lexeacutecution les objets doivent ecirctre appeleacutes exactement dans

lordre dont ils sont deacutependants Par exemple un segment dessineacute entre deux cercles

doit ecirctre dessineacute apregraves les cercles car sinon les reacutefeacuterences seront absentes Dans ce cas-ci

le segment va toujours ecirctre deacutefinie par la suite Par contre si nous voulions rajouter

la possibiliteacute dutiliser des extensions dAsymptote cela impliquerait de les eacutecrire au

deacutebut du fichier Il est impossible de le faire avec cette solution

Une solution plus robuste serait dutiliser un outil lieacute agrave SabieCC qui est ObjectMacro

(Gagnon 2009) Cette extension nous permet de simplifier la geacuteneacuteration de code et

deacutecrire agrave des endroits arbitraires dans un fichier agrave laide de macros et de programmation

objet Cela nous permettrait aussi deacutetendre la geacuteneacuteration de code agrave plusieurs formats

diffeacuterents par exemple geacuteneacuterer directement du code PDF au lieu de geacuteneacuterer du code

70

Asymptote

61

CHAPITRE VI

REacuteALISATION DES DIAGRAMMES EN SDDL

Maintenant que nous avons notre programme complet et fonctionnel il faut veacuterifier son

efficaciteacute Nous proceacutedons en deux temps Premiegraverement il faut revenir agrave nos dessins

de base et les coder avec notre logiciel Par la suite il faut aussi les analyser en fonction

des diffeacuterents facteurs cruciaux que nous avons eacutenumeacutereacutes dans les chapitres preacuteceacutedents

Nous pourrons donc agrave partir de cela conclure si le logiciel savegravere efficace pour nos

besoins ou si certains problegravemes lempecircchent de fonctionner adeacutequatement

Naturellement nous avons pris le temps dappliquer cette analyse agrave chacun des dessins

dans notre base de diagrammes du domaine Par manque despace nous nanalyserons

dans ce chapitre que trois dessins Une attention particuliegravere a eacuteteacute porteacutee au choix de

ces dessins afin de repreacutesenter un eacuteventail assez large des capaciteacutes du logiciel et des

diffeacuterents eacuteleacutements cruciaux agrave obtenir dans la description dun diagramme Tous les

diagrammes sont disponibles en annexe avec code sans analyse deacutetailleacutee toutefois

Analyse du code des diagrammes existants

Pour faire notre analyse nous devons premiegraverement obtenir chaque dessin Dans ce cas

nous utiliserons un diagramme tireacute du domaine de la compilation Cela nous fournit un

graphe relativement standard avec un niveau de complexiteacute inteacuteressant sans toutefois

ecirctre trop complexe Par la suite nOlis analyserons un diagramme repreacutesentant une strucshy

ture de tableau Cela montre la capaciteacute du logiciel de travailler avec des structures de

72

donneacutees geacuteneacuterales Finalement nous effectuerons lanalyse dun diagramme de Venn qui

nest a priori pas supporteacute par le logiciel afin de voir la complexiteacute dun diagramme

totalement geacuteneacuteral et qui sort des conventions preacute-eacutetablies par le logiciel

611 Rappel des objectifs cruciaux agrave observer

Naturellement afin de faire une analyse rationnelle de notre solution il faut se remeacuteshy

morer les diffeacuterents objectifs que nous nous eacutetions fixeacutes Les plus importants eacutetaient les

suivants

- Inteacutegration avec Jb1EX Eacutetant donneacute le design de notre solution ce point est naturelshy

lement reacutealiseacute dans tous les diagrammes

- Description de structures Il nous faut pouvoir deacutecrire une structure de maniegravere aiseacutee

Le fait decirctre aiseacute est naturellement subjectif mais nous pouvons ramener le tout au

fait quil soit plus simple de deacutecrire dans notre logiciel Wle structure que dutiliser les

primitives de base du langage Par exemple il est plus aiseacute de deacutecrire une structure

en parlant de boicirctes et de liens quen parlant de lignes et de courbes

- Hieacuterarchie solide et extensible Nous ne testerons pas lextensibiliteacute de la solution car

elle a deacutejagrave eacuteteacute deacutemontreacutee Toutefois les diffeacuterents codes nous permettront danalyser

agrave quel point nous utilisons la hieacuterarchie que nous avons construite et agrave quel point elle

est reacuteellement pratique

Nous avions aussi dautres objectifs de moindre importance

- Gestion des erreurs Il nest pas possible avec du code compleacuteteacute de tester la gestion des

erreurs Lauteur peut toutefois garantir que sans la gestion des erreurs une grande

quantiteacute de temps aurait eacuteteacute perdu dans la reacutedaction du code des diagrammes et ce

malgreacute la connaissance profonde du langage sous-jacent

- Langage fluide et clair Cela peut ecirctre testeacute par le lecteur en regardant le code Si

une analyse rapide lui permet de comprendre le sens du code alors celui-ci est clair

Naturellement lauteur ne peut effectuer cette analyse par lui-mecircme Bien que nous

ne puissions en faire une analyse scientifique en inspectant le code reacutesultant nous

73

sommes confiants que la syntaxe que nous avons choisie est claire et permet dexprimer

clairement les concepts sous-jacents au langage

- Qualiteacute de la documentation et courbe dapprentissage Il sagit ici dun autre eacuteleacutement

que nous pouvons difficilement aborder par nous-mecircmes Cela ne sera pas pris en

compte dans notre analyse

Selon ces diffeacuterents facteurs nous voyons que nous devrons surtout nous concentrer sur

la structure geacuteneacuterale du code ainsi que sur sa complexiteacute Le code doit ecirctre facile agrave

lire tout en permettant de compacter un maximum dinformation dans un minimum

despace

612 Diagramme de compilation

Notre premier dessin est tireacute dun livre de compilation Il sagit dun automate assez

standard et repreacutesente donc un bon diagramme moyen afin de voir les capaciteacutes de

notre logiciel

Figure 61 Diagramme dautomate de compilation

Quelques points importants sont agrave noter dans ce dessin Premiegraverement on note la

creacuteation dune structure sous-jacente (composeacutee dune ellipse et deux cercles) Par la

74

circlel Circle with [radius = 100] circle2 Circ le with [radius = 120] ellipse Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (1000 500) in main d3 put form at (1000 -500) in main put Text with [text $N(p_l)$] at (1000 1000) in main put Text with [text $N(p_2)$] at (1000 500) in main put Text with [text dotsJ at (100000) in main put Text with [text I$N(p_n)$J at (1000 -500) in main

put Text with [text = $s_O$J at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt(coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt(coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt(coord of anglePoint(1800) in maind3circle)

Figure 62 Code pour le diagramme dautomate

suite cette forme est appliqueacutee agrave plusieurs reprises dans le dessin Cela deacutemontre que

dans ce cas-ci il est possible de creacuteer et dutiliser des structures dun certain degreacute de

complexiteacute

On note aussi lutilisation des variables pour reacutecupeacuterer les dessins afin de pouvoir les

reacutefeacuterencer plus tard Cette eacutetape est aussi simple que lassignation agrave une variable Par

la suite on peut noter les flegraveches qui sont traceacutees agrave partir de points deacutefinis agrave partir de

certains cercles La structure mecircme est extrecircmement explicite dans ce cas et rend la

compreacutehension du dessin tregraves simple On reacutecupegravere aussi finalement les points formeacutes agrave

un certain angle dun cercle

75

La complexiteacute du diagramme est beaucoup plus simple quelle ne le serait avec des

primitives de base En effet les seuls dessins explicites que nous devons effectuer par

points sont les flegraveches De plus ces flegraveches sont relativement simples puisque nous navons

rien agrave speacutecifier pour le bout de flegraveche seulement les extreacutemiteacutes Pour le reste les formes

sont soient deacutefinies agrave partir de notre hieacuterarchie (comme les cercles ou les ellipses) ou

bien par un collage de formes plus simples (comme pour la forme form) Les points sont

obtenus par des accegraves structureacutes et fournissent donc des valeurs exactes rendant ces

opeacuterations extrecircmement rapides agrave eacutecrire pour lusager

On note toutefois quil existe certains eacuteleacutements dans le code qui auraient pu ecirctre simshy

plifieacutes afin de rendre le code encore plus compact En effet nous remarquons la preacutesence

de beaucoup de valeurs explicites alors quil aurait eacuteteacute possible de les remplacer par des

variables afin de rendre le tout plus clair

Un eacuteleacutement qui aurait pu amener une touche de simplification aurait eacuteteacute dutiliser des

listes ou des boucles afin dinseacuterer plus aiseacutement les objets Par exemple la structure

complexe aurait pu ecirctre ajouteacutee plusieurs fois par une boucle for avec des positions

calculeacutees en fonction de lindex Nous sommes toutefois davis que malgreacute lameacutelioration

possible que cela fournit au code il est peu probable que les utilisateurs finaux prennent

le temps de faire ce genre de modification et utiliseront fort probablement plus des

positions relatives avec une seacuterie dappels sauf si le nombre dobjets agrave positionner

devenait grand (par exemple une dizaine dobjets)

En geacuteneacuteral nous pouvons toutefois consideacuterer que ce diagramme est simplifieacute de beaushy

coup par lutilisation de notre solution La grande part du code est explicite et la strucshy

ture est tregraves simple agrave observer en regardant uniquement le code Mecircme si tout nest pas

parfait il y a clairement avantage agrave utiliser le logiciel pour coder cet automate

613 Diagramme de tableau

Notre second dessin est tireacute dun livre sur les structures de donneacutees Il repreacutesente

leacutevolution dune structure de donneacutee simple (un tableau) agrave travers certaines modifishy

76

cations

a ab 1 0 2 8 (lime

1 -10

3 7

iuml

Figure 63 Diagramme de tableau

Un des points les plus inteacuteressants de ce dessin est lutilisation dune fonction Elle place

une forme dans un canevas agrave plusieurs endroits speacutecifiques en fonction dune position de

deacutepart et dun vecteur de translation Cela nous permet de placer une forme identique

(un carreacute) plusieurs fois de suite ce qui nous donne limpression quil sagit en reacutealiteacute

dun tableau

Un autre point qui est tregraves important dans ce dessin est que les nombreux carreacutes sont

en fait tous des instances du mecircme deacutefini au deacutebut Cela permet de modifier lensemble

des carreacutes aiseacutement en ne modifiant que les proprieacuteteacutes de celui de base Pour le reste du

dessin il sagit surtout dun ensemble de flegraveches et de textes positionneacutes agrave des endroits

speacutecifiques

En analysant le code on voit une ameacutelioration claire provoqueacutee par le fait dutilishy

ser une fonction pour placer les carreacutes Cela nous permet de simplifier de beaucoup

les appels et les reacutepeacutetitions Nous pouvons toutefois noter que quelques ameacuteliorations

suppleacutementaires pourraient ecirctre apporteacutees En effet une classe aurait pu ecirctre eacutecrite en

Java pour repreacutesenter un tableau agrave lhorizontale ou agrave la verticale Cela aurait pu simshy

plifier significativement le code du dessin en combinant dans la structure le texte et

les carreacutes utiliseacutes pour repreacutesenter le tableau lui-mecircme De plus les flegraveches auraient pu

ecirctre deacutetermineacutees agrave partir de points obtenus du tableau lui-mecircme (par exemple le coin

supeacuterieur droit ou supeacuterieur gauche) auxquels nous aurions ajouteacute un vecentierteur de

deacuteplacement

77

fun dropMany(f n s v c) for i from 1 to n do

put f at (s + (i - 1) v) in c end

square = Square with [length = 200] changeVec = (00 -200) dropMany (square 4 (00 00) changeVec main)

dropMany(square 3 (500 00) changeVec main) dropMany(square 1 (1000 00) changeVec main)

dropMany (square 1 (1500 00) changeVec main) put Text with [text=O] at (00 00) in main

put Text with [text=l] at (00 -200) in main put Text with [text=3] at (00 -400) in main

put Text with [text=7] at (00 -600) in main put Text with [text=bf a] at (500200) in main put Text with [text=2] at (500 00) in main

put Text with [text=4] at (500 -200) in main put Text with [text=7] at (500 -400) in main

put Text with [text=7] at 0000 00) in main put Text with [text=bf $a-b-+$] at 0500 200) in main

put Text with [text=8] at 0500 00) in main put Text with [text=none] at (2000 00) in main

020 100)-gt(380 100) (620 100)-gt(880 100)

(1120 100)-gt0380100) 0620 100)-gt0880100)

Figure 64 Code pour le diagramme de tableau

Avec ces changements le code aurait pu ecirctre beaucoup plus compact Bien que cette

option soit reacutealisable nous ne lavons pas impleacutementeacutee car il eacutetait important de limiter

ce quun usager peut creacuteer sans lutilisation de Java Cela est ducirc au fait que notre objectif

est que seulles utilisateurs experts se servent de Java afin dameacuteliorer le logiciel Le code

est tout de mecircme significativement meilleur que de placer tout agrave la main ce qui nous

permet de conclure agrave lefficaciteacute de notre logiciel dans le cas dune structure geacuteneacuterale

78

614 Diagramme de Venn

Notre dernier dessin est une structure qui ressemble beaucoup plus agrave un dessin geacuteneacuteral

cest-agrave-dire un diagramme de Venn La forme dun tel diagramme fait quil est extrecircmeshy

ment complexe deacutecrire une classe qui permet de dessiner automatiquement ce type de

structure et quil vaut mieux creacuteer les formes une par une comme on le ferait agrave la main

Cela nous permettra danalyser si les choses simples agrave dessiner agrave la main demeurent

facile agrave reacutealiser avec notre logiciel

A

Figure 65 Diagramme de Venn

Ce dessin ne possegravede pas beaucoup de grands points dinteacuterecirct En effet la structure ne

peut pas vraiment ecirctre geacuteneacutereacutee automatiquement par un algorithme alors elle est entreacutee

manuellement On remarque tout de mecircme lutilisation de plusieurs sous-canevas afin

de simplifier le placement des objets qui sont agrave linteacuterieur dautres

Naturellement eacutetant donneacute que la structure doit ecirctre deacutecrite manuellement le code

nest pas plus court que lutilisation de primitives de base Par contre cela est comshy

penseacute par un niveau de clarteacute supeacuterieur eacutetant donneacute lutilisation des canevas afin de

regrouper les eacuteleacutements dans des ensembles respectifs Cfla permet de positionner tous

les eacuteleacutements en valeurs relatives au lieu dabsolues ce qui simplifie de beaucoup le travail

de positionnement

De plus le fait de pouvoir stocker les eacuteleacutements dans des variables nous permet de les

identifier par diffeacuterents noms significatifs ce que des primitives de base comme celles

79

circle = Circle with [radius = 100] bigcircle = Circ le with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvas1 put circle at 050 150) in canvas1 put Text with [text = H] at 050 150) in canvas1 put circle at (-150 150) in canvas1 put Text with [text J] at (-150 150) in canvas1 put Text with [text = B] at (00 -150) in canvas1

put bigcircle in canvas2 put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = F] at 050 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = E] ac (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvas1 at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = A] at (00 -300) in main put bigellipse in main

Figure 66 Code du diagramme de Venn

de PDF ne nous permet pas de faiTe Nous pouvons donc en conclure que mecircme pour

les structures difficiles agrave repreacutesenter notre logiciel fournit tout de mecircme un nombre

significatif davantages

Preacutesentation du produit final

Une fois que nous avons pu confirmer que notre logiciel eacutetait efficace il ne restait plus

quagrave le faire connaicirctre Nous preacutesentons donc ici un reacutesumeacute des efforts qui ont eacuteteacute

effectueacutes afin damener le logiciel agrave la connaissance de la communauteacute gIEX

62

80

621 Statistiques et documentation

En premier lieu avant de pouvoir preacutesenter notre solution il nous fallait la documenter

correctement En effet leffort de deacuteveloppement nous aura permis de deacutevelopper un

produit de tregraves grande taille La taille totale du travail se limite agrave environ 10 megs mais

cela implique plus de 6300 lignes de code deacuteveloppeacutees speacutecifiquement pour le projet

(cela incluant les commentaires mais excluant tout le code geacuteneacutereacute par SableCC qui est

tregraves exhaustif) Avec une taille aussi significative il est tout simplement impensable de

sattendre agrave ce quun utilisateur analyse le code afin de trouver ce qui va reacutepondre agrave ses

besoins

Pour cela nous avons pris le temps de reacutediger une documentation interne Elle consiste agrave

documenter chaque classe de notre hieacuterarchie ainsi que chaque fonction disponibles Cela

fournit des renseignements complets pour quelquun qui cherche un eacuteleacutement speacutecifique

du langage

622 Preacutesentation

Par la suite nous avons reacutedigeacute une preacutesentation pour la confeacuterence TUG 2010 que nous

avons preacutesenteacutee le 28 juin 2010 agrave San Francisco devant des membres tregraves influents de

la communauteacute JbTEX dont Donald Knuth le creacuteateur original de TEX La confeacuterence

nous a permis de nous mettre au pouls des besoins de la communauteacute et de linteacuterecirct

quils portent agrave un tel projet La reacuteponse se voulait enthousiaste particuliegraverement de

la part du preacutesentateur dAsymptote John Bowman La confeacuterence est disponible sur

le site de River Valley (Bourgeois 2010) (malheureusement sans videacuteo eacutetant donneacute un

problegraveme dopeacutemt ur)

Bien quil sagisse dun eacuteleacutement tregraves important dans la preacutesentation dun projet une

confeacuterence ne rejoint pas beaucoup de monde Pour combler ce besoin nous avons aussi

reacutedigeacute un article pour la revue TUGBoat (Bourgeois et Villemaire 2010a) qui est la

revue principale de la communauteacute JbTEX Nous avons inclus larticle en annexe Cela

81

nous a permis de rejoindre un public beaucoup plus grand quune simple preacutesentation

devant public

623 Site web

Finalement afin de faciliter la distribution de notre logiciel nous avons deacuteveloppeacute un site

web (Bourgeois et Villemaire 2uuml1uumlb) pour accompagner la preacutesentation et permettre le

teacuteleacutechargement Le site contient aussi toute notre documentation ainsi que les contenus

des preacutesentations et articles que nous avons mentionneacutes plus haut Nous avons aussi pris

le temps de fournir quelques exemples suppleacutementaires afin de montrer lattrait direct

de SDDL

63 Conclusion de notre analyse

Nous concluons que notre solution est efficace et quelle respecte agrave diffeacuterents niveaux

les critegraveres que nous nous eacutetions fixeacutes au deacutepart Il sagit dune hieacuterarchie dobjets facile

et extensible accompagneacutee dune syntaxe claire et fluide Avec lajout de la gestion des

erreurs et sa capaciteacute agrave deacutecrire plusieurs formes de structures notre logiciel permet de

simplifier la repreacutesentation des diagrammes classiques du domaine Nous en venons donc

agrave la conclusion que notre solution respecte les diffeacuterents critegraveres et nous pouvons donc

consideacuterer notre solution comme eacutetant valide

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CONCLUSIOK

La creacuteation de diagrammes structureacutes comme nous avons pu le constater tout au long

de ce meacutemoire est un sujet tregraves complexe Bien quil puisse de prime abord necirctre vu

que comme la capaciteacute de faire des petits dessins simples nous remarquons rapidement

que les deacutecrire tels que nous les voyons est beaucoup plus difficile quil y parait

Entre autres nous avons pu constater que les diagrammes sont penseacutes de maniegravere

extrecircmement abstraites En effet dans un arbre nous ne voyons pas une seacuterie de somshy

mets relieacutes par des points mais bel et bien un arbre seulement Cette capaciteacute agrave abstraire

la forme du contenu est extrecircmement pratique pour un ecirctre humain mais pas tregraves utile

pour un ordinateur Il est extrecircmement difficile dessayer de saffranchir du besoin de

speacutecifier la forme lorsquon veut creacuteer un diagramme

Il en est de mecircme avec IbTEX duquel nous nous sommes inspireacute Bien que le logiciel

puisse faire la forme de maniegravere adeacutequate dans plusieurs cas ces derniers savegraverent tregraves

speacutecifiques et plus souvent quautrement la possibiliteacute dobtenir un niveau accru de

controcircle sur la forme est souhaitable Dautre part la question du positionnement dun

texte scientifique dans une page a eacuteteacute abondamment eacutetudieacute (entre autre par la creacuteation

de TEX) alors que le bon positionnement dun diagramme la eacuteteacute beaucoup moins Il

est donc probleacutematique de se deacutebarrasser de cet eacuteleacutement de forme dans nimporte quel

logiciel de creacuteation de diagrammes

Cela nous amegravene donc agrave la question naturelle de savoir si notre logiciel savegravere une solushy

tion valide agrave notre probleacutematique initiale En effet bien que notre analyse deacutemontre que

la creacuteation de dessins devient plus simple nous ne pouvons affirmer que nous eacutecrivons

ce que nous pensons du diagramme

- -

84

Or comme la question est de veacuterifier la validiteacute de notre solution nous reacutepondrons par

laffirmative Mecircme si elle nest pas parfaite un degreacute de complexiteacute se trouve eacutelimineacute

malgreacute tout Il est tout de mecircme possible pour un utilisateur de penser en des termes plus

abstraits mecircme sil ne sagit pas du niveau dabstraction optimal De plus eacutetant donneacute

que nous avons creacuteeacute notre solution pour ecirctre extensible il est possible daugmenter le

niveau dabstraction avec la contribution de la communauteacute Bien que la solution ne soit

pas parfaite et aurait pu jouir dameacuteliorations subseacutequentes lobjectif principal eacutetait de

deacutevelopper un langage qui simplifiait la description de diagrammes structureacutes et cela

fut atteint

Naturellement eacutetant donneacute les limites de temps et de complexiteacute plusieurs pistes de

deacuteveloppements suppleacutementaires nont pu ecirctre utiliseacutees En effet nous nous sommes

limiteacutes agrave la description dune image statique Il est toutefois tregraves utile de pouvoir creacuteer

des images dynamiques La possibiliteacute de creacuteer des seacutequences de mouvements agrave linteacuterieur

dun diagramme aurait pu rendre notre outil plus inteacuteressant De plus lUl outil de

geacuteneacuteration automatique de graphes ou darbres mecircme imparfait pourrait fournir des

choix suppleacutementaires agrave un utilisateur qui souhaite obtenir un reacutesultat rapidement sans

toutefois rechercher un reacutesultat parfait

Il est toutefois bon de noter que bien quil soit long et complexe deffectuer de tels

ajouts notre logiciel a eacuteteacute penseacute en fonction de pouvoir ecirctre eacutetendu par lutilisateur Il

est donc tout agrave fait possible de pouvoir eacuteventuellement fournir de telles fonctionnaliteacutes

dans une version future du programme Dici lagrave celui-ci suffira amplement agrave la creacuteation

de diagrammes simples

APPENDICE A

PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

Nous incluons ici larticle complet que nous avons reacutedigeacute agrave propos de notre logiciel

afin den faire la promotion aupregraves de la communauteacute TEX et JbTEX Cet article qui fut

preacutesenteacute dans Tugboat la revue du TEX Users Group tel que mentionneacute preacuteceacutedemment

compleacutemente la preacutesentation qui fut effectueacutee lors de la confeacuterence du mecircme groupe

agrave San Francisco Larticle est essentiellement une introduction pragmatique pour un

utilisateur final et fournit donc plusieurs exemples inteacuteressants dutilisation tout en

deacutecrivant briegravevement les diffeacuterents concepts importants qui ont meneacutes le deacuteveloppement

de SDDL Il sagit de la version finale tel que Jarticle apparait dans le numeacutero de Tugboat

206

Drawing structured diagrams with SDDL

Mathieu Bourgeois and Roger Villemaire

Abstract

We present SOOL a Structured Diagram Description Language aimed at producing graphical representashytions for discrete mathematics and computer science SDDL allows combining graphical objects (circles lines arrows ) and lbTEX boxes to produce diashygrams representing discrete structures such as graphs trees etc with an easy-to-use domain specific lanshyguage

1 What is SDDL

SDDL Structured Diagram Description Language is a high-level domain specific language tailored for diagrams that have an inherent structure Examples of these might be trees graphs and automata Any diagram that is naturally structured can be described in SDOL However it was designed especially for data structures appearing in computer science and discrete mathematics

The main objective of this language is to realize drawings in a natural and structured way Mainly one describes a drawing in SOOL in a way that is simishylar to drawing on a blackboard For example specific shapes (like circles ellipses texts boxes) are drawn at positions that can be either absolute or relative to specific points on already placed shapes Since we aim at mathematical drawings text is handled through lbTEX

Since exhibiting the structure of a diagram is esshysential to our purpose SOOL uses an object-oriented hierarchy completely written in Java under our high-levellanguage Having shapes as objects makes structuring of diagrams easier and more intuitive since most shapes are explicitly represented by a class Furthermore extension by the end user is quite feasible since Java is a well-known language

At the lower level SDDL uses another graphishycal description language for lbTEX namely Asympshytote [1] Our tool produces Asymptote code which is finally converted to an encapsulated PostScript (eps) vector file

2 Canvas and shapes

A diagram in SDDL is defined by a main Canvas It is just like a standard painting canvas in the sense that we can place (or paint) different things on it as much as we like The things we can place inside a Canvas are Shapes Thus for creating a Hello world diagram we would use the following

put Text with [text = Hello worldJ in main

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

resulting in

Hello world

In this example Text is a Shape and it posshysesses a property text which is the JbTEX string used to render the text Each Shape defines a cershytain number of such properties

SDDL permits the definition of variables It is a dynamically typed language so variables dont have to be declared before being used Variables make it possible to reuse the same Shape at multiple locations For example

a = Circle with [radius = 100] put a at (-75 00) in main put a at (75 00) in main

m In this example we specify the location where we want our Shape to be If a location is not specified with the at clause the Shape will be placed at the point of origin of the current Canvas which is its center

One important thing to note is that once a Shape has been put in a Canvas it is immutable It cannot be modified or removed A Shape can be modified alter it has been drawn on a Canvas but this will have an effect only on later use of this object and will not modify the actual Canvas in any way a Shape always appears in a Canvas as it was at the moment it was added

When a Shape is created every property specishyfied by the user is set in the given order It is not necessary to specify ail properties at once nor to set ail of them Most of the properties have appropriate default values However sorne properties if not set will yield strange results For example a circle with no radius property set will have a defaul radius of O Usually property order is irrelevant For instance giving for an ellipse the radius along the x-axis or the y-axis first will yield exactly the saille result

a = Ellipse a = a with [xradius 200] a = a with [yradius 100] put a in main

o 3 Structuring multiple canvases

Every diagram consists of a main Canvas However we can define other Canvas objects if we wish An additional Canvas can be introduced using a typical variable assignment However when a put command is used SODL checks to see if the canvas variable is

4

207 TUGboat Volume 31 (2010) No 2

already defined If it isnt it automatically creates an empty Canvas for use

One of the main reasons to use other Canvases is to create an explicit structure in our diagram Since a Canvas is a Shape once a sub-Canvas has been created it can be placed inside the main Canvas or any other one for that matter This will ensure that everything that is defined inside our sub-Canvas will be placed at the proper position in the final diagram However any Canvas that has been defined but is not linked directly or indirectly with the main Canvas will not be drawn in the final diagram

As an example lets say we want to make a diagram that consists of two identical eyes Instead of defining two identical objects we will create one in a Canvas named form and put it at different positions inside our main Canvas Our eye consists of a circle and an ellipse both with the same center Ali we need to do for this is place them at the default position of the Canvas Finally we can take this subshyCanvas and place it at the two positions required a ~ Circle with [radius~100]

b ~ Ellipse with [xradius~200 yradius~100]

put a in form put b in form put form at (-200 00) in main put form at (200 00) in main

Paths

SDDL offers support for the description of paths The way in which they are described is similar in syntax with MetaPost and Asymptote though with sorne variations A Path shape is described by linking points together with specific linking symbols To draw a line between two points the line symbol - shycan be used To link sorne points using a curve use the curved line symbol - which will use Asymptotes positioning algorithms to create a nice-looking curve which passes through those points For the moment user control over the curve is limited to beginning and ending tangents but could be expanded

pl ~ a--b--c p2 ~ a-b-c

One of the other things you may want to do with a Path is to create an Arrow out of it SDDL defines symbols for forward backward and bidirectional arshyrows for both linear and curved lines Right now however support is restricted to forward arrows

pl ~ alt-b--c-gtd p2 alt-b-c-gtd p3 alt-gtb p4 aCgtb

Once a Path is defined it can be used as any other Shape However one of the main things that you want ta do is ta put your Path somewhere For this you can write something Iike this p ~ (00 00) -- (100 100) put p in main

This is the standard way to add Shapes ta a Canvas However since Paths are usually used to link different Shapes together in the main Canvas special handling is done in SDDL Namely a Path that is not explicitly assigned to a variable will be automatically placed in the main Canvas Therefore the Path will be directly placed in main without any explicit put expression Thus linking has its own special syntax which is more natural and convenient As an example this program (00 00) -- (100 100)

yields exactly the same result as the one just above Furthermore points can be added and multiplied by a scalar (as vectors) Using a dot to locate the origin of the drawing we can use the SDDL syntax ta create this example a ~ (100 100) a--20a-gt(300 00) a-(-10)a-(300 00)

ocirc Finally as we will now see Shapes also usually

define specifie points

5 Drawing and linking shapes together

Ta draw a diagram usually sorne shapes with a specific structure are first laid down Once that is done those objects are linked together with lines curves and arrows However these links must be made between specific positions usually derived from one or more specifie Shapes For example we may want to link the northwestern point of a rectangle with the point on a circle at an angle of 45 degrees These points could obviously be computed in advance However this becomes quite problematic when points are at peculiar angles or more complex relationships between points and Shapes are needed Worst of ail if the position or any other property of a Shape is changed ail computations will have to be redone

To ease object linking SDDL provides so-called reference points A reference point is a point that has no static value unlike points defined by a pair of two real numbers Instead a reference point is defined by its relationship to a specifie Shape appearing at a particular location As a matter of fact ail reference

Drawing structured diagrams with SDDL

208

points are defined along with the Shape because they are a natural part of it This ensures that we always have nice-looking lines at exactly the positions we want them to be

However a reference points exact position in a Canvas will depend on the Shapes position Worse since the same Shape can appears at multiple locashytions in the same Canvas we have to know which occurrence we are talking about

Therefore SDDL introcluces a feature called a Drawing A Drawing is an object that represents a Shape at a particular position Le a specifie occurshyrence of a Shape in a Canvas Whenever a Shape is put inside a Canvas a Drawing is returned and can be assigned to a variable This gives a way to uniquely identify every occurrence of a Shape apshypearing in a Canvas If the same Shape is placed twice two different Drawings will be returned each referring to a different occurrence of the same Shape

a = Circle with [radius = 100] dl = put a at (-100 00) in main d2 = put a at (100 00) in main

Once a drawing has been defined a way to access its points is needed SDDL defines a syntax for extracting points from drawings

coord of (coord) ( (args) ) in (drawing)

Here one specifies the kind of point to use (( coord) ) and any particular arguments required to obtain it The available points are Shape specifie so only those kinds of points which make sense for the particular Shape can be used For instance one can get a point at a particular angle on a Circle This is also an example where an additional argument is needed For instance anglePoint(450) will give the point at 45 degrees

Finally to reference the drawing from which we take the point its clrawing Path (a dot separatecl path) from the main diagram must be given

a = Circle with [radius = 100] dl = put a at (-75 00) in main d2 = put a at (75 00) in main (coord of anglePoint(OO) in maindl)

(coord of anglePoint(1800) in maind2)

m In this example a line between two identical circles is drawn The drawing Paths are simple here since both drawings are made directly in main Thus only main followed by the drawing name is needed

Simply giving a Drawing is not sufficient in order to make reference points non-ambiguous complete drawing Paths are required as we will now show Lets go back to the two eyes we drew previously

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

The eye was defined by a circle and an ellipse both put inside a sub-Canvas Now lets say we want to draw a line between the two circles Each of those circles is defined in the sub-Canvas and they are as a matter of fact the same Drawing a Adding a link between a and itself wauld add a link between the sub-Canvas circle and itself (what could this mean) Adding the sub-Canvas to the main Canvas twice as we did before would just duplicate this structure inside the main Canvas

But since a Canvas is a Shape we get a drawing when we put the sub-Canvas inside main We can therefore identify each inner circle by listing the drawings required to access them as shown in the following SDDL example Thus we can always link together Shapes that are deeply nested inside a subshyCanvas a = Circ le with [radius=100] b = Ellipse with [xradius=200 yradius=100] c = put a in form put b in form fl = put form at (-200 00) in main f2 = put form at (200 00) in main (coord of anglePoint(1800) in mainflc) -gt

(coord of anglePoint(OO) in mainf2c)

6 Programming constructs and lists

SDDL also defines typical programming constructs For instance Iists are created and elements accessed in a syntax similar to most other dynamic languages Since the content of a list is a general Java Dbject you can create a list of objects that are not of the same type Thus an assignment like l = [20 (00 00) [] a--b]

is perfectly legal even if not typically very useful A more typical use of Iists would be list = [(00 00) (100 100)] 1= list[O] 12 = list [1]

1--12

Lists are nice but to use them properly adeshyquate programming canstructs are needed such as for and while loops SODL defines those permitting us to draw arrays of Shapes or riAfine points through a simple list

The ability to use loops significantly simplifies many diagrams in computer science In this example we first define a Iist of points Afterward using a for loop we link those points into a linear Path a = [(100 100) (200 100)

(200 200) (100 200)] for i from 0 to 2 do

209 TUGboat Volume 31 (2010) No 2

a[i]--a[H1)

end

Alternatively we coulcl get the same result using the following while loop i = 0 hile i 1= 3 do

a [il --a [i+1] i = i + 1

end

7 Functions

SDDL also permits the creation of functiolli inside the code Those must be written before the diagram description A SDDL function is defined with the keyword fun The list of arguments does not need to be typed only named The return type (if it exists) does not need to be specified either To cali the function in the resulting code a typical C-like cali is used fun dropManyCs i v n c)

for j from 1 to n do put s at i + jv in c

end

circle = Circ le vith [radius = 50] dropManyCcircle COO 00)

C50 00) 100 main)

(rtttt3JJJ) In this case we define a function that drops

many instances of a Shape s at different positions on a Canvas c The positions of the Shape are detershymined by an initial point i and a translation vector v Finally the number of Shapes placed is also given as a parameter n Each Shape is then placed at the initial point translated by the translation vector a certain number of times This permits us to create many circles along one line

One important point is the parameter for the Canvas in which we place the Shapes However we pass main as our parameter The reason for this is that SDDL does not possess global variables A function can only access its parameters and variables that have been defined inside the function Thus trying to place something in main From inside a funcshytion will yield an errer message saying the variable main is unknown

8 Primitives

SDDL as mentioned before is written in Java One of the nice features of Java is its libraries Many classes have been written for any number of different tasks and the number of functions and algorithms implemented is astonishing To rewrite libraries that are already defined in Java or to link them one by

one in SDDL seemed pointless It is much nicer to directly use those functions since theyre already there

Since Java is a reftexive language in the sense that the program knows about itself and can modify itself at will functions can be dynamically accessed at runtime We already use this feature to simplify the definition of the SDDL interpreter the interpreter doesnt have to know every possible type of Shape in order to work Using these same mechanisms permits loading classes at runtime and gives the user the power to cali From inside SDDL any Java function

This is done through so-called primitives which are defined using the keyword primitive followed by the name of the function as it will appear in SDDL Following that two strings are given one for the package in which the function is defined and one for the name of the function as it was defined in Java Any primitive declaration must be made prior to any function definition

Lets look at an example One of the main things a diagram description language would require is sorne basic mathematics and geometry libraries Java possesses a nice java lang math package which we would like to use especially the sin and cos funcshytions For this we will need to define two primitives primitive static sin javalangMath sin primitive static cos javalangMath cos

Once they are defined they can be called just like any other SDDL functions In this case we will use those functions to place circles around an invisible circle for i from 1 to 6 do

put Circle vith [radius = 50] at C200 cos(i 314 30) 200 sin(i 314 30raquo

in main end

00 o 0 00

9 A concrete example

Now that we have ail our tools lets use SDDL to describe a simple diagram of an automaton This is the complete code along with the resulting image circlel Circle vith [radius = 100] circle2 Circle vith [radius = 120] ellipse Ellipse vith [xradius = 500

yradius = 200] circle = put circlel at (-300 00) in form put circlel at C300 00) in form put circle2 at (300 00) in form

Drawing structured diagrams with SDDL

210

put ellipse in form

dl = put form at (1000 1000) in main d2 = put form at (1000 500) in main d3 = put form at (1000 -500) in main put Text with [text=$N(p_1)$]

at (1000 1000) in main put Text with [text=$N(p_2)$]

at (1000 500) in main put Text with [text=dots]

at (100000) in main put Text with [text=$N(p_n)$]

at (1000 -500) in main

put Text with [text = $s_O$] at (00 200) in main

d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle) (coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle) (coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

10 Modifying the hierarchy by adding shapes

Using what has been described above most diagrams can be created However many simplifications can be made and sorne domains may find it relevant to add classes specifie to their trade SDDL eases the modification of the Java hierarchy underneath the language by using reftexivity Any user who respects sorne basic guidelines will be able to have its class work automatica11y in SDDL without any specifie linking required

To do this every class must possess a certain number of properties Those properties are defined through setters and getters For instance for the

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

radius of a circle these are called setRadius and getRadius Any property that follows this rule will be accessible

Furthermore an empty constructor must also be defined that sets as much as possible default values for a11 properties of the defined Shape There are also sorne small functions to be defined like the draw and obtainPath functions Any reference points must also be defined with a function to obtain them

As an example lets say we would like to add a class to represent a cloud A cloud will have a number of spikes and a size The class definition (without function definition) that we would require would be the following

public class Cloud extends Shape double size int numberOfSpikes public Cloud() public void setSize(double size) public double getSize() public void setNumberOfSpikes(int n) public int getNumberOfSpikes() public void draw(AbstractPoint a

PrintWriter w) public Path obtainPath()

11 Future additions and availability

SDDL is available now at httpwwwinfo2uqam cal -villemaire_rReChereacuteheSDDL It is funcshytional though not by any means complete Many additional Shapes couid be added (in particular tree and graph classes) and options could be added to existing classes Development of the application conshytinues for the time being and a more thorough version will be made available

References

[1] John C Bowman and Andy Hammerlindl Asymptote A vector graphies language TUGboat The Communications of the TEX Users Group 29288-294 2008

o Mathieu Bourgeois Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada bourgeois dot mathieu dot 2 (at)

courrier dot uqam dot ca

o Roger Villemaire Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada villemaire dot roger (at) uqam dot ca httpintrainfouqamca

personnelsMembersvillemaire_r

APPENDICE B

PREacuteSENTATION DE LA GRAMMAIRE DE SDDL

Nous preacutesentons ici le contenu entier de la grammaire de SDDL tel que reacutealiseacute avec

SableCC Tous les eacuteleacutements du langage sont lagrave agrave lexception de la reacuteflexiviteacute dont les

deacutetails de code sont situeacutes dans la partie Java de notre projet

Package sddlsyntax

Helpers

any [O Oxffff]

tab 9 li 10 cr = 13

upper [ A 2 ]

lower [ a z]

digit [ 0 9]

name char = upper 1 lower 1 digit -

string_char = [[32 126] - ]

= J bulldot

not star = [any-] not_star_not_slash = [not_star - l]

Tokens

92

put_kwd = put at_kwd = at in_kwd = in fit_kwd = fit around_kwd = around if_kwd = if

while_kwd = while true_kwd = true false_kwd = false then_kwd = then else_kwd = else for_kwd = for from_kwd = from end_kwd = end to kwd to by_kwd = by do_kwd = do with_kwd = with and_kwd = and or_kwd = or fun_kwd = fun return_kwd = return primitive_kwd = primitive call_kwd = call static_kwd = static coord_kwd = coord of _kwd = of get_kwd = get

scaled_kwd = scaled slanted_kwd = slanted rotated_kwd = rotated translated_kwd = translated

straight_line_kwd = -- curved_line_kwd = - straight_fwd_arrow_kwd = -gt curved_fwd_arrow_kwd = -gt straight_bwd_arrow_kwd = (- curved_bwd_arrow_kwd = (- straight_bidir_arrow_kwd = (-gt curved_bidir_arrow_kwd = (-gt

93

plus = + minus = -

mult = div =

eq = == neq = = lt lt gt = gt leq lt= geq gt= not assign = =

dot = dot

l br = - r br ( l _par = ) r_par =

l cr = [ )

-r_cr = J

sc = comma =

id = lower name_char class_name = upper name_char

integer = (-) digit+ real = (-) digit+ dot digit+

) ) Il J )Ilstring string_char

blank = 1 tab 1 cr 1 If 1 cr If comment not_star ( (not_star_not_slash not_star))

Ignored Tokens

blank comment

Productions

file = [primitives] primitive [functions] function [stms] stm

94

primitive =

primitive_kwd static_kwd id [class_name] string [func_name] string signature sc

signature = l_par type_list r_par

type_li st = string [additional_types] additional_type

additional_type comma string

function = fun_kwd id l_par id_list r_par l_br [stms]stm r_br

id_list =

id [additional_ids] additional_id

additional id comma id

stm = exp exp sc 1

assign id assign exp sc 1

while while_kwd exp do_kwd [stms] stm end_kwd sc Il if if_kwd exp then_kwd [stms] stm else_part end_kwd sc 1

for for_kwd id from_kwd [low_bound] exp to_kwd [up_bound] exp do_kwd [stms] stm end_kwd sc 1

return return_kwd exp sc

else_part = else_kwd [stms] stm

exp = or exp or_kwd and_exp simple and_exp

and_exp = and and_exp and_kwd line_exp 1

simple line_exp

line_exp line line_exp line_op eq_exp with_part 1

95

1

1

simple eq_exp

line_op =

straight_Iine straight_line_kwd 1

curved_line curved_Iine_kwd 1

straight_fwd_arrow straight_fwd_arrow_kwd curved_fwd_arrow curved_fwd_arrow_kwd 1

straight_bwd_arrow straight_bwd_arrow_kwd curved_bwd_arrow curved_bwd_arrow_kwd 1

straight_bidir_arrow straight_bidir_arrow_kwd curved_bidir_arrow curved_bidir_arrow_kwd

eq_exp = eq [left] cmp_exp eq [right] cmp_exp 1

neq [left] cmp_exp neq [right] cmp_exp simple cmp_exp

cmp_exp = lt [left] add_exp lt [right] add_exp 1

gt [left] add_exp gt [right] add_exp 1

leq [left] add_exp leq [right] add_exp geq [left] add_exp geq [right] add_exp simple add_exp

add_exp = add add_exp plus mul_exp 1

minus add_exp minus mul_exp simple mul_exp

mul_exp =

mult mul_exp mult left_unary_exp div mul_exp div left_unary_exp simple left_unary_exp

left_unary_exp = not not left_unary_exp get get_kwd id from_kwd left_unary_exp put put_kwd exp at_part in_kwd left_unary_exp fit fit_kwd class_Dame around_kwd left_uoary_exp coord coord_kwd of_kwd id l_par

arg_Iist r_par in_kwd left_unary_exp 1

simple right_exp

96

right_exp = calI right_exp dot id l_par arg_Iist r_par 1

index right_exp l_cr exp r_cr 1

scaled right_exp scaled_kwd l_par eq_exp r_par slanted right_exp slanted_kwd l_par

[xslant] exp comma [yslant] eq_exp r_par rotated right_exp rotated_kwd l_par eq_exp r_par 1

translated right_exp translated_kwd l_par [xtranslate] term comma [ytranslate] eq_exp r_par 1

simple term

term =

par l_par exp r_par 1

point l_par [x_value] exp comma [y_value] exp r_par 1

drawing class_name with_part 1

var id 1

int integer 1

real real 1

true true_kwd 1

false false_kwd string string 1

list l_cr arg_Iist r_cr 1

static_call id l_par arg_Iist r_par

arg_Iist = exp [additional_args] additional_arg

additional_arg comma exp

with_part = with_kwd l cr options r_cr

options = option [additional_options] additional_option

additional_option comma option

option = id assign exp

APPENDICE C

PREacuteSENTATION DE LA HIEacuteRARCHIE

Nous preacutesentons ici la description complegravete de notre hieacuterarchie objet en Java Le tout est

deacutecrit agrave laide dun diagramme UML Toutefois afin de faciliter le formatage nous avons

seacutepareacute le tout en deux sections Le premier diagramme contient les noms des classes ainsi

que leurs relations dheacuteritage Par apregraves tous les diagrammes suivants repreacutesentent le

contenu speacutecifique de chaque classe sans les relations entre classes Ceci nous permet

dobtenir une vue densemble des classes tout en obtenant des deacutetails cruciaux sur

limpleacutementation de chaque classe

98

l -llill Pa aj f1 1 Sh middotisVIsible boolampan

+draw(locaton AbstractPoint oot PniltWriBl) void

+lsVlsigtle() boolean +copyO Shape +obtalnPathO Path

Drawlna

-numberOIDrawinm int =0 middotdrawingNumber (nt -dependendes DrawingD middotpointsDellned AbsttactPolntD middothasBeenDrawn booLean middotshape Shape dmWingName string middotdrowingPositlon AbstractPoint -position AbstnldPolnt

+Orawlog(s Shape) +Shape(s S~ location AbsbaclPoint) +setPositlcn(positlon AbslradPoinl) void +seIDraloVingName(nsme slJfng) void +gelName() string +geISUbDrawlng(name string) ~ Drawlng +re~~Jri~)slring

+addDeflO8dPoint(point AbstractPolnl) Int +hasBeenDraWn() booIean +lsDrawn() booIean +canBeDlBWn() booIean +getShape() Shape fdraw(Jocafion AbslraclPolnt out PrlnlWriler) void +obtainPathO Path -tdp(other Orawilg) AbslractPoilt

uare length double

+Squate() ~s ( ~ le)

ell-eoatMength double) void +getlongthO bulldouble +dmw(locabmiddotoo AbstrampctPoint out PrnMYler) void +obtainPath() Path ffOPY() Shape

99

Rectangle

-lengIh double -wldth double -100 KI boeacuteIean

+Rectangle() +Rectangle(length double wldth double) +selleogth~ength double) void +setWldth(Width double) void +seIRound(rlaquo)Ulld booIegravean) void +getlengtb( doubIe +getMdth() double +getRound() booIeao +getNorth(d Dmwlog) RefPoint lttget5outh(d Drawlng) RefPolnl +getwest(d DlaWlng) RefPoint +gelEaat(d Drawlng) RefPoinl +gelNorthwest(d Drawllg) RefPoInt +gelNortheast(d Drawlng) R1tfPolnt lttgetSou1hwe$(d Drawlng) RefPoInt +get5outheast(d Drawilg) RefPoklt +dl8wlocalion Absl18ctPoiIt Ougravet ~Mhl81 void ii)blainPathO ~ Path

CIrcIe

middotradlus double

+Clœ() +Clrcle(radlus double)

+COPYO Shape +setRadlus(radius ~ double) void +getRadius() double +getAnglePolnt(d Omwilg angle double) RefPoInt +dmwlocation AbstradPoirlt our AiltKtler) VOiCI iOblailPath() Path

ElIID8e

middotxradlus double middotyradlus double

+Ellpse() +copyO bullShape +setXRadlus(r double) void +setYRadIus(r doublrt) void -gelXRadlus() double +geIYRadius() double +draw(txalJon AbstractPomt out PrinMbl8l) IIOIumld iOblainPathO Path

100

Lino point1 AbslractPoln1 middotpoint2 AbstractPoint

+L1oe() +Llne(point1 AbstractPoint poill2 AbstractPolnt) +COPYO Shape +dmw(locaIJon AbsIroctPoinl out PrnIWril9f) void +selPolnt1 (poInl1 AbsttactPoint) void +seIPoill2(poinl2 AbslractPoinl) void +getPolnl1 () AbslraclPoinl tiJotPolnl2() AbstraclPolntn_~

EqTrtanale middotsim double

-EqTriangleQ +EqTrlangle(size double) +cOPYO Shape +setSlze(slze double) void +gets1ze() double +d18W(Jocolion AbstTadPoinl out Ptil1Wfit8f) void +oblalllPalhll Path

middotpath Path bulltext string middotposIlIon double -dir Poilt middotabsohJle boolean middothasTexl boolean

+Arrav(path Palh) +copyO Shape TCl(( ex s n~ U blo dn 010 aosolute boolean) void seISlartingTangcnl(dlr Poinl) void

seIEndflgTangenl(dir Potnt) void tgelPalhO Palh +obtalnPath Path

101

cany -canvasLlst Carwas(J -canvasPontLIsl AbstractPoinllJ daWVigUsl DrawingD dlawilgPolnlUst AbsJaCtPolntO middotIsMaIn booean canvasPosltion bullAbstmetPoint

+CsnYaS() copYO Shape +seteanvasPositIoR(posllon AbslraclPotnt) VOId +setMaln() void +f8Mai1() booIean +addShape(S Shapeloca1ion AbstradPoItit) Drawilg l+a~pe(S Shape IocagravetJon AllstraclPolnl name slring) DraNklg +getOtawiDg(I Inl) D1awlng ~elDtawfng(namamp string) bull Drawilg tgelOl8WIngiocal1on(namo stlllllJ) AbsllaclPoilt ~olDmwlngOrNull(name string) Drawilg tgelOrawinglocation(l int) AbslractPolnt o+getNumberOfDrawlngs() int +dl8w(location AbstrodPonr oui PrintwrllerJ void +dmwMain(oul PrinlWrllGr) void +drawCanvaa(locatlon AbSlractPoinl remalnlllQDraws Drawlna Il out Prlntwriter) void

Path -Bst AbstractPolnllJ middothasASIartilgTangent boolean -hasAEndhlgTangent booIean -startiogTangent Point middotendingTangent Point middot1sU1ear boolean

+PathO Psth(Ust AbstraclPoint 0) +Path(Dst Ab~tPolnt Q startingTangent Polnt endlngTangenl Point) +cOPYO Sh8p6 +addPoinl(poiumlnl Abstl8ClPoint) void +seIUnear() void +IsUnearO booloao +getPolnt(l Inl) AbsIraclPcInl +getPolnts() AbsIlaCPoht 0 o+getNumberOlPolnts() Rt +cyc1B() void -thasASI8rthgTangent() boolean +hasAEndingTangentO booIoan +getStattilgTangenlO PoiIl +getEndlngTangent() Polnl 4uumllSlartingTangenl(stllllngTangent Peint) w1d +seIEndIllQTangent(encliigTangenl ~nt) void +psthValue() strilg +dmwJocalion AbslradPoItlI oot FilMtJrer) void

102

Text

-told slfng

ImiddotTexl() +Texl(lext string) +sotText(tegravext string) void iil8tTeld() string +draw(Jocalion AbstroctPoJnl oof PrinWriter) void ~btalnPath() Path +CODV(J ShsD9

AbsctPolnl +altfd(second AbstraclPoinl) AbslractPolnt -tmulliply(multipier double) AbstraclPolnt +eombine(perœntage double second AbstraclPolnl) AbstractPoint +solvfJ() slrillg +COfNIJ AbslradPoinl

Point -x double y doub19

+POIcirclIO +POIOI(x double y double) +solvo() slting -+IoSlflngO string~ n bull

RefPolnt -mf8teflœDrawlng Drawlng -poIntNumbef Int

+RefPoint(referenceDrawing DraYIing poiolNu ber Illl) +SoNe() stmg +COPYO AbstroctPDAcirclf

lnauudJonPoint p Path

-q Palh

+lnlCfSecllonPoint(p Palh q Path) +COPYO AbstrampcfPoitlt +soIve() string

103

Un Point -point AbsbaclPoint -pIampStmg string -endStrlng string -value double

+UnaryMapPolnl(poInt AbstradPoInt) +ScW9() string +setMapTypeMultlpIy(vallJe double) void +c Abslr8ctPoinI

Bln oint frstPoint Absll8clPoinl secoodPoInt AbstrootPoint -pceSIring string -middIeSlrIng Itlfno -endString string

+8ilatyMapPolnt(fkstPoiIt Abstmc1Po1nt secondPolnt AbslraetPointl +cOPYO bull AbstraetPOOI +soAte() string +selMapTypeAddO void

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

APPENDICE D

PREacuteSENTATION DES DIAGRAMMES CHOISIS

Cet annexe comprend lensemble des quinze (15) diagrammes que nous avons choisis

comme base de qualiteacute pour notre projet Tel que mentionneacute preacuteceacutedemment nous avons

inclus agrave la fois le code de chaque diagramme en SDDL ainsi que le diagramme reacutesultant

Aucune analyse nest effectueacute pour ces dessins agrave lexception de ceux deacutejagrave analyseacutes au

chapitre 6

Start box triangle = EqTriangle with [size = 400J put triangle at (00 -100) in main put Text with [text = StartJ at (00 -50) in main

El box rectanglePos = (00 -500) rectangle = Rectangle with [length = 1600 width = 300J put rectangle at rectanglePos in main put Text with [text El J at rectanglePos - (600 00) in main put Text with [text $a leftarrow O$J

at rectanglePos + (-300 50) in main put Text with [text $b leftarrow l$J

at rectanglePos + (-300 -50) in main put Text with [text $a leftarrow l$J

at rectanglePos + (100 50) in main put Text with [text $b leftarrow O$J

at rectanglePos + (100 -50) in main put Text with [text $c leftarrow m$J

at rectanglePos + (500 50) in main put Text with [text $d leftarrow n$J

106

at rectanglePos + (500 -50) in main

1 E2 box 1 rectangle2Pos = (00 -1000) put rectangle at rectangle2Pos in main put Text with [text = E2 ] at rectangle2Pos (600 00) in main put Text with [text = $q leftarrow quotient(c div d)$]

at rectangle2Pos + (100 50) in main put Text with [text = $r leftarrow remainderCc div d)$]

at rectangle2Pos + (100 -50) in main

1 Round E3 box 1 rectangle3Pos = (00 -1500) roundRectangle = Rectangle with [length = 800 width 250

round = true] put roundRectangle at rectangle3Pos in main put Text with [text = E3 $r = O$] at rectangle3Pos in main

1 Stop box 1 stopPos = (1500 -1700) put triangle at stopPos in main put Text with [text = Stop] at stopPos + (00 50) in main

1 E4 box 1 rectangle4Pos = (00 -2000) put Rectangle with [length = 1600 width = 400]

at rectangle4Pos in main put Text with [text = E4] at rectangle4Pos + (-700 00) in main put Text with [text = $c leftarrow d d leftarrow r$]

at rectangle4Pos + (100 120) in main put Text with

[text = $t leftarrow a a leftarrow a a leftarrow t - qa$] at rectangle4Pos + (100 00) in main

put Text with [text = $t leftarrow b b leftarrow b b leftarrow t - qb$ ] at rectangle4Pos + (100 -120) in main

(00 -100) -) rectanglePos + (00 150) rectanglePos + (00 -150) -) rectangle2Pos + (00150) rectangle2Pos + (00 -150) -) rectangle3Pos + (00125) rectangle3Pos + (00 -125) -) rectangle4Pos + (00200) rectangle4Pos + (00 -200) -- rectangle4Pos + (00 -500)

rectangle4Pos + (-1000 -500) -- rectangle2Pos + (-1000 00) -) rectangle2Pos + (-800 00)

107

rectangle3Pos + (400 00) -gt rectangle3Pos + (1410 00) put Text with [text Yes] at rectangle3Pos + (480 -50) in main put Text with [text = No] at rectangle3Pos + (-80 -175) in main

Placing text notes put Text with [text Al $m gt 0 n gt 0$] at (3000 00) in main put Text with [text A2 $c=mgtO d=ngtO$] at (3000 -340) in main put Text with [text $a=b=O a=b=l$] at (3000 -460) in main put Text with [text A3 $am + bn = d am + b$]

at (3000 -740) in main put Text with [text = $0 leq r lt d gcd(dc) g$]

at (3000 -860) in main put Text with [text = A4 $am + bn d = gcd(m n)$]

at (3000 -1200) in main put Text with [text = A5 $am + bn d am + b$]

at (3000 -1540) in main put Text with [text = $0 lt r lt d gcd(cd) = g$]

at (3000 -1660) in main put Text with [text = A6 $am + bn = d am + b$]

at (3000 -1940) in main put Text with [text = $gcd(c d) = gcd(m n)$]

at (3000 -2060) in main

(2500 00)-(2000 -50)-(1500 -150)-gt(00 -200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -400)-(2000 -450)-(1500 -650)-gt(00 -700) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -800)-(2000 -850)-(1500 -1150)-gt(00 -1200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2200 -1200)-(2000 -1200)-(1500 -1250) -gtrectangle3Pos + (900 00) with [startingTangent = (-10 00) endingTangent (-10 -10)]

(2250 -1600)-(2000 -1700)-(1500 -1900) -(1000 -1750)-gt(00 -1700) with [startingTangent = (-10 00) endingTangent (-10 00)]

(2250 -2000)-(1500 -2200)-gt(00 -2400) with [startingTangent = (-10 00) endingTangent (-10 00)]

108

~-- Al m gt On gt O

A2 c = m gt 0 d = n gt 0 a = b = 0 a = b = 1

A3 am + bn = dam + bdeg~ T lt dgcd(dc) = 9 E2

_--- A4 am + bn = d = gcd(m n)

A5 am + bn = dam + b Sto 0lt T lt dgcd(cd) = 9

Cf- d d f- T A6 am + bn = d am + bE4 t f- a a f- a a f- t - qa gcd(cd) =gcd(mn)t f- b b f- b b f- t - qb

primitive static sin javalangMath sin primitive static cos javalangMath cos primitive static sqrt javalangMath sqrt

fun ellipseCangle length width) return Clength cosCangle 20 31415 3600)

width sinCangle 20 31415 3600))

fun ellipseDeriveCangle length width) length2 = length length width2 = width width sinus = sinCangle 31415 1800) sinus2 = sinus sinus cosinus = cosCangle 31415 1800) cosinus2 = cosinus cosinus x = -10 Clength sinus)

sqrtCwidth2 cosinus2 + length2 sinus2) y = Cwidth cosinus) sqrtCwidth2 cosinus2 + length2 sinus2) return Cxy)

avail = Text with [text=AVAIL] link = Text with [text=LINKCP)] t = Text with [text=T]

109

put avail at ellipse(900 1000 500) in main put t at ellipse(1800 1000 500) in main put link at ellipse(OO 1000 500) in main

(ellipse(70 1000 500))-(ellipse(450 1000 500)) -gt(ellipse(750 1000 500))

(ellipse(1050 1000 500))-(ellipse(1350 1000 500)) -gt(ellipse(1730 1000 500))

(ellipse(1930 1000 500))-(ellipse(2700 1000 500)) -gt(ellipse(3550 1000 500))

AVAIL

~ T LINK(P)

primitive static sin javalangMatb sin primitive static cos javalangMatb cos

fun circular(angle radius) return (radius cos(31415 angle 1 1800)

radius sin(31415 angle 1 1800))

circleradius = 400 circle = Circle with [radius=100] g Text with [text=G] r = Text with [text=R] y Text with [text=Y]

put circle at (circular(300 circleradius)) in main put r at (circular(300 circleradius)) in main put circle at (circular(900 circleradius)) in main put r at (circular(900 circleradius)) in main put circle at (circular(1500 circleradius)) in main put g at (circular(1500 circleradius)) in main put circle at (circular(2100 circleradius)) in main put g at (circular(2100 circleradius)) in main put circle at (circular(2700 circleradius)) in main

110

put g at (circular(2700 circleradius)) in main put circle at (circular(3300 circleradius)) in main put y at (circular(3300 circleradius)) in main

(circular(450 circleradius))-(circular(600 circleradius)) -gt(circular(750 circleradius))

(circular(1050 circleradius))-(circular(1200 circleradius)) -gt(circular(1350 circleradius))

(circular(1650 circleradius))-(circular(1800 circleradius)) -gt(circular(1950 circleradius))

(circular(2250 circleradius))-(circular(2400 circleradius)) -gt(circular(2550 circleradius))

(circular(2850 circleradius))-(circular(3000 circleradius)) -gt(circular(3150 circleradius))

(circular(3450 circleradius))-(circular(OO circleradius)) -gt(circular(150 circleradius))

put Text with [text=tinyNEXTR] at (circular(900 circleradius)) + (00 150) in main

put Text with [text=tinyNEXTG] at (circular(-900 circleradius)) + (00 -150) in main

put Text with [text=tinyCURRENT] at (circular(-300 circleradius))+ (1~0 -150) in main

NEXTR

NEXTG

fun left(d)

return 016 coord of west in drectangle + 084 coord of east in drectangle

fun right(d)

return 016 coord of east in drectangle +

111

084 coord of west in drectangle

rectanglel = Rectangle with [length=600 width=200) rectangle2 = Rectangle with [length=200 width=200) circle = Circ le with [radius=10) put rectanglel in form rectangle = put rectangle2 in form put circle at (-200 00) in form put circle at (200 00) in form

dl = put form at (00 00) in main d2 = put form at (-600 -500) in main put Text with [text=IA) at (-600 -500) in main d3 = put form at (-1200 -1000) in main put Text with [text=IB) at (-1200 -1000) in main d4 = put form at (-1800 -1500) in main put Text with [text=ID) at (-1800 -1500) in main d5 = put form at (-600 -1500) in main put Text with [text=IE) at (-600 -1500) in main d6 = put form at (00 -1000) in main put Text with [text=IC) at (00 -1000) in main d7 = put form at (600 -1500) in main put Text with [text=f) at (600 -1500) in main d8 = put form at (-400 -2000) in main put Text with [text=IG) at (-400 -2000) in main dg = put form at (300 -2000) in main put Text with [text=IH) at (300 -2000) in main dl0 = put form at (1000 -2000) in main put Text with [text=JI) at (1000 -2000) in main

(left(dl))-gt(coord of north in d2rectangle) (right(dl))-gt(coord of east in dlrectangle + (00 50)) (left(d2))-gt(coord of north in d3rectangle) (right(d2))-gt(coord of north in d5rectangle) (left(d3))-gt(coord of north in d4rectangle) (right(d3))-gt(coord of south in d2rectangle) (left(d4))-gt(coord of west in dlrectangle + (00 50)) (right(d4))-gt(coord of south in d3rectangle) (left(d5))-gt(coord of north in d6rectangle) (right(d5))-gt(coord of north in d7rectangle) (left(d6))-gt(coord of south in d2rectangle) (right(d6))-gt(coord of north in d8rectangle)

112

(left(d7raquo-gt(coord of north in d9rectangle) (right(d7raquo-gt(coord of north in dl0rectangle) (left(dSraquo-gt(coord of south in d6rectangle) (right(d8raquo-gt(coord of south in d5rectangle) (left(d9raquo-gt(coord of south in d5rectangle) (right(d9raquo-gt(coord of south in d7rectangle) (left(dl0raquo-gt(coord of south in d7rectangle) (right(dl0raquo-gt(coord of south in dlrectangle + (100 00raquo

put Text wi th [text=List head] at coord of north in dlrectangle + (00 50) in main

circle = Circle with [radius = 100] bigcircle = Circle with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvasl put circle at 050 150) in canvasl put Text with [text = H] at 050 150) in canvasl put circle at (-150 150) in canvasl put Text with [text J] at (-150 150) in canvasl put Text with [text = B] at (00 -150) in canvasl

put bigcircle in canvas2

113

put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = Fil] at (150 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = liE] at (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvasl at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = Ali] at (00 -300) in main put bigellipse in main

A

fun drawBinaryTree(d s 0 dh dv n)

put s at a in d put 0-(0 + (-10 dh -10 dvraquo in d put 0-(0 + (db -10 dvraquo in d if (n == 1)

then return 0 else drawBinaryTree(d sa + (-10 dh -10 dv) db 20 dv n - 1) drawBinaryTree(d s a + (db -10 dv) db 20 dv n - 1) end

(0000)--(0000)

114

orlgln = (00 00) dv = 200 dh = 1000 bullet = Circle with [radius = 20) drawBinaryTree(main bullet origin dh dv 7)

bullet = Circle with [radius = 20] put bullet in main put bullet at (-300 -300) in main put bullet at (-600 -600) in main put bullet at (00 -600) in main put bullet at (300 -300) in main

(00 00)--(-300 -300) (00 00)--(300 -300) (-300 -300)--(-600-600) (-300 -300)--(00 -600)

(-100 00)-(-500 -300)-(-650 -650)-(-300 -400)shy(50-650)-(00-500)-(-150-300)-(-100 -200)shy(00-100)-(250-320)-(350-350)shy(320 -270)-gt(100 00)

circlel Circle with [radius 100]

lL5

circle2 = Circle with [radius = 120] ellipse = Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (100 0 500) in main d3 put form at (1000 -500) in main put Text with [text I$N(p_1)$] at (1000 1000) in main put Text with [text I$N(p_2)$] at (1000 500) in main put Text with [text dots] at (100 0 o 0) in main put Text with [text $N(p_n)$] at (1000 -500) in main

put Text with [text $S_O$] at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

sa

fun dropMany(f n s v c) for i from 10 to n do

put f at (s + (i - 10) v) in c

116

end

square = Square with [length=200] changeVec = (00 -200) dropMany(square 40 (00 00) changeVec main) dropMany(square 30 (500 00) changeVec main) dropMany(square 10 (1000 00) changeVec main) dropMany(square 10 (1500 00) changeVec main) put Text with [text=IO] at (00 00) in main put Text with [text=ll] at (00 -200) in main put Text with [text=13] at (00 -400) in main put Text with [text=17] at (00 -600) in main put Text with [text=bf ail] at (500 200) in main put Text with [text=12] at (500 00) in main put Text with [text=14] at (500 -200) in main put Text with [text=17] at (500 -400) in main put Text with [text=17] at (1000 00) in main put Text with [text=bf $a~b~+$] at (1500 200) in main put Text with [text=18] at (1500 00) in main put Text with [text=none ] at (2000 00) in main

(120 100)-gt(380 100) (620 100)-gt(880 100) (112 0 10 0) - gt(138 0 10 0) (1620 100)-gt(1880 100)

a ab+

~ -m-0-0-none 7

put Text with [text=IS] in main put Text with [text=A] at (00 -200) in main put Text with [text=B] at (00 -400) in main put Text with [text=$alpha$] at (-600 -600) in main put Text with [text=$beta$] at (-300 -600) in main put Text with [text=$gamma$] at (00 -600) in main put Text with [text=$y$] at (300 -600) in main put Text with [text=$z$] at (600 -600) in main

117

(-50 -50)--(-700 -540)--(-500 -540) (50 -50)--(700 -540)--(500 -540) (-50 -250)--(-400 -540)--(-200 -540) (50 -250)--(400 -540)--(200 -540) (-50 -450)--(-100 -540)--(100 -540)--(50 -450)

put Text with [text=D] in main

put Text with [text=T] at (-500 -500) in main put Text with [text=bf real] at (-500 -900) in main put Text with [text=4] at (-350 -500) in main put Text with [text= type] at (-150 -500) in main

put Text with [text=L] at (500 -500) in main put Text with [text=inh] at 050 -500) in main put Text with [text=5] at (350 -500) in main put Text with [text=6] at (650 -500) in main put Text with [text=entry] at (850 -500) in main

put Text with [text=bf $id_3$] at (900 -900) in main put Text with [text=bf ] at (500 -900) in main put Text with [text=3] at 0050 -900) in main put Text with [text=entry] at 0350 -900) in main

put Text with [text=L ] at (00 -1000) in main put Text with [text=inh] at (-350 -1000) in main put Text with [text=7] at (-150 -1000) in main put Text with [text=8] at 050 -1000) in main put Text with [text=entry] at (350 -1000) in main

put Text with [text=bf ] at (00 -1400) in main put Text with [text=bf $id_2$] at (400 -1400) in main put Text with [text=2] at (550 -1400) in main put Text with [text=entry] at (750 -1400) in main

put Text with [text=L] at (-500 -1500) in main

118

put Text with [text=inh] at (-850 -1500) in main put Text with [text=19] at (-650 -1500) in main put Text with [text=110] at (-350 -1500) in main put Text with [text= ent ry] at (-150 -1500) in main

put Text with [text=bf $id_l$] at (-500 -1900) in main put Text with [text=ll] at (-350 -1900) in main put Text with [text= ent ry ] at (-150 -1900) in main

(-100 -100)--(-400 -400) (-500 -600)--(-500 -800) (100 -100)--(400-400) (500 -600)--(500 -800) (600 -600)--(800 -800) (400 -600)--(100 -900) (100 -1100)--(400 -1300) (00 -1100)--(00 -1300) (-100 -1100)--(-400 -1400) (-500 -1600)--(-500 -1800)

(-300 -400)-(00 -300)-gt(300 -400) (400 -600)-(500 -650)-gt(600 -600) (950 -800)-gt(700 -600) (300 -600)-gt(-50 -900) (-100 -1100)-(00-1150)-gt(100 -1100) (450 -1300)-gt(200 -1100) (-200 -1100)-gt(-550 -1400) (-550 -1500)-(-500 -1550)-gt(-450 -1500) (-350 -1800)-gt(-350 -1600)

119

D

~ T 4 type inh 5 L 6 entry

entryrL ~~3 inh 7 L 8 entry

~2entrY inh 9 JJ lOentry

1 t id l 1 entry

circle = Circle with (radius=100J bigcircle = Circle with (radius=SOOJ

cl put circle at (00 200) c2 put circle at (200 00) c3 put circle at (-200 00) c4 put circle at (00 -200) bcl = put bigcircle in graphl

cS = put circle at (00 200) c6 = put circle at (00 -200) bc2 = put bigcircle in graph2

c7 put circle at (00 lS0)

in graphl in graphl in graphl in graphl

in graph2 in graph2

in graph3 c8 put circle at (200 -200) in graph3 c9 put circle at (-200 -200) in graph3 bc3 = put bigcircle in graph3

gl put graphl in main g2 put graph2 at (-1000 -1500) in main g3 put graph3 at (1000 -1000) in main

1 lines in first drawing (coord of anglePoint(900) in mainglc4)-gt

(coord of anglePoint(2700) in mainglcl) (coord of anglePoint(1800) in mainglcl)-gt

(coord of anglePoint(900) in mainglc3) (coord of anglePoint(OO) in mainglcl)-gt

120

(eoord of anglePoint(900) in maingle2) (eoord of anglePoint(2700) in maingle3)-gt

(eoord of anglePoint(1800) in maingle4) (eoord of anglePoint(2700) in maingle2)-gt

(eoord of anglePoint(OO) in maingle4)

(eoord of anglePoint(2700) in maingle3)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(1800) in maingle4)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(OO) in maingle2)shy(eoord of anglePoint(3450) in mainglbel)

lines in seeond drawing (eoord of anglePoint(2700) in maing2e5)-gt

(eoord of anglePoint(900) in maing2e6) erdl = eoord of anglePoint(1800) in maing2e6 erd2 = eoord of anglePoint(1800) in maing2e5 erdl-((erdl + erd2)20 + (-200 00))-gterd2

(eoord of anglePoint(900) in maing2e5)shy(eoord of anglePoint(900) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(450) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(OO) in maing2be2)

(eoord of anglePoint(OO) in maing2e6)shy(eoord of anglePoint(OO) in maing2be2)

lines in third drawing (eoord of anglePoint(1800) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e9) (eoord of anglePoint(OO) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e8) (eoord of anglePoint(OO) in maing3e9)-gt

(eoord of anglePoint(1800) in maing3e8) crd3 = eoord of anglePoint(OO) in maing3e8 erd4 = eoord of anglePoint(900) in maing3e7 erd3-(erd3 + erd4) 20 + (200 200)-gterd4

erd4--(eoord of anglePoint(1050) in maing3be3) (eoord of anglePoint(1800) in maing3e7)-shy

(eoord of anglePoint(1850) in maing3be3) (coord of anglePoint(1800) in maing3e9)-shy

121

(coord of anglePoint(1750) in maing3bc3)

lines between drawings (coord of anglePoint(2250) in mainglbcl)-gt

(coord of anglePoint(900) in maing2bc2) (coord of anglePoint(3450) in mainglbcl)-gt

(coord of anglePoint(1050) in maing3bc3) (coord of anglePoint(OO) in maing2bc2)-gt

(coord of anglePoint(1850) in maing3bc3) crd5 = coor~ of anglePoint(1750) in maing3bc3 crd6 = coord of anglePoint(450) in maing2bc2 crd5-(crd5 + crd6) 20 + (000 300)-gtcrd6

Texts crdTextl coord of anglePoint(1350) in mainglbcl + (-200 00) crdText2 = coord of anglePoint(1350) in maing2bc2 + (-100 100) crdText3 = coord of anglePoint(450) in maing3bc3 + (100 100) put Text with [text=$R_l$] at crdTextl in main put Text with [text=$R_2$] at crdText2 in main put Text with [text=$R_3$] at crdText3 in main

primitive getClip sddlhierarchyDrawing clip primitive setVisible sddlhierarchyShape setVisible

122

1 clip takes 3 drawings and a canvas first is a line second and third are two shapes which intersect line will draw a line between the intersection points the line creates with the two shapes 1

fun clip(dl d2 d3 canvas)

dlsetVisible(false) drawl = put dl in canvas cl = drawlgetClip(d2) c2 = drawlgetClip(d3) put cl--c2 in canvas

circle Circle with [radius=100] dl = put circle in main put Text with [text=14] in main d2 = put circle at (-400 -400) in main put Text with [text=13] at (-400 -400) in main d3 = put circle at (-700 -800) in main put Text with [text=12] at (-700 -800) in main d4 = put circle at (400 -400) in main put Text with [text=18] at (400 -400) in main d5 = put circle at (150 -800) in main put Text with [text=17] at 050 -800) in main d6 = put circle at (650 -800) in main put Text with [text=110] at (650 -800) in main d7 = put circle at (220 00) in main put Text with [text=14] at (220 00) in main d8 = put circle at (620 -400) in main put Text with [text=18] at (620 -400) in main dg = put circle at (370 -800) in main put Text with [text=7] at (370 -800) in main dl0 = put circle at (00 -1200) in main put Text with [text=5J at (00 -1200) in main

Il = (00 00)--(-400 -400) clip(ll dl d2 main) 12 = (-400 -400)--(-700 -800) clip(12 d2 d3 main) 13 = (00 00)--(400 -400) clip(13 dl d4 main) 14 = (400 -400)--(150 -800)

123

clip(14 d4 d5 main) 15 = (400 -400)--(650 -SOO) clip(15 d4 d6 main) 16 = (220 00)--(-400 -400) clip(16 d7 d2 main) 17 = (220 00)--(620 -400) clip(17 d7 dS main) lS = (620 -400)--(650 -SOO) clip(lS dS d6 main) 19 = (620 -400)--(370 -SOO) clip(19 dS d9 main) 110 = (370 -800)--(00 -1200) clip(110 dg d10 main)

2

5

fun niceArrow(c dMain dLeft dRight) firstPoint = coord of southwest in dMainrectangle + (30 30) secondPoint = coord of southeast in dMainrectangle + (-30 30)

firstEnd = coord of north in dLeftrectangle secondEnd = coord of north in dRightrectangle

put firstPoint-gtfirstEnd in c put secondPoint-gtsecondEnd in c

point1 firstPoint 50 60 + secondPoint 10 60 point2 firstPoint 40 60 + secondPoint 20 60 point3 firstPoint 30 60 + secondPoint 30 60 point4 firstPoint 20 60 + secondPoint 40 60 point5 firstPoint 10 60 + secondPoint 50 60

put (coord of southwest in dMainrectangle + (-25 25))shy(coord of south in dMainrectangle + (00 -50))shy

124

(coord of southeast in dMainrectangle + (25 25)) in c

put pointl--(pointl + (-1 0 30 -10 70)) in c put point2--(point2 + (-1 0 10 -10 85)) in c put point3--(point3 + (00 -10 90)) in c put point4--(point4 + (1 0 -10 85)) in c put point5--(point5 + (30 -1 0 70)) in c

put Text with [text=smallt] at point3 + (00 -130) in c

rect = Rectangle with [length=300 width=200] r = put rect in main put Text with [text=ll] in main rectangle = put rect in form put Text with [text=$t-l$] in form

dl = put form at (-1400 -500) in main dll = put form at (-2000 -1000) in main dlr = put form at (-800 -1000) in main dlll put form at (-2300 -1500) in main dllr put form at (-1700 -1500) in main dlrl put form at (-1100 -1500) in main dlrr put form at (-500 -1500) in main

dr = put form at (1400 -500) in main drr = put form at (2000 -1000) in main drl = put forro at (800 -1000) in main drrr put form at (2300 -1500) in main drrl put form at (1700 -1500) in main drlr put form at (1100 -1500) in main drll put form at (500 -1500) in main

put Text with [text=l root[T]] at (-300 300) in main (-300 240)-gt(coord of north in mainr)

dots = Text with [text=dots] put dots at (-1400 -1000) in main put dots at (-2000 -1500) in main put dots at (-SOO -1500) in main put dots at (1400 -1000) in main put dots at (2000 -1500) in main put dots at (800 -1500) in main

125

(coord of southwest in mainr + (30 30))-gt (coord of north in maindlrectangle)

(coord of southeast in mainr + (-30 30))-gt (coord of north in maindrrectangle)

niceArrow(main dl dll dlr) niceArrow(main dll dlll dllr) niceArrow(main dlr dlrl dlrr) niceArrow(main dr drl drr) niceArrow(main drl drll drlr) niceArrow(main drr drrl drrr)

root[T]

rect = put Rectangle with [length=600 width=200l in form put Rectangle with [length=200 width=200] at (200 00) in form bullet = put Circle with [radius=10] at (200 00) in form

put Text with [text=IF] in main

fl put form at (700 00) in main f2 put form at (1500 00) in main f3 put form at (2300 00) in main f4 put form at (3100 00) in main

(coord of anglePoint(OO) in mainflbullet)-gt (coord of west in mainf2rect)

(coord of anglePoint(OO) in mainf2bullet)-gt (coord of west in mainf3rect)

(coord of anglePoint(OO) in mainf3bullet)-gt (coord of west in mainf4rect)

126

ptW = coord of west in mainflrect ptE = coord of east in mainf4rect

ptW + (-300 OO)-gtptW ptE + (300 OO)-gtptE

put Text with [text=R] at (3800 00) in main

ptS = coord of anglePoint(2700) in mainf4bullet ptS2 = ptS + (00 -350)

ptS--ptS2 ptS2 + (-50 00)--ptS2 + (50 00) ptS2 + (-35 -20)--ptS2 + (35 -20) ptS2 + (-20 -40)--ptS2 + (20 -40)

BIBLIOGRAPHIE

Adobe Systems Incorporated 1994 PostScript Language Reference Manual http j jwwwadobecomjproductsjpostscriptjpdfsjPLRMpdf

-- 2006 PDF Reference Version 17 Adobe Systems Incorporated 6th eacutedition

-- 201Oa Adobe Postscript 3 http j jwwwadobecomjproductsjpostscriptj

2010b PDF Developer Corner PDF Reference http j jwwwadobecomjdevnetjpdfjpdLreferencehtm1

Aho A V R Sethi et J D Ullman 1986 Compilers Principles Techniques and Tools Addison-Wesley

American Mathematical Society 2008 Why Do We Recommend LaTeX http j jwwwamsorgjpublicationsjauthorsjtexjlatexbenefits

Apple Computer Inc 1996 The TrueType Reference Manu al Apple Computer Inc Cupertino California

Bourgeois M 2010 Introduction to Drawing Diagrams with SDDL httpj jrivershyvalley tvjintroduction-to-drawing-structured-diagrams-in-sddlj

Bourgeois M et R Villemaire 201Oa laquoDrawing Structured Diagrams with SDDL raquo

TUGBoat vol 31 no 2 p 206-210

-- 201Ob SDDL http j jwwwinfo2uqamca-villemaireJjRecherchejSDDLj

Bowman J C 2007 laquoThe 3D Asymptote Generalization of Metapost Beacutezier Interposhylation raquo Proceedings in Applied Mathematics and Mechanics

Chomsky N 1956 laquoThree Models for the Description of Language raquo Information Theory IRE Transactions on vol 2 no 3 p 113-124

Cormen T A C E Leiserson R L Rivest et C Stein 2001 Introduction to Algoshyrithms The MIT Press

Davis M R Sigal et E Weyuker 1994 Computability Complexity and Languages Pundamentals of Theoretical Computer Science Morgan Kaufmann

Dhu D-Z et K-I Ko 2000 Theory of Computational Complexity Wiley

Gagnon Eacute 1998 laquoSableCC an Object-Oriented Compiler Framework raquo Meacutemoire de maicirctrise McGill University

128

-- 2009 ObjeetMacro - SableCC httpsableccorgwikiObjectMacro

Group O M 1999 Unified Modeling Language (version 13) Rapport Object Manashygement Group

Hammerlindl A J Bowman et T Prince 2010a Asymptote httpasympshytotesourceforgenet

-- 20lOb Asymptote The Veetor Graphies Language httpasympshytotesourceforgenet asymptote pdf

Hobby J 1992 laquo A Users Manual for MetaPost raquo Computing Science Technical Report vol 162

International Organization for Standardization 2008 Document Management - Elecshytronic Document File Format for Long-Term Preservation - Part 1 Use of PDF 14 (PDF A-1) ISO 19005-1 2005

Jr F S H et S M Kelley 2007 Computer Graphics using GpenGL Prentice-Hall 3e eacutedition

Knuth D 1968 The Art of Computer Programming Addison-Wesley

-- 1984 The TeXbook Reading Mass Addison-Wesley

-- 1986 The Metafontbook Reading Mass Addison-Wesley

-- 1999 Digital Typography Stanford California Center for the Study of Language and Information

Lamport L et D Bibby 1986 LATEX A Document Preparation System T 260 Citeseer

Lancaster D 2005 Approximating a Circle or an Ellipse using Four Bezier Cubic Splines Rapport Synergetics

Maplesoft 2010 Maple 14 User Manual

McNaughton R et H Yamada 1960 laquoRegular Expressions and State Graphs for Automata raquo -IRE Transactions on Electronic Computers no l p 39-47

Object Management Group 2009 UML httpwwwumlorgj

Oracle 2010 Java httpwwwjavacomj

Pierce B C 2002 Types and Programming Languages MIT Press

Riskus A 2006 laquoApproximation of a Cubic Bezier Curve by Circular Arcs and Vice Versa raquo Information Technology and Control vol 35 no 4 p 371-378

Rose K H 2008 XY-pic Home Page httptugorgapplicationsjXy-picj

129

Rose K H et al 2010 laquoXY-pic Users Guide raquo DIKU Universiteacute de Copenhague vol 1

Rumbaugh J M Blaha W Premerlani F Eddy et W Lorensen 1991 ObjectshyOriented Modeling and Design Prentiee-Hall

Saunders J H 1989 laquoA Survey of Objeet-Oriented Programming Languages raquo JOOP Journal of Object-Oriented Programming vol 1

Sabel J et D Friedman 1996 An Introduction to Refiection-Oriented Programming San Francisco Reflection 96

TeX Users Group 2009 MetaPost - TeX User Groups httptugorgmetaposthtml

TIOBE Software 2008 Tiobe Index httpwwwtiobecomindexphpcontentshy paperinfo tpeiindexhtml

Ullman J J Hopcroft et R Motwani 1979 Introduction to Automata Theory Lanshyguages and Computation Addison-Wesley

Van Zandt T 1993a PSTricks-PostScript Macros for Generie TEX httpwwwtexuniyaracrudocpsLugpdf

-- 1993b laquoPSTricks PostScript Macros for Generie 1EX Users Guide raquo Version 093 a http jjwww tug orgjapplicationsjPSTricks

Page 9: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux

x

66 Code du diagramme de Venn 79

REacuteSUMEacute

Dans ce meacutemoire nous analysons la description de diagrammes structureacutes dans le domaine des matheacutematiques discregravetes et de linformatique theacuteorique Cette analyse seffectue agrave partir de meacutethodes eacutetablies du geacutenie logiciel Nous trouvons un ensemble de proprieacuteteacutes que nous recherchons dans une solution informatique nous permettant de creacuteer ces diagrammes Nous analysons aussi les outils classiques agrave partir des proprieacuteteacutes preacuteceacutedentes qui nous permettent de reacutealiser ces diagrammes dans un environnement I51EX Nous observons que ces outils ne sont pas aussi puissants quils le pourraient en fonction des proprieacuteteacutes eacutetablies par notre analyse

Par la suite en nous basant sur les meacutethodes de repreacutesentation graphique des courbes et sur la theacuteorie des langages informatiques nous jetons les bases dun lanshyguage de description Nous preacutesentons aussi un outil deacuteveloppeacute en Java qui nous pershymet de deacutecrire aiseacutement nos diagrammes dinformatique theacuteorique et de matheacutematiques discregravetes agrave partir dune hieacuterarchie dobjets claire et extensible Nous avons impleacutementeacute les eacuteleacutements essentiels de notre langage en SDDL (Structured Diagram Description Lanshyguage) Nous lavons aussi valideacute agrave laide dexemples repreacutesentatifs tireacutes de sources daushytoriteacute Nous avons finalement preacutesenteacute notre solution dans le cadre de la confeacuterence TUG 2010 Nous lavons aussi preacutesenteacute avec un article dans la revue du TeX Users Groups TUG

Mots cleacutes diagrammes informatique theacuteorique matheacutematiques discregravetes langage

INTRODUCTION

Le logiciel de mise en page de document U1EX est devenu llne reacutefeacuterence pour la creacuteation

de documents matheacutematiques (American Mathematical Society 2008) Plusieurs raisons

suscitent cet inteacuterecirct une structure naturelle permettant de repreacutesenter clairement ses

ideacutees le formatage automatique de qualiteacute et un reacutesultat final de qualiteacute professionnelle

agrave un coucirct moindre

Un traiteacute matheacutematique peut contenir plusieurs types dobjets textes formules grashy

phiques diagrammes etc Dans le cas preacutesent nous nous inteacuteressons principalement agrave

la repreacutesentation de diagrammes Par diagramme on entend un dessin qui possegravede une

structure discregravete sous-jacente (souvent combinatoire mais pas obligatoirement) Un

exemple simple serait un graphe ou un arbre

Agrave partir du moment ougrave nous nous inteacuteressons agrave ces diagrammes et agrave leur repreacutesentation

il devient inteacuteressant de voir ce que U1EX nous fournit afin de geacuteneacuterer des structures

de qualiteacute En effet les diagrammes sont essentiels agrave la transmission effective des ideacutees

et des reacutesultats en informatique et en matheacutematiques discregravetes De plus la consistance

nous oblige agrave chercher agrave faire nos diagrammes agrave partir dun modegravele coheacuterent Entre

autres il nous faut conserver la mecircme police dans les diagrammes et dans le texte

en plus davoir accegraves aux symboles matheacutematiques Nous pourrions aussi importer des

diagrammes exteacuterieurs agrave U1EX mais les reacutesultats obtenus ne serait pas consistant avec

le texte Nous devons donc chercher agrave obtenir une meacutethode de repreacutesentation adeacutequate

pour nos diagrammes

Bien sucircr il existe deacutejagrave plusieurs solutions agrave ce problegraveme Il nous faut donc les analyser

avec soin avec des critegraveres formels Cela implique de reacutepertorier les diffeacuterents paquets

U1EX permettant de faire du dessin avec leurs diffeacuterentes proprieacuteteacutes Il faut ensuite

2

ajouter les logiciels qui utilisent JbTEX indirectement donc qui nen font pas partie

mais sen servent tout de mecircme Cela nous donne une vue densemble complegravete des

solutions deacutejagrave existantes agrave notre problegraveme

Ensuite avant de penser agrave analyser ces solutions nous devons deacuteterminer ce que nous

voulons exactement Agrave cette fin nous avons analyseacute le processus qua utiliseacute Donald

Knuth creacuteateur de TEX agrave la base de Jb1EX afin de mateacuterialiser son logiciel de formatage

Nous devons aussi utiliser un ensemble de contraintes agrave soumettre agrave nos diffeacuterentes

solutions Il eacutetait essentiel dutiliser Jb1EX pour le formatage du texte mais aussi pour

la clarteacute deacutecriture la qualiteacute de la documentation et la capaciteacute de creacuteer aiseacutement des

structures Par la suite il devient aiseacute et tregraves formel danalyser chacunes des diffeacuterentes

solutions proposeacutees

Malheureusement cette analyse nous a permis de constater quaucune solution neacutetait

suffisamment bonne pour satisfaire nos besoins La plupart des paquets eacutetaient trop

simples alors que plusieurs eacutetaieentiernt composeacutes de macros rendant la veacuterification de

code quasi impossible Quelques solutions (telles que XY-Pic (Rose 2008) Metapost

(TeX Users Group 2009) et Asymptote (Hammerlindl Bowman- et Prince 2010a))

fournissaient de nombreuses ideacutees inteacuteressantes mais aucune ne convenait parfaitement

agrave nos besoins Nous en sommes donc venus agrave la conclusion que la meilleure solution

serait de creacuteer notre propre solution tout en reacuteutilisant les ideacutees deacuteveloppeacutees par les

solutions preacuteceacutedentes

Afin de creacuteer une solution robuste nous avons deacutecideacute de creacuteer une hieacuterarchie orienteacutee obshy

jet afin de repreacutesenter les diffeacuterentes structures du domaine des matheacutematiques discregravetes

et de linformatique theacuteorique Cela se justifie par le fait que les hieacuterarchies objets aushy

delagrave de leurs avantages possegravedent des meacutethodes de conceptualisation formelles et bien

deacutefinies Nous avons utiliseacute la meacutethode favoriseacutee par James Rumbaugh (Rumbaugh

et al 1991) un des creacuteateurs de UML (Object Management Group 2009)

Ce processus demande en tout premier lieu une analyse du domaine afin dobtenir les

structures principales Par la suite les liens entre les diffeacuterentes classes sont analyseacutes en

3

fonction des besoins respectifs Finalement apregraves plusieurs iteacuterations et simplifications

cette meacutethode foumit une hieacuterarchie complegravete Par contre elle doit par la suite ecirctre

adapteacutee aux speacutecificiteacutes du langage dimpleacutementation

Notre hieacuterarchie a eacuteteacute deacuteveloppeacutee autour de plusieurs concepts importants Certains

sont naturellement lieacutes au domaine dutilisation Par exemple un point est une structure

naturelle pour la description de positions dans un diagramme Le mecircme raisonnement

sapplique pour des formes geacuteomeacutetriques de base comme le cercle le carreacute et lellipse

Certains objets sont des simplifications de concepts communs Par exemple un point

abstrait est un point qui peut ecirctre deacutetermineacute de maniegravere absolue ou relative Une forme

est une classe de base repreacutesentant lensemble des objets qui peuvent ecirctre dessineacutes Il

existe aussi un dessin qui repreacutesente une forme agrave un endroit particulier

Bien que cela pourrait deacuteterminer complegravetement notre domaine afin davoir une hieacuteshy

rarchie complegravete il faut inclure certains eacuteleacutements de structure Par exemple bien que

nous puissions deacuteterminer assez aiseacutement ce quest un cercle la maniegravere de le deacutecrire

pour ecirctre dessineacute nest pas aussi simple Il en est de mecircme pour des formes courbes

plus complexes ainsi que des courbes de maniegravere geacuteneacuterale car un ordinateur ne peut pas

repreacutesenter aiseacutement toutes formes de chemin Nous pouvons creacuteer un concept geacuteneacuteral

de chemin mais celui-ci doit se ramener agrave la reacutealiteacute dun ordinateur

Cela est deacutetermineacute en analysant deux choses le format de document PDF et la desshy

cription de chemin dAsymptote Le premier utilise des splines cubiques comme eacuteleacutement

de base pour deacutecrire les courbes dans un document Cest inteacuteressant mais limitatif

Asymptote de son cocircteacute prend une description complexe mais preacutecise dune courbe et

en deacuteduit un ensemble de splines cubiques quil est possible de placer dans un docushy

ment PDF ensuite Nous en concluons que le bon chemin agrave prendre est probablement

dimpleacutementer comme structure de base des chemins tels que deacutecrits par Asymptote

avec une structure de splines cubiques

Par contre certaines questions theacuteoriques surviennent lors de cette analyse Le grand

problegraveme relegraveve de la puissance dexpression des splines cubiques En effet nous verrons

4

que les splines cubiques sont puissantes mais pas suffisamment puissantes pour deacutecrire

un cercle une forme geacuteomeacutetrique pourtant extrecircmement simple Nous verrons par contre

par la suite quil est possible de deacutecrire ce mecircme cercle avec des splines cubiques avec

une preacutecision acceptable pour la creacuteation de documents papier malgreacute son inexactitude

Afin dadapter la hieacuterarchie un langage dimpleacutementation a ducirc ecirctre choisi Eacutetant donneacute

les contraintes de temps il fucirct deacutecideacute de reacuteutiliser un langage de description de diashy

grammes deacutejagrave existant Asymptote Lutilisation de ce langage nous permet dobtenir

des primitives simples et un accegraves agrave Jb1EX deacutejagrave deacutetermineacute ce qui diminue de beaucoup la

charge de travail De plus Asymptote nous permet de creacuteer nos images reacutesultantes dans

les formats Postscript (Adobe Systems Incorporated 2010a) et PDF (Adobe Systems

Incorporated 2010b) sans avoir agrave reacutealiser nous-mecircmes du code de tregraves bas niveau

Eacutevidemment si Asymptote fournissait tout ce dont nous avions besoin nous naurions

pas besoin dutiliser autre chose Par contre cest un langage baseacute sur les structures

(Hammerlindl Bowman et Prince 201Ob) au lieu des objets Cela implique que notre

hieacuterarchie ne peut ecirctre construite agrave laide de lheacuteritage objet Eacutetant donneacute la complexiteacute

que cela engendrerait un langage suppleacutementaire doit-ecirctre utiliseacute pour-la creacuteation de

la hieacuterarchie Cela nous amegravene donc agrave choisir Java (Oracle 2010) Une recherche de la

compagnie TIOBE considegravere Java comme eacutetant le langage le plus utiliseacute au moment de

la preacutesente reacutedaction (TIOBE Software 2008)

Avant de consideacuterer le deacuteveloppement dun nouveau langage la premiegravere chose agrave faire

consiste agrave consideacuterer ce agrave quoi nous voulons quil ressemble Afin de reacutealiser cette eacutetape

nous avons analyseacute notre base de diagrammes en donnant une description la plus proche

possible dun langage de programmation En simplifiant chaque description autant que

possible nous avons pu extraire quelques concepts de base importants pour la descripshy

tion de nos diagrammes De plus certaines contraintes suppleacutementaires peuvent ecirctre

ajouteacutees qui deacutependent plus de limpleacutementation que de la theacuteorie En quelque sorte

il faut pour reacutealiser notre projet nous baser sur des technologies qui ont fait leurs

preuves

5

Afin de deacutevelopper notre langage il nous faut des concepts pour le deacutecrire Cela sefshy

fectue agrave laide de la theacuteorie des langages et des automates Plus particuliegraverement nous

utiliserons les grammaires afin de faccedilonner un langage qui convient agrave nos besoins tout en

eacutetant simple agrave analyser par un programme informatique agrave laide dun logiciel speacutecialiseacute

SabieCC (Gagnon 1998) Nous verrons que les grammaires nous permettent de deacutecrire

complegravetement notre langage afin decirctre analyseacute par ordinateur

Une fois que nous avons notre langage final il ne reste plus quagrave veacuterifier les reacutesultats

obtenus Afin de boucler la boucle nous avons reacutealiseacute la programmation de chacun des

diagrammes que nous avions choisis au deacutepart pour notre base de tests Une fois ceuxshy

ci reacutealiseacutes il ne restait plus quagrave analyser les diffeacuterences entre les deux et voir si les

reacutesultats obtenus eacutetaient satisfaisants Cela nous permet de deacutemontrer quil sagit dune

solution naturelle et efficace eacutetant donneacute que nous pouvons creacuteer les objets de notre

domaine pour produire des diagrammes de grande qualiteacute

Le reste de ce meacutemoire est structureacute comme suit Le chapitre 1 expose la probleacutematique

et les objectifs rechercheacutes Le chapitre 2 introduit la creacuteation de notre solution inforshy

matique et plus speacutecifiquement de la hieacuterarchie objet Le chapitre 3 deacutecrit la theacuteorie

matheacutematique derriegravere la description de courbes et segments par ordinateur Le chapitre

4 expose les dessous de la theacuteorie des langages que nous utilisons afin de creacuteer SOOL

Le chapitre 5 expose la creacuteation du langage au-dessus de la hieacuterarchie Finalement le

chapitre 6 analyse le reacutesultat final afin de voir si le tout reacutepond aux objectifs deacutefinis au

deacutepart

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CHAPITRE l

PROBLEacuteMATIQUE ET OBJECTIFS

Dans ce chapitre nous nous eacutetendrons sm une deacutefinition correcte et complegravete de la

probleacutematique ainsi que sur les objectifs que nous souhaitons atteindre Nous verrons

aussi une analyse des solutions qui existent deacutejagrave et les raisons qui nous poussent agrave

deacutevelopper notre propre solution Finalement nous deacutefinirons une base de diagrammes

aptes agrave repreacutesenter adeacutequatement nos objectifs

11 Description de la probleacutematique

111 Les notes de cours une mise en contexte

Ce projet fut motiveacute principalement par la reacutedaction de notes de cours En effet

dans un milieu universitaire (particuliegraverement pour les eacutetudiants au baccalaureacuteat mais

eacutegalement pour les eacutelegraveves de cycles supeacuterieurs) il est extrecircmement utile de pouvoir

utiliser des notes de cours de quali teacute

La creacuteation de notes de cours adapteacutees vient tout de mecircme avec quelques problegravemes

Premiegraverement surtout en informatique la plupart des livres sont eacutecrits en anglais Cela

implique souvent de devoir eacutecrire nos propres versions sous la forme de notes de cours

De plus linformatique est un domaine qui eacutevolue agrave un rythme fulgurant Cela implique

que des notes adeacutequates et adapteacutees doivent ecirctre agrave jour Comme certains eacuteleacutements en

informatique peuvent eacutevoluer agrave chaque anneacutee voire plus vite il faut ecirctre capable deacutecrire

extrecircmement rapidement des textes si nous souhaitons quils soient utiles un tant soit

8

peu

Cela nous amegravene agrave notre probleacutematique principale plusieurs cours neacutecessitent un supshy

port plus complexe que simplement des mots agrave savoir des dessins et des diagrammes

voire des animations Cela est requis dans plusieurs cours en informatique theacuteorique

particuliegraverement dans leacutetude des structures de donneacutees et des algorithmes Il nous faut

donc une meacutethode rapide et efficace pour creacuteer des diagrammes agrave placer dans nos notes

de cours

112 Domaine dapplication eacutelargi

Bien eacutevidemment cibler purement les notes de cours et les structures de donneacutees nest

quun point de deacutepart Nous pouvons eacutelargir notre domaine dapplication agrave des diashy

grammes structureacutes cest-agrave-dire un dessin qui possegravede une structure sous-jacente crushy

ciale au point de pouvoir necirctre deacutecrit quagrave partir de cette structure Par exemple

un graphe est un ensemble de sommets eacutetiqueteacutes relieacutes ensemble par des flegraveches Tout

dessin de graphe est donc un dagramm~ selon notye deacutefiniton Dun_autre cocirct~ une

peinture possegravede parfois une structure mais celle-ci est largement insuffisante pour

deacutecrire loeuvre Par exemple pertgtonne noserait deacutecrire un Picasso comme eacutetant un

amas de cercles et de carreacutes de diffeacuterentes couleurs

Lensemble des structures que nous visons se rapporte donc essentiellement agrave deux

domaines linformatique theacuteorique et les matheacutematiques discregravetes Linformatique

theacuteorique est surtout deacutefinie par les structures de donneacutees et les algorithmes (et tout

sujet sy reliant) Les matheacutematiques discregravetes sont surtout deacutefinies par la theacuteorie des

graphes et la combinatoire Nous neacutegligeons ici volontairement les matheacutematiques contishy

nues pour deux raisons La premiegravere est quune structure de taille infinie peut souvent

ecirctre repreacutesenteacutee par une structure finie (donc discregravete) La seconde est que les besoins

en matheacutematiques continues sont largement diffeacuterents des besoins en matheacutematiques

discregravetes En effet dessiner le graphe dune fonction de deux variables est un sujet comshy

plexe mais totalement diffeacuterent de creacuteer un graphe Afin de rendre nos besoins plus

9

speacutecifiques nous eacuteviterons ce genre de dessins qui possegravedent deacutejagrave de nombreux logiciels

pour les reacutealiser (entre autres Maple) (Maplesoft 2010)

12 Description des objectifs rechercheacutes

La premiegravere partie de notre travail consiste agrave deacutecrire les objectifs que nous souhaitons

atteindre dans notre creacuteation de diagrammes En effet plusieurs paramegravetres importants

peuvent ecirctre utiliseacutes Il est donc important de ne pas perdre de vue lensemble tout en

donnant la prioriteacute agrave certains eacuteleacutements

121 Inteacutegration avec ~IEX

Ib1EX est un langage de description de documents texte Creacuteeacute agrave lorigine sous la forme

de TEX par Donald Knuth (Knuth 1984) puis modifieacute par Leslie Lamport (Lamport

et Bibby 1986) celui-ci est rapidement devenu un standard dans la reacutedaction darticles

scientifiques dans plusieurs domaines Bien quutiliseacute surtout pour la reacutedaction darticles

il a eacuteteacute preacutevu au deacutepart pour la reacutedaction de livres Il se distingue par sa capaciteacute agrave

creacuteer aiseacutement du contenu matheacutematique et le fait de soccuper du contenu en laissant

le logiciel soccuper de la mise en page du texte Il est si populaire que de nombreux

meacutemoires incluant celui-ci sont eacutecrits agrave partir de Ib1EX

Eacutetant donneacute que le monde des matheacutematiques et de linformatique theacuteorique utilise

abondamment Ib1EX il est important quun logiciel de creacuteation de diagrammes pershy

mette de lutiliser En effet si notre objectif est de creacuteer du contenu de qualiteacute professhy

sionnelle il faut que les polices soient constantes au travers de notre article (ou de nos

notes de cours) Naturellement plusieurs diagrammes vont contenir du texte Il faut

donc pour ecirctre consistant geacuteneacuterer ce texte avec Ib1EX afin davoir une forme standard

pour lensemble du document De plus il est tout agrave fait possible de vouloir mettre des

symboles matheacutematiques dans un diagramme (par exemple un symbole dinteacutegrale) Si

le texte est geacuteneacutereacute avec Ib1EX cela vient automatiquement Sinon il devient tregraves difficile

dobtenir un texte de belle qualiteacute Il sagit donc dun besoin primordial

10

122 Description de structures

Un autre eacuteleacutement extrecircmement important que nous recherchons est de pouvoir faire

adeacutequatement la description de diffeacuterentes structures Eacutetant donneacute que les diagrammes

sont composeacutes de structures il faut pouvoir en creacuteer aiseacutement et les relier de maniegravere

aiseacutee Cela implique quelques petites contraintes entre autres de pouvoir utiliser des

variables pour conserver les structures en question Ideacutealement la solution la plus solide

en terme de description de structures utiliserait lorienteacute-objet Une des composantes

les plus importantes dune solution orienteacutee objet est la preacutesence dune hieacuterarchie de

classes dobjets

123 Hieacuterarchie solide et extensible

Un objectif que nous recherchons est que le langage nous fournisse une hieacuterarchie dobshy

jets (ou de structures) de qualiteacute afin de pouvoir creacuteer une grande quantiteacute de diashy

grammes agrave partir deacuteleacutements de cette hieacuterarchie Une hieacuterarchie peut ecirctre deacutecrite comme

eacutetant une structure permettant dinteacutegrer facilemen~ de nouveau~ aspects sans_avoir agrave

dupliquer inutilement du code Il serait aussi important quelle puisse ecirctre eacutetendue si cershy

tains eacuteleacutements suppleacutementaires sont neacutecessaires Par exemple il pourrait ecirctre inteacuteressant

pour des gens en geacutenie eacutelectrique de pouvoir faire des diagrammes eacutelectriques malgreacute

le fait que cela ne fait pas partie de nos contraintes de deacutepart Cela pourrait ecirctre ajouteacute

par extension du systegraveme

124 Objectifs moindres

Gestion des erreurs

Dans des notes de cours il est freacutequent davoir des diagrammes Par contre eacutecrire

un diagramme peut saveacuterer plus compliqueacute que deacutecrire du texte Comme plusieurs

utilisateurs potentiels ne seront pas des experts du systegraveme il faut que les erreurs soient

deacutetecteacutees et traiteacutees de maniegravere adeacutequate Cela assure agrave lutilisateur final une expeacuterience

11

plaisante en speacutecifiant les erreurs quil commet et des meacutethodes pour les reacuteparer Sil

faut que lutilisateur cherche pendant des heures pour trouver la petite erreur quil a

commise il va tout simplement cesser dutiliser le logiciel

Langage fluide et clair

Bien que moins important le fait davoir un langage clair est excellent pour attirer les

utilisateurs vers ce systegraveme En effet si le langage est un gribouillis incompreacutehensible il

sera fort probablement dur dapprentissage et difficile agrave aborder Par fluide et clair nous

entendons que le langage soit jusquagrave un certain point compreacutehensible pour quelquun

qui ne connaicirct pas le systegraveme

Qualiteacute de la documentation et courbe dapprentissage

Finalement il faut quune documentation existe et quelle soit complegravete De preacutefeacuterence

une bonne documentation contiendra un reacutepertoire de toutes les fonctionnaliteacutes mais

aussi des tutoriels avec des exemples codeacutes de cas standards Cela incite les utilisateurs

agrave essayer le logiciel en prenant un exemple et en ladaptant agrave leurs besoins Cela amegravene

(avec les autres objectifs) agrave un langage simple dapprentissage mais tout de mecircme

puissant Comme notre objectif est de trouver une solution simple il faut que nimporte

qui puisse commencer agrave sen servir rapidement sans avoir besoin de lire lensemble de

la documentation

13 Analyse des solutions existantes

Naturellement une fois que nous savons ce que nous recherchons il nous faut analyser

toutes les solutions qui existent deacutejagrave Cela nous permettra didentifier une solution qui

est deacutejagrave fonctionnelle ou au mieux une qui pourra ecirctre eacutetendue ou utiliseacutee afin de

simplifier le travail de creacuteation si besoin est Au minimum nous pourrons extraire les

concepts inteacuteressants de chaque solution et voir sil est possible de les inteacutegrer agrave notre

solution

12

131 Paquets f1TEX standards

Eacutetant donneacute limportance de lutilisation de JbIEX les premiegraveres solutions sont celles

disponibles agrave linteacuterieur mecircme de fbIEX Celles-ci sont appeleacutees des paquets Plusieurs

paquets diffeacuterents existent et bon nombre dentre eux sont des solutions bricoleacutees et

donc incomplegravetes

Dans les solutions inteacuteressantes on note premiegraverement la preacutesence de la commande

picture Celle-ci a eacuteteacute ajouteacutee dans TEX par Donald Knuth comme tme solution agrave tout

oubli potentiel dans son systegraveme Cette commande prend du texte quelconque et le passe

par la suite au pilote qui compile le document Cela permet entre autres de transfeacuterer

des informations au pilote qui compile en Postscript et permet donc lutilisation de toute

la force de Postscript dans la reacutedaction de dessin Un gros problegraveme de cette solution

est que le texte agrave eacutecrire deacutepend du pilote utiliseacute limitant de beaucoup son utilisation

Il est tout de mecircme devenu la base de nombreux paquets qui se servent de Postscript

Plusieurs solutions ont aussi eacuteteacute deacuteveloppeacutees pour toutes sortes de domaines On retrouve

entre autres des-diagrammes de-Peynmann et deuml Lewis (feyn et-lewis) des dia-grammes

de flots (nassflow) et des arbres linguistiques (xyling rst qtree et lingtrees)

Naturellement ces solutions ne conviennent pas car elles sont pour des domaines trop

speacutecifiques par rapport agrave notre objectif

Une solution dun domaine plus geacuteneacuteral qui se deacutemarque est le paquet PSTricks (Van

Zandt 1993a) Creacuteeacute en 1993 par le professeur Timothy Van Zandt celui-ci est devenu

tregraves populaire au fil des anneacutees eacutetant donneacute les nombreuses possibiliteacutes qui existent en

Postscript Un des grands avantages est sa documentation qui est tregraves prolifique et tregraves

claire (Van Zandt 1993b)

Cela est bien inteacuteressant mais malheureusement PSTricks souffre du mecircme problegraveme

que chaque paquet interne agrave JbTEXmiddot Il est fait agrave partir de macros En effet TEX a eacuteteacute eacutecrit

complegravetement agrave partir de macros Il sagit dlm meacutecanisme de remplacement textuel ougrave

lon deacutefinit une entreacutee et toutes les occurrences de cette entreacutee sont remplaceacutees par une

13

sortie bien speacutecifique Comme une macro est toujours remplaceacutee par son contenu avant

decirctre analyseacutee plus en deacutetail toute forme derreur se retrouve agrave un niveau extrecircmement

bas Cela fait que nimporte quelle erreur est quasi impossible agrave cerner correctement

rendant le travail de lutilisateur qui souhaite apprendre tregraves complexe De plus le fait

de fournir le Postscript directement agrave lutilisateur rend celui-ci tregraves puissant mais tregraves

dangereux Finalement bien que de nombreuses formes soient disponibles il nexiste

pas de hieacuterarchie en tant que telle dans PSTricks ce qui le rend impossible agrave eacutetendre

132 )(J(-pic

Une autre solution inteacuteressante peut ecirctre retrouveacutee agrave linteacuterieur de gTEX Il sagit

de XV-pic un paquet eacutecrit par Kristoffer H Rose (Rose et al 2010) Ce paquet

a eacuteteacute creacuteeacute speacutecifiquement pour la description de diagrammes agrave linteacuterieur de gTEX

et possegravede une documentation exhaustive Malheureusement cette documentation est

extrecircmement complexe mecircme pour un utilisateur avanceacute XV-pic utilise principalement

des boicirctes gTEX positionneacutees agrave diffeacuterents endroits afin de creacuteer les diagrammes Ceuxshy

ci sont par la suite relieacutes par diffeacuterents objets puis deacutecoreacutes Cela fournit un reacutesultat

final de qualiteacute XV-pic possegravede entre autres un mode pour creacuteer des diagrammes en

positionnant les eacuteleacutements dans une matrice Cela rend les dessins plus simples concepshy

tuellement mais pas toujours positionneacutes adeacutequatement XV-pic permet aussi de faire

du positionnement relatif agrave dautres objets ce qui peut ecirctre tregraves pratique Comme nous

pouvons le voir dans lexemple suivant XV-pic est tregraves pratique dans les reacutesultats quil

nous permet dobtenir mais sa syntaxe laisse de beaucoup agrave deacutesirer

Par contre les deacutefauts de XV-pic sont extrecircmement visibles En premier lieu la syntaxe

du langage est extrecircmement difficile agrave comprendre car elle est baseacutee sur la composition

de nombreux caractegraveres speacuteciaux De plus comme il sagit dun paquet gTEX le tout

est impleacutementeacute agrave laide de macros et rend donc la recherche derreur laborieuse (surshy

tout lorsquon prend en compte la syntaxe deacutejagrave difficile agrave utiliser) Cela rend XV-pic

inapte agrave lutilisation par quelquun qui ne souhaite pas investir trop de temps dans son

apprentissage Finalement les nombreux modes de dessins sont souvent incompatibles

14

xymatrix U ar_[ddr]_y ar-[drr]-x

argt[dr] I-(xy) amp X times_Z y ar[d]-q ar[r]_p amp X ar[d]_f amp y ar[r]-g

amp Z

Figure 11 Code XY-pic pour un diagramme

Figure 12 Diagramme reacutesultant du code XY-pic

entre eux et ne peuvent souvent pas ecirctre utiliseacutes dans un mecircme dessin

133 Metapost

Eacutetant donneacute le problegraveme commun agrave tous les paquets agrave linteacuterieur de JgEX la solution la

plus logique serait dessayer den sortir Cela a donneacute le logiciel Metapost (Hobby 1992)

Celui-ci a eacuteteacute inspireacute de Metafont (Knuth 1986) que Knuth a utiliseacute pour dessiner des

polices pour EX Une des grandes avanceacutees du langage est la description de courbes

Celui-ci reacuteutilise un algorithme de Knuth qui permet de deacutecrire des courbes tout en

en controcirclant les diffeacuterents paramegravetres De plus comme le logiciel nest pas reacutedigeacute en

macros il permet de deacutetecter de maniegravere adeacutequate les erreurs de lusager Nous pouvons

deacutejagrave voir dans le code fourni en exemple quil sagit dun langage beaucoup plus clair

que XV-pic

15

beginfig(l)

pair A B C A=(OO) B=(lcmO) C=(Olcm) draw A--B--C--cycle

endfig

Figure 13 Code Metapost pour dessiner un triangle

Figure 14 Diagramme reacutesultant du code Metapost

Par contre quelques problegravemes se deacutegagent de Metapost Premiegraverement le langage ne

permet pas limpleacutementation dune hieacuterarchie solide Cela ne serait pas un problegraveme sil

en existait deacutejagrave une mais ce nest pas le cas En effet les diagrammes ont fait lobjet

dune extension du langage mais rien de tregraves deacuteveloppeacute Il est donc faisable de faire

des diagrammes mais il ne sagit pas neacutecessairement dune solution agrave toute eacutepreuve

De plus comme toutes les coordonneacutees du langage sont donneacutees en valeur absolue cela

limite les possibiliteacutes du langage (entre autres en ne pouvant utiliser des points deacutefinis

par des objets)

134 Asymptote

Une autre possibiliteacute se retrouve dans le logiciel Asymptote qui se deacutefinit comme eacutetant

Wl langage inspireacute de Metapost (Hammerlindl Bowman et Prince 2010b) Il est donc

aussi externe agrave g1EX mais aussi inspireacute du langage de programmation CH Cela lui

confegravere la creacuteation de structures avanceacutees et la creacuteation de fonctions complexes De

plus une documentation exhaustive et un traitement des erreurs de qualiteacute en font une

solution robuste

Malheureusement comme Metapost Asymptote pose quelques problegravemes En effet ce

16

size(3cm) draw(unitsquare) labelC l $A$ (00) SW)

labelC $B$ Cl 0) SE) label ($C$ Cl 1) NE)

label ($0$ (01) NW)

Figure 15 Code Asymptote pour dessiner un carreacute avec un texte agrave chaque coin

( )

il

Figure 16 Diagramme reacutesultant du code Asymptote

logiciel fut eacutecrit avec les matheacutematiques continues et la geacuteomeacutetrie comme domaine

dutilisation Ce nest pas Lill problegraveme en tant que tel (Asymptote le fait tregraves bien)

mais cela fait que la- creacuteation de diagrammes discrets nest pas vraiment deacuteveloppeacutee

Il faudrait donc ecirctre capable de creacuteer une hieacuterarchie de structures pour la creacuteation de

diagrammes Eacutetant donneacute le support des structures posseacutedant des fonctions internes il

devrait ecirctre possible dajouter cette possibiliteacute agrave Asymptote

Malheureusement ce nest pas preacutesentement reacutealisable agrave linteacuterieur du langage En efshy

fet Asymptote est un langage baseacute objet Cela signifie quil possegravede des structures qui

ressemblent agrave une description typique dun objet mais pas toutes les proprieacuteteacutes imshy

portantes qui se rattachent agrave un langage agrave objets standard comme Java ou C++ Plus

particuliegraverement cest labsence de polymorphisme qui cause problegraveme En effet la

creacuteation dune hieacuterarchie implique de creacuteer des liens entre les diffeacuterentes structures Par

exemple un cercle un triangle et un nuage sont toutes des formes avec certaines proshy

prieacuteteacutes similaires Il nous faut donc avoir des fonctions qui prennent des formes comme

paramegravetres Si nous avons une fonction f qui prend une forme nous souhaiterions eacutecrire

une seule fonction

17

fCforme)

Malheureusement en Asymptote il faudrait eacutecrire une fonction pour chaque forme

distincte comme cela

fCcercle)

fCcarre)

fCnuage)

Cela rend la creacuteation dune hieacuterarchie extrecircmement difficile car pour chaque fonction

utilisant un objet plus geacuteneacuteral il nous faut eacutecrire plusieurs fois cette fonction De plus

cela rend lexpansion par lusager de la hieacuterarchie essentiellement impossible car il doit

rajouter des cas pour chaque fonction deacutefinie preacuteceacutedemment en plus dajouter son nouvel

objet dans la hieacuterarchie Cela est difficilement souhaitable

135 Conclusion de lanalyse

Afin den venir agrave une conclusion adeacutequate il faut se ramener aux objectifs rechercheacutes

Cela nous permet de rapidement eacuteliminer les solutions internes agrave Ib-TEX eacutetant donneacute

la complexiteacute de la gestion des erreurs (et indirectement la courbe dapprentissage du

langage) Cela nous laisse comme solution Metapost et Asymptote Naturellement le

langage Asymptote est plus eacutevolueacute que celui de Metapost et fournit des eacuteleacutements de

programmation plus inteacuteressants Cela implique donc quil nous permet plus aiseacutement

de construire nos structures tant deacutesireacutees

Par contre Asymptote ne fournit pas une solution suffisante eacutetant donneacute quil ne possegravede

pas une hieacuterarchie dobjets adapteacutee aux diagrammes De plus eacutetant donneacute que le langage

est baseacute objet il sera beaucoup trop compliqueacute dy implanter une hieacuterarchie Nous en

venons donc agrave la conclusion que le mieux serait dutiliser Asymptote qui nous fournit un

ensemble de services complexes (impleacutementation des chemins liens avec Ib-TEX etc )

et de limpleacutementer avec un langage de plus haut niveau

18

Java devient un choix inteacuteressant pour cette tacircche En effet cest un langage connu dans

lindustrie et simple dapprentissage Il sagit dun langage de programmation objet qui

nous permettra agrave coup sucircr dimpleacutementer une hieacuterarchie solide Par contre ce langage

possegravede quelqu~s petits problegravemes comme un tregraves haut niveau de verbositeacute et beaucoup

deacuteleacutements non requis pour la description de diagrammes

Nous en sommes donc venus agrave la conclusion que la meilleure solution serait dutiliser

Java mais dimpleacutementer par-dessus celui-ci un langage deacutedieacute qui eacuteliminerait tout ce

qui nest pas requis pour la description des diagrammes Nous appellerons ce langage

SDDL pour Structured Diagram Description Language

Concepts inteacuteressants agrave conserver

Avant de penser agrave concevoir notre logiciel il serait bon de voir quels eacuteleacutements nous

souhaitons conserver des solutions existantes Agrave cette fin leacuteleacutement le plus inteacuteressant

provient de XV-Pic En effet il permet de relier des objets entre eux par des flegraveches

dune maniegravere relativement simple Il serait donc inteacuteressant de pouvoir permettre de

deacutecrire des liens entre diffeacuterents objets par des points speacutecifiques agrave chacun dentre eux

De plus lalgorithme de description de chemins utiliseacute par Metapost et Asymptote est

extrecircmement efficace et utile et pourrait donc ecirctre utiliseacute directement par notre langage

Cela sera simple agrave impleacutementer eacutetant donneacute que nous souhaitons utiliser Asymptote pour

compiler vers Postscript

14 Diagrammes repreacutesentatifs du domaine

Finalement avant de pouvoir commencer agrave deacutefinir les besoins de notre hieacuterarchie il

nous faut obtenir une deacutefinition valide et complegravete de notre domaine Naturellement

il nest pas eacutevident de trouver une deacutefinition concregravete et objective dun diagramme en

informatique theacuteorique Nous devons donc nous rabattre sur une autre solution qui doit

tout de mecircme ecirctre la plus formelle possible

19

141 Lapproche de Knuth

Pour trouver une ideacutee nous nous ramegravenerons agrave la meacutethode que Donald Knuth a utiliseacutee

lorsquil a creacuteeacute TEX En effet il souhaitait creacuteer un logiciel qui ferait de laquo beauxraquo doshy

cuments Cela eacutetant un terme tregraves subjectif Knuth deacutecida de se deacutefinir un ensemble

de journaux scientifiques dont les publications eacutetaient du plus haut standard de qualiteacute

pour leacutepoque (Knuth 1999) Apregraves avoir obtenu ces diffeacuterents exemples il put saffairer

agrave essayer de reproduire une solution de cette qualiteacute Il devient donc eacutevident agrave la fin

du cycle de deacuteveloppement du logiciel que sa solution eacutetait coheacuterente et valide car elle

permettait dobtenir un reacutesultat de qualiteacute en comparaison agrave ce que nous pourrions

deacutejagrave deacutefinir comme eacutetant de qualiteacute

Nous pouvons donc chercher agrave suivre la mecircme meacutethode Afin de la respecter nous devons

trouver quelques livres dun haut niveau de qualiteacute et prendre certains diagrammes

que lon retrouve agrave linteacuterieur Cela nous permettra de retrouver les eacuteleacutements les plus

cruciaux de notre domaine

Plusieurs livres inteacuteressants soffrent agrave nous nous utiliserons entre autres laquo The Art

of Computer Programming raquo de Donald Knuth (Knuth 1968) Il est naturel quun des

livres les plus connus en informatique eacutecrit par Knuth de surcroicirct possegravede un haut

standard de qualiteacute Un autre livre important est le laquo livre du dragonraquo (Aho Sethi et

Ullman 1986) qui eacutetudie la theacuteorie de la compilation et est extrecircmement connu dans

son domaine De plus celui-ci renferme leacutetude de nombreuses structures de donneacutees ce

qui nous fournit de nombreux diagrammes de qualiteacute Finalement il existe aussi un livre

tregraves connu dans leacutetude des algorithmes (ce qui est aussi extrecircmement lieacute agrave leacutetude des

structures de donneacutees) qui sappelle laquo Introduction to Algorithmsraquo (Cormen et al

2001) Ces trois livres forment une base extrecircmement connue et de qualiteacute pour nos

diagrammes Nous avons extrait quinze (15) diffeacuterents diagrammes de ces livres

20

142 Description des exemples et des concepts preacutesents dans les diagrammes

Les diffeacuterents diagrammes que nous avons seacutelectionneacutes repreacutesentent diffeacuterentes strucshy

tures de donneacutees On y retrouve plusieurs arbres et graphes Les graphes sont de plushy

sieurs types allant dun graphe standard agrave des graphes dexeacutecution De plus certaines

structures preacutesentes plus rarement se retrouvent dans notre ensemble Entre autres on

retrouve un diagramme de Venn qui bien que conceptuellement simple est toujours

relativement complexe lorsque nous souhaitons le reacutealiser avec un logiciel On retrouve

aussi des arbres linguistiques qui ne sont pas neacutecessairement complexes mais surtout

longs agrave reacutealiser

Cet ensemble de diagrammes nous permet de couvrir lensemble des structures de

donneacutees importantes en informatique theacuteorique et en matheacutematiques discregravetes Il existe

dautres structures de donneacutees mais celles-ci peuvent toujours ecirctre impleacutementeacutees seacutepashy

reacutement eacutetant donneacute que nous souhaitons faire une hieacuterarchie aiseacutement extensible Nous

remarquons surtout dans nos exemples quun des eacuteleacutements les plus importants est de

pouvoir r~lier convenablement les_diffeacuterents eacuteleacutements (dans un graphe par exemple)

Comme il sagit de quelque chose qui est toujours preacutesent il sagira dun des points les

plus importants agrave deacutevelopper pour notre hieacuterarchie

CHAPITRE II

STRUCTURE ET SOLUTION INFORMATIQUE

Afin de deacutevelopper un produit qui convient agrave nos besoins nous aurons besoin quil soit

structureacute adeacutequatement Cela implique principalement la construction de la hieacuterarchie

dobjets du domaine Il faut deacuteterminer quels sont les eacuteleacutements rechercheacutes dans notre

solution trouver une meacutethode de deacuteveloppement formelle et adeacutequate puis la reacutealiser

correctement Cela assurera une solution de qualiteacute

21 Objectifs dune structure dans une solution informatique

En premier lieu il nous faut justifier le besoin dune meacutethode de deacuteveloppement forshy

melle et solide En effet lin logiciel en informatique est tregraves diffeacuterent dun problegraveme

matheacutematique standard Une deacutemarche matheacutematique se ramegravene agrave un concept bien

connu la preuve Cela reurond la reacutesolution du problegraveme creacutedible agrave condition que la

preuve soit bonne Par contre nous verrons quun problegraveme informatique ne peut ecirctre

reacutesolu agrave laide dune simple preuve

211 Les diffeacuterentes composantes dune solution informatique

Une solution agrave un problegraveme informatique possegravede diffeacuterents eacuteleacutements Chacun dentre

eux possegravedent un certain degreacute de formalisme qui affecte lensemble de la solution

22

Algorithmes

Les algorithmes sont les eacuteleacutements les plus formels dune solution informatique On peut

dire quils se ramegravenent agrave la partie matheacutematique dun problegraveme informatique en quelque

sorte Composeacute dune seacuterie dopeacuterations aux comportements bien deacutefinis le reacutesultat dun

algorithme est preacutevisible Eacutetant donneacute la possibiliteacute de preacutevoir le comportement dun

algorithme agrave partir de ses entreacutees il est possible de deacutemontrer que lalgorithme fournit

exactement les reacutesultats rechercheacutes Il suffit en effet de prouver que agrave chaque entreacutee

possible on obtient la sortie qui serait logiquement attendue de lalgorithme On peut

penser par exemple agrave un algorithme de tri qui pour chaque ensemble de nombres

retourne les nombres en ordre croissant

Malgreacute tout un algorithme en informatique nest pas parfait En effet si le temps

dexeacutecution dun algorithme pour des entreacutees standards est beaucoup trop eacuteleveacute il ne

sera pas utiliseacute peu importe quil donne le bon reacutesultat Le temps dopeacuteration et la

quantiteacute despace meacutemoire sont les deux principales contraintes qui entrent en ligne de

compte pour les diffeacuterents algorithmes dune solution informatique

Solutions technologiques

Lautre partie extrecircmement importante de tout logiciel informatique est le choix des

technologies utiliseacutees En effet les programmes informatiques ne sont pas directement

creacuteeacutes agrave partir de circuit eacutelectriques Chaque couche dabstraction suppleacutementaire (cirshy

cuits logiques code assembleur programmation de haut niveau) limite les possibiliteacutes

du programmeur et vient avec certains avantages et certains inconveacutenients Le fait de

ne pas utiliser une solution deacutejagrave existante peut permettre une solution plus puissante

mais agrave un coucirct de deacuteveloppement potentiellement beaucoup plus eacuteleveacute Il est aussi posshy

sible avec un certain ensemble de choix technologiques de ne pas pouvoir obtenir un

effet rechercheacute dans une solution Cela explique pourquoi nous avons deacutecideacute dutiliser

Asymptote Il nous fournit un accegraves agrave JbTEX deacutejagrave codeacute ainsi quune traduction comshy

plexe vers un fichier image Postscript La reacutealisation de ces diffeacuterents eacuteleacutements de

23

code aurait significativement augmenteacute la complexiteacute de notre tacircche

Imperfection de toute solution informatique

Eacutetant donneacute les limitations des outils technologiques agrave notre disposition nous sommes

obligeacutes de constater que toute solution informatique est imparfaite De plus plusieurs

contraintes donneacutees agrave des systegravemes informatiques sont geacuteneacuteralement vagues et peuvent

ecirctre interpreacuteteacutees diffeacuteremment en fonction de lutilisateur Par exemple nous souhaitons

reacutealiser un outil simple dutilisation mais puissant et extensible Naturellement plus

un langage est puissant plus il devient complexe Un utilisateur peut trouver un outil

tregraves simple alors quun autre le trouvera incompreacutehensible Dautres points comme la

qualiteacute de documentation la courbe dapprentissage et lagestion aiseacutee des erreurs sont

des critegraveres qui possegravedent une bonne part de subjectiviteacute Ce ne sont toutefois pas

neacutecegravessairement de mauvais critegraveres Il faut simplement chercher selon une deacutefinition la

plus proche possible dun utilisateur moyen agrave maximiser les diffeacuterents paramegravetres

Ce genre de contraintes relegraveve geacuteneacuteralement du geacutenie logiciel Bien que ce meacutemoire ne

constitue pas un travail de geacutenie logiciel nous sommes obligeacutes demprunter quelques

eacuteleacutements agrave ce domaine afin dobtenir un reacutesultat adeacutequat

212 Consideacuterations pour une meacutethodologie de deacuteveloppement

Avant de choisir notre meacutethodologie il est bon de veacuterifier les objectifs rechercheacutes dans

lutilisation dune telle meacutethode de deacuteveloppement Cela nous permettra de deacutegager les

eacuteleacutements importants agrave garder en tecircte tout au long du deacuteveloppement de la hieacuterarchie

Un des eacuteleacutements les plus importants est dobtenir une structure efficace pour deacutecrire

nos diagrammes Lautre eacuteleacutement crucial est dobtenir une hieacuterarchie qui repreacutesente

adeacutequatement le domaine De preacutefeacuterence elle doit ecirctre complegravete et dun usage naturel

On entend par lagrave que les eacuteleacutements sont suffisamment preacutecis et proches deacuteleacutements stanshy

dards et connus du domaine que toutes les opeacuterations soient laquo naturellesraquo pour une

personne qui ne connaicirct pas le langage Il nexiste malheureusement pas de mesure pour

24

deacuteterminer si une hieacuterarchie est naturelle ou non Toutefois si chaque section est reacutefleacutechie

de maniegravere formelle le reacutesultat final devrait ecirctre naturel Certaines consideacuterations mishy

neures peuvent ecirctre plus ou moins mesureacutees comme la longueur du code et les noms

adeacutequats de fonctions

22 La programmation orienteacutee-objet

La programmation orienteacutee-objet est un des pheacutenomegravenes tregraves importants en informashy

tique Depuis sa creacuteation elle est devenue de plus en plus populaire eacutetant donneacute la faciliteacute

de deacuteveloppement dans une telle meacutethode Le fait dutiliser une solution orienteacutee-objet

(au contraire de Metapost ou Asymptote) ne sest pas fait de faccedilon arbitraire Il est

donc de mise dexposer les diffeacuterents avantages qui nous ont pousseacutes agrave choisir un tel

paradigme pour notre logiciel

221 Concepts de bases

La structure de base en programmation orienteacutee-objet est naturellement lobjet Celuishy

ci est deacutefini comme eacutetant une structure de donneacutees qui regroupe des donneacutees et des

meacutethodes (Saunders 1989) Bien quil ne sagit pas dun critegravere obligatoire la plushy

part des langages de programmation creacuteent les objets agrave partir dune classe qui deacutefinit

les diffeacuterents champs et meacutethodes preacutesents et leurs effets Les objets forment donc le

minimum requis pour avoir un langage objet

En tant que tel cet ensemble de concepts est assez minimaliste Il existe plusieurs autres

eacuteleacutements qui sont preacutesents agrave un degreacute plus ou moins grand dans les langages agrave objets

Ceux-ci forment donc en quelque sorte la base de la programmation orienteacutee-objet

(Pierce 2002)

- Lencapsulation des donneacutees cest-agrave-dire camoufler les donneacutees dans une structure

speacutecifique (lobjet)

- Lheacuteritage qui permet de deacutefinir un objet comme eacutetant une installce speacutecifique dun

autre objet On peut appliquer le mecircme raisonnement agrave deux classes On dit alors

25

quune classe heacuterite dune classe de base Celle-ci possegravede exactement le mecircme corps

que sa classe de base mais peut rajouter ou modifier certaines proprieacuteteacutes Il sagit

dun des aspects les plus importants dans le deacuteveloppement dune hieacuterarchie

- Le polymorphisme qui nous permet de creacuteer des proprieacuteteacutes qui varient en fonction

des sous-classes Par exemple une classe Nombre pourrait avoir une meacutethode daddishy

tion alors que ses sous-classes Entiegraveres et Reacuteelles redeacutefiniraient cette meacutethode en

fonction de leur impleacutementation speacutecifique Cela nous permet par la suite de prendre

deux nombres et de les additionner peu importe quil sagisse de reacuteels ou dentiers

222 Diffeacuterence avec la programmation baseacutee-objet

Les diffeacuterentes prioriteacutes eacutenumeacutereacutees ci-haut sont les eacuteleacutements de base qui nous permettent

de creacuteer une hieacuterarchie de qualiteacute Il sagit de la raison principale justifiant de ne pas

utiliser Asymptote pour creacuteer la hieacuterarchie En effet celui-ci est un langage baseacute-objet

La diffeacuterence principale est quun langage baseacute-objet ne neacutecessite pas limpleacutementation

de lheacuteritage ou du polymorphisme (Saunders 1989) Asymptote de son cocircteacute possegravede un

heacuteritage de structure minimal mais pas de polymorphisme Cette diffeacuterence est cruciale

car cet eacuteleacutement est neacutecessaire pour la creacuteation dune hieacuterarchie dans des contraintes

acceptables

En effet une chose importante est dajouter des objets dans les diagrammes Par

exemple supposons que nous avons une classe Conteneur Celui-ci doit pouvoir conteshy

nir des Cercles des Carreacutes des Triangles etc Sil fallait eacutecrire une fonction pour

ajouter chacune des formes le travail deviendrait eacutenormeacutement complexe et impossible

agrave eacutetendre pour lusager final Avec le polymorphisme il suffit deacutecrire une fonction qui

permet dajouter une Forme quelconque

23 Meacutethode pour la conceptualisation dune hieacuterarchie

Nous deacutecrirons ici la meacutethode que nous avons utiliseacute Il sagit de DMT (pour Dbj ect

Modeling Technique)

26

231 Origine de la meacutethode

Cette meacutethode fut deacuteveloppeacutee principalement par James Rumbaugh (mais avec laide de

plusieurs personnes) (Rumbaugh et al 1991) en 1991 Celui-ci est principalement connu

comme eacutetant un des auteurs de la norme UML qui est devenu le scheacutema de modeacutelisation

objet standard et utiliseacute par tous les programmeurs objets (Group 1999) Il est agrave noter

que cette meacutethode est une meacutethode danalyse complegravete pour toute la dureacutee de vie du

logiciel Nous naurons par contre besoin que de la partie analyse de cette meacutethode

232 Les diffeacuterentes eacutetapes de conceptualisation

La premiegravere partie de cette meacutethode a deacutejagrave eacuteteacute effectueacutee implicitement lorsque nous

avons rechercheacute nos diagrammes relatifs du domaine Habituellement il est suggeacutereacute

deacutecrire un texte reacutesumant lensemble du domaine mais dans notre cas il est plus

approprieacute de reacutesumer notre domaine avec des diagrammes Par la suite il faut prendre

le temps de faire ressortir les diffeacuterentes classes dobjets qui font parties du domaine et

prendre le temps de bien les deacutefini~middot On eacuteliminera les classes vagues ou redondantes par

la suite

La prochaine eacutetape consiste agrave deacutefinir les diffeacuterentes associations entre les classes Par

exemple une classe Employeacute et une classe Compagnie seraient lieacutees par lassociation

travaille pour Par la suite on identifie les attributs (ou les champs) des diffeacuterentes

classes en eacutevitant les attributs dimpleacutementation Finalement on raffine le modegravele en

ajoutant lheacuteritage des classes Cela permet de simplifier significativement la hieacuterarchie

Cela fournit une hieacuterarchie complegravete de notre domaine Par contre rien ne deacutemontre

quelle est correcte Afin de la veacuterifier il suffit danalyser les diffeacuterents cas typiques de

notre problegraveme regarder le reacutesultat obtenu et relever toute erreur Dans notre cas il

sagit de coder (seulement en terme de la hieacuterarchie) les diffeacuterents diagrammes et veacuterifier

si nous consideacuterons le tout satisfaisant Par la suite nous pourrons reacuteiteacuterer le mecircme

proceacutedeacute jusquagrave obtenir satisfaction Nous serons ainsi assureacutes davoir une hieacuterarchie

27

adapteacutee agrave notre domaine et complegravete

24 Deacuteveloppement de la hieacuterarchie

Maintenant que nous avons une meacutethodologie correcte nous pouvons creacuteer notre hieacutershy

archie Le fait de sassurer de sa compleacutetude nous permettra de ne pas rencontrer de

problegravemes complexes lors de la phase dimpleacutementation du logiciel

241 Extraction des diffeacuterents concepts

Les concepts du domaine (qui se ramegravenent agrave des classes) se divisent en plusieurs cateacuteshy

gories Une des principales est le domaine des formes Une forme peut ecirctre un carreacute

un cercle etc Une autre cateacutegorie importante est formeacutee des points qui peuvent ecirctre

deacutefinis de plusieurs maniegraveres diffeacuterentes Finalement une autre section importante est

formeacutee des structures de conteneurs incluant les Canvas (pour contenir des objets) et

des Drawing (pour reacutefeacuterencer des objets)

Eacutetant donneacute le nombre relativement faible de formes distinctes il ne nous est pas apparu

utile de faire plusieurs cateacutegories de formes distinctes En effet une seacuteparation entre les

courbes fermeacutees et ouvertes peut nous permettre de factoriser un ou deux eacuteleacutements de

code sans toutefois ecirctre significatif ou reacuteellement utile (eacutetant donneacute quil nexiste pas

vraiment de forme standard deacutefinie par une courbe ouverte)

242 Eacuteleacutements particuliers

Plusieurs eacuteleacutements particuliers se sont reacuteveacuteleacutes complexes agrave modeacuteliser dans notre hieacuterarshy

chie Nous abordons ici les principales difficulteacutes rencontreacutees ainsi que les solutions pour

les reacutegler

28

Creacuteation et placement dobjets

Leacuteleacutement le plus important de notre hieacuterarchie est de pouvoir structurer les objets

que nous souhaitons positionner Nous avons donc creacuteeacute une classe Canvas Le nom est

inspireacute du mot canevas en peinture eacutetant donneacute que nous avons apposeacute des restrictions

similaires agrave ce domaine En effet nous avons deacutecideacute que lorsquun objet est placeacute dans

un canevas il ne peut ecirctre enleveacute ou modifieacute Cela nous permettra plus tard de faire

des calculs pour les points de reacutefeacuterence plus aiseacutement De plus un canevas doit pouvoir

posseacuteder des sous-canevas Pour cela il nous faut une classe geacuteneacuterale qui deacutecrit tout

eacuteleacutement pouvant ecirctre ajouteacute dans un canevas

Cela est reacutesolu avec lintroduction dune classe Shape Celle-ci repreacutesente toute forme

qui peut ecirctre dessineacutee quelle soit simple ou complexe Un Canvas est une forme afin

de sassurer de pouvoir positionner des sous-canevas Une implication particuliegravere de

notre choix est quune Shape ne possegravede pas de position Il sagit dune forme abstraite

qui peut ecirctre positionneacutee agrave un certain endroit Cela implique aussi quil est possible de

prendre une Shape et de la placer agrave plusieurs end_roits distincts Lorsquelle est ajouteacutee

dans un Canvas une Shape est copieacutee ce qui empecircche toute modification subseacutequente

de la forme

Objets multiples

Lorsquil sagit de creacuteer des diagrammes freacutequemment il est tregraves probable que plusieurs

eacuteleacutements soient similaires Par exemple si nous creacuteons un arbre avec des cercles comme

sommets il sagit toujours en quelque sorte du mecircme cercle De plus si nous creacuteons

un sous-canevas et que nous le positionnons agrave plusieurs endroits certaines formes deshy

viennent automatiquement deacutedoubleacutes Il devient donc primordial pour nous de pouvoir

reacuteutiliser un eacuteleacutement que nous avons deacutejagrave deacutefini afin deacuteviter la creacuteation agrave reacutepeacutetition

dobjets

Or nous avons deacutejagrave speacutecifieacute quil eacutetait possible de positionner plusieurs fois le mecircme

29

objet Cela est vrai mais il y a une limitation En effet ces objets ne peuvent pas ecirctre

reacutefeacuterenceacutes Si nous souhaitons connaicirctre un objet celui-ci doit pouvoir ecirctre distingueacute

dun autre Il nous faut donc une classe qui repreacutesente une forme agrave un endroit preacutecis

Pour cela nous avons creacuteeacute la classe Drawing Celle-ci permet de repreacutesenter une Shape

agrave un endroit bien preacutecis dans un canevas Cela fait toutefois que les eacuteleacutements dans un

sous-canevas multiple restent identiques Nous verrons bientocirct la solution agrave ce problegraveme

Points de reacutefeacuterence

Un des eacuteleacutements les plus complexes relevait du fait de fournir des points de reacutefeacuterence

En effet faire de simples chemins entre des coordonneacutees en valeurs absolues neacutetait pas

suffisant mecircme sil est possible dadditionner ses points La solution souhaiteacutee eacutetait de

permettre de deacutefinir des points de reacutefeacuterence ceux-ci pouvant ecirctre obtenus agrave partir de

lobjet lui-mecircme Par exemple un cercle pourrait retourner son point nord

Un eacuteleacutement fondamental causait problegraveme la fonction pour acceacuteder au point doit ecirctre

deacutefinie dans la forme (par exemple dans la classe Circle) Par contre une forme en

tant que telle ne possegravede pas de position speacutecifique Par conseacutequent son point nest

pas deacutefini non plus Pour cela il faudrait obtenir un Drawing Par contre un Drawing

ne peut pas posseacuteder la deacutefinition de chaque fonction daccegraves agrave un point pour chaque

forme Cela est contre-intuitif Il faut donc demander agrave la forme lorsquon appelle pour

obtenir un point de prendre le Drawing suppleacutementaire en paramegravetre Notre intention

est lorsque nous eacutecrirons un langage au-dessus de la hieacuterarchie de pouvoir reacutegler ce

problegraveme

Chemins de reacutefeacuterence

Finalement il nous reste un leacuteger problegraveme Nous pouvons maintenant faire une reacutefeacuteshy

rence agrave un objet disons a et obtenir un point speacutecifique de cet objet Par contre cela

nest pas suffisant dans un cas bien preacutecis Disons que a est dans le canevas b Ensuite b

est placeacute agrave deux reprises dans le canevas c obtenant deux Drawing diffeacuterents cl et c2

30

Nous ne pouvons pas acceacuteder agrave a car il est repreacutesenteacute seulement en fonction de b Pour

reacutegler le problegraveme il faut faire un chemin de reacutefeacuterence (disons cl b a dans le langage

final) Pour cela nous fournirons la possibiliteacute de partir dun Drawing et den obtenir

un autre (agrave condition quil sagisse dun Canvas naturellement) Cela va mettre agrave jour

la position relative de lobjet par rapport agrave un niveau de profondeur suppleacutementaire

En acceacutedant agrave cette fonction aussi souvent que neacutecessaire il est possible de reacutefeacuterencer

un objet peu importe son degreacute de profondeur reacuteel Cela nous permet donc de faire

des liens complexes entre nimporte quel objet (voire mecircme des objets de profondeur

diffeacuterentes)

31

CHAPITRE III

EacuteLEacuteMENTS GRAPHIQUES

Dans ce chapitre nous deacutefinissons les eacuteleacutements graphiques requis pour faire des dessins

informatiques dont les courbes de Beacutezier ainsi que les splines cubiques Les proprieacuteteacutes

importantes de ces courbes sont deacutemontreacutees De plus une preuve est fournie de la

possibiliteacute dapproximer adeacutequatement un cercle avec des splines cubiques Finalement

nous discuterons du fonctionnement des diffeacuterentes solutions informatiques en terme de

structure telles que PDF et Asymptote

Courbes et segments en informatique

Naturellement les eacuteleacutements les plus importants dans des dessins informatiques sont les

segments et les courbes Pour des besoins de simpliciteacute nous essaierons de les inteacutegrer

dans la mecircme deacutefinition en traitant les segments comme un cas particulier des courbes

Nous donnons agrave cette courbe geacuteneacuterale le nom de chemin

Le premier problegraveme lorsque nous voulons faire des courbes en informatique est la

meacutethode pour les repreacutesenter Lecirctre humain peut tracer une infiniteacute de courbes disshy

tinctes sans avoir besoin de la deacutecrire avec preacutecision Par contre lorsquon entre dans le

domaine de linformatique il faut non seulement ecirctre capable den faire une description

mais celle-ci doit ecirctre la plus petite possible

Une des meacutethodes de repreacutesentation est sous la forme de pixels (JI et Kelley 2007)

Cette meacutethode implique de repreacutesenter un plan continu par un ensemble de points disshy

32

crets appeleacutes pixels Cela permet de repreacutesenter plusieurs formes de dessins extrecircmement

complexes et est utiliseacute dans certains logiciels dimages

Une autre meacutethode est la meacutethode vectorielle Cest la plus populaire Au lieu de

repreacutesenter directement le dessin tel quil apparaicirct on fournit une description du dessin

agrave partir de quelques concepts tregraves simples (points segments et cercles par exemple)

Lorsque lutilisateur souhaite voir le dessin un logiciel traduit la description en pixels

pour leacutecran

La derniegravere meacutethode possegravede plusieurs avantages La description dun dessin est souvent

beaucoup plus compacte que si on deacutecrit le dessin pixel par pixel De plus la description

conserve la preacutecision du dessin peu importe la reacutesolution agrave laquelle il est preacutesenteacute Par

exemple si nous prenons un ensemble de pixels et quon lagrandit plusieurs fois il est

tregraves probable que nous ayons perdu beaucoup dinformations Il nous faut par contre

veacuterifier la puissance reacuteelle dune telle meacutethode Nous devons donc introduire une des

structures utiliseacutees pour la description vectorielle

32 Courbes de Beacutezier

Une courbe de Beacutezier est un concept relativement simple deacuteveloppeacute indeacutependamment

par Paul de Casteljau et Pierre Beacutezier entre 1959 et 1962 Ces deux personnes avaient

pour objectif de creacuteer des repreacutesentations par ordinateur de voitures pour les compagnies

Citroen et Renault respectivement (Jr et Kelley 2007)

321 Deacutefinition

Soit Po Pl P2 Pn E 1R2 un ensemble de points dans un plan carteacutesien typique

Ceux-ci sont appeleacutes des points de controcircle Soit t E IR et 0 lt t 1 La courbe de

Beacutezier de degreacute n des points Po agrave Pn est deacutefinie par la formule suivante

B t - n ( n

) 1 - t n-ttt

pPohmiddotPn ( ) - ~ i ( ) t (31) t=O

33

Le chemin est deacutefini pour les valeurs entre 0 et 1 de t Cette formule peut sembler

leacutegegraverement arbitraire et complexe pour une forme supposeacutement simple Une seconde

deacutefinition reacutecursive cette fois-ci simplifie beaucoup la formule

322 Deacutefinition alternative

Bp =p (32)

BpOPl Pn(t) = (1 - t)BpOPl Pn-l (t) + tBplhPn (33)

Cette deacutefinition alternative se ramegravene agrave dire quune courbe de Beacutezier est une intershy

polation lineacuteaire entre deux courbes de Beacutezier de degreacute infeacuterieur La deacutemonstration se

ramegravene agrave quelques manipulations bien simples et est laisseacutee en exercice au lecteur

Nous pouvons analyser les formules pour diffeacuterents degreacutes Par exemple une formule de

Beacutezier de degreacute 1 nest quune droite

BPoPl (t) = (1 - t)Po + tP] (34)

Alors quune courbe de degreacute 2 se ramegravene agrave une parabole

(35)

Finalement une courbe de Beacutezier cubique (de degreacute 3) fournit une courbe relativement

complexe qui commence agrave Po et termine agrave P3

--- ---

34

P P

0

P

Po - ____ _ - - P2

Po - - - - - - - - - - - - - - - - - - - - - - - shyPo P2 P3

(a) lineacuteaire (b) quadratique (c) cubique

Figure 31 Courbes de Beacutezier lineacuteaire quadratique et cubique

Eacutevidemment il ny a pas davantages significatifs agrave utiliser une courbe de Beacutezier lineacuteaire

Les courbes de Beacutezier quadratique sont quant agrave elles utiliseacutees lors de la geacuteneacuteration

de police TrueType (Apple Computer Inc 1996) Finalement les courbes de Beacutezier

cubiques sont utiliseacutees dans Postscript (Adobe Systems Incorporated 2010a) et dans la

plupart des produits Jb1EX tel que Metafont (Knuth 1986) Ces logiciels utilisent en

fait une combinaison de courbes de Beacutezier appeleacutees splines que nous verrons dans la

section suivante

323 Proprieacuteteacutes dune courbe de Beacutezier

En regardant les diffeacuterentes courbes nous pouvons aiseacutement voir quelques proprieacuteteacutes

Entre autres il y a interpolation des points de deacutepart et de fin Cela peut se deacutemontrer

aiseacutement en calculant B(uuml) et B(l) qui donne respectivement Po et Pn De plus les

autres points ne semblent pas ecirctre interpoleacutes Il sagit ici dun cas geacuteneacuteral (les points

peuvent ecirctre interpoleacutes sils sont colineacuteaires)

Une autre proprieacuteteacute inteacuteressante des courbes de Beacutezier est son invariance par transforshy

mation affine Cela se ramegravene au theacuteoregraveme suivant Dans le cadre de ce theacuteoregraveme nous

devrons transformer les coordonneacutees des points de controcircles des courbes de Beacutezier en

coordonneacutees projectives homogegravenes Ceci se ramegravene agrave rajouter un axe agrave chacun de nos

points dont la valeur sera toujours 1

35

Theacuteoregraveme dinvariance affine

Soit BpOPl Pn(t) une courbe de Beacutezier Soit M une matrice 3 par 3 repTeacutesentant une

transformation affine Alors on a que la courbe est invari(Lnte par lapplication de M

cest-agrave-dire MBpoPlPn(t) = BMPolvIPl lvIPn(t)

Pour le prouver il suffit de deacutevelopper la formule

NI BpoP1Pn (t) = M t (~) (1 - tt-ieuml Pi 1=0

= tM(~) (1- tt-itiPi 1=0

= t (~) (1- t)n-iti(MPi ) 1=0

Ce theacuteoregraveme implique que pour transformer une courbe de 8eacutezier il suffit dappliquer la

transformation agrave chaque point de controcircle et de calculer une nouvelle courbe de 8eacutezier

Donc une courbe de Beacutezier est entiegraverement deacutefinie par ses points de controcircle Cela fait

quelle est tregraves pratique en informatique car elle ne requiert que peu despace pour la

deacutefinir (ie seulement les n + 1 points de controcircle) De plus il est tregraves simple de geacuteneacuterer

une courbe de Beacutezier car il suffit dutiliser la formule pour autant de valeurs de t que

nous avons besoin de preacutecision dans la courbe En conservant linformation avec cette

meacutethode nous conservons une courbe sans aucune perte dinformation Cela signifie que

nous pouvons agrandir la reacutesolution de la courbe autant que nous le souhaitons et il

sagira toujours dune belle ligne courbe Cette proprieacuteteacute est extrecircmement inteacuteressante

en informatique

36

324 Deacutesavantages des courbes de Beacutezier

Les courbes de Beacutezier sont utiliseacutees dans beaucoup de domaines Par contre elles

possegravedent quelques deacutesavantages peu inteacuteressants Le plus important est probablement

labsence de controcircle local Cela sexprime par le fait que degraves que lon souhaite modifier

une courbe de Beacutezier agrave un endroit particulier tout le reste de la courbe est modifieacute au

passage Cela se deacutemontre par le fait que si 0 lt t lt 1 on a alors que

Cela implique que chaque point de controcircle de la courbe de Beacutezier a une influence (aussi

minime soit-elle) sur lensemble de la courbe Le reacutesultat est que les courbes de Beacutezier

seules sont difficiles agrave utiliser et longues agrave eacutevaluer si on utilise trop de points de controcircle

33 Splines cubiques

La solution agrave ce problegraveme est lutilisation de splines cubiques Lideacutee de base dune spline

est que si une seule courbe cause trop de problegravemes il est probablement mieux dutiliser

plusieurs courbes mais qui fonctionnent seulement dans un domaine plus petit Plus

formellement une spline cubique (aussi appeleacute B-spline cubique) est composeacute de

- un ensemble de valeurs ti pour 0 S i S m - 1 ougrave m repreacutesente le nombre de noeuds

On appelle aussi ces valeurs le vecteur de noeud Les t forment une suite monotone

croissante et sont tous des valeurs reacuteelles entre 0 et l

- L + l points de controcircle

- Une valeur entiegravere n qui repreacutesente lordre de la fonction B-sp1ine Une spline doit

respecter la condition n S m - 2

On deacutefinit une spline par la fonction suivante

37

m-n-2

S(t) = L Pibin(t) tE [01] i=O

ou dans le cas speacutecifique dune spline de degreacute 3

3

S(t) = L Pi bi 3(t) tE [01] i=O

Les bin repreacutesentent les bases de la B-spline (pour Basis Spline) Celles-ci sont deacutefinies

par la fonction reacutecursive suivante

bjoU) ~ sinon

Il sagit dune eacutequation complexe et nous ne nous y attarderons pas trop Quelques

deacutetails sont inteacuteressants agrave noter Entre autre il est inteacuteressant de constater que si lon

utilise n + 1 points de controcircle et que les noeuds sont n noeuds valant zeacutero et n noeuds

valant 1 le B-spline deacutegeacutenegravere en une courbe de Beurozier Il sagit donc dune extension

des capaciteacutes des courbes de Beacutezier

Le problegraveme principal eacutevoqueacute par les courbes de Beacutezier est que lutilisateur lors de

la creacuteation dune courbe manquait de controcircle local Il serait donc inteacuteressant que les

B-splines nous permettent de reacutegler ce problegraveme Lorsquon regarde la deacutefinition de la

base bi on remarque que celle-ci se ramegravene toujours au cas de base qui peut ecirctre aou

1 selon que nous sommes dans un domaine restreint ou non Comme il sagit du seul

facteur de Pi il est naturel daffirmer que le controcirc~e est plus localiseacute quavant Dautres

proprieacuteteacutes inteacuteressantes sont

- Pour tout t la somme de tout les bi(t) est 1

38

C5 C4 C3 -----~---- ----~-----

-----~---- ----~-----

Cg ClO Cn

Figure 32 Cercle complet approximeacute par une b-spline composeacute de quatre courbes de Beacutezier

- Un B-spline dordre m sera neacutecessairement Cm - 2 cest-agrave-dire quelle possegravede 2 ordres

de deacuteriyeacutees continues pour son domaine de deacutefinition _

- Tout comme les courbes de Beacutezier les B-splines sont invariants par transformation

affine On peut donc appliquer une courbe en appliquant tout simplement la transshy

formation sur les points de controcircle et en calculant le nouveau B-spline

34 Le cas dun cercle

Avec les outils que nous posseacutedons nous ne sommes pas en capaciteacute de dessiner un

cercle exact Cela nest pas grave eacutetant donneacute que nous pouvons tout de mecircme tenter de

lapproximer Pour ce faire nous utiliserons une spline cubique posseacutedant quatre points

(est nord ouest et sud respectivement) Chaque courbe de Beacute7i~r sera donc identique

aux autres agrave une rotation pregraves Il reste donc agrave deacuteterminer les points de controcircle agrave utiliser

Pour cela prenons le premier quadrant du cercle Nous passons du point Cl (10) agrave

C4 (0 1) Il nous faut deacuteterminer deux points de controcircle C2 et C3 Pour commencer

39

nous pouvons supposer de maniegravere tout agrave fait arbitraire que C2 se situe sur la tangente

de Cl et C3 sur la tangente de C4 Cela nous donne donc le scheacutema suivant

C4 C3 ----- ----~-----

1

1

1

1

TC2 1

1

1

i

Figure 33 Quart de cercle approximeacute par une courbe de Beacutezier

On a donc C2(1 k) et C3(k 1) ougrave k est une variable agrave deacuteterminer Afin de la deacuteterminer

nous devons donner une information suppleacutementaire Par exemple nous pouvons preacuteshy

supposer que le point agrave 45 degreacutes C(O5) doit ecirctre eacutevalueacute exactement par la courbe de

Beacutezier cest-agrave-dire C(O5) = (1 1) Nous obtenons donc la restriction

C(uuml5) = (1 - t)3CI + 3(1 - t)2tC2 + 3(1 - t)t2C3 + t3C4

1 3 3 1 = -Cl + -C2 + -C3 + -C4

8 8 8 8

ce qui nous permet dobtenir leacutegaliteacute

v2v2 1 3 3 1 (- -) = -Cl + -C2 + -C3 + -C4 (37)22 8 8 8 8

ce qui nous fournit apregraves substitution des valeurs des points deux fois leacutequation

v2 1 3k-=-+- (38)2 2 8

40

ce qui nous fournit apregraves reacutesolution

k = ~(J2 - 1) 0552285

Cela nous fournit donc une courbe de Beacutezier qui approxime notre cercle Il reste agrave voir

la preacutecision de cette approximation

Pour ce faire nous devrons comparer larc de cercle que nous venons de creacuteer agrave un cercle

reacuteel Afin dy arriver nous consideacutererons chaque valeur de notre arc comme eacutetant un

vecteur dont nous devrons calculer la longueur Plus cette longueur est proche de 1

plus nous avons une estimation reacutealiste Nous calculons donc

Par la suite une analyse des deacuteriveacutees nous permet de conclure que cette fonction dans

lintervalle t E [01] possegravede des m(iximu_ms agrave _t = 0 agrave tr~is reprises _(au deacutebut et agrave la

fin eacutetant donneacute la proprieacuteteacute naturelle des courbes de Beacutezier celle au milieu est due agrave

notre contrainte) Finalement elle possegravede deux (2) minimums agrave t = 0211 et t = 0789

et lerreur avec un cercle standard est de 0000273 Une telle variation sur un cercle

de rayon 1 est minime Il sagit dune variation maximale infeacuterieure agrave 003 Cela

signifie donc pour un cercle posseacutedant un rayon de 4000 pixels il y aura une variation

maximale de 12 pixels ce qui est indeacutetectable pour la taille du cercle Cela en fait une

bonne estimation pour cette section du cercle Nous pouvons naturellement suivre le

mecircme raisonnement pour les sections restantes

Il est aussi agrave noter que notre estimation nest pas la meilleure Notre choix de demander

leacutegaliteacute agrave 45 degreacutes est arbitraire et toute lerreur se retrouve dans le cocircteacute neacutegatif De

meilleures estimations ont eacuteteacute effectueacutees (Riskus 2006) avec des reacutesultats amenant une

preacutecision jusquagrave 25 plus grande (Lancaster 2005)

41

0--------------r--7T-----------------rl 08 (1

-000005

-000010

-000015

-000020

-000025

Figure 34 Variation de la diffeacuterence entre un arc de cercle standard et la courbe de Beacutezier dans son domaine de reacutefeacuterence

35 Structures informatiques dans les solutions deacutejagrave existantes

Maintenant que nous savons comment fonctionne les diffeacuterents modes de repreacutesentation

des dessins en informatique il faut analyser plus en deacutetail comment fonctionne les

logiciels dont nous allons nous servir En effet il nous faudra adapter nos structures de

bas niveau agrave celles disponibles dans les langages dont nous nous servirons Pour cela

nous allons analyser deux parties distinctes un format de fichier (PDF) ainsi quun

42

langage intermeacutediaire (Asymptote)

351 Postscript et PDF

En premier lieu il convient de comprendre comment fonctionne le format de fichier final

que nous utiliserons ]1EX permet de geacuteneacuterer plusieurs formats de fichier diffeacuterents

Pendant longtemps le plus populaire aura eacuteteacute Postscript creacuteeacute par Adobe Systems Cela

eacutetait principalement lieacute aux imprimantes qui fonctionnaient directement avec ce format

De nos jours le format PDF est beaucoup plus populaire bien quayant une base tregraves

proche de celle de Postscript

Postscript a eacuteteacute inventeacute par John Warnock et Charles Geschke en 1982 (Adobe Systems

Incorporated 1994) Lorsquil a eacuteteacute creacuteeacute il servait agrave faire la description de pages pour

impression Il se distingue comme eacutetant un langage de programmation complet mais

rarement utiliseacute directement En effet Postscript est difficile agrave utiliser car il utilise la

notation polonaise inverse Par exemple on exprime lappel de fonction j(a b c) de la

faccedilon suivante

abc f

Cette meacutethode rend lanalyse dun programme extrecircmement rapide et convivial pour

le logiciel qui linterpregravete car celui-ci est directement lieacute agrave la structure dune pile

dexeacutecution Par contre lanalyse dun tel programme par un humain est complexe

La plupart du temps Postscript eacutetait donc utiliseacute comme un langage de description

final pour un fichier

Il existait deux types de structures utiliseacutes en Postscript pour mettre des dessins sur une

page Le premier eacutetait lajout de texte Cela est intrinsegravequement lieacute agrave la description des

polices qui deacutepasse le cadre de ce meacutemoire Par contre pour faire un dessin quelconque

le format utilisait les chemins qui sont deacutecrits soit par des segments soit par des courbes

de Beacutezier cubiques On note donc le deacutesavantage de lutilisation dune courbe de Beacutezier

soit labsence de controcircle local

43

Quant agrave lui PDF a eacuteteacute creacuteeacute en 1993 (Adobe Systems Incorporated 2010b) Agrave travers les

gains de populariteacute le format PDF est devenue en 2008 un standard ISO (International

Organization for Standardization 2008) Cela en fait donc un format de document

standard extrecircmement inteacuteressant Alors que Postscript a eacuteteacute creacuteeacute pour des documents

qui devaient ecirctre imprimeacutes PDF a eacuteteacute conccedilu pour la description de documents plus

dynamiques cest-agrave-dire la possibiliteacute dajouter des eacuteleacutements multimeacutedias au document

Aussi il est possible de deacutecrire chaque page indeacutependamment des suivantes En effet

comme Postscript deacutecrivait des documents dimpression il est normal de connaicirctre la

page de deacutepart avant dimprimer la suivante En PDF chaque page est totalement

indeacutependante du reste du document

Pour la description deacuteleacutements graphiques les structures de base sont essentiellement

les mecircmes que Postscript Quelques eacuteleacutements comme la transparence cest-agrave-dire quun

eacuteleacutement cacheacute par un autre eacuteleacutement contribue au reacutesultat final ont eacuteteacute ajouteacutes mais les

eacuteleacutements graphiques de bas niveau sont identiques

352 Asymptote

Comme nous lavons dit preacuteceacutedemment tout ramener agrave des courbes de Beacutezier creacutee un

problegraveme de controcircle local des courbes Il faut donc utiliser une meacutethode pour donner

du controcircle agrave lutilisateur Pour cela nous utiliserons Asymptote Les structures de

bas niveau de Asymptote sont identiques agrave celles de PDF eacutetant donneacute quil convertit

directement les chemins Asymptote en chemins PDF Par contre Asymptote impleacutemente

un algorithme (Bowman 2007) originellement deacuteveloppeacute par Donald Knuth qui permet

de deacutecrire un chemin en fonction des points par lesquels il passe Asymptote utilise donc

des splines cubiques (qui ne sont pas neacutecessairement des B-splines toutefois)

Cet algorithme est complexe et en dehors du cadre de ce meacutemoire mais peut ecirctre

reacutesumeacute comme eacutetant un algorithme de choix des points de controcircle En effet une courbe

de Beacutezier cubique est deacutefinie par 4 points Le premier et le dernier sont interpoleacutes de

maniegravere exacte Ce que lalgorithme fait est quil prend un ensemble de points qui

44

seront tous interpoleacutes disons Pl P2 P3 P4 Ensuite pour chaque paire conseacutecutive de

points (donc (Pl P2 ) (P2 P3) et (P3 P4)) il geacuteneacuterera une courbe de Beacutezier cubique

La partie la plus importante de lalgorithme consiste agrave prendre toutes les informations

fournies par lutilisateur (les points de controcircle ainsi que des options qui deacutefinissent la

courbe comme les deacuteriveacutees agrave certains endroits ou des informations comme la tension qui

laisse lalgorithme calculer lui-mecircme les deacuteriveacutees agrave partir dun indice reacuteel simple) afin de

calculer pour chaque courbe de Beacutezier cubique les deux points de controcircle manquants

En laissant agrave lutilisateur le pouvoir de deacutecider seulement les points ougrave la courbe passe

le travail est simplifieacute mais permet tout de mecircme de terminer avec un ensemble de

courbes de Beacutezier

CHAPITRE IV

THEacuteORIE DES LANGAGES INFORMATIQUES

La creacuteation dun langage de programmation nest pas une mince tacircche Il faut donc

sassurer de le construire sur des bases theacuteoriques solides Nous preacutesenterons ici les

eacuteleacutements theacuteoriques importants de la theacuteorie des langages ainsi que leurs applications

dans le domaine de la compilation Nous preacutesenterons aussi loutil SableCC que nous

avons utiliseacute dans le cadre de notre langage ainsi quun bref exposeacute sur les langages

reacuteflexifs

La theacuteorie des langages est un sujet vaste et extrecircmement complexe Un meacutemoire comshy

plet pourrait ecirctre reacutedigeacute seulement sur les aspects theacuteoriques des automates reacuteguliers

Afin de compresser tout ce contenu dans un seul chapitre les eacuteleacutements seront mentionneacutes

sans preuve Nous recommandons toutefois au lecteur curieux et assidu de consulter les

reacutefeacuterences de ce chapitre pour des preuves et une couverture plus complegravete du sujet

41 Theacuteorie des langages et automates

Dans un premier temps nous devrons deacuteterminer ce quest formellement un langage

Par la suite nous analyserons une structure de donneacutees qui est intimement lieacutee agrave ce

sujet les automates

46

411 Les eacuteleacutements de base dun langage (Aho Sethi et Ullman 1986)

Alphabet et lettre

Un alphabet est un ensemble (au sens matheacutematique du mot) de symboles appeleacutes

lettres Un alphabet est fini et non-vide Par exemple lalphabet latin standard ainsi

que lensemble O I constituent des alphabets

Mot

Un mot dun alphabet A peut ecirctre un des trois cas suivants

- le mot vide euro formeacute daucune lettre

- une lettre de lalphabet A

- Toute suite finie de lettres aOal an ougrave chaque ai fait partie de lalphabet A

Il est agrave noter que les deux premiers sont en fait des cas speacutecifiques du dernier bien quils

sont souvent seacutepareacutes pour raison de clarteacute Dans le dernier cas on dit que les caractegraveres

sont lieacutes par lopeacuteration de concateacutenation

Langage

Un langage au sens le plus geacuteneacuteral possible est un ensemble de mots Celui-ci peut ecirctre

fini ou infini La plupart des exemples inteacuteressants (un langage de programmation par

exemple) est un langage infini En effet il existe une infiniteacute de programmes diffeacuterents

tout comme il existe une infiniteacute de nombres binaires

412 Exp esson reacutegnli r

Les expressions reacuteguliegraveres forment un outil de travail extrecircmement important en inshy

formatique De nombreux outils ainsi que certains langages (grep perl ) leurs sont

consacreacutes

47

On peut reacutesumer les expressions reacuteguliegraveres comme eacutetant une meacutethode afin de deacutecrire

un langage infini par une expression fini On utilisera dans la construction certaines

opeacuterations qui nous donneront des proprieacuteteacutes inteacuteressantes pour le langage final Tout

mot qui peut ecirctre construit agrave partir de ces regravegles fait automatiquement partie du langage

Constantes

Leacuteleacutement de base dune expression reacuteguliegravere est une constante Celle-ci est deacutefinie agrave

partir dune lettre de lalphabet et deacutefinit un seul mot la constante elle-mecircme Par

conseacutequent lexpression reacuteguliegravere a de lalphabet ab repreacutesente le langage a Il est

agrave noter que nous pouvons aussi utiliser le mot vide comme une constante repreacutesentant

lensemble vide

Concateacutenation

Lopeacuteration de concateacutenation est une opeacuteration sur les mots qui permet de creacuteer des

expressions reacuteguliegraveres plus longues agrave partir de deux expressions reacuteguliegraveres valides Le

reacutesultat de lexpression reacuteguliegravere A concateacuteneacutee agrave B est donc nimporte quel mot de A

concateacuteneacute agrave nimporte quel mot de B Par exemple ab est une expression reacuteguliegravere qui

repreacutesente un langage agrave un mot ab

Union

Lunion des expressions reacuteguliegraveres est une opeacuteration qui correspond agrave lunion ensemshy

bliste Lors de lunion de A et de B (deacutefini comme (AIB)) nous pouvons choisir nimshy

porte quel eacuteleacutement de A ou de B comme un mot valide Par exemple (alb)b repreacutesente

le langage contenant deux mots ab bb

Fermeture de Kleene

La fermeture de Kleene est une opeacuteration beaucoup plus inteacuteressante Celle-ci utilise

une expression reacuteguliegravere A Le reacutesultat de la fermeture noteacute A est la concateacutenation

48

dun nombre fini deacuteleacutements de A avec possibiliteacute de reacutepeacutetitions Par exemples pour

ab toute chaicircne de a finie possiblement de longueur zeacutero suivie dun b fait partie du

langage Lexpression reacuteguliegravere (alb) repreacutesente nimporte quelle chaicircne finie de a ou de

b

Les langages que nous pouvons geacuteneacuterer avec des expressions reacuteguliegraveres sont assez riches

bien quinsuffisants pour geacuteneacuterer un langage de programmation (Aho Sethi et Ullman

1986)

413 Automates

Avant de pouvoir expliquer agrave quoi servent les expressions reacuteguliegraveres nous devons discuter

des automates une structure dune importance cruciale en informatique

Automate fini

yn automate fini (Ullman Hopcroft et Motwani 1~79) est un quintuplet composeacute de

cinq eacuteleacutements

- Un ensemble fini deacutetats E

- Un alphabet fini A

- Un ou plusieurs eacutetats de deacutepart d (selon que lautomate est deacuteterministe ou non)

- Un ensemble deacutetats dit finaux F

- Une relation de transition T ccedil E x A x E Cela deacutefinit une maniegravere de passer dun

eacutetat agrave un autre lors de lapparition dun symbole speacutecifique

On repreacutesente en geacuteneacuteral un automate par un graphe avec des flegraveches nommeacutees Les

flegraveches repreacutesentent la relation de transition alors que les sommets repreacutesentent les

eacutetats dans E On repreacutesente un eacutetat initial par une flegraveche qui ne part pas dun eacutetat

Finalement on repreacutesente un eacutetat final par un cercle double Par exemple lautomate

suivant accepte lensemble des mots qui sont composeacutes dune seacuterie de a (possiblement

nulle) suivi dun b Donc les mots b ab et aab serait des mots valides par rapport agrave

49

cet automate

Figure 41 Automate acceptant les mots formeacutes dune seacuterie de a suivi dun b

Lensemble T peut prendre plusieurs formes en fonction du deacuteterminisme de lautomate

comme nous allons maintenant le voir

Automate non-deacuteterministe

Un automate non-deacuteterministe peut posseacuteder plusieurs eacutetats de deacutepart De plus son

ensemble de transitions T est quelconque Il peut donc exister pour un eacutetat e et un

symbole a plusieurs eacutetats e tels que (e a e) E T

Un automate non-deacuteterministe peut ecirctre vu comme une forme de graphe dans lequel on

peut se promener en utilisant certaines transitions La suite des symboles des transitions

que nous utilisons forment un mot Lensemble des mots obtenus par une suite de transhy

sitions allant dun eacutetat initial agrave un eacutetat final constitue le langage de lautomate Dans

un automate non-deacuteterministe il peut neacuteanmoins exister pour le mecircme mot plusieurs

chemins diffeacuterents deacutebutant dans un eacutetat initial Il est important de noter quun mot

est accepteacute degraves quun de ces chemins se termine dans un eacutetat final

Automate deacuteterministe

Un automate non-deacuteterministe nous permet de creacuteer des langages mais le fait davoir

plus dun choix pour le mecircme symbole peut sembler inquieacutetant surtout lorsquil sagit

dinformatique Nous pouvons donc deacutefinir un automate deacuteterministe plus simple Celuishy

50

ci possegravede un seul eacutetat de deacutepart et son ensemble de transitions T assure que pour

chaque symbole il ny a quun seul eacutetat suivant possible Il ny a donc pour chaque mot

quun seul chemin possible agrave partir de leacutetat initial Plus formellement lautomate sera

deacuteterministe si pour tout e E E et a E A il y a un seul e E E tel que (e a e) ET

Le reacuteflexe naturel serait de croire quen enlevant le non-deacuteterminisme dun automate

celui-ci devient beaucoup moins puissant permettant de repreacutesenter beaucoup moins

de langages Or il nen est rien Il a eacuteteacute prouveacute (malheureusement en trop de pages

pour ce meacutemoire) que nimporte quel automate non-deacuteterministe peut ecirctre rameneacute agrave

un automate deacuteterministe quitte agrave voir le nombre deacutetats de lautomate augmenter

exponentiellement Nous pouvons donc toujours creacuteer un automate non-deacuteterministe et

laisser la tacircche agrave un ordinateur de creacuteer un automate deacuteterministe agrave partir de celui-ci

(Ullman Hopcroft et Motwani 1979)

Exeacutecution dun automate et contraintes temporelles

La meacutethode dexeacutecution dun automate deacuteterministe est assez simple Nous lui fournisshy

sons un mot dune certaine longueur disons n Nous deacutemarrons de leacutetat initial et chaque

lettre repreacutesente un choix agrave faire dans lautomate Comme lautomate est deacuteterministe

il ny a quune possibiliteacute agrave explorer Si nous ne pouvons plus avancer avant la fin du

mot celui-ci ne fait pas partie du langage de lautomate Si nous parvenons agrave avancer

jusquau bout et que nous ne sommes pas dans un eacutetat final il nen fait pas partie non

plus Par contre si leacutetat est final nous avons trouveacute un mot du langage Co me le mot

possegravede n lettres nous aurons au maximum n choix agrave faire rendant lalgorithme dapshy

partenance agrave un temps dexeacutecution lineacuteaire Un algorithme lineacuteaire est naturellement

extrecircmement inteacuteressant en informatique car nous voulons un programme qui sexeacutecute

dans un temps raisonnable

51

414 Lien entre langage reacutegulier et automate fini

Nous connaissons donc maintenant deux meacutethodes pour creacuteer un langage Les expresshy

sions reacuteguliegraveres ainsi que les automates Un automate est difficile agrave concevoir pour un

ecirctre humain mais extrecircmement rapide dutilisation par un ordinateur Une expression

reacuteguliegravere est complexe pour un ordinateur mais aiseacutee agrave concevoir par un ecirctre humain Il

nous faut donc voir si nous pouvons obtenir des proprieacuteteacutes communes agrave ces deux outils

Le lien

Il existe en effet un lien qui unit ces deux structures Celui-ci est extrecircmement fort

lensemble des langages quil est possible de geacuteneacuterer avec des expressions reacuteguliegraveres est

exactement le mecircme ensemble que ceux qui peuvent ecirctre geacuteneacutereacutes par un automate fini

deacuteterministe Cela implique que pour chaque expression reacuteguliegravere nous pouvons troushy

ver un automate qui repreacutesente le mecircme langage Cela est vrai aussi en sens inverse

Par contre il ne sagit pas dune bijection car plusieurs expressions reacuteguliegraveres peuvent

correspondre au mecircme automate (par exemple a et aamiddot) Il existe un algorithme permetshy

tant de transformer une expression reacuteguliegravere en automate mais celui-ci est complexe et

deacutepasse le cadre de ce meacutemoire Nous pouvons toutefois mentionner que cet algorithme

est relativement lent (sexeacutecute en O(2m ) ou m est la longueur de lexpression reacuteguliegravere)

mais permet par la suite de trouver si un mot fait partie dun langage en temps lineacuteaire

(McNaughton et Yamada 1960)

Importance dun tel lien

Ce lien est un eacuteleacutement crucial dans la capaciteacute dun ordinateur agrave travailler avec des lanshy

gages de programmation En effet cela permet aux creacuteateurs de langages de deacutecrire des

mots agrave partir dexpressions reacuteguliegraveres (quils comprennent) et de laisser un programme

creacuteer des automates qui peuvent reconnaicirctre ces symboles (un if ou un for mais aussi

des variables) dans des programmes Cela permet donc de creacuteer une partie importante

dun langage quon appelle lanalyse lexicale Cela permet agrave partir de lutilisation de

52

lautomate creacuteeacute par des expressions reacuteguliegraveres de transformer un texte en une suite de

symboles plus speacutecifiques Par exemple le texte

if a 1 then true else faIse

pourrait ecirctre traduit par la suite de symboles suivants

IF VAR EQ NUM THEN BD DL ELSE BDDL FININSTR

Cette eacutetape lanalyse lexicale est cruciale agrave la suite de lanalyse dun programme Les

automates nous sont toutefois utiles non seulement pour les mots cleacutes mais aussi pour

des eacuteleacutements plus complexes comme des variables Une variable est souvent identifieacutee

comme eacutetant une lettre suivie dune suite de caractegraveres quelconques (sauf exception tel

quun espace)

Malgreacute tout il existe certains eacuteleacutements quun automate ne peut reconnaicirctre Un exemple

classique est le parentheacutesage eacutequilibreacute (une suite de parenthegraveses telle que c~aque pashy

renthegravese ouvrante est associeacute agrave une parenthegravese fermante et agrave nimporte quel moment il

nexiste pas plus de fermantes que douvrantes) Il est en effet impossible aux automates

de faire le lien entre les deux types de parenthegraveses (Ullman Hopcroft et Motwani 1979)

Pour cela il nous faudra utiliser des structures plus complexes

42 Grammaires

Ces structures sont les grammaires Il est possible de les voir comme eacutetant une forme

beaucoup plus geacuteneacuterale des expressions reacuteguliegraveres Avec cette structure nous pourrons

nous assurer quun programme est bien formeacute cest-agrave-dire creacuteer un arbre repreacutesentant

la structure dun programme un peu comme la structure dune phrase

421 Deacutefinition dune grammaire formelle

Une grammaire est constitueacutee de quatre eacuteleacutements

53

- Un ensemble fini de terminaux Ceux-ci sont des symboles repreacutesentant les lettres

dun langage Par conseacutequent on peut aussi appeler les terminaux lalphabet dune

grammaire

- Un ensemble fini de non-terminaux Habituellement repreacutesenteacute par des majuscules

(par des symboles diffeacuterents des terminaux) pour des raisons de clarteacute ceux-ci repreacuteshy

sentent des eacutetats intermeacutediaires de la grammaire

- Un non-terminal de deacutepart parmi lensemble deacutecrit plus haut

- Un ensemble de regravegles de production Celles-ci vont varier selon la cateacutegorie de langage

choisie mais de maniegravere geacuteneacuterale une regravegle de production est une paire ordonneacutee

dont chaque eacuteleacutement est composeacute dune suite de terminaux et de non-terminaux (par

exemple aB -t aAa)

Le fait de repreacutesenter une regravegle de production avec une flegraveche permet den expliciter le

rocircle transformer une suite de caractegraveres en une autre Lutilisation dune grammaire

consiste donc agrave deacutemarrer avec le non-terminal de deacutepart puis dappliquer une suite de

regravegles de production pour modifier le non-termina Lorsquon obtient un mot formeacute

uniquement de terminaux il sagit dun mot du langage repreacutesenteacute par la grammaire

Par exemple

S -gt aA

A -gt b

repreacutesente un langage contenant le seul mot ab On applique doEn effet unc un proceacutedeacute

de deacuterivation (en appliquant chaque regravegle) Par exemple une deacuterivation possible du mot

ab dans ce contexte (la seule dailleurs) est la suite suivante

S (deacutepart)

S -gt aA (application de S -gt aA)

aA -gt ab (application de A -gt b)

54

422 Hieacuterarchie de Chomsky

La deacutefinition que nOlis avons donneacutee preacuteceacutedemment dun langage est beaucoup trop

geacuteneacuterale pour nous fournir des proprieacuteteacutes inteacuteressantes Afin de deacutegager des proprieacuteteacutes

inteacuteressantes nous deacutefinissons plusieurs cateacutegories Plusieurs noms sont utiliseacutes pour

chaque cateacutegorie mais nous nous limiterons agrave utiliser ceux deacutefinis par le linguiste Noam

Chomsky (Chomsky 1956) Chacune de ces cateacutegories sera deacutecrite par les proprieacuteteacutes de

sa grammaire Il est agrave noter que nous avons neacutegligeacute certaines cateacutegories de langages qui

ne sont pas lieacutees au domaine

Langage reacutegulier

Un langage reacutegulier est eacutequivalent aux expressions reacuteguliegraveres Les regravegles de production

de la grammaire doivent ecirctre de la forme

A -) Ba

A -) a

ou

A -) aB

A -) a

avec A et B des non-terminaux et a un termina Il est agrave noter que toutes les regravegles

dune grammaire doivent ecirctre soit du premier cas soit du deuxiegraveme cas On les appelle

reacutecursives agrave gauche ou agrave droite respectivement

Langage non-contextuel

Un langage non-contextuel est un peu plus complexe quun langage reacutegulier Les regravegles

de production de la grammaire doivent ecirctre de la forme

55

A -) B

avec A un non-terminal et B une suite de terminaux et de non-terminaux Le deacutetail

le plus important est de noter que les langages non-contextuels permettent de creacuteer un

systegraveme de parenthegraveses eacutequilibreacutees En effet voici une grammaire qui accepte seulement

un parentheacutesage eacutequilibreacute

P -) pp

P -) CP)

P -)

Il est eacutevident quune grammaire reacuteguliegravere ne peut geacuteneacuterer ce genre de langage Par contre

un parentheacutesage eacutequilibreacute est extrecircmement important dans le domaine de la compilashy

tion afin dexprimer clairement les ideacutees dun programmeur et plus speacutecifiquement

permettre deacutecrire des formules matheacutematiques complexes compreacutehensibles par lOlmiddotdishy

nateur

Langage contextuel

Les langages contextuels ne sont pas utiliseacutes en geacuteneacuteral en compilation car ils sont

beaucoup plus lents Les regravegles de production de la grammaire doivent ecirctre de la forme

ABC -) ADC

ougrave B est un non-terminal A et C sont des non-terminaux ou le mot vide et D est un

non-terminal (mais pas le mot vide) On voit clairement ici dougrave vient le nom de ce type

de langage B est transformeacute en fonction de ce qui est autour de lui (son contexte)

423 Utiliteacute dans les langages de programmation

La prochaine tacircche dans la creacuteation dun langage est danalyser la structure de notre

programme Pour effectuer cette tacircche nous pouvons utiliser une grammaire non-conshy

56

textuelle Agrave cette fin nous pouvons nous assurer que les eacutequations sont correctement

formeacutees que les instructions sont valides etc

Dans un autre ordre dideacutee la hieacuterarchie de Chomsky possegravede aussi des liens avec les

machines de Turing qui sont elles-mecircmes intimement lieacutees agrave la theacuteorie de la complexiteacute

(Davis Sigal et Weyuker 1994) Ce domaine est extrecircmement vaste et le lecteur pourra

trouver dans les reacutefeacuterences plusieurs excellents ouvrages pour sinitier agrave ce domaine (Dhu

et Ko 2000)

43 SableCC

Bien quil est tregraves inteacuteressant deacutetudier les algorithmes de compilation limpleacutementation

de chacun de ces algorithmes deacutepasse largement le cadre de ce meacutemoire Il nous faut

donc trouver une meacutethode afin de creacuteer notre langage de programmation Plusieurs

outils soffrent agrave nous mais notre choix sarrecirctera sur SableCC

431 Quest-ce que S~bleCC

SabieCC est ce quon appelle un compilateur de compilateurs (Gagnon 1998) Un comshy

pilateur de compilateurs est un programme qui permet agrave partir dune deacutefinition absshy

traite dun langage de programmation dobtenir un compilateur pour ce langage Plus

speacutecifiquement le programme reacutesultant nous permettra dobtenir larbre syntaxique

dun programme ce qui nous permettra de lanalyser reacutecursivement et de lexeacutecuter (ou

bien de le transformer dans un langage diffeacuterent selon le cas) Les formes abstraites que

requiert un compilateur de compilateurs sont justement les expressions reacuteguliegraveres (pour

deacutecouvrir les symboles) et les grammaires non-contextuelles (pour lanalyse syntaxique

des symboles obtenus preacuteceacutedemment)

432 Avantages de SableCC

Bien que SabieCC nest pas le compilateur de compilateurs le plus connu il possegravede

plusieurs aspects inteacuteressants Premiegraverement comparativement agrave ses compeacutetiteurs plus

57

acircgeacutes SabieCC est eacutecrit dans un paradigme orienteacute-objet Cela rend le compilateur beaushy

coup plus simple agrave utiliser De plus le logiciel geacutenegravere automatiquement un ensemble de

classes (dans un choix de plusieurs langages) qui permet de traiter aiseacutement et claishy

rement avec des concepts modernes les arbres syntaxiques reacutesultant de lanalyse du

programme

44 Langage reacuteflexif

Finalement une fois que nous avons obtenu un arbre syntaxique et que nous savons que

notre langage est bien formeacute il nous reste la reacuteflexiviteacute agrave prendre en compte En effet

nous ne voulons pas reacuteeacutecrire inutilement dans notre langage chaque fonction qui existe

deacutejagrave en Java Nous pourrons les utiliser avec un langage reacuteflexif Une autre possibiliteacute

dun langage reacuteflexif est de deacuteleacuteguer agrave SDDL la creacuteation de classes Cela permet agrave lutilishy

sateur de reacutefeacuterencer nimporte quelle classe Java sans avoir agrave changer le code de SDDL

lui-mecircme Cela serait impossible sans un langage reacuteflexif

441 Deacutefinition dun langage reacuteflexif

Un langage reacuteflexif (Sobel et Friedman 1996) est un langage qui est capable soit de

- Examiner son eacutetat cette proprieacuteteacute est appeleacutee introspection

- Modifier son eacutetat cette proprieacuteteacute est appeleacutee intercession

Lintrospection permet agrave un langage de connaicirctre entre autres les classes quil utilise

ainsi que les meacutethodes et les paramegravetres Lintercession beaucoup plus puissante pershy

mettrait par exemple cie rajouter modifier ou supprimer des classes etou meacutethodes

Pour nos besoins nous sommes naturellement inteacuteresseacutes par lintercession

442 Avantages

Lavantage le plus clair de lutilisation de la reacuteflexiviteacute est la reacuteutilisation du code En

effet toutes les fonctionnaliteacutes du langage infeacuterieur (Java dans ce cas-ci) peuvent ecirctre

58

automatiquement passeacutees au langage supeacuterieur Cela eacutevite davoir agrave reacuteeacutecrire du code

pour chaque nouvel eacuteleacutement agrave ajouter

Un autre avantage assez explicite est de permettre agrave des utilisateurs un peu plus aguerri

de lier du code des deux niveaux de langage ensemble En effet si un utilisateur creacutee

une structure de donneacutees en Java il peut toujours se servir exactement de la mecircme

classe dans le langage supeacuterieur sans avoir agrave faire la moindre modification au langage

supeacuterieur lui-mecircme Il est donc clair quun langage qui utilise la reacuteflexiviteacute peut devenir

tregraves puissant

443 Deacutesavantages

Certains deacutesavantages accompagnent aussi la reacuteflexiviteacute Un des plus importants est la

contrainte de seacutecuriteacute En effet si un utilisateur peut appeler nimporte quelle classe

Java agrave partir du langage supeacuterieur il peut tregraves aiseacutement appeler des fonctions qui cassent

le programme si un controcircle suffisamment important nest pas effectueacute par le logiciel Il

peut aussi sans causer d~s problegravem_es de seacutec~riteacute confondre un usager en provoquant

des effets de bord sur leacutetat du logiciel cest-agrave-dire modifier des proprieacuteteacutes du reste du

programme sans neacutecessairement que cela paraisse

Un autre deacutesavantage eacutevident est quun utilisateur qui souhaite utilicirc3er les fonctions du

langage infeacuterieur doit en quelque sorte connaicirctre celui-ci Cela implique donc lapprenshy

tissage dun deuxiegraveme langage ce qui en soit peut paraicirctre trop pour des utilisateurs

plus traditionnels

Lorsquon analyse froidement les avantages et les inconveacutenients on voit que les avanshy

tages sont beaucoup plus importants En effet le projet eacutetant limiteacute dans le temps et

dans le personnel il est en quelque sorte impossible de fournir des librairies de foncshy

tions suffisamment complegravetes pour les utilisateurs Se brancher sur les librairies Java

fournit automatiquement tout ce dont nous avons besoin et donne accegraves agrave une quantiteacute

innombrable de projets deacutejagrave creacuteeacutes dans ce langage

CHAPITRE V

MISE EN OEUVRE DE LA SOLUTION

Maintenant que nous avons des bases theacuteoriques solides ainsi quune hieacuterarchie bien

adapteacutee agrave nos besoins nous pouyons commencer agrave impleacutementer notre solution Cela

implique premiegraverement la creacuteation de notre hieacuterarchie objet en Java Deuxiegravemement

nous devons impleacutementer une grammaire afin de deacutecrire SDDL Finalement il faut

ajouter du code afin dimpleacutementer certaines proprieacuteteacutes voulues pour notre langage Il

est agrave noter que nous avons inclus en annexe un diagramme de notre hieacuterarchie ainsi que

la grammaire complegravete de SDDL

51 Eacuteleacutements de langage en SDDL

511 Impleacutementation de la hieacuterarchie

Limpleacutementation de la hieacuterarchie eacutetant seacutepareacutee du reste du langage il est normal de

commencer avec celle-ci eacutetant donneacute quelle repreacutesente le module le plus important de

notre projet Cela nous permet de le tester au fur et agrave mesure avant de commencer agrave

creacuteer un langage de plus haut niveau qui lutilise

Un des problegravemes les plus importants du deacuteveloppement de la hieacuterarchie fut de deacuteveshy

lopper correctement la deacutefinition et laccegraves agrave des points speacutecifiques de certains objets

Comme lideacutee eacutetait de permettre dobtenir une quantiteacute essentiellement illimiteacutee de

points diffeacuterents il fallait une meacutethode robuste et efficace

60

Notre meacutethode implique de fournir des informations par rapport au dessin englobant agrave

chaque sous-dessin Cela est requis car un objet preacutesent agrave plusieurs endroits diffeacuterents

auquel on demande un point speacutecifique se bute agrave une ambiguiumlteacute Mecircme en utilisant

seulement un Drawing qui est techniquement une instance unique dune forme il faut

faire attention En effet si on a un Drawing dun cercle qui est agrave linteacuterieur dune

ellipse par exemple nous pourrions deacutecider de placer cette ellipse agrave plusieurs endroits

Nous aurions donc le mecircme problegraveme dambiguiumlteacute du positionnement des points Afin

de remeacutedier agrave ce problegraveme nous avons fourni au Drawing sa position agrave linteacuterieur du

diagramme Lorsquil est copieacute nous navons quagrave changer linformation pour que le

positionnement soit correct

512 Grammaire

Le deacuteveloppement de la grammaire fut naturellement une section cruciale du deacutevelopshy

pement de SDDL Comme nous avions deacutejagrave deacuteveloppeacute des objectifs speacutecifiques pour la

forme du langage la creacuteation fut relativement directe Quelques eacuteleacutements importants

ont toutefois ducirc ecirctre ajouteacutes en cours de route En particulier des eacuteleacutements seacuteparateurs

ont eacuteteacute dune importance cruciale Il aurait donc pu ecirctre souhaitable de diminuer la

verbositeacute en enlevant des parenthegraveses ou des virgules mais cela cause (dans la plupart

des cas) des problegravemes au niveau de lambiguiumlteacute de la grammaire (tel que nous lavons

vu preacuteceacutedemment)

Nous avons aussi deacutecideacute de deacutecreacuteter quune expression geacuteneacuterale est une instruction Cela

peut sembler contre-intuitif car une expression (comme 2 + 2) ne semble pas ecirctre une

instruction La raison derriegravere ce changement est le dessin de chemin En effet nous

pouvons deacuteterminer un chemin (Path) comme nimporte quel autre objet Par contre

cela implique de lajouter par la suite seacutepareacutement agrave un canevas Cela semble contreshy

intuitif nous voyons souvent les liens entre les objets comme eacutetant des liens de niveau

supeacuterieur (bref faits dans le canevas principal) Pour lier a et b il semble plus logique

deacutecrire

61

a--b

que

lien = a--b

put lien in main

Afin de reacutegler ce problegraveme nous avons deacutecideacute de laisser les expressions ecirctre des insshy

tructions Cela fait que deacutefinir une ligne (comme a--b) devient automatiquement une

instruction valide Celle-ci sera traiteacutee comme un cas speacutecial afin decirctre placeacutee direcshy

tement au centre du canevas principal Cela implique aussi comme nous le verrons

plus tard de rajouter du code afin de sassurer que les expressions qui ne sont pas des

instructions soient refuseacutees par le programme

stm = exp exp sc 1 assign id assign exp sc 1 while while_kwd exp do_kwd (stms] stm end_kwd sc 1 if if_kwd exp then_kwd (stms] stm else_part end_kwd sc 1 for for_kwd id from~kwd (low_bound] exp to_kwd (up_bound] exp

do_kwd (stms] stm end_kwd sc 1 return return_kwd exp sc

Figure 51 Extrait de la grammaire de SDDL pour une instruction

513 Impleacutementation des diffeacuterentes proprieacuteteacutes du langage

Plusieurs proprieacuteteacutes de SDDL ne venaient pas directement avec la grammaire Celles-ci

ont neacutecessiteacute un traitement bien particulier en fonction de la proprieacuteteacute rechercheacutee

Typage

La grammaire de SDDL indique clairement que le langage est agrave typage dynamique eacutetant

donneacute que les creacuteations de variables ne permettent pas de donner un type Le mecircme

62

pheacutenomegravene est preacutesent dans la deacutefinition des fonctions Par contre le fait de souhaiter

un typage dynamique implique lajout dune large section de code deacutedieacutee agrave la veacuterification

de type Chaque opeacuteration ne peut ecirctre appliqueacutee quagrave certains types deacuteleacutements et donc

avant deffectuer lopeacuteration il faut veacuterifier si le type est valide

Eacuteleacutements objets

Impleacutementer tous les principes dun langage orienteacute-objet est un travail de longue hashy

leine Par contre eacutetant donneacute que notre objectif eacutetait de simplifier le langage de desshy

cription final nous avons deacutecideacute de ne pas permettre la creacuteation de nouvelles classes

agrave linteacuterieur de SDDL Cela implique que nous pouvons releacuteguer la creacuteation de classes

uniquement au langage Java Cela a donc grandement faciliteacute la tacircche car nous navions

pas besoin dimpleacutementer la tregraves grande majoriteacute des concepts objets que nous laquo emshy

pruntons raquo agrave Java

Eacutelimination de la verbositeacute

Une bonne partie de leacutelimination de la verbositeacute vient de la conception mecircme du lanshy

gage En effet le fait de releacuteguer la deacutefinition des classes agrave Java ainsi que de creacuteer le

typage dynamique ont purement par choix eacutelimineacute une bonne partie de la verbositeacute

Quelques eacuteleacutements suppleacutementaires ont permis deacuteliminer un excegraves de verbositeacute On

note entre autres le fait de deacutefinir la description du diagramme sans le speacutecifier dans le

cadre dune fonction Un autre pheacutenomegravene important est davoir deacutecideacute de promouvoir

les points et certaines fonctions relieacutees agrave leacutetat de primitive naturelle du langage En

effet une addition entre un point a et b seffectue

c = a + b

au lieu de en Java

AbstractPoint c aadd(b)

63

Cela peut sembler comme un maigre gain mais lorsquappliqueacute agrave un calcul complexe

impliquant des points (par exemple le calcul dune combinaison lineacuteaire) les gains

combineacutes rendent le code extrecircmement clair

AbstractPoint c = amultiply(1030)add(bmultiply(2030))

c = (a 30 + 20 b 30)

Figure 52 Code Java et SDDL pour calculer une combinaison lineacuteaire

52 Reacutealisation en Java

Afin de reacutealiser SDDL il a bien sucircr fallu eacutecrire une grammaire mais beaucoup de code

autour sert agrave inteacutegrer la grammaire au restant des fonctionnaliteacutes de notre hieacuterarchie

Ce code fut complegravetement eacutecrit en Java et remplit plusieurs fonctions

521 Traverseacutee de larbre grammatical et exeacutecution

La grande majoriteacute du code Java suppleacutementaire eacutecrit a servi agrave permettre la traverseacutee

de larbre grammatical creacuteeacute par notre grammaire Cette traverseacutee permet en quelque

sorte lexeacutecution du code SDDL et est donc cruciale Pour la plupart il sagit dune trashy

verseacutee en profondeur relativement classique Quelques petits deacutetails retiennent toutefois

lattention

- Certains morceaux de code ne doivent pas ecirctre exeacutecuteacutes et ont donc un comportement

speacutecial Cest le cas des deacutefinitions de fonctions qui ne sont exeacutecuteacutees quagrave lappel On

meacutemorise donc en quelque sorte une partie de larbre grammatical et lors dun appel

on transfegravere le controcircle dexeacutecution agrave cette partie Eacutevidemment lors de la lecture de

la deacutefinition de la fonction il faut stocker quelques informations sur nos fonctions

dans une structure deacutefinie agrave cet effet (un Methodlnf0)

- Certaines opeacuterations ont plusieurs sens distincts qui ne peuvent ecirctre speacutecifieacutes dans la

grammaire La seacutemantique dune telle opeacuteration napparaicirct clairement quau moment

de la lecture de lopeacuteration (dans notre cas agrave lexeacutecut ion) Un exemple serait le

64

symbole daddition Bien que sa grammaire soit tregraves claire il peut sagir dune addition

de nombres mais aussi dune addition de points ou dune concateacutenation de chaicircnes

de caractegraveres Il est donc neacutecessaire agrave lexeacutecution de veacuterifier la classe de chaque objet

requis par lopeacuteration afin de trouver la bonne seacutemantique pour lopeacuteration si une

telle seacutemantique existe Si aucune nest trouveacutee on peut alors soulever une erreur

selon le meacutecanisme standard (par exemple additionner un point et une chaicircne de

caractegraveres)

- Certaines expressions grammaticalement correctes ne sont valides que sous certaines

conditions Par exemple nimporte quelle expression (exp) est accepteacutee comme eacutetant

une instruction (stm) grammaticalement valide Par exemple linstruction 2 + 2 va

ecirctre accepteacutee par la grammaire Par contre elle na pas de sens car elle naccomplit rien

du tout Il faut donc sassurer de veacuterifier dans la traverseacutee que lexeacutecution est leacutegale

Dans ce cas-ci il faut sassurer que lexpression de niveau supeacuterieur (une addition)

est valide pour ecirctre une instruction Dans un tel cas une erreur serait souleveacutee encore

selon le meacutecanisme standard

522 Deacutefinition dobjets quelconques

Une partie moins grande du code est consacreacutee agrave linteacutegration de la hieacuterarchie de SDDL

dans la deacutefinition du langage Comme nous souhaitions utiliser des classes quelconques

nous avons utiliseacute la reacuteflexiviteacute Java telle que nous le deacutecrivions plus tocirct Cela implique

de reacutecupeacuterer les noms des fonctions et des classes lors de leurs utilisations Toutes les

veacuterifications seffectuent agrave lexeacutecution Nous savons donc seulement si une classe A existe

bel et bien lorsque nous essayons de creacuteer un objet agrave partir de celle-ci De plus chaque

fonction appeleacutee sur un objet de classe A nest veacuterifieacutee que lors de son utilisation

Habituellement la solution aurait eacuteteacute de veacuterifier avant lexeacutecution lexistence de chaque

classe ainsi que les fonctions de chaque classe pour sassurer que lexeacutecution soit correcte

Dans notre cas la veacuterification agrave lexeacutecution est suffisante car les programmes sont tregraves

courts

De plus quelques contraintes ont ducirc ecirctre ajouteacutees afin de sassurer Clue seules les parties

65

Override public void caseADrawingTermCADrawingTerm node)

String className = nodegetClassName() getText()

try

thiscurrentExpressionClass ClassforName(sddlhierarchy + className)

thiscurrentExpressionValue = thiscurrentExpressionClassgetConstructor() newlnstance()

catch(NoSuchMethodException e)

throw new InterpreterException( cl ass Il + className + is ill-defined (no base constructor) nodegetClassName())

catch(Exception e)

throw new InterpreterException(unable to load + className +

Il class (maybe it does not exist) nodegetClassName())

Figure 53 Code reacuteflexif pour creacuteer une forme quelconque

requises de Java sont exposeacutees agrave lutilisateur final La restriction principale est de ne

creacuteer que des objets qui font partie du paquet sddl hierarchy Il est toutefois agrave

noter que cela nisole pas totalement le reste de Java car il est tout agrave fait possible de

creacuteer une classe qui permet dacceacuteder agrave Java complegravetement

523 Gestion des erreurs

La gestion des erreurs seffectue au travers des meacutecanismes deacutejagrave mis en place par Java

cest-agrave-dire les exceptions Une classe speacutecifique aux exceptions de linterpreacuteteur a eacuteteacute

creacuteeacutee qui permet de speacutecifier non seulement un message mais aussi un noeud bien

speacutecifique dans larbre grammatical afin didentifier lendroit ougrave lerreur a eacuteteacute deacutecouverte

66

Cela est extrecircmement utile afin de permettre agrave lutilisateur de corriger la majoriteacute de

ses erreurs

De plus une partie du code de gestion derreurs sert agrave repreacutesenter la pile dexeacutecution

En effet afin didentifier la source dun problegraveme il est important de pouvoir savoir

quelles fonctions sont impliqueacutees Nous pouvons donc identifier la ligne de chaque appel

au moment ougrave lerreur sest produite et ainsi identifier des problegravemes entre autres dans

le cas des fonctions reacutecursives

524 Structures de support

Dimportances mineures la plupart de ces structures servent agrave geacuterer lexeacutecution des

meacutethodes

- La classe Frame repreacutesente le cadre dexeacutecution dune fonction Cette classe permet

dobtenir des fonctions reacutecursives car on peut imbriquer un Frame dans un autre

- La classe Methodlnfo repreacutesente une fonction deacutefinie agrave linteacuterieur de SDDL Elle

permet de transfeacuterer lexeacutecution agrave la deacutefinition fournie par lutilisateur et regroupe

les informations geacuteneacuteralement utiles agrave la veacuterification seacutemantique (nom paramegravetres

etc)

- La classe PrimitiveMethodlnfo repreacutesente une fonction de Java accessible par la

reacuteflexiviteacute Elle fournit aussi quelques informations pour la veacuterification seacutemantique

- La classe MethodTable fournit une table pour geacuterer lensemble des fonctions afin

dacceacuteder directement agrave une fonction agrave partir de son nom

53 Accegraves agrave Postscript PDP et B-1EX

531 Postscript

Afin de reacutealiser correctement notre langage nous avions besoin dacceacuteder agrave diffeacuterentes

technologies Eacutetant donneacute que nous voulons terminer avec des dessins en format Postshy

script il devient important de pouvoir fournir aiseacutement du code dans ce format Il

67

sagit toutefois dun format relativement complexe et il devient donc long et complexe

de fournir une traduction valide pour chacun de nos diffeacuterents concepts

Le problegraveme principal de Postscript est quil possegravede un ensemble de primitives de tregraves

bas niveau En effet afin de dessiner une courbe la seule meacutethode possible est lutishy

lisation de courbes de Beacutezier avec des points de controcircle qui doivent ecirctre fournis agrave

lavance Comme nous lavons vu preacuteceacutedemment les courbes de Beacutezier sont tregraves prashy

tiques pour lordinateur mais peu pratique pour [utilisateur car la speacutecification de

points de controcircles qui ne sont pas interpoleacutes est peu intuitive De plus afin de faire

des courbes quelconques il faut les seacuteparer en plusieurs courbes de Beacutezier de tailles

infeacuterieures

Il existe des algorithmes qui permettent de prendre des courbes et de les seacuteparer en

sections adeacutequates Un de ces algorithmes est impleacutementeacute en Asymptote (Bowman

2007) Il est donc naturel afin deacuteviter davoir agrave reacuteimpleacutementer un algorithme aussi

complexe dutiliser Asymptote pour obtenir nos courbes de faccedilon systeacutematique

532 PDF

Le format PDF possegravede lavantage dinteacutegrer plusieurs fonctions multimeacutedias telles que

les liens les videacuteos les formulaires (Adobe Systems Incorporated 2006) etc Malgreacute

tout PDF outre les quelques ajouts nommeacutes ci-haut est essentiellement similaire agrave

Postscript Eacutevidemment les nombreuses possibiliteacutes fournies par le format PDF sont

deacutesirables (inteacutegrer des videacuteos agrave des notes de cours par exemple) Il existe toutefois

de nombreux convertisseurs qui peuvent prendre un fichier Postscript et le mettre au

format PDF Par contre cette conversion ne permet pas dajouter les fonctionnaliteacutes

PDF qui nous inteacuteressent Il devient donc crucial dobtenir une meacutethode pour fournir

des images directement au format PDF Encore lagrave le fait de passer par Asymptote

nous donne une solution rapide et eacuteleacutegante car le fait de fournir du PDF est inclus

dans le logiciel En geacuteneacuterant directement du Asymptote nous pourrions donc obtenir

automatiquement le format rechercheacute

68

533 ~1lE)C

Leacuteleacutement le plus crucial du langage que nous recherchions au deacutebut eacutetait de pouvoir

utiliser du texte tel que mis en forme par UTEX dans nos diagrammes Un tel besoin

implique plusieurs problegravemes

Premiegraverement un texte UTEX est conserveacute sous la forme dune chaicircne de caractegraveres

standard Par contre apregraves avoir eacuteteacute traiteacute le reacutesultat obtenu est une boicircte contenant

le texte mis en forme La taille de cette boicircte est deacutetermineacutee lors de la mise en page

et ne peut donc pas ecirctre deacutetermineacutee directement par notre programme Or si nous ne

connaissons pas la taille exacte de notre boicircte de texte il est impossible de positionner

un texte par une position autre que son coin supeacuterieur gauche Cela est un comportement

peu inteacuteressant eacutetant donneacute que dans de nombreux graphes on place le texte au centre

dun sommet (donc par exemple le centre de la boicircte sera placeacute au centre dune ellipse)

Afin de pallier agrave ce problegraveme il faudrait demander agrave UTEX de creacuteer les boicirctes une

premiegravere fois et de nous fournir les tailles des boicirctes Par la suite il faudrait geacuteneacuterer

une page UTEX de la bonne taille avec nos dessins puis dire agrave UIEX de geacuteneacuterer les

boicirctes de textes aux endroits que nous aurons calculeacute entre temps Bien que viable

cette meacutethode implique beaucoup de code et de cas diffeacuterents (laccegraves agrave IbIEX par un

programme externe va varier dun systegraveme dexploitation agrave lautre entre autres) Eacutetant

donneacute quAsymptote fournit deacutejagrave un accegraves agrave I5IEX agrave linteacuterieur du logiciel le travail

requis pour lutilisation de I5TEX est de beaucoup diminueacute

534 Geacuteneacuteration du code Asymptote

Afin davoir une solution valide il ne reste donc pl s quagrave nnecter not e so ution agrave

Asymptote Pour le faire nous devons premiegraverement geacuteneacuterer un fichier de code Asympshy

tote valide pour par la suite le faire valider en appelant le programme de maniegravere

externe Eacutetant donneacute que le projet a eacuteteacute eacutecrit speacutecifiquement pour fournir du code

Asymptote une solution simple a eacuteteacute utiliseacutee afin deacutecrire le code le canevas principal

69

public void draw(AbstractPoint location PrintWriter out)

AbstractPoint pl locationadd(new Point (radius 00)) AbstractPoint p2 locationadd(new Point(OO radius)) AbstractPoint p3 locationadd(new Pointe-radius 00)) AbstractPoint p4 locationadd(new Point(OO -radius))

outprintln(draw( + p1so1veO + + p2solveO + + p3solveO + + p4solveO + cycle))

Figure 54 Code pour geacuteneacuterer du code Asymptote pour un cercle

sera appeleacute agrave ecirctre dessineacute qui appellera reacutecursivement chacun de ses sous-canevas

La geacuteneacuteration du code Asymptote a eacuteteacute reacuteserveacutee dans une fonction draw speacutecifique agrave

chaque forme (Shape) qui eacutecrit dans un fichier ouvert fourni en paramegravetre Un exemple

dune telle meacutethode pour la classe Circle est illustreacute agrave la figure 54

Une telle meacutethode est simple mais suffisante pour nos besoins Bien sucircr agrave long terme

une solution plus robuste devrait simposer En effet comme leacutecriture du fichier est

faite directement lors de lexeacutecution les objets doivent ecirctre appeleacutes exactement dans

lordre dont ils sont deacutependants Par exemple un segment dessineacute entre deux cercles

doit ecirctre dessineacute apregraves les cercles car sinon les reacutefeacuterences seront absentes Dans ce cas-ci

le segment va toujours ecirctre deacutefinie par la suite Par contre si nous voulions rajouter

la possibiliteacute dutiliser des extensions dAsymptote cela impliquerait de les eacutecrire au

deacutebut du fichier Il est impossible de le faire avec cette solution

Une solution plus robuste serait dutiliser un outil lieacute agrave SabieCC qui est ObjectMacro

(Gagnon 2009) Cette extension nous permet de simplifier la geacuteneacuteration de code et

deacutecrire agrave des endroits arbitraires dans un fichier agrave laide de macros et de programmation

objet Cela nous permettrait aussi deacutetendre la geacuteneacuteration de code agrave plusieurs formats

diffeacuterents par exemple geacuteneacuterer directement du code PDF au lieu de geacuteneacuterer du code

70

Asymptote

61

CHAPITRE VI

REacuteALISATION DES DIAGRAMMES EN SDDL

Maintenant que nous avons notre programme complet et fonctionnel il faut veacuterifier son

efficaciteacute Nous proceacutedons en deux temps Premiegraverement il faut revenir agrave nos dessins

de base et les coder avec notre logiciel Par la suite il faut aussi les analyser en fonction

des diffeacuterents facteurs cruciaux que nous avons eacutenumeacutereacutes dans les chapitres preacuteceacutedents

Nous pourrons donc agrave partir de cela conclure si le logiciel savegravere efficace pour nos

besoins ou si certains problegravemes lempecircchent de fonctionner adeacutequatement

Naturellement nous avons pris le temps dappliquer cette analyse agrave chacun des dessins

dans notre base de diagrammes du domaine Par manque despace nous nanalyserons

dans ce chapitre que trois dessins Une attention particuliegravere a eacuteteacute porteacutee au choix de

ces dessins afin de repreacutesenter un eacuteventail assez large des capaciteacutes du logiciel et des

diffeacuterents eacuteleacutements cruciaux agrave obtenir dans la description dun diagramme Tous les

diagrammes sont disponibles en annexe avec code sans analyse deacutetailleacutee toutefois

Analyse du code des diagrammes existants

Pour faire notre analyse nous devons premiegraverement obtenir chaque dessin Dans ce cas

nous utiliserons un diagramme tireacute du domaine de la compilation Cela nous fournit un

graphe relativement standard avec un niveau de complexiteacute inteacuteressant sans toutefois

ecirctre trop complexe Par la suite nOlis analyserons un diagramme repreacutesentant une strucshy

ture de tableau Cela montre la capaciteacute du logiciel de travailler avec des structures de

72

donneacutees geacuteneacuterales Finalement nous effectuerons lanalyse dun diagramme de Venn qui

nest a priori pas supporteacute par le logiciel afin de voir la complexiteacute dun diagramme

totalement geacuteneacuteral et qui sort des conventions preacute-eacutetablies par le logiciel

611 Rappel des objectifs cruciaux agrave observer

Naturellement afin de faire une analyse rationnelle de notre solution il faut se remeacuteshy

morer les diffeacuterents objectifs que nous nous eacutetions fixeacutes Les plus importants eacutetaient les

suivants

- Inteacutegration avec Jb1EX Eacutetant donneacute le design de notre solution ce point est naturelshy

lement reacutealiseacute dans tous les diagrammes

- Description de structures Il nous faut pouvoir deacutecrire une structure de maniegravere aiseacutee

Le fait decirctre aiseacute est naturellement subjectif mais nous pouvons ramener le tout au

fait quil soit plus simple de deacutecrire dans notre logiciel Wle structure que dutiliser les

primitives de base du langage Par exemple il est plus aiseacute de deacutecrire une structure

en parlant de boicirctes et de liens quen parlant de lignes et de courbes

- Hieacuterarchie solide et extensible Nous ne testerons pas lextensibiliteacute de la solution car

elle a deacutejagrave eacuteteacute deacutemontreacutee Toutefois les diffeacuterents codes nous permettront danalyser

agrave quel point nous utilisons la hieacuterarchie que nous avons construite et agrave quel point elle

est reacuteellement pratique

Nous avions aussi dautres objectifs de moindre importance

- Gestion des erreurs Il nest pas possible avec du code compleacuteteacute de tester la gestion des

erreurs Lauteur peut toutefois garantir que sans la gestion des erreurs une grande

quantiteacute de temps aurait eacuteteacute perdu dans la reacutedaction du code des diagrammes et ce

malgreacute la connaissance profonde du langage sous-jacent

- Langage fluide et clair Cela peut ecirctre testeacute par le lecteur en regardant le code Si

une analyse rapide lui permet de comprendre le sens du code alors celui-ci est clair

Naturellement lauteur ne peut effectuer cette analyse par lui-mecircme Bien que nous

ne puissions en faire une analyse scientifique en inspectant le code reacutesultant nous

73

sommes confiants que la syntaxe que nous avons choisie est claire et permet dexprimer

clairement les concepts sous-jacents au langage

- Qualiteacute de la documentation et courbe dapprentissage Il sagit ici dun autre eacuteleacutement

que nous pouvons difficilement aborder par nous-mecircmes Cela ne sera pas pris en

compte dans notre analyse

Selon ces diffeacuterents facteurs nous voyons que nous devrons surtout nous concentrer sur

la structure geacuteneacuterale du code ainsi que sur sa complexiteacute Le code doit ecirctre facile agrave

lire tout en permettant de compacter un maximum dinformation dans un minimum

despace

612 Diagramme de compilation

Notre premier dessin est tireacute dun livre de compilation Il sagit dun automate assez

standard et repreacutesente donc un bon diagramme moyen afin de voir les capaciteacutes de

notre logiciel

Figure 61 Diagramme dautomate de compilation

Quelques points importants sont agrave noter dans ce dessin Premiegraverement on note la

creacuteation dune structure sous-jacente (composeacutee dune ellipse et deux cercles) Par la

74

circlel Circle with [radius = 100] circle2 Circ le with [radius = 120] ellipse Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (1000 500) in main d3 put form at (1000 -500) in main put Text with [text $N(p_l)$] at (1000 1000) in main put Text with [text $N(p_2)$] at (1000 500) in main put Text with [text dotsJ at (100000) in main put Text with [text I$N(p_n)$J at (1000 -500) in main

put Text with [text = $s_O$J at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt(coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt(coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt(coord of anglePoint(1800) in maind3circle)

Figure 62 Code pour le diagramme dautomate

suite cette forme est appliqueacutee agrave plusieurs reprises dans le dessin Cela deacutemontre que

dans ce cas-ci il est possible de creacuteer et dutiliser des structures dun certain degreacute de

complexiteacute

On note aussi lutilisation des variables pour reacutecupeacuterer les dessins afin de pouvoir les

reacutefeacuterencer plus tard Cette eacutetape est aussi simple que lassignation agrave une variable Par

la suite on peut noter les flegraveches qui sont traceacutees agrave partir de points deacutefinis agrave partir de

certains cercles La structure mecircme est extrecircmement explicite dans ce cas et rend la

compreacutehension du dessin tregraves simple On reacutecupegravere aussi finalement les points formeacutes agrave

un certain angle dun cercle

75

La complexiteacute du diagramme est beaucoup plus simple quelle ne le serait avec des

primitives de base En effet les seuls dessins explicites que nous devons effectuer par

points sont les flegraveches De plus ces flegraveches sont relativement simples puisque nous navons

rien agrave speacutecifier pour le bout de flegraveche seulement les extreacutemiteacutes Pour le reste les formes

sont soient deacutefinies agrave partir de notre hieacuterarchie (comme les cercles ou les ellipses) ou

bien par un collage de formes plus simples (comme pour la forme form) Les points sont

obtenus par des accegraves structureacutes et fournissent donc des valeurs exactes rendant ces

opeacuterations extrecircmement rapides agrave eacutecrire pour lusager

On note toutefois quil existe certains eacuteleacutements dans le code qui auraient pu ecirctre simshy

plifieacutes afin de rendre le code encore plus compact En effet nous remarquons la preacutesence

de beaucoup de valeurs explicites alors quil aurait eacuteteacute possible de les remplacer par des

variables afin de rendre le tout plus clair

Un eacuteleacutement qui aurait pu amener une touche de simplification aurait eacuteteacute dutiliser des

listes ou des boucles afin dinseacuterer plus aiseacutement les objets Par exemple la structure

complexe aurait pu ecirctre ajouteacutee plusieurs fois par une boucle for avec des positions

calculeacutees en fonction de lindex Nous sommes toutefois davis que malgreacute lameacutelioration

possible que cela fournit au code il est peu probable que les utilisateurs finaux prennent

le temps de faire ce genre de modification et utiliseront fort probablement plus des

positions relatives avec une seacuterie dappels sauf si le nombre dobjets agrave positionner

devenait grand (par exemple une dizaine dobjets)

En geacuteneacuteral nous pouvons toutefois consideacuterer que ce diagramme est simplifieacute de beaushy

coup par lutilisation de notre solution La grande part du code est explicite et la strucshy

ture est tregraves simple agrave observer en regardant uniquement le code Mecircme si tout nest pas

parfait il y a clairement avantage agrave utiliser le logiciel pour coder cet automate

613 Diagramme de tableau

Notre second dessin est tireacute dun livre sur les structures de donneacutees Il repreacutesente

leacutevolution dune structure de donneacutee simple (un tableau) agrave travers certaines modifishy

76

cations

a ab 1 0 2 8 (lime

1 -10

3 7

iuml

Figure 63 Diagramme de tableau

Un des points les plus inteacuteressants de ce dessin est lutilisation dune fonction Elle place

une forme dans un canevas agrave plusieurs endroits speacutecifiques en fonction dune position de

deacutepart et dun vecteur de translation Cela nous permet de placer une forme identique

(un carreacute) plusieurs fois de suite ce qui nous donne limpression quil sagit en reacutealiteacute

dun tableau

Un autre point qui est tregraves important dans ce dessin est que les nombreux carreacutes sont

en fait tous des instances du mecircme deacutefini au deacutebut Cela permet de modifier lensemble

des carreacutes aiseacutement en ne modifiant que les proprieacuteteacutes de celui de base Pour le reste du

dessin il sagit surtout dun ensemble de flegraveches et de textes positionneacutes agrave des endroits

speacutecifiques

En analysant le code on voit une ameacutelioration claire provoqueacutee par le fait dutilishy

ser une fonction pour placer les carreacutes Cela nous permet de simplifier de beaucoup

les appels et les reacutepeacutetitions Nous pouvons toutefois noter que quelques ameacuteliorations

suppleacutementaires pourraient ecirctre apporteacutees En effet une classe aurait pu ecirctre eacutecrite en

Java pour repreacutesenter un tableau agrave lhorizontale ou agrave la verticale Cela aurait pu simshy

plifier significativement le code du dessin en combinant dans la structure le texte et

les carreacutes utiliseacutes pour repreacutesenter le tableau lui-mecircme De plus les flegraveches auraient pu

ecirctre deacutetermineacutees agrave partir de points obtenus du tableau lui-mecircme (par exemple le coin

supeacuterieur droit ou supeacuterieur gauche) auxquels nous aurions ajouteacute un vecentierteur de

deacuteplacement

77

fun dropMany(f n s v c) for i from 1 to n do

put f at (s + (i - 1) v) in c end

square = Square with [length = 200] changeVec = (00 -200) dropMany (square 4 (00 00) changeVec main)

dropMany(square 3 (500 00) changeVec main) dropMany(square 1 (1000 00) changeVec main)

dropMany (square 1 (1500 00) changeVec main) put Text with [text=O] at (00 00) in main

put Text with [text=l] at (00 -200) in main put Text with [text=3] at (00 -400) in main

put Text with [text=7] at (00 -600) in main put Text with [text=bf a] at (500200) in main put Text with [text=2] at (500 00) in main

put Text with [text=4] at (500 -200) in main put Text with [text=7] at (500 -400) in main

put Text with [text=7] at 0000 00) in main put Text with [text=bf $a-b-+$] at 0500 200) in main

put Text with [text=8] at 0500 00) in main put Text with [text=none] at (2000 00) in main

020 100)-gt(380 100) (620 100)-gt(880 100)

(1120 100)-gt0380100) 0620 100)-gt0880100)

Figure 64 Code pour le diagramme de tableau

Avec ces changements le code aurait pu ecirctre beaucoup plus compact Bien que cette

option soit reacutealisable nous ne lavons pas impleacutementeacutee car il eacutetait important de limiter

ce quun usager peut creacuteer sans lutilisation de Java Cela est ducirc au fait que notre objectif

est que seulles utilisateurs experts se servent de Java afin dameacuteliorer le logiciel Le code

est tout de mecircme significativement meilleur que de placer tout agrave la main ce qui nous

permet de conclure agrave lefficaciteacute de notre logiciel dans le cas dune structure geacuteneacuterale

78

614 Diagramme de Venn

Notre dernier dessin est une structure qui ressemble beaucoup plus agrave un dessin geacuteneacuteral

cest-agrave-dire un diagramme de Venn La forme dun tel diagramme fait quil est extrecircmeshy

ment complexe deacutecrire une classe qui permet de dessiner automatiquement ce type de

structure et quil vaut mieux creacuteer les formes une par une comme on le ferait agrave la main

Cela nous permettra danalyser si les choses simples agrave dessiner agrave la main demeurent

facile agrave reacutealiser avec notre logiciel

A

Figure 65 Diagramme de Venn

Ce dessin ne possegravede pas beaucoup de grands points dinteacuterecirct En effet la structure ne

peut pas vraiment ecirctre geacuteneacutereacutee automatiquement par un algorithme alors elle est entreacutee

manuellement On remarque tout de mecircme lutilisation de plusieurs sous-canevas afin

de simplifier le placement des objets qui sont agrave linteacuterieur dautres

Naturellement eacutetant donneacute que la structure doit ecirctre deacutecrite manuellement le code

nest pas plus court que lutilisation de primitives de base Par contre cela est comshy

penseacute par un niveau de clarteacute supeacuterieur eacutetant donneacute lutilisation des canevas afin de

regrouper les eacuteleacutements dans des ensembles respectifs Cfla permet de positionner tous

les eacuteleacutements en valeurs relatives au lieu dabsolues ce qui simplifie de beaucoup le travail

de positionnement

De plus le fait de pouvoir stocker les eacuteleacutements dans des variables nous permet de les

identifier par diffeacuterents noms significatifs ce que des primitives de base comme celles

79

circle = Circle with [radius = 100] bigcircle = Circ le with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvas1 put circle at 050 150) in canvas1 put Text with [text = H] at 050 150) in canvas1 put circle at (-150 150) in canvas1 put Text with [text J] at (-150 150) in canvas1 put Text with [text = B] at (00 -150) in canvas1

put bigcircle in canvas2 put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = F] at 050 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = E] ac (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvas1 at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = A] at (00 -300) in main put bigellipse in main

Figure 66 Code du diagramme de Venn

de PDF ne nous permet pas de faiTe Nous pouvons donc en conclure que mecircme pour

les structures difficiles agrave repreacutesenter notre logiciel fournit tout de mecircme un nombre

significatif davantages

Preacutesentation du produit final

Une fois que nous avons pu confirmer que notre logiciel eacutetait efficace il ne restait plus

quagrave le faire connaicirctre Nous preacutesentons donc ici un reacutesumeacute des efforts qui ont eacuteteacute

effectueacutes afin damener le logiciel agrave la connaissance de la communauteacute gIEX

62

80

621 Statistiques et documentation

En premier lieu avant de pouvoir preacutesenter notre solution il nous fallait la documenter

correctement En effet leffort de deacuteveloppement nous aura permis de deacutevelopper un

produit de tregraves grande taille La taille totale du travail se limite agrave environ 10 megs mais

cela implique plus de 6300 lignes de code deacuteveloppeacutees speacutecifiquement pour le projet

(cela incluant les commentaires mais excluant tout le code geacuteneacutereacute par SableCC qui est

tregraves exhaustif) Avec une taille aussi significative il est tout simplement impensable de

sattendre agrave ce quun utilisateur analyse le code afin de trouver ce qui va reacutepondre agrave ses

besoins

Pour cela nous avons pris le temps de reacutediger une documentation interne Elle consiste agrave

documenter chaque classe de notre hieacuterarchie ainsi que chaque fonction disponibles Cela

fournit des renseignements complets pour quelquun qui cherche un eacuteleacutement speacutecifique

du langage

622 Preacutesentation

Par la suite nous avons reacutedigeacute une preacutesentation pour la confeacuterence TUG 2010 que nous

avons preacutesenteacutee le 28 juin 2010 agrave San Francisco devant des membres tregraves influents de

la communauteacute JbTEX dont Donald Knuth le creacuteateur original de TEX La confeacuterence

nous a permis de nous mettre au pouls des besoins de la communauteacute et de linteacuterecirct

quils portent agrave un tel projet La reacuteponse se voulait enthousiaste particuliegraverement de

la part du preacutesentateur dAsymptote John Bowman La confeacuterence est disponible sur

le site de River Valley (Bourgeois 2010) (malheureusement sans videacuteo eacutetant donneacute un

problegraveme dopeacutemt ur)

Bien quil sagisse dun eacuteleacutement tregraves important dans la preacutesentation dun projet une

confeacuterence ne rejoint pas beaucoup de monde Pour combler ce besoin nous avons aussi

reacutedigeacute un article pour la revue TUGBoat (Bourgeois et Villemaire 2010a) qui est la

revue principale de la communauteacute JbTEX Nous avons inclus larticle en annexe Cela

81

nous a permis de rejoindre un public beaucoup plus grand quune simple preacutesentation

devant public

623 Site web

Finalement afin de faciliter la distribution de notre logiciel nous avons deacuteveloppeacute un site

web (Bourgeois et Villemaire 2uuml1uumlb) pour accompagner la preacutesentation et permettre le

teacuteleacutechargement Le site contient aussi toute notre documentation ainsi que les contenus

des preacutesentations et articles que nous avons mentionneacutes plus haut Nous avons aussi pris

le temps de fournir quelques exemples suppleacutementaires afin de montrer lattrait direct

de SDDL

63 Conclusion de notre analyse

Nous concluons que notre solution est efficace et quelle respecte agrave diffeacuterents niveaux

les critegraveres que nous nous eacutetions fixeacutes au deacutepart Il sagit dune hieacuterarchie dobjets facile

et extensible accompagneacutee dune syntaxe claire et fluide Avec lajout de la gestion des

erreurs et sa capaciteacute agrave deacutecrire plusieurs formes de structures notre logiciel permet de

simplifier la repreacutesentation des diagrammes classiques du domaine Nous en venons donc

agrave la conclusion que notre solution respecte les diffeacuterents critegraveres et nous pouvons donc

consideacuterer notre solution comme eacutetant valide

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

CONCLUSIOK

La creacuteation de diagrammes structureacutes comme nous avons pu le constater tout au long

de ce meacutemoire est un sujet tregraves complexe Bien quil puisse de prime abord necirctre vu

que comme la capaciteacute de faire des petits dessins simples nous remarquons rapidement

que les deacutecrire tels que nous les voyons est beaucoup plus difficile quil y parait

Entre autres nous avons pu constater que les diagrammes sont penseacutes de maniegravere

extrecircmement abstraites En effet dans un arbre nous ne voyons pas une seacuterie de somshy

mets relieacutes par des points mais bel et bien un arbre seulement Cette capaciteacute agrave abstraire

la forme du contenu est extrecircmement pratique pour un ecirctre humain mais pas tregraves utile

pour un ordinateur Il est extrecircmement difficile dessayer de saffranchir du besoin de

speacutecifier la forme lorsquon veut creacuteer un diagramme

Il en est de mecircme avec IbTEX duquel nous nous sommes inspireacute Bien que le logiciel

puisse faire la forme de maniegravere adeacutequate dans plusieurs cas ces derniers savegraverent tregraves

speacutecifiques et plus souvent quautrement la possibiliteacute dobtenir un niveau accru de

controcircle sur la forme est souhaitable Dautre part la question du positionnement dun

texte scientifique dans une page a eacuteteacute abondamment eacutetudieacute (entre autre par la creacuteation

de TEX) alors que le bon positionnement dun diagramme la eacuteteacute beaucoup moins Il

est donc probleacutematique de se deacutebarrasser de cet eacuteleacutement de forme dans nimporte quel

logiciel de creacuteation de diagrammes

Cela nous amegravene donc agrave la question naturelle de savoir si notre logiciel savegravere une solushy

tion valide agrave notre probleacutematique initiale En effet bien que notre analyse deacutemontre que

la creacuteation de dessins devient plus simple nous ne pouvons affirmer que nous eacutecrivons

ce que nous pensons du diagramme

- -

84

Or comme la question est de veacuterifier la validiteacute de notre solution nous reacutepondrons par

laffirmative Mecircme si elle nest pas parfaite un degreacute de complexiteacute se trouve eacutelimineacute

malgreacute tout Il est tout de mecircme possible pour un utilisateur de penser en des termes plus

abstraits mecircme sil ne sagit pas du niveau dabstraction optimal De plus eacutetant donneacute

que nous avons creacuteeacute notre solution pour ecirctre extensible il est possible daugmenter le

niveau dabstraction avec la contribution de la communauteacute Bien que la solution ne soit

pas parfaite et aurait pu jouir dameacuteliorations subseacutequentes lobjectif principal eacutetait de

deacutevelopper un langage qui simplifiait la description de diagrammes structureacutes et cela

fut atteint

Naturellement eacutetant donneacute les limites de temps et de complexiteacute plusieurs pistes de

deacuteveloppements suppleacutementaires nont pu ecirctre utiliseacutees En effet nous nous sommes

limiteacutes agrave la description dune image statique Il est toutefois tregraves utile de pouvoir creacuteer

des images dynamiques La possibiliteacute de creacuteer des seacutequences de mouvements agrave linteacuterieur

dun diagramme aurait pu rendre notre outil plus inteacuteressant De plus lUl outil de

geacuteneacuteration automatique de graphes ou darbres mecircme imparfait pourrait fournir des

choix suppleacutementaires agrave un utilisateur qui souhaite obtenir un reacutesultat rapidement sans

toutefois rechercher un reacutesultat parfait

Il est toutefois bon de noter que bien quil soit long et complexe deffectuer de tels

ajouts notre logiciel a eacuteteacute penseacute en fonction de pouvoir ecirctre eacutetendu par lutilisateur Il

est donc tout agrave fait possible de pouvoir eacuteventuellement fournir de telles fonctionnaliteacutes

dans une version future du programme Dici lagrave celui-ci suffira amplement agrave la creacuteation

de diagrammes simples

APPENDICE A

PREacuteSENTATION DU PROJET POUR LE TEX USERS GROUP

Nous incluons ici larticle complet que nous avons reacutedigeacute agrave propos de notre logiciel

afin den faire la promotion aupregraves de la communauteacute TEX et JbTEX Cet article qui fut

preacutesenteacute dans Tugboat la revue du TEX Users Group tel que mentionneacute preacuteceacutedemment

compleacutemente la preacutesentation qui fut effectueacutee lors de la confeacuterence du mecircme groupe

agrave San Francisco Larticle est essentiellement une introduction pragmatique pour un

utilisateur final et fournit donc plusieurs exemples inteacuteressants dutilisation tout en

deacutecrivant briegravevement les diffeacuterents concepts importants qui ont meneacutes le deacuteveloppement

de SDDL Il sagit de la version finale tel que Jarticle apparait dans le numeacutero de Tugboat

206

Drawing structured diagrams with SDDL

Mathieu Bourgeois and Roger Villemaire

Abstract

We present SOOL a Structured Diagram Description Language aimed at producing graphical representashytions for discrete mathematics and computer science SDDL allows combining graphical objects (circles lines arrows ) and lbTEX boxes to produce diashygrams representing discrete structures such as graphs trees etc with an easy-to-use domain specific lanshyguage

1 What is SDDL

SDDL Structured Diagram Description Language is a high-level domain specific language tailored for diagrams that have an inherent structure Examples of these might be trees graphs and automata Any diagram that is naturally structured can be described in SDOL However it was designed especially for data structures appearing in computer science and discrete mathematics

The main objective of this language is to realize drawings in a natural and structured way Mainly one describes a drawing in SOOL in a way that is simishylar to drawing on a blackboard For example specific shapes (like circles ellipses texts boxes) are drawn at positions that can be either absolute or relative to specific points on already placed shapes Since we aim at mathematical drawings text is handled through lbTEX

Since exhibiting the structure of a diagram is esshysential to our purpose SOOL uses an object-oriented hierarchy completely written in Java under our high-levellanguage Having shapes as objects makes structuring of diagrams easier and more intuitive since most shapes are explicitly represented by a class Furthermore extension by the end user is quite feasible since Java is a well-known language

At the lower level SDDL uses another graphishycal description language for lbTEX namely Asympshytote [1] Our tool produces Asymptote code which is finally converted to an encapsulated PostScript (eps) vector file

2 Canvas and shapes

A diagram in SDDL is defined by a main Canvas It is just like a standard painting canvas in the sense that we can place (or paint) different things on it as much as we like The things we can place inside a Canvas are Shapes Thus for creating a Hello world diagram we would use the following

put Text with [text = Hello worldJ in main

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

resulting in

Hello world

In this example Text is a Shape and it posshysesses a property text which is the JbTEX string used to render the text Each Shape defines a cershytain number of such properties

SDDL permits the definition of variables It is a dynamically typed language so variables dont have to be declared before being used Variables make it possible to reuse the same Shape at multiple locations For example

a = Circle with [radius = 100] put a at (-75 00) in main put a at (75 00) in main

m In this example we specify the location where we want our Shape to be If a location is not specified with the at clause the Shape will be placed at the point of origin of the current Canvas which is its center

One important thing to note is that once a Shape has been put in a Canvas it is immutable It cannot be modified or removed A Shape can be modified alter it has been drawn on a Canvas but this will have an effect only on later use of this object and will not modify the actual Canvas in any way a Shape always appears in a Canvas as it was at the moment it was added

When a Shape is created every property specishyfied by the user is set in the given order It is not necessary to specify ail properties at once nor to set ail of them Most of the properties have appropriate default values However sorne properties if not set will yield strange results For example a circle with no radius property set will have a defaul radius of O Usually property order is irrelevant For instance giving for an ellipse the radius along the x-axis or the y-axis first will yield exactly the saille result

a = Ellipse a = a with [xradius 200] a = a with [yradius 100] put a in main

o 3 Structuring multiple canvases

Every diagram consists of a main Canvas However we can define other Canvas objects if we wish An additional Canvas can be introduced using a typical variable assignment However when a put command is used SODL checks to see if the canvas variable is

4

207 TUGboat Volume 31 (2010) No 2

already defined If it isnt it automatically creates an empty Canvas for use

One of the main reasons to use other Canvases is to create an explicit structure in our diagram Since a Canvas is a Shape once a sub-Canvas has been created it can be placed inside the main Canvas or any other one for that matter This will ensure that everything that is defined inside our sub-Canvas will be placed at the proper position in the final diagram However any Canvas that has been defined but is not linked directly or indirectly with the main Canvas will not be drawn in the final diagram

As an example lets say we want to make a diagram that consists of two identical eyes Instead of defining two identical objects we will create one in a Canvas named form and put it at different positions inside our main Canvas Our eye consists of a circle and an ellipse both with the same center Ali we need to do for this is place them at the default position of the Canvas Finally we can take this subshyCanvas and place it at the two positions required a ~ Circle with [radius~100]

b ~ Ellipse with [xradius~200 yradius~100]

put a in form put b in form put form at (-200 00) in main put form at (200 00) in main

Paths

SDDL offers support for the description of paths The way in which they are described is similar in syntax with MetaPost and Asymptote though with sorne variations A Path shape is described by linking points together with specific linking symbols To draw a line between two points the line symbol - shycan be used To link sorne points using a curve use the curved line symbol - which will use Asymptotes positioning algorithms to create a nice-looking curve which passes through those points For the moment user control over the curve is limited to beginning and ending tangents but could be expanded

pl ~ a--b--c p2 ~ a-b-c

One of the other things you may want to do with a Path is to create an Arrow out of it SDDL defines symbols for forward backward and bidirectional arshyrows for both linear and curved lines Right now however support is restricted to forward arrows

pl ~ alt-b--c-gtd p2 alt-b-c-gtd p3 alt-gtb p4 aCgtb

Once a Path is defined it can be used as any other Shape However one of the main things that you want ta do is ta put your Path somewhere For this you can write something Iike this p ~ (00 00) -- (100 100) put p in main

This is the standard way to add Shapes ta a Canvas However since Paths are usually used to link different Shapes together in the main Canvas special handling is done in SDDL Namely a Path that is not explicitly assigned to a variable will be automatically placed in the main Canvas Therefore the Path will be directly placed in main without any explicit put expression Thus linking has its own special syntax which is more natural and convenient As an example this program (00 00) -- (100 100)

yields exactly the same result as the one just above Furthermore points can be added and multiplied by a scalar (as vectors) Using a dot to locate the origin of the drawing we can use the SDDL syntax ta create this example a ~ (100 100) a--20a-gt(300 00) a-(-10)a-(300 00)

ocirc Finally as we will now see Shapes also usually

define specifie points

5 Drawing and linking shapes together

Ta draw a diagram usually sorne shapes with a specific structure are first laid down Once that is done those objects are linked together with lines curves and arrows However these links must be made between specific positions usually derived from one or more specifie Shapes For example we may want to link the northwestern point of a rectangle with the point on a circle at an angle of 45 degrees These points could obviously be computed in advance However this becomes quite problematic when points are at peculiar angles or more complex relationships between points and Shapes are needed Worst of ail if the position or any other property of a Shape is changed ail computations will have to be redone

To ease object linking SDDL provides so-called reference points A reference point is a point that has no static value unlike points defined by a pair of two real numbers Instead a reference point is defined by its relationship to a specifie Shape appearing at a particular location As a matter of fact ail reference

Drawing structured diagrams with SDDL

208

points are defined along with the Shape because they are a natural part of it This ensures that we always have nice-looking lines at exactly the positions we want them to be

However a reference points exact position in a Canvas will depend on the Shapes position Worse since the same Shape can appears at multiple locashytions in the same Canvas we have to know which occurrence we are talking about

Therefore SDDL introcluces a feature called a Drawing A Drawing is an object that represents a Shape at a particular position Le a specifie occurshyrence of a Shape in a Canvas Whenever a Shape is put inside a Canvas a Drawing is returned and can be assigned to a variable This gives a way to uniquely identify every occurrence of a Shape apshypearing in a Canvas If the same Shape is placed twice two different Drawings will be returned each referring to a different occurrence of the same Shape

a = Circle with [radius = 100] dl = put a at (-100 00) in main d2 = put a at (100 00) in main

Once a drawing has been defined a way to access its points is needed SDDL defines a syntax for extracting points from drawings

coord of (coord) ( (args) ) in (drawing)

Here one specifies the kind of point to use (( coord) ) and any particular arguments required to obtain it The available points are Shape specifie so only those kinds of points which make sense for the particular Shape can be used For instance one can get a point at a particular angle on a Circle This is also an example where an additional argument is needed For instance anglePoint(450) will give the point at 45 degrees

Finally to reference the drawing from which we take the point its clrawing Path (a dot separatecl path) from the main diagram must be given

a = Circle with [radius = 100] dl = put a at (-75 00) in main d2 = put a at (75 00) in main (coord of anglePoint(OO) in maindl)

(coord of anglePoint(1800) in maind2)

m In this example a line between two identical circles is drawn The drawing Paths are simple here since both drawings are made directly in main Thus only main followed by the drawing name is needed

Simply giving a Drawing is not sufficient in order to make reference points non-ambiguous complete drawing Paths are required as we will now show Lets go back to the two eyes we drew previously

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

The eye was defined by a circle and an ellipse both put inside a sub-Canvas Now lets say we want to draw a line between the two circles Each of those circles is defined in the sub-Canvas and they are as a matter of fact the same Drawing a Adding a link between a and itself wauld add a link between the sub-Canvas circle and itself (what could this mean) Adding the sub-Canvas to the main Canvas twice as we did before would just duplicate this structure inside the main Canvas

But since a Canvas is a Shape we get a drawing when we put the sub-Canvas inside main We can therefore identify each inner circle by listing the drawings required to access them as shown in the following SDDL example Thus we can always link together Shapes that are deeply nested inside a subshyCanvas a = Circ le with [radius=100] b = Ellipse with [xradius=200 yradius=100] c = put a in form put b in form fl = put form at (-200 00) in main f2 = put form at (200 00) in main (coord of anglePoint(1800) in mainflc) -gt

(coord of anglePoint(OO) in mainf2c)

6 Programming constructs and lists

SDDL also defines typical programming constructs For instance Iists are created and elements accessed in a syntax similar to most other dynamic languages Since the content of a list is a general Java Dbject you can create a list of objects that are not of the same type Thus an assignment like l = [20 (00 00) [] a--b]

is perfectly legal even if not typically very useful A more typical use of Iists would be list = [(00 00) (100 100)] 1= list[O] 12 = list [1]

1--12

Lists are nice but to use them properly adeshyquate programming canstructs are needed such as for and while loops SODL defines those permitting us to draw arrays of Shapes or riAfine points through a simple list

The ability to use loops significantly simplifies many diagrams in computer science In this example we first define a Iist of points Afterward using a for loop we link those points into a linear Path a = [(100 100) (200 100)

(200 200) (100 200)] for i from 0 to 2 do

209 TUGboat Volume 31 (2010) No 2

a[i]--a[H1)

end

Alternatively we coulcl get the same result using the following while loop i = 0 hile i 1= 3 do

a [il --a [i+1] i = i + 1

end

7 Functions

SDDL also permits the creation of functiolli inside the code Those must be written before the diagram description A SDDL function is defined with the keyword fun The list of arguments does not need to be typed only named The return type (if it exists) does not need to be specified either To cali the function in the resulting code a typical C-like cali is used fun dropManyCs i v n c)

for j from 1 to n do put s at i + jv in c

end

circle = Circ le vith [radius = 50] dropManyCcircle COO 00)

C50 00) 100 main)

(rtttt3JJJ) In this case we define a function that drops

many instances of a Shape s at different positions on a Canvas c The positions of the Shape are detershymined by an initial point i and a translation vector v Finally the number of Shapes placed is also given as a parameter n Each Shape is then placed at the initial point translated by the translation vector a certain number of times This permits us to create many circles along one line

One important point is the parameter for the Canvas in which we place the Shapes However we pass main as our parameter The reason for this is that SDDL does not possess global variables A function can only access its parameters and variables that have been defined inside the function Thus trying to place something in main From inside a funcshytion will yield an errer message saying the variable main is unknown

8 Primitives

SDDL as mentioned before is written in Java One of the nice features of Java is its libraries Many classes have been written for any number of different tasks and the number of functions and algorithms implemented is astonishing To rewrite libraries that are already defined in Java or to link them one by

one in SDDL seemed pointless It is much nicer to directly use those functions since theyre already there

Since Java is a reftexive language in the sense that the program knows about itself and can modify itself at will functions can be dynamically accessed at runtime We already use this feature to simplify the definition of the SDDL interpreter the interpreter doesnt have to know every possible type of Shape in order to work Using these same mechanisms permits loading classes at runtime and gives the user the power to cali From inside SDDL any Java function

This is done through so-called primitives which are defined using the keyword primitive followed by the name of the function as it will appear in SDDL Following that two strings are given one for the package in which the function is defined and one for the name of the function as it was defined in Java Any primitive declaration must be made prior to any function definition

Lets look at an example One of the main things a diagram description language would require is sorne basic mathematics and geometry libraries Java possesses a nice java lang math package which we would like to use especially the sin and cos funcshytions For this we will need to define two primitives primitive static sin javalangMath sin primitive static cos javalangMath cos

Once they are defined they can be called just like any other SDDL functions In this case we will use those functions to place circles around an invisible circle for i from 1 to 6 do

put Circle vith [radius = 50] at C200 cos(i 314 30) 200 sin(i 314 30raquo

in main end

00 o 0 00

9 A concrete example

Now that we have ail our tools lets use SDDL to describe a simple diagram of an automaton This is the complete code along with the resulting image circlel Circle vith [radius = 100] circle2 Circle vith [radius = 120] ellipse Ellipse vith [xradius = 500

yradius = 200] circle = put circlel at (-300 00) in form put circlel at C300 00) in form put circle2 at (300 00) in form

Drawing structured diagrams with SDDL

210

put ellipse in form

dl = put form at (1000 1000) in main d2 = put form at (1000 500) in main d3 = put form at (1000 -500) in main put Text with [text=$N(p_1)$]

at (1000 1000) in main put Text with [text=$N(p_2)$]

at (1000 500) in main put Text with [text=dots]

at (100000) in main put Text with [text=$N(p_n)$]

at (1000 -500) in main

put Text with [text = $s_O$] at (00 200) in main

d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle) (coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle) (coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

10 Modifying the hierarchy by adding shapes

Using what has been described above most diagrams can be created However many simplifications can be made and sorne domains may find it relevant to add classes specifie to their trade SDDL eases the modification of the Java hierarchy underneath the language by using reftexivity Any user who respects sorne basic guidelines will be able to have its class work automatica11y in SDDL without any specifie linking required

To do this every class must possess a certain number of properties Those properties are defined through setters and getters For instance for the

Mathieu Bourgeois and Roger Villemaire

TUGboat Volume 31 (2010) No 2

radius of a circle these are called setRadius and getRadius Any property that follows this rule will be accessible

Furthermore an empty constructor must also be defined that sets as much as possible default values for a11 properties of the defined Shape There are also sorne small functions to be defined like the draw and obtainPath functions Any reference points must also be defined with a function to obtain them

As an example lets say we would like to add a class to represent a cloud A cloud will have a number of spikes and a size The class definition (without function definition) that we would require would be the following

public class Cloud extends Shape double size int numberOfSpikes public Cloud() public void setSize(double size) public double getSize() public void setNumberOfSpikes(int n) public int getNumberOfSpikes() public void draw(AbstractPoint a

PrintWriter w) public Path obtainPath()

11 Future additions and availability

SDDL is available now at httpwwwinfo2uqam cal -villemaire_rReChereacuteheSDDL It is funcshytional though not by any means complete Many additional Shapes couid be added (in particular tree and graph classes) and options could be added to existing classes Development of the application conshytinues for the time being and a more thorough version will be made available

References

[1] John C Bowman and Andy Hammerlindl Asymptote A vector graphies language TUGboat The Communications of the TEX Users Group 29288-294 2008

o Mathieu Bourgeois Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada bourgeois dot mathieu dot 2 (at)

courrier dot uqam dot ca

o Roger Villemaire Universiteacute du Queacutebec agrave Montreacuteal Montreacuteal Canada villemaire dot roger (at) uqam dot ca httpintrainfouqamca

personnelsMembersvillemaire_r

APPENDICE B

PREacuteSENTATION DE LA GRAMMAIRE DE SDDL

Nous preacutesentons ici le contenu entier de la grammaire de SDDL tel que reacutealiseacute avec

SableCC Tous les eacuteleacutements du langage sont lagrave agrave lexception de la reacuteflexiviteacute dont les

deacutetails de code sont situeacutes dans la partie Java de notre projet

Package sddlsyntax

Helpers

any [O Oxffff]

tab 9 li 10 cr = 13

upper [ A 2 ]

lower [ a z]

digit [ 0 9]

name char = upper 1 lower 1 digit -

string_char = [[32 126] - ]

= J bulldot

not star = [any-] not_star_not_slash = [not_star - l]

Tokens

92

put_kwd = put at_kwd = at in_kwd = in fit_kwd = fit around_kwd = around if_kwd = if

while_kwd = while true_kwd = true false_kwd = false then_kwd = then else_kwd = else for_kwd = for from_kwd = from end_kwd = end to kwd to by_kwd = by do_kwd = do with_kwd = with and_kwd = and or_kwd = or fun_kwd = fun return_kwd = return primitive_kwd = primitive call_kwd = call static_kwd = static coord_kwd = coord of _kwd = of get_kwd = get

scaled_kwd = scaled slanted_kwd = slanted rotated_kwd = rotated translated_kwd = translated

straight_line_kwd = -- curved_line_kwd = - straight_fwd_arrow_kwd = -gt curved_fwd_arrow_kwd = -gt straight_bwd_arrow_kwd = (- curved_bwd_arrow_kwd = (- straight_bidir_arrow_kwd = (-gt curved_bidir_arrow_kwd = (-gt

93

plus = + minus = -

mult = div =

eq = == neq = = lt lt gt = gt leq lt= geq gt= not assign = =

dot = dot

l br = - r br ( l _par = ) r_par =

l cr = [ )

-r_cr = J

sc = comma =

id = lower name_char class_name = upper name_char

integer = (-) digit+ real = (-) digit+ dot digit+

) ) Il J )Ilstring string_char

blank = 1 tab 1 cr 1 If 1 cr If comment not_star ( (not_star_not_slash not_star))

Ignored Tokens

blank comment

Productions

file = [primitives] primitive [functions] function [stms] stm

94

primitive =

primitive_kwd static_kwd id [class_name] string [func_name] string signature sc

signature = l_par type_list r_par

type_li st = string [additional_types] additional_type

additional_type comma string

function = fun_kwd id l_par id_list r_par l_br [stms]stm r_br

id_list =

id [additional_ids] additional_id

additional id comma id

stm = exp exp sc 1

assign id assign exp sc 1

while while_kwd exp do_kwd [stms] stm end_kwd sc Il if if_kwd exp then_kwd [stms] stm else_part end_kwd sc 1

for for_kwd id from_kwd [low_bound] exp to_kwd [up_bound] exp do_kwd [stms] stm end_kwd sc 1

return return_kwd exp sc

else_part = else_kwd [stms] stm

exp = or exp or_kwd and_exp simple and_exp

and_exp = and and_exp and_kwd line_exp 1

simple line_exp

line_exp line line_exp line_op eq_exp with_part 1

95

1

1

simple eq_exp

line_op =

straight_Iine straight_line_kwd 1

curved_line curved_Iine_kwd 1

straight_fwd_arrow straight_fwd_arrow_kwd curved_fwd_arrow curved_fwd_arrow_kwd 1

straight_bwd_arrow straight_bwd_arrow_kwd curved_bwd_arrow curved_bwd_arrow_kwd 1

straight_bidir_arrow straight_bidir_arrow_kwd curved_bidir_arrow curved_bidir_arrow_kwd

eq_exp = eq [left] cmp_exp eq [right] cmp_exp 1

neq [left] cmp_exp neq [right] cmp_exp simple cmp_exp

cmp_exp = lt [left] add_exp lt [right] add_exp 1

gt [left] add_exp gt [right] add_exp 1

leq [left] add_exp leq [right] add_exp geq [left] add_exp geq [right] add_exp simple add_exp

add_exp = add add_exp plus mul_exp 1

minus add_exp minus mul_exp simple mul_exp

mul_exp =

mult mul_exp mult left_unary_exp div mul_exp div left_unary_exp simple left_unary_exp

left_unary_exp = not not left_unary_exp get get_kwd id from_kwd left_unary_exp put put_kwd exp at_part in_kwd left_unary_exp fit fit_kwd class_Dame around_kwd left_uoary_exp coord coord_kwd of_kwd id l_par

arg_Iist r_par in_kwd left_unary_exp 1

simple right_exp

96

right_exp = calI right_exp dot id l_par arg_Iist r_par 1

index right_exp l_cr exp r_cr 1

scaled right_exp scaled_kwd l_par eq_exp r_par slanted right_exp slanted_kwd l_par

[xslant] exp comma [yslant] eq_exp r_par rotated right_exp rotated_kwd l_par eq_exp r_par 1

translated right_exp translated_kwd l_par [xtranslate] term comma [ytranslate] eq_exp r_par 1

simple term

term =

par l_par exp r_par 1

point l_par [x_value] exp comma [y_value] exp r_par 1

drawing class_name with_part 1

var id 1

int integer 1

real real 1

true true_kwd 1

false false_kwd string string 1

list l_cr arg_Iist r_cr 1

static_call id l_par arg_Iist r_par

arg_Iist = exp [additional_args] additional_arg

additional_arg comma exp

with_part = with_kwd l cr options r_cr

options = option [additional_options] additional_option

additional_option comma option

option = id assign exp

APPENDICE C

PREacuteSENTATION DE LA HIEacuteRARCHIE

Nous preacutesentons ici la description complegravete de notre hieacuterarchie objet en Java Le tout est

deacutecrit agrave laide dun diagramme UML Toutefois afin de faciliter le formatage nous avons

seacutepareacute le tout en deux sections Le premier diagramme contient les noms des classes ainsi

que leurs relations dheacuteritage Par apregraves tous les diagrammes suivants repreacutesentent le

contenu speacutecifique de chaque classe sans les relations entre classes Ceci nous permet

dobtenir une vue densemble des classes tout en obtenant des deacutetails cruciaux sur

limpleacutementation de chaque classe

98

l -llill Pa aj f1 1 Sh middotisVIsible boolampan

+draw(locaton AbstractPoint oot PniltWriBl) void

+lsVlsigtle() boolean +copyO Shape +obtalnPathO Path

Drawlna

-numberOIDrawinm int =0 middotdrawingNumber (nt -dependendes DrawingD middotpointsDellned AbsttactPolntD middothasBeenDrawn booLean middotshape Shape dmWingName string middotdrowingPositlon AbstractPoint -position AbstnldPolnt

+Orawlog(s Shape) +Shape(s S~ location AbsbaclPoint) +setPositlcn(positlon AbslradPoinl) void +seIDraloVingName(nsme slJfng) void +gelName() string +geISUbDrawlng(name string) ~ Drawlng +re~~Jri~)slring

+addDeflO8dPoint(point AbstractPolnl) Int +hasBeenDraWn() booIean +lsDrawn() booIean +canBeDlBWn() booIean +getShape() Shape fdraw(Jocafion AbslraclPolnt out PrlnlWriler) void +obtainPathO Path -tdp(other Orawilg) AbslractPoilt

uare length double

+Squate() ~s ( ~ le)

ell-eoatMength double) void +getlongthO bulldouble +dmw(locabmiddotoo AbstrampctPoint out PrnMYler) void +obtainPath() Path ffOPY() Shape

99

Rectangle

-lengIh double -wldth double -100 KI boeacuteIean

+Rectangle() +Rectangle(length double wldth double) +selleogth~ength double) void +setWldth(Width double) void +seIRound(rlaquo)Ulld booIegravean) void +getlengtb( doubIe +getMdth() double +getRound() booIeao +getNorth(d Dmwlog) RefPoint lttget5outh(d Drawlng) RefPolnl +getwest(d DlaWlng) RefPoint +gelEaat(d Drawlng) RefPoinl +gelNorthwest(d Drawllg) RefPoInt +gelNortheast(d Drawlng) R1tfPolnt lttgetSou1hwe$(d Drawlng) RefPoInt +get5outheast(d Drawilg) RefPoklt +dl8wlocalion Absl18ctPoiIt Ougravet ~Mhl81 void ii)blainPathO ~ Path

CIrcIe

middotradlus double

+Clœ() +Clrcle(radlus double)

+COPYO Shape +setRadlus(radius ~ double) void +getRadius() double +getAnglePolnt(d Omwilg angle double) RefPoInt +dmwlocation AbstradPoirlt our AiltKtler) VOiCI iOblailPath() Path

ElIID8e

middotxradlus double middotyradlus double

+Ellpse() +copyO bullShape +setXRadlus(r double) void +setYRadIus(r doublrt) void -gelXRadlus() double +geIYRadius() double +draw(txalJon AbstractPomt out PrinMbl8l) IIOIumld iOblainPathO Path

100

Lino point1 AbslractPoln1 middotpoint2 AbstractPoint

+L1oe() +Llne(point1 AbstractPoint poill2 AbstractPolnt) +COPYO Shape +dmw(locaIJon AbsIroctPoinl out PrnIWril9f) void +selPolnt1 (poInl1 AbsttactPoint) void +seIPoill2(poinl2 AbslractPoinl) void +getPolnl1 () AbslraclPoinl tiJotPolnl2() AbstraclPolntn_~

EqTrtanale middotsim double

-EqTriangleQ +EqTrlangle(size double) +cOPYO Shape +setSlze(slze double) void +gets1ze() double +d18W(Jocolion AbstTadPoinl out Ptil1Wfit8f) void +oblalllPalhll Path

middotpath Path bulltext string middotposIlIon double -dir Poilt middotabsohJle boolean middothasTexl boolean

+Arrav(path Palh) +copyO Shape TCl(( ex s n~ U blo dn 010 aosolute boolean) void seISlartingTangcnl(dlr Poinl) void

seIEndflgTangenl(dir Potnt) void tgelPalhO Palh +obtalnPath Path

101

cany -canvasLlst Carwas(J -canvasPontLIsl AbstractPoinllJ daWVigUsl DrawingD dlawilgPolnlUst AbsJaCtPolntO middotIsMaIn booean canvasPosltion bullAbstmetPoint

+CsnYaS() copYO Shape +seteanvasPositIoR(posllon AbslraclPotnt) VOId +setMaln() void +f8Mai1() booIean +addShape(S Shapeloca1ion AbstradPoItit) Drawilg l+a~pe(S Shape IocagravetJon AllstraclPolnl name slring) DraNklg +getOtawiDg(I Inl) D1awlng ~elDtawfng(namamp string) bull Drawilg tgelOl8WIngiocal1on(namo stlllllJ) AbsllaclPoilt ~olDmwlngOrNull(name string) Drawilg tgelOrawinglocation(l int) AbslractPolnt o+getNumberOfDrawlngs() int +dl8w(location AbstrodPonr oui PrintwrllerJ void +dmwMain(oul PrinlWrllGr) void +drawCanvaa(locatlon AbSlractPoinl remalnlllQDraws Drawlna Il out Prlntwriter) void

Path -Bst AbstractPolnllJ middothasASIartilgTangent boolean -hasAEndhlgTangent booIean -startiogTangent Point middotendingTangent Point middot1sU1ear boolean

+PathO Psth(Ust AbstraclPoint 0) +Path(Dst Ab~tPolnt Q startingTangent Polnt endlngTangenl Point) +cOPYO Sh8p6 +addPoinl(poiumlnl Abstl8ClPoint) void +seIUnear() void +IsUnearO booloao +getPolnt(l Inl) AbsIraclPcInl +getPolnts() AbsIlaCPoht 0 o+getNumberOlPolnts() Rt +cyc1B() void -thasASI8rthgTangent() boolean +hasAEndingTangentO booIoan +getStattilgTangenlO PoiIl +getEndlngTangent() Polnl 4uumllSlartingTangenl(stllllngTangent Peint) w1d +seIEndIllQTangent(encliigTangenl ~nt) void +psthValue() strilg +dmwJocalion AbslradPoItlI oot FilMtJrer) void

102

Text

-told slfng

ImiddotTexl() +Texl(lext string) +sotText(tegravext string) void iil8tTeld() string +draw(Jocalion AbstroctPoJnl oof PrinWriter) void ~btalnPath() Path +CODV(J ShsD9

AbsctPolnl +altfd(second AbstraclPoinl) AbslractPolnt -tmulliply(multipier double) AbstraclPolnt +eombine(perœntage double second AbstraclPolnl) AbstractPoint +solvfJ() slrillg +COfNIJ AbslradPoinl

Point -x double y doub19

+POIcirclIO +POIOI(x double y double) +solvo() slting -+IoSlflngO string~ n bull

RefPolnt -mf8teflœDrawlng Drawlng -poIntNumbef Int

+RefPoint(referenceDrawing DraYIing poiolNu ber Illl) +SoNe() stmg +COPYO AbstroctPDAcirclf

lnauudJonPoint p Path

-q Palh

+lnlCfSecllonPoint(p Palh q Path) +COPYO AbstrampcfPoitlt +soIve() string

103

Un Point -point AbsbaclPoint -pIampStmg string -endStrlng string -value double

+UnaryMapPolnl(poInt AbstradPoInt) +ScW9() string +setMapTypeMultlpIy(vallJe double) void +c Abslr8ctPoinI

Bln oint frstPoint Absll8clPoinl secoodPoInt AbstrootPoint -pceSIring string -middIeSlrIng Itlfno -endString string

+8ilatyMapPolnt(fkstPoiIt Abstmc1Po1nt secondPolnt AbslraetPointl +cOPYO bull AbstraetPOOI +soAte() string +selMapTypeAddO void

[Cette page a eacuteteacute laisseacutee intentionnellement blanche]

APPENDICE D

PREacuteSENTATION DES DIAGRAMMES CHOISIS

Cet annexe comprend lensemble des quinze (15) diagrammes que nous avons choisis

comme base de qualiteacute pour notre projet Tel que mentionneacute preacuteceacutedemment nous avons

inclus agrave la fois le code de chaque diagramme en SDDL ainsi que le diagramme reacutesultant

Aucune analyse nest effectueacute pour ces dessins agrave lexception de ceux deacutejagrave analyseacutes au

chapitre 6

Start box triangle = EqTriangle with [size = 400J put triangle at (00 -100) in main put Text with [text = StartJ at (00 -50) in main

El box rectanglePos = (00 -500) rectangle = Rectangle with [length = 1600 width = 300J put rectangle at rectanglePos in main put Text with [text El J at rectanglePos - (600 00) in main put Text with [text $a leftarrow O$J

at rectanglePos + (-300 50) in main put Text with [text $b leftarrow l$J

at rectanglePos + (-300 -50) in main put Text with [text $a leftarrow l$J

at rectanglePos + (100 50) in main put Text with [text $b leftarrow O$J

at rectanglePos + (100 -50) in main put Text with [text $c leftarrow m$J

at rectanglePos + (500 50) in main put Text with [text $d leftarrow n$J

106

at rectanglePos + (500 -50) in main

1 E2 box 1 rectangle2Pos = (00 -1000) put rectangle at rectangle2Pos in main put Text with [text = E2 ] at rectangle2Pos (600 00) in main put Text with [text = $q leftarrow quotient(c div d)$]

at rectangle2Pos + (100 50) in main put Text with [text = $r leftarrow remainderCc div d)$]

at rectangle2Pos + (100 -50) in main

1 Round E3 box 1 rectangle3Pos = (00 -1500) roundRectangle = Rectangle with [length = 800 width 250

round = true] put roundRectangle at rectangle3Pos in main put Text with [text = E3 $r = O$] at rectangle3Pos in main

1 Stop box 1 stopPos = (1500 -1700) put triangle at stopPos in main put Text with [text = Stop] at stopPos + (00 50) in main

1 E4 box 1 rectangle4Pos = (00 -2000) put Rectangle with [length = 1600 width = 400]

at rectangle4Pos in main put Text with [text = E4] at rectangle4Pos + (-700 00) in main put Text with [text = $c leftarrow d d leftarrow r$]

at rectangle4Pos + (100 120) in main put Text with

[text = $t leftarrow a a leftarrow a a leftarrow t - qa$] at rectangle4Pos + (100 00) in main

put Text with [text = $t leftarrow b b leftarrow b b leftarrow t - qb$ ] at rectangle4Pos + (100 -120) in main

(00 -100) -) rectanglePos + (00 150) rectanglePos + (00 -150) -) rectangle2Pos + (00150) rectangle2Pos + (00 -150) -) rectangle3Pos + (00125) rectangle3Pos + (00 -125) -) rectangle4Pos + (00200) rectangle4Pos + (00 -200) -- rectangle4Pos + (00 -500)

rectangle4Pos + (-1000 -500) -- rectangle2Pos + (-1000 00) -) rectangle2Pos + (-800 00)

107

rectangle3Pos + (400 00) -gt rectangle3Pos + (1410 00) put Text with [text Yes] at rectangle3Pos + (480 -50) in main put Text with [text = No] at rectangle3Pos + (-80 -175) in main

Placing text notes put Text with [text Al $m gt 0 n gt 0$] at (3000 00) in main put Text with [text A2 $c=mgtO d=ngtO$] at (3000 -340) in main put Text with [text $a=b=O a=b=l$] at (3000 -460) in main put Text with [text A3 $am + bn = d am + b$]

at (3000 -740) in main put Text with [text = $0 leq r lt d gcd(dc) g$]

at (3000 -860) in main put Text with [text = A4 $am + bn d = gcd(m n)$]

at (3000 -1200) in main put Text with [text = A5 $am + bn d am + b$]

at (3000 -1540) in main put Text with [text = $0 lt r lt d gcd(cd) = g$]

at (3000 -1660) in main put Text with [text = A6 $am + bn = d am + b$]

at (3000 -1940) in main put Text with [text = $gcd(c d) = gcd(m n)$]

at (3000 -2060) in main

(2500 00)-(2000 -50)-(1500 -150)-gt(00 -200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -400)-(2000 -450)-(1500 -650)-gt(00 -700) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2300 -800)-(2000 -850)-(1500 -1150)-gt(00 -1200) with [startingTangent = (-10 00) endingTangent = (-10 00)]

(2200 -1200)-(2000 -1200)-(1500 -1250) -gtrectangle3Pos + (900 00) with [startingTangent = (-10 00) endingTangent (-10 -10)]

(2250 -1600)-(2000 -1700)-(1500 -1900) -(1000 -1750)-gt(00 -1700) with [startingTangent = (-10 00) endingTangent (-10 00)]

(2250 -2000)-(1500 -2200)-gt(00 -2400) with [startingTangent = (-10 00) endingTangent (-10 00)]

108

~-- Al m gt On gt O

A2 c = m gt 0 d = n gt 0 a = b = 0 a = b = 1

A3 am + bn = dam + bdeg~ T lt dgcd(dc) = 9 E2

_--- A4 am + bn = d = gcd(m n)

A5 am + bn = dam + b Sto 0lt T lt dgcd(cd) = 9

Cf- d d f- T A6 am + bn = d am + bE4 t f- a a f- a a f- t - qa gcd(cd) =gcd(mn)t f- b b f- b b f- t - qb

primitive static sin javalangMath sin primitive static cos javalangMath cos primitive static sqrt javalangMath sqrt

fun ellipseCangle length width) return Clength cosCangle 20 31415 3600)

width sinCangle 20 31415 3600))

fun ellipseDeriveCangle length width) length2 = length length width2 = width width sinus = sinCangle 31415 1800) sinus2 = sinus sinus cosinus = cosCangle 31415 1800) cosinus2 = cosinus cosinus x = -10 Clength sinus)

sqrtCwidth2 cosinus2 + length2 sinus2) y = Cwidth cosinus) sqrtCwidth2 cosinus2 + length2 sinus2) return Cxy)

avail = Text with [text=AVAIL] link = Text with [text=LINKCP)] t = Text with [text=T]

109

put avail at ellipse(900 1000 500) in main put t at ellipse(1800 1000 500) in main put link at ellipse(OO 1000 500) in main

(ellipse(70 1000 500))-(ellipse(450 1000 500)) -gt(ellipse(750 1000 500))

(ellipse(1050 1000 500))-(ellipse(1350 1000 500)) -gt(ellipse(1730 1000 500))

(ellipse(1930 1000 500))-(ellipse(2700 1000 500)) -gt(ellipse(3550 1000 500))

AVAIL

~ T LINK(P)

primitive static sin javalangMatb sin primitive static cos javalangMatb cos

fun circular(angle radius) return (radius cos(31415 angle 1 1800)

radius sin(31415 angle 1 1800))

circleradius = 400 circle = Circle with [radius=100] g Text with [text=G] r = Text with [text=R] y Text with [text=Y]

put circle at (circular(300 circleradius)) in main put r at (circular(300 circleradius)) in main put circle at (circular(900 circleradius)) in main put r at (circular(900 circleradius)) in main put circle at (circular(1500 circleradius)) in main put g at (circular(1500 circleradius)) in main put circle at (circular(2100 circleradius)) in main put g at (circular(2100 circleradius)) in main put circle at (circular(2700 circleradius)) in main

110

put g at (circular(2700 circleradius)) in main put circle at (circular(3300 circleradius)) in main put y at (circular(3300 circleradius)) in main

(circular(450 circleradius))-(circular(600 circleradius)) -gt(circular(750 circleradius))

(circular(1050 circleradius))-(circular(1200 circleradius)) -gt(circular(1350 circleradius))

(circular(1650 circleradius))-(circular(1800 circleradius)) -gt(circular(1950 circleradius))

(circular(2250 circleradius))-(circular(2400 circleradius)) -gt(circular(2550 circleradius))

(circular(2850 circleradius))-(circular(3000 circleradius)) -gt(circular(3150 circleradius))

(circular(3450 circleradius))-(circular(OO circleradius)) -gt(circular(150 circleradius))

put Text with [text=tinyNEXTR] at (circular(900 circleradius)) + (00 150) in main

put Text with [text=tinyNEXTG] at (circular(-900 circleradius)) + (00 -150) in main

put Text with [text=tinyCURRENT] at (circular(-300 circleradius))+ (1~0 -150) in main

NEXTR

NEXTG

fun left(d)

return 016 coord of west in drectangle + 084 coord of east in drectangle

fun right(d)

return 016 coord of east in drectangle +

111

084 coord of west in drectangle

rectanglel = Rectangle with [length=600 width=200) rectangle2 = Rectangle with [length=200 width=200) circle = Circ le with [radius=10) put rectanglel in form rectangle = put rectangle2 in form put circle at (-200 00) in form put circle at (200 00) in form

dl = put form at (00 00) in main d2 = put form at (-600 -500) in main put Text with [text=IA) at (-600 -500) in main d3 = put form at (-1200 -1000) in main put Text with [text=IB) at (-1200 -1000) in main d4 = put form at (-1800 -1500) in main put Text with [text=ID) at (-1800 -1500) in main d5 = put form at (-600 -1500) in main put Text with [text=IE) at (-600 -1500) in main d6 = put form at (00 -1000) in main put Text with [text=IC) at (00 -1000) in main d7 = put form at (600 -1500) in main put Text with [text=f) at (600 -1500) in main d8 = put form at (-400 -2000) in main put Text with [text=IG) at (-400 -2000) in main dg = put form at (300 -2000) in main put Text with [text=IH) at (300 -2000) in main dl0 = put form at (1000 -2000) in main put Text with [text=JI) at (1000 -2000) in main

(left(dl))-gt(coord of north in d2rectangle) (right(dl))-gt(coord of east in dlrectangle + (00 50)) (left(d2))-gt(coord of north in d3rectangle) (right(d2))-gt(coord of north in d5rectangle) (left(d3))-gt(coord of north in d4rectangle) (right(d3))-gt(coord of south in d2rectangle) (left(d4))-gt(coord of west in dlrectangle + (00 50)) (right(d4))-gt(coord of south in d3rectangle) (left(d5))-gt(coord of north in d6rectangle) (right(d5))-gt(coord of north in d7rectangle) (left(d6))-gt(coord of south in d2rectangle) (right(d6))-gt(coord of north in d8rectangle)

112

(left(d7raquo-gt(coord of north in d9rectangle) (right(d7raquo-gt(coord of north in dl0rectangle) (left(dSraquo-gt(coord of south in d6rectangle) (right(d8raquo-gt(coord of south in d5rectangle) (left(d9raquo-gt(coord of south in d5rectangle) (right(d9raquo-gt(coord of south in d7rectangle) (left(dl0raquo-gt(coord of south in d7rectangle) (right(dl0raquo-gt(coord of south in dlrectangle + (100 00raquo

put Text wi th [text=List head] at coord of north in dlrectangle + (00 50) in main

circle = Circle with [radius = 100] bigcircle = Circle with [radius = 400] ellipse = Ellipse with [xradius = 200 yradius = 120] bigellipse = Ellipse with [xradius = 1000 yradius = 600]

put bigcircle in canvasl put circle at 050 150) in canvasl put Text with [text = H] at 050 150) in canvasl put circle at (-150 150) in canvasl put Text with [text J] at (-150 150) in canvasl put Text with [text = B] at (00 -150) in canvasl

put bigcircle in canvas2

113

put circle at (-150 150) in canvas2 put Text with [text = D] at (-150 150) in canvas2 put circle at (150 150) in canvas2 put Text with [text = Fil] at (150 150) in canvas2 put Text with [text = C] at (-200 -150) in canvas2 put ellipse at (130 -150) in canvas2 put Text with [text = liE] at (00 -150) in canvas2 put circle at (200 -150) in canvas2 put Text with [text = G] at (200 -150) in canvas2

put canvasl at (-450 00) in main put canvas2 at (450 00) in main put Text with [text = Ali] at (00 -300) in main put bigellipse in main

A

fun drawBinaryTree(d s 0 dh dv n)

put s at a in d put 0-(0 + (-10 dh -10 dvraquo in d put 0-(0 + (db -10 dvraquo in d if (n == 1)

then return 0 else drawBinaryTree(d sa + (-10 dh -10 dv) db 20 dv n - 1) drawBinaryTree(d s a + (db -10 dv) db 20 dv n - 1) end

(0000)--(0000)

114

orlgln = (00 00) dv = 200 dh = 1000 bullet = Circle with [radius = 20) drawBinaryTree(main bullet origin dh dv 7)

bullet = Circle with [radius = 20] put bullet in main put bullet at (-300 -300) in main put bullet at (-600 -600) in main put bullet at (00 -600) in main put bullet at (300 -300) in main

(00 00)--(-300 -300) (00 00)--(300 -300) (-300 -300)--(-600-600) (-300 -300)--(00 -600)

(-100 00)-(-500 -300)-(-650 -650)-(-300 -400)shy(50-650)-(00-500)-(-150-300)-(-100 -200)shy(00-100)-(250-320)-(350-350)shy(320 -270)-gt(100 00)

circlel Circle with [radius 100]

lL5

circle2 = Circle with [radius = 120] ellipse = Ellipse with [xradius = 500 yradius 200] circle = put circlel at (-300 00) in form put circlel at (300 00) in form put circle2 at (300 00) in form put ellipse in form

dl put form at (1000 1000) in main d2 put form at (100 0 500) in main d3 put form at (1000 -500) in main put Text with [text I$N(p_1)$] at (1000 1000) in main put Text with [text I$N(p_2)$] at (1000 500) in main put Text with [text dots] at (100 0 o 0) in main put Text with [text $N(p_n)$] at (1000 -500) in main

put Text with [text $S_O$] at (00 200) in main d4 = put circlel at (00 200) in main

(coord of anglePoint(700) in maind4)-gt (coord of anglePoint(1800) in maindlcircle)

(coord of anglePoint(OO) in maind4)-gt (coord of anglePoint(1800) in maind2circle)

(coord of anglePoint(-700) in maind4)-gt (coord of anglePoint(1800) in maind3circle)

sa

fun dropMany(f n s v c) for i from 10 to n do

put f at (s + (i - 10) v) in c

116

end

square = Square with [length=200] changeVec = (00 -200) dropMany(square 40 (00 00) changeVec main) dropMany(square 30 (500 00) changeVec main) dropMany(square 10 (1000 00) changeVec main) dropMany(square 10 (1500 00) changeVec main) put Text with [text=IO] at (00 00) in main put Text with [text=ll] at (00 -200) in main put Text with [text=13] at (00 -400) in main put Text with [text=17] at (00 -600) in main put Text with [text=bf ail] at (500 200) in main put Text with [text=12] at (500 00) in main put Text with [text=14] at (500 -200) in main put Text with [text=17] at (500 -400) in main put Text with [text=17] at (1000 00) in main put Text with [text=bf $a~b~+$] at (1500 200) in main put Text with [text=18] at (1500 00) in main put Text with [text=none ] at (2000 00) in main

(120 100)-gt(380 100) (620 100)-gt(880 100) (112 0 10 0) - gt(138 0 10 0) (1620 100)-gt(1880 100)

a ab+

~ -m-0-0-none 7

put Text with [text=IS] in main put Text with [text=A] at (00 -200) in main put Text with [text=B] at (00 -400) in main put Text with [text=$alpha$] at (-600 -600) in main put Text with [text=$beta$] at (-300 -600) in main put Text with [text=$gamma$] at (00 -600) in main put Text with [text=$y$] at (300 -600) in main put Text with [text=$z$] at (600 -600) in main

117

(-50 -50)--(-700 -540)--(-500 -540) (50 -50)--(700 -540)--(500 -540) (-50 -250)--(-400 -540)--(-200 -540) (50 -250)--(400 -540)--(200 -540) (-50 -450)--(-100 -540)--(100 -540)--(50 -450)

put Text with [text=D] in main

put Text with [text=T] at (-500 -500) in main put Text with [text=bf real] at (-500 -900) in main put Text with [text=4] at (-350 -500) in main put Text with [text= type] at (-150 -500) in main

put Text with [text=L] at (500 -500) in main put Text with [text=inh] at 050 -500) in main put Text with [text=5] at (350 -500) in main put Text with [text=6] at (650 -500) in main put Text with [text=entry] at (850 -500) in main

put Text with [text=bf $id_3$] at (900 -900) in main put Text with [text=bf ] at (500 -900) in main put Text with [text=3] at 0050 -900) in main put Text with [text=entry] at 0350 -900) in main

put Text with [text=L ] at (00 -1000) in main put Text with [text=inh] at (-350 -1000) in main put Text with [text=7] at (-150 -1000) in main put Text with [text=8] at 050 -1000) in main put Text with [text=entry] at (350 -1000) in main

put Text with [text=bf ] at (00 -1400) in main put Text with [text=bf $id_2$] at (400 -1400) in main put Text with [text=2] at (550 -1400) in main put Text with [text=entry] at (750 -1400) in main

put Text with [text=L] at (-500 -1500) in main

118

put Text with [text=inh] at (-850 -1500) in main put Text with [text=19] at (-650 -1500) in main put Text with [text=110] at (-350 -1500) in main put Text with [text= ent ry] at (-150 -1500) in main

put Text with [text=bf $id_l$] at (-500 -1900) in main put Text with [text=ll] at (-350 -1900) in main put Text with [text= ent ry ] at (-150 -1900) in main

(-100 -100)--(-400 -400) (-500 -600)--(-500 -800) (100 -100)--(400-400) (500 -600)--(500 -800) (600 -600)--(800 -800) (400 -600)--(100 -900) (100 -1100)--(400 -1300) (00 -1100)--(00 -1300) (-100 -1100)--(-400 -1400) (-500 -1600)--(-500 -1800)

(-300 -400)-(00 -300)-gt(300 -400) (400 -600)-(500 -650)-gt(600 -600) (950 -800)-gt(700 -600) (300 -600)-gt(-50 -900) (-100 -1100)-(00-1150)-gt(100 -1100) (450 -1300)-gt(200 -1100) (-200 -1100)-gt(-550 -1400) (-550 -1500)-(-500 -1550)-gt(-450 -1500) (-350 -1800)-gt(-350 -1600)

119

D

~ T 4 type inh 5 L 6 entry

entryrL ~~3 inh 7 L 8 entry

~2entrY inh 9 JJ lOentry

1 t id l 1 entry

circle = Circle with (radius=100J bigcircle = Circle with (radius=SOOJ

cl put circle at (00 200) c2 put circle at (200 00) c3 put circle at (-200 00) c4 put circle at (00 -200) bcl = put bigcircle in graphl

cS = put circle at (00 200) c6 = put circle at (00 -200) bc2 = put bigcircle in graph2

c7 put circle at (00 lS0)

in graphl in graphl in graphl in graphl

in graph2 in graph2

in graph3 c8 put circle at (200 -200) in graph3 c9 put circle at (-200 -200) in graph3 bc3 = put bigcircle in graph3

gl put graphl in main g2 put graph2 at (-1000 -1500) in main g3 put graph3 at (1000 -1000) in main

1 lines in first drawing (coord of anglePoint(900) in mainglc4)-gt

(coord of anglePoint(2700) in mainglcl) (coord of anglePoint(1800) in mainglcl)-gt

(coord of anglePoint(900) in mainglc3) (coord of anglePoint(OO) in mainglcl)-gt

120

(eoord of anglePoint(900) in maingle2) (eoord of anglePoint(2700) in maingle3)-gt

(eoord of anglePoint(1800) in maingle4) (eoord of anglePoint(2700) in maingle2)-gt

(eoord of anglePoint(OO) in maingle4)

(eoord of anglePoint(2700) in maingle3)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(1800) in maingle4)shy(eoord of anglePoint(2250) in mainglbel)

(eoord of anglePoint(OO) in maingle2)shy(eoord of anglePoint(3450) in mainglbel)

lines in seeond drawing (eoord of anglePoint(2700) in maing2e5)-gt

(eoord of anglePoint(900) in maing2e6) erdl = eoord of anglePoint(1800) in maing2e6 erd2 = eoord of anglePoint(1800) in maing2e5 erdl-((erdl + erd2)20 + (-200 00))-gterd2

(eoord of anglePoint(900) in maing2e5)shy(eoord of anglePoint(900) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(450) in maing2be2)

(eoord of anglePoint(OO) in maing2e5)shy(eoord of anglePoint(OO) in maing2be2)

(eoord of anglePoint(OO) in maing2e6)shy(eoord of anglePoint(OO) in maing2be2)

lines in third drawing (eoord of anglePoint(1800) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e9) (eoord of anglePoint(OO) in maing3e7)-gt

(eoord of anglePoint(900) in maing3e8) (eoord of anglePoint(OO) in maing3e9)-gt

(eoord of anglePoint(1800) in maing3e8) crd3 = eoord of anglePoint(OO) in maing3e8 erd4 = eoord of anglePoint(900) in maing3e7 erd3-(erd3 + erd4) 20 + (200 200)-gterd4

erd4--(eoord of anglePoint(1050) in maing3be3) (eoord of anglePoint(1800) in maing3e7)-shy

(eoord of anglePoint(1850) in maing3be3) (coord of anglePoint(1800) in maing3e9)-shy

121

(coord of anglePoint(1750) in maing3bc3)

lines between drawings (coord of anglePoint(2250) in mainglbcl)-gt

(coord of anglePoint(900) in maing2bc2) (coord of anglePoint(3450) in mainglbcl)-gt

(coord of anglePoint(1050) in maing3bc3) (coord of anglePoint(OO) in maing2bc2)-gt

(coord of anglePoint(1850) in maing3bc3) crd5 = coor~ of anglePoint(1750) in maing3bc3 crd6 = coord of anglePoint(450) in maing2bc2 crd5-(crd5 + crd6) 20 + (000 300)-gtcrd6

Texts crdTextl coord of anglePoint(1350) in mainglbcl + (-200 00) crdText2 = coord of anglePoint(1350) in maing2bc2 + (-100 100) crdText3 = coord of anglePoint(450) in maing3bc3 + (100 100) put Text with [text=$R_l$] at crdTextl in main put Text with [text=$R_2$] at crdText2 in main put Text with [text=$R_3$] at crdText3 in main

primitive getClip sddlhierarchyDrawing clip primitive setVisible sddlhierarchyShape setVisible

122

1 clip takes 3 drawings and a canvas first is a line second and third are two shapes which intersect line will draw a line between the intersection points the line creates with the two shapes 1

fun clip(dl d2 d3 canvas)

dlsetVisible(false) drawl = put dl in canvas cl = drawlgetClip(d2) c2 = drawlgetClip(d3) put cl--c2 in canvas

circle Circle with [radius=100] dl = put circle in main put Text with [text=14] in main d2 = put circle at (-400 -400) in main put Text with [text=13] at (-400 -400) in main d3 = put circle at (-700 -800) in main put Text with [text=12] at (-700 -800) in main d4 = put circle at (400 -400) in main put Text with [text=18] at (400 -400) in main d5 = put circle at (150 -800) in main put Text with [text=17] at 050 -800) in main d6 = put circle at (650 -800) in main put Text with [text=110] at (650 -800) in main d7 = put circle at (220 00) in main put Text with [text=14] at (220 00) in main d8 = put circle at (620 -400) in main put Text with [text=18] at (620 -400) in main dg = put circle at (370 -800) in main put Text with [text=7] at (370 -800) in main dl0 = put circle at (00 -1200) in main put Text with [text=5J at (00 -1200) in main

Il = (00 00)--(-400 -400) clip(ll dl d2 main) 12 = (-400 -400)--(-700 -800) clip(12 d2 d3 main) 13 = (00 00)--(400 -400) clip(13 dl d4 main) 14 = (400 -400)--(150 -800)

123

clip(14 d4 d5 main) 15 = (400 -400)--(650 -SOO) clip(15 d4 d6 main) 16 = (220 00)--(-400 -400) clip(16 d7 d2 main) 17 = (220 00)--(620 -400) clip(17 d7 dS main) lS = (620 -400)--(650 -SOO) clip(lS dS d6 main) 19 = (620 -400)--(370 -SOO) clip(19 dS d9 main) 110 = (370 -800)--(00 -1200) clip(110 dg d10 main)

2

5

fun niceArrow(c dMain dLeft dRight) firstPoint = coord of southwest in dMainrectangle + (30 30) secondPoint = coord of southeast in dMainrectangle + (-30 30)

firstEnd = coord of north in dLeftrectangle secondEnd = coord of north in dRightrectangle

put firstPoint-gtfirstEnd in c put secondPoint-gtsecondEnd in c

point1 firstPoint 50 60 + secondPoint 10 60 point2 firstPoint 40 60 + secondPoint 20 60 point3 firstPoint 30 60 + secondPoint 30 60 point4 firstPoint 20 60 + secondPoint 40 60 point5 firstPoint 10 60 + secondPoint 50 60

put (coord of southwest in dMainrectangle + (-25 25))shy(coord of south in dMainrectangle + (00 -50))shy

124

(coord of southeast in dMainrectangle + (25 25)) in c

put pointl--(pointl + (-1 0 30 -10 70)) in c put point2--(point2 + (-1 0 10 -10 85)) in c put point3--(point3 + (00 -10 90)) in c put point4--(point4 + (1 0 -10 85)) in c put point5--(point5 + (30 -1 0 70)) in c

put Text with [text=smallt] at point3 + (00 -130) in c

rect = Rectangle with [length=300 width=200] r = put rect in main put Text with [text=ll] in main rectangle = put rect in form put Text with [text=$t-l$] in form

dl = put form at (-1400 -500) in main dll = put form at (-2000 -1000) in main dlr = put form at (-800 -1000) in main dlll put form at (-2300 -1500) in main dllr put form at (-1700 -1500) in main dlrl put form at (-1100 -1500) in main dlrr put form at (-500 -1500) in main

dr = put form at (1400 -500) in main drr = put form at (2000 -1000) in main drl = put forro at (800 -1000) in main drrr put form at (2300 -1500) in main drrl put form at (1700 -1500) in main drlr put form at (1100 -1500) in main drll put form at (500 -1500) in main

put Text with [text=l root[T]] at (-300 300) in main (-300 240)-gt(coord of north in mainr)

dots = Text with [text=dots] put dots at (-1400 -1000) in main put dots at (-2000 -1500) in main put dots at (-SOO -1500) in main put dots at (1400 -1000) in main put dots at (2000 -1500) in main put dots at (800 -1500) in main

125

(coord of southwest in mainr + (30 30))-gt (coord of north in maindlrectangle)

(coord of southeast in mainr + (-30 30))-gt (coord of north in maindrrectangle)

niceArrow(main dl dll dlr) niceArrow(main dll dlll dllr) niceArrow(main dlr dlrl dlrr) niceArrow(main dr drl drr) niceArrow(main drl drll drlr) niceArrow(main drr drrl drrr)

root[T]

rect = put Rectangle with [length=600 width=200l in form put Rectangle with [length=200 width=200] at (200 00) in form bullet = put Circle with [radius=10] at (200 00) in form

put Text with [text=IF] in main

fl put form at (700 00) in main f2 put form at (1500 00) in main f3 put form at (2300 00) in main f4 put form at (3100 00) in main

(coord of anglePoint(OO) in mainflbullet)-gt (coord of west in mainf2rect)

(coord of anglePoint(OO) in mainf2bullet)-gt (coord of west in mainf3rect)

(coord of anglePoint(OO) in mainf3bullet)-gt (coord of west in mainf4rect)

126

ptW = coord of west in mainflrect ptE = coord of east in mainf4rect

ptW + (-300 OO)-gtptW ptE + (300 OO)-gtptE

put Text with [text=R] at (3800 00) in main

ptS = coord of anglePoint(2700) in mainf4bullet ptS2 = ptS + (00 -350)

ptS--ptS2 ptS2 + (-50 00)--ptS2 + (50 00) ptS2 + (-35 -20)--ptS2 + (35 -20) ptS2 + (-20 -40)--ptS2 + (20 -40)

BIBLIOGRAPHIE

Adobe Systems Incorporated 1994 PostScript Language Reference Manual http j jwwwadobecomjproductsjpostscriptjpdfsjPLRMpdf

-- 2006 PDF Reference Version 17 Adobe Systems Incorporated 6th eacutedition

-- 201Oa Adobe Postscript 3 http j jwwwadobecomjproductsjpostscriptj

2010b PDF Developer Corner PDF Reference http j jwwwadobecomjdevnetjpdfjpdLreferencehtm1

Aho A V R Sethi et J D Ullman 1986 Compilers Principles Techniques and Tools Addison-Wesley

American Mathematical Society 2008 Why Do We Recommend LaTeX http j jwwwamsorgjpublicationsjauthorsjtexjlatexbenefits

Apple Computer Inc 1996 The TrueType Reference Manu al Apple Computer Inc Cupertino California

Bourgeois M 2010 Introduction to Drawing Diagrams with SDDL httpj jrivershyvalley tvjintroduction-to-drawing-structured-diagrams-in-sddlj

Bourgeois M et R Villemaire 201Oa laquoDrawing Structured Diagrams with SDDL raquo

TUGBoat vol 31 no 2 p 206-210

-- 201Ob SDDL http j jwwwinfo2uqamca-villemaireJjRecherchejSDDLj

Bowman J C 2007 laquoThe 3D Asymptote Generalization of Metapost Beacutezier Interposhylation raquo Proceedings in Applied Mathematics and Mechanics

Chomsky N 1956 laquoThree Models for the Description of Language raquo Information Theory IRE Transactions on vol 2 no 3 p 113-124

Cormen T A C E Leiserson R L Rivest et C Stein 2001 Introduction to Algoshyrithms The MIT Press

Davis M R Sigal et E Weyuker 1994 Computability Complexity and Languages Pundamentals of Theoretical Computer Science Morgan Kaufmann

Dhu D-Z et K-I Ko 2000 Theory of Computational Complexity Wiley

Gagnon Eacute 1998 laquoSableCC an Object-Oriented Compiler Framework raquo Meacutemoire de maicirctrise McGill University

128

-- 2009 ObjeetMacro - SableCC httpsableccorgwikiObjectMacro

Group O M 1999 Unified Modeling Language (version 13) Rapport Object Manashygement Group

Hammerlindl A J Bowman et T Prince 2010a Asymptote httpasympshytotesourceforgenet

-- 20lOb Asymptote The Veetor Graphies Language httpasympshytotesourceforgenet asymptote pdf

Hobby J 1992 laquo A Users Manual for MetaPost raquo Computing Science Technical Report vol 162

International Organization for Standardization 2008 Document Management - Elecshytronic Document File Format for Long-Term Preservation - Part 1 Use of PDF 14 (PDF A-1) ISO 19005-1 2005

Jr F S H et S M Kelley 2007 Computer Graphics using GpenGL Prentice-Hall 3e eacutedition

Knuth D 1968 The Art of Computer Programming Addison-Wesley

-- 1984 The TeXbook Reading Mass Addison-Wesley

-- 1986 The Metafontbook Reading Mass Addison-Wesley

-- 1999 Digital Typography Stanford California Center for the Study of Language and Information

Lamport L et D Bibby 1986 LATEX A Document Preparation System T 260 Citeseer

Lancaster D 2005 Approximating a Circle or an Ellipse using Four Bezier Cubic Splines Rapport Synergetics

Maplesoft 2010 Maple 14 User Manual

McNaughton R et H Yamada 1960 laquoRegular Expressions and State Graphs for Automata raquo -IRE Transactions on Electronic Computers no l p 39-47

Object Management Group 2009 UML httpwwwumlorgj

Oracle 2010 Java httpwwwjavacomj

Pierce B C 2002 Types and Programming Languages MIT Press

Riskus A 2006 laquoApproximation of a Cubic Bezier Curve by Circular Arcs and Vice Versa raquo Information Technology and Control vol 35 no 4 p 371-378

Rose K H 2008 XY-pic Home Page httptugorgapplicationsjXy-picj

129

Rose K H et al 2010 laquoXY-pic Users Guide raquo DIKU Universiteacute de Copenhague vol 1

Rumbaugh J M Blaha W Premerlani F Eddy et W Lorensen 1991 ObjectshyOriented Modeling and Design Prentiee-Hall

Saunders J H 1989 laquoA Survey of Objeet-Oriented Programming Languages raquo JOOP Journal of Object-Oriented Programming vol 1

Sabel J et D Friedman 1996 An Introduction to Refiection-Oriented Programming San Francisco Reflection 96

TeX Users Group 2009 MetaPost - TeX User Groups httptugorgmetaposthtml

TIOBE Software 2008 Tiobe Index httpwwwtiobecomindexphpcontentshy paperinfo tpeiindexhtml

Ullman J J Hopcroft et R Motwani 1979 Introduction to Automata Theory Lanshyguages and Computation Addison-Wesley

Van Zandt T 1993a PSTricks-PostScript Macros for Generie TEX httpwwwtexuniyaracrudocpsLugpdf

-- 1993b laquoPSTricks PostScript Macros for Generie 1EX Users Guide raquo Version 093 a http jjwww tug orgjapplicationsjPSTricks

Page 10: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 11: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 12: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 13: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 14: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 15: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 16: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 17: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 18: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 19: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 20: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 21: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 22: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 23: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 24: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 25: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 26: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 27: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 28: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 29: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 30: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 31: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 32: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 33: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 34: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 35: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 36: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 37: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 38: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 39: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 40: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 41: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 42: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 43: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 44: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 45: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 46: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 47: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 48: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 49: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 50: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 51: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 52: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 53: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 54: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 55: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 56: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 57: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 58: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 59: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 60: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 61: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 62: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 63: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 64: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 65: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 66: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 67: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 68: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 69: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 70: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 71: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 72: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 73: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 74: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 75: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 76: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 77: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 78: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 79: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 80: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 81: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 82: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 83: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 84: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 85: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 86: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 87: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 88: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 89: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 90: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 91: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 92: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 93: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 94: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 95: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 96: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 97: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 98: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 99: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 100: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 101: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 102: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 103: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 104: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 105: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 106: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 107: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 108: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 109: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 110: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 111: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 112: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 113: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 114: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 115: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 116: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 117: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 118: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 119: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 120: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 121: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 122: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 123: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 124: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 125: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 126: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 127: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 128: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 129: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 130: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 131: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 132: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 133: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 134: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 135: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 136: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 137: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 138: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux
Page 139: Conception et implémentation d'un langage de description de … · 2014. 11. 1. · CONCEPTION ET IMPLÉMENTATION D'UN LANGAGE DE ... expérience et qui m'ont fourni de précieux