一个人承受孤独的潜质有多大,他的潜质就有多大

大家好,我是柒八九

前言

可能最近前端的东西分享的多,给大家一种错觉,我们的文章只是偏向前端的。而熟悉我们文章的同学都知道,我们的武器库,其实不仅仅只有前端,我们还有Ruse,并且还有AI

本来想以普通人的身份和大家认识,但是我摊牌了,我不装了。我是一个全能小超人(手动狗头)。

而我们今天就来讲讲Rust的历史、它通常用于什么、为什么开发者如此喜爱它,并且附带一下学习资料和网站,让我们对它有一个更深的了解。

连续第八年,RustStack Overflow的年度开发者调查中再次成为最受欢迎的编程语言。而且,超过80%的开发者表示他们明年仍然想继续使用这种语言,这让人不禁想知道一个不到20出头的后起之秀,如何在宦海沉浮的技术界杀出了一条血路,并且大有睥睨天下的即视感。

从上面的统计中,无论在学习和应用意愿上,Rust遥遥领先while(true){printn!("遥遥领先");}

你能所学到的知识点

  1. 前置知识点
  2. Rust简史
  3. 为什么Rust如此特殊
  4. Rust 擅长的领域
  5. Rust 大受欢迎的原因
  6. 前端为什么要了解Rust
  7. 如何学习Rust

好了,天不早了,干点正事哇。


1. 前置知识点

前置知识点,只是做一个概念的介绍,不会做深度解释。因为,这些概念在下面文章中会有出现,为了让行文更加的顺畅,所以将本该在文内的概念解释放到前面来。如果大家对这些概念熟悉,可以直接忽略

语言类型分类

俗话说,物以类聚,人以群分,人是一种社会动物,语言也逃脱不了,世俗的桎梏,它也有属于自己的分类。

我们分别从编程范式/动态静态类型/强弱类型分别描述下它们的特点和常见的开发语言。

