《架构师》2016年7月
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

本周更新公告(ThisWeekInXX)

“This Week In Rust”每周推出一期,总结介绍上一周Rust发生的重要事件,如功能增加或变动,新的设计文档(RFC)得到批准,谁发表了重要文章,谁举行了聚会等等。从2013年6月Rust推出第一期“This Week In Rust”开始,三年来共发布130期(其中在1.0之后发布约50期)。可以当作新闻报纸摘要来读,用户花少量的时间就能了解Rust重要开发动态。

后来有些项目开始学习这种公告形式:

· This week in Servo

· This week in Redox

· This week in Ruma

· This week in Rust Docs

· This week in intermezzOS

· This week in TiDB

· This week in Parity

这种事情最难得的就是持之以恒。Rust出到第130期了,Servo出到第62期了,Redox出到第14期了,加油吧。(注:因本文创作时间跨度较大,以上数据可能稍有过时。)

别的项目没有(各种形式的)每周(或每月)更新公告,其中一个理由可以理解为:开发活跃度低,每周更新的内容少,不好意思写出来;或者被关注度低,写出来也没多少人看,所以干脆不写了;再或者开发透明度低,不能写出来给人看。(唉,人艰不拆,说出实话就要得罪人!)

支援兄弟语言项目

本着共建和谐开源大家庭原则,Rust社区充分发扬共产主义精神,积极参与其他社区活动,为各兄弟语言项目送温暖、献爱心,共享发展理念,致力于实现共同富裕。Rust在安全和性能方面优势非常突出,尤其适合为其他语言编写Native扩展库。下面提到的项目多是名家作品。

Lua

有过Lua本地模块开发经历(htmlua iedom)的我,第一次看到hlua就有眼前一亮的感觉,眼珠子都快掉下来了,惊叹居然可以这样写Lua的本地扩展模块,完全突破了Lua C API的死板接口:

hlua的作者是何方大神?这里先卖个关子。后面他还会出现。

Ruby

    001 #! [feature(phase)]
    002 #[! plugin(rust-hl-lua-modules)]
    003 #[export_lua_module]
    004 pub mod mylib {         // <-- must be the name of the Lua module
    005     static PI: f32 = 3.141592;
    006     fn function1(a: int, b: int) -> int {
    007         a+b
    008     }
    009     fn function2(a: int) -> int {
    010         a+5
    011     }
    012     #[lua_module_init]
    013     fn init() {
    014         println! (“module initialized! ”)
    015     }
    016 }

借助helix项目,让Rust语言编写Ruby本地库变得很简单,消除了大量胶水代码。

Helix的作者是Rust核心开发者Yehuda Katz和Ruby on Rails核心开发者Godfrey Chan。这个阵容够强大吧?

    001 declare_types! {
    002     class Console {
    003         def log(self, string: &str) {
    004            println! (“LOG: {}”, string);
    005         }
    006     }
    007 }
    008
    009 $ irb
    010 >> require“console/native”
    011 >> Console.new.log(“I' m in your rust”)
    012 LOG: I' m in your Rust

Node.js

通过neon项目,用Rust语言编写Node.js本地扩展包,既简化了代码编写,又简化了编译过程。看看它的demo,让人印象深刻:静态编译+并发计算,性能远超JavaScript,强到没朋友。简单贴一段代码。

Neno的核心开发者Dave Herman,是Mozilla公司员工,ASM.js的作者,牛逼的不要不要的。

Golang

    001 dfn search(call: Call) -> JsResult<JsInteger> {
    002     let scope = call.scope;
    003     let buffer: Handle<JsBuffer> = try! (try! (call.arguments.
          require(scope, 0)).check::<JsBuffer>());
    004     let string: Handle<JsString> = try! (try! (call.arguments.
          require(scope, 1)).check::<JsString>());
    005     let search = &string.data()[..];
    006     let total = vm::lock(buffer, —data— {
    007         let corpus = data.as_str().unwrap();
    008         wc_parallel(&lines(corpus), search)
    009     });
    010     Ok(JsInteger::new(scope, total))
    011 }
    012
    013 register_module! (m, {
    014     m.export(“search”, search)
    015 });

通过rure项目,Rust给Go语言送去性能更强的正则表达式库,让Go社区的同学们提前用上高大上的lazy DFA特性。

Rure的作者Andrew Gallant,是Rust开发组成员,Rust Regex和Docopt库的主要作者。

Python

rust-cpython 使得采用Rust语言编写Python扩展库和调用Python代码成为现实。

    001 #! [crate_type =“dylib”]
    002 #[macro_use] extern crate cpython;
    003 use cpython::{Python, PyResult, PyObject};
    004
    005 py_module_initializer! (example, initexample, PyInit_example, —py, m—
          {
    006     try! (m.add(py,“__doc__”,“Module documentation string”));
    007     try! (m.add(py,“run”, py_fn! (py, run())));
    008     Ok(())
    009 });
    010
    011 fn run(py: Python) -> PyResult<PyObject> {
    012     println! (“Rust says: Hello Python! ”);
    013     Ok(py.None())
    014 }

Erlang and Elixir

    001 #! [feature(plugin)]
    002 #! [plugin(rustler_codegen)]
    003
    004 #[macro_use]
    005 extern crate rustler;
    006 use rustler::{ NifEnv, NifTerm, NifResult, NifEncoder };
    007
    008 rustler_export_nifs! (
    009    “Elixir.TestNifModule”,
    010     [(“add”, 2, add)],
    011     None
    012 );
    013
    014 fn add<' a>(env: &' a NifEnv, args: &Vec<NifTerm>) ->
          NifResult<NifTerm<' a>> {
    015     let num1: i64 = try! (args[0].decode());
    016     let num2: i64 = try! (args[1].decode());
    017     Ok((num1+num2).encode(env))
    018 }

