为什么在解释语言和编译语言之间有这么明确的界限?

Why is there such a clear cut between interpreted and compiled languages?

学习C语言或C++语言后,你就可以了解编译器了。为了运行代码,必须先编译它。编译代码可以将它从文本表示转换为可以执行的内容。生成的代码非常快,可以利用预处理器等。

当学习诸如python、matlab或ruby之类的动态语言时,您将了解解释器。为了运行代码,只需将其键入解释器。因此,您可以在运行时使用代码并动态更改程序的行为。这样做的缺点似乎是,解释语言的速度相当慢,而且缺乏清晰的编译时间,似乎使预处理器不可能实现。

还有一些实时编译器,它们像解释语言一样使用,但与编译语言相比,性能不足。但它们通常不运动预处理器,也不输出准备运行的二进制文件。

然后我学习了lisp,它可以被编译、解释,以及你拥有什么,同时它既快速又有强大的预处理系统(宏)。这在Lisp世界中似乎是常识,但在其他任何地方都不是。

为什么C没有流行的解释程序,Python没有编译器?为什么解释语言和编译语言之间存在强烈的分歧?(我知道存在一些可以编译Python或解释C的项目,但一般来说,它们似乎不太受欢迎)。


大多数流行的编译语言都是从一开始就被设计成被编译的:它们倾向于避免那些使生成有效的编译代码变得困难的特性。这些语言特性包括方便的"动态"特性,如动态类型、非统一容器和特殊对象名称空间。

因此,编译语言的解释器不能利用解释语言可用的动态特性,但缺少编译实现的性能优势。

相反,编译器必须复制被解释语言的所有特性和行为,而不考虑开销。一般来说,这意味着为解释语言编译的程序将承担解释程序的大部分开销。例如,任何类型的eval()功能实际上都需要包含解释器。

最后,这些效果被大用户群、良好支持和强大实现的相互增强的优势所放大。