入门 - 07 - Java程序运行机制
一、编译型和解释型
在计算机的高级编程类型分为两种:
编译型(compile)
需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件
-
通俗来讲:就像一本书直接翻译成另一种语言
-
Java通过编译程序直接编译成
.class
字节码文件 -
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行
-
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件
-
例子/主要语言:C / C++等
解释型
解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译
- 通俗来讲:就像一个翻译官一句话一句话给你翻译,文章被修改时,就把修改的再翻译
- 优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护
- 缺点:每次运行的时候都要解释一遍,性能上不如编译型语言
- 例子/主要语言:Java、Java Script、Python等
二、动态语言和静态语言
通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言 在我看来,动态语言和静态语言指的还是编译型和解释型
- 动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。
Python
和Ruby
就是一种典型的动态类型语言,其他的各种脚本语言如VBScript
也多少属于动态类型语言。 - 静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,
C/C++
是静态类型语言的典型代表,其他的静态类型语言还有C#
、JAVA
等。
对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamictyping when needed
三、两种类型的小总结
- 这两个词听起来都有翻译的意思,但是它们两个有区别:时机不同。就是什么时候去翻译
- java既有编译型的特点,也有解释型的特点
- 解释型的性能不如编译型语言,但电脑硬件方面在提升,现在买个电脑,内存都有16G,32G之类的,所以现在而言编译型也是很快的
四、程序运行机制
源程序(.java
文件)通过编译器–>字节码(.class
文件)–>类装载器–>字节码校验器–>解释器–>操作系统平台
五、一个面试题——编译运行过程
-
编译期:
.java
源文件,经过编译,生成``.class`字节码文件 -
运行期:JVM加载
.class
并运行``.class`特点:跨平台、一次编程到处使用——Write Once, Use Anywhere