大家好,我是煎鱼。
大家平时都是在用 Go 语言,那以往已经有了 C、C++、Java、PHP。Google 的大佬们为什么还要再开发一门新的语言呢?
难不成是造轮子,其他语言不香吗?
背景
Go 编程语言构思于 年底,构思的目的是:为了解决在 Google 开发软件基础设施时遇到的一些问题。
图上三位是 Go 语言最初的设计者,功力都非常的深厚,按序从左起分别是:
Robert Griesemer:参与过 Google V8 JavaScript 引擎和 Java HotSpot 虚拟机的研发。Rob Pike:Unix 操作系统早期开发者之一,UTF-8 创始人之一,Go 语言吉祥物设计者是 Rob Pike 的媳妇。Ken Thompson:图灵奖得主,Unix 操作系统早期开发者之一,UTF-8 创始人之一,C 语言(前身 B 语言)的设计者。
遇到的问题
曾经在早期的采访中,Google 大佬们反馈感觉 "编程" 太麻烦了,他们很不喜欢 C++,对于现在工作所用的语言和环境感觉比较沮丧,充满着许多不怎么好用的特性。
具体遭遇到的问题。如下:
软件复杂:多核处理器、网络系统、大规模计算集群和网络编程模型所带来的问题只能暂时绕开,没法正面解决。软件规模:软件规模也发生了变化,今天的服务器程序由数千万行代码组成,由数百甚至数千名程序员进行工作,而且每天都在更新(据闻 Go 就是在等编译的 45 分钟中想出来的)。编译耗时:在大型编译集群中,构建时间也延长到了几分钟,甚至几小时。
设计目的
为了实现上述目标,在既有语言上改造的话,需要解决许多根本性的问题,因此需要一种新的语言。
这门新语言需要符合以下需求:
目的:设计和开发 Go 是为了使在这种环境下能够提高工作效率。设计:在 Go 的设计上,除了比较知名的方面:如内置并发和垃圾收集。还考虑到:严格的依赖性管理,随着系统的发展,软件架构的适应性,以及跨越组件之间边界的健壮性。
这门新语言就是现在的 Go。
Go 在 Google
Go 是 Google 设计的一种编程语言,用于帮助解决谷歌的问题,而 Google 的问题很大。
Google 整体的应用软件很庞大,硬件也很庞大,有数百万行的软件,服务器主要是 C++ 语言,其他部分则是大量的 Java 和 Python。
数以千计的工程师在代码上工作,在一个由所有软件组成的单一树的 "头 " 上工作,所以每天都会对该树的所有层次进行重大改变。
一个大型的定制设计的分布式构建系统使得这种规模的开发是可行的,但它仍然很大。
当然,所有这些软件都在几十亿台机器上运行,这些机器被视为数量不多的独立、联网的计算集群。
简而言之,Google 的开发规模很大,速度可能是缓慢的,而且往往是笨拙的。但它是有效的。
Go 项目的目标是:消除 Google 软件开发的缓慢和笨拙,从而使这个过程更富有成效和可扩展。这门语言是由编写、阅读、调试和维护大型软件系统的人设计的,也是为他们设计的。
因此 Go 的目的不是为了研究编程语言的设计,而是为了改善其设计者及其同事的工作环境。
Go 更多的是关于软件工程而不是编程语言研究。或者换个说法,它是为软件工程服务的语言设计。
痛点
当 Go 发布时,有些人声称它缺少被认为是现代语言的必要条件的特定功能或方法。在缺乏这些设施的情况下,Go怎么可能有价值?
我们的答案是:Go 所拥有的特性可以解决那些使大规模软件开发变得困难的问题。
这些问题包括:
构建速度缓慢。不受控制的依赖关系。每个程序员使用不同的语言子集。对程序的理解不透彻(代码可读性差,文档不全等)。工作的重复性。更新的成本。版本偏移(version skew)。编写自动工具的难度。跨语言的构建。
纯粹一门语言的单个功能并不能解决这些问题,我们需要对软件工程有一个更大的看法。因此在 Go 的设计中,我们试图把重点放在这些问题的解决方案上。
总结
软件工程指导了 Go 的设计。
与大多数通用编程语言相比,Go 的设计是为了解决我们在构建大型服务器软件时接触到的一系列软件工程问题。这可能会使 Go 听起来相当沉闷和工业化。
但事实上,整个设计过程中对清晰、简单和可组合性的关注反而导致了一种高效、有趣的语言,许多程序员发现它的表现力和力量。
为此产生的 Go 特性包括:
清晰的依赖关系。清晰的语法。清晰的语义。相对于继承的组合。编程模型提供的简单性(垃圾收集、并发)。简单的工具(Go工具、gofmt、godoc、gofix)。
这就是为什么要开发 Go 的由来,以及为什么会产生如此的设计和特性的原因。
你学会了吗?:)