Lint

**Lint**（リント）または **Linter**（リンター）とは、ソフトウェア開発において、プログラムの品質向上やバグの早期発見を目的として使用されるツール群の総称である。主にプログラムの静的解析（静的コード解析）を行い、構文（シンタックス）エラーや潜在的なバグ、コーディングスタイルの違反などを検出するために利用される。

## C言語上のlint
C言語での**lint**は、主にソースコードに対し、コンパイラよりも詳細かつ厳密なチェックを行なうプログラムである。静的解析ツールとも呼ばれる。以下に挙げるように、コンパイラではチェックされないが、バグの原因になるような曖昧な記述についても警告される。構文（シンタックス）レベルのチェックだけでなく、意味（セマンティクス）レベルのチェックまで実行するものもある。

*型の一致しない関数呼び出し
*printfなどにおける書式指定文字列と、対応する可変長引数の数および型の不一致
*初期化されていない変数の読み取り参照がある
*宣言されているが使われていない変数がある
*代入などの書き込み参照はあるが読み取り参照のない変数がある
*同じ関数を呼び出す複数のコードがあるが、その戻り値を使う場合と使わない場合がある
*関数が戻り値を返す場合と返さない場合がある
*インデント規則に一貫性がないなどのスタイルの逸脱

は、もともと「糸くず」や「綿ぼこり」といった意味を持つ英単語である。

## lintで警告が出る例

```c
int foo(int count) {
    int sum = 0;
    int i;
    for (i = 1; i <= count; ++i) {
        sum += i;
    }
    if (sum >= 100) {
        return sum;
    }
}
```

上記の例の場合、`foo()` は、`sum` が100以上であれば値を返すが、それ以外の時には値を返さない。これはC言語の構文的には合法だが、実行時エラーなどの未定義動作を引き起こす。そのため、lint では警告が出る。

ただ、のコンパイラは、細かな警告やエラーを出す機能が強化されているため、以前は lint を使わなければ検出できなかった類のミスも、コンパイル段階で検出できるようになっているものがある。上記の例は、Microsoft Visual C++では既定で C4715 の警告が生成され、コンパイルオプション`/we"4715"`を指定することでコンパイルエラーになる。GCCやClangではコンパイルオプション`-Wreturn-type`を指定することで警告が生成され、また`-Werror=return-type`を指定することでコンパイルエラーになる。

後発のプログラミング言語では安全性を考慮して、上記のようなコードを常に非合法とし、必ずコンパイルエラーにしてしまう仕様となっているもののほうが多い。C言語およびC++では、仕様により動作が厳密に規定されていない事項（未規定動作、処理系定義動作、未定義動作）が非常に多く、そのためコンパイラやlintによる警告に頼らなければならないことが多い。

## 派生的なlintの用法
本来「lint」は、C言語のソースコードに対して静的解析を行い、潜在的なバグや問題を指摘するツールとして開発されたが、転じてC言語に限らずあらゆるプログラミング言語において、構文チェックや静的解析を行うプログラム一般を指す言葉として用いられるようになった。このような意味でのlintツールには、たとえばHTMLの構文をチェックする「Another HTML-lint」や、JavaおよびKotlinコードに対応するAndroid Studioのlintツールなどがある。

### 用語としての派生
コードの静的解析を行う行為そのものを**lint**(linting)と呼び、それを実行するツールを**linter**と呼ぶ。たとえば、C++における代表的なlinterとしては、ClangベースのClang-Tidyが挙げられる。

また、コンパイラが存在する言語では、linterとコンパイラを併用することで、字句解析や構文解析に加え、意味論的な検査を補完的に行うことが可能となる。

### 開発環境との統合
現代の統合開発環境（IDE）やコードエディタでは、linterがリアルタイムに動作し、コーディング中に継続的な静的解析を行うことが一般的となっている。たとえばVisual Studio Code上でTypeScriptの開発を行う場合、構文チェックは`tsserver`が担い、lintingはESLintが担当する。これにより、コーディング中に即時的なフィードバックが得られ、潜在的な問題を早期に検出することができる。

