Google公布实现Go 1.5自举的计划

GO进阶(5) 垃圾回收机制 当程序的内存占用达到一定阈值时,整个应用程序就会全部暂停,垃圾收集器会扫描已经分配的所有对象并回收不再使用的内存空间,当这个过程结束后,用户程序才可以继续执行,Go 语言在早期也使用这种策略实现垃圾收集,但是今天的实现已经复杂了很多。在应用程序中会使用到两种内存,分别为堆(Heap)和栈(Stack) , GC负责回收堆内存,而不负责回收栈中的内存:栈是线程的专用内存,专门为了函数执行而准备的,存储着函数中的局部变量以及调用栈,函数执行完后,编译器可以将栈上分配的内存可以直接释放,不需要通过GC来回收。 阅读详情

Google最近公布了实现Go 1.5自举(Bootstrap)的计划。相关文档的作者是Go核心开发者Russ Cox,他在Go语言上已经耕耘了接近6年。据Russ介绍,Google就“如何从Go源码树中去除所有的C程序”已经酝酿了一年。

自举(Bootstrapping) 是这样的过程,“用要编译的目标编程语言编写其编译器(或汇编器)”。一般而言,自举有几个优势,比如:

  • 用于测试被自举的语言;
  • 支持使用通常更为高级、提供更多高级抽象的语言来编写编译器;
  • 编译器也可以得益于语言层面的任何改进。

如前所述,Google在一年前就开始了从Go源码树中去除C代码的努力,转换计划分为5个步骤:

  • 第1阶段——开发一个从C语言到Go语言的翻译器,将现有的C编译器翻译成Go语言的。这一阶段利用了一个事实:原来的编译器没有大量使用一些很难移植到Go语言的特性,比如宏、联合和指针运算等。
  • 第2阶段——转换编译器的源码树,得到一个Go语言的编译器,但是比较原始,而且是C风格的。
  • 第3阶段——将前面得到的编译器转换为符合Go语言习惯的程序,主要通过识别包,添加文档和单元测试实现。
  • 第4阶段——优化编译器,解决编译器和CPU的内存使用问题,可能引入并行化。此外,尝试在今天使用的不依赖架构的无序树(Node*s)和依赖架构的有序列表(Prog*s)之间引入一个新的中间表示,目的是改进编译器在消除冗余的nil检查和边界检查等情况下的优化能力。
  • 第5阶段——用最新版的go/parsergo/types替换前端

Russ提到,他们还考虑了一些替代方案,不过基于各种因素都排除了,在一年前的这份文档中都有描述。

Go的自举

编译器的自举通常会引发“先有鸡还是先有蛋”的问题,必须提供一种方式来编译我们要创建的语言。

Go的情况是,要构建Go 1.5,必须先安装Go 1.4或更高版本,然后使用现有的Go工具链创建Go 1.5工具链的一个基本版本。一旦有了(Go 1.4)编译的Go 1.5工具链,就可以再用它来构建自身了,可以进一步用它构建go_bootstrap和其余的标准库和标准组件。这个过程加入了一个中间步骤——生成的工具链再被用于构建其自身,它可以应用于未来的任何Go版本。

为进一步了解Go实现自举的计划,InfoQ采访了Russ。

实现自举看上去是Go语言的一个很大的里程碑。在语言的演进过程中,为什么决定在这个阶段做这个事情呢,可以详细介绍一下吗?

Go是一门不错的通用语言,但在设计时考虑的适用场合是编写大规模、高并发的服务端软件,就像运行在Google的服务器上的那些。如果更早实现自举,Go编译器就是第一个大型的Go语言程序,这对语言设计存在不利影响,会让我们远离真正的目标。

没有更早实现自举,还有一些技术原因,比如可移植性,从源代码编译比自举更容易,而且我们也能尽早有一个稳定的编译器实现。

使用Go来构建Go,与使用C相比,你认为对哪些具体领域有较为明显的改进?

