当前位置: 首页 > news >正文

Rust语言:安全地并发

http://www.csdn.net/article/2014-02-26/2818556-Rust

http://www.zhihu.com/question/20032903

Rust是近两年Mozilla正在开发的一种新编程语言,以并发、安全和实用为口号,主要使用场景是系统编程,用来取代C++语言的角色。它有颇多新颖之处,能帮助我们了解编程语言设计的流行趋势。

Rust是近两年Mozilla正在开发的一种新编程语言,它以并发、安全和实用为口号,主要使用场景是系统编程,用来取代C++语言的角色。由于Rust还在快速的开发和演进中,每个版本都会产生一些不兼容的变更,现在也许并非是学习这门语言细节,并真正使用它的最佳时机。不过,这并不影响我们了解Rust语言:作为多年来鲜有的新系统编程语言,它有颇多新颖之处,也可以帮助我们了解一些编程语言设计的流行趋势。

并发

与现在流行的很多新语言一样,Rust在语言层面支持了绿色线程(Green threads)——Task。Task作为并发执行的单元,是用户空间的“线程”,创建和调度成本较低,可以大量共存。Task之间通过消息传递通信,没有直接共享数据。从最近的流行趋势来看,绿色线程几乎已成为并发方案大战的最终赢家。除了Rust,之前流行的Go、Erlang、Python的Gevent,以及最近Clojure世界里正在发展的core.async,采用的都是这种绿色线程模式。

绿色线程的程序与传统多线程程序的写法几乎一致。在编写服务器程序时,与事件驱动的回调机制相比,编写更简单、表义更清晰。当并发任务增多时,传统的多线程程序由于启动线程和调度线程的成本高而使系统整体性能降低。而绿色线程可以基本不受限制,随意创建。Rust文档指出,在32位系统上可以支持数十万个Task同时存在。

Task也是Rust程序的基础单元,一个Rust进程由多个并行的Task组成,main函数本身也是一个Task。Task之间通过一个(Port, Chan)元组传递数据。Port和Chan相当于管道的两端,Port用于取数据,Chan用于发送数据。下面的例子里,我们通过do spawn语法(类似Ruby的block语法),启动一个新Task,并打印收到的数据。

引用系统

Rust语言设计的核心是安全性(这里安全性是指Safety,而非Security)。Rust希望通过语言的机制和编译器的功能,把程序员易于犯错、不易检查的问题解决在编译期,避免运行时的Segmentation Fault。Rust的设计可以说是处处小心。Clojure语言强调可变性给编程带来的复杂性,在Rust语言中,设计者对这点也有格外的重视。除非特别声明为mut,所有Rust的局部变量默认都是不可变的,对不可变变量值的修改会导致编译器直接报错。Rust的安全性还通过独有的引用类型系统来实现。

Rust语言中对内存块的引用类型叫做box。最新版本的Rust在语言层面只保留了一种owned box,它在使用时具有一种所有权(Ownership)的概念,只有具有所有权的变量才可以访问这段内存。owned box在同一时刻只允许一个变量作为所有者,它的变量赋值称为move。一旦owned pointer被赋值,用户就无法通过原先的引用访问这块数据,这种错误会在编译时检查。下面是一个简单的例子。

~代表owned box,这里我们把一个包含值为50的owned box赋给owned pointera。然后把a的所有权通过赋值的形式move给b。最后我们试图通过*a访问这个值。在C语言里,这时a和b同时指向统一块内存,可以通过*a访问到这里的值。但Rust的所有权机制给予了这段内存额外的保护。编译这段程序将失败:

编译器会明确地指出错误的引用在何处被move。事实上所有owned box的生命周期管理都是直接在编译时完成的,编译器通过静态检查跟踪使用情况,完成内存开辟和回收。这是Rust确保编程正确、安全的重要手段。

新版本的Rust在标准库中提供std::rc::Rc(引用计数)和std::gc::Gc(垃圾回收)类型,取代了原先的managed box,用来提供可以有限共享的引用类型。

在Task间传递数据,如果要避免数据拷贝,也有专门的引用类型:用于不可变数据的(atomically reference counted,原子的引用计数类型),以及用于可变数据的(带读写锁的原子引用计数类型)。在操作可变数据时,通过内在的读写锁控制对共享数据的访问,从而在API层面实现安全性。

Rust谨慎地定义如此繁多、各具功能的引用类型,就是希望用户在编程过程中,根据应用场景、引用的功能职责,选择合适的类型,进而在引用类型系统和编译器的保护下,减少在运行时出错的机会。这一点也和Clojure的4种引用类型的设计初衷类似,不过Clojure并不能提供太多编译时的安全保护。

更多

篇幅所限,我只选择了Rust最具特点的两个部分介绍。Rust是一门特点鲜明、设计精巧的语言,而绝非普通的“又一门编程语言”。在语法层面,它包含了模式匹配、闭包、泛型等流行功能,作为系统编程语言,使用的舒适度不亚于脚本语言。另外还可以通过FFI(Foreign Function Interface)调用已有的C语言库,满足了实用性的需要。

如果你也开始对这门新语言感兴趣,可以:

 

  •  通过它的文档学习最新版本的语法和细节;
  •  加入rust-dev邮件列表了解开发者的讨论;
  •  关注Rust项目代码仓库;
  •  关注Delicious和Reddit上流行的Rust链接;
  •  关注TheweekinRust,介绍每周Rust语言正在发生的变化(http://cmr.github.io/)。

 

作者孙宁,AVOS Cloud高级工程师,负责服务器端开发。Clojure语言爱好者,社区活跃成员,开发维护了多个Clojure开源项目。

转载于:https://www.cnblogs.com/code-style/p/3571276.html

相关文章:

  • python基础===python中文手册
  • 便是管理,不是管理
  • 6-1 接口的特性
  • 驱动和应用层的三种通信方式
  • 《Java编程思想》笔记03------访问权限控制
  • 记笔记与博客
  • 树的遍历
  • 菜鸟配置SAMBA服务之1
  • Qt动态设置布局中的控件
  • CISCO无线AP胖瘦升级
  • dotcms总结
  • 设计模式的原则
  • electron
  • 基于BIND实现DNS的解析、主从、子域、请求转发、访问控制
  • Mysql初始化root密码和允许远程访问
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CSS 专业技巧
  • css系列之关于字体的事
  • Java精华积累:初学者都应该搞懂的问题
  • Python连接Oracle
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • select2 取值 遍历 设置默认值
  • vue 个人积累(使用工具,组件)
  • vue--为什么data属性必须是一个函数
  • Web标准制定过程
  • yii2中session跨域名的问题
  • 成为一名优秀的Developer的书单
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 简单数学运算程序(不定期更新)
  • 将 Measurements 和 Units 应用到物理学
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 一文看透浏览器架构
  • PostgreSQL之连接数修改
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #QT(一种朴素的计算器实现方法)
  • $jQuery 重写Alert样式方法
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (四) Graphivz 颜色选择
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 托管代码与非托管代码
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET微信公众号开发-2.0创建自定义菜单
  • .net与java建立WebService再互相调用
  • @Autowired标签与 @Resource标签 的区别
  • @EventListener注解使用说明
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C/C++] -- 二叉树
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数