Linux.中国 - 开源社区

 找回密码
 骑士注册

QQ登录

微博登录


为什么我说 Rust 是靠谱的编程语言

2015-5-19 10:19       

4. 定位精准而潜力广泛的应用领域

现今的软件系统开发,从底层到中层到上层,大致分为以下三个层次:

  • (底层)系统底层开发:裸金属(bare metal)、操作系统(OS)、内核(kernel)、内核模块(mod)等

  • (中层)系统应用开发:虚拟机(VM)、容器(Container)、数据库/游戏/Web/Ftp/Dns服务器、浏览器引擎、模拟器等

  • (上层)普通应用开发:编译器、浏览器、消息推送系统、Web应用系统、管理信息系统、其他等等

其中,(底层)系统底层开发,强调对底层硬件的控制;(中层)系统应用开发,对CPU和内存的占用十分敏感;(上层)普通应用开发,更倾向于方便快捷的开发效率。通常意义上所说的“系统编程”,往往是指中底层系统开发。

Liigo认为,Rust语言足以胜任这三个层次的软件开发。理由是:Rust是静态类型的编译式语言,基于LLVM生成高度优化的代码,再加上没有垃圾收集器(GC)等额外的运行时开销,执行效率非常高,对内存的利用十分灵活,因而胜任(中层)系统应用开发;Rust具有丰富的语言特性,便捷的项目编译和依赖管理,充分可用的跨平台的标准库,因而胜任(上层)普通应用开发;Rust支持raw pointer、unsafte block、C ffi、asm!、No runtime,因而胜任(底层)系统底层开发。Rust语言特别强调并保证的内存安全,对于三个层次尤其是中底层,是额外的突出的加分项。

上面的论述偏向于理论,可能不如实践有说服力。下面我们看看现实中Rust已经做到了什么程度(不是能做什么,而是做了什么,咱们靠事实说话):

早在2013年我(Liigo)开始关注Rust之前,那时候Rust还有可选的GC,还有不算小的Runtime,还有笨重的标准库。即使在那种情况下,都有人不断地尝试用Rust做底层开发(参见前面的链接)。后来,Rust有了几个大的动作,令其更加胜任系统底层开发工作:

Rust是名副其实的系统编程语言,在这个领域,它不惧怕跟任何对手竞争。向下,Rust可取代C语言地位;居中,Rust可挑战C++市场,向上,Rust可向Java、Python分一杯羹。总之,Rust精准定位于中底层系统应用开发,上可攻下可守,适用范围相当广泛,具有全能型选手的潜质。开发者们学习Rust语言,不怕没有用武之地。

5. 自举(用Rust语言开发Rust编译器)

Rust在2010年至2011年完成自举,使用Rust语言开发出Rust编译器rustc, 取代了之前用OCaml语言开发的Rust编译器rustboot。Rust标准库,很早就是Rust语言写的。这意味着,早在四年前,Rust早期核心开发人员,就已经是全职的Rust程序员了,一天八小时,几乎完全使用Rust语言编程:用Rust开发标准库(和其他库),用Rust调用标准库开发编译器,用编译器编译标准库和编译器。等到1.0发布时,他们已经是具有多年极其丰富的Rust开发经验的程序员,这期间他们积累的大量设计开发经验和教训,无疑不断地推进了Rust自身的迭代更新。

有人说:没有必要自举,不自举不代表它没有这个能力。这话说的没有太大毛病。但是我们考虑如下两点:

  • 1、自举从事实上印证了它(编程语言+编译器)具备这个(强大的)能力,不自举只能在理论上保留它具有这个能力的可能性,两者不在一个层面上,说服力孰强孰弱不言而喻。新语言在大规模推广之前,往往欠缺这种说服力,进而导致推广不利,陷入怪圈不能自拔。

  • 2、自举过程中和自举之后,核心开发者每天使用自己开发的语言工作(开发自己的编译器),不断的在实践中锻造,利于及早发现设计缺陷和不足之处,并及时解决;自举之前,只能每天花费大量的时间和精力,使用其他编程语言开发和维护自己的编译器,学习积累的都是别的语言的经验和教训,缺少在实践中检验自己设计的语言的机会。如果自己设计的语言自己都不去深度地使用,又上哪里获取第一手的反馈信息呢,又如何改善呢。

所以自举越早对编程语言自身发展完善越有利,最好是在自身定型之前尽早自举。

在编程语言自身定型之前尽早自举,这句话说起来容易,实施起来却非常困难。语言不完善,某些功能就可能暂时没法实现;语言不稳定,需要不断的修正和改进,用它写的编译器也需要相应的大量的维护更新甚至重写,是很大的工作负担。所以很多新的编程语言的作者,不愿意(尽早)自举,相应地也就永久失去了自举带来的好处。

