Go的成功预示着Rust的成功

如果您喜欢我的写作,请考虑访问我的博客,网址为:https://blog.cerebralab.com,如今,我仅在此处发布新文章。

从鸟瞰的角度出发,很难理解它的巨大成功。

从理论上讲,Go是一种非常糟糕的语言,即使与C ++或Ada等旧语言相比也是如此。

它缺少很多编译时间检查和编译时间逻辑。 它缺少破坏逻辑会导致大量样板和运行时错误。 它的接口不是很富有表现力。 它具有一流的公民数据结构(切片和地图),无法使用该语言本身将其复制为库。 在许多不需要可变性的情况下,它将强制可变性强加给用户。 它带有一个伪依赖管理器,它缺少针对单独项目的独立版本控制。 与大多数其他流行的系统编程语言,即C,C ++,Ada,Fortran和Rust相比,它的运行速度非常慢。

这就是我现在可以想到并轻松为您布置的东西。 一旦深入研究Go,您会发现它做出了一些固有的有缺陷的设计选择,这是一种针对1980年而非2020年构建的语言。

尽管如此,使用Go的任何人都可以告诉您,这是一种非常好的语言。 我算是其中的一员,如果我被困在只有3种编程语言的孤岛上,我希望Go成为其中的一种。

尽管存在所有缺陷,但它仍允许您编写性能良好的相对无错误的代码。 通常,向Go程序添加依赖项比向C ++程序添加依赖项要平滑得多。

为什么Go很好

这使我处于非常奇怪的位置。 一方面,我可以谈论几个小时的Go语言。 另一方面,Go显然是一种非常好的语言。

为了弄清楚为什么这样做是对的,我们需要回到这些陈词滥调的类推之一,即作为工具的语言和作为问题解决者的程序员。

现代世界中的许多问题似乎都围绕着有效的网络通信,围绕安全使用所有硬件线程以及较容易的开发和部署。

最后,良好的开放源代码库一直存在一种稳步发展的趋势,渗入我们的生活,其中大多数简洁明了,简单易用,适合于一个目的。 大多数Node或Python项目都具有数百个这样的依赖关系,而大多数C和C ++代码库则不到十二个。 C和C ++缺乏任何标准化的程序包管理,因此库往往是无所不包的(参见QT和Boost),因为添加新的依赖项非常耗时。

开源库是现代开发人员生活中的重要组成部分,但是所有流行的系统编程语言都缺乏程序包管理。

从这个角度来看,Go具有一些核心功能,这些功能是如此惊人,以至于超过了所有不利因素。

  1. Go实用程序使您可以轻松下载和使用软件包。
  2. 静态编译使在各种环境之间移植代码和建立开发环境变得非常容易。
  3. 本机异步I / O机制使您可以轻松编写高性能网络代码。
  4. 内置的通道允许[g | c]例程之间的易于实现且相对安全的数据传输。
  5. 标准库和包生态系统包含开发人员可能需要的大多数库。
  6. 对于几乎所有用例而言,它“足够快”。 似乎在Python和Node这样的易于使用的单线程语言与C ++和C这样的古老而快速的庞然大物之间达到了一个甜蜜点。

或者,说白了。 Go是为开放源代码库,大规模并行性和网络时代设计的一种语言。

其他所有流行语言都缺少这三个类别之一。

Go剩下的所有问题都来自三个设计选择:

  • 它是垃圾收集的,而不是为其所有资源进行编译时定义的生存期。 这会损害性能,删除有用的概念(例如移动语义和析构函数),并使编译时错误检查的功能降低。
  • 除了少数(本机)类型,它缺乏不变性。
  • 它缺少泛型

修复这些问题,Go便成为未来的语言。 但是,由于各种问题,有些与先前的设计决策有关,有些与设计者的意见有关,因此这些问题大部分仍未解决。

例如,泛型很可能会走向2.0,但是当前的实现与其他功能(例如,接口)重叠,并且设法使用烦人且缺少功能(例如,不能用作返回类型)。

或者,我们可以找到一种语言“选中”所有正确的框,但不会因为那些糟糕的设计决策而受苦。

输入Rust

Rust恰好是一种可以克服Go不能做的所有事情的语言。

由于其隐含的移动语义和借位检查器,因此就资源管理而言,它最终成为最安全,最快和最容易推理的语言。 在编译时捕获大量错误。

模板和特征的组合使它的编译时编程能力接近C ++,并且通常更好。

最后,Cargo是目前最好的包裹管理系统之一。 通过内置版本控制和每个项目的完全分离,可以轻松访问大量有用的库。

换句话说,Rust的成绩最高,而Go则完全失败。

但是,Go会怎样呢?

  1. go getgo mod与Cargo非常匹配。
  2. 默认情况下, cargo build使用静态编译路线,与go build一样。
  3. 这是症结所在,Rust还没有本机异步I / O机制。 但是所说的机制即将来临。 它不会像goroutines提供的那样无缝,但是它将与Node和Python中使用的更知名的语法相似。
  4. Rust不仅对线程之间的通道具有本机支持,而且还具有强大的编译时线程安全检查机制。 这意味着无论您选择使用哪种数据共享机制,都不会存在并发错误的风险
  5. Rust的标准库与go一样丰富,除了(再次)缺少一些异步网络功能。 此时,Rust的软件包生态系统在很多方面都与Go的生态系统相匹配。 尽管Rust是更年轻的语言。
  6. 最后,在性能方面,Rust在各种情况下都比C和C ++慢一点。 但是其设计选择意味着这只是“暂时”的挫折。 Go始终缺乏编译时逻辑和基于GC的设计,这给他们带来了沉重的负担。 因此,Go和Rust之间已经存在的巨大性能差距只会变得更大。

围棋效果

一旦异步/等待被合并到Rust的稳定版本中,我想我们可以说成一种叫做Rust的高级语言,实际上,它可以通过每种方式进入。

我认为人们不会完全意识到测试,调试和崩溃的数量,Rust可以将他们从上推到生产之前一直保存下来。

与Rust和Rust相关的概念进入编程世界的次数越多,对其语法和概念的了解就越多。 进入壁垒越低。

我认为Rust已度过其生命中的“关键”时期,它已被广泛采用,成为编程阶段的支柱。 此外,与几乎所有其他编程语言并排比较时,它几乎是防弹的。 在大多数情况下,这是比其他语言更好的语言。

但是惯性不容小视,Rust广泛采用的最大障碍是说服开发人员进行转换。

在这里,我认为Go的人气飙升的原因将适用于Rust。 语言越来越接近甜蜜点。

希望使用适合“现代”编程风格的语言的C&C ++开发人员,将能够取悦他们。

同时,对于希望从脚本语言切换为系统编程语言的用户,这将是最佳选择,既可以确保他们的安全性和性能,又可以使他们仍然具有程序包管理和熟悉的语法。