面接で使えるEslintのFix機能に隠されたアルゴリズムの質問

面接で使えるEslintのFix機能に隠されたアルゴリズムの質問

[[422353]]

eslint が修正をサポートしていることはわかっています。--fix パラメータを追加すると、いくつかのルールによって問題が自動的に修正されます。

この機能がどのように実装されているのか疑問に思ったことはありませんか? Babel もコードを変換できます。eslint と同じように動作しますか?

バベル

Babel は解析、変換、生成の 3 つのステップに分かれています。


変換フェーズで AST コードが変換された後、生成フェーズで AST がターゲット コードに再帰的に印刷されます。

生成の原理は、各 AST の情報に基づいて文字列を再帰的に連結することです。

したがって、プラグイン内の AST を変更すると、最終的なコードも変更されます。

エスリント

eslint ルールは AST をチェックし、context.report を通じてエラーを報告し、その修正方法を指定できます。

カスタム ルールの形式は次のとおりです。

  1. モジュール.エクスポート = {
  2. メタ: {
  3. 修正可能: 
  4. },
  5. 作成(コンテキスト) {
  6. 戻る{
  7. //ASTの型を指定する
  8. オブジェクト式(ノード) {
  9. // 一連のチェック
  10. コンテキスト.レポート({
  11. ノード、
  12. メッセージ: 'xxx にエラーがあります'
  13. 場所: node.loc、
  14. *fix(フィクサー) {
  15. yield fixer.replaceTextRange([rangeStart,rangeEnd], '置換されたテキスト' );
  16. }
  17. });
  18. }
  19. };
  20. }
  21. };

修正オプションは、修正 API を通じて問題を自動的に修正するために使用されます。

フィクサーには次の API が用意されています。

  1. ノードまたはトークンの後にテキストを挿入します。
  2. 範囲の後にテキストを挿入します。
  3. ノードまたはトークンの前にテキストを挿入します。
  4. 範囲の前にテキストを挿入します。
  5.  
  6. ノードまたはトークンを削除します。
  7. 範囲を削除します。
  8.  
  9. ノードまたはトークンのテキストを置き換えます。
  10. replaceTextRange(範囲、テキスト);

覚えるのはとても簡単です。追加、削除、変更の 3 つのカテゴリがあります。追加は、前方への挿入と後方への挿入に分かれています。各カテゴリは、トークンに基づいて、または範囲 (下付き範囲) に基づいてテキストを変更することをサポートしています。

AST 内の各ノードは範囲情報、つまりソース コード内のどこからどこまでの添え字を保持しているため、範囲に応じてコードを変更したり、AST に従って範囲を見つけた後にコードを変更したりすることができます。

では、範囲に対してどのような操作を実行するかがわかったら、コードを自動的に変更するにはどうすればよいでしょうか?

以下は eslint の修正コードのソース コードです。

  1. // ソースコード
  2. const オリジナルテキスト = ソースコード.text;
  3. // 最初の範囲の始まり
  4. const start = fixes[0].range[0];
  5. // 最後の範囲の終了
  6. const end = fixes[fixes.length - 1].range[1];
  7. // テキストを置き換える
  8. テキストを""とします
  9. lastPos = Number.MIN_SAFE_INTEGER とします。
  10.  
  11. for (const修正修正) {
  12. (fix.range[0] >= 0)の場合{
  13. // 範囲の左側の文字列をインターセプトし、現在の範囲と前の範囲の右側から大きい方を取得します
  14. テキスト += originalText.slice( Math.max (0, start, lastPos), fix.range[0]);
  15. }
  16. // 修復したテキストを結合する
  17. テキスト += 修正.テキスト;
  18. // 範囲の右側の位置
  19. 最後の位置 = fix.range[1];
  20. }
  21. // 範囲内の文字列を連結された文字列に置き換えます
  22. テキスト += originalText.slice( Math.max (0, start, lastPos), end );

最も興味深い点の 1 つは、両端の範囲が交差するときです。

各修正は、線分(範囲)内のテキストの修復です。交差点をどのように処理するかは、実際に候補者を評価するためのアルゴリズムの質問として使用できます。

