在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
几年前兴起了一门新的编程语言: Go,或者说 Golang 。没有什么能比一门新的编程语言更能让工程师感到兴奋了。所以我从四五个月前开始学习 Go ,并在此告诉你你为何也需要学习这门新语言。 我不会教你怎么写个 “Hello World” ,因为网上有太多文章能让你学了。我要讲的是当前的计算机软硬件情况以及我们为什么需要像 Go 这样的语言。毕竟没有问题就不会需要解决方案,对吧? 硬件限制摩尔定律正在失效。 英特尔 2004 年发布了 3.0GHz 的奔腾4处理器。现在,我的 Mackbook Pro 2016 的 CPU 是2.9GHz 的。所以在最近的 10 年中,纯处理器性能并没有得到多大的提升。看看下面的处理性能-时间对照图表。 从上面的图表可以看到差不多最近十年的单线程性能和处理器的频率都没有再提升。如果你认为增加更多的晶体管就能解决问题,那你可就错了。原因有:在微观的角度上,量子方面的影响开始显现(比如隧道效应),即放越多晶体管实际损失会越大;更实际的角度上讲,晶体管数量越多,每花一块钱能增加的晶体管数也就越少。 因此为了解决上面的问题,
但是上面的解决方法也都有它们本身的限制。我们不能通过增加越来越多的处理器缓存来提高性能,因为缓存本身就有其物理上的局限:缓存越大,去读缓存的速度就越慢。增加更多的核也会产生一些代价,也就不能无限地增加核地数量。多核处理器可以同时运行多个线程因此会带来需要处理多并发的场景,我们之后会讨论这个问题。 所以如果我们不能依赖硬件提升,就只能期望更有效率的软件来提升性能了。但是很遗憾,现代编程语言不那么有效率。 Go 的 goroutines如上面的讨论,硬件制造商正增加越来越多的处理器核来提升性能。所有的数据中心都运行在这种处理器上,我们可以预料在未来几年核数还会提升。另外,今天的应用程序会使用多种维持数据库连接、消息队列和维护缓存的微型服务。因此我们所开发的软件和编程语言应当很容易地支持并发,并且要具有随着核数的增加而扩展的特性。 但是大多数现代编程语言(比如 Java 、 Python 之类的)都诞生于上世纪90年代那个只有单线程的世界。虽然大多数这样的编程语言支持多线程,但是真正的问题是并行计算、线程锁、竟态条件和死锁。这些东西令使用这些语言来创建多线程应用变得很困难。 举个栗子,在 Java 中创建一个新线程挺浪费内存的。每个线程都要消耗大约 1MB 的堆空间,并且如果同时运行上千个线程,堆空间会承受巨大的压力以至于内存溢出导致宕机。还有如果你想进行两进程或多进程间通信是十分困难的。 另一方面, Go 发布于 2009 年,那时多核处理器已经很流行了。这也是为什么 Go 以对并发编程有良好支持为己任。Go 提供的“线程”不是操作系统级别的线程,而是由 Go 在此基础上实现的 goroutines 。一个 goroutine 只会消耗大约 2KB 的堆空间。所以你当然可以在任何时候挥舞上百万个 goroutine 。 还有其它好处:
上述所有的优点让 Go 能够像 Java 、C 和 C++ 那样强有力地处理并发,并同时能像 Erlang 那样将并发计算的代码编写得直白又优雅。 Go 可以直接在底层硬件上运行使用 C 和 C++ 相较像 Java、Python 这种现代高级编程语言最大的优势就是性能。因为 C/C++ 是直接被编译成机器码而不是通过解释器被执行。 处理器能够读懂机器码。通常当你使用 Java 或其他基于 JVM 的语言来构建应用时,你开始编译,只是将人类可读的代码编译成 JVM 或其他同样运行在操作系统上的虚拟机可以理解的字节码罢了。执行的过程便是由 VM 来解释这些字节码,将它们转换为处理器可以理解的机器码。 在 C/C++ 这边,它们不需要在虚拟机里执行,即在执行周期中去掉了一步从而提高了性能。它们直接从人类可读的代码被编译为二进制。 但是在这两种语言中释放和分配变量(译者注:原文为 freeing and allocating variable)又是很头疼的事。与此同时大多数编程语言会使用垃圾回收或引用计数算法来处理对象的分配和移除。 Go 就厉害啦,上面这俩优点都有。如相对更低级的语言 C/C++那样,Go 也是个编译语言。也就是说 Go 的性能是十分接近它们的。同时 Go 也有垃圾回收来处理对象的分配和移除。所以就没有像 malloc() 和 free() 这种语句啦,超酷对不对。 用 Go 写的代码很容易维护Go 没有其它语言那样复杂的语法。它拥有非常优雅干净的语法。 在 Google 工作的 Go 的设计者们在设计这门语言之初就想到了这一点。因为 Google 拥有非常庞大的代码库,会有上千个开发者工作在同一个代码库中,代码对其他开发者应当简洁易懂,一个部分的代码对另一个部分的代码造成的影响应当尽量小。这将使代码易于维护和修改。 Go 有意地省去了许多现代面向对象语言拥有的特性。
上述革新令 Go 非常与众不同,同样,写起来也会感觉很不一样。你可能会不太喜欢上面所说的各种“没有”,但这并不意味着你做开发时离了它们就不行。你只要去写两三行代码就知道了。从积极的一面来看,这将使你的代码更清晰和干净。 上面的图表显示出 Go 是效率最接近 C/C++ 的语言,同时它的语法像 Ruby、Python 那样简单。它对人类和处理器来说是双赢的选择。 不像其它新语言比如 Swift,Go 的语法规则非常稳定。它从 2012 年发布 1.0 版本后语法就没变过。所以可以向后兼容。 Go 的爸爸是 Google
总结
|
请发表评论