文档结构  
可译网翻译有奖活动正在进行中,查看详情 现在前往 注册?
原作者:Sebastien Binet    来源:sbinet.github.io [英文]
coyee    计算机    2016-09-12    0评/353阅
翻译进度:80%   参与翻译: lison (4)

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

引言

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

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

第 1 段(可获 1.28 积分)

And the data science community is bootstrapping itself around the gopherdscommunity (slack channel: #data-science).

For data science, a central tool and workflow is the Jupyter and its notebook. The Jupyter notebook provides a nice “REPL”-based workflow and the ability to share algorithms, plots and results. The REPL (Read-Eval-Print-Loop) allows people to engage fast exploratory work of someone’s data, quickly iterating over various algorithms or different ways to interpret data. For this kind of work, an interactive interpreter is paramount.

第 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 积分)

文章评论