JIT产生的机器代码已经是面向具体cpu指令集的代码了,直接由CPU执行就好了,就像C生成的机器码一样,为什么还要由CLR来执行呢,不懂。或者说,JIT产生的汇编代码和普通C产生的汇编代码有什么区别?

解决方案 »

  1.   

    你的理解就是错的...CLR是执行native code没错,但native code从哪里来的?.NET程序编译后只有IL code,除非你提前预编译生成native image,否则必须先调用JIT实时编译为native code(即首次执行时编译)...明白了?
      

  2.   

    JIT的编译机制我知道。
    我的疑问是对于JIT编译后的native code,它的执行需要CLR来完成吗 
      

  3.   

    你见过哪个native code能自己执行?必须要有进程调用才能执行...JIT只是个编译器,所以说你的理解是错的...
      

  4.   

    CLR最终执行的只有本地机器码,JIT编译的作用是在运行时将IL代码解析为机器码执行
      

  5.   

    怎么还不明白啊...比如有个C程序“test.exe”,显然它是native code...它应该怎么执行?你在资源管理器里双击或写到注册表的自动启动项等等,不管怎么做其实都是用shell进程在执行它...现在有个.NET托管程序“test.exe”,它是IL code...你用shell进程试图执行它时,因为它不是native code不能直接执行,所以shell需要调用CLR再由CLR执行它...如果它是预编译的native image就直接执行,如果不是查看cache是否有编译过的native image,有则直接执行没有则调用JIT编译后再执行同时将编译后的native image存入cache...明白了吗?IL code的native image对用户是不可见的,也体现了IL code的平台无关性...
      

  6.   

    还有一点...IL code的native image和native code最大的区别就是native image是依赖于.NET Framework环境才能运行的,所以必须CLR来调用...
      

  7.   

    比较清楚了,多谢。
    还有点小疑问,native image也是在Shell进程中执行的吗?
      

  8.   


    a new process started by shell.