< 返回版块

gensmusic 发表于 2020-09-07 17:36

Tags:rust, 日报

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 带来的益处:

  1. Enums

    Rust对 enum 的原生支持,让推导和 debug 更加的简单和方便(例如在为OpenVPN协议上选择 TCP 还是 UDP), Rust 编译器会强制我们处理 enum 的所有可能情况来减少 bug.

  2. StructOpt

    StructOpt是一个通过 derive宏来处理命令行参数 非常棒的 crate.

  3. Resultanyhow

    Rust 的 Result? 操作符让我们可以非常优雅的处理错误. 结合 anyhow 这个 crate 会非常容易的处理错误.

  4. Serde

    Serde 可以让你非常方便的序列化和反序列化你的结构体.

  5. Drop

    Drop trait可以允许我们再在 struct 失去作用范围的时候运行desctructor. 当程序退出的时候, vopono用他来自动销毁一些临时的 network namespace.

  6. Cargo

    Cargo 作为 crate 管理器, 本身就是使用 Rust 的一大好处.

  7. include_str

    include_str宏可以在编译期间将硬盘上的文件作为静态 string 加载编译到 binary 中.

  8. Rustls

    Rustls是一个TLS库,可以用来替代 OpenSSL.

  9. 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小白

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页