标签 泛型 下的文章

Go语言之父谈Go编程语言与环境

本文永久链接 – https://tonybai.com/2021/10/06/the-go-programming-language-and-environment

2021年中旬,Go语言联合创始人Rob Pike应邀在线出席由UNSW Computing(悉尼新南威尔士大学计算机)组织主办的John Lions Distinguished Lectures,会上Rob Pike以Go之父身份讲述了究竟是什么将Go语言塑造成今天的这个样子以及进入Go生态系统的其他一些事物。

Rob Pike关于Go的观点总是高屋建瓴的,从这个talk中我们可以了解Go语言演化的来龙去脉,这对于我们理解Go、理解Go演化方向、理解Go生态会有较大帮助。由于仅有视频资料,这里将视频中的slide截图按顺序贴在这里,并配以slide中没有但talk中有的一些rob pike的重要观点,供大家参考。

Rob Pike:

  • (谦虚的说)Go还不能算是主流语言,但Go在全世界范围的影响力与发展远超当初预期。
  • 我们知道:在众多编程语言中,Go可能不是那种interesting的语言。在当时,Go甚至不是一种有技术优势的语言。我们并没有试图推动编程语言理论或设计甚至实践的进步。我们对此并不介意,因为这不是我们的目标。
  • 不知何故,这种语言已经成功地接管了云世界。它是主导docker、kubernetes以及基本上云原生计算基金会中的所有东西的开发语言,当然也包括这之外的其他很多项目。
  • 多年前,有人预测Go是云计算基础设施语言,但现在这已经成为现实。

那么问题来了:一种本质上无人喜欢的语言是如何最终变得如此重要了呢?究竟发生了什么?

Rob Pike给出答案:

  • 一门编程语言的成功取决于很多东西,而不仅仅是语言本身。
  • Go团队从一开始就知道这一点,于是他们不再局限于创造一门新编程语言,而是将目标定为创造一种编写软件的更好的方法上。因此这门新编程语言将被用于处理当时所用语言所解决不了的诸多问题:包括上面slide中列举的诸多问题。
  • 虽然编程语言本身可以解决上面的一些问题,但仅语言本身还远不够。

Rob Pike:

  • 我们遇到的一个最大的问题就是scale,并且scale拥有多个维度(数轴axes),包括concurrency、engineering、dependencies。

Rob Pike:
- 这就是我们几个第一次碰面设计一门新编程语言时讨论的话题。

Rob Pike:
- 这就是Go实现的一个生产就绪的Web server的代码。
- 下面探讨fmt.Fprintf的第一个参数的类型,它很特殊,它是一个io.Writer接口类型。

Rob Pike:
- Go代码中充满了这种仅有一两个方法甚至是零个方法的接口类型,这些构成了Go文化之一。
- 我们相信,接口不应该为你所构建的整个世界预先定义,而应该在程序开发过程中有机地产生。让编译器解决一个接口是否好的问题,实际上是比强迫程序员优先解决这些问题更有效的进行软件演化的方式。(because we believe that interfaces should not be predefined for the entire world you are building. but instead should arise organically through program development. and having the compiler work out whether an interface is good or not is an actually more effective way to grow software than forcing the programmers to work it all out a priori)。

Rob Pike:
- 不同于其他编程语言,这些整型不能混合在一起运算(译注:需显式转型)。

Rob Pike:

  • 我们的想法是,从概念上讲,处理并行性和并发性的开销在Go中是非常轻的。这是该语言的一个重要卖点。

Rob Pike:

  • 一旦你把channel/select这些和goroutines结合起来,你就可以完全简单地、正交地把它们放在过程语言(procedure language)之上。并使并发变得简单,让那些以前我承认有时害怕它的人可以使用。

Rob Pike:

  • 我们做了很多努力来建立一套非常好的核心库,允许你做一些事情,如网络、密码学、文本处理、格式化的IO,我们建立了一套核心库,建立在这些简单的接口的想法上,并使用这些接口和其他我们可以使用的机制,如并发性和内存安全属性等等。我们建立了基础库,这样你就可以写一个程序,只使用核心库,这将起到有效的作用,它也可以在生产中启动,并能够处理成千上万并发进行的负载。我们已经看到运行在内部启动的数百万个goroutine的二进制文件,因为它们是轻量级的,它们可以扩展。

