「Rust日报」2019每周精选 • 第九期
前言:
从2018年开始,我每天会花1个小时关注Rust社区动态,并且在Rust.CC论坛、tg channel、Steemit、GitHub、语雀订阅都开通了Rust日报,分享我每天的见闻,偶尔也夹杂了一些个人的观点。新的一年过去了,Rust每日新闻已经成为了Rust社区群大家每天必看的内容。每周也会精选几篇Rust社区中的动态,和大家分享。分享的内容就不按时间排序了。
2019-03-10
通告
Rusty棒球帽周边定制活动状态报告
- 帽子还在制作中,店家应该周末会发货给我。
- 镭射贴第一次做的不太满意,又让店家重新制作了。再多等两天。
预计下周可以发货。
[北京][2019年4月20日] RustCon Asia :第一届 Rust 亚洲技术大会
官方新闻
Rust 2019 Roadmap 即将发布
「嵌入式Rust」嵌入式工作组报告 第16期
摘要:
Rust Tool Team的变化
主要是独立出来一个核心(core)工具组作为领导,来解决子工具组的各种协调和规划问题。
Rust语言工作组会议跟踪贴
本贴记录了Rust语言工作组会议相关跟踪记录,感兴趣的可以关注,还会有讨论的油管视频放出。
社区新闻
「讨论」Rust类型系统可以保证内存空间上限吗?
该贴作者是做大数据的,使用Spark。Spark因为输入数据的大小变化和GC的原因,导致运行时内存会产生难以预测的波动。他接触了Rust之后产生了这个问题,Rust的类型系统能否减少或消除运行时内存的不确定性?
Rust实现的T1HA可以达到40GiB/s
T1HA是Fast Positive Hash的实现,基于SIMD在avx2平台上可达到40GiB/s的性能。
整理还未使用Futures 0.3的库
作者整理这个列表的目的是为了促进0.3的稳定,这些库还在用0.1,如果一直不用0.3,那么futures 0.3就很难更快地稳定。另外也方便社区的开发者为其做贡献。
Oxide:无限接近Rust所有权和借用本质的形式化语义模型
Rust是工业编程语言的一个重大进步,它重点是弥合了底层系统编程和高级应用程序编程之间的鸿沟。但目前Rust编程的缺点是缺乏一个用于证明Rust程序的有效工具,之前也有很多类似的工作但是不太理想。
该论文展示了Oxide了形式化语义,重新使用类型系统构建了Rust所有权和借用这个核心机制,来推理Rust的行为,并且希望研究人员能将其作为Rust工作的基础。
氧化:Rust的本质(Oxide: The Essence of Rust)
Arxiv平台Rust相关论文整理:
- Rust在安全领域的应用: Angora: Efficient Fuzzing by Principled Search
- Rust实现的Tsetlin Machine
- Tsetlin Machine 对模式识别优化的论文地址
- Rust加密API的可用性如何?
- 使用Javascript安全地管理Rust数据的生命周期
- 优化编译器的未来方向
- Mesh:可避免灾难性内存碎片的内存分配器
Google编程之夏项目
有Rust相关的项目入选,包括TiKV,Servo, Tokio-rs等,可以选择参与贡献。
Deno一瞥:JavaScript/TypeScript运行时
什么是Deno?
- 使用Rust实现
- JavaScript和Typescript运行时
- 实现ES5模块
可以简单地把Deno看作是Node.js的替代品。但是Deno旨在实现和浏览器相同的功能。你可以用Deno实现一个浏览器和服务器都可以使用的程序。Deno的前景可以,但是目前还属于早期阶段。
「招聘」「新加坡」使用Rust构建下一代支付系统
新加坡TenX公司,成长型创业公司,产品是基于云的支付平台,并且支持数字货币。其他消息不详。不过据说新加坡支付行业竞争比较激烈。
torchbear: 为Speakeasy编程语言实现的编程环境
Speakeasy编程是一门新语言,该组织建立它的目的是为了解决更通用的问题。
只关注语法,语义,生态系统指导等,不包括解释器或编译器。Speakeasy旨在为每个开发人员提供更轻松,更高效的软件开发;经验丰富的退伍军人,好奇的用户,成人,儿童等。我们的范围包括来自其他语言和学科的课程和概念;我们将把目标放在一个简单,有序的开发者体验上。
Torchbear为Speakeasy编程语言提供了一个简单但功能强大的通用解释器。它可以帮助用户进行Web自动化,嵌入式编程,数据分析,数值计算......其他能想到的。目前,以Lua语言为教学语言。没有编程背景的人可以在15分钟内学习Lua。
(没搞懂这个项目,目测是给普罗大众学习编程和解决问题用的,感觉要上天。)
东京Rustaceans集会
东京在3月20日,要举办一场友好的Rust比赛+派对。该派对的主题是用tokio(会有一个准备好的tokio helper crate)来编写一款多人游戏,然后用此游戏来相互对抗。
(这个活动有意思)
actix-web和rocket框架性能比较
从评论区的actix作者的回复中得知一个消息:actix-web下个版本将支持Rocket风格的路由注册机制。
Rust的channel是否应该在没有接收者的时候Panic
作者最近使用了crossbeam-channel 0.3,发现有个issues提出一个问题:channel的send是不是默认panic?,基本上每个.send
后面都跟着.unwrap()
。
该文作者认为这样的写法是有问题的,并且在文章中罗列了两点原因。同步状况下还没什么问题,但是一旦和future异步一起使用,就会有麻烦。
学习资源
使用Criterion对Rust项目进行基准测试
Criterion是第三方Rust基准测试库,还提供了额外的统计和图表功能。
「视频」五分钟Rust系列
该系列视频,每一集只有五分钟左右。作者是Pat Shaughnessy,《Ruby原理剖析》的原作者,现在在学习Rust。质量挺好的,大家可以看看,他的特色是图文并茂。
「系列译文」用Rust创造操作系统之三
Rust实现一个Merkle(默克尔)树状数组
ramhorns中的动态模板
#template_engine
ramhorns是一个实验性类Moustache的模板引擎。该作者(Pairtytech的工程师)写了这篇文章,主要记录他为ramhorns中动态模板提升性能的方案。
在Rust的世界里有很多模板引擎,可以分为静态模板和动态模板。
- 静态模板引擎,在编译时渲染。比如Askama。
- 动态模板引擎,需要在运行时进行渲染,比如Moustache,Handlebars和Zola(Rust实现的静态站点生成器)使用的Tera。
对于静态站点生成器,必须使用动态模板。而动态模板和Askama的性能存在5~30倍左右的差距。这让作者比较困惑,他在阅读了Askama和其他动态模板引擎的源码之后,发现Askama可以直接使用Rust类型渲染模板,而动态模板则需要一个中间结构表示,比如这种:
#[derive(Serialize)]
struct Post<'a> {
title: &'a str,
content: &'a str,
}
然后通过序列化和HashMap这类数据结构在运行时获取相应的字段和值去渲染模板。这虽然有效,但是这种中间结构付出了沉重的代价。并且对于已经存在内存中的数据结构是完全冗余的。作者罗列了可能出现的开销:
- 如果要将字段名称和值转为字符串,则需要创建HashMap,这会双倍耗费堆内存。
- 如果有一个Vec或者是一些其他要展现的东西,比如帖子列表。将不得不创建一个新的Vec和多个HashMap。
- 每次对HashMap的插入和查找,都会有哈希处理带来的额外开销。
而静态模板引擎完全没有上述的开销。ramhorns如何优化?
使用宏来生成代码,并且使用比较字符串的hash值来代替直接比较字符串。使用了Fnv库。并且在模板预处理中使用相同的Hasher。
ramhorns中没有使用serde,而是使用了Content trait。利用宏,为Post结构生成如下代码:
impl<'a> Content for Post<'a> {
fn render_field(&self, hash: u64, buf: &mut String) {
match hash {
// FNV-1a hash of "title"
0xda31296c0c1b6029 => buf.push_str(&self.title),
// FNV-1a hash of "content"
0x420c75b526b35282 => buf.push_str(&self.content),
// In Mustache fashion, do nothing if the field is not found
_ => {},
}
}
}
这样就避免了在运行时使用HashMap。优化的结果如何?作者和其他的模板引擎做了性能测试,发现ramhorns不仅比其他动态引擎更快,而且还比静态引擎Askama更快(其实Askama也有很大改进空间,Wearte项目就是案例)。作者说,也许再过一段时间,Hugo就不会说自己是「世界上最快的」静态网站生成器了。
使用Rust构建类似于Wireshark过滤器那样的执行引擎
Cloudflare公司开源的用于解析Wireshark过滤器语法,并将它们编译器为可执行的IR。该库用于该公司提供的防火墙服务规则解析,所以使用Wireshark的过滤器语法作为DSL。
解析语法一般有三种方式:
- 使用状态机、正则等按字符进行解析
- 使用解析器组合器,比如nom或combine这种工具
- 完全自动化的生成器,可以根据提供的语法自动生成一个解析器,比如pest
但是该库并没有用nom或pest,而是选了第一种解析方式。并且在文章里给出了一些提升解析器性能的经验:
- 他们认为Rust标准库提供的字符串API完全够用。
- 使用IndexMap替换了HashMap来进一步提升了两倍性能。
- 使用trait对象动态分发和闭包来避免实现JIT而带来的一些问题。动态分发的执行效率出乎他们的意料。
- 选择使用Rust语言实现,对于支持WASM提供了巨大的方便。
该库已经用于Cloudflare公司的生产项目。
说明: Cloudflare是一家提供CDN、DNS、DDoS 防护和安全服务的公司。该公司曾经声称自己抵挡“在一秒钟内的流量接近于谷歌(Google)的全球搜索引擎在一个小时内的流量”的攻击。
集成React + Rust + WASM指南
本教程教你如何用Rust提供的wasm工具链开发React App。
使用Bulletproofs进行零知识证明
该文展示了如何使用bulletproofs进行零知识证明
- [Read More](https://medium.com/coinmonks/
zero-knowledge-proofs-using-bulletproofs-4a8e2579fc82) - bulletproofs
「系列」Rust开发游戏24小时经验谈
作者用Rust开发了一款个网球主题的模拟小游戏,耗费了大概24个小时,游戏虽然没完成,但是他拥有了一些经验想要分享给你。涉及ECS模式。
第二篇文章阐述了他在实际应用ECS模式的一些经验,结合他的网球类游戏进行了讲解,值得一看。
使用Rust + Warp + Juniper + Diesel编写Graphql API的模板项目
享受const fn带来的编译时函数执行
该文简单介绍了const fn的用法和注意事项。
gen-stream: 基于生成器的Stream实现
基于futures 0.3来实现
从46s到5s - 优化350行Rust代码实现的光线跟踪器
在这篇文章中,作者将讨论如何将用C#/C++代码库编写的光线跟踪器移植到Rust,然后利用Rust的一些特性来进行简单的优化。
这篇文章主要是写给那些认为将C#/C++代码移植为Rust代码只需要简单的代码翻译的人。如果这么想的话,就会错过真正了解Rust的机会。
Rust中安全访问私有字段的方法
结论:构建setter/getter方法是最安全的
await!存在可能永远无法返回的情况
该文作者发现await在future被Drop的时候会出现无法返回的情况,并给出了详细的示例代码。
项目、工具与库
interact: 运行时自省框架
可以通过命令行查看运行时程序状态,这个用来调试代码很方便了。
Gfx-rs组织宣布新的项目wgpu-rs
wgpu-rs是基于gfx-hal的原生WebGPU实现。
luster: Rust实现的lua虚拟机
ffsend: Firefox Send服务的命令行客户端
状态:WIP。支持从命令行轻松安全地通过Firefox Send服务上传和下载文件。Firefox Send可以通过安全、私密且受加密的链接发送文件,链接到期后文件将从网上彻底抹除。
persy 0.4发布
persy是一个Rust编写的简单事务存储引擎
为PyTorch实现Rust绑定和OCaml绑定
可以操作approveapi的Rust库
Approveapi服务可以通过电子邮件、短信、移动推送请求用户可以实时地对任何内容进行批准确认。
该库基于tokio实现
Rust可信计算开发平台介绍
Double Ratchet算法的Pure Rust实现
Double Ratchet(双棘轮)算法是端到端即时通信加密算法之一,允许两个用户安全地进行通信:它为用户提供机密和真实的通道,包括前向保密和未来保密。目前Crait和Whatsapp这两款IM产品就使用该算法加密通讯。
Congratulations @blackanger! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :
Click here to view your Board
If you no longer want to receive notifications, reply to this comment with the word
STOP
To support your work, I also upvoted your post!
Vote for @Steemitboard as a witness and get one more award and increased upvotes!