从Go、Swift出发:语言的选择需谨慎

Google于2009年第一次提出了Go的构思,Facebook在去年春天引入了Hack,随后不久Apple也发布了其Swift语言。

在战争中,胜利者写历史书;在科技中,赢的公司都在写编程语言。互联是建立在开发标准和代码之上,但是社交网络和云计算领域受企业巨头控制,并且它们开始把自己独一无二的印记烙在数字科技上——这是必然的,就像征服者威廉和他的诺曼人一样,大量新的词汇加入到英语中。他带来许多新事物,如陪审制度,这些都影响着当地的法律和语言的方式。

可以确定的是,新的语言给予程序员一些有用的支撑点。Google Go语言的构建简化了并发运行代码的工作,由于存在并行编程模式,因此这一语言也被设计用来解决多处理器的任务。对于流行的Web脚步语言,像PHP和JavaScript,Apple的Swift语言提供给iPhone程序员一些简洁性和灵活性。每个语言都有它自己的标志:Swift是一只风格化的鸟,Go语言则是一只拗脚的地鼠。

Ken Thompson、 Rob Pike 和Robert Griesemer是Google的三位编码大师,于2009年半开玩笑的提出了Go的构思。像C++和Java这些广泛使用的编程语言是迟钝的,尤其是面对Google那种大规模的项目部署时。每次添加或改变一些东西时候,你都需要等待编译器将代码转换为机器可读的二进制版本。

Rob Pike说:“这个等待过程要45分钟,我认为这是痛苦的。当需要等待那么长时间时,你有很多时间可以考虑,你需要怎么做可以更好。”

设计编程语言在于权衡——对于程序员容易,对于机器最适合

创建运行快的代码要求程序员付出更多的努力。人们编写运行迅速的代码需要花费多少时间和精力呢?另一个主要权衡在于直接访问机器时语言提供的内存数量。不仅在这里,在其它地方也一样,语言发明者必须选择:知道他们可能会搞砸时,你为程序员提供多少自由?你为他们提供多少措施来缓解他们的失误?

语言设计的任务是庄严的、正式的、宏伟的、充满了难题和矛盾。这里没有正确的答案,只有不同的选择,以适应不断变化的硬件、多变的用户和挑剔的程序员。

Go语言的创造者有足够的经验去做这些选择,Ken Thompson创建了Unix,他和他的同伴Pike(贝尔实验室老将)共同设计了字符编码的风格,被称为UTF-8,现如今大多数Web会使用。所以他们知道小的决策也会有巨大的影响。现在增加的每一条规则,可能就意味着在未来极多的按键需要程序员去操作。每一条规则的遗漏可能意味着无数的崩溃。

例如,编程语言通常使用分号来分隔语句,使用括号将相关语句组织在一起。典型的如“Hello,World”C语言程序:

main()
{
printf(“hello world”);
}

Go的创造者认为括号是至关重要的。有些语言(尤其是Python)把这放到了一边,允许程序员使用缩进(空格)或“隐形的字符”来告诉人和机器代码的位置。Go团队认为这是一个“深刻的错误”,括号意味着程序员可以明确不含糊的告诉计算机如何在很大一块区域组合代码。在一次与Sergey Brin会面上,Google的创始人提出Go的设计人员使用方括号,而不是花括号,节约开发者无数趟使用“Shift”键。

在2009年12月份,Go决定停止要求程序员以分号结束语句。分号用于解析器——把项目分解成块(相关代码组成一块)的幕后工具,目前的FAQ解释道:“我们想尽可能的消除它,从此当你递送你代码到解析器的时候,机器将注入分号。”

Go清除分号减轻了程序员的眼睛疲劳,但是程序员需要更严格的部署花括号,否则分号会注入到错误的地方。

这些选择并不是没有争议的,一个批评家在Pike的讲座上抱怨道:“他们通过冗余的花括号破坏了语言。”语言也可以被设计的很容易,仅仅使用空格行使花括号的角色来阻断代码的不同部分。Google的Andrew Gerrand 回应道:“每天都有一定规模不可思议的倒霉事发生。意思是有人会偷偷的把一些看不见的符号放入代码库中,导致一个微妙的Bug。这在Google的Python程序中已经发生了不止一次。”