Rob Pike:

  • 也许Go的成功最重要的部分是这种兼容性承诺(Go1兼容性承诺)。
  • 更重要的是,我们向用户承诺,如果你的代码今天能用,十年后也能用,而且确实如此。这种对用户社区的承诺是Go应用的一个巨大特点。实际上,在曲线上有一个膝盖型突起,你可以看到采用率的上升,工业界现在可以开始依赖它,因为他们知道,如果他们投资于它,它就会工作。书的作者也可以写书,他们知道十年后书中内容仍然有意义,这是我们故事的一个主要部分。

Rob Pike:

  • 因此,所有这些元素都有一个主题,这个主题就是,如果你想发展一种语言或一个系统,特别是在开源世界中,你必须让别人容易进来。这并不仅仅意味着接受每一个他人提出的pull request,这更意味着创建一个系统,在这个系统中,大家可以很容易使用一种语言,比如:易于解析,易于用支持它的工具进行分析。可以单独工作的库,但被设计成可以相互协作以建立更大的系统。用于高质量工具开发的包,易于理解的开发,高速执行,简单的部署,易于移植。一个模块系统让每个人都能舒适地分享他们的代码,也包括一种鼓励人们共同成长的文化。

Rob Pike:

  • 我们已经建立起这个社区,在社区中大家一起构建了一个软件开发环境并且乐趣多多,这个环境不仅是由语言所培育的,更多是因为上面这些更为重要的因素。

Rob Pike:

  • Go是关于软件开发的。它不仅仅是关于编程。我认为这就是为什么它能做得那么好的原因。

  • 泛型会不会改变编写Go代码的方式?

Rob Pike:

我们没有从一开始就把它们放进去,因为我们不明白我们怎么会对它感到不舒服,所以不是我们决定不放它们,而是我们不确定如果我们从一个具有参数化多态性的语言开始,如何在所有这些其他方面实现我们想实现的目标。

我相信这仍然是事实。

我相信关于库的工作方式和互连的工作方式等等的很多事情都会有非常不同的味道。 如果它是一种多态的语言,我不确定它会有多好。

经过Ian Taylor等人十多年的努力,我们现在有了一个设计,我想说的是,我们不是真正的我,但团队有了一个参数化多态性模型的设计,感觉它与语言的其他部分相匹配。我很想知道它是否会打破这个局面,它可能会打破一切,因为程序员会开始考虑用这种方式写代码,我很想知道它的效果。

  • Rob Pike的其他观点
    • 我认为声明变量的方式有些多。
    • 经过我们三人(Rob Pike, Ken Thompson, Robert)达成一致的Go特性已经足够多,足够好了。
    • 我们很努力地寻找channel与network一起工作的方式,但我们失败了!

“Gopher部落”知识星球正式转正(从试运营星球变成了正式星球)!“gopher部落”旨在打造一个精品Go学习和进阶社群!高品质首发Go技术文章,“三天”首发阅读权,每年两期Go语言发展现状分析,每天提前1小时阅读到新鲜的Gopher日报,网课、技术专栏、图书内容前瞻,六小时内必答保证等满足你关于Go语言生态的所有需求!部落目前虽小,但持续力很强。在2021年上半年,部落将策划两个专题系列分享,并且是部落独享哦:

  • Go技术书籍的书摘和读书体会系列
  • Go与eBPF系列

欢迎大家加入!

Go技术专栏“改善Go语⾔编程质量的50个有效实践”正在慕课网火热热销中!本专栏主要满足广大gopher关于Go语言进阶的需求,围绕如何写出地道且高质量Go代码给出50条有效实践建议,上线后收到一致好评!欢迎大家订
阅!

img{512x368}

我的网课“Kubernetes实战:高可用集群搭建、配置、运维与应用”在慕课网热卖中,欢迎小伙伴们订阅学习!

img{512x368}

我爱发短信:企业级短信平台定制开发专家 https://tonybai.com/。smspush : 可部署在企业内部的定制化短信平台,三网覆盖,不惧大并发接入,可定制扩展; 短信内容你来定,不再受约束, 接口丰富,支持长短信,签名可选。2020年4月8日,中国三大电信运营商联合发布《5G消息白皮书》,51短信平台也会全新升级到“51商用消息平台”,全面支持5G RCS消息。

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻)归档仓库 – https://github.com/bigwhite/gopherdaily

