Interpreted languages - leveraging the compiled language behind the interpreter如果那里有语言设计人员(或者只是简单的人),我对为解释语言创建标准库的方法感到好奇。 具体来说,什么是最好的方法? 用解释语言定义标准函数/方法,或用编写解释器的编译语言执行那些调用的处理? 我想到的是关于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代码。 在这种情况下,"利用解释器后面的编译语言"的能力可被描述为新实现的主要动机。 请参阅www.lua.org上的"纸张"部分。 特别是Lua 5.0的实现 Lua在基础(ANSI C)代码中定义了所有标准功能。我相信这主要是出于性能方面的考虑。最近,即'string。*'函数在纯Lua中获得了另一种实现,这对于Lua在.NET或Java运行时(无法使用C代码)之上运行的子项目可能证明是至关重要的。 只要您将便携式API用于已编译的代码库(例如ANSI C标准库或C ++中的STL),那么利用这些功能就可以避免重新发明轮子,并可能提供更小,更快的解释器。 Lua采用这种方法,并且与许多其他方法相比,它绝对是小型且快速的。 |