微信号:infoqchina

介绍:有内容的技术社区媒体

2016年Rust语言3个重点发现方向……

2015-08-22 08:16 张天雷 译


2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目。该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在的问题。其最大的特点在于保持较高的运行效率、深入的底层控制和广泛应用范围的同时,解决了传统C语言和C++语言中的内存安全问题。2009年,Mozilla接手Rust项目,创建了以Graydon为首的专业全职开发团队,并且开放了该项目的源代码。2012年1月,第一个面向公众的预览版本——v0.1 发布。经历了大刀阔斧的10年发展,Rust在2015年5月份正式发布1.0版本。z之后,Rust开始遵守 SemVer 2.0 规范,进入稳步发展的阶段。那么,作为一个正在崛起的语言,Rust在2016年将会向何处发展呢?


目前,Rust以其无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争等特点已经吸引了广大开发人员的广泛关注。但是,作为一门新兴的语言,Rust仍然有很多地方需要完善。据Rust核心开发团队透露,Rust在2016年的发展主要包括加大在框架上的投入、完善关键特性和扩展应用领域等三个方向。


方向一:加大框架投入

首先,在加大在框架上的投入方向,Rust团队准备在Crater工具、增量编译和IDE集成三个方面着手开始。作为测试编译器的工具,Crater目前已经成为Rust社区不可或缺的工具。它能够有效发现编译器中存在的问题。此外,Rust开发团队还经常使用Crater来比较稳定版与开发版的不同以及评估不同改变所带来的影响。对于如此重要的工具,Rust团队未来将会扩展其对Linux外其他平台的覆盖度,使得Crater更简单易用,并包含除crates.io以外其他源的代码。而且,该团队还计划制作一个适用于库作者的版本(使得库的变化对下游代码的影响可以很容易被观察到)。在增量编译方面,Rust才刚刚起步。之前,Rust编译器会把所有的代码作为输入,经过类型检查后发送给LLVM进行优化。这种方式在带来深度优化的同时,也使得每次编译都非常耗时,加大了代码调试的难度。未来,Rust团队将在支持增量编译方面努力。而且,增量编译工作还包括了重新构造编译器,来引进一种新的中间层表示——MIR。MIR是一种更加简单和底层的Rust代码形式,能够使得Rust编译器更加简单。最后,Rust团队还试图扩展Rust编译器,使其可以与IDE或者其他工具更深入的集成。


方向二:完善关键特性

完善关键特性方向包括了标准化、改善借用检查器(Borrow Checker)以及完善插件稳定性三个方面。在Rust语言设计之初,其试图试图实现的目标就包括用户不为不使用的东西付费和用户所使用的东西肯定是最好的这两个方面。目前,Rust 1.0已经实现了第一个目标。但第二个目标还未实现。为此,Rust团队准备在标准化方面进行努力。标准化就是允许用户在有需要时提供多个、相互重叠的trait实现,从而使得每个实现都有更加专业的应用范围。此外,标准化还能改善代码的重用性。作为某种意义上Rust的核心,借用检查器通过抓取use-after-free类似的问题保证了编译器在没有垃圾收集器情况下的内存安全。但是,目前的借用检查器偶尔还存在误检测的情况。Rust团队计划通过重构借用检查器,使其能够以细粒度范围(移动到MIR所移动的一步)查看代码,从而解决该问题。最后,目前Rust的很多crate都使用了高度不稳定的编译器插件,非常容器引起编译器出现问题。Rust团队计划提出一个新的插件设计框架,使其更加鲁棒,并能够提供内置纯净的宏扩展支持。


方向三:扩展应用领域

最后,扩展Rust的应用领域方向包括交叉编译、安装Cargo以及追踪钩(tracing
hook)三个方面。尽管目前的Rust能够支持交叉编译,但该过程需要大量的人工参与。Rust团队正试图自动化交叉编译的流程,使得用户只需要下载一个对应版本的预编译libstd库,然后执行编译/安装即可。此外,Cargo缺乏安装可执行文件的方法。Rust团队希望能够使用cargo install这样的命令,来实现Linux中make install的功能。在追踪钩方面,Rust团队深谋远虑。使用Rust一个最高级的方法就是把Rust代码嵌入到用Ruby或Python等高级语言编写的系统中。这种嵌入法一般通过为Rust代码提供一个C语言的API来完成。这种方法在目标平台运行传统GC等这种C语言友好的内存管理机制时十分高效。然而,与一个使用更高级GC的环境进行集成将会十分困难。与这些引擎进行集成需要非常小心进行代码编写工作。否则,非常小的错误都可能导致系统崩溃。为了把Rust引入到更高级GC的环境中,Rust团队计划扩展编译器的能力,使其能够产生追踪钩。这些钩子就可以被GC用来搜索堆栈和识别root,大大简化与高级VM集成代码的编写工作。


从以上分析可以看出,Rust在2016年仍将会有长足的发展。而且,从Rust语言的首届会议RustCamp 2015来看,Rust社区未来也会更加活跃。目前,Rust已经应用到OpenDNS和Skylight等生产环境,以及浏览器引擎Servo和Rust编译器等项目。Rust1.0版本代码贡献者庄晓立在一次访谈中表示,Rust未来一定会继续沿着“确保内存安全、无运行开销、高效实用”的既定方向持续发展。


今日快读


Go 1.5正式发布:实现自举、引入并发垃圾收集器』


在经历了几个Beta版本和一个rc版本之后,Go 1.5终于正式发布了。这是一个很重要的版本,实现方面有很多变化。因为这个版本仍然遵循Go 1兼容性承诺,开发团队预计,所有的Go程序应该都可以和以前一样编译和运行。二进制和源码包已提供下载。


在实现方面,最大的变化有以下几点:

1.编译器和运行时是完全用Go语言编写的(还有少量汇编),实现了自举。实现中不再涉及C语言,所以构建时也就不需要C编译器了。

2.并发的垃圾收集器,可能的情况下,垃圾收集可以和其他goroutine并发进行,可以极大降低响应时间。

默认情况下,Go程序运行时的GOMAXPROCS会被设置为可用的核数,之前默认为1。

3.对internal packages的支持扩展到所有repositories,不再是仅供核心包使用。

4.go命令对vendoring外部依赖提供了实验性支持。

5.引入了go tool trace命令,支持对程序的执行做细粒度的跟踪。


另外,Go 1.6也会继续改进GC,具体可以参考相关文档。因为Go 1.5的开发周期较长,Go 1.6的开发周期会比正常周期短一些,代码将于11月1日冻结,预计2016年2月1日发布。


点击“阅读原文”了解该语言专家在QCon即将进行的演讲


『今日快读』聚焦最新鲜的技术资讯

每日一读——聚合知识的力量


今日文章推荐


语言|给Objective-C的『悼词』

敏捷|哪些坑,不能踩

投稿请联系:

邮箱:editors@cn.infoq.com QQ:1073600161

版权归属InfoQ,禁止私自抄袭转载。

回复关键词React | 架构师 | 运维 | 云 | 开源 | 物联网 | Kubernetes | 架构 | 人工智能 | Kafka | Docker | Netty | CoreOS | QCon | Github | Swift | 敏捷 | 语言 | 程序员


戳“写评论”,告诉小编你的意见👇


 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 如何通过大数据挖掘潜在价值信息? 圣诞快乐! 【群分享.4】关于Rancher Catalog 的Online Meetup 逆流而上,独辟蹊径的Oracle Exadata数据库 微信支付网络监控工具使用说明