# 第1章:導入 [English](README.md) | 日本語 この文書は [Chapter 1: Introduction](README.md) の日本語訳です。 [はじめに](../../README.ja.md) | [次の章:第2章](../chapter02/README.ja.md) # 目次 1. [実装言語](#実装言語) 2. [前提](#前提) 3. [アーキテクチャ](#アーキテクチャ) 4. [ノードのグラフとしての中間表現](#ノードのグラフとしての中間表現) 5. [ノードはグラフを構成する](#ノードはグラフを構成する) 6. [ノードの種類](#ノードの種類) 7. [一意なノード ID](#一意なノード-id) 8. [Start ノード](#start-ノード) 9. [Constant ノード](#constant-ノード) 10. [Return ノード](#return-ノード) 11. [表現](#表現) 12. [参考文献](#参考文献) [linear](https://github.com/SeaOfNodes/Simple/tree/linear) ブランチの直線的な Git の変更履歴をたどって [この章](https://github.com/SeaOfNodes/Simple/tree/linear-chapter01)を読むこともできます。 この章では、次のような単純なスクリプトをコンパイルすることを目指します。 ``` return 1; ``` `return` 文を実装します。`return` 文は引数として `expression` を受け取ります。 上の例のように、扱える `expression` の種類は整数リテラルだけです。 この単純な言語を実装するために、いくつかの主要な構成要素とデータ構造を導入します。 この章の[言語の文法全体](01-grammar.ja.md)はこちらです。 ## 実装言語 実装言語は Java です。広く利用でき、多くの人に知られているため、Java を選びました。 ## 前提 読者が従来の線形な中間表現を理解し、基本ブロック(Basic Block)や 制御フローグラフ(Control Flow Graph)などの用語に馴染みがあることを前提としています。 ここではこれらの話題を説明しません。必要であれば、標準的なコンパイラの教科書を参照してください。 ## アーキテクチャ 言語を解析しながら、Sea of Nodes(SoN)の中間表現を直接構築します。 抽象構文木(AST)による表現は作りません。これは SoN IR の大きな利点の1つ、 つまり言語の解析中にさまざまな悲観的ピープホール最適化を行えることを示すためです。 この点は[第2章](../chapter02/README.ja.md)以降でさらに詳しく説明します。 最終的には、型解析のパスを必要とせずに、プログラム全体の型付けができるようになります。 ### ノードのグラフとしての中間表現 中間表現は Node オブジェクトのグラフです。`Node` クラスは、IR グラフ内のオブジェクトの基底型です。 `Node` クラスは、すべてのサブタイプに継承される共通機能を提供します。 サブタイプは、それぞれに対応する意味を実装します。たとえば、AddNode は加算し、MulNode は乗算します。 各 `Node` は、従来の IR に現れるような「命令」を表します。 ### ノードはグラフを構成する Sea of Nodes IR の中心的な考え方は、各ノードが定義と使用(def-use)の依存関係によって ほかのノードと結ばれていることです。これは IR の非常に重要で基本的な側面なので、 その実装方法と、グラフ図での表し方を理解することが重要です。 基底クラス `Node` は、そのノードへの入力となるノードのリストを保持します。 入力とは、「使用(use)」から「定義(def)」へのエッジです。 つまり、`B` が定義で、`A` が `B` を使用する場合、`B` には `B` から `A` への def→use エッジがあり、 それに対応して `A` には `A` から `B` への入力の use→def エッジがあります。 図では、「使用」から「定義」への矢印を描きます。次はその例です。  実装では、`Node` 型は両方向のリンクを保持します。上の例では、次のようになります。 * `A` は `B` の「使用」なので、`B` は `A` の入力リストに含まれます。 * 逆に、`B` は出力リストを保持し、そのリストには `A` が含まれます。 * これらのエッジが常に対応していることが、重要な不変条件です。 `Node` クラスでは、次のようになっています。 ```java public abstract class Node { /** * Inputs to the node. These are use-def references to Nodes. *
* Generally fixed length, ordered, nulls allowed, no unused trailing space.
* Ordering is required because e.g. "a/b" is different from "b/a".
* The first input (offset 0) is often a Control node.
*/
public final ArrayList
* Outputs directly match inputs, making a directed graph that can be
* walked in either direction. These outputs are typically used for
* efficient optimizations but otherwise have no semantic meaning.
*/
public final ArrayList