文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

在这一系列的文章中, 我会尝试解释如何在go里编写一款go语言的解释器. 如果你跟我一样,缺少对解释器方面的人是,那你应该学习一下这方面的内容了.

引言

Go 语言已经开始涉及科学领域和数据领域. 是的, 为什么是Go? Go 语言可以被快速的编译和执行, 由于它的类型是静态的,因此它呈现了一个良好的“编写/编译/运行“的开发时代。此外,使用go编写的程序具有易部署性,并且可以在多种机器和操作系统进行交叉编译。

此外 Go 也已经开始启动编写助力科学工作的基础库:

第 1 段(可获 1.28 积分)

数据科学社区正在围绕gopherds社区(slack通道:#data-science)自我发展。

对于数据科学,主要的工具和工作流程是Jupyter及其笔记本。 Jupyter笔记本提供了一个很好的基于“REPL”的工作流程和共享算法,图表和结果的能力。 REPL(读取 - 评估 - 打印 - 循环)允许人们参与某人的数据的快速探索性工作,快速迭代各种算法或用不同的方式来解释数据。 对于这种工作,交互式翻译是至关重要的。

第 2 段(可获 1.19 积分)

Go 也是需要编译的,即使编译过程快如闪电, 一个真正的编译器需要与基于REPL的工作流进行良好的集成.

go-interpreter 项目 (在Slack: #go-interpreter上可以找到) 正在实现这一目标: 在 Go 里编写一个Go的编译器(好绕口). 第一步是搞一个这货: here.

在那之前,我们先来绕个圈: 我们用go来编写一个Python语言的玩具型编译器. 你想问为什么?… 好吧,在AOSA有一个很有意思的系列文章:  一个使用Python编写的Python编译器. 我将把它当作一个编写编译器的参考.

第 3 段(可获 1.31 积分)

PyGo: 一个玩具型Python编译器

接下来, 我将展示如何使用 Go 编写一个玩具型的Python编译器. 但首先, 我们先来明确的定义一下pygo能够做什么,pygo不做词法分析,只是解释和编译python代码.

不,pygo会直接把编译好的字节码,与python3配合解释字节码指令:

shell> python3 -m compileall -l my-file.py
shell> pygo ./__pycache__/my-file.cpython-35.pyc

这样pygo会成为一个简单的字节码解释器,通过使用一个主循环来提取字节码指令并且执行他们,pseudo里的Go代码是这样的:

第 4 段(可获 0.91 积分)
func run(instructions []instruction) {
	for _, instruction := range instructions {
		switch inst := instruction.(type) {
			case opADD:
				// perform a+b
			case opPRINT:
				// print values
			// ...
		}
	}
}

pygo 会导出几种类型用来实现一个编译器:

  • pygo.VM 类型保存每一帧的调用堆栈,并且管理这些框架的上下文中指令的执行,
  • pygo.Frame 类型用来保存栈信息 (全局、本地,、方法内信息 …),
  • pygo.Block 类型用来处理控制流(ifelsereturn,continue等等…),
  • pygo.Instruction 类型用来模拟操作码 (ADDLOAD_FAST,PRINT, …) 和他们的参数 (if any).

Ok. 今天先到这. 下回见…

同时, 推荐一下 AOSA  的文章.

第 5 段(可获 1 积分)

文章评论