我(Liigo)举两个反例:

  • 第一个是Google公司的 Go语言,截止到2015年,其编译器和运行时库,包括语言核心数据结构和算法map、channel、scheduler等等,还是用C语言开发的(正陆续替换为Go)——他们的核心开发人员真正用自己开发的Go语言进行实际的大型应用开发的机会并不多。虽然标准库是用Go语言自己写的,但他们却没有大范围使用标准库的经历。实际上,他们缺少使用Go语言的实战开发经验,往往不知道处于开发第一线的用户真正需要什么,无法做到设身处地为程序员着想。缺少使用Go语言的亲身经历,也意味着他们不能在日常开发中,及时发现和改进Go语言设计上的缺陷和不足。

  • 第二个反例是中文编程的翘楚 —— 易语言,它的编译器、核心支持库、集成开发环境(IDE),和绝大多数支持库,都是用C语言或C++语言开发的,他们的主要开发人员,包括创始人吴涛在内,每天的工作是熟练编写大量C/C++代码,写易语言代码的机会少之又少,即使有也是写一些调用支持库的示例这类浅尝辄止的代码。事实上在易语言研发部,只有庄晓立(Liigo)、袁晓辉(海洋)、龚辟愚(GBB)等少数几位具有较深的易语言功底,其他开发人员进入研发部之前甚至都没听过易语言。吴涛本人早年还写过一些较大的易语言程序,代表作是俄罗斯方块(代码多达500行),后期也很少写了,偶尔写一些Sample代码作为支持库的示例(往往不超过100行)。易语言公司里写易语言代码最多的应该是项目教育培训等部的史世恒、潘春华、季翔、王军、张志恒他们。后来易语言暴露出来一些大的设计缺陷,已经不好修复了,除非伤筋动骨地翻修(放弃向后兼容性)。再后来吴涛组织团队又开发了全新的编程语言“易语言.飞扬”(EF),发布之前用EF语言开发了自己的集成开发环境(IDE),是一大进步,但依然没有完成自举。后来听说吴涛自己在搞3D游戏引擎(Volcano3D),好强大,希望推出真实的游戏(而非demo)检验其优秀品质。

而Rust语言,偏偏克服了诸多困难,提前4年完成自举,成为是最成功的案例之一,充分的享受了自举的好处,不断地在实践中完善了自身的设计。

没有深度的实践,就没有优秀的设计。除了自举,Rust还有其他的深度实践。

6. 两个半"大型成功案例": servo, rustc+std, cargo

  • Servo: 下一代浏览器渲染引擎(类Webkit/Blink),超过40万行Rust代码

Servo是Mozilla公司另外一个独立开发组的项目,启动于2012年初,跟Rust并行开发。多年来,在Rust语言从幼年到少年逐步成长、长期剧烈变动的情况下,Servo居然还能保持正常开发进度,实属不易。Patrick Walton在Servo开发组和Rust开发组都是核心程序员,Servo组的Lars Bergstrom经常参加Rust组的每周会议,这保证了两部门的有效沟通。Rust组经常会优先协助解决Servo组遇到的问题,维持Servo开发任务正常推进。

对于Rust而言,Servo项目存在的最大意义就是,它实践并印证了Rust语言具有实际的大中型项目开发能力(而不仅仅停留在理论上),同时获得了珍贵的设计开发经验和教训,反过来进一步促进了Rust自身的发展。Rust语言和标准库逐步发展到今天,许多优秀的设计得以引进,许多有缺陷的设计得以改良,都要感谢Servo这类大型实践项目,在Rust 1.0之前就已经长期存在。试想,如果Rust定型之后才启动Servo项目,实践中发现语言的重大设计缺陷又能怎样,反正木已成舟,悔之晚矣。

Servo已经通过了 Acid2 标准测试;可以 并发渲染 Github/Reddit/CNN 这类大型静态网页,性能 明显高于 当前的Firefox浏览器的Gecko引擎;可以无缝替换基于Chrome的 CEF 框架;已经实验性的应用在Firefox OS平台(b2s)。2015年将发布测试版浏览器。Servo有机会成为浏览器历史上里程碑式的产品。

  • rustc+std: Rust编译器和标准库,超过35万行Rust代码

时至今日,rustc负责编译全世界所有的Rust源代码,包括rustc+std的35万行和servo的40万行,以及crates.io网站上的2000多个第三方库,是名副其实的大型成功项目。

  • Cargo: Rust的package管理器,项目依赖管理

代码量相比前两者而言要小的多,所以我算它是半个成功案例。代码虽少,但实用性、流行度有过之而无不及。全世界大约99%的Rust项目采用Cargo编译。crates.io网站上有2000多个包,总下载量超150万次。Cargo最大幅度地简化了Rust项目的编译和依赖管理,可以说是目前开发Rust项目的必备工具。

查看其它分页:

发表评论


最新评论

我也要发表评论

运维世界大会
返回顶部

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”将网页分享至朋友圈。