返回介绍

编译还是解释?

发布于 2025-01-22 00:38:47 字数 2026 浏览 0 评论 0 收藏 0

张大胖最近频繁的看到两个词: 编译和解释, 他很困惑, 就去找 Bill 大神。

张大胖: “大神, 什么是编译? ”

Bill :“编译通俗来讲就是把一种计算机语言写的代码(源代码)转换成另外一种计算机语言的代码(目标代码), 源代码通常是高级语言, 人类容易读, 容易理解; 目标代码通常是汇编或机器代码机器(CPU)能理解, 能高效的执行。 比如说, 你一直没学好的 C 语言, 就是编译型语言的典型代表, 通过编译, C 语言可以变成二进制代码执行。 “

张大胖: “那解释又是啥? ”

Bill 说: “解释就简单的多了, 解析源代码, 并且直接执行它, 没有编译的过程。 ”

张大胖又问: “我听很多人说 Ruby , Python, PHP 都是解释型语言, 是这样吗? ”

“我先给你说说高级语言再执行之前都要做哪些事情, 然后你自己判断吧。 举个例子, 你写了一行代码:

totalPrice = price * 4 - discount

计算机首先要做词法分析, 把它变成一个个的 token: ” Bill 接着说: “你看看这棵树, 如果你写一个程序遍历每个节点, 是不是就可以执行了? 如果到此打住, 直接解释执行,可以说是解释型语言。”

张大胖说: “那 Ruby, Python, PHP 是这么干的吗?”

“No, 现代很多动态语言远远不是一个解释器了, 他们都有了自己的虚拟机 ! Ruby 在版本 1.9 以后出现了 YARV, PHP 有 Zend, Python 本身就有虚拟机,执行 PyCodeObject 这样的字节码对象。 ”

“和 Java 虚拟机有什么关系?”

“他们都是所谓高级语言虚拟机, 有一套自己的指令集, 相当于一个软件 CPU。你可以类比成 x86 CPU 上的指令集”

张大胖说:”那为了在虚拟机中运行, 是不是得把 Ruby, Python, PHP 的源代码转化成软 CPU 的指令啊, 按照你的定义, 这种变换更像是一个典型的编译过程啊

Bill 说:”你说的没错, 看看这个 Ruby 的简单示例, PHP, Python 也差不多。” 张大胖说:“这和 Java 很相像啊, 我们用 javac 把 java 源码编译成 class 文件, 里边包含 JVM 的字节码, 然后在 JVM 中运行。 “

“对啊, 概念上很像, 当然也有点不同, Ruby 并没有暴露出任何像 javac 这样的编译接口让程序员使用, 编译过程是自动在内部小黑屋里悄悄完成的, 外边的程序员还误以为解释执行呢。

还有, Ruby 也不会把 YARV 的指令再变成物理 CPU 的机器指令, 这和 Java 的 HotSpot 追踪热点代码, 然后变成机器指令还是不同。 “

张大胖说:“那我们还能说 Ruby, Python, PHP 是解释型语言吗? ”

“ 也许可以把解释的概念扩大一点: 1. 解析源代码,并且直接执行它 , 或者 2. 把代码转换成中间表示(虚拟机的指令), 然后执行。 ” Bill 说到。

张大胖说: “完了, 你这新定义把 Java 都变成解释型的了 ”

“无所谓了, 如果我说物理 CPU 也是在’解释执行‘ 指令, 也没错啊, 大家都变成解释型语言了。 其实甭管它什么解释还是编译, 了解了底层的原理就行了 ”

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文