Étienne Baudoux // Notes

Simulateur d'algorithme

// 04/26/2015

Hello World !

Dans le cadre de mes travaux actuels, hier, j'ai rapidement développé un prototype permettant de simuler un algorithme en C#, le tout cross-plateforme. L'architecture du projet ressemble un petit peu à ce que j'ai déjà fait dans SoftwareZator (Action, ActionTools, CodeDom...etc pour ceux qui l'utilise).

Le Concept

Le concept est d'être capable de simuler et de déboguer un algorithme à l'exécution en utilisant du C#. Histoire d'avoir un challenge encore plus élevé, on veut que ça soit cross-plateforme.

Cela implique plusieurs choses :

Remarque : le code n'est pas très compliqué, mais l'architecture du projet est complexe car ça fait appel à beaucoup d'abstractions.

Soyez Indulgent

C'est juste un prototype ! Il n'y a pas de tests unitaires, pas beaucoup de commentaires ni de documentation.

Le simulateur n'est pas complet et pas très propre non plus. Il manque beaucoup de classes dans AlgorithmDom comparé à CodeDom. Il manque beaucoup d'interpréteurs, le support d'une simulation asynchrone qui ne bloque pas le reste de l'exécution...etc. C'est juste le minimum !

Comment Ca Marche

  1. Tout d'abord, on créer un projet, qui va représenter un programme avec des classes et des méthodes.
  2. Ensuite, on ajoute nos variables globales (c'est plus simple à gérer pour le simulateur).
  3. Dans une méthode du programme, on a un algorithme. Cet algorithme est représenté par une Action. Une action, dans SoftwareZator tout comme dans ce simulateur, est une partie d'un algorithme qui fait quelque chose. Par exemple :
    • Assigner une valeur à une variable
    • Lire un fichier
    • Faire une requête HTTP
    • Afficher un message
    • ...etc
  4. Et enfin, on démarre le simulateur.

Ce Que Fait Le Simulateur

  1. La première étape est de créer un dictionnaire qui contient une définition de chaque variable du projet et leurs valeurs associées.
  2. Ensuite, on commence à simuler/interpréter chaque action de l'algorithme.
  3. Pour cela, on affiche d'abord les informations de débogage, à savoir, les valeurs de chaque variable du projet (comme le fait Visual Studio sur un point d'arrêt en fait).
  4. On demande ensuite à l'action actuellement traitée de générer un AlgorithmDom (mon architecture type CodeDom en cross-plateforme).
  5. Et on va demander à l'interpréteur d'analyser cet AlgorithmDom et de simuler son exécution. Par exemple, si on détecte une assignation d'une variable, on va faire en sorte de changer la valeur de la variable dans le dictionnaire créé précédemment. Si on détecte un appel à une méthode, on va utiliser de la Reflection pour l'appeler et récupérer son résultat.
  6. En cas d'erreur durant l'exécution de l'algorithme (par exemple : on veut lire un fichier qui n'existe pas), on demande à l'action actuellement traitée d'essayer de donner plus d'information sur l'erreur, et on affiche le tout.

Vous voyez, ce n'est pas si compliqué que ça en fait. Par contre côté architecture, il vaut mieux un cachet d'aspirine.

Cas d'Utilisation

Voilà :)

Vous trouverez tous les codes sources sur mon GitHub.