ad

《自己动手写 Python 虚拟机》_更理解虚拟机的意义_1.2 编程语言虚拟机

网友投稿 68 2023-11-07

【摘要】 本书摘自《自己动手写 Python 虚拟机》一书中第1章,第2节,海纳编著。

1.2 编程语言虚拟机

《自己动手写 Python 虚拟机》_更理解虚拟机的意义_1.2 编程语言虚拟机

1. 屏蔽硬件差异

编程语言虚拟机的一个重要功能就是屏蔽硬件差异。以Java 为例,Java 源代码 文件会被Javac 先编译生成class 文件,多个 class 文件可以集中在一起,生成一个jar 文件。通常, 一个模块会压缩成一个 jar 文件,而应用程序就以jar 包的方式分发和 部署。

class 文件的格式是固定的,它的代码段里全部是 Java字节码。不管在什么硬 件环境下,相同的字节码得到的执行结果一定是相同的。字节码的设计类似于CPU 指令,它有自己定义的数值计算、位操作、比较操作和跳转操作等。因此,这种专门为 某一类编程语言所开发的字节码及其解释器被合并称为编程语言虚拟机。对字节码文件进行加载、分析,执行的逻辑都封装在Java 语言虚拟机里。在不 同的硬件平台和不同的操作系统上,Java 语言虚拟机的实现各不相同,但是,它提 的字节码执行器的功能是完全相同的。Java 早期推广的时候,曾经以“write once, run everywhere”作为重要的特性进行宣传,主要就是指 Java语言虚拟机屏蔽硬件差 异的能力。

2. 自动内存管理

使用C++ 进行开发时,开发人员要十分注意内存的使用,避免不合理的内存分 配和内存泄漏问题。如果能够自动对不被引用的内存进行回收和整理,就可以彻底 避免内存泄漏,这就是垃圾回收机制。

编程语言自动内存管理的研究开始得比较早,在当今主流的带有垃圾回收的编 程语言(例如 Java 、Python、ruby 和 Go) 被开发出来之前,垃圾回收的算法就已经非 常成熟了。

大体上,垃圾回收可以分为引用计数和 Tracing GC 两大类,其中引用计数的代 表就是 CPython, 也就是平常最常使用的社区版 Python 。 而大多数编程语言虚拟机 都使用Tracing GC 。Tracing GC的家族非常庞大,这里不再展开讨论。在本书的自 动内存管理一章,将会深入地讨论这个问题。

3. 编译和执行

在屏蔽硬件差异小节,只举了Java 字节码的例子。其实,编程语言还可以有更 多的实现,此处选择几个代表来介绍

第一类,是以 Java 为代表的有字节码的虚拟机。这种虚拟机前边已经介绍过 了,这里不再详细介绍。

第二类,是以v8 为代表的Javascript 虚拟机。v8 是 Google 公司开发的,用于执 行 Javascript 的虚拟机,chrome 里的js 都 是 由v8 解释执行的。网页上的 js 代码都 是以源代码的形式由服务端发送到客户端,然后在客户端执行。相比Java 的执行过 程,这一过程中缺少了编译生成字节码的步骤。实际上 v8 是比较特殊的,根本不需 要生成字节码,而是直接将源代码翻译成树形结构,称其为抽象语法树。然后,v8 的 执行器就通过后序遍历这棵树,在访问语法树上的不同结点时,执行与该结点相对应 的动作,最终完成代码的解释执行。这种做法是把源代码的编译和程序的执行直接 绑定在一起。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 [email protected] 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:达人之路·《高效办公应用宝典公式·函数与VBA》_2.2 公式的复制与填充
下一篇:《Excel VBA跟卢子一起学早做完,不加班(实战进阶版)》_2.5.2 OateDiff 函数和C 转换函数
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×