Savez vous comment exactement fonctionne la CPU? avez vous dejà un jour pensé à comment on programme réellement en code machine? comment fonctionne exactement les machines virtuelles (par exemple vmware ou virtualbox) ou les machine virtuel des langages type JVM de java ou CLR de microsoft dotnet?
Dans cet article nous allons essayé de répondre à ces questions en construisant une machine virtuelle, qui dit machine virtuelle dit CPU, sans CPU, il serait impossible de mettre en place une machine digitale, donc le processeur est le coeur des plateforme digitale et c'est grace à la CPU que toute la magie du monde digitale fonctionne. Comprendre de manière claire toutes les abstractions qui se cachent derrière la CPU permet au developpeur de coder avec rassurance et avec beaucoup de connaissances en cause, car un developpeur qui comprend et sait exactement ce qui se passe techniquement au niveau des code machine d'une CPU, est un developpeur aguerit et qui peut mieux coder et projecter son propre syteme d'information et surtout est capable de faire facilement un "Troubleshooting" quand il s'agit de detecter les BUG et comprendre les erreurs meme- les failles de sécurités.
Il existe sur le marché, plusieurs concepteur de CPU, chaque concepteur fournit la CPU avec ses instructions basées sur ce qu'on appelle les OPCODES, en fait la CPU est projecté de manière que pour chaque OPCODE, il puisse etre capable de faire une operation et de retourner un résultat, donc il peut y avoir un OPCODE pour dire par exemple ajoute un nombre lu dans telle zone de mémoire au nombre present dans tel registre de la CPU, ou encore un OPCODE qui peut dire lit la valeur contenu dans telle ou telle zone de la mémoire et envois cette valeur à l'ecran, ou bien encore, prend telle valeur qui se trouve dans le registre et multiplie le par telle autre valeur qui se trouve dans tel autre registre de la CPU et le resultat finale tu le met dans telle ou telle autre zone de la mémoire, donc en quelque sorte, chaque CPU vient avec ses OPCODES cablés dans la CPU.
Que se passe t'il effectivement quand nous écrivons notre code dans un langage de programmation et que l'utilisateur doit executer notre application et donc notre code?
Comme vous l'avez immaginez,votre code doit etre traduit en code machine, c'est ça que font les machines virtuelles comme la JVM de java, ou la CLR de C#, ou meme le compilateur de C, pour le traduire en code machine, les concepteurs de la JVM, de la CLR ou du compilateur de C, doivent connaitre la CPU de destination et toutes les instructions de cette CPU donc tous les OPCODE de cette CPU, en fait tout vos variables et methode que vous ecrivez, doit simplement etre traduit en instruction comprehensible par la CPU et ces instructions c'est justement une suite de OPCODE, donc les compilateurs transforment votre code en une suite binaire fait des OPCODES, et le systhème d'exploitation, charge cette suite d'instructions en mémoire et indique au processeur que voilà, l'utilisateur a executé tel programme, j'ai mis la suite d'instruction contenant les OPCODES à partir d etelle addresse en mémoire, vas y commence à partir de cette addresse et execute l'application, la CPU lit donc la première instruction dans cette addresse, decode l'OPCODE et comprend ce qu'il doit faire comme commande et l'execute, il tient compte de la commande suivante à executer dans ce qu'on appelle "Execution counter" donc un pointeur sur la zone mémoire qui contient la prochaine instruction à executer, ainsi, la CPU peut lire instruction par instruction jusqu'à executer tout votre programme. Eh bien chers amis, vous avez noté la la machine de turing donc j'en parlais sur cet article ? pour ceux qui ne l'ont pas lu, je leur demande de relire cet article pour comprendre exactement de quoi on parle.
Pour creer une machine virtuelle, il suffit de creer une CPU virtuelle, donc vous en tant que developpeur, vous pouvez simulez une CPU et du coup mettre sur pieds vos propres OPCODES et ainsi, si vous recevez n'importe quelles instructions fait de vos PROPRES OPCODES, votre machine virtuel sera à mesure de le decoder et de l'executer, c'est exactement comme ça que fonctionne la JVM ou la CLR et c'est la meme chose que fonctionne les VMWARE ou les virtualbox, les developpeurs qui l'ont implementés, on juste definit leur propres instructions et l'ont implementés et quand vous ecrivez du code en java, c'est plutot traduit en ces OPCODES maison et la machine virtuelle ne fait rien d'autre que d'executer ces OPCODES maison. c'est cela que nous allons construire dans cet artile à savoir une machine virtuelle qui s'appelle SIMPLETRON, je prends l'exemple de l'excellent livre de D.Deitel "C How To Program" ou il invente cette machine virtuelle, dans le livre il l'aborde dans le contexte du langage C, c'est un excellent livre comme d'ailleur toutes les series D. Deitel d'ailleur, mais ici sur mon compte github, j'ai recodé pas à pas le meme SIMPLETRON en c# surtout avec les windows FORM donc visuel pour que vous ayez à vu d'oeil exactement comment la CPU TRAVAILLE.
Comment fonctionne la machine virtuelle SIMPLETRON?
Le Simpletron exécute des programmes écrits dans le seul langage qu'il comprend directement, c'est-à-dire le langage machine Simpletron ou SML en abrégé.
Le Simpletron contient un accumulateur - un "registre spécial" dans lequel les informations sont placées avant que le Simpletron n'utilise ces informations dans des calculs ou ne les examine de diverses manières. Toutes les informations dans le Simpletron sont traitées en termes de mots (word en anglais). Un mot est un nombre décimal à quatre chiffres tel que +3364, -1293, +0007, -0001, etc. Le Simpletron est équipé d'une mémoire de 100 mots (notre machine virtuelle aura une mémoire RAM capable de contenir uniquement 100 MOTS du langage machine simpletron), et ces mots sont référencés par leurs numéros d'emplacement 00, 01, …, 99. Avant d'exécuter un programme SML, nous devons charger ou placer le programme en mémoire. La première instruction (ou déclaration) de chaque programme SML est toujours placée à l'emplacement 00. Chaque instruction SML occupe un mot de la mémoire du Simpletron donc en fait une case mémoire doit contenir exactement une instruction fait d'un mot du code machine simpleton, de sorte que les instructions sont des nombres décimaux à quatre chiffres avec signe. Nous supposons que le signe d'une instruction SML est toujours plus(+), mais le signe d'un mot de données/data peut être plus(+) ou moins(-). Chaque emplacement de mémoire Simpletron peut contenir une instruction, une valeur de données utilisée par un programme ou une zone de mémoire inutilisée (et donc indéfinie). Les deux premiers chiffres de chaque instruction SML sont le code d'opération spécifiant l'opération à effectuer ce que j'ai appellé plus haut des OPCODES. Les codes d'opération SML(OPCODES) sont résumés dans le tableau suivant (c'est en anglais mais c'est comprehensif les gars pas besoin de l'expliquer) :

Les deux derniers chiffres d'une instruction SML sont l'opérande, c'est à dire l'emplacement de mémoire contenant le mot auquel s'applique l'opération.
Considérons plusieurs programmes SML simples. Le programme SML suivant lit deux nombres sur le clavier, puis calcule et imprime leur somme :

L'instruction +1007 lit le premier nombre du clavier et le place à l'emplacement 07. Puis +1008 lit le nombre suivant le place à l'emplacement 08. L'instruction de chargement, +2007, copie le premier nombre dans l'accumulateur(le registre). L'instruction d'addition, +3008, ajoute le deuxième nombre au nombre dans l'accumulateur. Toutes les instructions arithmétiques SML laissent leurs résultats dans l'accumulateur. L'instruction de stockage, +2109, copie le résultat de l'accumulateur et le place dans l'emplacement de mémoire 09, à partir duquel l'instruction d'écriture, +1109, prend alors le nombre et l'imprime sous la forme d'un nombre décimal à quatre chiffres signé à l'écran. L'instruction d'arrêt, +4300, termine l'exécution.
Le programme SML suivant lit deux nombres sur le clavier, puis détermine et imprime la plus grande valeur :

L'instruction +4107 est un transfert de contrôle conditionnel, comme une instruction if. Maintenant, écrivez des programmes SML pour accomplir chacune des tâches suivantes.
a) Utilisez une boucle contrôlée par une sentinelle pour lire des entiers positifs, puis calculez et imprimez leur somme.
b) Utilisez une boucle contre-contrôlée pour lire sept nombres, certains positifs et d'autres négatifs. Calculez et imprimez leur moyenne.
c) Lire une série de nombres. Déterminez et imprimez le plus grand nombre. Le premier nombre lu indique combien de nombres doivent être traités.
Dans mon compte github ici, vous pouvez trouver une implementation de cette machine virtuelle en C# et d'ailleur il existe cette machine dans plusieurs langages partout sur le net, la particularité comme je vous aid dit est que dans mon implementation, j'ai voulu que ça soit visuel, pour vous donner un in unt direct, pour ceux qui ne veulent pas telecharger le code parcequ'ils n'ont jamais fait c# et ne veulent pas s'avventurier (mais si vous ne connaissez pas c# de nos jours c'est une erreure, c'est un très bon langage et qui a fait C ou java ou C++ comprend à la volée le C#), j'ai preparé pour vous directement l'executable produit et mis ici sur mon google drive

