Rune,一个Rust的可嵌入的支持aysnc的动态语言
Rune
是一个 Rust 可以嵌入的动态语言. 使用 Rust 编写, 基于 Runestick
VM. 你可以认为他是 Rust 中的 Luna,但是语法是类 Rust 的.
具有以下特性:
- 非常干净的 Rust 集成
- 内存安全的(通过引用计数)
- 模板字符串
?
opearator- Pattern matching
- Structs 和 enums, 支持 associated data和funcitons
- 动态的
vectors
,objects
,tuples
和内置serde
支持. - First-class 的
async
支持. - Generators
- Dynamic instance functions
- Stack isolation between function calls.
- Stack-based C FFI, like Lua's (TBD)
The Rune Programing Language
: https://rune-rs.github.io/rune/foreword.html
Rune github
: https://github.com/rune-rs/rune
vopono 项目回顾
vopono 是文章作者自己的第一个有用的 Rust 项目. vopono 是一个linux 的 VPN 工具, 可以让不同的程序在临时的 network namespace 上启动, 以便每个程序都使用各自独立的 VPN 连接,而不影响系统上的其他程序.
作者从 项目背景, Rust带来的好处, 困难点, 目前存在的问题 这几方面来回顾这个项目的开发,这一篇干货满满的分享,下面为部分节选:
Rust 带来的益处:
-
Enums
Rust对 enum 的原生支持,让推导和 debug 更加的简单和方便(例如在为OpenVPN协议上选择 TCP 还是 UDP), Rust 编译器会强制我们处理 enum 的所有可能情况来减少 bug.
-
StructOpt
StructOpt是一个通过
derive
宏来处理命令行参数 非常棒的 crate. -
Result
和anyhow
Rust 的
Result
和?
操作符让我们可以非常优雅的处理错误. 结合anyhow
这个 crate 会非常容易的处理错误. -
Serde
Serde
可以让你非常方便的序列化和反序列化你的结构体. -
Drop
Drop
trait可以允许我们再在 struct 失去作用范围的时候运行desctructor. 当程序退出的时候, vopono用他来自动销毁一些临时的 network namespace. -
Cargo
Cargo 作为 crate 管理器, 本身就是使用 Rust 的一大好处.
-
include_str
宏include_str
宏可以在编译期间将硬盘上的文件作为静态 string 加载编译到 binary 中. -
Rustls
Rustls
是一个TLS库,可以用来替代 OpenSSL. -
musl
和静态链接x86_64-unknown-linux-musl
target可以用来做(交叉)编译,静态的连接到musl
而不是默认的glibc
.
原文链接: http://jamesmcm.github.io/blog/2020/09/05/vopono/#en
Linus 同款电脑编译 Rust 的体验
作者把自己的 ThinkPad 升级为 Threadripper (Linus Torvalds
也有这么一台)了.
- CPU AMD Ryzen Threadripper 32核/64线程(3.7GHz - 4.5GHz, 147MB cache)
- Motherboard: Asus Prime TRX40-PRO
- RAM: 128GB Corsair Vengeance DDR4 3200MHz (8 x 16GB)
- HDD: 2x (RAID 0) 1TB Seagate Firecuda 520 Gen 4 PCIe NVMe (up to 5000MB/R, 4400MB/W)
体会一下这凶猛的编译速度,隔壁的小孩都馋哭了:
编译的项目以及SHA | Thinkpad | Threadripper |
---|---|---|
Alacritty @ 5ee7ae8 | 82s | 22s |
rav1e @ 0fb9209b | 104s | 26s |
Nannou @ 11ccd5b | 183s | 34s |
FFmpeg @ 4e012fc8af | 210s |
23s |
Servo @ a5a21a59ad | 833s | 194s |
Rust @ 7d289aeade4 | 2,640s |
213s |
文章连接: https://bobweb.co/article/threadripper-meets-rustc
serde_query
serde_query是一个 Serde
数据模型下的一个 query language.
use serde_query::{DeserializeQuery, Query};
#[derive(DeserializeQuery)]
struct Data {
#[query(".commit.authors.[0]")] // query 部分数据
first_author: String,
#[query(".hash")]
hash_value: u64,
}
let document = serde_json::to_string(&serde_json::json!({
"commit": {
"authors": ["Kou", "Kasumi", "Masaru"],
"date": "2020-09-10",
},
"hash": 0xabcd,
}))?;
let data: Data = serde_json::from_str::<Query<Data>>(&document)?.into();
assert_eq!(data.first_author, "Kou");
assert_eq!(data.hash_value, 0xabcd);
https://github.com/pandaman64/serde-query/
--
From 日报小组 BobQin,FBI小白
社区学习交流平台订阅:
评论区
写评论还没有评论