为什么你需要学 Go?

微信搜索【吴亲强的深夜食堂】公众号,分享一下奇奇怪怪的设计,关注我,获取更多学习资料

这是一篇译文,原文地址在[99]。这篇文章虽然写于2017年,今天依然值得一看。

Go 将是未来的服务端语言。 --- Tobias Lütke, Shopify(注:Tobias Lütke 是 Shopify 创始人)

在过去的几年中,有一门崛起的语言:Go 或者 GoLang。没有什么比一门新编程语言更能让开发者兴奋了,对不对?因此,我大概 4 、5 个月之前就开始学 Go 了。接下来,我将告诉你,为什么你需要去学习这门新语言。

我并不打算教你如何写「Hello World!!」。网上有很多教程会告诉你。我主要想阐述当今软硬件发展的现状以及为什么我们需要学习像 Go 这样的新兴语言?如果没有任何问题,我们也不需要解决方案,对吧?

 

硬件的局限性

摩尔定律正在失效。

英特尔于 2004 年发布了第一款具有 3.0GHz 时钟速率的 Pentium 4 处理器。如今,我的 Mackbook Pro 2016  的时钟速率是 2.9GHz。因此,在过去的十年间, CPU 的处理能力没有太大的发展。

你可以从下图中看到处理能力的增长和时间的关系。

图片

 

可以看出看到,在过去十年间,单线程的性能和处理器的速率保持稳定。如果你认为增加更多晶体管的数量是解决问题的一种方法,那么你错了。这是因为在微观尺度上,量子特性开始显现(如:量子隧道穿越效应),这就导致放置更多晶体管代价也会更大(为什么[1]),并且每美元增加晶体管的数量也在下降。

所以,为解决上述问题:

  • 制造商开始向处理器添加更多的内核。如今,我们有四核和八核 CPU 可用。

  • 我们还引入了超线程技术。

  • 为处理器添加更多缓存以提高性能。

但是以上解决方案也存在局限性。我们无法通过对处理器添加更多的缓存来提高其性能,因为缓存本身具有物理特性限制:缓存越大,速度越慢。对应的,向处理器添加更多的内核一样有其成本。而且,这也不能无限扩展。这些多核处理器同时执行多个线程,也带来了并发性。我们稍后再讨论这个问题。

因此,如果我们不能依赖于硬件去改进,剩下的出路就是从更高效的软件来提升性能,但遗憾的是,现代编程语言都不是那么高效。

「现代处理器就像一辆有氮气加速系统的直线竞速竞速车,他们在四分之一英里直线加速赛表现卓越。但是不幸的是现代编程语言却像蒙特卡洛的 F1 赛道,迂回曲折。」 --- David Ungar

 

Go 拥有 goroutine !!

如上所述,硬件制造商正在向处理器添加更多的内核以提高性能 。所有的数据中心都运行在这些处理器上,我们预计在接下来的几年,内核的数量将会增加。更重要的是, 如今的应用程序都是使用多个微服务来维持数据库连接、消息队列和缓存。因此,我们开发的软件和编程语言应该更容易的支持并发,并且能随着内核数量的增加而可伸缩。

但是, 大多数的现代编程语言(如 Java,Python等)诞生于上世纪 90 年代的单线程环境。虽然大多数的编程语言支持多线程,但是真正的问题是并发执行、线程锁、竞争条件和死锁。这些问题导致使用这些编程语言创建多线程应用程序相当困难。

举例来说,在 Java 中创建新线程会消耗大量内存。因为每个线程大约会消耗 1 MB 的堆内存,当你运行上千个线程,它们将对堆内存造成极大的压力,最终可能会因内存不足而宕机。此外,如果你想让两个以上的线程之间互相通信,也是非常困难的。

另一方面,早在 Go 发布之初(2009 年),就已经存在多核处理器了。这也是为什么 Go 是考虑在并发的基础上构建的。Go 使用 goroutine 来代替线程。每个 goroutine 大概消耗 2KB 的内存。因此,在任意时刻都可以随时启动百万个 goroutine 。

图片

Goroutine 如何工作?[2]

另外,还有如下优点:

  • Goroutine 拥有有可增长的分段堆栈。这意味着它们仅在需要时才使用更多的内存。

  • Goroutine 比线程启动的更快。

  • Goroutine 拥有内置原语,以便他们在(channel)之间安全的进行通信。

  • Goroutine 允许你在使用共享资源时,避免使用互斥锁。

  • 此外,goroutine 和 OS 线程不是 1:1 的映射 。单个 goroutine 可以在多个线程上运行。Goroutine 也能被复用到少量的 OS 线程中。

推荐去看 Rob Pike's 的演讲: 并发不是并行[3] ,加深理解。

以上这些点,能让 Go 像 Java,C 和 C++ 一样拥有强大的并发处理能力,同时又能像 Erlang 一样优雅的执行代码。

图片

 Go 可以兼顾:易于编写并发和高效管理并发。


