Rust自研js编译器分享

简介: Dev Better技术沙龙-前端性能及新技术实践 学习笔记总结

前端工具链介绍

  • Parser - 解析成 AST,让后面的工具使用
  • babel,tsc
  • swc,esbuild
  • Formatter - 格式化源代码
  • prettier
  • Linter - 检测错误
  • eslint,tslint
  • Transpiler -Down-level JavaScript
  • babel,tsc
  • esbuild,swc
  • Minifier - 亚索代码
  • uglify,terser
  • Google Closure Compiler(Java)
  • esbuild,(swc)

js工具链为什么慢

  • 预研自身 - Runtimes
  • Chrome,Node.js,Deno - V8
  • Firefox - SpiderMonkey
  • Safari,Bun - JavaScriptCore
  • JIT(Just in Time)
  • 边解析边编译
  • 需要启动时间
  • 没有最优的CPU指令优化
  • 内存和GC(Garbage Collection)
  • 运行时GC影响性能

前端工具链趋势

  • Deno,Bun
  • 用Rust/Xig 统一Runtime
  • swc,esbuild
  • 用Rust/Go重写Bundler
  • Rome TOols
  • 用Rust统一全家桶

性能应用需要处理的核心问题

Concurrency vs Parallelism | 并发 vs 并执行

  • Concurrency - 并发
  • 同一时间执行更多的人物
  • 各种async模型

Native(Rust/Go) 工具链为什么快

  • 不单单是多合
  • 编译到最优CPU指令
  • Rust - LLVM
  • Go - 定制
  • 优秀的内存管理
  • Rust - 声明周期
  • Go - 业界最先进的GC
  • 层层优化
  • 极致到每一个比特的使用
  • 系统API调用
  • 优秀的性能排查工具

ESLint的痛点

  • ESLint性能问题渐渐成为了我们的瓶颈
  • 极其复杂的配置系统
  • 无法提升能力的插件系统
  • 没有去分开代码风格和代码错误两种基本问题
  • 没有静态类型分析,需要引入 TypeScript,这会变得特别慢
  • 难处理巨型Monorepo - 十几万文件,几百万行代码

Rust自研js编译器特点

  • 一体式架构,不考虑插件系统
  • 多可处理每一个文件、每一条Linter规则
  • 压榨LLVM,用更有的CPU指令集
  • 使用Memory Arena内存池,用各种工具排查和优化内存使用情况

性能优化经验

  • 性能不是白给的,需要花时间打磨
  • Cache Locality - 缓存访问局部性
  • 想方设法减少数据结构的内存,让它进 CPU/L1/L2缓存
  • 在Hot Path上面统计使用频率,决定是否引入跟高一层的缓存(Heap, Disk)
  • 申请和释放内存真的很耗时
  • 改为使用内存池后,性能提升20%+
  • 一些系统API会无意间使用内存,劲量统一申请,提前申请容量(Capacity)
  • 系统学习排查性能问题
  • 多看其他编译器源码,学习细节
  • 学会统计Code Path 的执行次数,决定是否使用缓存

Rust vs Go

Rust有更多更新的体验,检测出来的问题更多,编译器能做的东西越多越好

目录
相关文章
|
5月前
|
Rust 自然语言处理 安全
【Rust日报】用 Rust 从头实现一个 C 编译器
【6月更文挑战第9天】使用 Rust 实现 C 编译器的挑战性项目,利用 Rust 的内存安全和高性能优势。涉及词法分析、语法分析等步骤,示例代码展示简单的词法分析过程。实际实现需处理更多复杂环节,如抽象语法树构建和代码生成。此项目能深化对编译器原理的理解,提升 Rust 技能,并有望推动更多高质量 Rust 编译器的诞生。
117 7
|
3月前
|
Rust JavaScript 前端开发
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
|
3月前
|
Rust 安全 JavaScript
探索Rust在系统编程领域的前景:虚拟机和编译器开发的新篇章
【8月更文挑战第31天】在系统编程领域,性能与安全性至关重要。Rust作为一种新兴语言,凭借其独特的内存安全和并发特性,正逐渐成为虚拟机和编译器开发的首选。本文通过案例分析,探讨Rust在这些领域的应用,例如Facebook的Compiler VM (CVM)项目和实验性的JavaScript JIT编译器Mithril。Rust的静态类型系统和所有权模型确保了高性能和安全性,而其强大的包管理和库生态则简化了虚拟机的开发。随着Rust社区的不断成熟,预计未来将有更多基于Rust的创新项目涌现,推动系统编程的发展。对于追求高性能和安全性的开发者而言,掌握Rust将成为一个重要战略方向。
71 1
|
4月前
|
Rust 编译器 程序员
Rust与C++的区别及使用问题之Rust避免多线程中的lifetime的问题如何解决
Rust与C++的区别及使用问题之Rust避免多线程中的lifetime的问题如何解决
|
自然语言处理 JavaScript 前端开发
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)(一)
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)
94 0
|
自然语言处理 前端开发 JavaScript
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(四)结语
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(四)结语
88 0
|
自然语言处理 JavaScript 前端开发
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(三)模拟执行
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(三)模拟执行
100 0
|
编译器
wepy踩坑-未发现相关 sass 编译器配置,请检查wepy.config.js文件
wepy踩坑-未发现相关 sass 编译器配置,请检查wepy.config.js文件
138 0
|
自然语言处理 JavaScript 前端开发
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)(二)
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)(二)
84 0
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(修订版)(二)
|
自然语言处理 JavaScript 前端开发
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(二)语法分析
编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(二)语法分析
92 0