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

原文在此。 ————翻译分隔线———— 编译器(8)-抽象语法树 第一部分:介绍 第二部分:编译、转译和解释 第三部分:编译器设计概览 第四部分:语言设计概述 第五部分:Calc 1 语言规格说明书 第六部分:标识符 第七部分:扫描 在构建解析器之前,首先应当谈谈如何处理目标数据。 需要用某种抽象数据类型来保存所有需要解析的数据。树形数据结构很好的满足了我们的需求。这个树描述了编程语言的语法结构,它被很恰当的叫做抽象语法树(AST)。 AST 树形数据结构总是从一个根开始,我们的也是一样。通常,...阅读全文

mikespook 的博客 2014/05/14 mikespook

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

原文在此。 ————翻译分隔线———— 编译器(9)-解析 第一部分:介绍 第二部分:编译、转译和解释 第三部分:编译器设计概览 第四部分:语言设计概述 第五部分:Calc 1 语言规格说明书 第六部分:标识符 第七部分:扫描 第八部分:抽象语法树 长征已经走了很远。我们概览了扫描和抽象语法树的基本概念。现在终于可以向着解析前进。 如果你已经开始与概念点不停的斗争,那么我需要警告你,从现在开始会变得越来越难。解析可能是你脑袋里已有的概念中最难的部分。我们将处理扫描器发现的词素,给它们提供一个含义...阅读全文

mikespook 的博客 2014/05/20 mikespook

[翻译]编译器(10)-编译到 C

原文在此。 ————翻译分隔线———— 编译器(10)-编译到 C 第一部分:介绍 第二部分:编译、转译和解释 第三部分:编译器设计概览 第四部分:语言设计概述 第五部分:Calc 1 语言规格说明书 第六部分:标识符 第七部分:扫描 第八部分:抽象语法树 第九部分:解析 终于到最后一个步骤了! 我们的语言规格说明书如此简单,其实可以跳过 C 直接输出汇编。我有两个不这么做的原因。首先,移植性。在这个指引中,我无须编写任何特定架构的 C 代码。C 已经被移植到各种不同的系统中去了,因此可以让 C...阅读全文

mikespook 的博客 2014/05/27 mikespook

[翻译]冰激淋制造商和数据竞态

Dave 总是会给我们带来这种很浅显有趣,又意义深刻的文章。原文在此:Ice cream makers and data races。 ————翻译分隔线———— 冰激淋制造商和数据竞态 Dave Cheney 这是一篇关于数据竞态的文章。本文的相关代码在 Github 上:github.com/davecheney/benandjerry。 这个例子模拟了两个冰激淋制造商 Ben 和 Jerry 随机接待他们的客户。 package main import "fmt" type IceCrea...阅读全文

mikespook 的博客 2014/06/27 mikespook

[翻译]十条有用的 Go 技术

原文在此,实用总结。 ————翻译分隔线———— 十条有用的 Go 技术 这里是我过去几年中编写的大量 Go 代码的经验总结而来的自己的最佳实践。我相信它们具有弹性的。这里的弹性是指: 某个应用需要适配一个灵活的环境。你不希望每过 3 到 4 个月就不得不将它们全部重构一遍。添加新的特性应当很容易。许多人参与开发该应用,它应当可以被理解,且维护简单。许多人使用该应用,bug 应该容易被发现并且可以快速的修复。我用了很长的时间学到了这些事情。其中的一些很微小,但对于许多事情都会有影响。所有这些都仅...阅读全文

mikespook 的博客 2014/07/24 mikespook

[翻译] channel 独木难支

原文在此。遗憾的是文章只提出了问题,并没明确提供如何解决这些问题。但无论如何,对于这种可以引起反思的文章,是不能放过的。另外,我得承认,似乎高层次的分布式系统的抽象,用函数式语言的范式来表述更容易一些(实现上其实未必)。 ————翻译分隔线———— channel 独木难支 或者说为什么流水线作业没那么容易 勇敢和聪明的 Golang 并发模型。 @kachayev 撰写 概述 Go 被设计用于更容易的构建并发系统,因此它有运行独立的计算的 goroutine 和用于它们之间通讯的 channe...阅读全文

mikespook 的博客 2014/09/15 mikespook

[翻译]Go 是如何用 go 编译自己的

原文在此《How Go uses Go to build itself》,作者为 Dave Cheney。 ————翻译分隔线———— Go 是如何用 go 编译自己的 这篇文章基于 2013 年四月中旬我为悉尼 Go 用户组做的一次关于 Go 构建过程的演讲而成。 在邮件列表或 IRC 的频道里经常有人寻求关于 Go 编译器、运行时和内部原理的细节文档。当前,关于 Go 的内部原理的权威文档的来源就是我鼓励每个人都去阅读的源代码。虽然这样说,但是从 Go 1.0 发布以来 Go 的构建过程就已...阅读全文

