起源与发展 Go语言起源年,并于年正式对外发布。它从年9月日开始作为谷歌公司0%兼职项目,即相关员工利用0%的空余时间来参与Go语言的研发工作。该项目的三位领导者均是著名的IT工程师:RobertGriesemer,参与开发JavaHotSpot虚拟机;RobPike,Go语言项目总负责人,贝尔实验室Unix团队成员,参与的项目包括Plan9,Inferno操作系统和Limbo编程语言;KenThompson,贝尔实验室Unix团队成员,C语言、Unix和Plan9的创始人之一,与RobPike共同开发了UTF-8字符集规范。自年月起,KenThompson就开始研发一款以C语言为目标结果的编译器来拓展Go语言的设计思想。 正如“世纪的C语言”这句话所说,Go语言并不是凭空而造的,而是和C++、Java和C#一样属于C系。不仅如此,设计者们还汲取了其它编程语言的精粹部分融入到Go语言当中。 在声明和包的设计方面,Go语言受到Pascal、Modula和Oberon系语言的影响;在并发原理的设计上,Go语言从同样受到TonyHoare的CSP(通信序列进程CommunicatingSquentialProcesses)理论影响的Limbo和Newsqueak的实践中借鉴了一些经验,并使用了和Erlang类似的机制。 这是一门完全开源的编程语言,因为它使用BSD授权许可,所以任何人都可以进行商业软件的开发而不需要支付任何费用。 尽管为了能够让目前主流的开发者们能够对Go语言中的类C语言的语法感到非常亲切而易于转型,但是它在极大程度上简化了这些语法,使得它们比C/C++的语法更加简洁和干净。同时,Go语言也拥有一些动态语言的特性,这使得使用Python和Ruby的开发者们在使用Go语言的时候感觉非常容易上手。 下图展示了一些其它编程语言对Go语言的影响: 图.3其它编程语言对Go语言的影响 为什么要创造一门编程语言C/C++的发展速度无法跟上计算机发展的脚步,十多年来也没有出现一门与时代相符的主流系统编程语言,因此人们需要一门新的系统编程语言来弥补这个空缺,尤其是在计算机信息时代。 对比计算机性能的提升,软件开发领域不被认为发展地足够快或者比硬件发展更加成功(有许多项目均以失败告终),同时应用程序的体积始终在不断地扩大,这就迫切地需要一门具备更高层次概念的低级语言来突破现状。 在Go语言出现之前,开发者们总是面临非常艰难的抉择,究竟是使用执行速度快但是编译速度并不理想的语言(如:C++),还是使用编译速度较快但执行效率不佳的语言(如:.NET、Java),或者说开发难度较低但执行速度一般的动态语言呢?显然,Go语言在这3个条件之间做到了最佳的平衡:快速编译,高效执行,易于开发。 Go语言的发展目标Go语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得更加有乐趣,而不是在艰难抉择中痛苦前行。 因此,Go语言是一门类型安全和内存安全的编程语言。虽然Go语言中仍有指针的存在,但并不允许进行指针运算。 Go语言的另一个目标是对于网络通信、并发和并行编程的极佳支持,从而更好地利用大量的分布式和多核的计算机,这一点对于谷歌内部的使用来说就非常重要了。设计者通过goroutine这种轻量级线程的概念来实现这个目标,然后通过channel来实现各个goroutine之间的通信。他们实现了分段栈增长和goroutine在线程基础上多路复用技术的自动化。 这个特性显然是Go语言最强有力的部分,不仅支持了日益重要的多核与多处理器计算机,也弥补了现存编程语言在这方面所存在的不足。 Go语言中另一个非常重要的特性就是它的构建速度(编译和链接到机器代码的速度),一般情况下构建一个程序的时间只需要数百毫秒到几秒。作为大量使用C++来构建基础设施的谷歌来说,无疑从根本上摆脱了C++在构建速度上非常不理想的噩梦。这不仅极大地提升了开发者的生产力,同时也使得软件开发过程中的代码测试环节更加紧凑,而不必浪费大量的时间在等待程序的构建上。 依赖管理是现今软件开发的一个重要组成部分,但是C语言中“头文件”的概念却导致越来越多因为依赖关系而使得构建一个大型的项目需要长达几个小时的时间。人们越来越需要一门具有严格的、简洁的依赖关系分析系统从而能够快速编译的编程语言。这正是Go语言采用包模型的根本原因,这个模型通过严格的依赖关系检查机制来加快程序构建的速度,提供了非常好的可量测性。 整个Go语言标准库的编译时间一般都在0秒以内,其它的常规项目也只需要半秒钟的时间来完成编译工作。这种闪电般的编译速度甚至比编译C语言或者Fortran更加快,使得编译这一环节不再成为在软件开发中困扰开发人员的问题。在这之前,动态语言将快速编译作为自身的一大亮点,像C++那样的静态语言一般都有非常漫长的编译和链接工作。而同样作为静态语言的Go语言,通过自身优良的构建机制,成功地了去除了这个弊端,使得程序的构建过程变得微不足道,拥有了像脚本语言和动态语言那样的高效开发的能力。 另外,Go语言在执行速度方面也可以与C/C++相提并论。 由于内存问题(通常称为内存泄漏)长期以来一直伴随着C++的开发者们,Go语言的设计者们认为内存管理不应该是开发人员所需要考虑的问题。因此尽管Go语言像其它静态语言一样执行本地代码,但它依旧运行在某种意义上的虚拟机,以此来实现高效快速的垃圾回收(使用了一个简单的标记-清除算法)。 尽管垃圾回收并不容易实现,但考虑这将是未来并发应用程序发展的一个重要组成部分,Go语言的设计者们还是完成了这项艰难的任务。 Go语言还能够在运行时进行反射相关的操作。 使用goinstall能够很轻松地对第三方包进行部署。 此外,Go语言还支持调用由C语言编写的海量库文件,从而能够将过去开发的软件进行快速迁移。 指导设计原则Go语言通过减少关键字的数量(5个)来简化编码过程中的混乱和复杂度。干净、整齐和简洁的语法也能够提高程序的编译速度,因为这些关键字在编译过程中少到甚至不需要符号表来协助解析。 这些方面的工作都是为了减少编码的工作量,甚至可以与Java的简化程度相比较。 Go语言有一种极简抽象艺术家的感觉,因为它只提供了一到两种方法来解决某个问题,这使得开发者们的代码都非常容易阅读和理解。众所周知,代码的可读性是软件工程里最重要的一部分(译者注:代码是写给人看的,不是写给机器看的)。 这些设计理念没有建立其它概念之上,所以并不会因为牵扯到一些概念而将某个概念复杂化,他们之间是相互独立的。 Go语言有一套完整的编码规范,你可以在LALR是Go语言的语法标准,你也可以在CEP),这项技术要求海量并行支持,高度的抽象化和高性能。当我们进入到物联网时代,CEP必然会成为人们北京治疗白癜风哪个医院安全治疗白癜风那里最好
|