Python 发表于 2016-3-11 10:15:21

Go 语言 ── 性能C/C++ 开发效率比肩Python 替代Java的静态语言

Go 语言 ── 性能C/C++ 开发效率比肩Python 替代Java的静态语言

Go 语言是谷歌 2009 发布的第二款开源编程语言。2009年7月份,谷歌曾发布了 Simple 语言,它是用来开发 Android 应用的一种 BASIC 语言。
Go 语言开源、简洁、快速、安全,支持并行进程、内存管理、数组安全、编译迅速。
Go语言设计支持主流的 32 位和 64 位的 x86 平台,同时也支持 32 位的 ARM 架构。Go 语言在 Go1 版本上支持 Windows、苹果 Mac OS X、Linux 和 FreeBSD 操作系统。
LiteIDE 是一款专门为 Go 语言开发的跨平台轻量级集成开发环境(IDE),由 QT 编写,支持 Windows、Linux、MacOS X。
Go 语言专门针对多处理器系统应用程序的编程进行了优化,使用 Go 编译的程序可媲美 C 或 C++ 代码的速度,且更安全、支持并行进程。
通过创建新的编程语言,谷歌将继续拓展计算领域的各个方面,从而促进这些领域的发展。这同样也是谷歌开发 Android 操作系统、Chrome 浏览器和 Chrome OS 的动机所在。
Go 语言适合场景:01、服务器编程,以前如用 C 或 C++ 做的那些事情,用 Go 来做很合适。譬如:处理日志、数据打包、虚拟机处理、文件系统等。
02、分布式系统,数据库代理器等
03、网络编程,这一块目前应用最广,包括 Web 应用、API 应用、下载应用。
04、内存数据库,google 开发的 groupcache,couchbase 的部分组件。
05、云平台,国外很多云平台在采用 Go 开发,CloudFoundy 的部分组件,前 VMare 的技术总监自己出来搞的 apcera 云平台。

Go 的目标是希望提升现有编程语言对程序库等依赖性 (dependency) 的管理,这些软件元素会被应用程序反复调用。由于存在并行编程模式,因此这一语言也被设计用来解决多处理器的任务。
谷歌大约 2007 年开始开发 Go,并于 2008 年投入了一组全职员工。谷歌当初将该语言设计为一款系统编程语言,可以被用于网络服务器、存储系统和数据库中。但是谷歌认为,该语言还有望被用于其它领域。
Go 语言是谷歌推出的一种全新编程语言,可在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克 (Rob Pike) 说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。

