编译器和解释器之间的区别

根据他们的定义,编译器和解释器之间的区别似乎很明显:

  • 解释器可以直接执行以编程语言编写的指令的程序
  • 编译以低级语言转换源代码的程序

但是,如果您深入研究,可能会发现两者之间有些模糊

实际上,解释器可以以中间形式翻译源语言,以加快执行速度。 依赖虚拟机的语言通常会发生这种情况。 这自然会引起一些问题:

使用虚拟机的所有语言都可以解释吗?

它们都是实际编译的吗?

您可能会说两种 :一种语言首先以一种中间形式/语言进行编译,然后在运行时解释这种中间事物。 这也导致了另一个问题,编译器和解释器不应被视为一个程序,而应被视为系统中更多的程序。 作为用户,您作为编译器认为的实际上可能包含多个程序。 例如,它可能包含一个链接程序:一种将不同的目标文件组合到一个文件中的程序,以便可以更轻松地使用它。 口译员可以说类似的话。

您能告诉我有关编译器和解释器的所有信息吗?

那么,构成编译器或解释器的所有部分是什么? 您可以为学术界中的此类问题寻求精确的技术答案。 或者,您可以在StackOverflow上找到有关这些问题的讨论。

作为开发人员甚至是语言的创建者,对我们真正重要的是与他们合作的区别。 两者都有优点和缺点,实际上,某些语言可以同时具有解释器和编译器,也可以具有多个。 这就是我们要看到的。

要点仍然存在:解释器现在执行代码,编译器准备源代码以供以后执行。 所有实际的差异都源于这些不同的目标。

您如何分发程序

实际上,一个重要区别是编译器生成独立程序,而解释程序始终需要解释器才能运行。

有了已编译的程序后,您可以运行它而无需安装任何其他程序。 这简化了分配。 另一方面,可执行文件在一个特定平台上工作 :不同的操作系统和不同的处理器需要不同的编译版本。

如果要解释程序,则可以将同一副本分发给不同平台上的用户。 但是,他们需要在特定平台上运行的解释器 。 您可以分发原始源代码或中间形式。 查看解释器的一种直观方法是:就像JavaScript中的eval函数一样。 它可以在JavaScript工作的任何地方工作,但是需要Java解释程序才能运行该平台。

跨平台支持

这是技术上的差异,会导致重大的实际后果: 使用解释性编程语言制作跨平台程序更加容易

这是因为在大多数情况下,您只是在为解释器平台创建程序。 它将由解释器本身将其转换为适用于实际平台的适当形式(例如Windows / Linux和x86 / ARM)。 当然,您必须了解每个平台仍然存在一些差异。 一个常见的示例是目录分隔符。

相反,在编译程序时,您需要注意每个平台之间的所有微小差异。 发生这种情况的部分原因是,编译语言往往是较低级的语言,例如C ++,因此它们使您对系统的访问权限降低,从而承担更多责任。 但是另一个原因是,您正在使用的所有库都需要自己支持不同的平台。 因此,如果它们不支持Windows,则不能支持Windows。

速度有多张面Kong

同样,在速度方面,我们有一个悖论:编译器比解释器快和慢。 许多人都知道编译的程序比解释的程序要快得多,但这不是全部。 相比于解释程序,已编译程序的运行速度更快,但是与仅解释程序相比,编译和运行程序要花费更多时间

编译器确实可以产生更快的程序。 从根本上说,这是因为它必须只分析一次每个语句,而解释器必须每次都分析它。 此外,编译器可以优化其生成的可执行代码。 那是因为它确切地知道它将在哪里运行,而且还需要花费时间来优化代码。 时间会使解释太慢。

运行速度与开发速度

您可能会认为这很挑剔:如果您编译的程序运行速度更快,则编译所花费的时间并不重要。 这通常是老派观点。 毫无疑问,最终程序运行的次数比编译的次数多。 那么谁在乎开发是否需要更多时间呢? 好吧,可以肯定的是,它对发展采取了一种“痛苦的态度”,这种态度令人钦佩。 但是,如果运行时的收益无关紧要,而开发生产力的损失却是巨大的,那该怎么办呢?

创建操作系统是一回事,而制作自拍应用程序则是另一回事。 甚至您的用户也可能希望在运行速度上损失不大甚至不明显,以换取更快地获得功能。 没有一个万能的答案:在某些情况下,生产力比速度更重要,而在另一些情况下,反之亦然。

调试的奥秘

最后还有一个特定方面比调试一个方面更具不确定性:调试。 在纸上,使用解释器的调试比使用编译器的调试容易。 确实有以下几个原因:

  • 使用解释器,可执行文件只有一个版本; 您不需要调试版本进行开发,也不需要最终用户发布的版本
  • 使用解释器的平台特定错误更少
  • 由于解释器可以即时转换代码,因此源代码中的信息仍然可用
  • 由于解释器一次执行一个语句,因此更容易发现错误

开发工具的不同之处

尽管在实践中这都是正确的,但这可能没有看起来那么重要。 实际上,如果您考虑一下自己的经验,可能会发现调试JavaScript比调试C ++困难 。 这是为什么? 语言本身的设计部分是。 JavaScript使用动态类型,而C ++使用静态类型。 后者使更容易及早发现错误。 但最终归结为开发工具。 手工编译C ++很困难,因此大多数人都使用IDE进行开发。 另一方面,您可以轻松地使用文本编辑器和命令行工具在JavaScript中进行开发。

话虽如此,如果我们将它们放在相同的环境中,每个人都拥有出色的IDE和支持工具,情况就会恢复正常。 确实,想要学习如何使用新语言的人们使用了许多解释环境。 通过逐行实时查看发生了什么,更容易测试和发现对与错。

结论

我们已经看到了编译器和解释器之间重要的主要区别。 更重要的是,我们已经看到,不同哲学的后果比技术哲学的后果更为重要。 简而言之,有些文化伴随着某些技术选择,而这些选择最终会彼此相关。 如果您想提高速度并简化开发,您将选择所有技术来提高速度,而不仅仅是一种。 您的用户将跟随您的领导。

这是要考虑的一个关键方面,尤其是如果您要创建自己的编程语言时。 Rasmus Lerdorf创建了易于使用的PHP。 确实,与替代方案相比,至少在创建之时,它的使用极为方便。 但是它起初是从图书馆而不是语言开始的。 尽管它已经有了很大的改进,但它仍然遭受了初期的困扰。 您仍然可以创建良好的PHP代码,但其用户数量比平时少。 因为如果您只需要工作,安全性,维护等方面的功能,那么其​​余所有功能都将在以后提供。

如果您想知道如何实际地为您的语言构建解释器或编译器,则可能需要看看创建编程语言资源 。 如果您想学习这些知识以及创建自己的语言所需的全部知识,您只需选择一本深受孩子和成人喜爱的好书,介绍如何创建实用的轻量级语言

翻译自: https://www.javacodegeeks.com/2017/05/difference-compiler-interpreter.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值