Programmation
programmeur

MagiCalculator a été réalisé à l’aide du langage actionScript2, en programmation objet (un peu) et linéaire (beaucoup), qui est intégré à flash/flex et qui se rapproche fortement du langage java.
Ce langage, initialement prévu pour gérer des animations (on peut en voir en quantité sur le web pédagogique : par exemple avec MathsEnPoche qui regroupe une multitude de petits applets swf), s’est progressivement étoffé pour répondre aux sollicitations des créateurs d’interfaces web évoluées. Son gros défaut et de ne pouvoir dialoguer avec le système d’exploitation (ceci a été voulu afin de le rendre totalement sûr au niveau sécurité) empêchant ainsi l’utilisation des outils systèmes habituels.
Actuellement, la version 3 de ce langage (peu compatible avec les précédentes) oriente totalement la programmation vers le mode objet et apporte, avec un moteur d’interprétation “just in time”, un surcroit de puissance de 600 à 800% qui s’avèrera donc particulièrement utile pour certains calculs très couteux en puissance… Idéalement, Il faudrait donc que le MagiCalculator évolue vers cette version V3.
L’organe vital du programme est son interpréteur/parseur qu’il a bien fallu réaliser puisque les ingénieurs créateurs du langage AS2 (Macromédia) n’ont pas jugé nécessaire de le faire (à dire vrai, flash n’était pas prévu pour être un support de logiciel scientifique…). En contrepartie, une fois finalisé, ce  composant est toujours facilement modifiable  pour s’adapter aux différentes évolutions du calculateur. Cette réalisation a demandé environ une année de travail, pour une bonne part dans l’inconnu du résultat final, en recherches théoriques et pratiques. Une fois finalisé, il s’est ensuite greffé dessus différents modules de calculs (radicaux, nombres quadratiques, fractions de Pi, créations d’algorithmes de calculs, conversions,..), d’affichages, de sauvegardes/restaurations, de création et utilisation de fonctions numériques (jusqu’à 4 inconnues) ainsi que différents outils de vérification du travail de l’élève (numérique, littéral).
Le passage à l’écriture en deux dimensions ainsi que  les conversions automatiques d’expressions 1D <> 2D ont été réalisés en 2008-9 et permettent d’approcher au mieux les écritures mathématiques naturelles.
On peut dire que le calculateur est actuellement achevé dans sa structure de base mais devrait encore évoluer un peu par l’ajout de cours, d’exercices de calcul mental et d’un grapheur.. permettant aux collégiens l’exploitation des fonctions linéaires et affines, voire d’autres fonctions utilisées par la suite au Lycée.

Pour les enseignants programmeurs qui souhaiteraient réaliser leur propre interpréteur/parseur de calcul (très lourd !), il peut leur être utile de détailler la méthode que j’ai utilisée pour réaliser celui de MagiCalculator, accompagné du code « actionScript » (un peu détaillé) correspondant. ActionScript 2 est tout de même livré avec les routines de fonctions mathématiques de base, que l’on peut invoquer pour l’interprétation, puisque les animations vectorielles sont particulièrement gourmandes en calcul!.

Lorsqu’une expression à calculer est saisie, il s’agit de l’analyser littéralement (parsing) puis de traduire cette expression en séquences de calculs (interpréteur) qui aboutiront à un (ou plusieurs) résultat . La méthode d’analyse de l’expression va dicter la programmation de l’interpréteur et retentir sur la vitesse et l’efficacité des calculs obtenus.
Après différentes recherches et tests, je me suis orienté vers la méthode d’analyse « OPERATOR-PRECEDENCE PARSING » décrite par Thomas Nieman (Portland, Oregon).
Cette méthode consiste à explorer l’expression de gauche à droite en stockant sur des piles (une pour les opérateurs, une pour les opérandes, une pour l’expression entrée: input) les opérateurs et opérandes utilisés. A chaque opérateur rencontré, on compare sa priorité opératoire avec celle de l’opérateur suivant. Si sa priorité est plus forte, alors on effectue le calcul relatif à cet opérateur (réduction R), tout en stockant le résultat sur la pile des opérandes, sinon on continue l’exploration de l’expression (suite S). A la fin, le résultat final se retrouve seul dans la pile des opérandes.

