美图欣赏 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 编程 > C语言 >

为什么C++程序员不想改用Go语言

2019-04-16 10:40|来源:未知 |作者:dnzg |点击:
下面是我在2012年六月旧金山GoSF会议上的发言。  
这是一个私人谈话。我不单是对在这坐的Go开发团队成员说,我要感谢团队在推动Go发展上所做的一切。我还想感谢GoSF组织者给了我跟大家交流的机会。  
几个星期前我被问道这个问题:“你被鼓励转到Go后遇到最大的惊喜是什么?”。我立刻知道了答案:虽然我们预期C++程序员会将Go当做一个替代者,然而转到Go的程序员更多来自于如Python和Ruby等语言,很少有来自C++。  
Ken、Robert和我,当我们还是C++程序员时我们设计了一种新的语言来解决我们认为需要用这门新语言来解决的问题。这好像是自相矛盾的,其他C++程序员并不在乎。  
下面是我在2012年六月旧金山GoSF会议上的发言。  
这是一个私人谈话。我不单是对在这坐的Go开发团队成员说,我要感谢团队在推动Go发展上所做的一切。我还想感谢GoSF组织者给了我跟大家交流的机会。  
几个星期前我被问道这个问题:“你被鼓励转到Go后遇到最大的惊喜是什么?”。我立刻知道了答案:虽然我们预期C++程序员会将Go当做一个替代者,然而转到Go的程序员更多来自于如Python和Ruby等语言,很少有来自C++。  
Ken、Robert和我,当我们还是C++程序员时我们设计了一种新的语言来解决我们认为需要用这门新语言来解决的问题。这好像是自相矛盾的,其他C++程序员并不在乎。  
今天我想来说说是什么激发我们创建Go语言,以及为什么得出这样的结论应该是意料之中的事情。我承诺这将是一段更倾向于Go语言而不是C++语言的发言,所以即使你不了解C++语言,你也可以从这篇文章中了解一二。  
实际上,这篇文章的结论可以概括如下:你认为lessismore(少即多),还是lessisless(少即少)?  
这里我用一个真实的案例作为比喻。Bell实验室中心原来是用3位数字来命名的:111是物理研究所、127是计算科学研究所等等。在20世纪80年代,随着我们对研究的深入了解,已经不足以用3位数字来简单地命名研究所了。所以,我们的研究中心编号变成了1127。RonHardin半开玩笑地说如果我们真的了解了这个世界,我们可以去掉编号前面的1位,从127变为27。当然,管理层不会采纳这个玩笑,也并没有被期望他们这么做。但是,我认为,Ron的说法是有道理的。Lesscanbemore(精简反而有更深的内涵)。你了解得越深入,你就能够用更精炼的语言来概括。  
记住这个道理。  
回到2007年9月,我正在做一些为一个大型的GoogleC++项目做一些琐碎而中心的工作。你可能接触过这样的程序,在我们大型分布式编译集群上编译这个程序就用了大概45分钟。后来,听说了在C++标准委员会的Google工程师将会进行C++0x(即现在的C++11)新特性的演讲。  
在这场1个小时的演讲里,我们听说了C++0x计划中的35项新特性。实际上,或许还有更多的,但演讲中只描述了其中的35项。当然,一些新特性可能很微小,但是演讲中的特性却都十分重要。一些特性非常精妙而难以理解,像右值引用(rvalue-reference);但同时也有很多C++特色语法,像可变参数模板(variadictemplates);而其他一些则非常疯狂,像用户定义数据标志(user-definedliterals)  
此刻我问了自己一个问题:C++委员会真的相信C++因为没有足够的特性而出问题吗?当然,作为RonHardin玩笑话的变种,简化编程语言相比于增加语言是更大的进步。这想法是有些可笑,但先记住它。  
在那次C++演讲前几个月,我曾给自己一个演讲,你可以去YouTube上看,内容是关于我在1980年间创造的一个娱乐性质的并发语言。那个语言叫做Newsqueak,当然它是Go的前驱。  
我做那个演讲是因为Newsqueak中的一些想法是我在Google工作时错过的,而我又重新对这些想法进行了思考。我确信它们将使得写服务器代码更加简单,而且Google将会从中受益。  
事实上我曾经尝试去寻找一个方法把这些想法引入C++,但是失败了。把并发操作和C++的控制结构连接起来太难了,反过来这样也很难看到真正的优势。再加上C++让自己看起来非常难处理,尽管我承认很难使语言真正易用。所以我遗弃了这个想法。  
但C++0x演讲让我重新思考。真正困扰我的——我认为也困扰着Ken和Robert——是具有原子类型的新C++内存模型。在一个已经超负荷的类型系统中加入这样一个定义微观细节的集合,让人感觉是错的。这看起来也非常短时,因为硬件很可能在下一个十年里有明显的变化,把语言和今天的硬件结合这么紧密将是不明智的。  
会议结束后,我们回到办公室。继续开始了新一轮的编译,然后转过桌子面对着Robert,开始询问那些关注的问题。在编译结束以前,我们说服了Ken,决定自己动手做点什么。我们并不希望一直用C++写程序,我们,特别是我,希望在为Google写代码的时候能够自然地使用并发编程技术。我们也希望强调“Programminginlarge”的方向。  
我们在白板上写了很多我们想要的特性。我们从大方向出发,忽略详细的语法和语义只关注事物的主要部分。  
我还保留着在那周里一个邮件列表,下面是一些节选:  
Robert:起点:C语言,解决一些明显的瑕疵、删除杂质、增加一些缺少的特性。  
Rob:命名为Go语言吧,你可以为这个名字想一些原因。但是它已经有不少美好的属性了。简单地说,易于书写。工具命名也容易:goc、gol、goa。如果有一个交互的调试器、解释器的话,它可以就叫“go”。文件名后缀就是“.go”。  
Robert:空接口:interface{}。可以被所有接口实现,所以,这个接口可以代替void*的位置。  
这时候,我们并没有完全弄清楚这种语言。举例来说,我们用了大概一年时间才弄清楚array和slice的结构。但是在最初的那几天,很多重要的特性就已经出现了。  
注意到Robert说C语言是起始点,而不是C++语言。我不确定,但我相信他指的是C语言,因为当时Ken也在。但是实际上,最后我们并不是真的从C语言开始扩展。我们完全重新开始了这门语言,稍微从C语言借鉴了操作符、括号以及一些普遍的关键字。(当然,我们也从其他我们所知道的语言中借鉴了很多想法。)在任何情况下,在我看来,我们从基础上、打破一切的思路以及重新开始来回应C++语言。我们并不是尝试设计一个更好的C++、甚至说一个更好的C语言。它只是一个对我们所关注的软件更好的语言。
(责任编辑:dnzg)
新锦江娱乐 关闭广告
新锦江娱乐 关闭广告