左から右に修正を適用し、現在の rangeRight を記録します。次のセグメントを適用するときは、rangeLeft の最大値と前の rangeRight を rangeLeft として取得します。

この問題を抽象化した後でも、これは比較的興味深いアルゴリズムの問​​題です。面接に適しており、実際の応用シナリオがあると思います。

話を元に戻すと、fix 関数の実装は、各範囲で変更されたテキストを結合し、ソース コード文字列を置き換えることです。

要約する

babel と eslint はどちらもコードを修正できます。Babel は AST 上で動作し、コードを印刷するときに異なるコードを生成しますが、eslint はいくつかのルールの自動修正をサポートしています。--fix をオンにすると、自動的に修正されます。

babel コード生成の原則は、AST を再帰的に出力して文字列を連結することであるため、AST が変更されると、生成されたコードも変更されます。

eslint のコード修復ロジックは、特定の範囲のテキストを置き換えてから結合することです。これは AST とは関係がないため、eslint の fix 関数はオプションです。

さらに興味深いのは、eslint の複数のルールによって返される複数の範囲に対する変更が、コードの変更にどのように適用されるか、交差があった場合はどうするかです。この質問は、面接対象者をテストするためのアルゴリズムの質問として使用できると思います。

<<:  数十人の国内NLP専門家が協力し、事前学習済みモデルの過去、現在、未来を検討した。

>>:  ロボティックプロセスオートメーションが人々の働き方をどのように変えているのか

ブログ    
ブログ    

推薦する

Googleの「AIが写真を推測」アプリがWeChat Momentsで人気:ユーザーの参加でよりスマートに

Google 初の WeChat ミニプログラム「絵を当てよう」アプリは、リリースから 1 日で、一...

中国と米国の人工知能の格差はどれほど大きいか:米国の人材総数は中国の約20倍

昨年上半期、メディアはかつてアンドリュー・ン氏が妻のために百度を去ったという話題を熱く議論していた。...

一貫性ハッシュアルゴリズムと分散ストレージへの応用

OStorageの責任者であるLi Mingyu氏は、同社のエンタープライズレベルのオブジェクトスト...

ディープラーニングに関しては、こちらをお読みください

編集者注: この記事の著者は、USTC のジュニアクラスの卒業生で投資家の Wang Chuan で...

百度がスマートシティ向け「ACE計画」を発表、ロビン・リーはAI思考でインターネット思考に打ち勝ちたい

11月1日、北京で百度世界博覧会2018が開幕した。百度の創業者で会長兼CEOの李克強(ロビン・リー...

ケーキを食べて、ケーキも残すことはできないのですか?清華大学チーム、非常に正確で解釈可能な分類モデルを提案

[[432462]]既存の機械学習分類モデルは、性能と解釈可能性に基づいて、大まかに 2 つのカテ...

「機械学習システム設計ガイド」は、このNVIDIAガールの人気プロジェクトです

今年 8 月、スタンフォード大学を卒業し、現在 NVIDIA の人工知能アプリケーション チームに勤...

程偉:スマート交通に投資し、世界クラスのモデル都市を構築する

「滴滴出行がユーザーとドライバーをつなぐ旅行プラットフォームになるだけでなく、人、車、道路、信号、そ...

...

GNN の推奨システムとアプリケーション

1. GNN推奨システムの基礎となる計算能力の進化過去 20 年間にわたり、コンピューティングは進化...

周明氏との対話: ラストマイルを解決するために大きなモデルを使用するときは、理想主義にならないでください。

ゲスト | 周明執筆者 | Yun Zhaoある夜、湘源の湧き水が、広大で無限に湧き出しました。 C...

現在、人工知能技術はどのような分野に応用されていますか?

まず、人工知能プラットフォームの実装により、人工知能技術は多くの業界や分野、特にインターネットと密接...

AIでAIを守る、次世代のAIベースのサイバー脅威ソリューション

多くの関係者は、AI が「悪」の力にもなり得るという事実を受け入れ始めています。関連する海外メディア...