Search Posts

分类: APP开发

Linux的层级架构与Rust的主要模块crate总结,值得转发收藏

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标准)。

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

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

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

第一类,Rust语言原语

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

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

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

第二类,alloc crate

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

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

第三类,core crate

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

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

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

  • 为用户程序在多个线程上并发运行的功能在std::thread模块中;
  • 用于处理同步I/O的功能在std::io模块中提供;
  • 针对特定os的模块,主要在std::os模块中实现。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Rust的IO处理模块:

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

Rust的OS特定的功能模块:

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

Rust的时间处理模块:

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

干货总结Rust的应用范围将会爆发,全栈开发者如何看清2023的历史临界点及未来趋势

Rust 诞生已经有 17 年了,最近我考察了将团队的开发技术栈从 Python 生态转到 Rust 生态的可行性。先说结论:99% 可行。

Rust 生态目前的规模

不是 100% 可行,因为 Python 生态的一些名库还未提供 Rust 版本,但请注意到,那些 Python 生态有的功能,Rust 生态里也大部分有了。毕竟 Rust 已经 17 岁了,经过 17 年的积累,Rust 终于快到 “成年” 了。比如 Rust 的线上 Crate 仓库 lib.rs 现有 127219 个包,Python 的 pypi.org 仓库现有 484174 个包(以上统计截至 2023 年 9 月 28 日)、而 Go 语言在 pkg.go.dev 上有超过 170000 个包(截至 2023 年 4 月)。

为什么我决定从 Python 转换到 Rust?如何通过Rust的强大生态工具,提高开发效率和软件质量?

在我的公号里总结分享了 Rust语言解决问题的能力、它能为使用者提高多少效率、最终创造多少价值。

目前(2023 年)正处在 Rust 大规模应用爆发的临界点。大量软件团队正在用 Rust/Go 重写软件。

下面从三个具有代表性的应用实例以及一些 Rust 语言大事件,向读者分享下这个 “Rust 临界点” 的观点。

详情网页链接查看余下内容

c++代码模块通过vcpkg安装时的报错vcpkg distribution does not have a classic mode instance的原因和解决

vcpkg安装模块的命令举例:

vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static

vcpkg命令报错信息:

Computing installation plan…
error: Could not locate a manifest (vcpkg.json) above the current working directory.
This vcpkg distribution does not have a classic mode instance.

问题原因:

执行以上vcpkg install …… 命令之前,必须需要先cd到项目的c++代码根目录。然后执行vcpkg install …… 安装c++项目依赖的库即可。… 查看余下内容

Rust的Crate和module都是模块和包,有什么区别?

在 Rust 中,Crate 和 module 都是组织代码的方式,但它们的概念和作用是不同的。

Crate 和 module 在作用上的区别:

如果用一句话概括,那就是:一个 Crate 是一个完整的编译单元,它可以包含一个或多个 Rust 模块。

一个 Crate 可以被编译成一个二进制文件或者一个库(静态库或动态库),并且可以被其他 Crate 依赖和使用。可以将 Crate 视为一个库或者一个可执行文件的项目。

一个 module 是一个命名空间,它可以包含 Rust 代码的定义和实现,包括常量、函数、结构体、枚举、trait 等等。通过使用 module,我们可以将相关的代码组织在一起,使得代码更易读、更易维护、更易扩展。一个 module 可以被嵌套在另一个 module 中,形成一个层次结构。

在 Rust 中,Crate 和 module 之间有一个非常重要的概念:路径。路径是用来访问 Rust 中的定义和实现的方式。一个路径可以是绝对路径或相对路径。绝对路径是从 Crate 根开始的路径,而相对路径是从当前 module 开始的路径。在 Rust 中,路径的起点通常是一个 Crate,从而实现了代码的组织和封装。

Crate 和 module 在代码中的应用举例:

下面是一个简单的例子,用来说明 Crate 和 module 在代码中的使用方式区别:

// src/main.rs

// 定义一个模块,包含一个函数
mod greeting {
    pub fn say_hello() {
        println!("Hello, world!");
    }
}