北京时间 2010 年 1 月 10 日,Go 语言摘得了 TIOBE 公布的 2009 年年度大奖。该奖项授予在 2009 年市场份额增长最多的编程语言。
谷歌资深软件工程师罗布·派克 (Rob Pike) 表示,“Go 让我体验到了从未有过的开发效率。”派克表示,和今天的 C++ 或 C 一样,Go 是一种系统语言。他解释道,“使用它可进行快速开发,同时,它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大。”
2007 年谷歌把 Go 作为一个 20% 项目开始研发,即让员工抽出本职工作之外时间的 20%, 投入在该项目上。除了派克外,该项目的成员还有其他谷歌工程师也参与研发。
派克表示,编译后 Go 代码的运行速度与 C 语言非常接近,而且编译速度非常快,就像在使用一个交互式语言。现有编程语言均未专门对多核处理器进行优化。Go 就是谷歌工程师为这类程序编写的一种语言。它不是针对编程初学者设计的,但学习使用它也不是非常困难。Go 支持面向对象,而且具有真正的闭包 (closures) 和反射 (reflection) 等功能。
在学习曲线方面,派克认为 Go 与 Java 类似,对于 Java 开发者来说,应该能够轻松学会 Go。之所以将 Go 作为一个开源项目发布,目的是让开源社区有机会创建更好的工具来使用该语言,例如 Eclipse IDE 中的插件。
在谷歌公开发布的所有网络应用中,均没有使用 Go,但是谷歌已经使用该语言开发了几个内部项目。派克表示,Go 是否会对谷歌即将推出的 Chrome OS 产生影响,还言之尚早,不过 Go 的确可以和 Native Client 配合使用。他表示:“Go 可让应用完美的运行在浏览器内。”例如,使用 Go 可以更高效的实现 Wave,无论是在前端还是后台。
Go 同时具有两种编译器,一种是建立在 GCC 基础上的 Gccgo,另外一种是分别针对 64 位 x64 和 32 位 x86 计算机的一套编译器 (6g 和 8g)。谷歌目前正在研发其对 ARM 芯片和 Android 设备的支持。派克表示,“Android 手机存在的问题是,我们一直没有一个数学协处理器。”
主要功能
Google 对 Go 寄予厚望。其设计是让软件充分发挥多核心处理器同步多工的优点,并可解决面向对象程序设计的麻烦。它具有现代的程序语言特色,如垃圾回收,帮助程序设计师处理琐碎但重要的内存管理问题。Go 的速度也非常快,几乎和 C 或 C++ 程序一样快,且能快速制作程序。
Go 的网站就是用 Go 所建立,但 Google 有更大的野心。该软件是专为构建服务器软件所设计(如 Google 的 Gmail)。Google 认为 Go 还可应用到其他领域,包括在浏览器内执行软件,取代 JavaScript 的角色。
Pike 说:它至少在强度上比 JavaScript 高一级。Google 自建 Chrome 浏览器,部分原因就是加速 JavaScript 和网页表现,而 Google 已经融合了本身的技术,如 Native Client 和 Gears。
Pike 表示,Go 另一项与网络相关的特色,是服务器和用户端设备,如 PC 或手机,可以分担工作。因此,使用 Go 的服务便可轻松适应不同的用户端处理性能。
Go 也可解决现今的一大挑战:多核心处理器。一般电脑程序通常依序执行,一次进行一项工作,但多核心处理器更适合并行处理许多工作。Pike 说:我们自认有足够的支持,可改善这方面的问题。
Go 团队正在寻求帮助。其中一个重要领域是改善 Go 能够使用的 runtime library。这类 library 可提供许多工具和功能,加快程序设计的过程。而 Go 的 library 还包括许多重要的设计元素,并供应处理协作、垃圾收集和其他低层杂务的资源。
Go 团队也需要编译器方面的协助。Thompson 曾为 32 位元和 64 位元 x86 处理器,及 ARM 处理器写过一些编译器,Taylor 也为 GCC 编译器写过一个 Go 前端。
尽管 Google 对 Go 有很大的野心,该公司也明白,这项计划无法完全取代现有的技术。Pike 说:我不认为我们能取代任何东西。我们只是创造出这个领域的另一个角色。
GO vs Python01、部署简单
Go 可直接编译成机器码,Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖。这让部署变得异常方便:目标机器上只需要一个基础的系统和必要管理、监控工具,完全不需要操心应用所需的各种包、库的依赖关系,大大减轻了维护的负担。这和 Python 有着巨大的区别。由于历史的原因,Python 的部署工具生态相当混乱 (比如 setuptools、distutils、pip、buildout 的不同适用场合、及兼容性问题)。官方 PyPI 源又经常出问题,需要搭建私有镜像,而维护这个镜像又要花费不少时间和精力。
02、并发性好
Goroutine 和 channel 使得编写高并发的服务端软件变得相当容易,很多情况下完全不需要考虑锁机制以及由此带来的各种问题。单个 Go 应用也能有效的利用多个 CPU 核,并行执行性能好。
Python 多线程和多进程的服务端程序编写起来并不简单,而且由于全局锁 GIL 的原因,多线程的 Python 程序并不能有效利用多核,只能用多进程的方式部署;如果用标准库里的 multiprocessing 包又会对监控和管理造成不少的挑战 (譬如:某些公司用 supervisor 管理进程,对 fork 支持就不好)。部署 Python 应用的时候通常是每个 CPU 核部署一个应用,这会造成不少资源的浪费,比如假设某个 Python 应用启动后需要占用 100MB 内存,而服务器有 32 个 CPU 核,那么留一个核给系统、运行 31 个应用副本就要浪费 3GB 的内存资源。

