【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

  • 2020-10-25
  • 本文字数:1939 字

    阅读完需:约 6 分钟

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:41 │ if true {  │    ^^^^ Unexpectederror[SyntaxError]: Expected token `R_PAREN` but instead found `L_CURLY`  ┌─ tests\main.js:1:91 │ if true {  │         ^ Unexpectederror[no-constant-condition]: Unexpected constant condition  ┌─ tests\main.js:1:41 │   if 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:002167

评论

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

代码随想录 Day51 - 动态规划(十二)

jjn0703

一文了解JVM对象内存布具以及内存分配规则

java易二三

Java 程序员 JVM 计算机

Wolfram Mathematica 13 中文激活+安装教程最新

胖墩儿不胖y

Mac软件 数学计算软件 计算工具

ARTS 0819 打卡

冰封的鸢尾花

ARTS 打卡计划

R语言之 dplyr 包

timerring

R 语言

解锁多核处理器的力量:探索数据并行化在 Java 8 Stream 中的应用

java易二三

Java 程序员 计算机

多币种挖矿dapp流动性LP令牌质押开发搭建[源码部署]

V\TG【ch3nguang】

质押挖矿 流动性挖矿

[小笔记] Java 线程池

java易二三

Java 程序员 线程 线程池 计算机

Java 面试题——MySQL 索引篇

郑在暴富中

Java 面试题 MySQL索引

Parallels Desktop 19 新功能 pd19虚拟机最新中文破解版安装图文教程、破解方法

晴雯哥

移动端应用程序的一些测试方案和策略

QE_LAB

移动端测试

OpenHarmony 4.0 Beta2新版本发布,邀您体验

OpenHarmony开发者

OpenHarmony

Forrester首次面向中国的开源报告:阿里云在云原生领域开源布局最全面

阿里巴巴云原生

阿里云 开源 云原生

窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟 企业号 8 月 PK 榜

小灯塔系列-中小企业数字化转型系列研究——文档协作测评报告

向量智库

蓝易云:如何在Linux系统服务器中测试存储/磁盘I/O性能?

百度搜索:蓝易云

Linux 运维 io 磁盘

联邦学习:对“数据隐私保护”和“数据孤岛”困境的破局

vivo互联网技术

人工智能 联邦学习 数据隐私 数据安全 gdpr

如何基于 Kubernetes 实现优质开发者平台体验?

SEAL安全

Kubernetes IdP 平台工程 内部开发者平台

酷睿轻薄本也能运行大语言模型,英特尔推动 PC 生成式 AI 落地

E科讯

盲盒商城模式玩法,盲盒商城系统开发搭建

V\TG【ch3nguang】

盲盒商城 盲盒开发

Python案例|Matplotlib库实现的数据分析

TiAmo

Python 数据挖掘 数据分析

超级AI助手:全新提升!中文NLP训练框架,快速上手,海量训练数据

汀丶人工智能

人工智能 大语言模型 ChatGLM-6B bloom

Presto 设计与实现(八):Presto JDBC

冰心的小屋

数据湖 JDBC presto 设计与实现 presto jdbc

最新中文 Keka for Mac(压缩解压工具) v1.3.3

mac大玩家j

解压缩软件 解压软件 解压缩工具

SpringBoot 的优雅的接口参数验证

java易二三

Java 编程 程序员 计算机

火山引擎DataLeap基于Apache Atlas自研异步消息处理框架

字节跳动数据平台

数据中台 数据治理 数据安全 数据研发 企业号 8 月 PK 榜

全套解决方案:中文NLP训练框架,支持大模型训练和文本生成,快速上手,海量训练数据!

汀丶人工智能

人工智能 自然语言处理 大语言模型

蓝易云:IT知识百科:什么是分布式云?

百度搜索:蓝易云

云计算 Linux 运维 云服务器 分布式云

Parallels Desktop 19:支持Touch ID的免密码登录功能

晴雯哥

RSLint:使用Rust开发的JS Linter,可以解析错误代码_语言 & 开发_Bruno Couriol_InfoQ精选文章