机器指令到汇编再到高级编程语言( 五 )


More...


对于这一段计算机历史感兴趣的同学可以拜读一下「IT 通史 12.2 节 - 高级计算机程序设计语言」的内容,在线预览链接如下:
https://books.google.com.hk/books?id=ZrAol3RzcNkC&printsec=frontcover&hl=zh-CN#v=onepage&q&f=false
高级语言分类CPU 终究只认识二进制指令,在我们发明高级语言之后,仍然无可避免的需要进行「翻译」 工作 。按照翻译方式的不同,我们又把高级语言分为了 「编译型」 和 「解释型」 。
编译型
机器指令到汇编再到高级编程语言

文章插图
 
编译型专业解释为:
使用 专门的编译器,针对 特定的平台,将高级语言源代码 一次性 的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式,并且只需要编译一次,以后再也不用编译 。其实可以简单理解成谷歌/ 百度翻译,我们把要翻译的文字全部放进去,一次翻译,下次使用直接使用上一次翻译好的结果 。
机器指令到汇编再到高级编程语言

文章插图
 
  • 优点(较解释型):执行效率高(有解释器省去很多翻译的过程)
  • 缺点(较解释型):开发效率低(写完所有的代码才能检查 bug,得多恐怖呀???)
解释型
机器指令到汇编再到高级编程语言

文章插图
 
解释型专业解释为:
使用 专门的解释器 对源程序逐行解释成 特定平台 的机器码并 立即执行,它不需要事先编译,直接将代码解释称机器码直接运行,也就是说只要某一平台提供了相应的解释器即可运行代码 。其实可以理解成同声传译,我们需要翻译的时候,找一个翻译员,对方说一句翻译员翻译一句,下次翻译还是需要一个翻译员一句一句的翻译 。
机器指令到汇编再到高级编程语言

文章插图
 
  • 缺点(较编译型):执行效率低(写一次翻译一次)
  • 优点(较编译型):开发效率高(写一行翻译一行,错了马上就知道,妈妈再也不用担心我找不到 bug 了)
半解释半编译的 Java不同厂商、不同时间开发的 CPU 的指令集是不一样的,这就是上方为什么提到要使用专门的解释器,要用于 特定的平台 的原因 。
所以 Java 为了实现 「一次编译,到处运行」 的目的,采用了一种特别的方案:先 编译 为 与任何具体及其环境及操作系统环境无关的中间代码(也就是 .class 字节码文件),然后交由各个平台特定的 Java 解释器(也就是 JVM)来负责 解释 运行 。
编程人员和计算机都无法直接读懂字节码文件,它必须由专用的 Java 解释器来解释执行,因此 Java 是一种在 编译基础上进行解释运行 的语言 。(Java 程序运行流程如下)
机器指令到汇编再到高级编程语言

文章插图
 
Java 解释器 负责将字节码文件翻译成具体硬件环境和操作系统平台下的机器代码,以便执行 。因此 Java 程序不能直接运行在现有的操作系统平台上,它必须运行在被称为 Java 虚拟机的软件平台之上 。
Java 虚拟机(JVM) 是运行 Java 程序的软件环境(我们后面会详细说到,这是学习 Java 绕不过的题),Java 解释器是 Java 虚拟机的一部分 。在运行 Java 程序时,首先会启动 JVM,然后由它来负责解释执行 Java 的字节码程序,并且 Java 字节码程序只能运行于 JVM 之上 。这样利用 JVM 就可以把 Java 字节码程序和具体的硬件平台以及操作系统环境分隔开来,只要在不同的计算机上安装了针对特定平台的 JVM,Java 程序就可以运行,而不用考虑当前具体的硬件平台及操作系统环境,也不用考虑字节码文件是在何种平台上生成的 。
JVM 把这种不同软、硬件平台的具体差别隐藏起来,从而 实现了真正的二进制代码级的跨平台移植 。JVM 是 Java 平台架构的基础,Java 的跨平台特性正是通过在 JVM 中运行 Java 程序实现的 。Java 的这种运行机制可以通过下图来说明:
机器指令到汇编再到高级编程语言

文章插图
 
Java 语言这种「一次编写,到处运行」的方式,有效地解决了目前大多数高级程序设计语言需要针对不同系统来编译产生不同机器代码的问题,即硬件环境和操作平台的异构问题,大大降低了程序开发、维护和管理的开销 。


推荐阅读