【发布时间】:2021-05-23 14:11:33
【问题描述】:
所有解释型语言最终都不是机器码吗?我很好奇原因是因为公司认为不值得付出努力,是否存在导致不可能的继承冲突,或者其他原因。有没有办法自己捕获脚本执行的机器码?
编辑 我说得松散,因为我不希望标题太长。我知道没有“口译语言”。我说的是通常被解释的语言(不是 c++,不是 rust 等)。
“所有解释型语言最终都不是机器码吗?” - 这是一个反问。答案是简单的“是”。因为这就是计算机的工作原理。
我很好奇为什么大多数使用解释器创建语言的公司不使用编译器来补充它(编译为本机代码)。而且我很好奇是否可以自己记录执行的机器代码。
此外,Jörg W Mittag 的回答具有误导性(并且傲慢)。在“所有”这些编译器中,我看不到一个可以编译为本机代码的编译器。我认为其中之一甚至不再存在(请访问 Rubinius 网站)。我也与其中一些合作过,但它们有局限性(我不能随意采用与标准 ruby 解释器一起工作的重要脚本并编译它)。
【问题讨论】:
-
解释语言不会被翻译成机器码。这就是为什么有“解释”这个词的原因。对于解释性语言,您需要一个解释器。这个解释器是位于 CPU(机器代码)和语言本身之间的引擎。编译器将脚本语言编译为解释器的中间代码,它不会编译为机器代码。因此,您不能只替换编译器。您需要构建一个新的编译器和解释器,这需要大量工作。
-
所以您的答案是公司认为不值得付出努力。谢谢!
-
在古代可以使用解释器来减少内存占用,但解释器也允许程序交互开发和跨实现共享。有适用于各种脚本语言(例如 Ruby 和 Python)的编译器,因此它取决于您的目标(或市场)。
-
所有当前存在的 Ruby 实现都有一个编译器。许多甚至不止一个,例如YARV 有两个,Rubinius 有两个,JRuby 可以说有 2 到 6 个,这取决于你如何计算。 Opal 是一个纯编译器,它根本没有解释器。
-
@Casper Facebook 实际上使用 HHVM 为 PHP 做到了这一点。当然,他们必须实际 fork 整个语言才能使其正常工作。
标签: ruby compilation interpreter compiler-theory interpreted-language