【FAQ】go的十万个为什么?-起源|Go主题月

183 阅读7分钟

本文中译于官方FAQ

原文地址:golang.org/doc/faq#Ori…

Go项目起源

该项目的目的是什么?

在Go诞生之初(仅十年前),编程世界与今天有所不同。生产软件通常是用C ++或Java编写的,GitHub不存在,大多数计算机还不是多处理器,除了Visual Studio和Eclipse,几乎没有可用的IDE或其他高级工具,更不用说在互联网上免费了。

同时,由于使用与我们一起开发服务器软件所使用的语言所需的过分复杂性,我们感到沮丧。自从首先开发诸如C,C ++和Java之类的语言以来,计算机已经变得非常快,但是编程本身并没有进步得那么快。同样,很明显,多处理器正在变得普遍,但是大多数语言对有效和安全地对其进行编程几乎没有帮助。

我们决定退后一步,考虑随着技术的发展,未来几年哪些主要问题将主导软件工程,以及一种新的语言如何帮助解决这些问题。例如,多核CPU的兴起表明,一种语言应为某种并发性或并行性提供一流的支持。为了使资源管理在大型并发程序中易于处理,需要垃圾回收或至少某种安全的自动内存管理。

这些考虑导致 了一系列讨论,Go引起了一系列讨论,首先是作为一组想法和渴望,然后是一种语言。一个总体目标是,Go可以通过启用工具,自动执行诸如代码格式化之类的平凡任务以及消除在大型代码库上工作的障碍,来为工作中的程序员提供更多帮助。

在Google的Go语言:软件工程服务中的语言设计中 ,可以找到关于Go语言的目标以及如何实现或至少达到这些目标的更广泛的描述 。

该项目的历史如何?

Robert Griesemer,Rob Pike和Ken Thompson于2007年9月21日开始在白板上草拟一种新语言的目标。几天之内,这些目标就已经定下来,成为了做某事的计划以及对它的想法。继续进行兼职工作,同时进行无关的工作。到2008年1月,Ken已开始研究用于探索思想的编译器。它生成C代码作为其输出。到年中,该语言已成为一个全职项目,并且已经定下来足以尝试生产编译器。2008年5月,伊恩·泰勒(Ian Taylor)使用规范草案独立地开始了Go的GCC前端。拉斯·考克斯(Russ Cox)于2008年末加入,并帮助将语言和库从原型转变为现实。

Go于2009年11月10日成为一个公共开源项目。来自社区的无数人贡献了思想,讨论和代码。

现在,全球有数以百万计的Go程序员(专家),而且每天都有更多的程序员。Go的成功远远超出了我们的期望。

地鼠吉祥物的起源是什么?

吉祥物和徽标由RenéeFrench设计 ,后者还设计 了Plan 9兔子Glenda。一个博客帖子 有关的gopher解释它是如何从一个她用于衍生WFMU 几年前的T恤设计。徽标和吉祥物受 知识共享署名3.0 许可的保护。

地鼠有一个 模型表, 说明了他的特征以及如何正确地表现它们。模型表首次 在Renphere于2016年Gophercon的一次 演讲中展示。他是Go地鼠,而不仅仅是任何老地鼠。

语言是Go还是Golang?

该语言称为Go。该“golang”绰号的出现是因为该网站是 golang.org,不go.org,这是不提供给我们。但是,许多人都使用golang名称,它很容易用作标签。例如,该语言的Twitter标记是“ #golang”。不管怎样,该语言的名称只是普通的Go。

旁注:尽管 官方徽标 有两个大写字母,但语言名称写为Go,而不是GO。

您为什么要创建一种新语言?

Go诞生于对我们在Google上所做的工作的现有语言和环境的沮丧。编程变得太困难了,部分语言应归咎于语言的选择。人们必须选择高效的编译,高效的执行或易于编程的方式。这三种语言均无法以相同的主流语言提供。选择使用动态类型化的语言(例如Python和JavaScript)而不是C ++或在较小程度上使用Java的程序员可能会在安全性和效率上放轻松。

我们并不孤单。经过多年的编程语言一片平静之后,Go成为了几种新语言(Rust,Elixir,Swift等)中的第一种,这使编程语言开发再次成为活跃的,几乎是主流的领域。

Go通过尝试将解释型动态类型语言的编程易用性与静态类型编译语言的效率和安全性相结合,解决了这些问题。它还旨在成为现代化的,并支持网络和多核计算。最后,使用Go的目的是要更快:在单台计算机上构建大型可执行文件最多需要几秒钟。为了实现这些目标,需要解决许多语言问题:一个富有表现力但轻巧的字体系统;并发和垃圾回收;严格的依赖规范;等等。使用库或工具无法很好地解决这些问题;需要一种新的语言。

Google上 的文章Go 讨论了Go语言设计背后的背景和动机,并提供了有关此FAQ中提供的许多答案的更多详细信息。

Go的祖先是什么?

Go主要属于C族(基本语法),其中Pascal / Modula / Oberon族(声明,程序包)投入了大量精力,此外,Tony Hoare的CSP启发了一些语言的思想,例如Newsqueak和Limbo(并发)。但是,这是一门全新的语言。在各个方面,都通过考虑程序员的工作方式以及如何使程序设计(至少是我们所做的编程类型)更有效,更有趣的方式来设计该语言。

设计中的指导原则是什么?

在设计Go时,至少在Google来说,Java和C ++是编写服务器的最常用语言。我们认为这些语言需要太多的簿记和重复。一些程序员的反应是转向高效,流畅的语言(如Python),但代价是效率和类型安全。我们认为用一种语言就能具有效率,安全性和流动性。

Go尝试减少单词在两种意义上的打字量。在整个设计过程中,我们一直努力减少混乱和复杂性。没有前向声明,也没有头文件;一切都只声明一次。初始化具有表现力,自动且易于使用。关键字语法简洁明了。foo.Foo* myFoo = new(foo.Foo)可以通过使用:=声明和初始化结构来减少简单类型派生。也许最根本没有类型层次,:类型就是,他们没有宣布他们的关系。这些简化使Go可以表达而又易于理解,而不会牺牲复杂性。

另一个重要原则是保持概念正交。可以针对任何类型实现方法;结构代表数据,而接口代表抽象;等等。正交性使人们更容易理解当事物结合在一起时会发生什么。