Python 和 Ruby 等语言被解释(开箱即用)而不是编译的技术原因是什么?在我看来,对于这个领域的知识渊博的人来说,让这些语言不像今天那样被解释应该不难,我们会看到显着的性能提升。所以我当然错过了一些东西。
最佳答案
几个原因:
- 更快的开发循环,write-test vs write-compile-link-test
- 更容易安排动态行为(反射、元编程)
- 使整个系统可移植(只需重新编译底层 C 代码,您就可以在新平台上使用)
想想如果系统被解释会发生什么。假设您使用转换为 C 作为机制。编译后的代码必须定期检查它是否已被元编程取代。 eval()
类型的函数也会出现类似的情况。在这些情况下,它必须再次运行编译器,这是一个非常缓慢的过程,或者它必须也在运行时有解释器。
这里唯一的选择是 JIT 编译器。这些系统非常复杂和精密,并且比所有其他替代方案具有更大的运行时占用空间。它们启动非常缓慢,因此不适合编写脚本。见过 Java 脚本吗?我没有。
所以,你有两个选择:
- 编译器和解释器的所有缺点
- 只是解释器的缺点
通常,主要实现只与第二选择一起使用,这并不奇怪。很可能有一天我们会看到像编译器这样的二级实现。 Ruby 1.9 和 Python 有字节码虚拟机;那里是½路。编译器可能只针对非动态代码,或者它可能具有可声明为选项的各种级别的语言支持。但是由于这样的事情不能成为主要的实现,它代表了很多工作,但 yield 非常微不足道。 Ruby 中已经有 200,000 行 C 代码...
我想我应该补充一点,人们总是可以添加一个已编译的 C(或者,通过一些努力,任何其他语言)扩展。所以,假设你有一个缓慢的数值运算。如果您添加,例如带有 C 实现的 Array#newOp
,那么您将获得加速,程序将保留在 Ruby(或其他)中,并且您的环境会获得一个新的实例方法。每个人都赢了!因此,这减少了对有问题的辅助实现的需求。
关于python - 为什么 (python|ruby) 被解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1805148/