当前位置: 首页 > 科技观察

谷歌之子Go是完美的编程语言吗?

时间:2023-03-22 16:30:33 科技观察

#Introduction团队有个项目考虑用GO重写,所以花了一些时间研究GO。第一次接触GO是在5年前。2014年4月,我也在我们公司。我全日制学习了一个星期。那时候C++中毒太深,排斥其他编程语言。/C++无所不能,不用其他语言”的思想在起作用,我研究生用了几年Java,工作以来一直在用C++/C。另外,我教过几个非计算机系(包括英语系)的专业程序员,所以我会夸大其词,声称精通C++。每个人都有固定的心态,受限于自己的经验和认知,我也不例外。幸运的是,我意识到这一点,所以在研究过程中,我尽量摆脱刻板印象,尽可能摆脱惰性,查阅各种关于GO的文章。阅读各种文章(包括核心设计师),听取不同的声音粉丝和评论家,结合自己的思考和分析,力求客观公正地评价GO。它是2009年作为开源项目发布,2012年发布1.0稳定版,距今已有十年。发明一门新的编程语言,首先要找到必要性,否则肯定会被质疑,重蹈覆辙。方法是什么?无非是先找出某种语言的一些毛病,然后吐槽一下。它复杂、笨拙且效率低下。问题,不然对不起我出众的智商。GO的故事也很套路。听完C++0x的演讲,G公司的PikeDaniel回到办公室开始编译C++。在等待编译的过程中,他转过椅子面对罗伯特,讨论语言问题,然后拉着肯爷爷一起干活,群里哈哈大笑后,他受不了一些C++的沙雕设计。在编译完成之前,三位老人一拍即合,决定一起做一件改变世界的大事,于是GO诞生了。GO语言之父派克提到:GO语言是以C为原型,以C++为目标设计的。希望C++程序员可以用GO代替。因为他觉得C++太复杂了,他要救程序员于水火之中。虽然GO是以C++为目标设计的,但令人尴尬的是,Pike承认GO并没有吸引很多C++程序员,而是吸引了很多Python和Ruby程序员。这,这,这,这。#GOcoreteamG公司不缺钱不缺人,GO战队云集明星大腕。废话不多说,直接上图:核心设计师Pike和Ken都来自贝尔实验室,Ken在Pike,以师亦友的身份共同发明了UTF-8,还满怀激情地结对编程,关系好就穿一条裤子。Pike是Unix的先驱,贝尔实验室与Ken和Dennis一起最早开发Unix,是Plan9OS的灵魂。留着胡子的肯爷爷是Unix之父。他与丹尼斯一起发明了C语言。他是一名铁杆程序员,早已名扬天下。他们的技术实力毋庸置疑,但他们都玩Kernel。他们有相同的经历和相似的想法,差异会更少。会不会导致GO设计的思维火花不够,对OOP和现代编程思想的支持不够,不得而知。#GO的Philosophy哲学难辨是非。GO有GO的哲学,有它的取舍和审美,不一定每个人都认同,我觉得还是蛮有道理的,罗列如下:##lessismoreGO信奉:LessIsMore,大道至简,自以为是成为乔爷的追随者。##世界是平行的世界上的一切都是平行发生的,所以GO遵循了这个规律,而原生对并发的支持让GO更容易描述平行世界。##世界是由物质组成的。微观世界是由小粒子组成大粒子;宏观世界是由小物体组成的大物体。继承只能描述现实世界的一小部分,使用继承并不全面;GO的设计选择组合,更符合现实世界,表现力更强。##世界是标准化的。硬件是标准化的,软件也应该是标准化的。GO的界面是DUCK模型,界面是非侵入式的。##OrthogonalityGO的很多特性都是正交的,而正交性是保持事物稳定和简单的最佳设计。##80%的代码只使用了20%的特性。添加语言特性不会提高效率,反而会增加复杂度,增加错误率,加重程序员的精神负担。##统一格式化C++语法洒脱,所以一群衣架子在争论tab还是空格,花括号要不要换行等等格式化问题。GO设计者认为你们都是满满当当的,你们太傻了。所以GO规定左花括号{不能换行。没有理由,直接编译不了。GO编译器内置工具gofmt强制源代码格式化。对不起,没办法,我家听我的,把重点放在真正重要的事情上,停止无意义的争吵。这其实是一个哲学:给你(我认为)最好的,而不是给你一个选择。就像iPhone一样,用户太笨了,他们不知道自己需要什么,就让帮手给你安排好一切。然而,GO这种一刀切的强加个人喜好的做法也招致了非议和反感。有比较新的程序员直接放弃GO,因为花括号不允许换行。作为一个经历过各种风骚代码格式化要求的程序员,我发出了一声杠铃大笑。#GO的特点GO是一种介于C和C++之间的语言,抽象层次比C高,抽象层次比C++低。因为它是一门新的编程语言,它站在巨人的肩膀上,向别人学习,避免了一些已知的问题,开发了一些优秀的特性。与C/C++相比,GO的核心特性包括以下几个方面:1.原生并发,基于TonyHall的CommunicationSequentialProcess(CSP)的goroutine,适用于现代多核机器2.垃圾回收,非常高效(邀请世界顶级内存管理专家设计)3.强大的标准库,良好的网络编程支持等4.CGO提供了GO调用C的机制,扩展了GO的能力边界5.嵌入式关联数组6.非侵入式界面设计7.简单清晰的语法,强大的编码规则,带来的好处可能远超想象#GOvsC/C++【GO和C语法详细对比】(http://hyperpolyglot.org/c)#性能对比虽然GO号称兼具C++的运行效率和PHP的开发效率,但benchmarks似乎被打脸,从数据来看,GO的运行效率接近但略低于Java。#研发效率我看好GO的研发效率比C/C++好,尤其是在*nix环境下。#popularityGO获得TIOBE2016年度大奖,并于2017年10月获得第10名,创历史最高排名。GO诞生于10年前。虽然背靠谷歌,但依然没有挺进编程语言黑客的阵营,属于外围三线。近一年多时间,人气排名下降,铁甲的Java、C/C++、精简的编程语言。#工程级知名项目:Docker:著名的开源应用容器引擎K8S:容器编排管理系统的事实标准...GO更适合开发大型服务端软件,高性能分布式系统领域,网络编程,并发编程,被誉为云时代的C语言。GO在云计算时代大行其道,推动了云计算的发展。谷歌经常使用GO。今日头条、优步等公司也使用GO彻底重构业务。golang.orgYouTube.com也在使用GO开发。美国市值前20的一半都在用GO。很多国外的初创公司选择了GO。国内关注度高,但并未得到广泛应用。应用表现出国外热国内冷的特点。Go语言目前面临的最大问题是没有足够的经验来证明GO是否真的是一个成功的产品,但是对于超大型应用的实践却不够。