Question

Q1) Pourquoi le C# initialement compilé à l'IL et puis au moment de l'exécution JIT respecté et exécuté sur une machine virtuelle(?).Ou est-ce JIT respecté le code machine natif?

Q2) Si le deuxième est vrai (JIT respecté le code machine natif), alors où est la .NET sandbox le code s'exécute sous?

Q3) En outre, pourquoi le code compilé à IL en premier lieu.Pourquoi ne pas tout simplement compiler en code machine natif de tous les temps?Il est un outil de MS à partir de ce qu'on appelle ngen mais pourquoi est-ce une option?

Était-ce utile?

La solution

L'IL est JIT'd (JIT = Just In Time) compilé en code machine natif que le processus fonctionne.

L'utilisation d'une couche de machine virtuelle permet .NET de se comporter d'une manière cohérente sur toutes les plateformes (par exemple, un int est toujours 32 bits indépendamment du fait que vous utilisez sur une machine 32 bits ou 64-, ce n'est pas cas avec C ++).

compilation JIT permet Optimisations de s'adapter dynamiquement au code tel qu'il fonctionne (par exemple, appliquer Optimisations plus agressives pour des bouts de code qui sont fréquemment appelés, ou utiliser des instructions matérielles disponibles sur la machine spécifique comme SSE2) que vous pouvez » t faire avec un compilateur statique.

Autres conseils

A1) JIT compile en code machine natif

A2) Dans .net il n'y a pas de terme comme bac à sable. Il y a lieu AppDomains. Et ils exécute dans le cadre de CLR (à savoir dans le cadre du processus exécutable)

A3) NGen inconvénients de Jeffrey Richter:

  • Les fichiers peuvent NGen'd se désynchroniser. Lorsque le CLR charge un fichier NGen'd, il compare une nombre de caractéristiques sur le code compilé précédemment et l'exécution en cours environnement. Si l'une des caractéristiques ne correspondent pas, le fichier ne peut pas être NGen'd utilisé, et le processus de compilation JIT normale est utilisée.

  • Performance-temps de chargement Inferior (rebasage / Reliure). Les fichiers d'assemblage sont standard les fichiers Windows PE et, en tant que tel, chacun contient une adresse de base préférée. De nombreuses fenêtres Les développeurs sont familiers avec les questions entourant les adresses de base et rebasage. Lorsque la compilation du code JIT, ces questions ne sont pas une préoccupation parce que les références d'adresse mémoire correcte sont calculés au moment de l'exécution.

  • Performance d'exécution temps Inferior. Lorsque la compilation du code, NGen ne peut pas faire autant hypothèses sur l'environnement d'exécution comme la boîte de compilateur JIT. Ce qui provoque Ngen.exe pour produire du code de qualité inférieure. Par exemple, NGen n'optimise l'utilisation de certaines instructions CPU; il ajoute indirections pour l'accès au champ statique parce que le réel adresse des champs statiques est pas connu avant l'exécution. NGen insère le code à la classe appeler constructeurs partout parce qu'il ne connaît pas l'ordre dans lequel le code exécutera et si un constructeur de classe a déjà été appelé.

Vous pouvez utiliser NGEN pour créer des versions natives de votre .NET assemblées.Faire cela signifie que l'équipe n'a pas à le faire au moment de l'exécution.

.NET est compilé à l'IL d'abord et ensuite natif depuis le JIT a été conçu pour optimiser le code IL pour le CPU actuel, le code s'exécute.

.NET code est compilé pour IL pour assurer la compatibilité.Puisque vous pouvez créer un code à l'aide de C#, VB.NET, etc ensuite, l'équipe a besoin d'un commun jeu d'instructions (IL) afin de compiler en code natif.Si l'équipe devait être au courant de langues, l'équipe aurait besoin d'être mis à jour lorsqu'une nouvelle .NET langage a été publié.

Je ne suis pas sûr au sujet de la sandbox question, ma meilleure supposition est que l' .NET app fonctionne avec 3 domaines d'application.Un domaine contient le .NET runtimes (mscorlib, system.dll, etc), un domaine autre que contient votre .NET code, et je ne me souviens pas de ce que l'autre domaine pour.Découvrez http://my.safaribooksonline.com/9780321584090

1. C # est compilé dans CIL (ou IL), car il partage une plate-forme avec le reste des langages .NET (ce qui est la raison pour laquelle vous pouvez écrire une DLL en C # et l'utiliser dans VB.NET ou F # sans tracas). CLR sera ensuite JIT compiler le code en code machine natif.

.NET peut également être exécuté sur plusieurs plates-formes (Mono * NIX et OS X). Si C # compilé en code natif, ce ne serait pas presque aussi facile.

2. Il n'y a pas bac à sable.

3. Couvert dans la réponse à # 1

A1) De cette façon, sa plate-forme agnostique (Windows, Linux, Mac) et il peut également utiliser des optimisations spécifiques pour votre matériel actuel. Quand il se JIT compilé il est en code machine.

A2) Le cadre complet (le framework .NET) est tout bac à sable tout ce que vous pourriez faire appel à travers votre application passera par le bac à sable du framework .NET.

A3) Comme la réponse 1, il permet le binaire .NET pour travailler dans différentes plates-formes et d'effectuer des optimisations spécifiques dans la machine cliente à la volée.

Code compilé Net devient IL qui est un langage intermédiaire de la même manière précise que celle du code objet de Javas. Oui, il est possible de générer du code machine natif à l'aide de l'outil NGen . NGen lie l'image native résultante à la machine, la copie si le binaire ngen'd à un autre système ne produirait pas les résultats escomptés. Compiler le code intermédiaire permet des décisions d'exécution qui peuvent être faites qui peuvent par ailleurs pas (facilement) être fait avec un langage statiquement typé comme C ++, il permet aussi le fonctionnement du code sur différents archetectures matériels car le code devient alors descriptif dans le sens qu'il décrit également l'intention de ce qui devrait se produire dans un peu (par exemple 32 ou 64) façon -agnostic, par opposition à un code spécifique à la machine qui ne fonctionne que sur les systèmes ou les systèmes 64 bits 32 bits mais pas les deux.

En outre, NGen est facultative parce que je l'ai dit 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'un langage typé dynamiquement et vous savez que le binaire ne sera pas se déplacer à un système, il est pas lié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top