c# - C # JIT compilation et .NET




2 Answers

Oui, le code JIT'ing IL implique la traduction de l'IL en instructions machine natives.

Oui, le runtime .NET interagit avec le code machine natif JIT, dans le sens où le runtime possède les blocs de mémoire occupés par le code machine natif, les appels d'exécution dans le code machine natif, etc.

Vous avez raison que le runtime .NET n'interprète pas le code IL dans vos assemblys.

Que se passe-t-il lorsque l'exécution atteint une fonction ou un bloc de code (comme une clause else d'un bloc if) qui n'a pas encore été compilé JIT en code machine natif, le JIT'r est invoqué pour compiler ce bloc de IL en code machine natif . Lorsque cela est fait, l'exécution du programme entre dans le code machine fraîchement émis pour exécuter sa logique de programme. Si, lors de l'exécution de ce code machine natif, un appel de fonction à une fonction qui n'a pas encore été compilée en code machine est atteint, le JIT'r est invoqué pour compiler cette fonction "juste à temps". Etc.

Le JIT'r ne compile pas nécessairement toute la logique d'un corps de fonction en code machine à la fois. Si la fonction a des instructions if, les blocs d'instructions des clauses if ou else peuvent ne pas être compilés JIT jusqu'à ce que l'exécution passe effectivement par ce bloc. Les chemins de code qui n'ont pas été exécutés restent sous forme IL jusqu'à ce qu'ils soient exécutés.

Le code machine natif compilé est conservé en mémoire afin qu'il puisse être réutilisé la prochaine fois que cette section de code sera exécutée. La deuxième fois que vous appelez une fonction, elle s'exécute plus vite que la première fois que vous l'appelez, car aucune étape JIT n'est nécessaire la deuxième fois.

Dans le bureau .NET, le code machine natif est conservé en mémoire pour la durée de vie de l'appdomain. Dans .NET CF, le code machine natif peut être rejeté si l'application est à court de mémoire. Il sera compilé à nouveau à partir du code IL original à la prochaine exécution de ce code.

Je suis devenu un peu confus au sujet des détails du fonctionnement du compilateur JIT. Je sais que C # compile jusqu'à IL. La première fois qu'il est lancé c'est JIT'd. Cela implique-t-il qu'il soit traduit en code natif? L'environnement d'exécution .NET (en tant que machine virtuelle?) Interagit-il avec le code JIT? Je sais que c'est naïf, mais je me suis vraiment perdu. Mon impression a toujours été que les assemblys ne sont pas interprétés par le .NET Runtime mais je ne comprends pas les détails de l'interaction.




.NET utilise un langage intermédiaire appelé MSIL, parfois abrégé en IL. Le compilateur lit votre code source et produit MSIL. Lorsque vous exécutez le programme, le compilateur .NET Just In Time (JIT) lit votre code MSIL et produit une application exécutable en mémoire. Vous ne verrez rien de tout cela, mais c'est une bonne idée de savoir ce qui se passe dans les coulisses.




Related


Tags

c#   jit