A titre d’exemple très simple, voici l’analyse de 5*3+1 (les symboles # sont des fonds de pile ou d’expressions indiquant la fin)

Pas

Opérateurs (pile)

Opérandes (pile valeurs)

Expression (input)

action


La valeur 5 est d’abord stockée sur la pile des valeurs (opérandes), puis l’opérateur * sur la pile des opérateurs et enfin 3 sur les opérandes. Le deuxième opérateur rencontré (+)
étant moins prioritaire que *, on calcule (Réduction R) et on stocke le résultat dans la pile des valeurs.

Ensuite, le calcul s’achève en ajoutant + (pile opérateurs) et 1 (pile valeurs) et en calculant (RéductionR).

1

#

#

5*3+1 #

S

2

#

5

*3+1 #

S

3

*

5

3 +1 #

S

4

*

5  3

+1 #

R

5

#

#  15

+1 #

S

6

+

15

1 #

S

7

+

15  1

#

R

8

#

#  16

#

fin

 

Opérateur 2 (input)

Opérateur 1

+

-

*

:

#

+

R

R

S

S

R

-

R

R

S

S

R

*

R

R

R

R

R

:

R

R

R

R

R

#

S

S

S

S

Fin


Bien évidemment, les priorités des opérateurs les uns par rapport aux autres doivent être
scrupuleusement définis dans une table de priorités (voir ci-dessous la Table emloyée par le calculateur). 
Par exemple la mini table ci-contre (avec +, -, *, :) :

 

   

On retrouve les priorités classiques : * et : sont prioritaires sur + et - .
La table des priorités de MagiCalculator contient 36 opérateurs et certains codes d’erreurs. Toutes les fonctions  « utilisateurs »  ayant la même priorité définit par f0.
Pour ceux qui aiment « fouiller » dans le  code  de programmes, vous trouverez ici : variables+parseur    les variables globales ainsi que l’interpréteur/parseur de MagiCalculator en format .pdf. 
Cela représente actuellement la partie la plus essentielle (environ 1/5  du programme global). 
Dix calculateurs ont été créésen interne et interragissent uniquement pour l’étude de fonctions dont les définitions sont réutilisées pour créer de nouvelles fonctions, de façon imbriquées (un seul calculateur suffit pour tout le reste des calculs).
Cette façon de procéder permet de définir des fonctions utlisateurs dont la définition utilise également d'autres fonctions utilisateur…jusqu’à…10 imbrications, sans nécessité, pour l’utilisateur, d’utiliser un langage de programmation ou macros.
Les autres parties du programme de Magicalculator semblent moins intéressantes.

 Table des Priorités employée par le calculateur.
Tableau des priorités

La coordonnée x (1ère) représente l’opérateur rencontré en premier. La coordonnée y (2ème) représente l’opérateur qui suit dans l’expression. L’opérateur & remplace la multiplication* sous-entendue, non apparente (comme 2(4+8x) ou 1/2√3 etc..). La barre de fraction “/” est prioritaire sur*“, “+” ,”:et-mais pas sur&“.  
Toutes les fonctions définies par l’utilisateur (90 possibles) ont les mêmes priorités définies par celles de f0“. 
Quelques codes d’erreurs apparaissent, correspondant à des déséquilibres de parenthèses ou l’absence de paramètres nécessaires.
Par exemple, à la ligne 5 (/) l’opérateur fractionnaire “/” est prioritaire sur +, -, *(indiqué par R) mais n’est pas prioritaire sur “&” (qui est un*sous-entendu ) car indiqué par S.