Rust的标准库的功能划分

电子说

1.3w人已加入

描述

Linux的层级架构

每个操作系统都有一个内核,内核封装了底层硬件设备管理、内存管理、网络数据协议转化和收发传输、文件系统读写等。从这个图可以看到,内核将系统硬件与应用程序进程连接起来,隐藏了上层下层交互的一些细节,各司其职。

模块

这些分层包括:

用户空间程序

编译器

终端

防火墙

系统调用的跨平台API(特定于平台的系统调用包装API)

Rust标准库

libc(或等效的API)

kernel,操作系统的核心模块

系统资源

内存

文件系统

网络

硬件和其他设备(包括键盘、鼠标、监视器、磁盘驱动器)

Rust的标准库的功能划分

而Rust标准库,很好的利用了操作系统内核提供的API。

Rust标准库是Rust程序进入Linux操作系统内核函数的主要接口,它在内部使用libc(在Windows系统使用其他等效的库)来调用内核提供的系统调用。

从Rust程序中发起系统调用,以实现管理和操作各种系统资源(如图)。

模块

libc(或其变体)为类UNIX操作系统上的系统调用提供了一个包装器,如Linux内核实现了POSIX标准指定的数百个POSIX API(对于Windows,系统调用有等效的API,也实现了POSIX标准[1])。

作为标准库,Rust标准库是跨平台的,Rust标准库的系统调用的细节是从Rust开发人员那里抽象出来的。Rust也支持不依赖于标准库的运行方式(no_std 方式),Rust直接操控底层硬件(如应用在嵌入式系统开发场景),此时Rust就做了操作系统本身的工作。

对于大部分软件开发工程师而言,他们用Rust主要开发应用层软件,也就是运行在用户空间的程序。它们基于标准库编写,实现各种业务功能。应用层的软件并非所有模块和函数都涉及到系统调用(例如一些用于操作字符串和处理错误的函数,就无需调用系统调用)。

Rust标准库包括几大领域的模块,包括四大类:

第一类,Rust语言原语

即Rust Language Primitives:Rust 语言的基本元素或基本类型(如下图)。

如有符号整数、布尔值、浮点数、字符、字符串、数组、元组、切片。这些由Rust编译器负责实现。

模块

Rust标准包括原语,并在它们之上构建。

第二类,alloc crate

与堆分配值的内存分配相关的类型、函数和特征。

包括集合(Vec、String等集合)、智能指针类型(Box)、引用计数指针(Rc)和原子引用计数指针(Arc))。

第三类,core crate

作为Rust标准库的基础。充当Rust语言与标准库之间的链接,提供在Rust原语之上实现的类型、特征、常量和函数,并为所有Rust代码提供基础构建块,它是跨平台的,没有任何指向操作系统或其他外部依赖的链接。由于较少直接用到core crate,所以本文不做过多介绍。

第四类,模块(标准库的其他crate)

是标准库的一部分,模块crate包括针对并发、I/O,文件系统、网络、异步I/O、错误处理等功能,以及与特定操作系统相关的函数,Rust的官网对std有专门的文档[2]。例如

为用户程序在多个线程上并发运行的功能在std::thread模块中;

用于处理同步I/O的功能在std::io模块中提供;

针对特定os的模块,主要在std::os模块中实现。

下图展示了Rust标准库各个领域功能涉及到的具体std模块(如std::io、std::os等)

模块

以下着重对第四类的主要 crate 做一介绍,并附上文档地址

Rust的并发控制相关模块 conurrency:

 

模块名 说明
std::env 模块[3] 包含与环境变量交互的功能,包括读取、设置和删除环境变量。
std::sync 模块[4] 提供了用于实现线程安全共享状态的同步原语,如互斥锁(Mutex)、原子操作(Atomic)和条件变量(Condvar)。
std::thread 模块[5] 提供了创建和管理线程的功能,包括线程的创建、 join、spawn 和同步。
std::process 模块[6] 提供了与操作系统进程交互的功能,包括运行外部命令、启动新进程以及与进程进行通信。

 

Rust的内存管理相关模块 memory management:

 

