不一样也有jit在运行时,编译il吗?区别是不是这样的解释型的,向流一样连解释成二进制连喂给cpu 比如java而C#.net是 先由jit把il代码在运行进 给完全 编译成binary code再喂给cpu求鉴定。

解决方案 »

  1.   

    语言本身无所谓解释不解释,解释是代码的执行方式。比如在Ch这样的C++解释器里面,C++代码也可以以解释的方式执行。C#的编译器里微软的.Net Framework使用的比较多,这个编译器是把代码编译成MSIL,CLR的JIT再把MSIL编译成本地CPU特定的代码,最后是直接执行的本地代码,而不是加载一个程序之后再通过这个程序执行代码。
      

  2.   

    编译性和解释性,那是对于C和JavaScript这种经典的案例来作区分的。但是C#,Java这种新的东西已经模糊了这个概念。JIT的确类似解释器,但是C#是可以预编译的(NGEN),那种情况下又是纯编译的。所以就不要强行去判定到底是编译还是解释。如果lz有空看看IE 9之类的JavaScript引擎,那你会发现JavaScript也同时有编译器和解释器了。为了解决性能问题,很多语言最后都不那么纯粹了。
      

  3.   

    NET Framework,一个运行在操作系统Windows之上的软件虚拟机。开发出来的程序经过编译之后,生成的可执行程序实际上包含的只是MSIL指令代码,这是一种托管代码,只能运行在.NET虚拟机之上。
    托管EXE文件被调用时,Windows先加载该文件,发现其.idata部分记录了要把MSCorEE.dll加载到进程的地址空间.加载了MSCorEE.dll后,加载器获得_CorExeMain函数的地址,同时修正托管EXE中的stub函数的JMP指令。进程的主线程开始执行修正后的x86 stub函数,该函数会跳转到_CorExeMain函数上,_CorExeMain函数开始初始化CLR,并查看可执行程序集的CLR表头以确定要执行的托管入口点方法。随后IL代码被翻译成本地CPU指令。CLR跳转到编译后的本地CPU指令上,至此,托管应用程序开始真正运行。
      

  4.   

    不管是编译型还是解释型都要先编译成中间代码树(P-CODE),接下来的处理决定是编译还是解释,编译型是直接编译成硬件CPU指令,这是在编译时完成的;而解释型是编译时只生成中间代码,到运行时在内存里生成解释器,解释器实际是软件CPU,它有自己的指令,由它运行中间指令。两者的差别也就是如此,因此有些语言像vb6即可生成解释型代码,也可以生成编译型。编译型因为是编译时代码就已固化成直接硬件指令,所以它不灵活,不仅不能在不同CPU执行,也不能根据软件环境的变化作自动调整,而解释型却能做到这一点,所以现在多数新语言(Python,Ruby)都是解释型。
    java和C#其实也是解释性,只是它的解释器比较特殊,jit实际是个运行时编译器(把中间代码专成硬件指令),所以说它是编译型也说得过去。实际C#做成编译型对微软来说很容易,vb6就是一个例子,但前面已提到编译型不灵活,如果编译时已固化成硬件指令,那么象反射这样的功能就没法使用,许多反射相关的操作需要运行时动态生成代码,而.net中的许多库都大量使用反射。
      

  5.   

    CLR的执行代码是Native Code...再说了,编译型语言未必就比解释型语言执行效率低,并不是绝对的...
      

  6.   

    这个问题值得顶一下,我也很想多学习了解一些CLR和.Net底层的东西,希望众位大侠多多讨论。
      

  7.   

    C#本来就是解释型语言。我很奇怪一直有很多人认为是属于编译型语言。这个问题都是盖棺定论的了。参考维基百科:
    http://en.wikipedia.org/wiki/Interpreted_language
      

  8.   

    补充下,说的是.NET Framework下的C#
      

  9.   

    用ngen预先搞过的还算解释型么?
      

  10.   

    首先ngen一般是不推荐使用的,可以参考http://blogs.msdn.com/b/clrcodegeneration/archive/2007/09/15/to-ngen-or-not-to-ngen.aspx?wa=wsignin1.0
    其次我说的只是盖棺定论的分类结果。ngen可以看做事先解释了一遍,并不能改变.NET Framework中的C#分类为解释型语言的事实。