Lintは、C 言語のソースコードに対して静的プログラム解析を実行するUnixユーティリティです。[ 1 ]このソフトウェアは、コーディング スタイルやフォーマットのエラーをチェックする現代のコンピューティング ツール(「リンター」または「リンティング ツール」 として知られる)の名前の由来となっていますが、元々の Lint プログラムが静的プログラム解析を実行していました。
ベル研究所のコンピュータ科学者であるスティーブン・C・ジョンソンは、 1978年にC言語用に書いていたyacc文法のデバッグ中に、 Unixを32ビットマシンに移植する際に生じた移植性の問題に対処していた際に、「lint」という用語を考案しました。 [ 1 ]この用語は、衣類から抜け落ちる小さな繊維や綿くずである「lint」から借用されたもので、彼が書いたコマンドは衣類乾燥機の糸くずフィルターのように機能し、生地全体をそのままにしたまま不要な繊維を捕らえるからです。lintプログラムは、1979年にUnix V7でベル研究所以外でもリリースされました。
ジョンソンは1978年の論文で、エラー検出のための新しいプログラムを作成した理由を次のように説明している。「2つのプログラムを持つという一般的な考え方は良いものです」。なぜなら、それらは異なることに集中しているため、プログラマーは「プログラミングプロセスのある段階では、アルゴリズム、データ構造、プログラムの正確性だけに集中し、その後、lintの助けを借りて、普遍性と移植性という望ましい特性を後付けすることができる」からである。[ 1 ]
この論文では、lintの追加チェック項目として以下を挙げている。
char非移植的にテストされた値が負の値であるかどうかをチェックします。longに値が割り当てられる場合int。*p++;、インクリメントはするもののp、インクリメント前の値を使用しない文など。ANSI Cでは関数プロトタイプが導入され、関数が呼び出される前に関数プロトタイプが見つかっている場合、ANSI C コンパイラが関数の仮引数と実引数の型不一致のチェックを実行できるようになりました。また、void値を返さない関数の型も追加されvoid、戻り値の型を持つが戻り値を持たない関数のチェックに加えて、値を返す関数のチェックも可能になりました。 lint のチェックの多くは、最適化コンパイラによる分析の一部としても実行できるため、十分に高いレベルの最適化が実行されている場合、C コンパイラは未使用の変数と関数、使用前設定と設定後未使用の変数のチェック、到達不能なコードのチェックも実行します。その他の lint チェックも、時間の経過とともに C コンパイラに追加されています。
コードスタイルチェックや静的プログラム解析など、追加のコードチェックを実行するための独立したリントのようなプログラムが今も開発されています。現代のコンパイラはリントの歴史的な機能の多くを組み込むように進化してきましたが、リントのようなツールもさらに幅広い疑わしい構造を検出するように進化してきました。これには、「構文エラー、未宣言変数の使用、非推奨関数の呼び出し、スペースと書式設定規則、スコープの誤用、switch文の暗黙的なフォールスルー、ライセンスヘッダーの欠落、[および]...危険な言語機能に関する警告」が含まれます。[ 4 ]
特定の言語のソースコードに対して文法とスタイルガイドを強制するためのチェックは、現在ではリンティングと呼ばれています。LLVMのC およびC++用の clang-format 、 Rust用の Rustfmt 、[ 5 ] PHP用の PHP CodeSniffer 、JavaScript用のESLint 、 CSS用の Stylelint 、 Python用の Pylint 、Ruby用の RuboCop 、Go用の golintは、これらのツールの例です。ESLint などの一部のツールでは、ルールを自動修正することもできます。ルール定義には、警告を解決する変換の定義も含まれる場合があります。スタイルに関するルールには、特に自動修正が付属していることが多いです。フォーマットに関するルールのみをトリガーするファイルに対してリンターを「すべて修正」モードで実行すると、リンターはフォーマッタと同じように動作します。
コンパイラよりも詳細な静的プログラム解析を行うツールも開発されており、 Coverity、cppcheck、Clangの静的アナライザーなどが挙げられる。JavaScriptの場合、ESLintはコードスタイル解析に加えて静的プログラム解析も行う。
リンターのようなツールは、 JavaScriptやPythonのような動的型付け言語に特に役立ちます。これらの言語のインタプリタは通常、実行中にそれほど多くの厳密なルールを適用しないため、リンターツールは、一般的なエラー (構文の不一致など) や、ハイゼンバグ(疑わしいコードを「可能性のあるエラー」として注意を促す)などの見つけにくいエラーを見つけるための単純なデバッガとしても使用できます。[ 6 ]リンターのようなツールは一般的にソースコードの静的解析を実行します。[ 7 ]