编译语言不能有什么特征?

What features of interpreted languages can a compiled one not have?

解释语言通常更高级,因此具有动态类型(包括在没有声明的情况下动态创建新变量)、臭名昭著的eval和许多其他使程序员的生活更容易的功能,但为什么编译语言也不能拥有这些功能呢?

我不是指像Java那样运行在VM上的语言,而是指像C(++)那样编译成二进制的语言。

我现在不打算列出一个列表,但是如果你想问我的意思是什么功能,请看看PHP、Python、Ruby等必须提供什么。

  • 在编译语言中,解释语言的哪些共同特征不能/不存在/确实存在?为什么?


无论源代码是否编译为本地二进制文件,某种中间语言(Java BytEcDo/IL)或解释完全不是语言的特性。这只是一个实施的问题。

实际上,您可以为同一种语言同时拥有编译程序和解释程序,例如

  • haskell:ghc<->ghci
  • CG:<-CH
  • vb6:vs ide<->vb6编译器

某些语言特性(如eval或动态类型)可能暗示了所谓的"动态语言"和静态语言之间的区别,但如何运行它永远不会是首要问题。


也许问题不在于解释/编译语言(编译是模棱两可的),而在于那些有/没有自己的编译器的语言?例如,我们已经说过C++可以用一个方便的编译器在应用程序中浮动,并且反射在某些方面可能是相似的。


继续从dario开始-我想你真的在问为什么编译的程序不能在运行时评估语句(例如eval)。我可以想到以下几个原因:

  • 完整的编译器必须与程序一起分发(或作为程序的一部分)
  • 要使eval函数能够访问所使用环境中的类型信息和符号(如变量名和函数名),必须使用可访问的符号(编译语言通常在编译时删除这些符号)编译原始程序。

编辑:如前所述,这两个原因都不能使语言/编译器无法在运行时对代码进行评估,但它们确实是开发编译器或设计语言时需要考虑的事项。


例如,你不可能合理地执行eval,因为我认为很明显的原因:你将如何实现它?使运行时包含编译器的完整副本?每次你想评估一个字符串时(记住每次都可能不同!)将字符串保存到一个文件中,在上面运行编译器生成一个dll/共享lib,然后加载该dll/共享lib并调用代码?你不明白为什么这有点不切实际?;)

在动态语言中到处都可以发现这种情况,除了基本上在后台运行解释器外,静态代码是无法做到的。


最初,解释语言最大的好处之一是调试。这样,在查找程序不工作的原因时,您可以获得非常准确和详细的信息。然而,大多数编译器已经足够先进了,这不再是一件大事了。

另一个主要的好处(在我看来)是,使用解释语言,您不必等待永恒的时间来编译项目来测试它。