请选择 进入手机版 | 继续访问电脑版
点击联系客服
客服QQ:509006671 客服微信:mengfeiseo

合肥老站长

 找回密码
 立即注册
查看: 10|回复: 0

为什么在互联网领域使用Rust的项目越来越多?

[复制链接]

1

主题

1

帖子

-7

积分

限制会员

积分
-7
发表于 2021-5-17 15:05:00 | 显示全部楼层 |阅读模式



不要看这几篇好文章,说自己了解事物的网络

1. 概述   





Rust于2006年由Mozilla员工Graydon  Hoare作为个人项目创建,Mozilla从2009年开始赞助该项目。2012年首次推出Rust编译器,2015年首次推出Rust1.0稳定版本,目前Rust已发展到1.51版本。

2021年2月8日,Rust基金会成立,并将Rust商标及所有权转让给基金会。基金会创立白金会员是亚马逊、微软、谷歌、华为、莫吉拉和白金会员Facebook。

截至2021年5月,Rust在TOIBE编程语言排行榜中占24%,0.66%。

2.Rust功能

2.1.语言主要特性

类型派生Rust支持表达式类型的推断,并根据代码自动驱动表达式类型。

例如:

LET  A=1;//a是i32类型

Let  x=9.0//x是f64类型

向零成本抽象Rust添加抽象定义不会影响运营性能。

模式匹配match关键字使变量的值、范围、部分内容等匹配变得容易,使数字、字符串、函数调用等匹配,并支持逻辑或匹配。匹配的作用可以简单理解为C语言的软件。
itch语法功能的增强。