我的联系方式:

  • 微博:https://weibo.com/bigwhite20xx
  • 微信公众号:iamtonybai
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • “Gopher部落”知识星球:https://public.zsxq.com/groups/51284458844544

微信赞赏:
img{512x368}

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

Brooks、Wirth和Go[译]

本文永久链接 – https://tonybai.com/2021/08/25/brooks-wirth-and-go

本文翻译自瑞典程序员Fredrik Holmqvist的博客文章《Brooks, Wirth and Go》

现在是1975年。

程序员们带着FORTRAN代码回来了,不过使用的是穿孔卡片的形式。


图:记录代码的穿孔卡片(图片来自punchcardreader.com,译者加)

这些穿孔卡片被小心翼翼的送进大型机,它们被输入、读取、编译、链接并由计算机执行。当得到“文件名称规格错误”这个结果时,时间已经过去了两个多星期了。在这个阶段,很多人参与了代码的编写与制作并消耗了几周的工作时间。

与此同时,另一个用SmalltalkInterlisp编程的工程师正直接在一个控制台中编写并运行他的实现。几秒钟后,他得到了程序的运行结果。接下来,他就在那里修复了错误并完成了这个任务。

上述这两种方法在周转时间上的差异是四个数量级

忘了“10倍程序员(10X programmer)”吧,“10000倍程序员(10000X programmer)”怎么样?

由于现代计算机的硬件已经发展到比将人类送上月球的计算机快几千亿倍,这些类型的差异已经急剧缩小了。那些即使是简单计算也要等待几个小时出结果的分时的日子已经一去不复返了。即使是手机也足够强大,可以完成人类在20世纪的所有计算结果。


图:摩尔定律(图片来自wikipedia,译者加)

但软件却可能没有这么大的进步。可以说,自ALGOL 68以来,在解决软件危机方面没有发生什么。也许更糟糕的是,我们(集体)从那个时代的巨头那里学到的东西太少。我想举例说明这些巨头中的两位,以及他们可以教给我们的经验。

弗雷德里克·布鲁克斯

1964年,IBM宣布了其迄今为止最雄心勃勃的项目:IBM 360。该项目由Gene Amdahl负责设计,弗雷德里克·布鲁克斯(Frederick Brooks)负责管理。

这是世界上第一台真正的可编程大型计算机,开启了计算机可以被重新编程以适应新问题的概念,而不是被更新的模型所取代。该系统结构引入了许多我们今天仍在使用的标准,如8位字节、32位字(word)等

也许更有趣的是这个项目本身。该项目……比最初想象的要昂贵得多。它将预算提高了200倍:从2500万美元提高到50亿美元。要知道,当时作为美国国家核武器研究的曼哈顿项目的预算才仅为20亿美元。

该项目遇到了你能想到的所有开发和管理问题。

多年以后,布鲁克斯决定,回答”为什么软件项目经常出错”这个问题的最好方法是把他的经验和IBM的教训写成一本书。那本书就是现在传说中的《人月神话》


图:《人月神话》(译者加)

这也许是关于软件管理的最佳读物之一。其中有一篇文章是“没有银弹(No Silver Bullet)”,它指出:

无论是技术还是管理技术,都没有任何一种可以在十年内保证在生产力、可靠性和简单性方面有哪怕一个数量级的改进。

鉴于与穿孔卡的前辈相比,现代程序员可以很快纠正他们的错误,布鲁克斯认为,剩下的大部分复杂性是问题本身,而意外的复杂性大部分已经解决了。

这并不是说自60年代以来生产力没有提高,实际上恰恰相反。来看看下面的例子:

  • 自由/开放源码软件
  • 高速硬件
  • 通用计算机
  • 高性能编译器
  • 全球互联网(Internet)

它们一起将我们的整体生产力推到了一个很高的水平。它们也重新引入了许多意外的复杂性,而这些复杂性是我们的前辈们在最初就很努力地消除的。(稍后会有更多关于这方面的内容)

“现在的程序员已经不像以前那样高产了”

