Programming languages 解释标准库

Programming languages 解释标准库,programming-languages,interpreter,language-implementation,Programming Languages,Interpreter,Language Implementation,编程语言通常附带一个标准库,该库至少部分由语言本身实现 在解释语言的情况下,显而易见的实现是在解释器启动时读取库源文件,但这会遇到一个混乱但持续存在的问题,即确保解释器知道在哪里可以找到这些文件,即使两者都被移动。如果可以将它们嵌入解释器本身,那么会更干净,因此只有一个可执行文件 我可以通过将库源文件转换为C文本字符串来找到一种简单的方法,但我很好奇是否有我忽略的陷阱或对该方法的改进 因此,我的问题是,现有的解释语言是如何将语言本身的库源文件附加到解释器的?字节码虚拟机通常会提供一个答案:将字节

编程语言通常附带一个标准库,该库至少部分由语言本身实现

在解释语言的情况下,显而易见的实现是在解释器启动时读取库源文件,但这会遇到一个混乱但持续存在的问题,即确保解释器知道在哪里可以找到这些文件,即使两者都被移动。如果可以将它们嵌入解释器本身,那么会更干净,因此只有一个可执行文件

我可以通过将库源文件转换为C文本字符串来找到一种简单的方法,但我很好奇是否有我忽略的陷阱或对该方法的改进


因此,我的问题是,现有的解释语言是如何将语言本身的库源文件附加到解释器的?

字节码虚拟机通常会提供一个答案:将字节码存储在文件(*.pyc,*.rbc)中,并使用更简单的机制加载库的字节码版本

Smalltalks通过将标准堆转储到称为“映像”的单独文件中来实现这一点


对于单文件分发,将库文件附加到可执行文件的末尾,并包括特殊逻辑,以便解释器从二进制文件中读取并找到这些可解释程序数据的结构,或者,构建包含程序数据的静态解释器。

您提到的问题根本不需要出现。只是不要移动这些东西,或者在必要时更新语言的模块搜索路径。移动这些东西与使用编译语言做同样的事情有什么不同。您可以将内容保留在编译器/interp知道在哪里找到它们的默认位置,或者您需要告诉编译器/interp您将它们放在哪里。此外,Lisp方言通常与pyc/rbc的形式类似,称为“FASL”s(代表“快速加载”),即字节码或某种可链接的动态二进制格式(因此,它不是一个完全的对象文件,但比字节码更优化)。