Dans ce TP, nous allons revenir sur MatL et proposer une implémentation en Python pure.

Environnement virtuel et framework de tests

Lorsque l’on code en Python, on passe très vite par la création d’un environnement virtuel. Un virtualenv permet d’isoler l’installation de librairies tierce du système et d’éviter de polluer son système. Pour créer un virtualenv :

  1. placez-vous dans votre répertoire de travail (celui de votre repository) et tapez la commande suivante : $ virtualenv venv. Cela va créer un environnement virtuel dans le répertoire venv que vous pourrez activez quand vous voulez. Si la commande virtualenv n’est pas connue directement, utilisez à la place $ python3 -m venv venv, cela va créer un environnement virtuel venv, exactement comme la première commande.

  2. Avant d’activer votre environnement virtuel, ajoutez le répertoire venv à votre .gitignore pour ne pas le commiter

  3. Activez votre environnement virtuel de la manière suivante : source venv/bin/activate. Attention Si vous êtes sous windows, pour activer l’environnement virtuel, il est possible que la commande soit différente et qu’il faille aller chercher le venv\bin\activate.bat, si vous utilisez le sous-système linux sous windows, ça devrait être la même chose.

Une fois que le virtualenv est activé, vous pouvez installer le framework pytest pour écrire des tests unitaires.

  1. Activez votre virtualenv et installez pytest avec la commande pip install pytest.

COO - Diagramme de classe

Encore une fois, nous allons utiliser un diagramme de classe pour représenter les différents éléments proposés par le langage. Nous allons directement considérer les opérations binaires, opération unaire ainsi que l’utilisation et la définition de variables (donc Expressions, Statements, …​)

  1. Proposez un diagramme de classe représentant le système. Que peut-on remarquer par rapport aux types définit en OCaml ?

Just do it

Écrire les tests et implémenter MatL en Python. Pour faire ceci, il est nécessaire de faire deux choses fondamentales :

  1. Écrivez les classes correspondantes à tout les types d’expression, statements, …​ de MatL

  2. Donner des méthodes d’évaluation sur chacun de ces types pour calculer le résultat du tout.

  3. Écrivez les tests unitaires pour l’évaluation du langage.

  4. Quel est l’intérêt d’avoir une grosse hiérarchie de classe ?

S’il vous reste du temps

Normalement, si vous avez bien fait le diagramme de classe et que vous avez bien compris le principe de l’objet ici, le TP devrait être assez court. On va donc prendre du temps pour implémenter un simple analyseur de code qui permettra statiquement de vérifier que les variables utilisées ont bien été définies.

  1. Pour implémenter facilement ce comportement, nous avons besoin de traverser l’AST MatL. Nous allons utiliser pour ceci le principe d’un visiteur. Vous avez, au choix, la possibilité de coder le pattern visiteur ou, pour éviter de réimplémenter un tel comportement, d’utiliser le singledispatch proposé par Python. Si vous décidez d’utiliser le singledispatch, cherchez une documentation sur le net (c’est pas ce qui manque).

  2. Comment représenter les erreurs dans l’analyse de l’AST ? Proposer un type conservant les informations nécessaires.

  3. Implémenter l’analyse de l’AST en utilisant le single dispatch.

Associate professor in Computer Sciences

My research interests include language engineering, virtual machine and software engineering in general.