举例:

    let a = 3;
    match a {
        1 => println!("a is 1"),
        2...5 => println!(" 2 println!(" a=6 or a=8"),
        _ => println!("其它")
    }

  • 所有权
    内存所有权是Rust内存安全的核心基础。内存在一个时刻,所有权只能属于一个变量,超出作用域后,会被自动释放。所有权支持转移和借用。该机制可以有效解决空指针、野指针、内存泄漏、内存重复释放等内存问题。

    举例:

        let a = vec![1, 2, 3,4, 5];
        ...
        let b = a;  //所有权转移到b,通过a无法再访问


  • 错误处理
    Rust支持统一并简洁的错误处理方式。错误码统一,且支持同时返回值及错误码。

    Rust将错误区分未可恢复错误及不可恢复错误,支持可恢复错误传递。

    举例:

    use std::fs::File;
    fn main() {
        let f = File::open("hello.txt");
        let f = match f {
            Ok(file) => file,   // 成功处理
            Err(error) => println!("Problem opening the file: {:?}", error),  //错误处理
        };
        panic!("run here panic!"); // 不可恢错误
    }

  • 切片(Slice)
    切片是指对数据的部分引用,比如数组、字符串等。与python等语言的切片功能类似。

    举例:

        let s = String::from("hello world");
        let hello = &s[0..5];
        let world = &s[6..11];


  • 泛型
    类似于C++中的模板(Templete),可用于实现对通用类型的操作,有效提到代码抽象度,减少代码量。

    举例:

    fn max(array: &[T]) -> T {
        let mut mi = 0;
        let mut i = 1;
        while i  array[mi] {
                mi = i;
            }
            i += 1;
        }
        array[mi]
    }
    fn main() {
        let a = [1, 3, 9, 7];
        println!("max = {}", max(&a));
        let b = [2.0, 4.1, 10.2, 8.3];
        println!("max = {}", max(&b));
    }



  • 特征(Trait)
    Trait是对接口的抽象,可以指定接口的规则、默认接口实现,可以被继承、重载,可以与泛型结合使用,可以作为参数传递,也可以作为函数返回值。

    举例:

    pub struct NewsArticle {
        pub headline: String,
        pub location: String,
        pub author: String,
        pub content: String,
    }
    impl Summary for NewsArticle {
        fn summarize(&self) -> String {
            format!("{}, by {} ({})", self.headline, self.author, self.location)
        }
    }



  • 运算符重载
    与C++的运算符重载功能类似。Rust通过Trait实现运算符重载功能。

    Rust只支持有限形式的运算符重载。



  • 闭包(Closure)
    Rust的闭包与Java、Go、Python、Swift等语言中闭包概念类似,类似于这些语言中的Lambda表达式或者匿名函数。闭包通常不需要定义类型,支持对入参及返回值类型的推导。闭包支持绑定到变量中使用。闭包中支持使用外部变量。

    举例:

    let fv = n*4 + 1;
    fv(10);


  • 迭代(iterator)
    用于对变量集合的循环遍历,与其它语言中的迭代器概念类似。

    上面仅描述了rust语言的部分主要特性,完整介绍参见 https://doc.rust-lang.org/book/



    2.2 Rust程序组成形式
    一个Rust程序可以由Module、Carte、Package组成。Module是代码逻辑层面的封装,可以将实现一个功能的所有代码放在一个Module中,比如网络Module、文件系统Module等。Carte是二进制可执行程序或者库,是rust中的基本编译单元。Package将多个carte打包在一起。





    2.3 编译构建
    Rust使用rustc编译代码,编译过程中会自动进行类型检查。

    rustc编译依赖LLVM(Windows环境依赖MSVC),在嵌入式环境,还依赖于嵌入式交叉编译工具链。



    2.4 Cargo
    Rust使用Cargo进行系统构建、代码检查及包(crate)管理,同时也可以从crate.io上下载或者更新crate到本地。



    3. Rust优势与劣势
    Rust是一门赋予每个人构建可靠且高效软件能力的语言[1]。他的优势和劣势非常明显。



    3.1 Rust优势
    Rust具备系统级语言的高性能,同时也具备一些现代动态语言的功能。



    3.1.1 高性能
    Rust语言具备C/C++等语言的高性能。

    Rust运行速度快,内存利用率高,占用资源少,没有垃圾回收及运行时,可以内嵌汇编,可以与其它语言混合编程,可以像C/C一样作为系统级语言,用于操作系统、硬件驱动、嵌入式设备等的开发。



    3.1.2 安全可靠
    Rust相比C/C++更安全可靠。

    Rust通过所有权机制保证内存安全。

    Rust具备丰富类型的强类型系统,编译时编译器可以做更多的类型检查,将错误在编译阶段提前暴露出来,而不是等到运行时。

    Rust通过unsafe关键词将不安全的代码与安全代码隔离开。



    3.1.3 支持现代高级语言特性
    Rust支持泛型、闭包、迭代、切片、函数式编程、错误处理等特性。



    3.2 Rust劣势
    3.2.1 语言复杂
    Rust的语法相对比较复杂,强类型、内存所有权、unsafe机制等对于初学者上手比较困难。



    3.2.2 库较少
    Rust目前官方及第三方库较少,相关开源代码较少,很多库需要借用c语言库,或者自己重新写,对于构建复杂系统难度较高。



    3.2.3 不够稳定
    Rust语言时间较短,一直处于快速发展中。



    4. Rust在物联网上的应用与发展
    Rust性能高,占用资源少,可移植性好,支持嵌入式开发,且可集成到现有的C代码中,因此在物联网设备上,也可以使用Rust来开发。目前已加有一些公司在使用Rust实现RTOS系统、bootloader、传感器驱动、网络协议栈等。



    4.1 硬件
    Rust支持的嵌入式硬件设备范围从8bit单片机到64位4核Cortex-A53的树莓派。

    Rust支持对外设、中断、异常、IO、内存、寄存器的操作,并提供了对应的库(Crat)。

    详细文档见:

    https://doc.rust-lang.org/stable/embedded-book/start/index.html

    Rust目前已支持ARM、RISC-V,MIPS。目前已有几十款MCU,上百种硬件驱动支持rust,详见:

    https://github.com/rust-embedded/awesome-embedded-rust



    4.2 嵌入式运行环境
    1)hosted环境

    在这种环境下运行时,设备上已经运行了一个操作系统,并且提供了POSIX、文件系统、网络、内存管理、线程管理等系统接口。Rust的标准库会依赖这些接口已支撑rust程序的运行,与在PC机上运行类似。

    2)bare metal环境

    这种环境,设备本身没有操作系统,由rust程序直接在裸机上运行。此时需要使用no_std库。同时通过libcore获得与硬件平台无关的代码,并去掉嵌入式环境中不常用的功能,比如去掉动态内存分配器等。

    使用该模式,可以编译启动代码、内核等。



    4.3 支持rust的嵌入式/物联网项目
    详见 https://github.com/rust-embedded/awesome-embedded-rust



    4.3.1 RTOS
  • Drone OS
    支持Rust实时应用的嵌入式操作系统。

  • FreeRTOS.rs
    基于FreeRTOS的rust适配层

  • FreeRTOS-rust
    基于FreeRTOS.rs,增加了rust的改造,比如main的入口使用rust实现,FreeRTOS调度从rust启动等。

  • Tock
    支持在MCU上多应用并发运行的嵌入式操作系统,内核及驱动使用Rust编写。



    4.3.2 协议栈
  • runmqtt
    使用rust实现的mqtt协议

  • rubble
    使用rust实现的蓝牙ble协议栈



    4.3.3 其它
  • internet-of-streams
    使用rust创建的iot无线传感器平台。

  • rust-raspberrypi-OS-tutorials
    基于rust和树莓派硬件的嵌入式操作系统开发指导

  • boa
    使用rust实现的嵌入式JS引擎。

  • rust_sqlite
    使用rust实现的sqlite。

  • OpenSK
    谷歌开发的基于Tock OS的FIDO2蓝牙认证应用,目前支持Nordick nrf52840芯片。



    参考
    [1]: 参考 https://www.rust-lang.org/zh-CN



    更多精品好文


    物联网中也能使用区块链技术?面向IoT的区块链基础架构IoTeX

    开源硬件的前世今生

    物联网碎片化的一些思考

    边缘计算在物联网行业的应用

    物联网太难 ? 不妨试试用Python来开发

    5G会给物联网行业带来哪些变化?

    必须要了解的物联网安全知识

    ARMv9能给ARM带来新一轮腾飞吗?(安全篇)

    ARMv9能给ARM带来新一轮腾飞吗?(人工智能篇)

    国产物联网操作系统的出路在哪里?

    RISC-V架构能否引领物联网时代?

    物联网到底为什么这么火?

    谁才是物联网连接技术中的王者?

    物联网平台大量出现能否将行业带入爆发式发展

    脚本语言适合物联网开发吗

    从“嵌入式”到“物联网”的四大转变

    物联网发展新趋势
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|无图版|手机版|小黑屋|合肥@IT精英团

    GMT+8, 2021-6-19 17:23 , Processed in 18.144509 second(s), 25 queries .

    Powered by Discuz! X3.4

    Copyright © 2021, Tencent Cloud.

    快速回复 返回顶部 返回列表