Google Go有啥用?以及何谓好的系统编程语言
我认为,多数非初学者程序员不会把Go语言纳入自己的应用程序编程语言列表之中。当我指出它永远无法取代Java后,有人说我没有看到正确的统计数据。他们认为Go非常适合系统程序员。众所周知,在过去20年中,系统编程一直是C和C++程序员的地盘。通常来说,如果你进行真正的系统编程,必然属于这两个阵营之一,当然也有可能使用一点汇编语言。
好的系统编程语言
下面我将具体解释这个问题。首先,我们看一下一门好的系统编程语言的标准是什么。以下几点是我们希望它所具备的:
1、能够运行在资源受限的环境中;
2、效率高且运行时(runtime)开销小;
3、具有一个非常小的运行时库,或根本没有;
4、允许编程人员直接且“原始”的控制内存访问和控制流;
5、让编程人员能够直接以汇编语言编写部分程序。
那么Google Go语言是否满足上述要求?下面让我们逐一分析:
1、平均来说,Go语言的性能数据大约比C++差6倍左右。Go性能测试的最佳结果与C的最差结果相当。在一个应用程序环境中测试性能,Go和Java已经占了一定便宜,因为在这种环境中可能存在许多其它非内存和非CPU瓶颈,真实系统世界对原始执行时间和资源占用的要求要严格的多。(Go得10分)
性能数据,左侧为C系列语言,右侧为Go
2、Go所需的内存和执行占用空间要比C和C++高得多,并非两者理想的接班人。一个有趣的实验:在Go和C++中编译Hello World示例,Go的内存开销为38K,而C++则仅为6K,比前者小84%。(Go得10分)
时间、内存和代码量,Go所用与C系列所用之比
3、如果你考虑垃圾收集器,Go运行时的空间占用肯定要比C/C++大得多。更糟糕的是:Go的垃圾收集器目前还不太安全。(公正的讲,这是目前Go团队首要解决的事情)(Go得15分,此题20分)
4、在Go中可以实现原始且直接控制内存访问。如果你愿意,你可以使用这一点来研究其运行时架构。(Go得20分,此题20分)
5、Go有一个类似Java的本地接口(JNI),不过是静态连接的。(Go得20分,此题20分)
以上问题每题按20分计算,那么在满分为100分的测评中,Go的得分为75分。如果你是一个C/C++程序员,以上测评的得分肯定是满分,那么你转向Go的动机何在?加上系统编程人员通常不会迅速采用新推出的领先技术。C++也是经过了数年时间才被嵌入式C语言用户所接受。考虑到进行高质量系统编程所需要的可靠性程度,我对该领域任何新技术被接受的可能性持怀疑态度。
语法
最后,我们再次看一下Go语法方面的争议,我认为这是Go所有问题的核心所在。首先我要声明,就我个人而言,不存在对Go语法的任何问题。作为一个软件开发迷,我已经学习了大量语言,如果报酬可观的话,再多学一门语言不是什么大问题。不过根据我作为一个语言讲师的经验和帕金森蒜皮定律(Parkinson’s Law of Triviality)来看,语法学习对多数人来说是一个拦路虎。(51CTO编者注:平心而论,Go语言的语法还是很出色的,而且有着阵容强大的设计者。作者此处强调帕金森定律虽然没错,但未免一厢情愿,有失偏颇。)简单来说,帕金森定律认为,我们在讨论一件事情上所花费的时间和精力,往往和这件事的重要程度成反比,也就说,越不重要的事情,我们都能理解,就会花越多的时间去讨论;而越重要的事情,因为我们不能理解,就会花更少的时间去讨论。该定律对编程语言和语法来说尤其适用。上世纪90年代中期,向C++用户教授Java时曾遭遇阻力。从C++转向Go所面临的阻力要比从C++转向Java大的多,而这种阻力对Go的采用率非常关键。
因此,我不认为Go会取代C/C++成为新的系统编程语言。