分类方式开发语言特点和说明
按编程范式分类
命令式语言(Imperative LanguagesC, C++通过指令和状态改变描述计算过程,使用变量、循环和条件语句。
函数式语言(Functional LanguagesHaskell, Lisp强调函数作为基本构建块,避免状态和可变性,通常采用不可变数据。
面向对象语言(Object-Oriented LanguagesJava, C#将数据和操作数据的方法封装在对象中,强调对象之间的交互。
声明式语言(Declarative LanguagesSQL描述问题的解决方案,而不是指定如何实现它们。
按动态静态类型分类
动态类型语言(Dynamic TypingPython, JavaScript在运行时进行类型检查,变量类型可以在程序执行过程中改变。
静态类型语言(Static TypingC, C++, Java在编译时进行类型检查,变量类型在编写代码时需要明确定义。
按强弱类型分类
强类型语言(Strongly TypedC++, Java有严格的隐式类型转换规则,不允许不安全的类型操作,提高代码安全性。
弱类型语言(Weakly TypedJavaScript,Perl, PHP允许更灵活的类型转换和操作,但可能导致潜在的类型错误,开发时需谨慎。

Rust可以根据上面提到的分类方式进行如下分类:

  1. 按编程范式分类:

    • 命令式语言(Imperative Languages): Rust可以被归类为命令式语言,因为它支持可变变量和通过指令来改变程序状态。
    • 函数式语言(Functional Languages): Rust也具有一些函数式编程特性,如闭包高阶函数,但它通常被视为一种多范式(multi-paradigm)语言,因为它允许开发者在不同的编程范式之间切换。
  2. 按动态静态类型分类:

    • 静态类型语言(Static Typing): Rust是一种静态类型语言,类型检查在编译时进行,变量的类型必须在编写代码时明确定义,这有助于提高代码的安全性和性能。
  3. 按强弱类型分类:

    • 强类型语言(Strongly Typed): Rust是一种强类型语言,它有严格的类型系统,不允许不安全的类型操作,以确保内存安全和类型安全。
综上所述,Rust是一种静态类型的、强类型的、多范式编程语言,可用于通用编程以及具有系统级性能和内存安全性要求的各种应用领域。这使得它成为一种强大的编程语言,尤其适用于系统级编程和安全关键应用的开发。

2. Rust简史

fn main(){
  printn!("前端柒八九");
}

我们今天的主人公(Rust)最初旨在作为CC++的更安全替代品,Rust是一种系统编程语言,因其注重安全性性能生产力获得了开发者的青睐。Rust是一种静态类型语言,得益于变量表达式的类型在编译时检查,这有助于增强内存安全性和错误检测,从而产生更可靠的构建。

2006年,软件开发者Graydon HoareMozilla工作期间,开始了Rust作为一个个人项目。根据他在麻省理工技术评论的一次采访,Rust的灵感来自于Hoare公寓楼里一个坏掉的电梯。电梯操作系统的软件崩溃了,Hoare意识到这类问题通常源于程序如何使用内存的问题

通常,这些类型设备的软件是用CC++编写的,但这些语言需要大量的内存管理,可能导致系统崩溃的错误。因此,Hoare着手研究如何创建一种既紧凑又无内存错误的编程语言

后来,他向一位经理展示了这个项目,这导致了Mozilla2009年资助该项目,作为将该语言纳入实验性浏览器引擎开发的长期努力的一部分。2010年Mozilla Research正式宣布了Rust项目,并将源代码作为一个开源项目向公众发布。经过数年的开发,Rust达到了稳定和成熟的状态,2015年5月发布了Rust 1.0版本。这一里程碑标志着Rust已准备好投入生产,并为开发者提供了一个构建基础。

Hoare说,Rust被命名为一种特别顽强(robust)的真菌。

1.0版本发布以来,Rust在受欢迎程度和采用率方面迅速增长,顶级应用程序(如Microsoft Windows)利用Rust重写核心库。除了技术巨头之外,Rust还拥有一个充满活力的开发者社区,被称为Rustaceans,致力于使Rust的体验变得积极而协作。

对于国内的用户来讲,Rust社区也是一个不错的选择。

并且,也是一个学习的不二之选。

根据SlashData最近的一项调查,2023年全球大约有280万Rust开发者,这一数字在过去两年里几乎翻了三倍。有着众多积极的论坛、文档以及支持各种技能水平的开发者的社区,或许不足为奇,Rust一直在最受欢迎的编程语言榜单上居首。

上面的开发者数字,由于一些不可明言的理由,可能还存在偏差,虽然国内的Rust属于萌芽阶段,但是有些公司已经在开始布局了,在这方面走在最前言的就是字节跳动


3. 为什么Rust如此特殊

那么,是什么使Rust对开发者如此有吸引力呢?

简而言之,Rust解决了开发者常常与CC++相关的一些让人深恶痛绝的内存管理问题,但这并不是它唯一在众多语言中脱颖而出的能力。

Rust并不是要百分百地解决内存安全问题,而是消除过去五十年导致系统编程语言中 70% 安全 Bug 中的内存安全问题:

  • 引用空指针。
  • 使用未初始化内存。
  • 释放后使用,即悬垂指针。
  • 缓冲区溢出,比如数组越界。
  • 非法释放已释放过或未分配的内存。
  • 并发场景下的数据竞争。

GitHub的一名员工软件工程师,Jason Orendorff,与他人合著了一本关于使用Rust编程的书,他对这门语言的评价如下:

"对我来说,Rust的伟大之处在于它既快速又可靠," 根据Orendorff的说法,"它让我编写能在16核上运行的多头程序,并保持它们可读、易维护和免崩溃。它还让我编写非常低级别的需要控制内存布局的算法,并引入一个让HTTPS请求变得超级简单的crate。正是这些特性的结合使Rust如此独特。"

此外,以下是一些Rust备受喜爱的特点和功能:

  1. 并发性(Concurrency)。Rust通过其所有权系统(ownership system)和借用模型(borrowing model)提供了内置支持并发编程

    • 所有权系统强制执行数据访问的严格规则
    • 借用模型通过允许受控的同时访问来防止数据竞态(data races),确保多个线程可以在共享数据上工作,而不引入与内存相关的问题。
  2. 无垃圾回收。与一些编程语言不同,Rust不使用垃圾回收。相反,它的所有权借用规则管理内存,使开发者能够精确控制内存分配和释放,以实现高效的资源管理。
  3. Cargo包管理器Rust内置的包管理器Cargo简化了项目管理、依赖跟踪和构建,有助于实现高效和有组织的开发工作流程。

    • RustCargo生态系统非常强大,包含很多高质量的开源包-哈希序列化多线程数据结构压缩等等。
    • Rust实际上是第一个拥有标准包管理器的系统编程语言,因此Rust生态系统非常健壮。
  4. 零成本抽象。这个特性允许开发者编写高级代码抽象和功能,而不引入运行时性能开销
  5. 模式匹配(Pattern Matching)。这个强大的语言特性允许开发者以一种清晰可读的方式,简洁有效地匹配复杂的数据结构以提取和处理不同情况或场景。

    // 模式匹配示例
    fn main() {
        let value = 5;
    
        match value {
            1 => println!("匹配到1"),  // 如果value等于1,执行此分支
            2 | 3 => println!("匹配到2或3"),  // 如果value等于2或3,执行此分支
            4..=6 => println!("匹配到4到6之间的值"),  // 如果value在4到6的范围内,执行此分支
            _ => println!("默认分支"),  // 如果以上条件都不满足,执行默认分支
        }
    
        let fruit = "apple";
    
        match fruit {
            "apple" => println!("这是苹果"),
            "banana" => println!("这是香蕉"),
            _ => println!("这是其他水果"),
        }
    }
    
  6. 类型推断(Type Inference)。这个特性允许Rust的编译器在你编码时基于上下文自动检测表达式

    // 类型推断示例
    fn main() {
        let number = 42;  // Rust会自动推断number的类型为整数
    
        let text = "Hello, Rust!";  // Rust会自动推断text的类型为字符串切片(&str)
    
        let float_number = 3.14;  // Rust会自动推断float_number的类型为浮点数
    
        println!("number的类型:{}", number);
        println!("text的类型:{}", text);
        println!("float_number的类型:{}", float_number);
    }

有关更多关于Rust相关介绍和基础知识的讲解,可以看我们之前写的Rust笔记系列 (看过的人都说好)


4. Rust 擅长的领域

由于Rust具有对硬件和内存的直接访问权限,因此非常适用于嵌入式系统裸机开发。而且,由于它是一种通用目的的语言,因此还可以用于各种应用。

1. 使用Rust构建高性能的后端系统

高性能的后端系统需要满足高速处理低延迟响应对资源有效利用,而Rust性能、线程安全性和错误处理使其成为开发这些类型系统的不二选择

全球最大的同性交友网站-Github就使用Rust构建了一些系统。

例如,github的代码搜索功能的后端是用Rust编写的。

2. 使用Rust开发操作系统

Rust最初是为了解决一个操作系统问题而创建的(还记得电梯问题吗?)——因此,显而易见,它经常用于构建操作系统、内核、设备驱动程序或其他需要对内存和性能进行精细控制的底层组件

Redox是一个用Rust编写的类Unix操作系统,它的最重要特性之一就是安全性。

Fuchsia也是用Rust编写的。它是一个现代的开源操作系统,它简洁、安全、可更新且性能出色。它提供了核心的操作系统功能,如系统资源管理、驱动程序框架和软件抽象层。Fuchsia是一个通用的操作系统,旨在支持多样化的硬件和软件生态系统。

3. Rust用于与操作系统相关的代码

Rust也非常适合编写与操作系统密切交互的任务的代码。例如,GitHubCodespaces团队正在利用Rust来提高GitHub Codespaces中虚拟磁盘启动速度并优化Azure存储的利用率。Coursera还在其在线评分系统中使用Rust,因为它在Docker内运行,需要一种编译为机器代码且具有最小依赖性的语言。

4. 使用Rust进行Web开发

越来越多的人开始在Web开发中使用Rust,尤其是在服务器端。Rust异步编程模型(async programming model)和性能特性使其非常适用于构建高性能的Web服务器、API和后端服务。此外,Rust还涌现出了许多Web框架,如Rocket等,可以帮助开发人员轻松编写安全的Web应用程序

在Web开发中,其实不仅仅只有后端服务,其实还有针对前端资源打包的工具,例如SWC

还有国内字节跳动,研发的Rspack

5. 使用Rust进行加密和区块链开发

Rust的速度、内存管理和安全性都有助于其在加密货币和区块链技术中的应用。例如,Polkadot旨在实现多个区块链之间的互操作性和交互,以安全和去中心化的方式共享信息和资产,它利用Rust构建其核心基础设施。Polkadot的运行时逻辑,用于管理区块链的行为和规则,也是用Rust编写的。

查看这个仓库awesome-blockchain-rust,可以了解了解关于使用Rust构建区块链应用程序的一些有用组件。

6. 使用Rust构建命令行工具

Rust编译为高效的机器代码以及其表达能力强的语法使其成为构建命令行工具和应用程序的强大选择。此外,编写命令行应用程序是学习和熟悉Rust的好方法。

我们后面,会带大家做一个使用Rust构建自己的命令行应用程序!

7. 将Rust用于嵌入式系统和物联网(IoT)开发

Rust最小运行时(minimal runtime)和对内存布局的控制使其非常适用于开发嵌入式系统和物联网(IoT)设备。它可以防止与内存相关的错误,管理并发性,并生成小型、高效的二进制文件,满足了物联网在安全性、实时性和效率方面的需求。


5. Rust 大受欢迎的原因

虽然Rust的用户基础远不及JavaPython那么庞大,但Rust在各种受欢迎榜单中仍然与大型编程语言竞争。

但为什么开发者们对Rust如此情有独钟呢?那就是这门语言的速度安全性性能

此外,Rust正在不断发展和壮大,涌现出新的框架、工具和资源。我们可以在awesome-rust存储库中跟踪对该语言的贡献,该存储库包含了大量的Rust代码和资源。

Last but not least,选择Rust不仅仅是采用一门编程语言,它代表了一种以创新为优先,同时又不妥协于稳定性和安全性核心原则的思维方式。


前端为什么要了解Rust

通过上文,我们从不同的角度,讲述了Rust的各种特性和应用场景,无论从各个方面来看,Rust正在进入大众的视野,无论是国外的大厂还是一些小公司都开始跃跃欲试了。而由于国内相较于国外的技术滞后性,我们总是处于追随角度

但是,由于语言的特性,它势必会在属于自己的领域和方向上,被国人所接受和应用。 它在国内的火爆,只不过是时间问题。 俗话说,站在风口上,猪都会飞。作为,国内的开发者,我们现在就应该未雨绸缪,不要等到机会来了的时候,由于自己的没准备好,而错失更多的机会。

尤其,在当今的前端领域,大家似乎将发力点,用在了拼各种框架的API的熟练程度上。要不然,就是用各种Hack方式,想法设法的将自己的代码,看起来更有封装性。

归根结底,大家都是在应用层发力,但是它的上限受制于框架和浏览器为你提供的API。我们就像一个带着镣铐在翩翩起舞的女子,无论你姿色如何惊艳四座,舞姿如何超凡脱俗,你总是在现有的框架中,循规蹈矩的在行动。

作为一个有理想的前端(一切向钱看),再35岁魔怔的加持下,我们肯定是希望我们能延长我们的职业生涯和提升自己被榨取的剩余价值。那么,现在有一个大势所趋的技术方向和选择,我们何不在多给自己一个机会呢。

Rust在前端领域,也是大有所为的。我这里简单举几个现有的落地方向和应用场景。(后期,我们会有对应的文章介绍和分析)

  • Rust天然对WebAssembly的支持,可以说是首选语言,好多国外的重应用,原本只能在客户端运行的程序,现在也被移植到浏览器中运行,例如AutoCAD/Photoshop等,而这些都依赖WebAssembly技术
  • 在前端打包工具的应用,就像前面我们说的,SWC/Rspack都是基于Rust
  • 对于安全性有强烈诉求的应用方向,Rust也是它的一席之地
  • ...还有很多

我们就像上面这个图一样,马里奥只有在吃了花朵之后,才神挡杀神,佛挡杀佛,所向披靡的。

但愿,这就是以后的我们的。


如何学习Rust

首选就不得不提,《Rust 程序设计语言》这是一本由浅入深,讲述Rust的书籍,然后Ruster被亲切地称为“圣经”。

有些人不喜欢纸质书,希望利用碎片时间来学习,可以看线上的书籍

如果想看总结和分析的内容,那么Rust学习笔记你必不可少。

在了解的基本概念后,还可以通过各种例子来巩固所学的知识点。

还有,在写了一些Rust代码,又不想启动项目,我们还可以利用Rust Playground进行验证。

其实,还有很多论坛,这里大家就自行解决了。


后记

分享是一种态度

参考资料:

  1. stackoverflow
  2. 各个语言的从业者

全文完,既然看到这里了,如果觉得不错,随手点个赞和“在看”吧。


前端柒八九
18 声望3 粉丝