写点什么

Go 1.5 编译器与运行时环境由 Go 语言自身编写

  • 2015-08-27
  • 本文字数:1203 字

    阅读完需:约 4 分钟

Go 语言 1.5 版本拥有一个用 Go 语言自身编写的完整工具链,一个更快的垃圾回收器和在每一个可用的 CPU 上运行的 goroutine。

Go 语言以前的版本通过改善编译器、垃圾回收器、开发工具和对更多平台(比如:Android/ARM, BSD, Solaris, NaCl)的支持来获得更优秀的性能。Google 曾经提到,它对每个 Go 语言版本都许下了兼容性的承诺,基本上说“除了安全问题,不会做出不兼容的更改”

Go 语言 1.5 版本和原来的版本相比没有什么不同,尽管一些用户抱怨在编译和运行他们的程序时会遇到一些问题, 并在 Go问题列表中罗列了出来。然而 Google 认为 1.5 版本是一个“有意义的版本”,大部分变化是底层的变化,以及性能的提升。下面是一些改进:

  • 编译器、链接器、汇编器和运行时环境已经从 C 语言编写转换成了 Go 语言编写,还有一小部分是汇编语言编写的,已经彻底摒弃了最初的 C 语言代码。根据 Go 语言的设计者 Robert Pike 的说法,Go 语言编译器通过工具自动转换和一些最终的手动清理操作来避免引入新的 bug。在一些工具的帮助下,开发者手动重写了 Go 语言运行时环境。刚开始时,新的编译器由于一些 C 语言结构体没有转换成有效的 Go 语言代码,导致编译速度慢了 10 倍,但是在后来的开发完善过程中,性能得到了彻底的提高。摒弃 C 语言的一些好处如下:一个代码库适用于所有平台,可以更容易的加入新平台,拥有一个统一的采用较少代码量和简易维护量的工具链。缺点是:构建需要花费两倍时间,这是因为 Go 语言代码也是由工具编译生成的。Google 计划在 1.6 版本中降低构建所花费的时间。
  • 一个编译器、一个链接器、一个汇编器的目标是要实现通过 $GOARCH 和 $GOOS 这两个环境变量来配置 CPU 架构和操作系统。
  • Go 1.5 很有必要从源代码来创建分布式。
  • 在标准的 stop-the-world 垃圾回收器中加入了新的并发垃圾回收器,将垃圾回收活动从原来的 50 毫秒降低到 10 毫秒以下。大家可以在设计文档和这些幻灯片中找到新的并发垃圾回收器的更多细节。由于有了并发垃圾回收器,程序运行速度与 Go1.4 相比,提高了几个百分点。
  • 在 64 位架构的大趋势下,一些 32 位的分支将无法再使用。
  • 新的 Go 指令追踪工具可以对程序执行细粒度的追踪。

在 Go 1.5 中引入的一个重大改变是并发的最大线程数量从 1 上升到了可用的 CPU 的数量。如果一个程序依赖于协同程序的执行顺序,它很有可能遇到意想不到的结果,并且需要修复。更多的细节参考设计文档

其他改进如下:所有资源库支持内部包,外部依赖,go 文档命令以及其他一些改进。我们在发行通知中介绍了关于Go 1.5 新特性的更多细节。

查看英文原文 The Go 1.5 Compiler and Runtime Are Written in Go


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群InfoQ 好读者)。

2015-08-27 19:003597

评论

发布
暂无评论
发现更多内容

RocketMQ - 如何实现事务消息

Java收录阁

RocketMQ

ARTS week 2

刘昱

draw.io-取代visio的流程图绘制工具

Rice嵌入式开发技术分享

chrome vscode 写文章神器 draw.io

不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...

JackTian

GitHub 学习 开源 程序员 编码

John 易筋 ARTS打卡Week 02

John(易筋)

ARTS 打卡计划 ARTS活动 arts

MAC OS 下 HomeBrew 使用

耳东@Erdong

macos brew homebrew

Element-UI实战系列:Table+Pagination组件实现已选和全选功能

码上生长

Vue 大前端 Element

ARTS week2

紫枫

ARTS 打卡计划

你会写测试用例吗

愚蠢写作术(1):怎么让你的标题被读者忽视

史方远

个人成长 写作

ARTS打卡第一周5.25-5.31

我笔盒呢

工作 vs 生活

shengjk1

游戏夜读 | 关于构图的困难

game1night

写博客的那些事

shengjk1

如何用CSS选择符(数字开头) 杀死队友

德育处主任

Java html css3 大前端 Web

【openlayers】在vue中使用ol

德育处主任

Java html Vue 地图 openlayers

ARTS Week1

姜海天

【5月】本月读书学到了什么

Neco.W

创业 读书感悟 阅读量

转行程序员浅谈进程间的socket通信

WB

Linux 程序员 socket

钢铁侠马斯克之仰望星空

池建强

创业 马斯克 Space X

Kafka系列9:面试题是否有必要深入了解其背后的原理?我觉得应该刨根究底(上)

z小赵

大数据 kafka 实时计算

【ARTS打卡】Week01

Rex

学习

Apache DolphinScheduler新特性与Roadmap路线

代立冬

大数据 数据中台 工作流调度 海豚调度 数据湖调度

工厂模式(四)泛型工厂之MyBatis Mapper代理

LSJ

Java 设计模式 泛型 工厂注册中心

使用Kotlin语言初始化数组

mengxn

数组 kotlin 初始化

RocketMQ - 高可用设计

Java收录阁

RocketMQ

ARTS打卡Week 02

teoking

objective-c LeetCode WebRTC

时代在变,产品运营能力很重要

punkboy

程序员 程序人生 产品经理 产品推荐 程序媛

B端产品经理养成记(2):用户故事

涛哥 数字产品和业务架构

产品经理 需求 产品开发

做PO难,难于上青天

刘华Kenneth

敏捷 产品经理 决策 PO

B端产品经理养成记(1):业务场景

涛哥 数字产品和业务架构

产品经理 需求 产品开发

Go 1.5编译器与运行时环境由Go语言自身编写_开源_Abel Avram_InfoQ精选文章