Files
the-way-to-go_ZH_CN/eBook/01.2.md
2013-04-09 17:34:22 -04:00

95 lines
9.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#1.2 语言的主要特性与发展的环境和影响因素
##1.2.1 影响Go语言发展的早期编程语言
正如“21世界的C语言”这句话所说Go语言并不是凭空而造的而是和C++Java和C#一样属于C系。不仅如此设计者们还汲取了其它编程语言的精粹部分融入到Go语言当中。
在声明和包的设计方面Go语言受到PascalModula和Oberon系语言的影响在并发原理的设计上Go语言从同样受到 Tony Hoare 的CSP通信序列进程 *Communicating Squential Processes*理论影响的Limbo和Newsqueak实践中借鉴了一些经验并使用了和Erlang相同的机制。
这是一门完全开源的编程语言因为它使用BSD授权许可所以任何人都可以进行商业软件的开发而不需要支付任何费用。
尽管为了能够让目前主流的开发者们能够对Go语言中的类C语言的语法感到非常亲切而易于转型但是它在极大程度上简化了这些语法使得它们比C/C++语法更加简洁和干净。同时Go语言也拥有一些动态语言的特性这使得使用Python和Ruby的开发者们在使用Go语言的时候感觉非常容易上手。
下图展示了一些其它编程语言对Go语言的影响
![](images/1.3.influences_on_go.jpg?raw=true)
图1.3 其它编程语言对Go语言的影响
##1.2.2 为什么要创造一门编程语言
- C/C++的发展速度无法跟上计算机发展的脚步,十多年来也没有出现一门与时代相符的主流系统编程语言,因此人们需要一门新的系统编程语言来弥补这个空缺,尤其是在计算机信息时代。
- 对比计算机性能的提升,软件开发领域不被认为发展地足够快或者比硬件发展更加成功(有许多项目均以失败告终),同时应用程序的体积始终在不断地扩大,这就迫切地需要一门具备更高层次概念的低级语言来突破现状。
- 在Go语言出现之前开发者们总是面临非常艰难的抉择究竟是使用执行速度快但是编译速度并不理想的语言C++),还是使用编译速度较快但执行效率不佳的语言(如:.NETJava或者说开发难度较低但执行速度一般的动态语言呢显然Go语言在这3个优势之间做到了最佳的平衡快速编译高效执行易于开发。
##1.2.3 Go语言的发展目标
Go语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合达到完美平衡从而使编程变得更加有乐趣而不是在艰难抉择中痛苦前行。
因此Go语言是一门类型安全和内存安全的编程语言。虽然Go语言中仍有指针的存在但并不允许进行指针运算。
Go语言的另一个目标是对于网络通信并发和并行编程的极佳支持从而更好地利用大量的分布式的和多核的计算机这一点对于谷歌内部的使用来说就非常重要了。设计者通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 channel 来实现各个 goroutine 之间的通信。他们实现了分段栈增长和 goroutine 在线程基础上多路复用技术的自动化。
这个特性显然是Go语言最强有力的部分不仅支持了日益重要的多核与多处理器计算机也弥补了现存编程语言在这方面所存在的不足。
Go语言中另一个非常重要的特性就是它的构建速度编译和链接到机器代码的速度一般情况下构建一个程序的时间只需要数百毫秒到几秒。作为大量使用C++来构建基础设施的谷歌来说这无疑从根本上摆脱了C++在构建速度上非常不理想的噩梦。这不仅极大地提升了开发者的工作效率,同时也使得软件开发过程中的代码测试环节更加紧凑,而不必浪费大量的时间在等待程序的构建上。
依赖管理是现今软件开发的一个重要组成部分但是C语言中“头文件”的概念却导致越来越多因为依赖关系而使得构建一个大型的项目需要长达几个小时的时间。人们越来越需要一门具有严格的、简洁的依赖关系分析系统从而能够快速编译的编程语言。这正是Go语言采用包模型的根本原因这个模型通过严格的依赖关系检查机制来加快程序构建的速度提供了非常好的可量测性。
整个Go语言标准库的编译时间一般都在20秒以内其它的常规项目也只需要半秒钟的时间来完成编译工作。这种闪电般的编译速度甚至比编译C语言或者Fortran更加快使得编译这一环节不再成为在软件开发中困扰开发人员的问题。在这之前动态语言将快速编译作为自身的一大亮点像C++那样的静态语言一般都有非常漫长的编译和链接工作。而同样作为静态语言的Go语言通过自身优良的构建机制成功地了去除了这个弊端使得程序的构建过程变得微不足道拥有了像脚本语言和动态语言那样的高效开发的能力。
另外Go语言在执行速度方面也可以与C/C++相提并论。
由于内存问题通常称为内存泄漏长期以来一直伴随着C++的开发者们Go语言的设计者们认为内存管理不应该是开发人员所需要考虑的问题。因此尽管Go语言像其它静态语言一样执行本地代码但它依旧运行在某种意义上的虚拟机以此来实现高效快速的垃圾回收使用了一个简单的标记-清除算法)。
尽管垃圾回收并不容易实现但考虑这将是未来并发应用程序发展的一个重要组成部分Go语言的设计者们还是完成了这项艰难的任务。
Go语言还能够在运行时进行反射相关的操作。
使用 `go install` 能够很轻松地对第三方包进行部署。
此外Go语言还支持调用由C语言编写的海量库文件第3.9节),从而能够将过去开发的软件进行快速迁移。
##1.2.4 指导设计原则
Go语言通过减少关键字的数量25个来简化编码过程中的混乱和复杂度。干净、整齐和简洁的语法也能够提高程序的编译速度因为这些关键字在编译过程中少到甚至不需要符号表来协助解析。
这些方面的工作都是为了减少编码的工作量甚至可以与Java的简化程度相比较。
Go语言有一种极简抽象艺术家的感觉因为它只提供了一到两种方法来解决某个问题这使得开发者们的代码都非常容易阅读和理解。众所周知代码的可读性是软件工程里最重要的一部分 ***译者注:代码是写给人看的,不是写给机器看的*** )。
这些设计理念没有建立其它概念之上,所以并不会因为牵扯到一些概念而将某个概念复杂化,他们之间是相互独立的。
Go语言有一套完整的编码规范你可以在 [Go语言编码规范](http://golang.org/doc/go_spec.html) 页面进行查看。
它不像Ruby那样通过实现过程来定义编码规范。作为一门具有明确编码规范的语言它要求可以采用不同的编译器如 gc 和 gccgo第2.1节)进行编译工作,这对语言本身拥有更好的编码规范起到很大帮助。
[LALR](http://en.wikipedia.org/wiki/LALR_parser) 是Go语言的语法标准你也可以在 `src/cmd/gc/go.y` 中查看到,这种语法标准在编译时不需要符号表来协助解析。
##1.2.5 语言的特性
Go语言从本质上程序和结构方面来实现并发编程。
因为Go语言没有类和继承的概念所以它和Java或C++看起来并不相同。但是它通过接口interface的概念来实现多态性。Go语言有一个清晰易懂的轻量级类型系统在类型之间也没有层级之说。因此可以说这是一门混合型的语言。
在传统的面向对象语言中,使用面向对象编程技术显得非常的臃肿,它们总是通过复杂的模式来构建庞大的类型层级,这违背了编程语言应该提升开发速度的宗旨。
函数是Go语言中的基本构件它们的使用方法非常灵活。在第六章我们会看到Go语言在函数式编程方面的基本概念。
Go语言使用静态类型所以它是类型安全的一门语言加上通过构建到本地代码程序的执行速度也非常快。
作为强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有的东西都是显式的。
Go语言其实也有一些动态语言的特性通过关键字 `var`所以它对那些逃离Java和.Net世界而使用PythonRubyPhp和JavaScript的开发者们也具有很大的吸引力。
Go语言支持交叉编译比如说你可以在运行Linux系统的计算机上开发运行下Windows下运行的应用程序。这是第一门支持UTF-8的编程语言 ***译者注:.NET好像也支持吧*** 这不仅体现在你它可以处理使用UTF-8编码的字符串就连它的源码文件格式都是使用的UTF-8编码。Go语言做到了真正的国际化
##啊哦,亲,你看得也太快了。。。还没翻译完呢 0 0
要不等到 ***2013年4月11日*** 再来看看吧~~
这里还有一些其它的学习资源噢~
- [《Go编程基础》](https://github.com/Unknwon/go-fundamental-programming):已更新至 [第六课](https://github.com/Unknwon/go-fundamental-programming/blob/master/lecture6/lecture6.md)
- [《Go Web编程》](https://github.com/astaxie/build-web-application-with-golang)
神马?你说你不想学习?那好吧,去逛逛论坛看看行情也行~
- [Golang中文社区](http://bbs.mygolang.com/forum.php)
- [Go语言学习园地](http://studygolang.com/)
- [Golang中国](http://golang.tc)
##1.2.6 语言的用途