巨头们的编程语言之争:我的语言就是比你好

今天,互联网巨头们也很任性,他们已经不满足于拥有自己的巨大的数据中心、豪华巴士以及有机午餐酒吧。他们还开始推出自己的编程语言,比如Google在2009年推出Go, Facebook在去年春季引入了HacK,以及后来的D语言. 而苹果推出了Swift语言。

在过去,编程世界总是被一分为二:要么是运行快速的语言;要么是使用简单的现代语言。但现在,这两个世界都撞在了一起:Google的Go语言是注重于让并发编程更简单,充分利用今天的多核处理器;苹果的Swift将Web脚本流行风格带给了iPhone开发者,每个语言都有自己的标志,Facebook的D语言也试图将运行高性能和易于编写两者统一在一起。

设计编程语言其实是一种平衡,对编程者应该是容易的,同时又适合机器运行。(也就是说,即要讨好开发人员,又要讨好CPU电脑)

My Computer Language is Better than Yours一文谈了这几个语言诞生的背景和本质。因为这些大公司语言可能在未来几年会影响每个程序员的职业生涯,如同IBM公司支持COBOL和SUN公司的Java一样。

Go语言本质
Ken Thompson, Rob Pike 和 Robert Griesemer,三位Google编程大牛当初有推出Go语言的念头是他们在等待C++和Java代码编译,这些被广泛使用的编程语言在谷歌这种需要大规模部署这种情形时却表现得力不从心,每次你添加和改变一些东西时,不得不等待编译器再次构建二进制版本。

Pike说:构建花费了45分钟,构建花费这么长时间非常痛苦的。

设计一个编程语言其实是一种平衡,在易于编程者和适合机器之间的平衡。

Go创建者Thompson协同发明了Unix,他和Bell实验室老将Pike曾经推出UTF-8的字符编码标准,如今我们几乎每天都在使用UTF-8,他们知道一点小决定会有什么大后果,今天的每一个规则影响着未来程序员
的每天键盘生活,每一个规则也可能带来无尽的崩溃。

例如 编程语言通常使用分号来分割语句,比如经典C语言的Hello World:


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

Go创建者认为大括号是必需的,一些流行语言如Python却把它扔在一边,允许程序员使用缩进 空格或不可见字符在人类眼睛和机器之间铺设代码。Go语言团队认为这是一种深刻的错误,大括号意味着程序员能够明确无误地告诉计算机,什么是一整块代码。(谷歌创始人布林Sergey Brin也曾经建议使用方括号替代大括号,这样节省程序员使用shift键来回切换,但是他没有赢得争论)

但是他们认为每个语句后面的分号则不是必需的,分号是为分析器服务的,不是为人类,他们要尽可能消除分号,因此,Go语言机制会在程序员敲完每行代码后面会注入分号。

Go这一创举节省了大量劳动和眼睛疲劳,但是为了让分号注入不再失控,程序员必须更加严谨地将代码包括在大括号之中,否则,分号会在错误的地方注射。

这种选择不是没有争议,“他们竟然用冗余的大括号毒害了语言”,一个评论者认为,空格键完全可以取代大括号的角色,但是Google Andrew Gerrand回复认为:在大规模系统上每天都有狗屎事情发生,人们用一些不可见字符塞入代码会有不可预料的微妙Bug,这在Google的Python编程中已经发生不止一次了。

Go语言是专门为解决Google问题而诞生,Goole有大问题,我们需要一个语言使得我们的工作更加容易,
我们的工作是编写服务器端软件。

Google有自己云计算超级计算机,这正是Go语言优化的目标,但是Google从来不会去卖一个软件,Go是免费开源项目,Go语言被认为是基于云基础设施的新兴语言。

Dropbox已经将其后端代码从Python移植到Go语言,Wordpress.com也开始使用Go语言,Wordpress他们以前是靠PHP起家的。

来自另外一篇Go vs. C中认为:
Go语言通过goroutines简化了内存模型,能够自动管理多线程执行,这些都优于C语言中手工编制线程的方式,通过channel的使用,Go使得内部进程之间通信也变得更简单。

但是Go和C都同样会发生死锁和共享数据竞争争夺的情况,两者都提供了相应的工具调试这种问题,因为Go设计得更简单,它就不可能在对线程的控制程度上达到C语言那种级别,如果需要这种级别的线程控制,那么C还是适合的(banq注:Java和Scala同样),对于大型项目,Go编译得比C/C++更快,而实际运行性能稍微落后于C/C++.Go的目标就是综合C的性能,但是使得软件工程师更加简单地使用它。

根据x64 Ubuntu : Intel Q6600 quad-core语言基准测试表明,Go语言快于大多数脚本语言 PHP, Perl, Python, Ruby, Hack,慢于一些编译型语言C++, Ada, C, 和 Fortran,也稍快于Java Haskell Scala和Erlang。当然,基准测试不代表全部,Go语言作为一个新的编译型语言,其编译器优化还是有余地的,


Swift语言起家
以前在iOS平台上编写程序使用的是Objective C,当Swift语言出来后,有人感到兴奋,因为他们对Objective C很失望,虽然喜欢其背后原理,但是讨厌它的语法,使用它从来没有真正享受过编程。

Swift创建者Chris Lattner曾经是流行开源项目LLVM的领导者。Swift瞄准的是首个工业质量系统的编程语言能够像脚本语言一样充满表现力和快乐。你可以使用Swift无需太多努力付出编写健壮的代码。

但是有人指责苹果是一个有围墙的花园,没有真正完全拥抱开源。

Facebook的D语言
Facebook的D语言与Google的Go语言以及苹果的Swift语言类似,都是在强大功能和简单易用性之间做了一种平衡。下一个大的编程语言你从来没有听说过一文谈了以Facebook为后盾的D语言,他们认为C++确实是一个运行速度非常快的语言,但是不像Python Ruby和PHP一样易于使用,换句话说,它不能让开发人员开发软件如同其运行一样快,D试图弥补这个缺口,提供C++一样的性能,同时又能让程序员人类方便编程。

实际上Facebook以前推出PHP的延伸Hack语言,Hack作为Facebook服务网页的前端,而D语言作为Hack的后端,服务其社交网络的引擎核心部分。

D语言编译速度也非常快,以至于实现即编辑即运行如同解释型语言一样。

一个语言成功取决于是否有人愿意花费大资金去推动它,Java语言的成功是因为早在20世纪90年代Sun公司在其背后花了很多钱。


[该贴被banq于2014-12-21 15:35修改过]


追加一篇:Rust语言介绍

Rust语言虽然不是由大公司推出,但是其背后非营利组织Mozilla也不可小觑,因为由大公司推动的语言如果将来和社区发生冲突怎么办?这种情况已经出现在java的Node.js上(见:Io.js由来)

当然,从它们各自粉丝的斗嘴仗中我们也能了解各种真正的优缺点。

Go与Rust的性能比较,在大多数测试项目中,Rust要比Go语言快。
[该贴被banq于2014-12-24 11:04修改过]