[翻译]编译器(9)-解析

原文在此
————翻译分隔线————

编译器(9)-解析

第一部分:介绍
第二部分:编译、转译和解释
第三部分:编译器设计概览
第四部分:语言设计概述
第五部分:Calc 1 语言规格说明书
第六部分:标识符
第七部分:扫描
第八部分:抽象语法树

长征已经走了很远。我们概览了扫描和抽象语法树的基本概念。现在终于可以向着解析前进。 Continue reading “[翻译]编译器(9)-解析”

[翻译]编译器(8)-抽象语法树

原文在此
————翻译分隔线————

编译器(8)-抽象语法树

第一部分:介绍
第二部分:编译、转译和解释
第三部分:编译器设计概览
第四部分:语言设计概述
第五部分:Calc 1 语言规格说明书
第六部分:标识符
第七部分:扫描

在构建解析器之前,首先应当谈谈如何处理目标数据。

需要用某种抽象数据类型来保存所有需要解析的数据。树形数据结构很好的满足了我们的需求。这个树描述了编程语言的语法结构,它被很恰当的叫做抽象语法树(AST)。 Continue reading “[翻译]编译器(8)-抽象语法树”

[翻译]编译器(7)-扫描

原文在此
————翻译分隔线————

编译器(7)-扫描

第一部分:介绍
第二部分:编译、转译和解释
第三部分:编译器设计概览
第四部分:语言设计概述
第五部分:Calc 1 语言规格说明书
第六部分:标识符

现在终于可以开始在扫描器上工作了。 Continue reading “[翻译]编译器(7)-扫描”

[翻译]编译器(6)-标识符

原文在此
————翻译分隔线————

编译器(6)-标识符

第一部分:介绍
第二部分:编译、转译和解释
第三部分:编译器设计概览
第四部分:语言设计概述
第五部分:Calc 1 语言规格说明书

在本文中,我们终于可以开始沉浸在代码中去了! Continue reading “[翻译]编译器(6)-标识符”

[翻译]编译器(5)-语言规格说明书

原文在此
————翻译分隔线————

编译器(5)-语言规格说明书

第一部分:介绍
第二部分:编译、转译和解释
第三部分:编译器设计概览
第四部分:语言设计概述

这是最后一部分关于 Calc 的设计规格! Continue reading “[翻译]编译器(5)-语言规格说明书”

[翻译]编译器(4)-语言设计

原文在此。另外推荐阅读王大师的“设计和开发 Yin 语言”,你会看到另一个完全不同的语言设计思路
————翻译分隔线————

编译器(4)-语言设计

第一部分:介绍
第二部分:编译、转译和解释
第三部分:编译器设计概览

在第一部分概述了这一系列文章将介绍的内容。在第二、三部分粗略的浏览了计算机语言编译的各个步骤。

在本文中,将会比上几篇概述介绍的内容略微详细一些。我将讨论语言的规格说明书。 Continue reading “[翻译]编译器(4)-语言设计”

[翻译]编译器(3)-编译器设计概览

原文在此
————翻译分隔线————

编译器(3)-编译器设计概览

第一部分:介绍
第二部分:编译、转译和解释

我们正在编写什么?

简单来说,是一个计算器。一个用于超级简单的数学语言的编译器。 Continue reading “[翻译]编译器(3)-编译器设计概览”

[翻译]编译器(2)-编译、转译和解释

原文在此
————翻译分隔线————

编译器(2)-编译、转译和解释

第一部分作为这一系列文章的介绍。

在第二部分,在真正深入到编译实际的步骤之前,我会对一些定义作一些概述。 Continue reading “[翻译]编译器(2)-编译、转译和解释”

[翻译]编译器(1)-使用 Go 开发编译器

好文不多说,系列长文,大家耐心等吧。原文在此
————翻译分隔线————

编译器(1)-使用 Go 开发编译器

概述

我对编译器的工作原理已经感兴趣很久了。神秘的指令和奇异的行为总是会令我迷惑不已。也从未真正理解优化是如何进行的,以及编译器又是如何知道我到底做错了什么。

当我决定学习如何编写编译器的时候,我发现有许多关于这个领域的术语和缩写。什么是 SLR 或 LALR 解析器?什么是该死的词位(lexeme)或有限自动机(finite automata)?什么是递归下降分析(recursive-descent parsing)?什么是 AST?

最开始的时候,这真是铺天盖地。 Continue reading “[翻译]编译器(1)-使用 Go 开发编译器”

Golang 在 POSIX 系统下使用 PID 判断进程是否存在的方法

这是存在于 golib 库中一个长达两年的 bug。之前虽然有遇到,但也不是什么十分大的问题,所以没有留意。今天再次遇到,突然有点不爽,强迫症发作。

golib 的 pid 子包设计用于帮助服务进程生成 POSIX 系统下的 PID 文件。首先程序会判断指定的 PID 文件是否存在,以及该文件中标识的进程是否存在。如果进程存在则返回 ErrProcessExists 的错误;反之,如果进程不存在,则用新的 PID 覆盖文件内容。之前的代码使用了 os.FindProcess,但是这个函数的行为,与其文档描述实际在 POSIX 系统上是存在差异的。可以参考 go-nut 上的讨论,或者 Issue 7392048
Continue reading “Golang 在 POSIX 系统下使用 PID 判断进程是否存在的方法”