5

如果那里有任何语言设计者(或者只是知道的人),我很好奇为解释语言创建标准库的方法。具体来说,什么似乎是最好的方法?在解释语言中定义标准函数/方法,或者在编写解释器的编译语言中执行这些调用的处理?

让我想到这一点的是关于 Python 中类似 stripslashes() 的函数的 SO 问题。我的第一个想法是“为什么不定义自己的,只在需要时调用它”,但它提出了一个问题:对于这样的函数,让解释语言处理该开销是否更可取,还是更好编写扩展并利用解释器背后的编译语言?

4

4 回答 4

6

如今,“解释”和“编译”语言之间的界限真的很模糊。例如,Python 在看到源代码时所做的第一件事就是将其编译为字节码表示,这与 Java 在编译类文件时所做的基本相同。这是 *.pyc 文件包含的内容。然后,python 运行时在不参考原始源的情况下执行字节码。传统上,纯解释型语言在执行程序时会连续引用源代码。

在构建一门语言时,这是一个很好的方法来构建一个坚实的基础,您可以在此基础上实现更高级别的功能。如果你有一个可靠、快速的字符串处理系统,那么语言设计者可以(并且应该)在基本运行时之外实现类似 stripslashes() 的东西。这样做至少有几个原因:

  • 语言设计者可以证明该语言足够灵活,可以处理这类任务。
  • 语言设计者实际上用该语言编写了真正的代码,该语言有测试,因此表明基础是坚实的。
  • 其他人可以更轻松地阅读、借用甚至更改更高级别的功能,而无需能够构建甚至理解语言核心。

仅仅因为像 Python 这样的语言编译成字节码并执行并不意味着它很慢。没有理由不能按照 Java 和 .NET 已经在做的那样为 Python 编写即时 (JIT) 编译器来进一步提高性能。事实上,IronPython 将 Python 直接编译为 .NET 字节码,然后使用包括 JIT 在内的 .NET 系统运行。

要直接回答您的问题,语言设计者唯一会在运行时背后的语言(例如 Python 的 C 语言)中实现函数的时候是最大化该函数的性能。这就是为什么像正则表达式解析器这样的模块是用 C 而不是原生 Python 编写的。另一方面,像 getopt.py 这样的模块是用纯 Python 实现的,因为它都可以在那里完成,并且使用相应的 C 库没有任何好处。

于 2008-08-17T12:39:58.860 回答
3

还有一种趋势是重新实现传统上被认为是“解释”到 JVM 或 CLR 等平台上的语言,然后允许轻松访问“本机”代码以实现互操作性。因此,您可以从 Jython 和 JRuby 轻松访问 Java 代码,而从 IronPython 和 IronRuby,您可以轻松访问 .NET 代码。

在这种情况下,“利用解释器背后的编译语言”的能力可以被描述为新实现的主要动力。

于 2008-08-17T13:33:17.053 回答
2

请参阅www.lua.org上的“论文”部分。

特别是Lua 5.0的实现

Lua defines all standard functions in the underlying (ANSI C) code. I believe this is mostly for performance reasons. Recently, i.e. the 'string.*' functions got an alternative implementation in pure Lua, which may prove vital for subprojects where Lua is run on top of .NET or Java runtime (where C code cannot be used).

于 2008-09-17T19:44:41.070 回答
1

只要您为编译的代码库使用可移植的 API,例如ANSI C 标准库或C++ 中的STL,那么利用这些函数就可以避免重新发明轮子,并可能提供更小、更快的解释器。Lua采用这种方法,与许多其他方法相比,它绝对是小而快的。

于 2008-08-17T13:41:11.327 回答