解释语言-利用解释器背后的编译语言

时间:2020-03-05 18:40:08  来源:igfitidea点击:

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

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

解决方案

回答

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

在构建语言时,这是一种建立扎实基础的好方法,我们可以在此基础上实现更高级别的功能。如果我们有一个稳定,快速的字符串处理系统,那么语言设计人员可以(并且应该)在基本运行时之外实现诸如stripslashes()之类的东西。这样做至少出于以下几个原因:

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

仅仅因为Python之类的语言可以编译并执行字节码,并不意味着它就很慢。没有理由为什么有人不能像Java和.NET一样为Python编写即时(JIT)编译器来进一步提高性能。实际上,IronPython将Python直接编译为.NET字节码,然后使用包含JIT的.NET系统运行该字节码。

为了直接回答问题,语言设计人员唯一的可能是使用运行时背后的语言(例如,对于Python为C)来实现功能,这将是最大化该功能的性能。这就是为什么诸如正则表达式解析器之类的模块是用C而不是本机Python编写的原因。另一方面,像getopt.py这样的模块是在纯Python中实现的,因为它可以在此完成,并且使用相应的C库没有任何好处。

回答

重新实现在传统上被认为是"解释"到JVM或者CLR等平台上的语言的趋势也越来越大,然后允许轻松访问"本机"代码以实现互操作性。因此,从Jython和JRuby,我们可以轻松访问Java代码;从IronPython和IronRuby,我们可以轻松访问.NET代码。

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

回答

只要我们将便携式API用于已编译的代码库(例如ANSI C标准库或者C ++中的STL),然后利用这些功能就可以避免重新发明轮子并可能提供更小,更快的解释器。 Lua采用这种方法,并且与许多其他方法相比,它绝对是小型且快速的。

回答

请参阅www.lua.org上的"纸张"部分。

特别是Lua 5.0的实现

Lua在基础(ANSI C)代码中定义了所有标准功能。我相信这主要是出于性能方面的考虑。最近,即'string。*'函数在纯Lua中获得了替代实现,这对于在.NET或者Java运行时(无法使用C代码)之上运行Lua的子项目可能证明至关重要。