Ken Thompson曾经对我说,用Go编写程序感觉比用C更简单。一个原因是,Go消除了好几类常见的C bug,比如悬挂指针、内存泄漏、缓冲区溢出、深度递归时的栈溢出、误用void*和意外的数值转换等。

与任何标准的C工具链相比,标准的Go工具链对模块化、单元测试和性能分析支持更好,不过让我最兴奋的是在修改内部API或重构时,应用自动化程序重写(如gofix)的前景。

在“Go 1.3+ Compiler Overhaul”这篇文档中,你描述了分5个步骤将现有的编译器从C迁移到Go的过程。请问到目前为止,已经完成了哪些步骤了?其余步骤打算何时完成?

对Go项目而言,将语言的运行时从C转换到Go更为重要,所以我们先做了这个。现在我们正回到编译器。

从文档角度看,我们目前处于第2阶段。翻译器已经完成,而且帮助我们转换了运行时。我们正在将其应用于编译器。我们希望完成Go 1.5编译器的转换。清理工作会在Go 1.5之后的项目中进行。

 

查看英文原文:Google Aims at Bootstrapping Go 1.5

C# 从数秒到毫秒:MySQL+Redis百万数据优化实战全解析 在处理百万级数据时,传统单体数据库常面临查询效率低下、数据库负载过高和用户体验差等问题。为解决这些性能瓶颈,可以采用MySQL分库分表、Redis缓存和异步统计的组合策略。 数据库分片:通过水平分表和分库实现,将单表数据分散到多个物理表或数据库实例中,降低单点负载。 Redis缓存:利用Redis缓存高频数据,减少数据库查询压力,提升响应速度。 异步统计:通过消息队列(如RabbitMQ)解耦统计任务,后台处理非实时任务,避免阻塞主流程。 这些优化策略能够显著提升系统性能,确保在高并发和大数据量场景下的稳定 阅读详情

相关推荐

基于51单片机的智能台灯设计:嵌入式程序设计实现

随着智能家居和物联网的快速发展,智能台灯作为一种典型的智能家居产品,已成为现代家庭中不可或缺的设备。传统的台灯只能提供简单的照明功能,而智能台灯不仅具备基础的照明功能,还能根据用户的需求进行自动调节,比如自动调节亮度、色温,甚至具备定时开关、远程控制等智能功能。本文将介绍如何基于51单片机设计一款智能台灯。我们将涉及硬件设计、嵌入式系统架构、传感器选择、调光控制、语音识别、远程控制等方面,详细阐述如何实现这些功能,并给出相关的代码和实现步骤。

2201_76125393的博客 819

GO基础 】 工作区和GOPATH

在过去的几年里,我们一起见证了Go语言的崛起,我最早用GO的时候Go的最新版本还是1.5.x 版本,那个时候也是第一次听说Go这门语言。GO1.5版本开始,GO语言本身也开始了使用Go语言来实现Go语言本身,但那个时候的GC性能还不是很强。对于很多静态类型语言转过来的朋友来说体验感还是比较差。直到1.7.x版本 开始,极速的GC让很多Go粉拍手称快。再到了2018年2月1.10版本发布对GO自身的...

qq_27373475的博客 606

华为查询IMSI号码方法.rar

华为查询IMSI号码方法,对SIM卡的IMSI号进行详细介绍,包括IMSI号的来源及解读规则。适合于那些想要了解IMSI号信息的同学

Go 实现自举的具体含义

