Java基础

203 阅读3分钟

Java代码是怎么编译和执行的?

WX20200516-215315@2x.png
整个流程从 Java 源码开始,经过 javac 程序处理后得到类文件,这个文件中保存的是编译 源码后得到的 Java 字节码。类文件是 Java 平台能处理的最小功能单位,也是把新代码传 给运行中程序的唯一方式。

类文件通过类加载机制载入虚拟机,从而把类型提供给解释器执行。

字节码是什么?

字节码处在源码和机器码之间。字节码的目的是提供一种能让 JVM 解释器高效执行的格式。

javac是编译器吗?

这取决于你怎么定义“编译”。就像浏览器运行模式有quirks mode(怪异模式)strict mode(严格格式)一样,编译也可以有不同的解读。

“编译”看作一个单独的术语,表示 JIT 编译,因为只有 JIT 编译才会生成机器码。

严格来说,计算机科学家定义“编译器”是直接生成机器码。而javac的作用把Java代码编译成字节码,上一个问题解释了字节码是处于源码和机器码之间的一种类似机器码的代码,但字节码并不属于机器码,所以严格意义上不算编译器。

但广泛意义上,我们早已习惯了把javac看作编译器,只要把一种代码按照一套规则转换成另一种代码或另一类型文件,这个过程就可以叫“编译”。

为什么叫“字节码”?

因为一个Java指令码(操作码)只占一个字节,即8位。比如0xbf表示抛出异常。 问得再深入一点,一共有几个字节码呢?有些操作可以有参数,即跟随其后的字节流,参数字节占2位,所以一共可以用的指令数是 2^(8-2)-1 = 255个。实际上,有些指令用不到,大概只会使用 200 个,其中还有一些是最新版javac不支持的。

Java是解释型语言吗?

JVM 基本上算是解释器。可是,大多数解释性语言(例如 PHP、Perl、Ruby 和 Python)都直接从源码解释程序(一般会从输入的源码文件中构建一个抽象句法树)。而 JVM 解释器解释的是类文件,也就是Java源码 -> class文件 -> JVM解释 -> 机器码。

有其他语言可以在JVM中运行吗?

可以。上个问题解释了JVM 解释器解释的是类文件,只要能够生成类文件的都可以在JVM中运行,比如Scala语言。 还有一种情况,就是可以使用 Java 实现解释器和运行的语言比如JRuby语言

Java 是安全的语言吗?

Java 的安全性大于C语言和C++语言。首先,Java 严格限制字节码能表述的操作,例如不能直接访问内存,因此避免了困扰 C 家族语言的一整类安全问题。而且只要 JVM 加载了不信任的类,就会执行字节码校验操作,从而避免了大量安全问题。

Java和C语言比较?

  • Java 面向对象,C 面向过程。
  • Java 通过类文件实现可移植性,C 需要重新编译。
  • Java 为运行时提供了全面的监测程序。
  • Java 没有指针,也没有指针相等性运算。
  • Java 通过垃圾回收提供了自动内存管理功能。
  • Java 无法从低层布局内存(没有结构体)。
  • Java 没有预处理器。