日期:2014-05-17  浏览次数:20799 次

请教下JITCompiler究竟是如何边运行边编译的?
本帖最后由 huge92 于 2013-08-22 17:48:50 编辑
比如:


        static void Main(string[] args)
        {
            int a = 22;
            abc(a);

            double x = 2.2;
            double y = 3.3;
            Math.Pow(x, y);

            Console.WriteLine("Hello!");
            Console.WriteLine("Goodbye!");
        }

        static void abc(int x)
        {
            x++;
        }


有一句话叫作,一个方法只有在首次被调用时才会进行JIT编译。
那么:
1.边运行边编译,究竟是指:

1)编译一句执行一句(比如Main()里面有上述七句);
2)编译一个方法执行一个方法,比如编译完了Main()再执行整个Main(),编译完了abc()才执行整个abc()。
3)对Main()是碰到一个方法的首次调用就编译,然后执行之,再返回Main()继续向下,而对于abc()这样的方法就是整个编译好了再执行。
4)其他方式。

2.如果是2)的话,Main()方法也是个方法,以方法为单位编译,它里面的内容都被编译了才执行的话,谈何即时编译?

3.之所以有这个疑问是因为在看《CLR via C#》的时候,书的开头说道的Main方法是1),而后面提到的普通的方法则是2),也就是3)的做法,为什么两者是区别对待的?
JIT

------解决方案--------------------
调用一个dll(其实是module),才编译它。而不是程序启动时把所有的dll都进行JIT编译。

.net的DLL文件里边的内容,是高级语言的。不像传统的c文件编译出来的dll那么低级。因此.net的dll可以根据不同的JIT而编译为针对不同硬件设置最合适的native代码,你生成一遍dll文件则可以被不同JIT跨平台去编译执行。
------解决方案--------------------
目前的CLR是对程序集整体编译。所以将程序分成很多程序集有利于增进性能。而把程序分成很多函数则没有这个作用。
------解决方案--------------------
一个方法只有在首次被调用时才会进行JIT编译。
这句话已经说的很清楚了,所有的方法(包括Main)都一样。