然而对于那些在软件论坛争论细微差别的程序员来讲,“任性的”语法也会使他们“醉了”。

和我们所说的语言不同,程序员称之为自然语言。编程语言是为特别目的和用途精心编制的。Go,正如Pike解释的那样,它是由Google设计的用来解决Google问题。Google存在大的问题......我们需要一种语言,可以让我们更容易的完成我们的工作——编写服务软件。

Google在云服务中运行它自己的全球性超级计算机,这种计算恰恰使Go能够得到最佳化的使用。但是Google并没有从销售软件中获得一分钱。并且Go已经是一种免费的、开源的项目,这使得它迅速的进入了其他装备的技术库。Redmonk咨询公司的一名分析师说:“它成为云基础设施的新兴语言。”

Go已经逐渐的流行起来。例如,Dropbox已经从Python转移了大部分的后端代码到Go。Automattic,一家运营Wordpress.com的公司,也使用了Go,虽然WordPress本身一直使用PHP脚本语言。Automattic开发者Demitrious Kelly说:“这些天有十几个新的框架和方法摆在那,你必须要问自己,它比我们拥有的要好吗?但是这本身就是一个复杂的问题,要好到什么程度?它可以让我们做到什么是我们以前做不到的事情?值得吗?”Kelly称,在众多测试当中Go的表现不错,部分原因是该语言比较小,他说:“Go语言很容易在一个星期内就上手。”

鉴于Go的设计主要是针对Google特定的问题,语法的选择,即分号和花括号。这个问题并不那么简单,需要追求细节,还要有热情。愿意无视传统的编程给这个世界带来新的语言。可能最终推动语言的采用的就是程序员认真注意日常的编码——程序员称之为“痛点”

Swift的起源

每个编程政权都有这样的痛点,但是迅速崛起的iOS给了开发者多于常规的份额。直到今年夏天Swift语言的出现为止,如果你想为iOS写一个程序,你必须使用Objective C语言。在80年代,Steve Jobs就已经采用了Objective C,并且当Steve Jobs重返Apple之后,该语言逐渐成为Mac OSX的主力工具。

现在开发者说一个语言也就透露了他的年纪。编写Mac操作系统老将Andy Hertzfeld说:“当看到Swift公告的时候我非常激动。因为我一直鄙视Objective C,我喜欢其背后的原则,但是讨厌其语法,我从来没能够真正的享受编程。”

Apple将其下一代产品、编程语言项目委托给一位名叫Chris Lattner的计算机科学家,LLVM项目的主要发起人与作者之一。LLVM 是一个开源项目,其核心库提供了与编译器相关的支持,可以在不同的平台上运行(包括Apple和Google在内,都广泛的使用它)。在2005年加入Apple后,Chris Lattner继续LLVM项目以及相关的工作,随后在大众视野里消失了几年,去年6月份,在Apple全球开发者大会上,其携带Swift出现在大家的面前。

Swift旨在成为“第一款工业级质量的系统编程语言!”换句话说,Swift是有前途的,你将能够不用费力就可写出运行迅速的代码。这赢得了大批iOS开发者和旁观者的欢呼。 Hertzfeld说::“做得好,它缓解了每个人巨大的痛点。对于iOS开发者来说不去追求Swift的顶端是愚蠢的。”

如果你“签约”了Swift,意味着你购买了Apple的整个领域:你需要通过Apple开发和销售你的程序;你的程序将运行在Apple机器上;如果你想在其它地方运行的话,你需要使用其它语言重新写一遍;你的命运将和Apple密不可分。

Hertzfeld说:“你必须提交到这个“有围墙的花园”,所以他抵制了用Swift工作的诱惑。不过如果他们实现开源,或者对跨平台有一点点兴趣的话,我可能会接受Swift工作。”

开源版本的Swift意味着开发者能够找到一种方法快速的将程序移植到不同的平台,并且这也能保证在未来,当Apple失去了Swift继续下去的兴趣,该语言还是有未来的。那些曾逗留在“有围墙的花园”外围的开发者往往非常关心这个问题。Apple对于开源并不完全过敏,虽然它似乎决心要抓住世界范围内iOS的控制权。在Swift公布不久后,LLVM项目里的开发者开始就Swift“隔绝自然”问题纠缠于Apple和Lattner,Lattner回应说:

伙伴们,你的推测仅仅是——投机。我们还没有讨论过这个,因为我们有大量的工作去应对大量的反馈,并要在今秋发布1.0版本之前落实大量的事情(如访问控制)。你可以想象我们当中有很多人希望它开源,并成为LLVM的一部分,但是讨论尚未发生,并且短时间内也不会出现。

Swift的出现并没有Go时间长,在任何情况下,其未来在Apple领域是安全的,如果Apple说Swift是十亿iOS设备的未来,那么它就是。就像一位波特兰独立的iOS开发者David Wheeler一样,人们会采用它,因为从长远看来,他们别无选择,同时它也有意义。Wheeler说Swift迅速的将他“拿下”了,他以为Apple将继续修补Objective C,“我想知道它现在去哪了?”Wheeler说。

语言本能

大型计算机时代的主流语言有相似的起源:来自IBM的FORTRAN,以及COBOL在很大程度上是基于Grace Hopper的Flow-matic,而这个是为Remington Rand公司的Unicac创建的。在1990年,Sun创建了Java,2000年 Microsoft创建了C#。

事实上,大多数的语言是大型机构、企业或学校的产物。

Hertzfeld说:“创建一种新的编程语言需要花费大量的资源。这是一个长达十年的项目去让新的语言完全用工具加工、建立和使用,小公司做不到这点。”

尽管有困难,但是悲哀的是自1960年以来,计算机行业里有太多的语言存在重复的部分。今天的悲哀是无用的,程序员不太可能停止设计新的语言,或者同意去分享,因为如早期开发者Alex Payne说的那样:没有激励,语言的历史充斥着标准化的努力。这是非常错误的,浪费了大量的时间,却没有产出一个让任何人都满意的结果。

这么说并不意味着忽视Facebook开发的新语言Hack,尽管Hack是开放源代码的,但是本质上PHP语言的变体或扩展。并没有受到公司外部的人追捧。毫无疑问,Facebook希望看到变化,但是它并不是社交网络积极推动的东西。这些天对于Facebook的Hack的反应就是“观望”。

开发者指出,每一个新的语言开始作为一个摆脱不掉的种子存在于个人或小组的大脑中,这一直困扰着我。我们可以做的更高。无论如何,需要有耐心和努力去学习一个新的语言;开发者要仔细选择。Payne说:“当选用一个新的语言时,我会跟随其他人的东西,因为这些人和你一样依赖于图书馆和文档,我想你希望知道你是否进入了一个正确的‘小镇’。”

有一点我们可以有信心的说,新语言是好的,它们简化了程序员的生活;简化了编程的工艺;它们融入了新的有前途的思想;它们赢得了包括公司内外部开发者的尊重。

因为这些原因,霸权主义可能是一个错误的历史对照来制造新编程语言潮流。相反,我们讨论的这些更像是称为软实力的外交政策类型:Go和Swift以特定方式体现它们公司的精髓。服务器VS个人设备;开放Web VS应用商店;一个跨平台的世界VS一个公司。所有区分编程语言的分歧——编译或解释?静态VS动态变量类型?内存管理/垃圾回收?在今天这些可能都是很重要的。

换句话说,任何人担心企业发展编程语言的真正原因可能不是“OMG,他们想要接管世界!”相反,他们担心的原因是不管他们成长的多大,他们总会受到根源语言的约束。

关于编程语言,一旦它们占领程序员的“头脑”,那么你永远不会知道它们最终会去哪里。在80年代创造Objective C的面向对象编程爱好者,他们可能不知道该语言在25年以后会变成一个巨大的全球生态系统移动设备所必要的编程语言。当Sun于1995年推出Java时,每个人都认为它将是一个用于构建浏览器小程序的好工具,然而它的命运走向了服务器端。同时发布的Javascript被广泛的遗忘,在今天却让很多Web“移动”。

对于开发者来说,选择一个语言就像选择一个国家的国籍,你不仅仅购买语法和语义,你也购买了经济和文化,以及你怎样获得生计和力量的规则。就像他们常说的:为了避免一个“死”语言控制了世界,购买需要谨慎。

 原文链接: Medium 

我来评几句
登录后评论

已发表评论数()