阅读更多

0顶
0踩

编程语言

原创新闻 为什么你需要近距离接触Rust 1.0

2015-08-11 15:02 by 副主编 mengyidan1988 评论(0) 有5405人浏览
在不背离安全或抽象的情况下,拥有极高的运行效率,能预防几乎所有的错误,提供优越的底层控制和性能——这些都是Rust1.0版本做出的承诺,而这仅仅是个开始。



经过几年的迭代改进,Rust编程语言日前发布1.0版本。作为一种现代系统语言,Rust从大量语言(如C/C++)中取其精髓,去其糟粕,同时具备底层控制、高性能和强大的并发性。为了做到这一点,Rust打破了许多传统的取舍,它提供:
  • 内存安全却没有垃圾收集
  • 具有并发性却没有数据竞争
  • 零开销抽象
  • 稳定且没有停滞

没有垃圾收集

软件工程中,垃圾回收是一个强大的工具,让你从手动跟踪内存的烦恼中解脱,而专注于写出更好的代码。虽然有垃圾回收器很不错的,但是它在一些领域却不那么合适,诸如操作系统、嵌入式库和(软)实时应用,它们通常需要更大程度的控制和可预测性,而垃圾回收不能提供这些。

Rust允许开发人员完全放弃垃圾收集器,且不会面临忘记释放资源、悬挂指针、段错误的风险。所有权(ownership)和借用(borrowing)是Rust实现这些的关键概念,这个想法在编程中无处不在,也是现代C++的一个重要组成部分。但与其他语言不同的是,Rust把他们放在了核心地带,静态地检查和利用它们,来保证没有垃圾回收器情况下内存的安全,这是之前不能想象的东西。

关于所有权(Ownership),Rust的理念是每一个值只能有一个所有者(parent)对其完全控制。随着这些值被重新分配、放在数据结构中或传递给函数,它们的所有权会转移,且不能再通过原来的路径访问。如果超出它的作用域(scope),所有权还未被转移,它就会被自动销毁。为了使所有权在一定范围内运作,Rust提供了一种在值的作用域范围内临时借用(指针指向值)的方法。

所有权不仅替代了垃圾回收,对保证并发性也至关重要,甚至避免诸如迭代器失效这类型的bug。Rust还适用于内存以外的其他资源,例如当你关闭套接字或者文件时,可以将你从管理中解放出来。

并发性

如前所述,所有权也保证了你的并发程序不会陷入数据竞争(data races)的隐患之中。所有权会使之保持不牢固的内存模型,通过硬件来接近它。

用Rust开始一个并发程序很简单,通过标准库将闭包传递给函数:
use std::thread;
fn main() {
    let some_string = "from the parent";
    thread::spawn(move || {
        // run on a new thread
        println!("printing a string {}", some_string);
    });
}

许多并发程序设计语言的原则之一就是共享状态应该最小化或者甚至完全禁止,取而代之的是通过消息传递,所有权意味着Rust语言中的值默认只有一个所有者,所以通过通道将一个值发送给新的线程时保证原始线程不能访问它——静态禁止共享。
然而,消息传递仅仅是工具箱中的一个工具,共享内存可能也非常有用。类型系统确保只有线程安全的数据才可以在线程之间进行共享。例如,标准库提供了两种类型的引用计数:Arc提供线程安全的A共享内存(默认不可变),而Rc类型则可以放弃那些需要保证线程安全的同步,在Arc上提供一个性能提升。这种类型的系统静态地确保不会不小心从一个线程向另一个线程发送Rc值。

当你想确实想改变内存时,所有权提供了进一步的帮助。标准库Mutex类型为数据提供了一个类型参量,可以受到锁的保护。之后所有权确保这个数据只有在持有锁的时候才能访问,但你不能刻意提前开锁。这种访问控制贯穿了Rust类型系统,并被广泛的用于它的标准库。

零成本抽象性能和可预测性是Rust的目标之一,达到这个目标很重要的一步就是不但要保证安全,还要提供比C++更强大的零成本抽象。Rust允许你构建高层次抽象,编译为特定代码的范型库,避免为各种情况编写代码。

为了做到这点,Rust精确控制内存布局,数据可以直接放置于堆栈或内联在其他数据结构之间,而堆分配要比大多数托管语言少,有助于获得更好的缓存局部性,而这是现代硬件中提升性能到重要因素。

这个简单的、直接的数据布局意味着优化器可以可靠地消除函数调用和类型的层,将高层代码编译为高效和可预测的机器码。迭代器是其中一个主要的例子,下面的代码是对一个32位整数序列平方求和的惯用方法:
fn sum_squares(nums: &[i32]) -> i32 {
    nums.iter()
        .map(|&x| x * x)
        .fold(0, |a, b| a + b)
}

在整数切片上一次运算完成,当优化开启时,甚至编译为SIMD向量指令。
强大的类型

