Skip to content
字数
894 字
阅读时间
4 分钟

当下的前端框架中,出现了一批以 rust 语言编写的编译和打包工具(如 rspack),在这之前还有一些以 golang 语言编写的打包工具(如 esbuild),这些相比于原生的使用 JavaScript 编写的打包工具(如 webpack)而言,他们的性能提升原因是什么?是因为语言层面的差异吗?

是的,编程语言上确切的提供了很大的差异化

编译型语言通常比解释型语言 (如 JavaScript) 拥有更好的性能,因为它们可以进行更深入的 优化和并行处理

编译过程中的优化

编译型语言在编译阶段可以进行大量的静态分析和优化,这些优化可以显著提高程序的执行效率,减少不必要的计算和内存访问包括:

  • 函数内联优化
  • 死代码消除
  • 循环优化
  • 内存分配优化等

函数内联优化

假设有一个函数 add(a, b) 用于计算两个数的和,在程序中被多次调用

编译器可以分析这个函数,发现它很小且没有副作用,就可以将函数调用处直接替换成函数体内的代码,从而省去了函数调用的开销

死代码消除

在一个程序中,有些变量或语句永远不会被执行到,编译器可以分析出这些 " 死代码 ",并将其从最终生成的机器码中移除。这样可以减小程序的体积,提高执行效率

循环优化

对于一个包含循环的代码段,编译器可以分析循环条件和循环体,进行各种变换和优化,比如: 循环展开、公共子表达式消除、向量化等,从而提高循环的执行效率

内存分配优化

编译器可以根据变量的作用域和生命周期,选择合适的内存分配策略,比如: 在栈上分配局部变量、重用内存空间等,减少内存占用和访问开销

机器码执行效率

编译型语言最终生成的是机器码,可以直接在 CPU 上执行,不需要再经过解释和中间代码生成等步骤

机器码的执行效率通常比解释型语言的中间代码或字节码高很多

并行处理能力

编译型语言通常可以充分利用多核 CPU 的并行处理能力,实现更高效的并发执行

这得益于编译器可以在编译阶段进行深入的分析和优化,识别出可以并行执行的部分。

语言特性支持

一些编译型语言本身就提供了丰富的并行编程特性,如线程、协程、任务等,方便开发者利用多核 CPU

全局解释器锁(GIL)

一些解释型语言(例如 Python)使用 GIL 来确保在任何给定时间只有一个线程执行 Python 字节码。这导致了解释器在多核处理器上无法实现真正的并行处理

虽然可以使用诸如多进程或异步编程等技术来绕过 GIL,但这增加了编程的复杂性

贡献者

The avatar of contributor named as jiechen jiechen

页面历史

撰写