[c#] C # JIT compilation et .NET



Answers

Le code est "compilé" dans Microsoft Intermediate Language, qui est similaire au format d'assembly.

Lorsque vous double-cliquez sur un exécutable, Windows charge mscoree.dll qui configure ensuite l'environnement CLR et démarre le code de votre programme. Le compilateur JIT commence à lire le code MSIL dans votre programme et compile dynamiquement le code en instructions x86, que le processeur peut exécuter.

Question

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.




Je vais décrire compiler le code IL dans les instructions CPU natives via l'exemple ci-dessous.

public class Example 
{
    static void Main() 
    {
        Console.WriteLine("Hey IL!!!");
    }
}

Principalement, CLR connaît tous les détails sur le type et la méthode appelée à partir de ce type, cela est dû aux métadonnées.

Lorsque CLR commence à exécuter IL dans une instruction UC native, CLR alloue des structures de données internes pour chaque type référencé par le code Main.

Dans notre cas, nous n'avons qu'un seul type de console, donc CLR va allouer une structure de données interne via cette structure interne, nous gèrerons l'accès aux types référencés

à l'intérieur de cette structure de données CLR a des entrées sur toutes les méthodes définies par ce type. Chaque entrée contient l'adresse où l'implémentation de la méthode peut être trouvée.

Lors de l'initialisation de cette structure, CLR définit chaque entrée dans FUNCTION non documentée contenue dans CLR lui-même. Et comme vous pouvez le deviner, cette fonction est ce que nous appelons le compilateur JIT.

Dans l'ensemble, vous pouvez considérer JIT Compiler comme une fonction CLR qui compile IL en instructions CPU natives. Permettez-moi de vous montrer en détails comment ce processus sera dans notre exemple.

1.Lorsque Main lance son premier appel à WriteLine, la fonction JITCompiler est appelée.

La fonction du compilateur 2.JIT sait quelle méthode est appelée et quel type définit cette méthode.

3. Ensuite, le compilateur Jit recherche dans l'assemblage où ce type est défini et obtient le code IL pour la méthode définie par ce type dans notre cas, le code IL de la méthode WriteLine.

Le compilateur 4.JIT alloue un bloc de mémoire DYNAMIC , après quoi JIT vérifie et compile le code IL dans le code CPU natif et enregistre ce code CPU dans ce bloc de mémoire.

5. Ensuite, le compilateur JIT retourne à l'entrée de la structure de données interne et remplace l'adresse (qui fait principalement référence à l'implémentation du code IL de WriteLine) par un nouveau bloc de mémoire créé dynamiquement qui contient les instructions CPU natives de WriteLine.

6.Enfin, la fonction JIT Compiler saute au code dans le bloc mémoire. Ce code est l'implémentation de la méthode WriteLine.

7.Après l'implémentation de WriteLine, le code retourne au code Mains qui continue l'exécution normalement.




Related



Tags

c# c#   jit