Google发布go编程语言,目前为实验版本。快速编译,类型和访存安全,并发,快乐编码,开源。
// a simple Helloworld program: hello.go
package main
import "fmt"
func main()
{
fmt.Printf("Hello, iCompiler/n")
}
Go于2007年9月开始设计,主要设计者为Robert Griesemer,Rob Pike和Ken Thompson。后来Ian Lance Taylor实现了基于GCC的go编译器gccgo。Russ Rox的加入推动了语言和库的实际可用性。设计团队相当豪华。
Robert Griesemer参与设计Chrome浏览器中的Javascript执行引擎V8,V8采用即时编译技术和分代(generational)的stop-the-world垃圾收集机制。Rob Pike乃大名鼎鼎的人物,曾在贝尔实验室工作,是Unix操作系统、Plan9操作系统、Limbo编程语言和UTF-8编码的主要设计者,写过愤青式的文章Systems Software Research is Irrelevant,还有两本书The Unix Programming Environment和The Practice of Programming。Ken Thompson是图灵奖获得者,是Unix操作系统、Plan9操作系统、UTF-8编码和B编程语言(C的前身)的创立者之一。在google,Ken和Robert还设计过过用于大规模数据分析的Sawzall语言。Ian Lance Taylor是GCC社区的超级活跃人物,是gold连接器和GCC过程间优化LTO的主要设计者之一,是Zembu公司的创始人之一。Russ Rox在MIT的博士论文是关于Xoc编译器的设计。
高效编译,高效执行和简单编码是开发者的期待。Go是面向系统编程的语言,其设计动机基于以下情景。C语言的头文件引起的依赖管理无法进行快速编译,C++和Java中麻烦的类型系统使得人们更倾向于python和javascript中的动态类型,垃圾收集和并行等基本概念没有在目前的系统编程语言中得到很好的支持。因此go的设计简化头文件的依赖管理,使用轻量级的类型系统,类型没有继承,支持垃圾收集和并发,从而提供在多核系统上设计系统软件的方案。在并发支持方面,go提供了存储模型文档描述原子性,使用sync包支持互斥,基于通信(而不是共享内存)来共享存储。
为何不通过库扩展已有的语言(比如C和C++)?他们认为C和C++的设计存在太多问题,比如缺乏垃圾收集,头文件嵌套和依赖链太长,缺乏并发支持等。目前Intel设计的面向数据并行的Ct编程系统是通过扩展C++来实现,Cilk++是通过扩展c/c++实现。欢迎感兴趣的读者探讨!目前Go只是实验版本,仍有一些开放性的问题,比如是否支持例外和范型。Go Language Design FAQ中有很多关于语言设计权衡的解释。
对于一个编程语言,开发者重点要关注编译器(compiler)和运行时(runtime)。Go编译器支持Linux和Mac OS X两种操作系统,以及x86-64、x86和ARM三种体系结构。google现在的很多设计都支持ARM,这是因为Android系统的一个重要后端就是ARM。Go编译器有两套实现,一个为gc,另一个为使用GCC后端的gccgo。由于go的一些设计者来自Plan9团队,编译器的命名也使用了Plan9中的编译器命名传统,比如6g是x86-64上的编译器,8g是386上的编译器,5g是ARM上的编译器。他们曾经考虑使用LLVM编译器来实现go,由于大且慢,无法满足性能目标而放弃。他们特别强调go是一个实现编译器的好语言!Go运行时包括mark-and-sweep垃圾回收器,数组和字符串分片支持,段式栈支持,和go函数库实现。目前gccgo所带的运行时基于glibc实现,不支持段式栈管理和垃圾回收,由于栈大小固定,因此一次能创建的go函数数量受限。gc的编译速度比gccgo快,运行时系统更健壮,但是生成代码质量稍微逊色。目前推荐开发者使用gc来玩go。
Let’s go!http://golang.org
6g hello.go 6l hello.6 ./6.out