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

时间:2013-04-02 13:40:48

标签: programming-languages interpreted-language compiled-language

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

在学习Python,Matlab或Ruby等动态语言时,您将了解解释器。要运行代码,只需将其输入解释器即可。因此,您可以在运行时使用代码并动态更改程序的行为。这种情况的缺点似乎是解释性语言相当缓慢,缺乏明确的编译时间似乎使预处理器无法实现。

然后有即时编译器,它们像解释语言一样使用但与编译语言相比具有较少的性能缺陷。但它们通常不会运行预处理器,也不会输出准备运行的二进制文件。

然后我学习了Lisp,它可以被编译,解释,你有什么,一直都很快,并拥有一个强大的预处理系统(宏)。这似乎是Lisp世界的常识,但不是其他任何地方。

为什么没有适用于Python的C或编译器的流行解释器?为什么解释语言和编译语言之间的分歧很大? (我知道有些项目可以编译Python或解释C,但一般来说它们似乎不是很受欢迎)。

1 个答案:

答案 0 :(得分:2)

大多数流行的编译语言都是从头开始设计编译的:它们倾向于避免使得难以生成高效编译代码的功能。这些语言功能包括方便的“动态”,如动态类型,非均匀容器和ad hoc对象名称空间。

因此,编译语言的解释器无法利用解释语言可用的动态功能,但缺乏编译实现的性能优势。

相反,编译器必须复制解释语言的所有功能和行为,而不考虑费用。通常,这意味着解释语言的编译程序将承担解释器的大部分开销。举个例子,任何类型的eval()功能都需要包含解释器。

最后,这些影响被大量用户群,良好支持和强大实施的相辅相成的优势所放大。