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
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
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
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
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
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
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
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
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