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

记住这个道理。

回到 2007 年 9 月,我正在做一些为一个大型的 Google C++ 项目做一些琐碎而中心的工作。你可能接触过这样的程序,在我们大型分布式编译集群上编译这个程序就用了大概 45 分钟。后来,听说了在 C++ 标准委员会的 Google 工程师将会进行 C++0x(即现在的 C++11)新特性的演讲。

在这场 1 个小时的演讲里,我们听说了 C++0x 计划中的 35 项新特性。实际上,或许还有更多的,但演讲中只描述了其中的 35 项。当然,一些新特性可能很微小,但是演讲中的特性却都十分重要。一些特性非常精妙而难以理解,像右值引用(rvalue-reference);但同时 也有很多 C++ 特色语法,像可变参数模板(variadic templates);而其他一些则非常疯狂,像用户定义数据标志(user-defined literals)

注意到 Robert 说 C 语言是起始点,而不是 C++ 语言。我不确定,但我相信他指的是 C 语言,因为当时 Ken 也在。但是实际上,最后我们并不是真的从 C 语言开始扩展。我们完全重新开始了这门语言,稍微从 C 语言借鉴了操作符、括号以及一些普遍的关键字。(当然,我们也从其他我们所知道的语言中借鉴了很多想法。)在任何情况下,在我看来,我们从基础上、打破一 切的思路以及重新开始来回应 C++ 语言。我们并不是尝试设计一个更好的 C++ 、甚至说一个更好的 C 语言。它只是一个对我们所关注的软件更好的语言。

最后,它当然和 C 或者 C++ 都相当不同。不同点甚至比大家注意到的多。我列举一下 Go 语言对 C/C++ 语言的关键的简化:

  • 正则语法(不需要一个符号表来做语法分析)
  • 垃圾回收
  • 没有头文件
  • 没有循环依赖
  • 常量只是数字
  • int 和 int32 是两种不同的类型
  • 用大小写字母区别变量的可见性
  • 对所有类型可用的方法(没有类的语法)
  • 没有子类型继承(没有子类)
  • 包层次的初始化和良好定义的初始化顺序
  • 文件的编译以包组织
  • 任意顺序出现的包层次全局变量
  • 没有算术转换(arithmetic conversions)(通过常量支持)
  • 接口是隐含的(不需要用“implements”显式声明)
  • 嵌入的(没有超类的好处)
  • 方法被声明为函数(不需要特殊的地方)
  • 方法就是函数
  • 接口是没有数据的方法
  • 方法以参数名匹配,而不是通过类型
  • 没有构造函数或者析构函数
  • 后增量运算(x++)和后减量运算(x--)是语句而不是表达式
  • 没有前增量运算和前减量运算
  • 赋值操作不是表达式
  • 没有序列点(sequence point)的概念:evaluation order defined in assignment, function call
  • 没有指针运算
  • 内存分配总是初始化为 0
  • 可以获取本地变量的地址
  • 在方法中没有 this 关键字
  • 分段的栈结构
  • 没有 const 或者其他类型注解
  • 没有模板结构
  • 没有异常处理结构
  • string、slice 和 map 是语言结构
  • 数组越界检查

 这也是Go的方式。Go接受了这个想法并发扬光大。它是一个构造和耦合的语言。

很明显的例子是它提供给我们构造成分的接口方式。成分是什么不重要,如果它实现了方法M,我可以把它放在这里。

另一个重要的例子是并发性如何构造那些独立执行的计算。

甚至有一个非寻常(非常简单)的类型构造形式:嵌入。

这些构造技术正是Go的风味特色,这是和C++或者Java程序的最大的区别。

我想提一下Go设计中的一个不相干的方面:Go是为了写大型程序、被大型团队编写并维护而设计的。

关于“大型编程”的想法,从某种角度看C++和Java占据着这个领域。我认为这仅仅是个历史偶然现象,或者是个业界偶然现象。但大部分人都觉得这和面向对象设计有某种关系。

我一点也不相信这些。大型软件当然需要方法论,但更加需要的是强依赖性的管理、干净的接口抽象和优秀的文档工具,而这些C++都不能很好的处理(尽管Java明显好些)。

我们现在还不知道,因为还没有足够的用Go写的软件,但我相信Go将证明是一个优秀的用于大型编程的语言。时间将证明一切。  

现在是时候回答我们刚开始提出的令人惊讶的问题:

为什么Go,一种完全为C++是怎样用所设计的语言,又不吸引更多的C++程序员?

玩笑撇在一边,我认为其原因是Go和C++有着完全不同的哲学。

C++是可以让你在指尖拥有一切。我在C++11FAQ中发现了如下引用:

  C++抽象范围可表示的很优雅,灵活,手工制作的专业代码和零成本相比是大大增加的。

这样的想法和Go的操作方式是不同的,零成本可不是Go的目标,但至少不是CPU零成本。Go 宣称极小化编程人员的付出是它们认为最重要的。

相关推荐