Java语言特点?编译与解释并存?
Java语言特点:
· 面向对象(封装,继承,多态);
· 平台无关性( Java 虚拟机实现平台无关性);
· 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
· 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
· 编译与解释并存;
Java和C++的区别:
· 多线程
· GC
· 单继承(接口多继承)
· 指针
编译与解释并存:
编译型 :编译型语言,会通过编译器将源代码一次性翻译成可被该平台执行的机器码。一般情况下,编译语言的执行速度比较快,开发效率比较低。常见的编译性语言有 C、C++、Go、Rust 等等。
解释型 :解释型语言,会通过解释器一句一句的将代码解释(interpret)为机器代码后再执行。解释型语言开发效率比较快,执行速度比较慢。常见的解释性语言有 Python、JavaScript、PHP 等等。
Java 语言既具有编译型语言的特征,也具有解释型语言的特征。
因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(.class
文件),这种字节码必须由 Java 解释器来解释执行。
我们需要格外注意的是 .class->机器码
这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT(just-in-time compilation) 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言 。
https://limingxie.github.io/java/java_javac_compiler/
javac的编译(.java => .class)过程大体上可以分3个步骤。
- 解析填充符号表Parse and Enter
- 插入式注解处理器的注解处理过程Annotation Processing
- 分析与字节码生产过程Analyse and Generate
1、词法分析器=> 把源代码转变为token
将源代码划分成一个个Token,找出 java 语言中的 if,else,for 等关键字。
2、语法分析器=> 使用token生成抽象语法树
将上述的一个个 Token 组成一句句代码块,检查这一句句代码块是不是符合 Java 语言规范,比如 if 后面跟的是不是布尔判断表达式
3、语义分析器:将语法树转化为注解语法树(做一些逻辑上的验证,优化语法树)
将复杂的语法转化成简单的语法并做一些检查,添加一些代码。
4、代码生成器:将注解语法树转化为字节码,即将一个数据结构转化成另一个数据结构,生成最终的class文件。
Javac编译动作的入口是com.sun.tools.javac.main.JavaCompiler类,
上述3个过程的代码逻辑集中在这个类的compile()和compile2()方法中。