fn main() {
    // 调用模块中的函数
    greeting::say_hello();
}

在这个例子中,greeting 是一个 module,它定义了一个函数 say_hello。在 main 函数中,我们通过路径 greeting::say_hello() 来调用这个函数。

除了 module,Rust 还有另一个组织代码的方式:Crate。如果我们希望将 greeting 模块提取成一个单独的 Crate,可以按照如下方式进行:

// src/greeting.rs

// 定义一个模块,包含一个函数
pub mod greeting {
    pub fn say_hello() {
        println!("Hello,
查看余下内容

React的web应用开发从0到1:创建、路由、状态管理、发布


创建React应用:

使用 npm 创建 React Web 应用的命令如下:

  1. 首先,您需要安装 Node.js 和 npm。如果您还没有安装 Node.js 和 npm,请先安装它们。
  2. 打开命令行工具,并进入您想要创建 React Web 应用的目录。
  3. 在命令行中运行以下命令,使用 create-react-app 工具创建 React Web 应用:
    npx create-react-app my-app

    在上面的命令中,`my-app` 是您要创建的应用程序的名称。您可以将其替换为您自己的应用程序名称。

  4. create-react-app 工具将会自动创建一个新的 React Web 应用,并安装所需的依赖包。创建完成后,您可以进入新创建的应用程序目录:
    cd my-app
  5. 在应用程序目录中,您可以使用以下命令启动开发服务器:
    npm start

运行上述命令后,开发服务器将会启动,并在浏览器中打开应用程序。您可以在开发服务器启动后,通过访问 `http://localhost:3000` 来访问应用程序。

现在,您已经成功地创建了一个新的 React Web 应用,并启动了开发服务器。您可以开始编写您的应用程序代码,并使用 `npm start` 命令来预览您的应用程序。


React web应用的目录文件结构

在使用命令创建react web应用后,看到的目录和文件结构是这样的:

React Web 应用的目录文件结构可以根据具体需求进行调整,但通常包含以下文件和目录:

  • src: 存放应用程序的源代码。
    • components: 存放应用程序的组件。
    • pages: 存放应用程序的页面组件。
    • assets: 存放应用程序所需的静态资源,例如图片、字体等。
    • styles: 存放应用程序的样式文件,例如 CSS、Sass、Less 等。
    • utils: 存放应用程序的工具函数和帮助函数。
    • services: 存放应用程序的服务,例如 API 请求等。
    • constants: 存放应用程序的常量,例如枚举值、配置项等。
    • App.js
查看余下内容

对比Javascript和Rust的并发异步机制:Promise与Future

JavaScript 的 Promise 和 Rust 的 Future 都是一种处理异步操作的机制,它们有一些相似的地方:

  1. 异步操作的封装:Promise 和 Future 都可以将异步操作封装成一个对象,并在操作完成后返回结果。在 JavaScript 中,Promise 对象可以用于处理异步操作,而在 Rust 中,Future 对象可以用于处理异步计算和 I/O 操作。

  2. 链式调用:Promise 和 Future 都支持链式调用,可以通过 .then() 或 .map() 等方法将多个异步操作组合起来,达到串行执行的效果。

  3. 错误处理:Promise 和 Future 都支持错误处理机制,可以通过 .catch() 或 .map_err() 等方法捕捉异常并进行处理。

  4. 非阻塞式调用:Promise 和 Future 都是非阻塞式的调用方式,可以避免在等待异步操作完成时阻塞程序的运行。

  5. 并发执行:Promise 和 Future 都支持并发执行多个异步操作,可以通过 Promise.all() 和 Future::join() 等方法将多个异步操作组合起来并行执行。

总体上,Promise 和 Future 都是用于处理异步操作的机制,它们具有一些相似的特点和用法。虽然它们是不同语言中的不同实现,但它们都是为了解决异步编程问题而设计的,可以让开发者更加方便地处理异步操作。… 查看余下内容

理解Electron的new出来的对象的生命周期

  • 问:electron 的 new 出来的对象比如 window = new BrowserWindow(…) 的生命周期也是引用计数方式吗?

  • 答:
    在 Electron 中,BrowserWindow 对象是一个浏览器窗口对象,使用 new BrowserWindow() 可以创建一个新的浏览器窗口。这个窗口对象的生命周期并不是采用引用计数方式的垃圾回收机制,而是由 Electron 的事件循环机制控制的。

具体来说,当创建一个新的 BrowserWindow 对象时,该对象的生命周期会一直持续到窗口关闭为止。在窗口关闭之前,BrowserWindow 对象会注册一系列事件监听器,用于处理窗口的各种生命周期事件,例如窗口关闭事件、窗口最小化事件、窗口失去焦点事件等等。这些事件监听器会在 Electron 的事件循环机制中被调度,以响应窗口的各种生命周期事件。

当窗口关闭时,BrowserWindow 对象会自动从内存中释放,并解除注册的事件监听器。在这个过程中,并不涉及到引用计数方式的垃圾回收机制。

需要注意的是,当一个 BrowserWindow 对象被关闭后,它所包含的资源,例如页面中加载的脚本、样式表、图片等等,可能并不会立即被释放。这些资源可能会被缓存,以提高下一次打开同样页面的速度。如果需要释放这些资源,可以通过一些特定的方法来手动清空缓存。… 查看余下内容

react开发的UI界面代码能在Electron开发的软件中复用吗?

react开发的UI界面代码能在Electron开发的软件中复用吗?

  • 是的,React 开发的应用程序可以在 Electron 中使用。事实上,Electron 的主要目的之一就是让 Web 技术(如 HTML、CSS 和 JavaScript)可以用于构建桌面应用程序。React 是一个流行的 Web 框架,可以用于构建高性能、可重用组件的用户界面。
  • 可以使用 Electron 和 React 来构建基于 Web 技术的桌面应用程序。通常,您可以使用 React 来构建应用程序的用户界面,然后使用 Electron 来将其打包成一个可执行文件。Electron 提供了许多原生 API,可以让您的应用程序访问操作系统级别的功能,如文件系统访问、网络访问、窗口管理等。
  • 如果您已经有一个 React 应用程序,并且希望将其移植到 Electron 中,您需要进行一些修改以适应 Electron 的环境。例如,您需要修改应用程序的入口点,并添加一些 Electron 特定的代码来创建窗口、处理菜单、访问本地文件系统等。但是,由于 React 是一个流行的 Web 框架,您可以很容易地找到许多 Electron 和 React 的集成示例和教程,以帮助您开始构建自己的应用程序。

react和Electron的区别:

Electron 和 React 是两个不同的技术。简要地来说:

  • Electron 是一个开源框架,用于构建跨平台的桌面应用程序,它结合了 Node.js 和 Chromium,使得开发人员可以使用 Web 技术(如 HTML、CSS 和 JavaScript)来构建桌面应用程序。
  • React 是一个开源 JavaScript 库,用于构建用户界面。它允许开发人员使用组件的方式构建复杂的用户界面,并将其声明为可重用的代码块。
    虽然 Electron 和 React 都是使用 JavaScript 技术的,但它们的目的和用途是不同的。Electron 是用于构建桌面应用程序,而 React 则是用于构建 Web 应用程序的用户界面。
    另外,Electron 和 React 的使用方式也有所不同。Electron 主要使用 JavaScript 和 Node.js 来编写应用程序的后端逻辑,同时使用 Web 技术来编写前端用户界面。React 则是专注于用户界面,它可以与多种后端技术(如 Node.js、Java、Ruby、PHP 等)结合使用。
    总之,虽然 Electron 和 React 都是使用 JavaScript 技术的,但它们的目的和使用方式是不同的,开发人员需要根据具体的需求和场景选择合适的技术来构建应用程序。
查看余下内容

Rust的两种类型`Result` 和 `Option`的区别

ResultOption 是 Rust 中两种不同的类型,尽管它们在使用上有一些相似之处。

Option<T> 是 Rust 的一种枚举类型,可以有两个可能的值:Some(T)None。它通常用于表示值的缺失,或者表示计算中可能出现的一些情况,但这些情况不一定是错误。例如,在字符串上调用 parse 方法时,如果字符串不是一个有效的整数,它会返回一个 Result<i32, ParseIntError>,但如果字符串为空,则会返回一个 Option<i32>

Result<T, E> 也是 Rust 的一种枚举类型,可以有两个可能的值:Ok(T)Err(E)。它通常用于表示计算的成功或失败,而计算过程中可能会产生一个错误。例如,fs::read_to_string 函数返回一个 Result<String, std::io::Error>,其中要么是包含文件内容的 Ok(String),要么是表示读取文件时出现的 Err(std::io::Error)

尽管这两种类型都可以用于表示错误的可能性,但它们具有不同的语义,并在不同的上下文中使用。Option 用于表示值的缺失,而 Result 用于表示计算的成功或失败,而计算过程中可能会产生一个错误。… 查看余下内容

前端的 React 和vue对比?React最新版 和vue3 分别用什么语言编程?

React 和 Vue 是两个非常流行的前端框架,它们都具有优秀的设计和实现。然而,哪一个更合理的问题并没有一个简单的答案,因为它们都有其适用的场景和优点。以下是我对它们的设计特点和优点的一些总结:

React 的设计更加注重组件化和简洁性。React 的设计哲学是将用户界面抽象为一个个可重用的组件,这种设计思想使得开发者可以轻松地构建具有复杂交互和状态管理的应用程序。而且,React 的设计非常简洁,它只关注于视图层的更新,将其与应用程序的其余部分分离开来。这使得 React 可以与其他库和框架很好地协作,例如 Redux、MobX 和 React Router。

Vue 的设计更注重整体性和易用性。Vue 的设计哲学是将用户界面的各个部分组合成一个整体,这种设计思想使得开发者可以更加轻松地构建具有复杂逻辑的应用程序。Vue 的 API 设计也非常友好和易用,使得开发者可以快速地构建应用程序。Vue 还提供了许多有用的功能,例如指令、过滤器和混入,使得开发者可以更加轻松地实现复杂的功能。

在实际开发中,React 和 Vue 都有其适用的场景和优点。React 更适合构建大型、复杂的应用程序,因为它的组件化和简洁性使得应用程序的各个部分可以分离开来,易于维护。Vue 更适合构建中小型的应用程序,因为它的整体性和易用性使得开发者可以更加快速地构建应用程序。此外,React 更擅长处理大量的数据和复杂的逻辑,而 Vue 则更擅长处理交互性和动态性更强的场景。

总之,React 和 Vue 都是优秀的前端框架,它们都有其独特的设计和优点。在选择哪一个框架时,应该根据实际项目的需求和开发者的个人喜好来进行选择。


关于React 和vue3使用的编程语言:

React 和 Vue 3 都是用 JavaScript 编程的。

React 是用 JavaScript 编写的,而且它使用了一些最新的 JavaScript 特性,如 ES6 的箭头函数、模板字符串、解构赋值等。此外,React 还支持 TypeScript,这是一种由 Microsoft 开发的 JavaScript 超集,它添加了类型定义和其他高级功能,使得代码更加健壮和易于维护。

Vue 3 也是用 JavaScript 编写的,它使用了许多 ES6 的特性,例如箭头函数、模板字符串、解构赋值、let 和 const 等。此外,Vue 3 还引入了许多新的特性,例如 Composition API 和 TypeScript 支持,这些功能使得开发者可以更加轻松地编写复杂的应用程序。

总之,React 和 Vue 3 都使用 JavaScript 作为编程语言,它们都支持最新的 JavaScript 特性和一些其他高级功能,使得开发者可以更加轻松地编写复杂的应用程序。此外,React 还支持 TypeScript,而 Vue 3 引入了 Composition API 和 TypeScript 支持,这些功能使得开发者可以更加高效地编写代码。… 查看余下内容

下一页 »
加好友请备注:chinaoss
您可以在微信公众号联系我们
我们将24小时内回复。
取消