RSLint:使用Rust开发的JS Linter,可以解析错误代码

2020 年 10 月 25 日

RSLint:使用Rust开发的JS Linter,可以解析错误代码

Riccardo D’Ambrosio 最近发布了 RSLint,一个完全用 Rust 开发的 JavaScript linter。RSLint 力求尽可能快、可定制和易于使用。RSLint 仍处于开发的早期阶段,主要特色是与 Visual Studio Code 的集成。


RSLint的作者是这样描述他的动机的:


这是一个成熟的JavaScript linter,只是用Rust从头开始开发。我觉得现有的linter功能太有限,速度太慢,于是决定尝试自己开发一个,并带有一些自己的想法:

速度:文件加载、文件检查和规则运行都是并行的;

rustc风格且友好的错误信息(包括标签、注释);

错误恢复:不管多离谱的源代码可以检查;

……

更强大的指令。


与其他 linter 一样,RSLint 努力帮助开发人员实施良好的实践,并标记编程错误、bug、风格错误和可疑的代码。linter 通常在代码编辑器中用于在编辑时提供实时反馈。使用了大量 lint 规则的大型代码库的用户可以从更快的实时反馈中获得开发速度方面的好处。


类似地,当 lint 规则提示错误时,特别是当规则很复杂或引用了其他几个语法实体时,友好的解释性错误消息可以帮助开发人员增长经验。


D’Ambrosio 强调了 RSLint 的错误恢复能力,据称已知的 linter 不具备这个能力:


错误恢复是指解析器能够接受不正确的源代码,并且仍然能够解析出基本正确的AST(抽象语法树)。大多数linter根本不会这么做,例如,espree和swc_ecmascript(分别是ESLintdeno_lint的解析器)不会尝试进行错误恢复。当解析器遇到错误时,它们返回一个Err结果并停止解析,不生成AST……这意味着linter不可能检查错误的代码,如果能在IDE中实现这个功能,将是很惊人的。


RSLint 可以解析这样的代码:


if true {  /* */} else {  /* */}
复制代码


然后检查它:


error[SyntaxError]: Expected token `L_PAREN` but instead found `TRUE_KW`  ┌─ tests\main.js:1:41if true {  │    ^^^^ Unexpectederror[SyntaxError]: Expected token `R_PAREN` but instead found `L_CURLY`  ┌─ tests\main.js:1:91if true {  │         ^ Unexpectederror[no-constant-condition]: Unexpected constant condition  ┌─ tests\main.js:1:41if true {  │      ^^^^ this condition is always truthy...2/* */3 │   } else {  │ ┌────────'4 │ │   /* */5 │ │ }  │ └─' ...which makes this unreachable
复制代码


D’Ambrosio 回顾了该项目的初期想法:


但是请注意,rslint_parser仍处于早期开发阶段,并且错误恢复有时会有很多bug,但是在将来会变得更好。


RSLint 速度的提升不仅是因为使用 Rust 开发(编译成机器码),也因为它使用了并行执行和特定的数据结构(不是传统的 AST)。RSLint 使用了为Rust分析器项目开发的rowan库。rowan 生成的语法树是不可变的,而不是克隆成本很高的可变 AST。


RSLint 提供了一些指令,在检查代码时可以忽略一些文件,或者在某些情况下(rsLint-ignore)忽略特定的 lint 规则。RSLint 目前实现了大约 25 条规则(例如,no-async-promise-executorno-await-in-loop或者no-dupe-keys),未来还将计划实现更多规则。开发人员可以编写自定义规则。不过,文档中提到,自定义规则必须用 Rust 宏来编写——这可能给 JavaScript 社区贡献内容造成了障碍。


RSLint 是用其他语言开发可编译为原生代码的 JavaScript 工具这一新兴趋势的一部分。InfoQ 之前曾报道过用 Go 语言开发的 JavaScript 打包器esbuild。swc 是一个基于 Rust 的 JavaScript/TypeScript 编译器。缩短 JavaScript 工具的反馈周期、利用开发者机器强大的多核功能以及对原始性能的追求推动了这一趋势。


然而,使用 compile-to-native 编程语言来编写代码并不是实现高吞吐量的唯一方法。通过减少自动化任务的作用范围,也可以提升工具的速度。在去年的一些基准测试中,JavaScript/TypeScript 编译器 Sucrase 击败了基于 Rust 的 swc 编译器。然而,Sucrase 只针对开发构建,并做了一些限制性的假设(例如,不支持 Node 6 或 Internet Explorer)。


JavaScript 社区的一些成员在 Reddit 上表达了对 RSLint 的乐观态度。一个用户提到:


这太棒了!虽然还处于早期阶段,但它很出色,我们期待看到这个项目更多的进展!


另一篇文章列举了要让社区采用需要满足的一些特性:


看起来不错。我希望能加快代码检查的速度。为了能够在工作中使用,它要非常成熟而且功能完善,并在一定程度上保证项目的维护。


RSLint 目前正处于开发的早期阶段。RSLint 路线图包括基准测试、作用域分析、自动修复、JSX 和 TypeScript 支持、JavaScript 插件,等等。已知的问题文档可以在网上找到。


RSLint 采用了 MIT 开源许可。开发者可以通过该项目的GitHub存储库参与贡献或拉取请求。


原文链接


RSLint, a New, Fast JavaScript Linter Written in Rust


2020 年 10 月 25 日 12:00876

评论

发布
暂无评论
发现更多内容

输入法B端市场转化:百度推动产业智能化的新路径

脑极体

一周信创舆情观察(11.9~11.15)

统小信uos

入坑 docsify,一款神奇的文档生成利器!

沉默王二

docsify

DataOps系列丨数据的「资产负债表」与「现状」

DataPipeline

大数据

架构师训练营 W05 作业

Geek_f06ede

五、一致性哈希算法

Geek_28b526

架构师训练营 1 期 -- 第九周作业

曾彪彪

「架构师训练营第 1 期」

32核打赢AMD64核 英特尔Ice Lake为HPC提供强劲性能

intel001

数字人民币究竟是什么

CECBC区块链专委会

数字货币

DataOps系列丨DataOps的组织架构与挑战

DataPipeline

大数据

释放数字化活力 高质量建设数字中国

CECBC区块链专委会

数字经济

DataOps系列丨DataOps理念与设计原则

DataPipeline

大数据

石、火、水:从OriginOS透视移动系统进化论

脑极体

JVM运行时数据区,你真得好好学一学

Simon郎

JVM Java 分布式

Appium常用操作之「Toast提示信息获取」

清菡

Maven-技术专题-Setting文件结构解析

李浩宇/Alex

消灭微服务的坏味道 之 循环依赖

码猿外

微服务 循环依赖 坏味道

架构师系列之6: python实现一致性hash

桃花原记

《使用C ++的数据结构和程序设计》限时免费下载

计算机与AI

c++

第九周学习性能优化 3 总结

三板斧

架构师训练营第一期

《迅雷链精品课》第六课:主流区块链数据存储分析(一)

迅雷链

区块链

Redis也能搞定时任务,你们要讲武德

周老师

Java 编程 程序员 架构 面试

阿里大牛八年打造,编程宝典,从初学到编程进阶—深入学习—实战

马士兵老师

Java 阿里巴巴 程序员 架构 编程语言

微服务手册:高速查询?除了Redis我们还有另外的选择

互联网应用架构

redis 微服务 springboot Caffeine 高速缓存

区块链+供应链,双链融合开启新时代

CECBC区块链专委会

区块链 供应链物流

实现2nm工艺突破,台积电为何能给“摩尔定律”续命?

脑极体

结合实战和源码来聊聊Java中的SPI机制?

冰河

Java spi 服务发现

大专学历Java开发7年,从年初被裁到四面美团点评成功上岸,闭关七个月,入职那一天我哭了!

Java架构追梦

Java 阿里巴巴 面试 美团 java架构

Nacos实战及其源码分析

程序员Fox

Spring Cloud nacos spring cloud alibaba

【得物技术】浅谈分布式事务中间件Seata

得物技术

开源 分布式事务 中间件 解决方案 seata

git使用与原理剖析及其私服搭建

程序员Fox

git

RSLint:使用Rust开发的JS Linter,可以解析错误代码-InfoQ