IDEには通常、linterの解析結果をコード上にハイライト表示したり、エラーや警告の一覧をリスト形式で提示するなどの機能が組み込まれている。このような支援機能により、開発者はコードの品質を維持しながら効率的に開発を進めることが可能となる。

### lintの目的と意義
lintingは、実行時エラーを直接発見するための手段ではなく、コードの品質を評価し、バグの温床となり得る低品質なパターンを検出して予防につなげることを主な目的とする。たとえ構文上は正しいコードであっても、意図しない挙動や可読性の低下、保守性の悪化といった問題を引き起こす可能性がある場合、linterはそれを警告する。

linterは、過去にバグの原因となった「問題を起こしやすいコードパターン」や、「ベストプラクティスに反する記述」に基づいて解析を行い、注意喚起を行う。これにより、開発の初期段階で問題の芽を摘むことができ、ソフトウェアの信頼性向上に寄与する。

## 歴史
Lintの歴史は、C言語の発展と密接に関係しており、1970年代後半に始まる。

### UNIXとC言語の時代（1970年代）
;初代Lintの登場（1979年）
:開発者：Stephen C. Johnson（ベル研究所）
:*目的：C言語で書かれたソースコードに潜在的なバグや非互換な使い方が含まれていないかを静的に検出する。
:*名前の由来：「lint（綿くず）」のような、見落とされやすい細かな問題を取り除くという意味を込めて命名された。
:背景：当時、C言語のコンパイラは比較的寛容で、多くの曖昧な構文や型の不一致を警告せずに通していた。これに対してlintは、より厳密にソースコードをチェックし、安全で移植性の高いプログラムを書くことを支援した。

### 普及と進化（1980年代〜1990年代）
;UNIX文化と共に広まる
:UNIXオペレーティングシステムが多くの大学・研究機関・企業で普及する中で、lintも標準的な開発ツールの一つとして受け入れられる。
:多くのUNIXディストリビューションにおいて、Cコンパイラと共にlintが提供されるようになる。

;lintの制限
:初期のlintはC言語専用であり、他言語には対応していなかった。
:出力結果が大量でノイズ（false positive）も多く、扱いにくさもあった。

### 他言語への拡張と「Linter」概念の誕生（2000年代）
;静的解析ツールの多様化
:Java、Python、JavaScript、Rubyなどの言語においても、同様の静的解析ツールが開発される。
:例：
* Java：Checkstyle, PMD, FindBugs（後のSpotBugs）
* JavaScript：JSLint（2002年, Douglas Crockford による）、ESLint
* Python：PyLint, flake8
: これらのツールも「Linter」と呼ばれるようになり、lintという名前が固有名詞から一般名詞化する。

;コーディングスタイルのチェック機能が強化
:単なるエラー検出に加えて、「コードの品質」「チームのコーディング規約の遵守」なども重視されるようになった。

### 現代：CI/CDとの統合、リアルタイムLint（2010年代〜）
;エディタとの統合
:Visual Studio Code、IntelliJ、Sublime Text、Vim などのエディタにLinterプラグインが組み込まれ、リアルタイムで警告を表示できるようになった。

;DevOps/CIとの統合
:GitHub ActionsやGitLab CIなど、統合化のパイプラインの中にLinterを組み込み、コードの品質を自動チェック。
:Pullリクエストの段階でLintエラーを検出し、品質を担保するワークフローが普及。

近年では、Lintツールは自動化された開発プロセスにおいて重要な役割を果たしており、ソフトウェア開発者にとって欠かせないツールの一つとなっている。

Lintの使用により、コードの品質向上や保守性の向上が図られ、プロジェクト全体の効率化が図られることが期待される。

## 脚注
### 注釈

### 出典

## 関連項目
*Portable C Compiler
*Another HTML-lint
*静的コード解析

## 外部リンク
* - Unix & Linux Commands