实际上是两个问题,第一个是,我编译完的java文件可否反编译成 含有jvm汇编指令的 字节码文件?就像在vs中可以直接看到他编译过后的汇编代码一样。第二个问题是,java的字节码是虚拟机在解释执行,那他的虚拟机是用什么写的呢?从执行效率上来看,jvm的汇编和普通的汇编代码是不是有质的变化呢?我知道python的虚拟机就是用c写的。可是效率慢了很多很多。可是java的虚拟机为什么执行效率还如此之快?其中到底有何高招呢?多谢。

解决方案 »

  1.   

    反编译,那不是将.class 文件又变成了.java文件了吗?要是这个用 jad。
    要是别的就不会来。路过学习学习
      

  2.   

    可以反编译,javap命令就可以。jvm去sun网站上看看,不知道有没有源码。
      

  3.   

    1.javap -c 类名(不加.class后缀)
    2.一般是用C++来写。比如Sun 的hotspot jvm就是用C++写的。高效率的关键是JIT技术。对于频繁执行的代码段编译为机器码,而不是通过解释来执行。
    当然也可以用别的语言来写,比如java ,一个著名的研究项目,jikes RVM 就是用java写的,而且在这个项目中,字节码是直接编译的,并不存在解释的过程。
      

  4.   

    我记得有个开源的虚拟机,叫做Kaffe,楼主可以去研究研究
      

  5.   

    如果不想用 javap 命令的话,在 Eclipse 中选中 class 文件(在 Navigator 视图中才能看到 bin 目录中的 class 文件),
    在 class 文件上右击,选择 Open With --> Class File Viewer 就可以看到反编译的 JVM 指令了。
      

  6.   

    昨天晚上找了找资料,貌似java和其他语言一样。最终也会运行在机器指令集上。但是我不明白的是,既然是运行在机器指令上,为什么还需要虚拟机呢?那还是字节码经过虚拟机的解释之后才到 机器码那儿的了?
      

  7.   

    java最终当然要运行在机器指令上 之所以需要虚拟机是因为要跨平台啊!
    虚拟机把字节码文件依据不同的操作系统环境解释为机器码 所以不同的操作系统有相应的虚拟机 这就是java跨平台的实现手段啊。。
      

  8.   

    楼上说的很对。。可是我实际上想了解的是java虚拟机解释字节码和python的虚拟机解释字节码会有什么样的区别呢?为什么一个速度很快。一个速度不是很快呢?
      

  9.   

    刚刚用了一下javap。。原来反编译就是这样出来的。。那第一个问题我明白了。。多谢各位。。接下来我得好好研究研究第二个问题了。。
      

  10.   

    其实javap是一种把class文件二进制流转换成字节码助记符的一种方式,如果知道助记符与对应二进制的代码,直接用二进制打开class文件也可以看懂代码。
    而java运行速度比c++等本地语言运行速度要慢,虽然现在通过各种技术让运行速度快了很多,但是仍旧还是要慢一些。至于它比python要快,但是java没有python动态性好,甚至java就不算动态语言,从这点上看python要比java优秀多了。
      

  11.   

    楼上说的很对,至于python和java,甚至其他各种语言肯定是各有利弊,至于python我至始至终都觉得他是一门特别优秀的脚本语言,注意哦。是脚本语言。而且你还提到了java和c++的比较,我在网上看到很多消息说实际上java的速度要比c++要快,所以我的问题就出自这儿,他为什么会快?还需要多一道程序,怎么可能快呢?
      

  12.   

    楼上说的很对。。可是我实际上想了解的是java虚拟机解释字节码和python的虚拟机解释字节码会有什么样的区别呢? 为什么一个速度很快。一个速度不是很快呢?你根据什么说java虚拟机比python的虚拟机快?   java虚拟机并不快啊  
      

  13.   

    所以说我的问题就在于,到底java字节码经过虚拟机的解释之后,会不会达到像C++一样的速度呢?James G经常宣称说java的运行速度要快过一些C++的程序,所以。。有点儿想不清楚。
      

  14.   

    kvm就是用c写的,javac编译成字节码,字节码就是一堆的指令,然后解释器解释这些指令,其实就是switch case,再调用硬件的api