Riccardo D'Ambrosio氏は先頃、完全にRustで記述されたJavaScript用のリントツールであるRSLintをリリースした。RSLintは、可能な限り高速で、カスタマイズ可能で、使いやすいように努めている。RSLintはまだ開発の初期段階にあり、基本的なVisual Studio Code統合を備えている。
RSLintの作者は、モチベーションを次のように説明している:
このプロジェクトは本格的なJavaScriptリントツールですが、Rustでゼロから作成されています。既存のリントツールは制限が厳しくて遅いと感じ、いくつかの重要なポイントを念頭に置いて自分でリントツールを作ることにしました:
- スピード: ファイルの読み込み、ファイルのリント、すべてのルール実行の並列化
- Rustコンパイラに非常に似たフレンドリーなエラー (ラベル、メモを含む)
- エラー回復: ソースコードは、それがどんなに間違っていても、リントすることができる
- […]
- より強力なディレクティブ
他のリントツールと同様に、RSLintは、開発者がグッドプラクティスを実施し、プログラミングエラー、バグ、文体エラー、および疑わしい構造にフラグを立てるのを支援するよう努めている。リントツールは通常、コードエディター内で使用され、編集中にリアルタイムのフィードバックを提供する。相当数設定されたリントルールを持つ大規模なコードベースで作業しているユーザは、より高速なリアルタイムフィードバックの形で提供される速度の向上から恩恵を受けることができるだろう。
同様に、リントルールが失敗した場合、特にルールが複雑な場合やいくつかの他の構文エンティティを参照している場合は、わかりやすく説明的なメッセージエラーによって開発者のエクスペリエンスを向上することができるかもしれない。
D'Ambrosio氏は、いくつかの既知のリントツールには存在しないとされるRSLintのエラー回復機能を主張した:
エラー回復とは、パーサが誤ったソースコードを取り込んでも、そのほとんど正しいAST抽象構文ツリーを解析できることを指します。ほとんどのリントツールはこれをまったく試みません。たとえば、espree、およびswc_ecmascript (それぞれESLintおよびdeno_lintのパーサ) は回復を試みません。パーサがエラーに遭遇すると、Err結果を返し、解析を終了して、ASTを生成しません。
[…] これは、リントツールが間違ったコードをリントすることが不可能であることを意味します。これは、IDEなどのオンザフライのリントの驚くべき機能です。
RSLintは、次のコードを解析できる:
if true {
/* */
} else {
/* */
}
そして、次のようにリントする:
error[SyntaxError]: Expected token `L_PAREN` but instead found `TRUE_KW`
┌─ tests\main.js:1:4
│
1 │ if true {
│ ^^^^ Unexpected
error[SyntaxError]: Expected token `R_PAREN` but instead found `L_CURLY`
┌─ tests\main.js:1:9
│
1 │ if true {
│ ^ Unexpected
error[no-constant-condition]: Unexpected constant condition
┌─ tests\main.js:1:4
│
1 │ if true {
│ ^^^^ this condition is always truthy...
2 │ /* */
3 │ } else {
│ ┌────────'
4 │ │ /* */
5 │ │ }
│ └─' ...which makes this unreachable
しかし、D'Ambrosio氏は、プロジェクトの初期段階の性質を思い出した:
ただし、rslint_parserはまだ開発の初期段階にあり、エラー回復はバグが多く爆発的な場合があることに注意してください。ただし、これは将来改善される予定です。
RSLintは、Rustで記述されることによって、つまりマシンコードにコンパイルされることで速度を実現しているだけでなく、タスクを並列化することによってもその速度を実現する。通常のASTではなく特定のデータ構造に依存する。RSLintは、Rustアナライザプロジェクト用に開発されたrowanのRustライブラリを使用する。Rowanは、クローン作成にコストがかかるミュータブルなASTではなく、イミュータブルな構文ツリーとしてツリーをモデル化する。
RSLintは、開発者がリントするときにファイル全体を無視したり、特定のコンテキストで特定のリントルールを無視したりできるようにするいくつかのディレクティブを提供している (rslint-ignore
) 。RSLintは現在、約25のルール (例えば、no-async-promise-executor、no-await-in-loop、no-dupe-keysなど) を実装しているが、将来的にはさらに計画されている。開発者はカスタムルールを書くことができる。ただし、ドキュメントによると、カスタムルールはRustマクロを使用して作成する必要がある。これは、JavaScriptコミュニティによる貢献に対する障壁となる可能性がある。
RSLintは、ネイティブコードにコンパイルされる他の言語でJavaScriptツールを作成することからなる新しいトレンドの一部です。InfoQは、Goで記述されたJavaScriptバンドラesbuildについて以前報告した。swcはRustベースのJavaScript/TypeScriptコンパイラである。この傾向は、JavaScriptツールのフィードバックサイクルを短縮し、開発者のマシンの強力なマルチコア機能を活用するための生のパフォーマンスの追求によって推進されている。
ただし、ネイティブにコンパイルする言語でコードを記述することが、より高いスループットを実現する唯一の方法ではない。自動化されたタスクの範囲を縮小することにより、ツール実行を高速化できる。JavaScript/TypeScriptコンパイラのSucraseは、昨年、いくつかのベンチマークでRustベースのswcコンパイラーを上回った。ただし、Sucraseは開発ビルドのみを対象とし、いくつかの制限的な仮定を行います (たとえば、Node 6やInternet Explorerのサポートはない) 。
JavaScriptコミュニティの一部のメンバーは、RSLintに関してのRedditで楽観的に慎重である。あるユーザーは次のように述べている:
これはすごい ! まだ初期段階ですが、すばらしい仕事です。このプロジェクトがどのように進行するかを楽しみにしています !
もう1つ、コミュニティで採用するためのいくつかの重要な機能を列挙した:
ねえ、これは素晴らしく見えます。リントをスピードアップできるようになりたいです。これを職場で使用するには、かなり成熟していて機能が完全であり、継続的なメンテナンスについて合理的な安心感が得られる必要があります。
RSLintは現在、大幅に開発されており、初期段階にある。RSLintロードマップには、ベンチマーク、スコープ分析、自動修正、JSXとTypeScriptのサポート、JavaScriptプラグインなどが含まれている。既知の問題とドキュメントはオンラインで入手できる。
RSLintは、MITライセンスの下でオープンソース化されている。プロジェクトのGitHubリポジトリを通じて、貢献やプルリクエストを歓迎している。