Projet GL

En quoi a consisté ce projet?

Nous devions travailler en équipe de 5 sous le format Agile et produire un compilateur pour le langage Deca, un sous-langage de Java développé spécialement par l’école et interprêté par une machine maison également, codée en Ada. Nous disposions d’un squelette de code et d’une spécification particulièrement fournie et fouillie. Je me suis principalement concentré sur le développement du lexeur (partie relativement rapide mais qui a demandé des ajustements à chaque phase de test), sur la mise en place d’un circuit de tests automatique (en duo), sur le rapport énergétique de notre projet et sur l’extension trigonométrique que nous avions à produire.

Une extension trigonométrique?

Dans le cadre de ce projet, nous devions choisir une extension indépendante pour chaque groupe et qui impliquerait une phase de recherche pure (phase que nous n’avions pas ou peu à faire pour le reste du projet puisque le tout était dans la spécification). J’ai donc passé une semaine complète à faire des recherches et mes spécifications avant de commencer à coder. Comme nous avions un rapport d’une trentaine de pages à produire pour cette extension il était nécessaire que toute démarche soit expliquée, analysée et justifiée.

Pour des raisons techniques que je ne peux détailler ici pour des raisons évidentes, les solutions que j’ai trouvées me demandaient des opérations de décalage bit-à-bit et que je pouvais vraiment gagner énormément en performances en intégrant ces opérations dans la machine virtuelle fournie, j’ai intégré avec l’accord des enseignants, la modification de la machine donnée aux spécifications de notre extension.

Quelles ont été les difficultés?

La question serait plutôt quelle partie n’a pas été un problème?

Tout d’abord, il m’était nécessaire d’adapter dans des algorithmes en Deca (sous-langage de Java n’ayant pas de boucle for, donc c’est dire le nombre de choses dont on manquait) le peu de sources que j’avais sur les algorithmes pour l’extension. J’en ai trouvé en pseudo-code, en C, en C++, en python et en julia mais tous proposaient des implémentations différentes et avec des entiers 64 bits alors que je n’avais que des entiers 32 bits. Ensuite, un gros point noir a été la nécessité d’émuler de l’algorithmique 96 bits avec des entiers 32 bits pour appliquer mon meilleur algorithme et enfin, le PIRE point et celui qui a rendu l’application de cet algorithme un échec: les entiers négatifs en Ada ne sont pas codés en complément à deux.

Cela peut paraître idiot mais dites vous-bien que réaliser des opérations de décalage bit-à-bit implique une certaine représentation des entiers. Or, je n’avais jamais vu un système faire autrement que le complément à deux et trouver cette information sans savoir exactement ce que l’on cherche, c’est clairement mision impossible. J’ai tenté de produire des conversions, puis de décaler bit-à-bit et de reconvertir mais malheureusement, les cas en bordure posaient souci et on observe sur les courbes l’échec cuisant de mes tentatives.

Comparaison cosinus Comparaison sinus Comparaison arcsinus Comparaison arctangente Switch-over