模块名 说明
std::alloc 模块[7] 提供了内存分配器的功能,包括分配和释放动态内存。
std::convert 模块[8] 提供了用于不同类型之间转换的工具函数。
std::ptr 模块[9] 提供了对指针的操作和转换功能,包括对裸指针的操作。
std::borrow 模块[10] 提供了用于管理借用的功能,包括&和&mut借用运算符的实现。
std::default 模块[11] 提供了默认 trait 实现的功能,用于为不提供具体实现的类型提供默认行为。
std::rc 模块[12] 提供了引用计数(Reference Counting)的功能,用于实现线程安全的共享内存。
std::cell 模块[13] 提供了可变性的 Cell 和 RefCell 类型,用于在多线程环境下安全地共享可变状态。
std::mem 模块[14] 提供了与内存相关的功能,包括内存布局、内存对齐和内存操作。
std::clone 模块[15] 提供了用于实现克隆(Clone) trait 的功能,用于复制和克隆复杂的数据结构。
std::pin 模块[16] 提供了 Pin 类型,用于固定借用的生命周期,以避免悬垂指针和数据竞争问题。

 

Rust的文件系统操作相关模块 File system:

 

模块名 说明
std::fs 模块[17] 提供了与文件系统操作相关的功能,包括文件和目录的创建、读取、写入和删除等操作。
std::path 模块[18] 提供了与文件路径相关的功能,包括路径的解析、构造和操作。

 

Rust的数据处理相关模块 data processing:

 

模块名 说明
std::ascii 模块[19] 提供了与 ASCII 码相关的功能,包括对 ASCII 字符的操作和转换。
std::fmt 模块[20] 提供了格式化输出的功能,包括对各种数据类型的格式化和打印。
std::num 模块[21] 提供了对数字类型的抽象和操作,包括整数、浮点数和复数等。
std::cmp 模块[22] 提供了用于比较和排序值的工具,包括比较运算符的实现和排序函数。
std::hash 模块[23] 提供了用于计算哈希值的功能,包括对各种数据类型的哈希函数实现。
std::ops 模块[24] 提供了一些基本的运算符和操作符的实现,包括数学运算符、比较运算符和逻辑运算符等。
std::iter 模块[25] 提供了迭代器(Iterator)的功能,包括创建和操作迭代器的方法,以及一些常见的迭代器类型。

 

Rust的错误处理相关模块 Error handling:

 

模块名 说明
std::error 模块[26] 提供了错误处理的功能,包括定义错误类型和处理错误的方法。
std::panic 模块[27] 提供了恐慌(Panic)机制,用于处理不可恢复的错误情况。
std::option 模块[28] 提供了 Option 类型,用于表示可能存在或不存在的值,用于处理可能出现空值的情况。
std::result 模块[29] 提供了 Result 类型,用于表示成功或失败的情况,通常用于处理可能出现错误的函数返回值。

 

Rust的编译处理相关模块 compiler:

 

模块名 说明
std::hint 模块[30] 提供了一些用于编译器提示的宏,用于影响编译器的优化行为。
std::primitive 模块[31] 提供了一些基本的类型和函数,用于处理数字、字符和布尔值等基本数据类型。
std::prelude 模块[32] 包含了一些基本的函数和宏,这些函数和宏在 Rust 标准库中被广泛使用,并且在每个 Rust 程序中自动导入。

 

Rust的跨语言调用相关模块:FFI

 

模块名 说明
std::ffi 模块[33] 提供了与外部函数接口(Foreign Function Interface,FFI)相关的功能,用于与其他语言或库进行交互。

 

Rust的网络处理功能模块 Networking:

 

模块名 说明
std::net 模块[34] 提供了与网络编程相关的功能,包括网络协议、套接字(Socket)和网络地址等。

 

Rust的IO处理模块:

 

模块名 说明
std::io 模块[35] 提供了与输入输出相关的功能,包括文件操作、缓冲、读写数据等。

 

Rust的OS特定的功能模块:

 

模块名 说明
std::os 模块[36] 提供了与操作系统相关的功能,包括文件系统操作、进程管理和系统信息等。

 

Rust的时间处理模块:

 

模块名 说明
std::time 模块[37] 提供了与时间和日期相关的功能,包括时间的表示、解析、转换和计算等。

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分