我发现自己连接到一个项目,以integerate翻译成一种现有应用程序。语言进行解释是一个衍生物的口齿不清,与应用特定的内置.个人'程序'将运行批处理风格中的应用。

我惊讶的是,多年来,我已经写了几个编译器,以及几个数据语言翻译人员/分析程序,但我从来没有真正的书面解释之前。原型是很远沿着,实现作为一个法树沃克,在C++。我可以影响的建筑超越了原型,但没有实现语言(C++)。因此,约束:

  • 实施将在C++
  • 分析可能会处理一个yacc/野牛文法(现在)
  • 建议的全虚拟机/口译员的生态状NekoVM和编程可能是不切实际的,对这个项目。自立的是更好,即使这听起来像美国国立卫生研究院.

什么我是真的在寻找的是阅读材料的基础实施的口译员。我做了一些浏览的那么,和另一个网站,称为 Lambda最终, 虽然他们更倾向于编程语言的理论。

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

  • 口齿不清的小片, 通过基督教Queinnec.人建议说,这"从琐碎的口译员,以更先进的技术,并完成呈现码和'方案C编译器。"

  • NekoVM.正如我以上所述,我怀疑,我们允许并入一个整个虚拟机的框架,以支持这个项目。

  • 结构和解释计算机程序.本来我建议,这可能是过度的,但具有合作,通过一个健康的大块,我同意@JBF.非常翔实和令扩大。

  • 在口齿不清 由保罗*格雷厄姆。我已经阅读本,而它是一个内容丰富的介绍口齿不清的原则,是不够的启动建设一个口译员。

  • 鹦鹉的执行情况.这似乎是一个有趣的读。不肯定它将为我提供的基本原则。

  • 方案从头开始.彼得*米修攻击的各种实现方案中,从一个快速的和肮脏的计划的口译员编写C(用作引导在以后的项目)来编制方案的代码。非常有趣为止。

  • 语言的执行模式:创建你自己的领域特定的和一般程序语言, 建议在评线 书上的创建理解的语言.这本书包含两个章节专门用于实践的建立口译员,所以我将它添加到我的读书的队列。

  • 新的 (但 , 即1979): 编写互动的汇编者和翻译 P.J.棕色的。这是长出来的打印,但是有趣的在提供一个纲要的各项任务的执行相关联的一个基本的解释。我已经看到的混合评论这个,但是因为它便宜(我有了用于周围3.50美元)我给它一个旋转。

所以怎么样呢?是有一本好书,需要新手的手,并显示了如何建立一个口译员在C/C++对于一个口齿不清样的语言?你有偏爱的语法树者或口译码?

回答@JBF:

  • 目前的原型是一个解释,它对我来说很有意义,因为我们接受路径任意代码的文件和执行它在我们的应用环境。将内置是用来影响我们的内存数据的代表性。

  • 它不应令人发指的缓慢。目前的树沃克似乎可以接受的。

  • 的语言 基于 在口齿不清,但不是口齿不清,因此没有遵守标准要求。

  • 如上所述,这是不可能的,我们会被允许添加一个完整的外部虚拟机/口译员的项目,以解决这个问题。

其他的海报,我会检查你的引文。谢谢!

有帮助吗?

解决方案

简短的回答:

基本的阅读清单的一些口译员是sic颗粒的.我不会在所有呼吁它矫枉过正,如果你觉得你是大材小用的第一份书跳到第4章,并开始解释务(尽管我觉得这将是一个损失,因为章1-3的真的很好!).

添加舌头在小片(LIST从现在起),章节1至3。特别是第3章如果你需要实现任何非微不足道的控制的形式。

看看这个员额的延斯*阿尔Søgaard上最小的一个自主机方案: http://www.scheme.dk/blog/2006/12/self-evaluating-evaluator.html .

稍长的回答:

它是难以给出建议,不知道有什么你需要从你的口译员。

  • 它真的真的需要一个解释,或者你真的需要能够执行大舌头的代码?
  • 它不会需要快?
  • 不需要标准的遵守?共同的嘴唇?R5RS?R6RS?任何SFRIs你需要什么?

如果你需要什么更多的花不是一个简单的语法树沃克我强烈建议嵌入一个快速方案的子系统。开局方案涉及到记: http://dynamo.iro.umontreal.ca/~局/wiki/索引。php/Main_Page .

如果这不是一个选项,第5章,在sic颗粒和5章-在口齿不清的目标汇编为加快执行速度。

为更快的解释,我要看一看最近的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/ 其中包括一个简单的停止世界标记和清扫垃圾的收集器。来源包括在内。

约翰*玫瑰(新JVM名)已经编写了一份关于综合方案C: http://library.readscheme.org/servlets/cite.ss?pattern=AcmDL-Ros-92 .

其他提示

是的在sic颗粒的.

我已经做到了这一任务,多次在这里就是我想要做如果我是你:

设计你的存储器模型的第一次。你会想GC系统的某种。这是有史以来容易做到这一比螺栓后。

设计数据的结构。在我的实现方式,我有一个基本缺点框有一些基本类型:原子、串号码,列表中,bool的、原始的功能。

设计虚拟机,并确保保持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不需要-这是实现在阅读,Eval和打印。REPL是一种常见的模式,用于口译员,特别是口齿不清。

一ConsBoxFactory可以使新的弊盒和操作上的他们。一个AtomFactory被使用,因此,相当于象征性的原子地图,确切的一个对象。环境是用来保持结合的符号弊盒。

大部分的工作应该进入这三个步骤。然后你会发现你的客户代码和支持的代码看起来非常像口齿不清的:

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

你可以写分析器在yacc/lex,但为什么麻烦?舌头是一个非常简单的语法和扫描仪/递归下降的分析器对于它是有关两个小时的工作。最糟糕的部份是书面谓的识别标记(即,IsString,IsNumber,IsQuotedExpr,等等),然后书面程序转换的标记入弊盒。

使它容易写胶入和流出的C码并使其易于调试的问题时,事情出错。

该卡的口译员 从塞缪尔*卡明的书 编程语言、口译为基础的方法, 翻译C++由蒂莫西*巴德。我不知道该如何有用的赤裸的源代码,因为它意味着要与书,但这是一个很好的书,涵盖了基础实施舌头在一个低级的语言,包括垃圾收集等。(那不是重点的书,这是编程语言中的一般,但它是复盖。)

口齿不清的小片 会进入更深入,但是,这是好的和坏的,你的情况。有很多的材料汇编以及这样会不会有关于你,与其简单的口译员方案,而不是C++.

Sic颗粒的是良好的,肯定。不矫枉过正,但是当然的写作的口译人员只是一小部分的书籍。

该JScheme的建议是一个很好的,太(它包含一些代码被我),但不会帮助你的东西喜欢GC。

我可能会血肉此出更多的建议后。

编辑: 一些人说,他们学会了自我 awklisp.这是无可否认的一种奇怪的建议,但它非常小,可读性、实际可用,并且不同于其他微小但可读的玩具Lisps它实现了其自己的垃圾收集和数据表示的,而不是依赖于一种潜在的高水平实的语言向他们提供。

检查了 JScheme彼得Norvig.我发现了这个非常简单的理解和口C++。呃,不知道有关使用方案作为一个脚本语言,但学到jnrs是繁琐和感觉月(helloooo1980年)。

我谨建议 编程语言:适用和解释.如果你想要写一个解释的,这本书你有在非常短的路径。如果你读过书写的代码阅读和做运动你结束了一堆类似的口译员,但是不同的(一个是渴望,其他是懒惰,一个是动态的,另有一些输入,一个具有动态范围,将其他有词汇范围等)。

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