Java编译生成的.class文件存的是字节码,那么.net EXE中究竟是IL还是机器码?
我认为是IL,不知对否?
如果是IL,那么每次执行EXE就要进行一次编译?
------解决方案--------------------是IL代码 每次运行时由即时编译器(JIT)负责编译成本机代码,但是针对IL代码中的相同方法JIT只编译一次,然后将其缓存在动态内存中,下一次调用相同的方法或代码段时直接取用就行了.
------解决方案--------------------都有.
每个exe都有一条跳转到mscoree.dll的_CorExeMain函数的机器码.
_CorExeMain会负责初始化运行环境并查找exe镜像中的IL并运行.
剩下的同一楼.
------解决方案--------------------.Net编译好的不是汇编指令,而是IL指令,Java是字节代码
JIT 运行时.Net装载入口Assembly,CLR公共语言运行时运行代码创建主应用程序域,然后CLR提取代码从IL编译为汇编指令并执行,循环到第二部分代码。。。每部分代码都是即时编译(JIT)。代码运行中CLR监视内存使用情况并处理垃圾回收等等。
Java 不同的是编译为字节代码,字节代码有一套通用的语法,可以跨平台。字节代码是解释性的。Java程序的跨平台主要是指字节码文件可以在任何具有Java虚拟机的计算机或者电子设备上运行,Java虚拟机中的interpreter(解释器)负责将字节码文件解释成为特定的机器码进行运行。
------解决方案--------------------可以用系统提供的NGen.exe工具生成本地代码
这样做的好处是加快启动速度,减小程序工作集,
但是会降低性能
------解决方案--------------------同意楼上的解释,NGen可以将IL预先编译为本地代码。但是这样会带来相应的问题。所以一般还是默认的IL好一些。