读书人

为什么小弟我们需要一门新语言Go语

发布时间: 2013-10-08 15:11:53 作者: rapoo

为什么我们需要一门新语言——Go语言

编程语言已经非常多,偏性能敏感的编译型语言有 C、C++、Java、C#、Delphi和Objective-C等,偏快速业务开发的动态解析型语言有 PHP、Python、Perl、Ruby、JavaScript和Lua等,面向特定领域的语言有 Erlang、R和MATLAB等,那么我们为什么需要 Go这样一门新语言呢? 在2000年前的单机时代, C语言是编程之王。随着机器性能的提升、软件规模与复杂度的提高,Java逐步取代了C的位置。尽管看起来 Java已经深获人心,但 Java编程的体验并未尽如人意。历年来的编程语言排行榜(如图 0-1所示)显示, Java语言的市场份额在逐步下跌,并趋近于 C语言的水平,显示了这门语言后劲不足。

为什么小弟我们需要一门新语言——Go语言

图0-1编程语言排行榜

Go语言官方自称,之所以开发 Go语言,是因为“近 10年来开发程序之难让我们有点沮丧”。这一定位暗示了 Go语言希望取代 C和Java的地位,成为最流行的通用开发语言。 Go希望成为互联网时代的 C语言。多数系统级语言(包括 Java和C#)的根本编程哲学来源于 C++,将C++的面向对象进一步发扬光大。但是Go语言的设计者却有不同的看法,他们认为C++ 真的没啥好学的,值得学习的是 C语言。C语言经久不衰的根源是它足够简单。因此, Go语言也要足够简单!

那么,互联网时代的 C语言需要考虑哪些关键问题呢?首先,并行与分布式支持。多核化和集群化是互联网时代的典型特征。作为一个互联网时代的C语言,必须要让这门语言操作多核计算机与计算机集群如同操作单机一样容易。其次,软件工程支持。工程规模不断扩大是产业发展的必然趋势。单机时代语言可以只关心问题本身的解决,而互联网时代的 C语言还需要考虑软件品质保障和团队协作相关的话题。最后,编程哲学的重塑。计算机软件经历了数十年的发展,形成了面向对象等多种学术流派。什么才是最佳的编程实践?作为互联网时代的 C语言,需要回答这个问题。接下来我们来聊聊 Go语言在这些话题上是如何应对的。

并发与分布式

多核化和集群化是互联网时代的典型特征,那语言需要哪些特性来应对这些特征呢?第一个话题是并发执行的“执行体”。执行体是个抽象的概念,在操作系统层面有多个概念与之对应,比如操作系统自己掌管的进程( process)、进程内的线程( thread)以及进程内的协程(coroutine,也叫轻量级线程)。多数语言在语法层面并不直接支持协程,而通过库的方式支持的协程的功能也并不完整,比如仅仅提供协程的创建、销毁与切换等能力。如果在这样的协程中调用一个同步 IO操作,比如网络通信、本地文件读写,都会阻塞其他的并发执行协程,从而无法真正达到协程本身期望达到的目标。

Go语言在语言级别支持协程,叫 goroutine。Go语言标准库提供的所有系统调用( syscall)操作,当然也包括所有同步 IO操作,都会出让 CPU给其他goroutine,这让事情变得非常简单。我们对比一下Java和Go,近距离观摩下两者对“执行体”的支持。

为了简化,我们在样例中使用的是 Java标准库中的线程,而不是协程,具体代码如下:

public class MyThread implements Runnable { String arg; public MyThread(String a) { arg = a; } public void run() { // ... } public static void main(String[] args) { new Thread(new MyThread("test")).start(); // ... } } 

相同功能的代码,在 Go语言中是这样的:

func run(arg string) { // ... } func main() { go run("test") ... } 

对比非常鲜明。我相信你已经明白为什么 Go语言会叫 Go语言了:Go语言献给这个时代最好的礼物,就是加了 go这个关键字。当然也有人会说,叫 Go语言是因为它是 Google出的。好吧,这也是个不错的闲聊主题。 第二个话题是“执行体间的通信”。执行体间的通信包含几个方式:

读书人网 >编程

热点推荐