解释语言通常更高级,因此具有动态类型的功能(包括动态创建新变量而无需声明),臭名昭着的eval
以及许多其他使程序员生活更轻松的功能 - 但为什么可以编译语言也有这些吗?
我不是指像在Java上运行的Java这样的语言,而是那些像C(++)一样编译为二进制的语言。
我现在不打算列出一个列表,但如果你要问我的意思是哪些功能,请查看PHP,Python,Ruby等提供的内容。
答案 0 :(得分:4)
源代码是否被编译 - 到本机二进制文件,某种中间语言(Java字节码/ IL) - 或解释是绝对没有语言特征。这只是一个实施问题。
您实际上可以使用相同的语言编写编译器和解释器,例如
某些语言功能(如eval或动态类型)可能会暗示所谓的“动态语言”与静态语言之间存在区别,但 运行这种语言绝不是主要问题。
答案 1 :(得分:0)
最初,解释语言的最大好处之一是调试。这样,在查找程序无法正常工作的原因时,您可以获得非常准确和详细的信息。然而,大多数编译器已经变得足够先进,不再是一件大事了。
另一个主要好处(我认为无论如何)是,使用解释型语言,您不必等待永久的项目编译以测试它。
答案 2 :(得分:0)
例如,由于我认为非常明显的原因,你不可能合理地eval
:你究竟将如何实现它?使运行时包含编译器的完整副本?每次你想要评估一个字符串(记住每次它可能不同!)你将字符串保存到一个文件,运行它上面的编译器来制作DLL / shared-lib,然后加载该DLL / shared-lib并调用你的代码?你不明白为什么这可能有点不切实际? ;)
你可以在动态语言中找到这种东西,除了基本上运行解释器之外,你无法用静态代码做什么,实际上是在幕后。
答案 3 :(得分:0)
从Dario继续 - 我想你真的在问为什么编译的程序不能在运行时评估语句(例如eval)。这是我能想到的一些原因:
编辑:如上所述,这些原因都不会使语言/编译器无法在运行时评估代码,但在开发编译器或设计语言时,它们肯定是需要考虑的事情。
答案 4 :(得分:0)
也许这个问题不是解释/编译语言(无论如何编译是模棱两可的),而是关于那些不带有自己的编译器的语言?例如,我们已经说过C ++可以使用在应用程序中漂浮的方便的编译器来实现eval,并且反射可能在某些方面类似。