コンパイラ, またはコンパイリング技術まとめ.

🐥Glossary

  • コンパイラ: コンパイルするソフトウェア.

📝コンパイル

コンパイリング. Compliation.

高水準のプログラミング言語で書かれたプログラムをそれより低い水準の言語や機械語に変換すること.

  • コンパイルをするソフトウェアがコンパイラ.
  • 逆変換はデコンパイル(decompile).
  • cf. 📝インタプリタ, コンパイル不要でプログラムをランタイム実行.

📝ビルド

コンパイルしたファイルをまとめて実行ファイルにすること.

📝トランスパイル

transpile. あるプログラミング言語を別のプログラミング言語に変換すること.

  • compileは低水準言語(機械語)への変換だが, transpileは別の高級言語への変換.
    • ex. ) ClojureScript -> JavaScript
  • translation + compileの造語.

中間表現

💻ソースコード

プログラムが書かれたテキスト. ソース(src), コード(code).


🌲抽象構文木/AST

意味のあるものだけを残す. 中間表現のひとつ.

抽象構文木 - Wikipedia

📝オブジェクトコード

中間表現のコードの総称.

オブジェクトファイル、オブジェクトコード.

バイナリプログラム, 📝バイナリで記述されたコードだが, バイナリコードもバイトコードということが多い. bytecode. binary code.

  • 機械語バイナリ
  • 異なるモジュール間の相互参照を解決するシンボルテーブル
  • リロケーションテーブル
  • スタック巻き戻し情報
  • コメント
  • リンクまたはデバッグに使用されるメタデータ

🔌EVMバイトコード

オブジェクトファイル - Wikipedia

📝機械語

機械語とは、コンピュータの CPU で直接実行される一連の命令.

一つ一つの命令が行う仕事は極めて限定されており、CPU のレジスタやメモリ上の単位データに対して、読み込みやジャンプ、ALU といった操作を実行する。

機械語は, レジスタ、プロセッサを用いて、メモリを操作する.

📝アセンブリ言語は機械語を人間にわかりやすい形で記述する.

コンパイルフロー

字句解析/Lexical Analysis

ソースコードをトークンに分割し、トークンの種類を識別します。

🌲構文解析/Syntax Analysis

トークン列を構文木または解析木に変換し、ソースコードの構造を把握します。

意味解析/Semantic Analysis

意味的なエラーを検出し、型検査などを行います。

最適化/Optimization

中間コードや構文木を最適化し、実行速度やメモリ使用量を向上させます。

コード生成/Code Generation

最適化された中間コードから、ターゲットプラットフォーム向けの機械語やアセンブリ言語のコードを生成します。

リンキング/Linking

複数のコンパイル単位やライブラリを結合し、実行可能なプログラムを生成します。

🌲構文解析/Syntax Analysis

トークン列を構文木または解析木に変換し、ソースコードの構造を把握します。

構文解析器/Parser

文字列をうけとって構文木を生成する関数.

🌲パーサジェネレータ

Parserを自動生成するプログラム.

パーサジェネレータ - Wikipedia

構文木

構文解析の経過や結果(またはそれら両方)を🌲ツリー構造/Treeで表したもの.

構文木 - Wikipedia

コンパイル戦略

コンパイラの種類.

📝AOT compilation

事前コンパイル, AOTはAhead-of-timeの略.

アプリケーション実行前に事前にコンパイルすること.

JVM系言語のバイトコンパイルの文脈でよく登場する. C言語やC++では事前コンパイルが当たり前のため, 単にコンパイルと言われる. 対義語は📝JIT compilation.


📝JIT compilation

実行時コンパイル, JITはJust-In-Timeの略.

ソフトウェアの実行時にコードのコンパイルを行うことで実行速度の向上を図る.

インタプリタのJITコンパイルによって高速化!という文脈で登場することが多い. またはJITによってJavaでもJShellのようなREPLを実現する.

対義語はAOT.


📝トランスコンパイラ

トランスコンパイラ, トランスパイラ.

トランスコンパイラは同じ程度の(抽象化の)水準のコードをコンパイル結果として出力.

トランスコンパイラ - Wikipedia

AOTコンパイルとJITコンパイルの違いはなんですか?

AOTは事前に機械語にコンパイルする, JITは実行時に機械語にコンパイルする.

🔖コンパイル言語

Topics

🔗References

🐲Compilers, Principles, Techniques, and Tools

コンパイラ界隈のバイブル書籍. 通称「ドラゴンブック」

https://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques,_and_Tools

📝LISP