mikespook 的博客 2013/06/24 mikespook

[翻译]Go 的竞态检测器

理解竞态对于并发编程来说很重要,如果能通过某种手段来了解程序中存在的竞态,以便进一步的调整避免竞态,也是非常有效的优化手段。Go 1.1 的工具链引入了竞态检测器可以检测并展示程序中存在的竞态情况。Go 团队撰写了博文详细介绍了这一工具的原理和使用。原文在此《Introducing the Go Race Detector》。 ————翻译分隔线———— Go 的竞态检测器 Dmitry Vyukov 和 Andrew Gerrand 竞态条件几乎是最为隐蔽和难以发现的程序错误。它们通常会导致诡...阅读全文

mikespook 的博客 2013/06/27 mikespook

[翻译]Go 的调度器

近期工作有些调整,所以这篇东西用了差不多两个星期才翻译完。想起 @Fenng 几年前跟我说的关于行业和工作的话,虽然出发点不太一样,但是结论还真是正确啊! 工作上的变动,就不多扯了。原文在此《The Go scheduler》。 ————翻译分割线———— Go 的调度器 Daniel Morsing 概述 Go 1.1 重要特性之一就是由 Dmitry Vyukov 贡献的新调度器。无需对程序进行任何调整,新的调度器就可以为 Go 程序带来令人兴奋的性能提升。因此我觉得有必要就此写点什么。 在...阅读全文

mikespook 的博客 2013/07/12 mikespook

[翻译]Go tip(2013-08-23)带来的变化

Dominik Honnef(之前搞错成 Russ Cox 了)在 What’s happening in Go tip (2013-08-23) 中介绍了一些关于 Go 语言的一些变化。这些变化包含了语法、性能、潜在风险和工具链。并且,这些新的东西可能会随着 Go 1.2 版本一同发布。为了方便中文读者,翻译在此。 ————翻译分隔线———— Go tip(2013-08-23)带来的变化 上周我发布了关于 Go tip 的变化的系列文章的第一篇。得到了大量的肯定,因此这是第二篇。感谢你的支持...阅读全文

mikespook 的博客 2013/08/27 mikespook

[翻译] go build 命令是如何工作的?

之前 Dave Cheney 已经为我们讲解过了 Go 是如何用 go 编译自己的。这里,他继续给大家讲解一下 go build 命令是如何工作的(原文)。 ————翻译分隔线———— go build 命令是如何工作的? 本文以 Go 的标准库为例,介绍了 Go 编译过程的工作原理。 gc 工具链 本文将关注 gc 工具链。gc 工具链的名字来自 Go 的前端编译器 cmd/gc,这主要是为了与 gccgo 工具链进行区分。当人们讨论 Go 编译器的时候,多半是指 gc 工具链。本文不关注 g...阅读全文

mikespook 的博客 2013/11/18 mikespook

[翻译]Go 数据结构

关于 Go 的内存结构在 Go 内存模型 中已经有介绍,但是内容相对简单,许多细节也一带而过。Ross Cox 的这篇文章 Go Data Structure 讲解得比较系统也很全面的一篇。翻译至此,希望能对大家有帮助。 2009 年的旧文,发现自己当时没有翻译完。所以再次做了增补和修改。如果我没记错,应该已经有人在 OSC 上发表过同一篇文章的翻译了。大家对照参考阅读吧。 ————翻译分隔线———— Go 数据结构 每当给新手介绍 Go 的时候,我发现为了建立起关于哪个操作成本更加高昂的正确观...阅读全文

mikespook 的博客 2013/12/05 mikespook

[翻译] Go 1.3 链接器大修

Go team 总是能带来一些惊喜的,关于 Go 的链接器,看来在 1.3 版本中要大修了。 ————翻译分隔线———— Go 1.3 链接器大修 Russ Cox 2013 年 11 月 摘要 在构建和运行一个标准的 Go 程序时,链接器是最慢的一部分。为了解决这个问题,我们计划将链接器拆分到两部分。其中的一部分可能会用 Go 来编写。 背景 链接器总是 Plan 9 工具链中最慢的部分之一,而现在它是 Go 工具链中最慢的部分了。Ken Thompson 在关于工具链的概述中进行了总结: 新...阅读全文

mikespook 的博客 2013/12/05 mikespook

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

