type
status
date
slug
summary
tags
category
icon
password
参考资料:
我是从智能合约了解到 Rust 语言的, 几个月前关注了一个公链叫做 near, 它不像 eth 使用 solidity, 而是是使用了目前已有的 JavaScript 和 Rust 作为了他的合约编程语言, 并且强调了对于高价值的合约, 建议使用 Rust. 这个引起了我的兴趣, 于是找资料 阅读了Rust相关文档, 在这里总结一下, 关于 Rust 项目实战还是留坑吧, 学习曲线确实有点高.
  1. Rust 的优势
Rust 给人的第一观感是硬核,严谨的语言, Rust 直接丢弃了垃圾回收(GC), 用所有权 ownership 辅以严格的代码编译前 检查, 以及语言层面的优化(比如对 null 的定义), 保证了高效正确运行. Rust 应该有目前最严谨的编译器, 这个编译器 就是第一 code reviewer, 代码疏漏和错误都会标注并提醒. 也就是说, 经过编译的 Rust 代码, 基本就能保证程序 运行时的准确, 减少了项目运行后 debug 的痛苦.
Rust 质量很高, 其实这点对于初学者来说体会不到, 但是 Rust 编写的一部分基础设施已经合并到 Linux 内核中,对于Linus Torvalds这么有洁癖的人能够对 Rust 有如此高的评价, 就可以看到 Rust 到底值不值得花时间学习.
Rust可能是WebAssembly的未来之星! 现在的前端技术其实已经出现了瓶颈, 浏览器不仅仅只能填填表格, 看看电影了, 浏览器应该可以打游戏(3A 大作), 可以运行数据库, 可以做任何不同平台客户端的事情, 如果可以出现这种局面, 那么就不会 有跨平台开发的问题, 全部统一成浏览器就好了. 如果对于浏览器做这种要求, 目前的前端技术就有点捉襟见肘, WebAssembly 就是解决方案, 并且, WebAssembly不仅仅应该运行在本地的浏览器中, 还会运行在云上, 替代目前大行其道的容器化.
Rust 可能是未来区块链智能合约的主力语言, solidity 表达力太弱, 有些太胶水了, 像是十几年前的易语言, Rust 的严谨性可以满足区块链对于资产定义的要求, 其他方面对比目前的 solidity, move 更成熟.
  1. rust 的核心概念总结
所有权 ownership
目前有三种主流的内存管理方式: 1. 垃圾回收机制(GC),在程序运行时不断寻找不再使用的内存, 比如 go, 这也是为什么我们需要尽量的提升 go 的版本, go的垃圾回收机制是在不断优化的, 更高的版本可能意味着 更好的运行效率 2.手动管理内存的分配和释放: 在程序中, 通过函数的调用来申请和释放内存, 比如 c++. 3.通过 所有权来管理内存: 编译器在编译期间, 会运行一系列的规则进行检查, Rust 就是属于这种, 这种检查只发生在编译 期, 因此在程序运行期, 不会有任何性能损失.
栈和堆的异同:
都是为程序在运行期间, 提供可使用的内存空间, 但是他们在组织结构上有区别.
栈: fifo(先进先出), 固定的数据长度.
堆: 结构更加松散, 在堆上分配空间, 首先请求一定大小的内存空间, 在改位置标记为已用(allocating),然后返回表示该 内存地址的指针, 这个过程叫做在堆上分配内存, 然后将该指针推入栈中, 后续使用过程中, 首先获取栈里的指针地址, 然后 读取该数据在堆上的实际位置.
运行一个函数, 就是将堆里的数据 + 栈里的本地变量推送给函数处理.
所有权的规则: 1.Rust 中每一个值都被一个变量所拥有,该变量被称为值的所有者
一个值同时只能被一个变量所拥有,或者说一个值只能拥有一个所有者
当所有者(变量)离开作用域范围时,这个值将被丢弃(drop)
 
 
引用与借用 references and borrowing
& 是引用, 允许使用值, 但不拥有所有权
  1. 在同一作用域, 特定数据只能有一个可变引用。
编译器borrow checker的特征之一,在编译器就避免数据竞争: 数据竞争可能由: 1.两个或多个指针同时访问数据, 2.至少 有一个指针被用来写入数据 3.没有同步访问数据的机制
  1. 引用必须是有效的
悬垂引用(dangling references): 指针指向某个值后,这个值被释放了。
 
 
enum和空值null
在其他编程语言中, 往往有一个null关键字,表示当前的变量值为空(不是0值),表示值不存在,但是如果对这个值进行处理前不检查null,就容易造成程序崩溃。
这种错误非常普遍,比如尝试使用一个null当not-null值使用。但是,null概念仍然有用,不能剔除,null也是一个值,只不过目前因为某些原因缺失(和go的error as value有异曲同工之妙)。
In his 2009 presentation “Null References: The Billion Dollar Mistake,” Tony Hoare, the inventor of null, has this to say:
I call it my billion-dollar mistake. At that time, I was designing the first comprehensive type system for references in an object-oriented language. My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn’t resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.
 
 
kurtosis本地搭建测试环境高内聚, 低耦合