Q1) Pourquoi C # est-il initialement compilé à IL puis à l'exécution JIT-JIT et exécuté au sommet d'une machine virtuelle (?). Ou est-ce que JIT s'est conformé au code de machine natif? p>
Q2) Si la seconde est vraie (JIT conforme à un code de machine natif), où est la cassette de sable .NET, le code est exécuté sous? p>
Q3) De plus, pourquoi le code est-il compilé à IL en premier lieu. Pourquoi ne pas simplement compiler au code de la machine natif tout le temps? Il y a un outil de MS de celui-ci appelé NGen mais pourquoi est-ce facultatif? P>
6 Réponses :
L'IL est Jit'd (Jit = Juste à temps) compilé au code de la machine natif car le processus fonctionne. p>
L'utilisation d'une couche de machine virtuelle permet à .NET de se comporter de manière cohérente à travers les plates-formes (par exemple, une INT est toujours de 32 bits, que vous soyez dans une machine de 32 ou 64 bits, ce n'est pas le cas avec C ++). P>
La compilation JIT permet aux optimisations de vous adapter dynamiquement au code tel qu'il s'exécute (par exemple, appliquer des optimisations plus agressives aux bits de code appelé fréquemment, ou utilisez des instructions matérielles disponibles sur la machine spécifique comme SSE2) que vous pouvez '. T faire avec un compilateur statique. p>
Il permet également d'optimiser en fonction de l'environnement. Le CLR est dans.
1. strong> C # est compilé dans CIL (ou IL) car il partage une plate-forme avec le reste des langues .NET (c'est pourquoi vous pouvez écrire une DLL en C # et l'utiliser Vb.net ou f # sans tracas). Le CLR sera alors JIT compiler le code dans le code de machine natif. P>
.NET peut également être exécuté sur plusieurs plates-formes (mono sur * Nix et OS X). Si C # compilé au code natif, cela ne serait pas aussi facile. P>
A1) de cette façon, c'est une plate-forme agnostique (Windows, Linux, Mac) et peut également utiliser des optimisations spécifiques pour votre matériel actuel. Quand il devient JIT compilé, il est au code de la machine. P>
A2) Toute la structure (The .NET Framework) est tout Sandbox, de sorte que tous les appels que vous pourriez faire via votre application passeront à travers la boîte de sable. P>
A3) Comme dans la réponse 1, il permet au Binaire .NET de fonctionner dans différentes plates-formes et d'effectuer des optimisations spécifiques dans la machine client à la volée. P>
Vous pouvez utiliser NGEN pour créer versions natives de vos assemblages .NET. Cela signifie que le JIT n'a pas à le faire au moment de l'exécution. P>
.NET est compilé vers IL d'abord, puis à Native, car le JIT a été conçu pour optimiser le code IL pour la CPU actuelle, le code est exécuté. P>
.NET code est compilé à IL pour la compatibilité. Puisque vous pouvez créer du code à l'aide de C #, VB.NET, etc., le JIT a besoin d'un ensemble d'instructions communes (IL) afin de compiler au code natif. Si le JIT devait être au courant des langues, la JIT devait être mise à jour lorsqu'une nouvelle langue .NET a été publiée. P>
Je ne suis pas sûr de la question de la boîte à sandbox, ma meilleure hypothèse est qu'une application .NET fonctionne avec 3 domaines d'application. Un domaine contient les roulements .NET (mscorlib, system.dll, etc.), un autre domaine contient votre code .NET et je ne me souviens pas de ce que l'autre domaine est. Découvrez http://my.safaribooksonline.com/9780321584090 p>
Le code .NET compilé devient IL qui est une langue intermédiaire de la même manière que celle du code d'objet Javas. Oui, il est possible de générer du code de machine natif à l'aide du NGEN Outil. Ngen lie l'image native résultante à la machine, de copier ainsi que le Ngen'd binaire à un système différent ne produirait pas de résultats attendus. La compilation du code intermédiaire permet de prendre des décisions d'exécution pouvant être apportées autrement (facilement) à effectuer (facilement) avec une langue frappée staticly comme C ++, elle permet également le fonctionnement du code sur différentes archéres matérielles, car le code devient alors descriptif dans la Sens que cela décrit également l'intention de ce qui devrait se passer d'un peu (par exemple 32 ou 64) -Agnostique, par opposition au code spécifique à la machine qui ne fonctionne que sur des systèmes 32 bits ou des systèmes de 64 bits, mais pas tous les deux. p>
En outre, NGen est facultatif car, comme je l'ai dit, il lie le binaire au système, il peut être utile lorsque vous avez besoin de la performance du code machine compilé avec la flexibilité d'une langue dactylographiée dynamiquement et vous savez que le binaire ne sera pas se déplacer sur un système que ce n'est pas lié. p>
a1) JIT compile au code de machine natif p>
A2) Dans .NET Il n'y a pas de sélecteur de sable. Il y a des applications à la place. Et ils fonctionnent dans le cadre de CLR (c'est-à-dire dans le cadre du processus exécutable) p>
A3) Les inconvénients ngen de Jeffrey Richter: p>
Les fichiers NGen'D peuvent sortir de la synchronisation. Lorsque le CLR charge un fichier NGen'D, il compare un Nombre de caractéristiques sur le code précédemment compilé et l'exécution en cours environnement. Si l'une des caractéristiques ne correspond pas, le fichier ngen'd ne peut pas être utilisé et le processus normal du compilateur JIT est utilisé à la place. P> li>
performances de charge de charge inférieure (rebasing / liaison). Les fichiers d'assemblage sont des fichiers Windows PE standard et, en tant que tels, chacun contient une adresse de base préférée. Beaucoup de fenêtres Les développeurs connaissent les problèmes liés aux adresses de base et à la reconditionnement. Lorsque le code de compilation JIT, ces problèmes ne sont pas une préoccupation car les références d'adresses de mémoire correctes sont calculées au moment de l'exécution. P> LI>
performance de l'exécution inférieure. Lors de la compilation de code, NGEN ne peut pas faire autant de hypothèses sur l'environnement d'exécution en tant que compilateur JIT. Ce qui provoque Ngen.exe pour produire du code inférieur. Par exemple, Ngen n'oblisera pas l'utilisation de certaines instructions de la CPU; Il ajoute des indirections pour l'accès statique sur le terrain car la réelle L'adresse des champs statiques n'est pas connue tant que l'heure d'exécution. NGen insère le code pour appeler la classe constructeurs partout parce qu'il ne connaît pas l'ordre dans lequel le code sera exécuté et si un constructeur de classe a déjà été appelé. p> li> ul>
Une bonne réponse à Pourquoi il? A > Par quelqu'un qui travaille sur le compilateur C #.