言語処理系
概要
言語処理系 とは、任意のプログラミング言語で書かれたプログラムから、対象の計算機上で実行可能なプログラムを生成するソフトウェアである。言語処理系 のおかげで、プログラマはマシンコードを直接記述する代わりに高水準言語を利用できるため、プログラミングの複雑さが大幅に低減される。言語処理系には、大別して インタプリタ と コンパイラ がある。
インタプリタ (interpreter, 通訳系)
言語の意味を解析しながら、その意味する動作を実行する。
コンパイラ (compiler, 翻訳系)
言語を他の言語に変換し、その言語のプログラムを計算機上で実行させる。
狭い意味では、言語を機械語に変換して実行する ものを指す。ただし、他の言語あるいは仮想機械コードに変換するものもコンパイラと呼ぶ。例えば、TypeScript から JavaScript への変換は、公式でコンパイルと呼ばれていたりする。このような他の言語に変換するときは translator, トランスパイラと呼ぶこともある。
元のプログラムである ソースプログラム から、翻訳結果として オブジェクトプログラム を得る。オブジェクトプログラムがアセンブリの場合はアセンブラにより機械語に翻訳されて実行形式ファイルを得る。
基本構成
コンパイラもインタプリタも、ソースプログラムの意味解釈を行う構成は共通している。字句解析を行うプログラムを Lexer、構文解析を行う、あるいは字句解析および構文解析を行うプログラムを Parser とよんだりする。
1. 字句解析 (lexical analysis)
文字列を言語の要素 (token) の列に分解する
2. 構文解析 (syntax analysis)
token 列を AST (abstract syntax tree) に変換する
3. 意味解析 (semantics analysis)
AST の意味を解析する
インタプリタ では、ここで 意味を解析し動作を行う
コンパイラ では、ここで 中間コード に変換する
4. 最適化 (code optimization)
中間コード を変形して、効率の良いプログラムに変換する
5. コード生成 (code generation)
オブジェクトプログラム の言語に変換し、出力する
オブジェクトコード, 目的プログラム や 目的コード とも呼ばれる
ターゲットの計算機のコンピュータアーキテクチャに合わせたアセンブリ言語に変換する
https://gyazo.com/f1a39b6a9581394fc0ca9bc6b3857e97
参考
構文解析にまつわる小話たち
筑波大学 情報学類 プログラミング言語処理 講義資料