---
title: コンパイラ原理：式から実行可能プログラムへの学習ルート
url: https://doc.liz6.com/ja/compilers/00-learning-path
locale: ja
area: compilers
tags:
- コンパイラ
date: 2026-09-12
modified: 2026-09-12
description: 関数、再帰、配列、簡単なマップ（連想配列）を記述できる読者を対象としています。まずは自分が慣れた言語を選んで練習を行いましょう。初期段階では、アセンブリ言語、LLVM、またはオートマトンの証明の習得は必須ではありません。この全体の流れは、整数、変数、括弧、および四則演算をサポートする小さな言語を中心に据え、章ごとに互いに関連のないおもちゃのような言語に切り替えることを避けます。
---

# コンパイラ原理：式から実行可能プログラムへの学習ルート

関数、再帰、配列、簡単なマップ（連想配列）を記述できる読者を対象としています。まずは自分が慣れた言語を選んで練習を行いましょう。初期段階では、アセンブリ言語、LLVM、またはオートマトンの証明の習得は必須ではありません。この全体の流れは、整数、変数、括弧、および四則演算をサポートする小さな言語を中心に据え、章ごとに互いに関連のないおもちゃのような言語に切り替えることを避けます。

## 学習目標

完了時には、エラー位置を報告し、構文エラーと名前（シンボル）エラーを区別し、コードの実行または生成を行うことができる小さな言語の実装を完成させます。また、各フェーズにおける入出力の意味を説明できるようになります。

## 必読順と理解の確認

1. [字句解析器の設計](01-lexical-analysis/02-lexer-design.md) → [再帰下降法とLL解析](02-syntax-analysis/01-recursive-descent-and-ll-analysis.md) → [AST設計とエラー回復](02-syntax-analysis/03-ast-design-and-error-recovery.md)。

   まず文字をトークンに変換し、その後優先順位に従ってAST（抽象構文木）を構築します。理解の確認：`1+2*3` と `(1+2)*3` の木構造が異なることを確認します。右括弧が欠落している場合、クラッシュするのではなく位置情報を付与してエラーを報告します。

2. [シンボルテーブルとスコープ](03-semantic-analysis/01-symbol-tables-and-scopes.md) → [型システム](03-semantic-analysis/02-type-systems.md)。

   小さな言語にローカル変数、ブロックスコープ、真偽値を追加します。理解の確認：同名変数のシャドウイング（遮蔽）を説明できます。未定義の名前への参照や、誤った型に対する演算は、実行前に検出されます。

3. [LLVM IRの実践](04-intermediate-representation/02-llvm-ir-in-practice.md) → [リンクとロード](07-runtime/02-linking-and-loading.md)。

   検証済みのプログラムを実行パスに接続します。まずはASTインタプリタを実装し、その後、文中のLLVM例を用いてIR、オブジェクトファイル、およびリンクを理解します。理解の確認：有効な入力に対して、2つの実装（インタプリタとコンパイラ生成コードなど）が同じ結果を出力することを確認します。また、コンパイル成功とリンク成功を区別できます。

## 発展学習

[正規表現とオートマトン](01-lexical-analysis/01-regular-expressions-and-automata.md)は字句認識の基礎を説明します。[LR解析](02-syntax-analysis/02-lr-parsing.md)は別の解析ルートですが、LLとLRの両方を同時に実装して初めて入門したと見なされるわけではありません。その後、[SSA](04-intermediate-representation/01-ssa-form.md) → [データフロー解析](05-optimization/01-data-flow-analysis.md) → [古典的最適化](05-optimization/02-classic-optimizations.md)を読んでください。最適化前後では、命令数の減少だけでなくセマンティクス（意味）を比較する必要があります。JIT、GC（ガベージコレクション）、レジスタ割り当て、およびLSP（言語サーバープロトコル）はプロジェクトのニーズに応じて選択して読んでください。

## 仕上げの課題

正常な入力、優先順位の境界ケース、エラー入力、およびスコープの反例のセットを保持します。1ページの図を用いて、文字、トークン、AST、セマンティックチェック、および実行結果の関係を示し、エラーが入力から特定され、診断されるまでの一連のプロセスを示します。ABI（アプリケーションバイナリインタフェース）が理解できない場合は、[システムプログラミングルート](../systems-programming/00-learning-path.md)で学んでください。カーネルを事前に完全に読み終える必要はありません。

初めて読むときでは、長い証明や実装の詳細は飛ばしても構いませんが、各段階の理解の確認を完了させる必要があります。「用語は知っているが結果を説明できない」という状況に陥った場合は、現在の例に戻って条件を一つ変えてから次の章に進んでください。目次全体を事前に通読する必要はありません。
