自学内容网 自学内容网

Rust之抽空学习系列(二)—— 编程通用概念(上)

Rust之抽空学习系列(二)—— 编程通用概念(上)

 
Rust 作为一门强类型的静态类型语言,会有哪些与生俱来的天赋呢?

1、静态类型语言 vs 动态类型语言

特性静态动态
类型检查编译时运行时
错误检测执行前执行期间
代码灵活性
性能通常更快可能会更慢
代表Rust、Java、C#Python、JavaScript

静态主要对应编译时,而动态对应运行时

下面这段Rust代码在显式声明变量a的类型为i32(当然根据初始值Rust也能够推导出来),编译期这个类型被确定下来
此时,你可以修改这个变量的值,至于类型嘛,已经板上钉钉了(Rust是静态类型)

fn main() {
    let a: i32 = 10;   // 显式指定类型为i32
    println!("a: {}", a);
}   

但是像Python这种动态类型就比较好说话了,随便写,换个类型都不是事

x = 10    # 并未声明类型
print(x)
x = 'hello'   # 重新赋值,换成字符串类型
print(x)

2、强类型 vs 弱类型

特性强类型弱类型
数据类型声明显式、隐式隐式
类型约束严格宽松
类型转换需要显式进行隐式进行
隐式转换少见/罕见常见
错误检查多在编译时多在运行时
类型安全性高;较少出现意外行为低;更容易出现不可预期的结果
代表Rust、Java、PythonJavaScript、PHP

像Rust这种强类型语言是比较严格的,通常是不会允许有隐式转换的,规规矩矩,呆板有呆板的好处
下面这段代码,x和y显然是两种不同类型的值,那么这个加法显然不太合理,Rust看到这种就是手起刀落,提示这是不支持的操作,开发者此时就被迫思考,想清楚自己要做什么,减少bug产出
在这里插入图片描述
而像JavaScript这种弱类型的语言,用过的都知道,写起来一时爽,自由度挺高的,找bug嘛,就比较麻烦了,尤其像那种不经意就给整到隐式转换里的
像下面这段,如果你是想10 + 20结果是30的,就错了,JS帮你全转成字符串了,你自己如果不检查,代码自身又检测不出这种问题,很有可能就被藏起来
在这里插入图片描述

3、编译型 vs 解释型

3.1、编译型

编译型语言通常是开发者编写完代码,然后由编译器进行编译,生成对应的可执行文件(包含机器码内容),并且最终将这个可执行文件分发给用户,用户直接拿来就可以运行
在这里插入图片描述

3.2、解释型

解释型语言则是开发者编写完源代码,然后将代码的副本给用户,用户的机器上安装上解释器,然后解释器将代码逐行解释执行
在这里插入图片描述

3.3、对比

特性编译型语言解释型语言
编译过程需要编译步骤来生成可执行文件无需编译,代码直接由解释器执行
编译时间编译大型项目可能耗时较多即时反馈,无需编译
依赖性只需二进制文件和必要的库即可执行需要安装解释器才能执行代码
可移植性需要为不同平台重新编译任何有解释器的平台都可以运行
执行速度通常更快通常较慢
内存使用通常更节省内存,编译时会进行优化由于解释开销,通常会占用更多内存
修改和测试修改后需要重新编译,迭代较慢修改后可以直接测试,无需重新编译,迭代较快
代表C、C++、Rust、GoPython、JavaScript、Ruby

中间方法
类似Java和C#
结合了编译型语言解释型语言各自的特点进行融合
编译过程:编译成中间产物,没有直接生成机器码,生成了与平台无关的中间语言,作为程序集分发给使用者
执行过程:通过运行时进行程序集加载,由JIT编译为本地机器码通过优化适应硬件环境,一方面具有较高执行效率,另一方面又具有跨平台的灵活性

4、栈内存 vs 堆内存

内存中的数据主要存储在这两大结构上

4.1、栈(Stack)

按接收数据的顺序存储并且以与之相反的顺序移除适合存储已知固定大小的数据,遵循后进先出(LIFO)原则
通常由
系统自动分配和释放
,访问速度快,但是大小比较有限
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/68296954b6a04a07b18d91e1368daa2a.png

4.2、堆(Heap)

允许存储在编译期未知大小的数据,访问速度较慢(访问堆内存这部分)
通常需要开发者自己控制分配与释放,或者GC的支持,结构无序,管理难度较大
实际的使用中通常配合栈内部的指针变量进行访问
在这里插入图片描述

4.3、堆管理问题

  • 双重释放
  • 内存泄漏

Rust 中采取所有权机制在不使用GC的情况下依然能够很好地管理堆内存的使用,是其一大特色

https://www.bilibili.com/video/BV1QB2wYmEbR


原文地址:https://blog.csdn.net/qq_38910403/article/details/144324495

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!