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 :
- Il me sera impossible d'utiliser CodeDom ou Roslyn pour compiler et exécuter du code au runtime.
- Il me sera également impossible d'utiliser le Débogueur Windows car il est impossible d'y faire appel depuis une application WinRT par exemple.
- Ainsi, je vais donc créer ma propre architecture ressemblant à CodeDom, que je vais appeler "AlgorithmDom".
- Et je vais créer un interpréteur qui va analyser l'AlgorithmDom et réaliser des actions en fonction de ça.
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
- Tout d'abord, on créer un projet, qui va représenter un programme avec des classes et des méthodes.
- Ensuite, on ajoute nos variables globales (c'est plus simple à gérer pour le simulateur).
- 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
- Et enfin, on démarre le simulateur.
Ce Que Fait Le Simulateur
- 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.
- Ensuite, on commence à simuler/interpréter chaque action de l'algorithme.
- 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).
- On demande ensuite à l'action actuellement traitée de générer un AlgorithmDom (mon architecture type CodeDom en cross-plateforme).
- 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.
- 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
- N'importe quelle application d'apprentissage de l'algorithmique (SoftwareZator, Spark, Scratch...).
- Si vous voulez télécharger une partie de votre application depuis internet (une sorte de plugin/extension) avec WinRT et que vous voulez l'exécuter. Il me semble qu'on ne peut pas charger un Assembly à l'exécution avec WinRT. Ainsi, télécharger un algorithme et l'exécuter peut être une solution, selon vos besoins évidemment.
Voilà :)
Vous trouverez tous les codes sources sur mon GitHub.