【学习笔记】java程序运行机制
编译型和解释型
我们以一个小故事来理解这两种运行机制。
一个美国人想要读懂一本中文小说,他有两种方法:
第一种是买一本英文翻译版,这种方法的好处是可以随时地回看,缺点是当作者更新了这本书的内容时,还需要重新购买一本翻译版。
第二种是请一位翻译官来为他翻译这本书,这种方法好处是当作者更新时,翻译官可以实时为他翻译更新的内容,缺点是当他想回过头去看之前的内容时,每次都需要翻译官翻译。
这个故事中的第一种方法所对应的就是编译型,第二种方法对应的是解释型。
编译型语言有:C、C++、Delphi、Pascal、Fortran
解释型语言有:JAVA、python,JavaScript、Basic
Java既有编译型的特点,又有解释型的特点。
编译型
对于编译型语言,开发完成后将所有源代码 都转换成可执行程序,只要我们有可执行程序,就可以随时运行,不用再次编译,也就是“一次编译,无限运行”。
运行时,不再需要源代码和编译器,可以脱离开发环境运行。
编译型语言一般是不能跨平台,也就是不能在不同的操作系统之间任意切换。
1.可执行程序不可跨平台,原因是因为不同操作系统对可执行文件的内部结构有着截然不同的要求,彼此之间也不能兼容。
2.源代码不可跨平台,原因是不同平台支持的函数、类型、变量等都可能不同。我们以C语言为例来说明。
【实例1】在C语言中要想让程序暂停可以使用“睡眠”函数,在 Windows 平台下该函数是 Sleep(),在 Linux 平台下该函数是 sleep(),首字母大小写不同。其次,Sleep() 的参数是毫秒,sleep() 的参数是秒,单位也不一样。
【实例2】虽然不同平台的C语言都支持 long 类型,但是不同平台的 long 的长度却不同,例如,Windows 64 位平台下的 long 占用 4 个字节,Linux 64 位平台下的 long 占用 8 个字节。
解释型
对于解释型语言,每次执行都需要一边转换一边执行,用到哪些源代码就将那些源代码转换成机器码,用不到的不进行处理。
因为每次执行程序都需要重新转换源代码,所以解释型语言的执行效率低于编译型语言,计算机的一些底层功能,或者关键算法,一般都使用 C/C++ 实现,只有在应用层面(比如网站开发、批处理、小工具等)才会使用解释型语言。
在运行解释型语言的时候,我们始终都需要源代码和解释器,所以说它无法脱离开发环境。
解释型语言可以跨平台。
我们所说的跨平台,是指源代码跨平台,而不是解释器跨平台。解释器用来将源代码转换成机器码,它就是一个可执行程序,是绝对不能跨平台的。
官方需要针对不同的平台开发不同的解释器,这些解释器必须要能够遵守同样的语法,识别同样的函数,完成同样的功能,只有这样,同样的代码在不同平台的执行结果才是相同的。
你看,解释型语言之所以能够跨平台,是因为有了解释器这个中间层。在不同的平台下,解释器会将相同的源代码转换成不同的机器码,解释器帮助我们屏蔽了不同平台之间的差异。