好文不多说,系列长文,大家耐心等吧。原文在此。 ————翻译分隔线———— 编译器(1)-使用 Go 开发编译器 概述 我对编译器的工作原理已经感兴趣很久了。神秘的指令和奇异的行为总是会令我迷惑不已。也从未真正理解优化是如何进行的,以及编译器又是如何知道我到底做错了什么。 当我决定学习如何编写编译器的时候,我发现有许多关于这个领域的术语和缩写。什么是 SLR 或 LALR 解析器?什么是该死的词位(lexeme)或有限自动机(finite automata)?什么是递归下降分析(recursiv...阅读全文

mikespook 的博客 2014/05/06 mikespook

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

原文在此。 ————翻译分隔线———— 编译器(2)-编译、转译和解释 第一部分作为这一系列文章的介绍。 在第二部分,在真正深入到编译实际的步骤之前,我会对一些定义作一些概述。 编译 编译是直将编写的代码从一个语言翻译为另一个更低层级语言的过程。一个 C 编译器其实并不会直接输出机器码。而是将 C 代码翻译为汇编语言。汇编编译器获取这些内容编译为机器码。C# 和 Java 会翻译为字节码。字节码在虚拟机运行的时候才会被转换为机器码。 理解这其中的差异非常重要。 编译经常会伴随中间代码(IR)或中...阅读全文

mikespook 的博客 2014/05/07 mikespook

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

原文在此。 ————翻译分隔线———— 编译器(3)-编译器设计概览 第一部分:介绍 第二部分:编译、转译和解释 我们正在编写什么? 简单来说,是一个计算器。一个用于超级简单的数学语言的编译器。 至少当前来说,我们会尽量避免处理字符串和字符这些复杂的东西,并且集中精力在数字上。当然也不是所有的数字,仅仅整数而已。当前来说系统中仅有的“类型”就是它了。 添加新类型并不困难,实际上是很简单的,但是在这个游戏中,这样做会让我们的设计变得更加复杂。 撰写策略 无论你是构建解释器还是编译器,大多数步骤都是...阅读全文

mikespook 的博客 2014/05/08 mikespook

[翻译]在 Go 应用中使用简明架构(3)

原文在此,续前…… ——–翻译分隔线——– 在 Go 应用中使用简明架构(3) 用例层 现在来看看用例层代码,同样,它刚刚好能放在一个文件中: package usecases import ( "domain" "fmt" ) type UserRepository interface { Store(user User) FindById(id int) User } type User struct { Id int IsAdmin bool Customer domain.Custome...阅读全文

mikespook 的博客 2012/10/12 mikespook

[翻译]在 Go 应用中使用简明架构(4)

原文在此,续前…… ——–翻译分隔线——– 在 Go 应用中使用简明架构(4) 接口层 关于这点,必须说,所有东西都得有编码智慧,不论是真实的商业还是我们的应用用例。让我们看看对于接口层的代码这意味着什么。不像在各个内部层次中,所有代码都属于一个逻辑,接口层是由若干独立的部分构建而成。因此,我们将这个层次的代码拆分为若干个文件。 由于我们的商店要通过 Web 访问,就从 Web 服务开始吧: package interfaces import ( "fmt" "io" "net/http" "s...阅读全文

mikespook 的博客 2012/12/25 mikespook

[翻译]我其实没办法学 Erlang,因为它不存在,所以我发明了它

这是 Joe Armstrong,Erlang 之父在昨天(2013-01-24)发表在 Erlang 邮件列表里的内容。详细解说了他自己从开始学习编码到发明 Erlang 的整个历史。并且,对如何学习编程;如何成为大牛等一系列热门问题提出了自己的看法。当然,文中槽点无数(包括坚定不移的黑我大PHP)。这也是我觉得有必要翻译出来的原因之一。 由于是发在邮件列表的,所以原文是没有正式的标题的。我从 HN 上抄了这个标题回来。 整体上,虽然是和 Erlang 相关的话题。但是读过之后,会突然领会到 ...阅读全文

mikespook 的博客 2013/01/25 mikespook

[翻译]在 Go 应用中使用简明架构(5)

原文在此,续前…… ——–翻译分隔线——– 在 Go 应用中使用简明架构(5) 基础层 就像上面提到的,我们的存储认为“数据库”是一个可以用 SQL 请求发送或接收数据行的抽象。它们不关心基础构建的问题,例如链接到数据库,或使用哪个数据库。这是在 src/infrastructure/sqlitehandler.go 中完成的,高层次的 DbHandler 接口是通过调用低层次的功能来实现的: package infrastructure import ( "database/sql" "fmt...阅读全文

mikespook 的博客 2013/02/17 mikespook