dans le zip, en rouge vous avez l'executable de cette machine virtuelle (bref c'est pour vous faire voir comment internement lea CPU fonctionne), en vert c'est par exemple la serie d'instruction pour additionner deux nombres
Quand vosu lancer l'executable vous avez ceci:

en rouge en fait c'est la zone mémoire du CPU(de la machine virtuelle vide), si vous copiez le code d'exemple d'addition de deux nombres et le coller dans l'espace en vert immaginez que quand vous compiler votre code java, ou javascript ou c# etc.. il vous produit un bytecode, oui dans l'espace en vert c'est notre bytecode disons et en bleu quand on clique sur "Charger le programme en mémoire" c'est un peu comme quand un utilisateur clique sur notre app dans windows ou android et windows decide de chargé le bytecode de la app en mémoire donc il doit remplir cette serie d'instruction en mémoire et donne la commande à la CPU, justement en orange nous avons "demarrer l'execution à partir de l'addresse 0" qui est exactement ce que le système d'exploitation demande à la CPU de faire quand il charge le code en mémoire et la CPU prend le relais et commence à le faire pas à pas, mais ici pour bien comprendre ce qui se passe, j'ai mis un autre bouton "executer l'instruction suivante" pour aller pas à pas ainsi chacun peut comprendre comment la machine virtuelle (CPU virtuelle) décode le langage machine SML que nous avons inveté puis execute les OPCODES exactement comme nous avons implementés, la suite en image.