Rustler使得Rust可以轻松编写Erlang NIF(本地实现函数库)。

C and others

C同学也未被遗忘,Rust双手奉上Regex C API,并希望C同学向各编程语言转达来自Rust语言的问候。Servo也有提供C API。

Rust语言内置支持与C语言的互相调用(FFI)。其他语言以C为中介可间接地实现与Rust交互。对于Rust调用C库的情况,rust-bindgen很给力,可自动生成Rust端调用接口。新特性cdylib使得Rust编译出的DLL/SO文件尺寸更加小巧,更方便被其他语言嵌入、调用。Rust当然也支持引入和输出静态库lib文件。

Vulkan

Vulkan规范今年2月份刚发布,Rust迅速跟进,很快就有了安全而高效的vulkano第三方封装库。

vulkano的作者tomaka,同时也是大名鼎鼎的glium和前面提到的hlua的作者。

最受群众喜爱的编程语言

在国际知名网站StackOverlow主办的2016年开发者调查报告中,Rust荣获最受群众喜爱的编程语言大奖。群众的眼光是雪亮的。

Rust在国内的发展情况:

· QQ和微信群/讨论区Rust中文社区。

· 国内多位开发者合力完成的原创性Rust教材Rust Primer(诞生记)

· 国内开发者Elton主导并持续开发的协程项目coio-rs。

· 2015年6月起,号称全球最大IT社区的CSDN网站先后多次专访国内活跃Rust开发者(庄晓立(Liigo) 钟宇腾(Elton/tonytoo)唐刚(daogangtang) 王川(Fantix) 冯耀明(loveisasea)),并推出Rust学习路线Rust知识库,持续关注和推动Rust发展。

· 2016年3月,PingCAP首席架构师唐刘发表Rust语言入门、关键技术与实战经验(今日头条链接)

· 2016年4月,本文作者庄晓立(Liigo)在 QCon北京2016—全球软件开发大会 上做专题演讲 《Rust编程语言的核心优势和核心竞争力》(演讲稿PDF)。这应该是Rust语言第一次正式出现在国内顶级软件大会现场。

· 上文提到的TiKV开源项目的开发商PingCAP是中国公司,总部在北京市海淀区。是目前唯一一家出现在Rust官网Friends of Rust页面的国内公司。

· pencil的作者是北京人,sapper的作者是四川人。

· 2016年5月,在北京和成都举办了庆祝Rust 1.0发布一周年的线下同性聚会活动。

后语

Rust语言还是成长中的孩子。它有已经成熟的一面,且持续保持稳定,经历过至少一年的时间考验,证明它初步拥有独当一面的能力。它还有欠缺的一面,许多地方有待完善和拓展,它正视自身存在的问题,从多方面努力争取拿出最好的解决方案。过去一年的主题可以总结为:巩固已经稳定成熟的领域,发展全新的领域或有欠缺的领域。Rust开发者们卓有成效的工作,使得Rust取得了可喜的进步,让我们对Rust的未来充满信心。Rust社区高度活跃的现状昭示着我们不是一个人在战斗。Dropbox等公司的加入使得队伍不断扩大。继续努力吧,务实的Rust编程语言,我们期待下一年取得更大的进展。