但 python 可以用多进程加协程的方式利用多核,并不会占用更多系统资源,且协程可以利用 epoll/kqueue 和物理栈切换方式实现,性能相当给力。代码可以看 gunicorn,wsgi 服务器,写的蛮好。
03、语言设计
从学术角度讲,Go 语言其实非常平庸,不支持许多高级的语言特性;但从工程的角度讲,Go 的设计是非常优秀的:规范足够简单灵活,有其他语言基础的程序员都能迅速上手。更重要的是 Go 自带完善的工具链,大大提高了团队协作的一致性。譬如:gofmt 自动排版 Go 代码,很大程度上杜绝了不同人写的代码排版风格不一致的问题。把编辑器配置成在编辑存档的时候自动运行 gofmt,这样在编写代码的时候可以随意摆放位置,存档的时候自动变成正确排版的代码。此外还有 gofix、govet 等非常有用的工具。
Go语言作者都有 C 基因,那么,Go 自然而然就有了 C 基因。Go 关键字是 25 个,但是表达能力很强大,几乎支持大多数在其他语言特性:继承、重载、对象等。

04、执行性能虽然不如 C 和 Java,但通常比原生 Python 应用还是高一个数量级的,适合编写一些瓶颈业务。内存占用也非常省。
05、动态特性内置 runtime,支持垃圾回收,这些属于动态语言的特性。
06、标准库Go 目前已内置了大量标准库,特别是网络库非常强大。
07、内置强大工具Go 语言内置了很多工具链,最好的应该是 gofmt 工具,自动化格式化代码,能让团队 review 变得如此简单,代码格式一模一样,想不一样都很困难。
08、跨平台编译如你写的 Go 代码不包含 cgo,那么,就可做到 window 系统编译 linux 的应用,如何做到的呢?Go 引用了 plan9 代码,这就是不依赖系统信息。
09、内嵌 C 支持Go 作者是 C 的作者,所以,Go 里面也可直接包含 C 代码,利用现有的丰富 C 库。
知名应用

#名称说明备注
01
nsq
bitly 开源的消息队列系统,性能非常高,目前他们每天要处理数十亿条的消息。


02
docker
基于 lxc 的虚拟打包工具,能够实现 PAAS 平台的组建。


03
packer
用来生成不同平台镜像文件,譬如:VM、vbox、AWS 等。
作者是 vagrant 的作者。
04
skynet
分布式调度框架。


05
Doozer
分布式同步工具,类似 ZooKeeper。


06
Heka
mazila 的开源日志处理系统。


07
cbfs
couchbase 开源的分布式文件系统。


08
tsuru
开源 PAAS 平台。
和 SAE 实现的功能一模一样。
09
groupcache
memcahe 作者写的用于 Google 下载系统的缓存系统。


10
god
类似 redis 的缓存系统,但支持分布式和扩展性。


11
gor
网络流量抓包、释放工具。


版本历史

#时间版本说明备注
012007 年
谷歌工程师 Rob Pike, Ken Thompson 和 Robert Griesemer 开始设计一门全新的语言,这是 Go 语言的最初原型。

02
2009 年 11 月 10 日
Go 语言以开放源代码的方式向全球发布。

03
2011 年 03 月 16 日r56Go 语言的第一个稳定 (stable) 版本 r56 发布。

04
2012 年 03 月 28 日Go 1Go 语言的第一个正式版本 Go1 发布。

05
2013 年 04 月 04 日Go 1.1 beta1Go 语言的第一个 Go 1.1beta1 测试版发布。

06
2013 年 04 月 08 日 Go 1.1 beta2Go 语言的第二个 Go 1.1beta2 测试版发布。

07
2013 年 05 月 02 日Go 1.1 RC1Go 语言 Go 1.1 RC1 版发布。

08
2013 年 05 月 07 日Go 1.1 RC2Go 语言 Go 1.1 RC2 版发布。

09
2013 年 05 月 09 日Go 1.1 RC3Go 语言 Go 1.1 RC3 版发布。

10
2013 年 05 月 13 日Go 1.1Go 语言 Go 1.1 正式版发布。

11
2013 年 09 月 20 日Go 1.2 RC1Go 语言 Go 1.2 RC1 版发布。

12
2014 年 06 月 19 日Go 1.3Go 语言 Go 1.3 版发布。

13
2015 年 08 月 20 日Go 1.5Go 语言 Go 1.5 版发布。本次更新移除了 ”最后残余 C 代码”。



















http://forum.digitser.cn/data/attachment/forum/201605/19/132155fevczeyds5e5y1wy.jpg
长按二维码关注 "德云社区" ,点击最下方 "阅读原文" 了解更多资讯
版权声明:
本文为独家原创稿件,版权归 德云社区,未经许可不得转载;否则,将追究其法律责任。

页: [1]
查看完整版本: Go 语言 ── 性能C/C++ 开发效率比肩Python 替代Java的静态语言