Voilà en grande ligne comment on crée une machine virtuel, que ça soit une machine qui emule le hardware comme les vmware et virtualbox que vous utilisez pour avoir plusieurs système d'exploitation sur le meme ordinateur ou bien que ça soit les machines virtuelles des langages de programmation, il s'agit simplement d'emuletr le fonctionnement d'une CPU, chaque concepteur de CPU a ses propres OPCODES et c'est pourquoi generalement on passe par les machines virtuel comme la JVM en java ou la CLR en c#, et meme les machines virtuelles de python ou de javascript pour permettre la portabilité du code car s'il n'y avait pas de machine virtuelle, les developpeur devait produire du code machine compatibles à chaque type de CPU car chaque CPU a ses propres instructions exactement comme les instructions du langage machine simpletron qui est d'ailleur tres tres simpliste.
Happy coding
Vraiment génial cette explication terre a terre du cpu si vous pouvez nous édifié également sur la dans la suite des fonctionnement des cpu avec programmationnn parallèle /parallélisme autrement comment exploiter ses cou et repartir son programme sur ces cpu
03.02.2023, 16:13
LarrySig Guest
24.05.2024, 18:18
Post: Comment fonctionnent Internement les guichets automatiques ?
Orvilledop Guest
22.05.2024, 00:57
Post: Comment fonctionnent Internement les guichets automatiques ?
Orvilledop Guest
15.05.2024, 16:04
Post: Comment fonctionnent Internement les guichets automatiques ?
Franck Guest
14.05.2024, 19:34
Post: Comment deployer un site web statique sur github?