引用所需的用于在C / C实现一个解释器++引用所需的用于在C / C实现一个解释器++(Refer

2019-05-13 05:15发布

我发现自己附加到一个项目,integerate一个解释到现有的应用程序。 被解释的语言是Lisp的的衍生物,使用应用程序特定内建。 个人“计划”将在应用程序运行批处理风格。

我很惊讶,这些年来我已经写了一对夫妇的编译器,以及一些数据,语言翻译/解析器,但我从来没有真正写的前一个解释。 原型是很远一起,为语法树遍历,在C ++实现的。 我可能会影响建筑超越了原型,但不是执行语言(C ++)。 因此,约束:

  • 实施将在C ++
  • 解析可能会被用YACC /野牛语法(现在是)处理
  • 完全VM /口译生态喜欢NekoVM和LLVM的建议,也有可能不是这个项目的实际。 自包含的是更好的,即使这听起来像NIH。

我真正寻找的是在实施口译基础阅读材料。 我做的所以一些浏览,并称为另一个网站LAMBDA极限 ,但他们更倾向于编程语言理论导向。

一些到目前为止,我已经收集到的花絮:

  • Lisp的小块 ,由基督教Queinnec。 推荐它的人说,“从小事做起翻译进入更先进的技术和完成呈现字节码‘计划,以C’编译器。”

  • NekoVM 。 正如我上面提到的,我不相信我们会被允许纳入整个虚拟机架构来支持这个项目。

  • 计算机程序的构造和解释 。 本来我认为,这可能是矫枉过正,但通过健康的大块工作过,我同意@JBF。 非常翔实和思维拓展。

  • 在Lisp的保罗·格雷厄姆。 我读过这一点,虽然它是一个内容丰富的介绍Lisp的原则,是远远不够的,以启动构建一个解释。

  • 鹦鹉实现 。 这似乎是阅读的乐趣。 不知道它会为我提供了基本面。

  • 计划从头开始 。 彼得·米肖被攻击计划的各种实现方式,由C语言编写的(用作以后的项目的引导)的快速和肮脏的方案解释器来编译计划代码。 非常有趣为止。

  • 语言实现模式:建立自己的特定领域和通用编程语言 ,在评论跟帖推荐的图书在创建解释型语言 。 这本书包含了致力于建设口译实践两章,所以我将它添加到我的阅读队列。

  • 新的 (但 ,即1979年): 编写交互编译器和解释由PJ布朗。 这是长期绝版,但是在提供的一个基本解释的实施相关的各项工作任务大纲有趣。 我已经看到了这一个褒贬不一的评价,但因为它是便宜(我有它在用于围绕3.50 $顺序)我给它一个旋转。

那么怎么样了? 是否有一个很好的书,由手拿新手,并展示了如何在C / C构建一个解释++的类Lisp语言? 你有没有语法树步行者或字节码解释器的偏好?

要回答@JBF:

  • 目前的原型是一个解释,这对我来说很有意义,因为我们要接受一个任意代码文件的路径,并在我们的应用程序环境中执行它。 该内建函数是用来影响我们在内存中的数据表示。

  • 它不应该是可怕缓慢。 目前树遍历似乎是可以接受。

  • 语言是基于 Lisp的,但不是Lisp的,所以不需要符合标准。

  • 正如上面提到的,这是不可能的,我们将允许添加一个完整的外部VM /口译项目来解决这个问题。

其他海报,我会检查你的引文也是如此。 谢谢大家!

Answer 1:

简短的回答:

对于Lisp解释基本的阅读清单是SICP。 我不会在所有调用它矫枉过正,如果你觉得你是大材小用的书跳转到第4章的第一部分,并开始解释远(虽然我觉得这将是自章亏损1-3确实是好!) 。

添加LISP小块(从现在起LISP),第1-3章。 特别是第3,如果你需要实现任何不平凡的控制形式。

看到这个帖子由延阿克塞尔Søgaard上最小的自托管方案: http://www.scheme.dk/blog/2006/12/self-evaluating-evaluator.html 。

稍长的答案:

这是很难不知道你从你的解释需要什么给意见。

  • 它真的真的需要一个解释,或者你真的需要能够执行Lisp代码?
  • 它需要要快?
  • 它需要符合标准? 常见的嘴唇? R5RS? R6RS? 任何SFRIs你需要什么?

如果你需要什么更看中的不是一个简单的语法树遍历我会强烈建议嵌入一个快速计划子系统。 开局方案浮现在脑海: http://dynamo.iro.umontreal.ca/~gambit/wiki/index.php/Main_Page 。

如果不是在SICP和章节选项第5章5--在LISP目标编译为加快执行速度。

为了更快地解释我想看看最近的JavaScript解释器/编译器。 似乎有很多想法进入快速的JavaScript执行,而你也许可以向他们学习。 V8举了两个重要文件: http://code.google.com/apis/v8/design.html和金鳞引用了几个: http://webkit.org/blog/189/announcing-squirrelfish/ 。

也有规范的方案论文: http://library.readscheme.org/page1.html的兔子编译器。

如果我搞有点过早炒作,内存管理可能是难啃的骨头。 尼尔斯·霍尔姆中号已经出版了一本书“计划9从空的空间” http://www.t3x.org/s9fes/其中包括一个简单的stop-的世界标志和清除垃圾收集器。 包含源代码。

:约翰·罗斯(JVM的新的成名)已经于整合计划,以C写的一纸http://library.readscheme.org/servlets/cite.ss?pattern=AcmDL-Ros-92 。



Answer 2:

是在SICP。

我做这个任务,多次和这里的,如果我是你,我会怎么做:

首先设计你的内存模型。 你会想一些类型的GC系统。 这是WAAAAY容易做到第一不是以后狼吞虎咽它。

设计你的数据结构。 在我的实现,我有一个基本的缺点与一些基本类型的对话框:原子,字符串,数字,列表,布尔,原始功能。

设计你的虚拟机,一定要保持干净的API。 我最后实现了这是一个顶级的API(原谅格式 - 所以pooching我的预览)

ConsBoxFactory &GetConsBoxFactory() { return mConsFactory; }
AtomFactory &GetAtomFactory() { return mAtomFactory; }
Environment &GetEnvironment() { return mEnvironment; }
t_ConsBox *Read(iostream &stm);
t_ConsBox *Eval(t_ConsBox *box);
void Print(basic_ostream<char> &stm, t_ConsBox *box);
void RunProgram(char *program);
void RunProgram(iostream &stm);

不需要RunProgram - 这是一个在读,评估和演示,和打印方面的实现。 REPL是解释一个共同的模式,尤其是LISP。

一个ConsBoxFactory可作出新的利弊盒,并对其进行操作。 一个AtomFactory用于使得等效符号原子映射到恰好一个对象。 的环境中使用,以保持符号以缺点框的结合。

你的大部分工作都应该进入这三个步骤。 然后你会发现你的客户端代码和支持代码开始看起来非常像LISP太:

t_ConsBox *ConsBoxFactory::Cadr(t_ConsBox *list)
{
    return Car(Cdr(list));
}

你可以写在YACC /法分析器,但何必呢? Lisp是一个非常简单的语法和扫描仪/递归下降分析器对,因为这是约两个小时的工作。 最糟糕的部分是写谓词识别标记(即IsString,ISNUMBER,IsQuotedExpr等),然后写程序到令牌转换成利弊箱。

可以很容易地编写胶流入和流出的C代码,并可以很容易地调试问题,当事情出错。



Answer 3:

该卡明口译塞缪尔卡明的书编程语言,解释器为基础的方法 ,由蒂莫西·巴德转换为C ++。 我不知道裸源代码将多么有用,因为它意味着去的书,但它是一本好书,涵盖在低级语言Lisp的执行,包括垃圾收集等基础知识(这不是书,这在一般的编程语言的焦点,但它被覆盖。)

Lisp的小块进入更深入,但是这是有好有坏了你的情况。 有很多材料的编译和这样会不会与你有关,而其简单的解释是方案,而不是C ++。

SICP是好的,肯定。 不是矫枉过正,但当然书面解释仅仅是这本书的一小部分。

该JScheme的建议是一个很好的,太(它由我采用了一些代码),但不会帮助你的东西像GC。

我可能会多提建议以后充实了这一点。

编辑:有几个人说,他们从我了解到awklisp 。 这是无可否认的那种怪异的建议,但它是非常小的,可读性强,实际可用,而不像其他微小,但可读玩具的Lisp它,而不是实现依赖于底层的高级执行语言自身的垃圾收集和数据表示为他们提供。



Answer 4:

看看来自彼得·诺维格JScheme 。 我发现这个令人惊讶的简单理解和端口C ++。 呃,不知道如何使用方案作为脚本语言,虽然 - 它教给jnrs很麻烦,感觉日期(1980年helloooo的)。



Answer 5:

我想延长我的推荐程序语言:应用和解释 。 如果你想编写一个解释,那本书将带您有在很短的路径。 如果通过写你读的代码,做你结束了一堆类似的解释却不同(一个是渴望,另一种是懒惰的,一个是动态的,其他的一些打字,一个具有动态范围内,行使阅读其它具有词法作用域等)。



文章来源: References Needed for Implementing an Interpreter in C/C++