相比于“面向过程”的C,“面向对象”的C++和JAVA等,终于有一门编程语言开始正视“计算机”的需求了,“计算机”终于站起来了(不是)!
“面向内存”的、新一代编程语言——Rust
Rust与以往C、C++、JAVA、GO等语言最根本的不同,不在于独特的语法特性,而是其对于系统内存的管理模式发生了根本性的变化。
在Rust出现以前,编程语言的内存管理分为手动管理和自动管理两个阵营。
手动内存管理以C和C++为代表,需要在代码中显式地进行内存的分配与回收,对开发者的水平要求较高,稍有不慎,便有造成内存泄露的风险。
自动内存管理以JAVA语言为例,通过JVM的GC机制,自动识别哪些对象是不再需要的,从而进行内存回收。由此诞生了一系列的关于内存分配、对象标记、可达性分析、回收等功能的算法和数据结构。
相较于手动内存管理,自动内存管理显著降低了开发者的心智负担,内存在程序开发者眼中变得愈发透明,使得其可以专注于业务实现。但缺点也是显而易见的——性能,性能,还是***性能!尽管一代又一代的虚拟机对垃圾回收算法不断地进行优化,并行GC,甚至某些语言号称速度媲美C/C++,但是更大的内存开销,GC过程中的STW,依然是自动内存管理语言绕不开的性能墙。
手动与自动,似乎在逻辑上已经填满了内存管理的实现方式,按照常规的拓展思路,最多可以再添加个“半自动”阵营?
但Rust走出了另外一条路。
它对程序中数据生命周期的认知提升了一个层次。
在Rust之前的编程语言,无论是手动内存管理还是自动内存管理,都认为数据的生命周期是混沌的,或者说是难以明确定义的。
何时需要进行内存回收,完全取决于程序如何实现,只有程序开发者知道那个合适的时机(或者开发者自己也不是很清楚)。
但Rust告诉我们事情不是这个样子,数据的生命周期完全可以在程序实现的同时被确定,并由此提出了所有权和借用的概念。
Rust找到了规律,并通过一系列的语法规则保证了这一规律在程序开发中被践行。
内存会自动地在拥有它的变量离开作用域后进行释放。1
所以它可以省去虚拟机自动GC的过程,进而省去了一系列复杂的优化,在降低内存使用率的同时,提升了程序的运行速度。
所以它不需要开发者时时刻刻惦记着自己之前还有个对象没释放,这个数组访问过程中会不会越界等问题——因为在开发者与编译器的一次次“对骂”中,这些问题都会自然消解。
Footnotes
-
《Rust权威指南》。 ↩