Google的亲儿子Go是完美的编程语言吗?

栏目: C++ · 发布时间: 5年前

内容简介:团队有项目考虑用GO重写,所以花了些时间调研GO。第一次接触GO是5年前,14年4月份,也是在我司,全职钻研一周,彼时C++中毒太深,内心排斥其他编程语言,看其他语法总觉得有点怪,而且有“C/C++能做任何事,故无用其他语言之必要”的思想在作祟。

#引言

团队有项目考虑用 GO 重写,所以花了些时间调研GO。

Google的亲儿子Go是完美的编程语言吗?

第一次接触GO是5年前,14年4月份,也是在我司,全职钻研一周,彼时C++中毒太深,内心排斥其他编程语言,看其他语法总觉得有点怪,而且有“C/C++能做任何事,故无用其他语言之必要”的思想在作祟。

我读研阶段用过几年Java,工作以来一直使用C++/C,况且教出几个非计算机系(包括英语系)的职业程序员,所以,我就浮夸一回,声称熟练掌握C++吧。

Google的亲儿子Go是完美的编程语言吗?

人都有思维定势,受限于自己的经验和认知,我亦不能例外,但好在我意识到这一点,所以在调研过程中,努力摒弃成见,尽量摆脱惯性,查阅关于GO的各种(包括核心设计师)文章,倾听拥趸和批评者的不同声音,结合自己的思考和分析, 力求客观公正去评价GO

#GO语言简介

GO是Google开发的一种静态、强类型、编译型、并发型,并具有垃圾回收功能的类C编程语言。2009以开源项目的形式发布,2012年发布1.0稳定版本,距今已经十年了。

发明一种新的编程语言,首先得找到必要性,不然肯定会被质疑重复造轮子,方法嘛?无非是先找某种语言的一些茬,吐槽一番,复杂、笨拙、低效,太TM沙雕了,不能忍,劳资要立刻马上分分钟撸出一种新的编程语言,完美解决所有问题,不然对不起我卓尔不群的智商。

Google的亲儿子Go是完美的编程语言吗?

GO的故事也很套路,G公司的Pike大牛听完C++0x的演讲,回到办公室,开始编译C++,等待编译过程中,转过椅子面向Robert,讨论语言的问题,然后拉上Ken爷爷一起合计,群嘲之后,受不了C++某些沙雕设计,还没等编译完成,三个老男人便一拍即合,决定一起搞点change the world的伟大事情,于是乎,GO诞生了。

GO语言之父Pike提到: GO语言是以C为原型,以C++为目标而设计的,希望C++程序员能以GO作为替代品 。因为他觉得C++忒复杂了,要解救 程序员 于水火。

虽然GO以C++为目标而设计,但尴尬的是,Pike坦承GO并没有吸引来多少C++程序员,反而是吸引了不少 PythonRuby 程序员。这、这、这、这。

#GO核心团队

G公司不差钱不缺人,GO团队更是群星荟萃、大咖云集,不废话,直接上图:

Google的亲儿子Go是完美的编程语言吗?

核心设计师Pike和Ken都是出身自贝尔实验室,Ken之于Pike,亦师亦友,共同发明了UTF-8,还基情四射地结对编程过,感情好的穿一条裤子。

Pike是Unix先驱,贝尔实验室最早跟Ken、Dennis一起开发Unix的猛人,Plan9 OS的灵魂人物。大胡子Ken爷爷则是Unix之父,和Dennis一起发明了C语言,殿堂骨灰级程序员,早已是名满天下。

技术实力毋容置疑,不过这哥俩都是玩Kernel的,经历相同,理念相近,分歧会比较少,他们也都坦承C用得最多最熟,所以注定了GO的类C特性,不过这会不会导致GO设计上的思维火花不足,对OOP以及现代编程思想的支持不足,亦未可知。

#GO的哲学

哲学是难分对错的,GO有GO的哲学,有它的取舍和审美,不一定每个人都认同,我觉得还挺有道理的,罗列如下:

##少即是多

GO信奉: Less Is More ,大道至简,臆测是乔帮主的信徒。

##世界是并行的

世间万物是并行发生的,所以GO遵照这个规律,对并发的原生支持让GO更易于描述并行世界。

##世界是物质组成的

微观世界由小的粒子组合成大的粒子;宏观世界由小的物体组合成大的物体。继承只能描述现实世界的一小部分,使用继承是不全面的;GO的设计选择的是组合,这个和现实世界比较吻合的设计,表现力更强。

##世界是标准化的

