Qu’est-ce que le code natif?

La section Web du projet (sous les propriétés du projet dans VS2008) contient une liste de débogueurs: ASP.NET, Code natif, SQL Server. Qu’est-ce que le code natif?

Le code natif est un code machine exécuté directement par la CPU. Cela contraste avec le bytecode .NET, interprété par la machine virtuelle .NET.

Un bon hit MSDN: le débogage de code natif

Le code natif ne s’exécute pas sur le Common Language Runtime (CLR). Un exemple serait une application C ++ non gérée.

Le code natif est essentiellement constitué de données en mémoire que la puce de traitement centrale de l’ordinateur peut lire et exécuter directement. Pensez au processeur qui aspire les données et que le basculement des données bascule au fur et à mesure, activant et désactivant les choses:

[ CPU ] ==================================== [ RAM ] ^^^^^ | | LOAD _memoryAddress12, D1 ; tells the CPU to get data from slot 12 ; in RAM, and put it in register D1 inside the CPU ^^^^^ | | ADD D1, 24 ; tells the CPU to do an internal calculation ^^^^^ | | STORE R0, _memoryAddress23 ; tells the CPU to put the answer into slot 23 in ram 

Vous pouvez penser aux instructions comme des cartes perforées, ou à ces choses de piano à musique, qui commutent les commutateurs dans le processeur au fur et à mesure de leur insertion. L’important est que cela se trouve dans HARDWARE: cela se passe littéralement sur des fils / circuits, presque à la vitesse de la lumière. Mais il y a beaucoup de commutateurs à retourner. Ainsi, chacune de ces “instructions natives” entrant dans la machine est exécutée à la “vitesse d’horloge” de la machine (environ 2,5 milliards de fois par seconde sur un PC moderne). En réalité, c’est un peu plus complexe, avec des instructions qui prennent un peu plus de temps, d’autres qui sont faites en même temps, etc.

Désormais, au contraire, les machines virtuelles exécutent du code non natif (souvent appelé bytecode), littéralement sur une fausse machine virtuelle . En ce qui concerne les langues, une machine virtuelle est un programme qui exécute un autre programme au lieu du programme qui s’exécute directement dans le matériel. Ainsi, là où le programme ci-dessus charge, ajoute des données et stocke un résultat dans seulement trois instructions natives, un programme virtuel pourrait faire quelque chose de plus semblable à ceci (Avertissement: il s’agit d’un code pseudo-assemblé rouillé):

  load _firstInstruction, D1 if_equal D1, 12 jump _itsAnAddInstructionHandleIt if_equal D1, 13 jump _itsASubstractInstructionHandleIt if_equal D1, 14 jump _itsAMultiplyInstructionHandleIt if_equal D1, 15 jump _itsADivideInstructionHandleIt if_equal D1, 16 jump _itsALoadInstructionHandleIt ... _itsALoadInstructionHandleIt: load D1, D2 add 4, D2 load D2, D3 return 

Etc. Ceci est juste un exemple de traitement d’une des instructions natives ci-dessus d’une manière non-native: environ 10 instructions (en fonction de l’implémentation) au lieu de la première instruction unique, native, et j’ai laissé de côté des détails importants, tels que le déballage des données! Le fait est que, probablement en moyenne environ 20 à 30 instructions plus tard, vous aurez accompli la même chose qu’UNE ligne du code natif ci-dessus.

À PRÉSENT. Cela dit, les BONNES machines virtuelles ont un JIT, qui peut en convertir une partie en code natif au fur et à mesure de leur exécution, ou juste avant de les exécuter. Mais il y a beaucoup de choses, comme les types Boxed, qui ne peuvent pas être converties directement, parce que le but principal d’une machine virtuelle est qu’elle ne fonctionne pas à bas niveau, de manière conviviale pour les circuits, que le code natif . Les machines virtuelles sont plus faciles à programmer, mais beaucoup plus lentement.

Un autre inconvénient majeur des machines virtuelles est qu’elles entraînent souvent une surcharge de mémoire, ce qui les rend plutôt inutiles si vous souhaitez coder des millions d’éléments de données tout en mémoire en même temps. Dans de tels cas, une machine virtuelle, bien que destinée à rendre le code de niveau supérieur et plus lisible, peut vous obliger à exécuter des tâches de niveau INFÉRIEUR et plus néfastes que le code natif, car les avantages commencent à devenir des inconvénients.

Pour commencer, le code natif est juste un langage intermédiaire conçu pour être exécuté sur un assemblage particulier. Il ressemble au code object comme dans d’autres HLL.