コンパイル時のエラーとは?

JavaScriptはインタプリタ型言語ですが、コードを実行する前に構文解析(パース)という処理が行われます。
この段階で文法に誤りがあると、コードは実行されずエラーになります。このようなエラーは、一般的に構文エラー(SyntaxError)と呼ばれます。
なお、「コンパイル時エラー」という表現は、JavaやC++などのコンパイル型言語でよく使われます。JavaScriptでは厳密にはコンパイルしているわけではありませんが、実行前に検出されるエラーという意味で使われることがあります。
実行前に検出される主なエラー
JavaScriptで実行前に見つかる代表的なエラーをまとめます。
| エラーの種類 | 発生原因 | 例 | 対策 |
|---|---|---|---|
SyntaxError |
コードの文法が正しくない。 |
|
括弧や引用符など、構文が正しいか確認する。 |
SyntaxError |
予約語の誤った使用。 |
|
予約語を変数名や関数名に使用しない。 |
SyntaxError |
括弧や波括弧の対応が取れていない。 |
|
括弧や波括弧が正しく対応しているか確認する。 |
一方、ReferenceErrorやTypeErrorは、多くの場合実行時エラーであり、コードが実際にその行まで実行されたときに発生します。
実行時エラーとの違い
| 種類 | 発生するタイミング | 代表例 |
|---|---|---|
| 構文エラー(SyntaxError) | コードを実行する前 | 閉じ括弧がない、予約語の誤使用など。 |
| 実行時エラー | コードを実行している途中 | ReferenceError、TypeError、RangeErrorなど。 |
この違いを理解しておくと、エラーの原因を見つけやすくなります。
プログラムの解説
次のコードは、構文エラーが発生する例です。
console.log("Hello World);
このコードでは、文字列を囲む引用符が閉じられていません。
JavaScriptエンジンはコードを解析する段階で文法の誤りを検出するため、このコードは実行されず、SyntaxErrorが表示されます。
よくある構文エラー
括弧の閉じ忘れ
function hello() {
console.log("Hello");
波括弧が閉じられていないため、構文エラーになります。
カンマの書き忘れ
const user = {
name: "Alice"
age: 20
};
プロパティの間にカンマがないため、構文エラーになります。
予約語を変数名にする
const return = 10;
returnはJavaScriptの予約語なので、変数名として使用できません。
エラーの検出と対策
構文エラーは、多くの場合、実行前に開発ツールが検出してくれます。
- ESLintを利用する: 構文ミスやコーディングルール違反を事前に検出できます。
- Visual Studio Codeなどのエディタを利用する: 入力中に構文エラーを表示してくれます。
- ブラウザの開発者ツールを利用する: Consoleタブでエラー内容や行番号を確認できます。
- フォーマッターを利用する: Prettierなどを使うと、括弧の対応ミスなどに気付きやすくなります。
ESLintの例
ESLintはJavaScriptで最も広く使われている静的解析ツールの一つです。
例えば、次のようなコードを書いた場合でも、実行前に問題を指摘してくれます。
const message = "Hello"
console.log(message)
設定によっては、セミコロンの有無や未使用変数なども検出できます。
構文エラーを減らすコツ
- コードを書いたら自動フォーマットを利用する。
- 括弧や引用符は入力時に対応するものも入力する。
- 小さな単位で実行して動作を確認する。
- ESLintなどの静的解析ツールを導入する。
- エラーメッセージに表示される行番号を確認する。
実際には、エラーメッセージが示す行よりも前の行に原因があることも多いため、周辺のコードも確認すると原因を見つけやすくなります。
まとめ
- JavaScriptでは「コンパイル時エラー」というより、「実行前に検出される構文エラー」と考えるのが一般的です。
SyntaxErrorは、文法が正しくない場合に発生します。ReferenceErrorやTypeErrorは、多くの場合は実行時エラーです。- Visual Studio CodeやESLintを使うと、構文エラーを実行前に見つけやすくなります。
- ブラウザの開発者ツールでは、エラー内容や行番号を確認できます。
- 自動フォーマットや静的解析ツールを活用すると、構文ミスを減らせます。