如果有任何语言设计者(或者只是了解的人),我对为解释性语言创建标准库背后的方法感到好奇。具体来说,最好的方法是什么?用解释性语言定义标准函数/方法,或用编写解释器的编译语言执行这些调用的处理?

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

有帮助吗?

解决方案

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

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

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

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

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

其他提示

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

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

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

尤其 Lua 5.0的实现

Lua 在底层(ANSI C)代码中定义了所有标准函数。我相信这主要是出于性能原因。最近,即“string.*”函数在纯 Lua 中得到了替代实现,这对于 Lua 在 .NET 或 Java 运行时(不能使用 C 代码)之上运行的子项目至关重要。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top