You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
let x = 5;let y = x;println!("x = {}, y = {}",x, y);// 有效的let x = String::from("hello");let y = x
println!("x = {}", x);// 无效的println!("y = {}", y);// 有效的
所有权与函数
fnmain(){let s = String::from("hello");// s 被声明有效takes_ownership(s);// s 的值被当作参数传入函数// 所以可以当作 s 已经被移动,从这里开始已经无效(和js表现不一样)let x = 5;// x 被声明有效makes_copy(x);// x 的值被当作参数传入函数// 但 x 是基本类型,依然有效// 在这里依然可以使用 x 却不能使用 s}// 函数结束, x 无效, 然后是 s. 但 s 已被移动, 所以不用被释放fntakes_ownership(some_string:String){// 一个 String 参数 some_string 传入,有效println!("{}", some_string);}// 函数结束, 参数 some_string 在这里释放fnmakes_copy(some_integer:i32){// 一个 i32 参数 some_integer 传入,有效println!("{}", some_integer);}// 函数结束, 参数 some_integer 是基本类型, 无需释放
Rust 是什么?
Rust 语言由 Mozilla 开发,最早发布于 2014 年 9 月。一门通用系统级编程语言。特点是高性能(系统级底层),高可靠性(内存安全)
Rust 可用于开发
https://www.rust-lang.org/zh-CN/
2021 Rust 行业报告
https://mp.weixin.qq.com/s/9rjeVgVzmrC0wWhV4wA9FA
Why Rust
大型前端项目的编译和构建,用 js 写的工具链等基础设施不能满足要求。
swc(Rust)、esbuild(go)的出现,越来越多的框架倾向于选择非 JavaScript 的编译工具来实现提速,Babel 不再是此方向的唯一选择。未来前端相关的基础设施都可能被 Rust 重写。
https://github.com/evanw/esbuild
安全性 https://new.qq.com/omn/20200723/20200723A06ATL00.html
WebAssembly
安装
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装 rustup 工具链
判断是否正确的安装:
rustc --version
Hello World
使用 Cargo
Cargo 是 Rust 工具链中内置的构建系统和包管理工具
cargo run(构建+运行)
常用命令
版本更新
rustup update
查看版本
cargo --version
构建项目
cargo build
运行项目
cargo run
测试项目
cargo test
为项目构建文档
cargo doc
将库发布到 crates.io
cargo publish
说明
需要用的包去 https://crates.io/ 找。类似 https://www.npmjs.com/ 。可自己发包。
cargo new --lib
核心概念
所有权系统
内存
管理内存
C/C++:这样的语言主要通过手动方式管理内存,开发者需要手动的申请和释放内存资源。如果没有正确的释放内存,容易产生 bug。(malloc申请内存)
Java:JVM 具备自动回收内存资源的功能。但这种方式常常会降低运行时效率,所以 JVM 会尽可能少的回收资源,这样也会使程序占用较大的内存资源。(通过垃圾回收完成内存的自动管理)
使用了包含特定规则的所有权系统来管理内存,这套规则允许编译器在编译过程中执行检查工作,来识别内存安全的问题。
设计了一套语法机制,使用这种语法在编译阶段就能更有效地分析内存资源的有用性以实现内存管理
编程语言的世界观
一门编程语言的诞生,一定有它想解决的问题。而围绕着这个问题。
所有权规则
例子:
变量与数据交互的方式(数据传递)
js中值传递(基本数据类型)和引用传递(对象)
发生克隆的情况
trait 可以理解为接口。java 中的 interface。
发生移动的情况
所有权与函数
有返回值的情况
有返回值的函数,会将返回值的所有权移动到调用函数的地方。(s3获得所有权)
引用与借用
如果想调用一个函数,还能继续使用 String 呢?
「引用符号 &」
通过引用传递参数给函数的方法也被称为借用
默认是不可变引用。比如想要在 calculate_length 改变字符串的内容,是不会被允许的。需要
引用规则:
软件中缺陷
不同阶段和解决时间
早发现,早隔离,早诊断,早治疗
WebAssembly
概念
WebAssembly是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如C / C ++等语言提供一个编译目标,以便它们可以在Web上运行。它也被设计为可以与JavaScript共存,允许两者一起工作。
诞生
C++ 经过 Emscripten 编译成字节码,字节码编译成 js
游戏改成 js 性能低,有了 asm.js
浏览器原生支持 WebAssembly
http://webassembly.org.cn/
https://developer.mozilla.org/zh-CN/docs/WebAssembly
现状
https://blog.scottlogic.com/2021/06/21/state-of-wasm.html
Rust 和 WebAssembly
有两大主要使用场景
https://developer.mozilla.org/zh-CN/docs/WebAssembly/Rust_to_wasm
更好用的脚手架
https://github.com/lencx/vite-plugin-rsw
参考:
https://software-lab.org/publications/www2021.pdf
透过 Rust 探索系统的本原:编程语言
https://mp.weixin.qq.com/s?__biz=MzA3NDM0ODQwMw==&mid=2649828932&idx=1&sn=4a580c729ec39823d9d53ec65734ed3d
透过 Rust 探索系统的本原:内存管理
https://mp.weixin.qq.com/s/1juaadR3AqHa8H19sHWHmQ
十年磨一剑,WebAssembly 是如何诞生的?
https://mp.weixin.qq.com/s/rmvdVLeV049zcZs9dpTQ_A
遇到的问题
rustwasm/wasm-pack#705 (comment)
rustwasm/create-wasm-app#146
The text was updated successfully, but these errors were encountered: