通告两则
- Rust每日新闻」调查问卷
还没有提交问卷的小伙伴,继续填写一下问卷。我的两小时交换你的2分钟,可以吗?按订阅人数来看,目前的问卷填写率是50%。
回头会把统计结果给大家分享,目前的统计结果很有意思,但是样本有点少,需要大家的配合。到时候把结果放出来,大家也可以对国内的Rust社区有一个了解。
- docs.rs临时访问地址
IPv4 地址挂了, IPv6 可用
临时访问地址: docsrs.brun.one
「用Rust写操作系统V2系列」硬件中断
本篇介绍了如何用Rust处理硬件中断,将学习到如何获取定时器中断周期以及如果从键盘获取输入。
也能看到Rust的所有权对写操作系统产生什么有益的助力。
「研究项目」「系列文章」Shifgrethor II :跟踪垃圾回收器的注意事项
本篇主要是阐述了Shifgrethor 的工作方式:
将带有垃圾回收的Rust程序的内存分成了三个部分: 栈、托管堆(managed heap)和非托管堆(unmanaged heap)。
(让我想到了.net的CLR,看来上一篇的新闻内容我理解有点问题,不过没关系,看这篇纠正就可以了)
非托管堆: 是程序存储器的一部分,Rust程序员通常认为它就是堆,由内存分配器来分配内存,开发者可以自由调用,Rust里的Box分配的就是非托管堆的内存。
托管堆: 提供了分配内存的API,但没有提供释放内存的API,由垃圾回收器来负责回收内存。这就是为什么它被成为「托管堆」
其实托管堆和非托管堆也不是完全独立的内存,其实可以在非托管堆的基础上实现托管堆。比如,可以实现一个库,将内存分配到非托管堆,然后该库实现一个自动的垃圾回收器,然后这个GC维护一个托管堆。这也正是Shifgrethor 要做的。
托管堆中的所有数据,实际上是存储在非托管堆的链表中,基本上是一堆Box。垃圾回收器依赖于这个链表,对数据进行标记,这就形成了一个保守的标记-清除的GC。
标记阶段有两个重要的部分:
- 生根(rooted):非托管部分(包括非托管堆和栈)对托管堆的引用必须是rooted,这样GC才能知道从哪里去找actived 对象。有不同的生根策略,Shifgrethor 的比较独特。
- 发芽(Tracing):从根的部分,跟踪和其关联的所有对象。也就是说,从根开始,标记和其关联的所有引用。可以将其看作是一种图形跟踪算法。
关于此GC的效率问题:
- 使用链表存在着一些问题,比如内存位置不连续,会导致内存缓存访问不佳且成本更高。
- 引入复制垃圾回收算法来解决这个问题。但是复制垃圾回收又为Rust引入了新的问题,将在后面的文章中介绍它。
下一篇将阐述,Shifgrethor如何rooted。
「博文」学习Rust,痛并快乐着
此文是influxdata的开发者写的,他是一名Go程序员,然后最近开始学习Rust。本文记录了他的一些学习心得和过程。
他学习过程不仅仅是看书,Go社区有本书叫《用Go实现解释器》,这本书里实现了一个语言,叫做Monkey 语言。然后他本身是Go程序员,所以在学习Rust的时候,通过这本书,用Rust实现了Monkey语言,文中有源码仓库地址。
「官方」WebAssembly的后MVP时代:技能树如何发展「卡通版」
Mozilla工作人员 Lin Clark,最擅长的就是用卡通画来阐述技术思想,本篇就是他的新作。
他发现很多人误以为WebAssembly当前发布的MVP(minimum viable product ,最小可行产品)版本就是WebAssembly的最终版本。非也,非也。
事实上,WebAssembly还有很多能做的事情,目前大家掌握的只是技能树上的前几项。
- mvp技能:
- 编译目标
- 快速执行
- 快速加载
- 线性内存
解锁成就: 在浏览器运行程序和游戏就像在本地机器上一样。
- 更重量级的桌面应用,需要技能:
- 线程,已完成提案。
- SIMD, 已经在非常活跃的开发阶段。
- 64位地址, 有了一个好的计划。
- 流式编译, Firefox在2017年已经支持,其他浏览器还在努力。并且firefox在2017年也增加了用于分层编译的baseline编译器,其他浏览器也在过去一年中添加了相同的架构。
- 隐式HTTP缓存,就快登录Firefox了
- 其他改进,正在讨论
解锁成就:这些技能点实现以后,就会有更多重量级的应用程序进入浏览器。
- 常规Web开发,需要与js互操的小模块,需要技能:
- 在js和wasm之间快速调用,目前在firefox已经解决了这个问题
- 快速简单的数据交换, reference types和host bindings 提案已经完成,Rust工具链已经创建了一些工具,可以自动为开发者处理这些数据交换,可以暂时弥补提案功能的缺席。
- ES模块集成,快要递交提案。
- 工具链集成, Rust的wasm-pack很不错。
- 向后兼容性, 利用wasm2js工具。
解锁成就:生态系统中将得到很多wasm和js互操作的模块
- js框架与编译到js的语言
一种路线是:用wasm重写现在的很多js框架,比如react、vue、ember等
另一种路线:编译到js的静态类型语言可以直接编译到wasm,比如scala.js、reason或elm
对于这两种路线,webassembly都需要支持更多高级技能:
- GC。 目前正在进行两项提案,JS的Typed Objects和WebAssembly的GC。Typed Objects可以描述对象的固定结构,WebAssembly GC可以直接访问该结构。有了这两个东东,js和wasm就可以共享js对象。这个估计得明年才能标准化,还不一定实现。
- 错误处理,处于研究和开发阶段。
- Debug, 目前浏览器的devtools有一点支持,但不理想。
- 尾调用支持,提案正在进行。
解锁成就: 达成js框架用wasm重写和编译到js的语言可以直接编译到wasm。
- 浏览器之外。wasm要达成什么成就?
网络中除了网页,还有一个非常重要的属性:链接。互联网有链接才能互联,但是,目前用户跳转到的链接内容,都是和提供其服务的机器设备重度依赖的。一个网站是否要为每个可能的设备提供不同版本的代码? 当然不是,一个网站的源码只有一个。这里面涉及一个概念:可移植性。
可移植性很好,你可以从不认识的人那里加载代码,不用管什么设备。但这里存在一个安全问题。利用wasm可以达成以下两点:
- 可移植性。向用户提供代码,并且可以在能运行浏览器的任何设备上执行。
- 安全沙箱。在wasm安全模型中运行代码,不会危机机器的安全。
所以可以将wasm视为浏览器工具箱中的一个独立的工具。比如,可以使用wasm对Node.js中的一些本地扩展进行重写,比如Node.js 中用C实现的一些模块,就没必要依赖于机器,这就增强了Node.js代码的可移植性。但是目前wasm还无法访问系统资源,因此还需要更多技能:
- 一个可移植的wasm系统接口,目前有一个package name maps的提案,可以用于将模块名称映射到加载模块的路径。这可能会得到浏览器和Node的支持,它们可以使用它来提供不同的路径,从而加载完全不同的模块,但使用相同的API。有了这个支持,就可以开始考虑接口的事了。这估计就需要更长的时间了。
- CDN/ Serverless/ Edge计算(物联网)
这些领域为什么要使用WASM?
作者举个了例子, Fastly是一家提供CDN和边缘计算的公司,他们CTO如是说:wasm可以在安全、性能和规模上提供比系统进程更加强的功能。这就意味着需要一个新的技能:
- 运行时,执行实现一个wasm编译器或解释器。
目前CraneStation在建立一个通用的wasm运行时,wasmtime。
其他应用方向:
- 可移植的CLI工具,可以用于不同的操作系统
- 物联网
- 区块链, (这个原文没说)
长文预警!!!
「Web框架」使用actix-web制作一个验证用户身份的微服务 Part 1
「Web框架」用Rocket、Diesel和Future开发的Tor搜索引擎
「工具库」字符串操作集合
该库实现了很多字符串操作的方法,灵感来源 Voca.js 和 string.py。可以关注下
「小工具」编译时断言
该库可以在编译期提供断言功能
「小工具」Rust实现的挖矿工具
可以挖门罗币,也包括其他的某些数字货币
「学习小项目」Rust实现的加载.wad
文件的库
.wad
一般是Quake、半条命、Doom等游戏的格式
好像可以为智能手机上玩这三款游戏提供支持
「Hack向」在Rust中实现一个HKT
每日新闻订阅地址:
欢迎通过GitHub issues投稿。
评论区
写评论还没有评论