这种将偶然的复杂性降低到最低限度的概念是我们很多问题的关键,没有比尼克劳斯·沃思(Niklaus Wirth)更能体现这一原则的了。

尼克劳斯·沃思

在创造了PASCALMODULAMODULA-2之后,沃思开始着手开发OBERON系列语言,以便在他的Ceres工作站上建立他自己的Oberon操作系统

如果说沃思在他的职业生涯中完成了很多伟大的事情,那就太轻描淡写了,而上面给出的例子只是他成就的一小部分

他设法通过遵循一套原则来执行所有这些想法,这些原则可以总结如下:

你必须完全理解你的想法,才能完全实现它。

Oberon语言的出现是出于降低编程语言,特别是针对Modula的复杂性的考虑。这一努力产生了一种非常简洁的语言。Oberon的范围,它的功能和结构的数量,甚至比Pascal小。然而,它的功能却大大增强了。

这个人的结论是:Pascal太复杂了

利用他发现的新力量,他在自己的硬件上从头开始建立了他的操作系统,这个操作系统仅有12K行源码,占用200K字节的空间资源。我们可以对比一下,Mac OSX拥有86M行源码,占用3GB的空间,并且是由世界上最富有的公司之一建立的。现在,也许OSX比Oberon的功能更完整,但肯定不是40000倍的关系。一路走来,有些东西已经失去了。

布鲁克斯的“没有银弹”的概念和沃思的哲学在这里有交集:

你不能通过增加你的语言的复杂性来减少你的问题的复杂性。

你的语言的表面积越大(译:我理解指语言的设计目标越多),就会有越多的风沙(译注:风沙指语言的特性)来掩盖其本质。在某些时候,指针已经向前移动到循环开始的地方,因为旧的子集变成了新的,循环再次开始。

这种“少即是多”的概念让我想起了另一位巨人的一句同样性质的话:

有两种构建软件设计的方法:一种是使其简单到明显没有缺陷,另一种是使其复杂到没有明显缺陷 – Tony Hoare

在理论上拒绝沃思的前提,必然会导致走向Hoare观点中的第二个方法。

‘在Objective-C和Swift之间的某个地方,你最终得到了一个来自过去的框架,一个来自未来的框架,以及现在的一个纠结的混乱。

走这条路的代价是什么?

束缚我们的石头

培训

  • 学习一个新的操作系统,与你的技术绑定。
  • 学习一个新的IDE,与你的技术绑定。
  • 学习一个新的框架来取代已经工作的框架。
  • 学习使用你的旧语言的新版本。

你所有的旧技能都得益于你多年的经验,就像特修斯之船一样(译注:特修斯之船是一个思想实验,它提出了一个问题:一个已经更换了所有组件的物体从根本上是否与原物体是相同的),到了一个时刻,这些技能所占的比重越来越小。经验应该增加价值,而不是减少它。

仓鼠轮(译注:循环往复的重复工作)

  • 以前工作的项目在更新后被破坏。
  • 你所依赖的其他人以前工作的项目在更新后也会被破坏。
  • 筛选几页的文档和StackOverflow的帖子,这些都不再有意义了。
  • 不得不跟上新闻,以便预测你的下一个待命的头痛问题。

被迫修复由你的项目、公司、客户或大陆以外的外部力量产生的问题,对任何人都没有帮助,尤其是对你。

难道就没有人为年轻人着想吗?

  • 这个行业是非常难学的。
  • 除了厨房里的水槽,什么都有,这不是一个介绍新人的好方法。
  • 花在学习工具上的时间本可以用来了解这个项目或学习一般的技能以延续到下一个项目。

你所碰到的大多数后辈都被压倒了,感到困惑,并有压力要跟上不断变化的皇帝的衣服层。

裁缝被封为所有顾问的守护神,因为尽管他榨取了大量的费用,但他始终无法说服他的客户,让他们恍然大悟,他们的衣服没有皇帝。- Tony Hoare

除了老人和可能的内核开发者之外,整个行业往往没有意识到,忽视或拒绝这一前提。相反,轮子的每一次旋转都会到达它开始的地方,并承诺会有新的开始。

幸运的是,也有例外的情况。这里就是其中之一。

Go