和很多主流语言一样,Go 语言编译器最初都是由 C 语言和汇编语言实现的。C 语言和汇编实现的G o 编译器(记作 A)用来编译 Go 源文件。那么问题来了? 是否可以用 Go 语言自身实现一个 Go 编译器 B ,用编译器 A 来编译 Go 编译器 B 工程的源码并链接成最终的 Go 编译器 B 呢?这就是 Go 核心团队在 Go 1.5 版本时做的事情。 他们将绝大多数原来用 C 和汇编编写的 Go 编译器以及运行时实现改为使用 Go 语言编写,并用 Go 1.4.x 编译器(C 与汇编实现的,相当于

wohu1104的专栏 1308

Golang源码分析】Golang如何实现自举(一)

前言   在写一篇文章之前,某位大佬勾起了我对学习这个主题的欲望。刚好那天带着病痛,后来根据一个Makefile字符集的问题,拿着开始研究。发现研究、研究不疼了,果然和周星驰电影《国产凌凌漆》一样精神麻醉才是最好的麻醉药。今年以来也没有给自己立啥学习目标,刚好研究Golang自举动,可以作为我今年的学习目标。该篇文章只是个开始,后续会继续迭代。   大家都知道在Go早起其实编译器并不是go去编写的,后期自举实现了编译。不过在学习Golang自举之前要了解一下Golan

c-rain 2679

Go语言自举

当修改了go源码后,需要对go源码重新编译,此时需要go自举编译。 go版本在1.4以后,go的编译器均基于go1.4而实现,因此需要使用go1.4进行编译。 go编译源码: 需要下载go1.4版本,并将go文件夹重命名为go1.4,并将go1.4放置于$HOME下。 进入需要编译的go版本src目录下,找到并运行make.bash。make.bash会默认去使用$HOME/go1.4目录下的编译器进行编译。 ...

isAlberYu的博客 848

Golang源码分析】Golang如何实现自举 - 6g的编译过程(三)

  很长的一段时间没有写文章了,因为忙着出版书籍,以及双减的影响有些懈怠。Golang自举这个系列还是接着之前的《【Golang源码分析】Golang如何实现自举 - dist介绍》一文中继续写,由于linux下go1.3编译*.c文件会调用gcc,编译go文件会调用“/mnt/pkg/tool/linux_amd64/6g”,所以本篇文章主要研究6g,以及go1.3源码编译过程。 1.g6简单回顾   在go1.3中其实一部分go的源代码还处于c源码实现,其中一部分

c-rain 947

Golang源码分析】Golang如何实现自举 - 6l的链接过程(四)

  接到催更的信息,其实还是很高兴。本来忙了很长一段时间为生活奔波,想给自己一个假期。后来脑子里响起了莎士比亚的一句话“如果一年到头如假日,岂不像连日工作那样疲乏?”,然后还是决定放下安逸的生活,继续去探索。   经过最近一段时间的忙碌,对生活也多了一些重新的认识。人活着不要盲目,不要止步不前,不要高估自己的实力,也不要低估自己的能力,多一些自我审视,反复review或许在生活上、工作上走的会更远~   一顿感概之后还是要回归主题,上一篇文章说到了

c-rain 851

Go语言的自举指的是什么?

Go语言的自举指的是什么?

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 1374

什么是标准输入,标准输出(stdin,stdout)

什么是标准输入,标准输出(stdin,stdout 要弄清什么是标准输入输出。首先需要弄懂什么是IO。 IO的I是Input的意思,O是output的意思。意味着输入和输出。 更确切的含义是 I:从外部设备输入到内存 O:从内存输出到外部设备 而标准输入和标准输出是干什么的?它们是用于IO的。 那么它们属于IO的哪个部分? 内存?还是外部设备? 答案显然是外部设备(逻辑上的外部设备,为什么?接着看)。 更具体的含义? 在linux操作系统中,外部设备用什么表示?是用文件。 linux中一切设备皆是文件! 因

W.S.Yin的博客 2408

深入理解Go语言自举机制:从Go 1.4到现代版本

Go语言的自举(Bootstrap)过程是这门语言最精妙的设计之一。所谓自举,指的是用Go语言自身来编译新版本的Go语言。本文将深入剖析Go语言自举的技术细节,帮助开发者理解这一关键过程。 ## 自举的必要性 在早期版本中,Go编译器是用C语言编写的。但随着语言发展,Go团队决定将编译器、汇编器和链接器等核心工具全部用Go重写。这就带来了一个"先有鸡还是先有蛋"的问题:如何在没有Go编译器的情

gitblog_00949的博客 599

关于go语言的那点事

go语言由google公司开源的用于提高程序员编程效率的编程语言。它是一门简单易学、静态编译、原生并发以及向后兼容性的高效快捷的轻量级语言。

super_abc的博客 277

Go 1.5正式发布:实现自举、引入并发垃圾收集器

在经历了几个Beta版本和一个rc版本之后,Go 1.5终于正式发布了。这是一个很重要的版本,实现方面有很多变化。因为这个版本仍然遵循Go 1兼容性承诺,开发团队预计,所有的Go程序应该都可以和以前一样编译和运行。二进制和源码包已提供下载。\\在实现方面,最大的变化有以下几点:\\编译器和运行时是完全用Go语言编写的(还有少量汇编),实现自举实现中不再涉及C语言,所以构建时也就不需要C编译器了...

cpongo5 211

理解Go 1.5 vendor

Import comments are ignored in vendored packages. go 1.4引入了canonical imports机制,如: package pdf // import "rsc.io/pdf" 如果你引用的pdf不是来自rsc.io/pdf,那么编译器会报错。但由于vendor机制的存在,go tool不会校验vendor中package的

leonpengweicn的专栏 4179

Go1.5 发布说明

该文档翻译基于go1.5beta1Go 1.5 Release Notes ??所标志的语句表示有疑问 http://localhost:6060是用go1.5godoc命令搭建的本地文档的访问url。 欢迎大家指正 Go 1.5 介绍 Go的最新版本是1.5,同时是一个有重大意义的版本,其包括了Go主要架构的变更。尽管如此,我们预计...

weixin_34409822的博客 269

GO语言教程(一)Linux( Centos)下Go的安装, 以及HelloWorld

写在前面: 给广大学习Go语言的朋友,多一种教程选择。 尊重劳动,如果转载,请注明出处。 注意,以下命令需要以root身份,或者sudo运行。 说明,如果要自定义安装位置的话,需要配置GOROOT环境变量,所以我们采用默认的目录进行安装, 可以省去GOROOT了。 1,由于默认的go路径,在/usr/local下, 所以用如下命令,解压创建/usr/l

常城的专栏 2万+

Go 1.5中值得关注的几个变化

GopherCon2015开幕之 际,Google Go Team终于放出了Go 1.5Beta1版本的安装包。在go 1.5Beta1的发布说明中,Go Team也诚恳地承认Go 1.5将打破之前6个月一个版本的发布周期,这是因为Go 1.5变动太大,需要更多时间来准备这次发布(fix bug, Write doc)。关于Go 1.5的变化,之前Go Team staff在各种golang

wkyb608的专栏 2435

go 1.5 国内下载地址

为什么80%的码农都做不了架构师?>>> ...

weixin_34235457的博客 1002

Go1.5 改进摘要

Go1.5 改进简介 1.   纯Go(+少量汇编)实现 runtime 和 编译器 2.   改进 垃圾回收器, 支持并发 (有个指标好像是 停顿在 10 毫秒以内). 3.   GOMAXPROCS默认值改为 CPU 核数 4.   internal限制规则推广到第三方包 (之前只有 std 包启用) 5.   增加 vendor 支持, 基本解决 第三方库的依赖

codemanship的专栏 1587

go1.5 64位下载 windows

链接:http://pan.baidu.com/s/1mgw48cw 密码:rs65

懒懒 678
上一篇: Redis源码研究—哈希表
下一篇: 微软开源.NET Core的执行引擎CoreCLR
Daemon_1994
博客等级 码龄13年 95粉丝 170原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值