解释语言的哪些特性可以编译一个没有?

时间:2010-03-25 15:17:43

标签: language-agnostic programming-languages

解释语言通常更高级,因此具有动态类型的功能(包括动态创建新变量而无需声明),臭名昭着的eval以及许多其他使程序员生活更轻松的功能 - 但为什么可以编译语言也有这些吗?

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

我现在不打算列出一个列表,但如果你要问我的意思是哪些功能,请查看PHP,Python,Ruby等提供的内容。

  • 解释语言的哪些常见功能在编译语言中不存在/不存在?为什么?

5 个答案:

答案 0 :(得分:4)

源代码是否被编译 - 到本机二进制文件,某种中间语言(Java字节码/ IL) - 或解释是绝对没有语言特征。这只是一个实施问题。

您实际上可以使用相同的语言编写编译器和解释器,例如

  • Haskell:GHC< - > GHCI
  • C:gcc< - > CH
  • VB6:VS IDE< - > VB6编译器

某些语言功能(如eval或动态类型)可能会暗示所谓的“动态语言”与静态语言之间存在区别,但 运行这种语言绝不是主要问题。

答案 1 :(得分:0)

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

另一个主要好处(我认为无论如何)是,使用解释型语言,您不必等待永久的项目编译以测试它。

答案 2 :(得分:0)

例如,由于我认为非常明显的原因,你不可能合理地eval:你究竟将如何实现它?使运行时包含编译器的完整副本?每次你想要评估一个字符串(记住每次它可能不同!)你将字符串保存到一个文件,运行它上面的编译器来制作DLL / shared-lib,然后加载该DLL / shared-lib并调用你的代码?你不明白为什么这可能有点不切实际? ;)

你可以在动态语言中找到这种东西,除了基本上运行解释器之外,你无法用静态代码做什么,实际上是在幕后。

答案 3 :(得分:0)

从Dario继续 - 我想你真的在问为什么编译的程序不能在运行时评估语句(例如eval)。这是我能想到的一些原因:

  • 完整的编译器必须随程序一起分发(或成为程序的一部分)
  • 对于eval函数,可以在使用的环境中访问类型信息和符号(例如变量名和函数名),原始程序必须使用那些可访问的符号进行编译(编译语言通常会删除这些符号)编译时间)。

编辑:如上所述,这些原因都不会使语言/编译器无法在运行时评估代码,但在开发编译器或设计语言时,它们肯定是需要考虑的事情。

答案 4 :(得分:0)

也许这个问题不是解释/编译语言(无论如何编译是模棱两可的),而是关于那些不带有自己的编译器的语言?例如,我们已经说过C ++可以使用在应用程序中漂浮的方便的编译器来实现eval,并且反射可能在某些方面类似。