Go 直接运行在底层硬件上。

C , C++ 优于其他现代高级语言(如 Java / Python)最大原因是它们的性能。因为 C/C++ 是编译型语言而不是解释型语言。

处理器能理解二进制文件。通常来说,当编译一个 Java 或其它基于 JVM 语言构建的应用程序时,是将人类可读的代码编译为字节代码, 这可以被 JVM 或其它运行在底层操作系统之上的虚拟机所理解。当执行的时候, 虚拟机解释这些字节码并将它们转换为能被处理器理解的二进制文件。

图片

基于虚拟机语言的执行步骤。

 

 C/C++ 并不在虚拟机上执行,省去了这一步从而提升了性能。C/C++ 是直接将人类可读的代码编译成二进制文件。

图片

但是,使用这些 C/C++ 语言,释放和分配变量是一件很痛苦的事。而其他大部分语言都可以使用垃圾收集器和引用计数的算法来处理对象分配和回收。

Go 两者都能满足。它和 C/C++ 等语言一样,是编译型语言。这意味着它的性能几乎和低级别语言一样强悍。同时,Go 也具备垃圾回收机制。因此,不需要使用 malloc () 和 free () 之类的语句了!!!这酷毙了!!!


Go 编写的代码易于维护

Go 并没有像其他语言那样有各种复杂的语法,它的语法非常简洁。

Go 语言的缔造者在创建之初就考虑到这一点。由于 Google 拥有海量的代码库,成千上万的开发者都使用着相同的代码库,因此代码理应让其他开发者能更好的理解,一段代码的修改对另一段代码副作用应该保持最小,这样才能使代码更加易于维护和修改。

Go 舍弃了现代面向对象语言的一些特性。

  • 没有类。所有代码都被划分到包(package)中。Go 只有结构体而不是类。

  • 不支持继承。这就使得代码易于修改。在其他语言例如 Java/Python ,如果类 ABC 继承了类 XYZ ,当你改动类 XYZ, 就会对继承了 XYZ 的其他子类产生影响。通过移除继承,Go 使得代码变得易懂 (查看一段代码时不必去追父类)

  • 没有构造方法。

  • 没有注解。

  • 没有泛型。

  • 没有异常。

上述的这些改变使得 Go 和其他语言的编程风格截然不同。你可能不太喜欢。但是,并不是说没有上述这些特性,就没法为应用程序编码了。你要做的就是多写几行代码。从好的方面看,它将使你的代码更加清晰。

图片

代码的可读性 vs 执行效率。

 

如上所示, Go 执行效率直逼 C/C++,同时像 Ruby, Python 之类的语言一样保持语法的简洁。

与 Swift 等这些新的语言不一样,Go 的语法非常稳定。自 2012 年发布以来,保持不变并且向后兼容。

Go 背后是 Google。

  • 我知道这并非是一个很直接的技术优势。但 Go 是由 Google 设计并支持的。Google 是全球最大的云基础架构商之一,其规模庞大。Go 由 Google 设计,旨在解决其可扩展性和效率问题。这些都是在我们创建自己的服务器时需要去面对的问题。

  • 更重要的一点, Go 同样也被一些诸如 Adobe、BBC、IBM、 Intel 、 Medium [4] 这类大公司使用。

 

结语

  • 尽管 Go 和其他面向对象型语言非常不同,但是 Go 拥有 C/C++ 一样的高性能,像 Java 一样高效的并发处理以及 Python/Perl 一样有趣的编码乐趣。

  • 如果你没有学习 Go 的计划,我仍旧会告诉你,硬件的限制会给我们带来压力,软件开发者应该编写超高效的代码。开发者应该理解硬件并尽可能地优化他们的程序。优化过的程序可以运行在更廉价或者更慢的机器上 (例如 IOT 设备), 并且整体上对用户体验会产生更好的影响。

参考文献

  • GoLang 或未来开发者 [5]

  • 用 Go 编写下一代服务器 [6]

  • 并发不是并行 由 Rob Pike 创作[7]

  • 为什么是 Go?[8]

附录

[99]

原文连接: 

https://medium.com/@kevalpatel2106/why-should-you-learn-go-f607681fad65[1]

为什么?: https://www.quora.com/What-is-Quantum-Tunneling-Limit-How-does-it-limit-the-size-of-a-transistor

 

[2]

 

goroutine 是如何工作: http://golangtutorials.blogspot.in/2011/06/goroutines.html

[3] 

并发不是并行: https://blog.golang.org/concurrency-is-not-parallelism

[4]

go大企业使用名单:https://github.com/golang/go/wiki/GoUsers

[5]

 Golang或未来开发者 hhttps://medium.com/@edoardo849

[6]

用 Go 编写下一代服务器: https://www.youtube.com/watch?v=5bYO60-qYOI

[7]

并发不是并行: https://vimeo.com/49718712[8]

为什么是 Go?: https://nathany.com/why-go/

 

如果文章对你有所帮助,点赞、转发留言都是一种支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>