发布 Rust 1.59 编程语言,支持汇编插入

Rust 1.59 通用编程语言的发布已经发布,该语言由 Mozilla 项目创建,但现在由独立的非营利组织 Rust 基金会赞助开发。 该语言专注于内存安全,并提供了实现高作业并行性的方法,同时避免使用垃圾收集器和运行时(运行时减少为标准库的基本初始化和维护)。

Rust 的内存处理方法使开发人员在操作指针时避免错误,并防止由于低级内存处理而出现的问题,例如在内存区域被释放后访问它、取消引用空指针、缓冲区溢出等。 为了分发库、提供构建和管理依赖项,该项目开发了 Cargo 包管理器。 crates.io 存储库支持托管库。

Rust 在编译时通过引用检查、跟踪对象所有权、跟踪对象生命周期(范围)以及评估代码执行期间内存访问的正确性来提供内存安全。 Rust 还提供防止整数溢出的保护,要求在使用前初始化变量,更好地处理标准库中的错误,默认应用不可变引用和变量的概念,并提供强静态类型以最小化逻辑错误。

主要创新:

  • 可以使用汇编语言插入,这在需要控制低级别执行或能够使用专用机器指令的应用程序中是必需的。 使用宏“asm!”添加程序集插入和“global_asm!” 使用字符串格式化语法来命名寄存器,类似于 Rust 中的字符串替换。 该编译器支持 x86、x86-64、ARM、AArch64 和 RISC-V 架构的汇编指令。 插入示例:使用 std::arch::asm; // 使用移位将 x 乘以 6 并相加 let mut x: u64 = 4; 不安全 { asm!( "mov {tmp}, {x}", "shl {tmp}, 1", "shl {x}, 2", "add {x}, {tmp}", x = inout(reg ) x, tmp = out(reg) _, ); (x, 4 * 6);
  • 添加了对解构(并行)赋值的支持,其中在表达式的左侧指定多个特征、切片或结构。 例如:let(a,b,c,d,e); (a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; 结构体 { e, .. } = 结构体 { e: 5, f: 3 }; assert_eq!([1],[a,b,c,d,e]);
  • 已经提供了为const泛型指定默认值的能力:struct ArrayStorage { arr:[T; N], } 隐式阵列存储{ fn new(a: T, b: T) -> ArrayStorage { ArrayStorage { arr: [a, b], } } }
  • Cargo 包管理器提供有关在由于编译器错误而处理的依赖项中使用无效结构的警告(例如,由于错误,允许在安全块中借用打包结构的字段)。 Rust 的未来版本将不再支持此类构造。
  • Cargo 和 rustc 具有内置功能,可以生成去除调试数据 (strip = "debuginfo") 和符号 (strip = "symbols") 的可执行文件,而无需调用单独的实用程序。 清理设置是通过 Cargo.toml 中的“strip”参数实现的: [profile.release] strip = “debuginfo”, “symbols”
  • 增量编译默认是关闭的。 据说原因是编译器中导致崩溃和反序列化错误的错误的临时解决方法。 错误修复已经准备就绪,并将包含在下一个版本中。 要返回增量编译,可以使用环境变量 RUSTC_FORCE_INCRMENTAL=1。
  • API 的新部分已移至稳定类别,包括特性的方法和实现已稳定:
    • std::thread::available_parallelism
    • 结果::已复制
    • 结果::克隆
    • 拱门::汇编!
    • 拱门::global_asm!
    • ops::ControlFlow::is_break
    • ops::ControlFlow::is_continue
    • 尝试从 u8 开始
    • char::TryFromCharError(克隆、调试、显示、PartialEq、复制、Eq、错误)
    • 迭代器::zip
    • NonZeroU8::is_power_of_two
    • NonZeroU16::is_power_of_two
    • NonZeroU32::is_power_of_two
    • NonZeroU64::is_power_of_two
    • NonZeroU128::is_power_of_two
    • ToLowercase 结构的 DoubleEndedIterator
    • ToUppercase 结构的 DoubleEndedIterator
    • TryFrom<&mut [T]> 为 [T; ]
    • Once 结构的 UnwindSafe
    • RefUnwindSafe 一次
    • aarch8 编译器内置的 armv64 neon 支持函数
  • 函数中使用了“const”属性,它决定了在任何上下文中使用它而不是常量的可能性:
    • mem::MaybeUninit::as_ptr
    • mem::MaybeUninit::assume_init
    • mem::MaybeUninit::assume_init_ref
    • ffi::CStr::from_bytes_with_nul_unchecked

来源: opennet.ru

添加评论