这种奇妙的、著名的”停留在70年代”的语言,满足了所有必要的条件,避免了大部分(如果不是全部)的问题,并从古老的语言中获得了灵感,但又颇具现代感。

  • 一蹴而就

    • 单一安装,没有许可证/注册/祭祀仪式。
    • 可以在任何东西上运行,即使那东西是一台布满灰尘的旧笔记本电脑。
    • 语言(相对而言)容易掌握。
    • 直接的过程化编程(procedural programming),不给自己贴上FP(函数式)和OOP(面向对象)标签。
  • 没有IDE的耦合。

    • 不需要购买许可证,工程师不会被过期的许可证困扰。
    • 不需要重新培训工程师将文本输入文本文件。如果他们有几十年使用一个编辑器的经验,他们就可以使用它。
    • 没有解决方案文件或复杂的需要IDE才能工作的构建系统。
  • 即时编译为静态二进制文件。

    • 不需要在项目编译时坐着什么都不做(译注:编译速度快,几乎无需等待)。
    • 不需要为了把一种文本编译成另一种文本而把自己的所有内核旋转到100%。
    • 通过运行一个单一的可执行文件进行部署。
  • 如果十年前能用,现在也能用。

    • 停留在70年代意味着自喇叭裤以来就没有突破性的变化。
    • 阳光下的一切都包含在自带电池的标准库中。
    • 每一行代码都是可检查的,没有闭源库。

它是由Ken Thompson、Rob Pike和Robert Griesemer(沃思的一个学生)设计的。该语言的入门书籍是由Brian Kernighan撰写的。很明显,这种语言是C语言的精神继承者。


图:Go程序设计语言(图片来自gopl.io,译者加)

距离我第一次使用Go已经两年了,我想不出有什么比它更适合通用的软件开发了,尤其是在尊重自己和他人的时间方面。它是为数不多的可以让我自由编程的语言之一,而不需要向互联网咨询,也不需要向在这方面有更多经验的人催促那些应该是不言自明的事情。它没有那么多的魔力,没有那么多的隐藏,这就产生了更多更大的清晰性。没有惊喜,”它只是能工作“。

这并不是说每个人都有这种感觉,恰恰相反。批评是很多的。关于Go缺失功能的讨论(比如,缺乏泛型)已经持续了很多年(到现在已经超过十年了),我只能假设在不可预见的未来还会继续下去。

在这期间,我敦促你去试试这门语言。也许你会喜欢上它。


“Gopher部落”知识星球正式转正(从试运营星球变成了正式星球)!“gopher部落”旨在打造一个精品Go学习和进阶社群!高品质首发Go技术文章,“三天”首发阅读权,每年两期Go语言发展现状分析,每天提前1小时阅读到新鲜的Gopher日报,网课、技术专栏、图书内容前瞻,六小时内必答保证等满足你关于Go语言生态的所有需求!部落目前虽小,但持续力很强。在2021年上半年,部落将策划两个专题系列分享,并且是部落独享哦:

  • Go技术书籍的书摘和读书体会系列
  • Go与eBPF系列

欢迎大家加入!

Go技术专栏“改善Go语⾔编程质量的50个有效实践”正在慕课网火热热销中!本专栏主要满足广大gopher关于Go语言进阶的需求,围绕如何写出地道且高质量Go代码给出50条有效实践建议,上线后收到一致好评!欢迎大家订
阅!

img{512x368}

我的网课“Kubernetes实战:高可用集群搭建、配置、运维与应用”在慕课网热卖中,欢迎小伙伴们订阅学习!

img{512x368}

我爱发短信:企业级短信平台定制开发专家 https://tonybai.com/。smspush : 可部署在企业内部的定制化短信平台,三网覆盖,不惧大并发接入,可定制扩展; 短信内容你来定,不再受约束, 接口丰富,支持长短信,签名可选。2020年4月8日,中国三大电信运营商联合发布《5G消息白皮书》,51短信平台也会全新升级到“51商用消息平台”,全面支持5G RCS消息。

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格5$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻)归档仓库 – https://github.com/bigwhite/gopherdaily

我的联系方式:

  • 微博:https://weibo.com/bigwhite20xx
  • 微信公众号:iamtonybai
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • “Gopher部落”知识星球:https://public.zsxq.com/groups/51284458844544

微信赞赏:
img{512x368}

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats