Je suis devenu un peu confus sur les détails de la façon dont le compilateur JIT œuvres. Je sais que C# compile vers le bas à l'IL. La première fois qu'il est exécuté, il est JIT avais. Est-ce à impliquer elle se traduit en code natif? Est le .NET runtime (comme une Machine Virtuelle?) interagir avec le JIT avais le code? Je sais que c'est naïf, mais j'ai vraiment confus moi-même. Mon impression a toujours été que les assemblées ne sont pas interprétés par le .NET mais je ne comprends pas les détails de l'interaction.
Réponses
Trop de publicités?Oui, JIT avec code IL consiste à traduire le IL en natif des instructions machine.
Oui, l' .NET runtime interagit avec le JIT ed code machine natif, dans le sens que le moteur d'exécution possède les blocs de mémoire occupée par le code machine natif, le moteur d'exécution d'appels dans le code machine natif, etc.
Il est exact que l' .NET runtime ne pas interpréter le code IL dans vos assemblées.
Ce qui se passe lors de l'exécution atteint une fonction ou un bloc de code (par exemple, une clause else d'un bloc si) qui n'a pas encore été JIT compilé en code machine natif, l'équipe r est appelé à compiler ce bloc de IL en code machine natif. Lorsque cela est fait, l'exécution du programme entre le fraîchement émise à la machine d'exécuter du code, il est logique de programme. Si lors de l'exécution que le code machine natif exécution atteint un appel de fonction à une fonction qui n'a pas encore été compilé en code machine, l'équipe r est appelé à compiler que la fonction "juste à temps". Et ainsi de suite.
Le JIT r'n'est pas nécessairement le compiler toute la logique d'un corps de la fonction dans le code de l'ordinateur à la fois. Si la fonction a si les déclarations, les blocs d'instruction de l'if ou else clauses ne peuvent pas être JIT compilé jusqu'à l'exécution passe à travers le bloc. Les chemins de Code qui n'ont pas exécuté rester dans un formulaire IL jusqu'à ce qu'ils font exécuter.
L'compilé en code machine natif est gardé en mémoire, de sorte qu'il peut être utilisé à nouveau la prochaine fois que la section de code s'exécute. La deuxième fois que vous appelez une fonction, il sera exécuté plus rapidement que la première fois que vous l'appelez, car pas de JIT étape est nécessaire, la deuxième fois autour.
Dans le bureau .NET, le code machine natif est gardé en mémoire pour la durée de vie de l'appdomain. Dans .NET CF, le code machine natif peuvent être jetés si l'application est en cours d'exécution faible sur la mémoire. Il sera JIT compilé à nouveau à partir de l'original du code IL la prochaine fois que l'exécution passe par le biais de ce code.
Le Code est compilé dans le Microsoft Intermediate Language), qui est similaire à l'assemblée format.
Lorsque vous double-cliquez sur un fichier exécutable, le chargement de Windows mscoree.dll
qui définit alors la CLR de l'environnement et le démarrage de votre programme code. Le compilateur JIT commence à lire le code MSIL dans votre programme et compile dynamiquement le code x86 assemblée, qui le PROCESSEUR peut exécuter.
Si vous êtes intéressé par un livre sur le sujet de l'IL et de la baisse du niveau de stuff .NET, je suggère de regarder à CLR via C#.