请教路过的高手:
JIT 编译器选择将最频繁执行的方法编译成本地代码。运行时才进行本地代码编译而不是在程序运行前进行编译(用 C 或 C++ 编写的程序正好属于后一情形),保证了可移植性的需求? 请解释一下为什么?jit(即时编译方式)的工作原理是什么?一边运行一边编译?不理解。它和C 或 C++ 提前编译有什么不同?查了好久,困惑了好久,多谢各位帮帮忙~

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【wbc1986】截止到2008-07-25 08:44:28的历史汇总数据(不包括此帖):
    发帖的总数量:5                        发帖的总分数:50                       每贴平均分数:10                       
    回帖的总数量:8                        得分贴总数量:3                        回帖的得分率:37%                      
    结贴的总数量:5                        结贴的总分数:50                       
    无满意结贴数:2                        无满意结贴分:40                       
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:40.00 %               无满意结分率:80.00 %                  
    敬礼!
      

  2.   

    保证了可移植性的需求? 请解释一下为什么?
    jvm和操作系统相关,而.class只和jvm相关,他从这点来保证可移植,但 是否真的是可移植还难说,一般来说,问题不大jit(即时编译方式)的工作原理是什么?一边运行一边编译?不理解。 
    个人理解是,.class已经是编译好了的文件,但是需要通过jvm一起再次组合才能运行
      

  3.   

    javac命令将Java源文件编译成JVM可以识别的class文件,即字节码
    但程序要运行最终要是转换成CPU能识别的二进制,所以:JIT编译器在程序开始执行前把所有字节码翻译成本地机器码,然后再将翻译后的机器码放在CPU上运行
      

  4.   

    JIT(just-in-time compilation)指计算机领域裡,即时编译也被成为动态翻译,是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。即时编译前期的两个运行时理论是字节码编译和动态编译。在编译为字节码的系统如 Limb 编程语言,Smalltalk, UCSD P-System, Perl, GNU CLISP, 和 Java 的早期版本中, 源代码被翻译为一种中间表示即字节码。 字节码不是任何特定计算机的机器码, 它可以在多种计算机体系中移植。 字节码被解释着运行在虚拟机里。动态编译环境是一种在执行时使用编译器的编译环境。 例如, 多数 Common Lisp 系统有一个编译函数,他可以编译在运行时创建的函数。在即时编译环境下, 字节码的编译是第一步, 它将源代码递归到可移植和可优化的中间表示。字节码被部署到目标系统。 当执行代码时,运行时环境的编译器将字节码翻译为本地机器码。 基于每个文件或每个函数:函数仅仅在他们要被执行时才会被编译。目标是要组合利用本地和字节码编译的多种优势:多数重量级的任务如源代码解析和基本性能的优化在编译时处理,将字节码编译为机器码比起从源代码编译为机器码要快得多。部署字节码是可移植的,而机器码只限于特定的系统结构。从字节码到机器码编译器的实现更容易,因为大部分工作已经在实现字节码编译器时完成。
      

  5.   

    javac命令将Java源文件编译成JVM可以识别的class文件,即字节码 
    但程序要运行最终要是转换成CPU能识别的二进制
      

  6.   

    运行时编译应该有很好的作用吧,c#的书有很好的说明,Java的我不确定。因为在运行时可以知道运行的机器的具体硬件情况,可以很好的优化代码。比如源代码生成的中间文件.class都是一样的在p4的电脑和在core2的电脑优化的代码是不一样的。两个cpu的指令集是不同的。后面的比前面的指令集要高级。
      

  7.   

    因为你发布的应用依旧是class二进制文件,所以是可以移植的。JIT是jvm所采用的一种优化技术,在运行的时候选择将最频繁执行的方法编译成本地代码,这些本地代码是不能被移植的。简单地说就是jit技术会将最频繁执行的方法从对class文件的解释执行优化为本地代码的编译执行。C/C++的那个应当是预编译,哪个是开发阶段编译器所采用的技术,在运行的时候就没有关系了。不过有一个比较相似的技术是,对一些性能要求比较高的应用,c/c++程序员会将部分代码采用汇编语言进行编写,已达到在运行的时候有比较高的性能。