93 votes

C# JIT compiler et .NET

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.

90voto

dthorpe Points 23314

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.

28voto

Mehrdad Points 70493

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.

9voto

Andy White Points 36586

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#.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X