传统上,函数式编程语言提供类似代数数据类型、模式匹配、闭包和灵活的类型推断的功能。Rust是许多新开发的语言之一,它并不是直接适用具有这些特性的函数模型,而是用一种方式合并它们——允许在不损耗性能的情况下适用的一个灵活的应用程序接口(APIs)。

上面的迭代器示例得益于许多这样的想法:这完全是静态类型,但类型推断意味着不必要写明那些类型。闭包也是至关重要的,它允许简洁地编写操作。

在多数主流编程语言中,代数数据类型是枚举(enums)的一个扩展,它允许一个数据类型由一组离散的选择组成,且每个选择都会附加信息:
struct Point { 
    x: f64, 
    y: f64 
} 
enum Shape { 
    Circle { 
        center: Point, 
        radius: f64 
    },
    Rectangle {
        top_left: Point,
        bottom_right: Point 
    },
    Triangle { 
        a: Point, 
        b: Point,
       c: Point
    }
}

模式匹配是使操纵这些类型变得简单的关键,如果shape是一个Shape类型的值,你可以处理各种可能性:
match shape {
    Shape::Circle { radius, .. } => println!("found a circle with radius {}",  
radius),
    Shape::Rectangle { top_left: tl, bottom_right: br } => {
         println!("found a rectangle from ({}, {}) to ({}, {})", 
                 tl.x, tl.y, 
                 br.x, br.y)
    }
    Shape::Triangle { .. } => println!("found a triangle"),

这些编译器可以确保你解决所有情况(选择性加入一个catch-all分句),并极大程度地帮助重构。
枚举(enums)也使得Rust防治所谓的“价值数十亿美元”的错误:空引用(null references)。在Rust中引用永远不会是空的,选择类型允许你以一种类型安全、本地化的方式选择nullability。

结论

Rust是一种由Mozilla赞助的语言,它在保留C++性能的同时提供零开销抽象,用于web浏览器开发,还能同时保证内存安全和缓解并发编程的压力。

Rust填充了一个也许被认为是不可能的利基:在不背离安全和抽象的情况下,提供底层控制和性能。当然,世界上没有免费的午餐,编译器作为一个要求 助理不能容忍一点点风险,而且所有权模式还有点陌生,需要一些时间学习。

1.0版本的核心语言和库已经被测试和精炼过,而且重要的是关于稳定的保证:现在编译的代码应该也可以在未来的新版本中得到编译。并且,这个版本并不意味语言的完成,Rust正在采用火车模型,新版本每六周发布一次,新的和不稳定的特性可以通过常规的预发布版本betas和nightlies发现。目前,一个标准的包管理器Cargo已经被用来建立一个不断增长的库系统。

正如语言一样,Rust生态还不完善,所以没有像许多老一辈的语言提供的那样宽广的工具和包(简单的FFI虽然对后者有所帮助)。尽管如此,语言本身是强大的,也是一个没有传统危险的,去做底层开发很好的方式。

原文链接:Why you should take a closer look at Rust 1.0
  • 大小: 22.9 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Oracle Exception:missing right parenthesis

    今天在做Oracle数据库实验(游标实验,有一部分是建表操作)的时候命令行总是报异常——missing right parenthesis,尝试了各种建表语句格式还是一筹莫展…根据命令行的提示,在上图中的*号所标志的地方把auto_increment去掉就能正常运行了。 由于是刚从Mysql数据库中转到Oracle数据库上来,很容易犯一下这种简单的想当然的错误….╭(╯^╰)╮

  • 【Oracle】ORA-00907:missing right parenthesis右括号缺失

    oracle报错:missing right parenthesis; 报错SQL select rownum,rowid from( select rowid rid,a.amt from user a order by amt desc; ) where rownum<10; 这里报错右括号缺失,是因为子查询里多了个分号…...

  • MYSQL数据迁移tips,ORA-00907: missing right parenthesis

    这一段时间,公司项目计划是旧数据的迁移,从MYSQL迁移至ORACLE,开了无数次会,讨论了若干次。错误现象:在从MYSQL导出sql脚本后,在oracle相关工具里执行创建表的sql时,如下,有所删改:  CREATE TABLE TEST_TBL (  id NUMBER (6) NOT NULL ,  name varchar2(16) NOT NULL default ,  tel v

  • oracle 缺失右括号 (missing right parenthesis)

    这里简单的记录一下! 这种无非是sql有问题:第一种可能:sql真的确实括号,或者是sql的拼接问题,仔细一找就出来了。 另一种是我刚遇到的,sql嵌套子查询中用了 order by。 // 这里只粘贴一部分 AND HIS.ASSORTMENT_CODE IN (SELECT ASSORTMENT_CODE FROM ASSOR***CREW WHERE COMPANY_CODE = ...

  • Oracle报错:missing right parenthesis什么问题?

    missing right parenthesis 全少反括号 应该是你之打了前括号,后面没跟反括号。 VACHAR2()注意后面的括号  

  • 为什么你需要近距离接触 Rust 1.0

    在不背离安全或抽象的情况下,拥有极高的运行效率,能预防几乎所有的错误,提供优越的底层控制和性能——这些都是Rust1.0版本做出的承诺,而这仅仅是个开始。 经过几年的迭代改进,Rust编程语言日前发布1.0版本。...

  • [转]为什么你需要近距离接触Rust 1.0

    在不背离安全或抽象的情况下,拥有极高的运行效率,能预防几乎所有的错误,提供优越的底层控制和性能——这些都是Rust1.0版本做出的承诺,而这仅仅是个开始。

  • Rust 1.0发布的这一年

    原文:One year of Rust 作者: Aaron Turon 译者:范长春,中科院自动化研究所毕业,在微软中国STC部门工作两年,后来加入了百纳武汉做android版海豚手机浏览器,目前在武汉的另外一家创业公司工作。从事过...

  • Rust语言中文教程RustPrimer的诞生记(开放下载)

    作者:唐刚(GitHub),Rust中文社区站长、妈咪问问CEO,前美洽网络联合创始人兼CTO,曾在龙芯梦兰担任近3年的研发工程师。 责编:钱曙光,关注架构和算法领域,寻求报道或者投稿请发邮件qianshg@csdn.net,另有「...

  • Rust 1.8发布,放弃了Unix系统的Make编译系统

    Mozilla上周发布了Rust 1.8,一个系统级别的编程语言,提供与C语言相当的编译速度,和高级别的安全性。这次更新最值得关注的是,Rust放弃了Unix系统的Make工具,使用Rust自己的Cargo包管理工具。为了实现自托管,...

  • 你可能并不了解的 Rust 中国社区:写在 RustCon Asia 之前

    2012年1月24日,在中国最大的问答社区「知乎」,名为「题叶」的网友,创建了「Rust(编程语言)」话题,那时候这门语言还无人问津。2013年9月16...

  • Rust 开发者的 2019 年

    本文来自 alabulei1 的翻译投稿:http://www.secondstate.info/blog/rust-2019?from=singlemessage最近 Rust 社区发...

  • Go 2.0 正式落地,已发生翻天覆地变化!

    作者 | 柴树杉 责编 | 屠敏出品 | CSDN(ID:CSDNnews)回忆 2019 年,彼时年底在 Go 2.0 刚启动时,一场“黑天鹅事件”的突然到来,引发了全民抗疫。如今时隔三年之后的 2022...当我们在谈 Go 2 时,究竟指的是什么...

  • 【精读】1234- 上帝视角来看 2022 年前端趋势

    来自上帝视角的总览这是一份来自未来的文档,感谢你对前端技术领域持续关注。编程语言趋势大观:Python 反超 JavaScript数据来源Github根据 Github 的相关数据我们可...

  • Deno 如何偿还 Node.js 的十大技术债?

    Ryan Dahl 坦言 Deno 距离 1.0 还有很长一段路要走,仍旧是一个非常新的技术。不过,“再等我1年,若有企业想用,请Email给我,我会提供技术支持。” 他认真地说。 \n 关于Ryan Dahl \n 2009年11月8日,Node. js之 ...

  • 来自未来,2022 年的前端人都在做什么?

    来自上帝视角的总览这是一份来自未来的文档,感谢你对前端技术领域持续关注。编程语言趋势大观:Python 反超 JavaScript数据来源Github根据 Github 的相关数据我们可...

  • 从3年前接触区块链, 到开发出装机量最大客户端Geth, 看看人家的职业发展之路|人物志...

    记者 | Aholiab出品 | 区块链大本营Go-Ethereum,因为是用Go语言编写的,也简称为Geth。Go-Ethereum是以太坊基金会提供的官方客户端软件,...

  • 【Web3】什么是Web3?一个新的去中心化网络,或是最新的营销流行语

    Web3已成为一种将区块链、智能合约和去中心化应用程序结合在...Web3有望成为一个去中心化的、不可变的web版本,不存在中间人,并具有与加密货币、不可替代代币(NFT)和以分布式账本(DAPP)为基础的新型去中心化...

  • 一文看懂蓝牙在物联网中的应用场景

    蓝牙作为一项发明于上世纪的近距离无线通信技术,在手机,电脑领域已经有了充分地基础,那么这项技术在物联网领域又会有哪些应用场景呢? 蓝牙技术的优势 蓝牙标准是由蓝牙技术联盟(Bluetooth Special Interest ...

  • 上帝视角来看 2022 年前端趋势

    大厂技术高级前端Node进阶点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群来自上帝视角的总览这是一份来自未来的文档,感谢你对前端技术领域持续关注。编程语言趋势大...

Global site tag (gtag.js) - Google Analytics