硬件是标准化的,软件也应如此,GO的接口是DUCK模型,接口是非侵入式的。

##正交性

GO的多个特性都是正交性的,正交性是保持事物稳定和简单的最好设计。

##二八定律

80%代码只使用20%特性,增加语言特性,并不能提升效率,反而会增加复杂性,提高犯错率,加重程序员心智负担。

##统一格式化

C++语法自由自在,于是乎一群吊丝为tab or space、大括号要不要换行等诸如此类的格式问题吵得不可开交。GO设计师认为,都是吃饱了撑的,你们太愚蠢了。

于是GO规定左大括号{不能换行放置,没有为什么,对着干直接编译不过。

GO编译器内建工具gofmt强制源码格式化。对不起,没有选项,我的地盘听我的,把精力focus到真正重要的事情上来,停止无意义的争吵。

这其实也是一种哲学: 给你(我认为)最好的,而不是给你选择 。就像iPhone一样,用户太笨了,他们根本不知道自己需要什么,就让帮主替你安排好一切吧。

不过GO强加个人喜好的一刀切做法,也招致批评和厌恶。有比较刚的程序员,直接因为大括号不让换行而抛弃GO。

作为一个经历过各种妖媚代码格式要求的程序员,我发出了杠铃般的笑声。

#GO的特色

GO是介于C与C++之间的语言,比C抽象层次高,比C++抽象层次低。

因为是一门新的编程语言,站在巨人的肩膀,博采众长,规避了一些已知的问题,开发了一些优秀的特征,相比C/C++,GO的核心特征包括以下几个方面:

1. 原生并发,以东尼·霍尔的通信顺序进程(CSP)为基础的goroutine,适合现代多核机器

2. 垃圾回收,非常高效(请来世界顶级内存管理专家设计)

3. 强大的标准库,对网络编程等的良好支持

4. CGO提供了GO调用C机制,扩展了GO的能力边界

5. 内嵌关联数组

6. 非侵入式的接口设计

7. 简单清晰的语法,以及强编码规则,好处可能远超想象

#GO vs C/C++

Google的亲儿子Go是完美的编程语言吗?

[GO与C语法详细对比](http://hyperpolyglot.org/c)

#性能对比

虽然GO号称 兼备C++的运行效率和 PHP 的开发效率 ,但benchmarks好像打脸了,从数据上看, GO的运行效率接近却略低于Java

Google的亲儿子Go是完美的编程语言吗?

#研发效率

Google的亲儿子Go是完美的编程语言吗?

我乐观预计GO的研发效率上优于C/C++,特别是*nix环境下。

#流行度

GO获得TIOBE 2016年度最佳,2017年10月获得第10,历史最高排名。

GO诞生10年,虽然背靠Google,但依然没有挺进编程语言第一阵营 ,属于外围三线。

近一年多流行度排名有所下滑,铁打的 Java 、C/C++,流水的编程语言。

Google的亲儿子Go是完美的编程语言吗?

#工程化水平

Google的亲儿子Go是完美的编程语言吗?

知名项目:

Docker:大名鼎鼎的开源应用容器引擎

K8S:容器编排管理系统的事实标准

...

GO更适合开发服务器端大型软件,高性能分布式系统领域,网络编程,并发编程,被誉为云时代的C语言。

GO成为云计算时代流行起来,促进了云计算的发展,Google用GO的多,今日头条、Uber等公司也用GO对业务进行了彻底的重构,golang.org YouTube.com也在使用GO开发。

美国市值TOP20有一半在使用GO,国外很多初创公司选择GO,国内关注高,但还未得到广泛应用,应用上呈现国外热国内冷的特点

Go语言目前所面临的最大问题在于,还没有足够的经验来证明GO是否真的是一个成功的产品,缺少足够多超大型应用的实践。

【责任编辑:庞桂玉 TEL:(010)68476606】


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++数据结构与程序设计

C++数据结构与程序设计

克鲁斯 / 钱丽萍 / 清华大学出版社 / 2004-1 / 59.00元

《C++数据结构与程序设计》这本精心制作的课本结合面向对象程序设计和C++强有力的特性,构建数据结构的基本思想,设计了程序和有趣的应用。在此过程中,《C++数据结构与程序设计》探讨了作为软件设计基本工具的问题求解和设计原理、数据抽象、递归和算法的比较分析。《C++数据结构与程序设计》使用真实的案例研究、可重用的软件开发和程序设计项目来增强理解。一起来看看 《C++数据结构与程序设计》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换