程序员又秃了:谷歌 Go 语言将在未来消灭 Java 和 Python?

“Go 将成为未来的服务器语言。” - Tobias Lütke, Shopify

在过去几年中,新的编程语言有所增加:Go 或 GoLang。 没有什么能让开发人员疯狂而不是新的编程语言,对吗? 所以,我开始学习 4 到 5 个月前的 Go,在这里,我将告诉你为什么你也应该学习这门新语言。我要解释现阶段的计算机硬件 - 软件以及为什么我们需要像 Go 这样的新语言? 因为如果没有任何问题,那么我们不需要解决方案吧?

null

硬件限制:

摩尔定律凉凉了。

英特尔于 2004 年推出了第一款具有 3.0GHz 时钟速度的奔腾 4 处理器。 今天,我的 Mackbook Pro 2016 的时钟速度为 2.9GHz。 因此,差不多十年,原始处理能力没有太大的提升。 您可以在下图中看到增加处理能力与时间的比较。

那么,对于上述问题的解决方案,制造商开始向处理器添加越来越多的内核。如今我们有四核和八核 CPU 可用。

我们还介绍了超线程。为处理器添加了更多缓存以提高性能。

null

但上述解决方案也有其自身的局限性。我们无法向处理器添加越来越多的缓存以提高性能,因为缓存具有物理限制:缓存越大,获得的速度越慢。为处理器添加更多核心也有其成本。而且,这无法无限扩展。这些多核处理器可以同时运行多个线程,从而为图像带来并发性。

因此,如果我们不能依赖硬件改进,唯一的出路就是提高性能的软件。但遗憾的是,现代编程语言效率不高。

Go 有 goroutines !!

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

null

但是,大多数现代编程语言(如 Java,Python 等)都来自 90 年代的单线程环境。 大多数编程语言都支持多线程。 但真正的问题是并发执行,线程锁定,竞争条件和死锁。 这些事情使得很难在这些语言上创建多线程应用程序。

例如,在 Java 中创建新线程不是内存有效的。 由于每个线程消耗大约 1MB 的内存堆大小,并且最终如果你开始旋转数千个线程,它们将对堆施加巨大压力并导致由于内存不足而导致关闭。 此外,如果要在两个或多个线程之间进行通信,则非常困难。

另一方面,Go 于 2009 年发布,当时多核处理器已经上市。 这就是为什么 Go 是在保持并发性的基础上构建的。 Go 有 goroutines 而不是线程。 它们从堆中消耗了大约 2KB 的内存。 因此,您可以随时旋转数百万个 goroutine。

其他好处是:

Goroutines 具有可增长的分段堆栈。 这意味着他们只在需要时才会使用更多内存。

Goroutines 的启动时间比线程快。

Goroutines 带有内置的原语,可以在它们之间(通道)安全地进行通信。

Goroutines 允许您在共享数据结构时避免使用互斥锁。

此外,goroutines 和 OS 线程没有 1:1 映射。 单个 goroutine 可以在多个线程上运行。 Goroutines 被多路复用到少量的 OS 线程中。

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

与其他现代高级语言(如 Java / Python)相比,使用 C,C ++ 的最大好处是它们的性能。 因为 C / C ++ 是编译的而不是解释的。

处理器理解二进制文件。 通常,在编译项目时使用 Java 或其他基于 JVM 的语言构建应用程序时,它会将人类可读代码编译为字节代码,JVM 或在底层操作系统之上运行的其他虚拟机可以理解这些代码。 执行时,VM 会解释这些字节码并将其转换为处理器可以理解的二进制文件。

null

而在另一方面,C / C ++ 不会在 VM 上执行,并且从执行周期中删除一步并提高性能。 它直接将人类可读代码编译为二进制文件。

但是,在这些语言中释放和分配变量是一个巨大的痛苦。 虽然大多数编程语言使用垃圾收集器或引用计数算法处理对象分配和删除。

Go 带来了世界上最好的一面。 像 C / C ++ 这样的低级语言,Go 是编译语言。 这意味着性能几乎接近较低级别的语言。 它还使用垃圾收集来分配和删除对象。 所以,不再有 malloc()和 free()语句! 凉!!!

用 Go 编写的代码易于维护

我告诉你一件事。 Go 没有像其他语言那样疯狂的编程语法。它的语法非常整洁。

谷歌 Go 的设计者在创建语言时就考虑到了这一点。由于谷歌拥有非常庞大的代码库,成千上万的开发人员正在开发相同的代码库,因此对于其他开发人员来说代码应该很容易理解,而代码的一段代码应该对代码的另一部分产生最小的副作用。这将使代码易于维护且易于修改。

null

以上更改使 Go 与其他语言有很大不同,它使 Go 中的编程与其他语言不同。 你可能不喜欢上面的一些观点。 但是,如果没有上述功能,您就无法对应用程序进行编码。 您所要做的就是再写 2-3 行。 但从积极的方面来说,它将使您的代码更清晰,并为您的代码增加更多清晰度。

Go 由 Google 支持作为后盾

我知道这不是直接的技术优势。 但是,Go 是由 Google 设计和支持的。 谷歌拥有世界上最大的云基础设施之一,并且规模庞大。 Go 由 Google 设计,旨在解决支持可扩展性和有效性的问题。 这些是您在创建自己的服务器时将面临的相同问题。

null