コンパイラ方式でのプログラム実行手順

# コンパイラの仕事
プログラム言語を使って書いたソースコードを```翻訳して機械語のプログラムファイルにする```ことです。

ソースコードからリンカまでの流れ

https://www.nskint.co.jp/wp-content/uploads/2019/11/2.7.%E5%AE%9F%E8%A1%8C%E3%83%A2%E3%82%B7%E3%82%99%E3%83%A5%E3%83%BC%E3%83%AB%E4%BD%9C%E6%88%90%E3%81%BE%E3%81%A6%E3%82%99%E3%81%AE%E6%89%8B%E9%A0%86.pdf

## 気づき
コンパイラをすることによって目的プログラムを生成する。

### 目的プログラムとは？
ソースコードをコンパイルしたものは「オブジェクトコード」
オブジェクトコードの別の呼び名が「目的プログラム（モクテキプログラム）」
出典 https://wa3.i-3-i.info/word17206.html

## コンパイラの手順
### 字句解析
ソースコードにかかれているプログラムコードを字句（トークン)単位に分解する。
* トークンのリストを生成する理由は、```文字列の認識処理が簡単```になるからです。Javaの文法を例として考えてみましょう。
...
このような文字列があるときに、先頭から1文字ずつ"l"、"o"、……と認識するよりも、データ型（"long"）、変数名（"length"）、等号記号（"="）、数値（"256"）、セミコロン（";"）のトークンで```構成されるリストとして扱えた方が分かりやすい```はずです。
    出典 https://atmarkit.itmedia.co.jp/ait/articles/0705/15/news135.html

### 構文解析
分解したトークンを、プログラム言語の```構文規則に従って解析```する。
木構造と呼ばれるデータ構造を生成する。
### 意味解析
変数の型や文がプログラム言語の```仕様に沿っているかを確認```する。

### 最適化
処理効率の向上を目的として、```より良いプログラムコードの再編成を検討```する。

### コード生成
目的プログラムを生成する。

# リンカの仕事
プログラムを実行する時は、
```分割したモジュール```、```ライブラリ```、```あらかじめ提供された関数```、```共通モジュール```をつなぎ合わせなければならない。

それぞれをつなぎ合わせる作業を```リンク(連携編集)```と呼ぶ。
リンクの作業をするのを```リンカ(連係編集プログラム)と言う。

## 静的リンカ
```あらかじめリンク```しておく手法

### 特徴
* 静的にリンクすると主プログラムがメモリにロードされるのと同時に，呼び出し先プログラムもロードされます。そのため，プロセス起動時にはロード時間が掛かりますが，CALL文でほかのプログラムを呼び出すとき，```すでにメモリ上にプログラムがロードされているので，高速```に呼び出せます。
* 静的にリンクした方がよいケース
同じプログラムを何度も呼び出すようなプログラム構造の場合は，静的にリンクした方が```プログラムの実行性能が良く```なります。
出典 http://itdoc.hitachi.co.jp/manuals/3000/30003D0820/GD080296.HTM

* 静的リンクでは、```実行に必要なすべてのコードが実行可能ファイルの中に入った状態```になるので、単体で実行できます。また、すでにリンク済みであるため、動的リンクと違って実行時に行う追加の処理がありません。一方で、```ライブラリのコードも上乗せされるため、実行可能ファイルのサイズが大きく```なります。また、```同じライブラリを使うプログラムが複数あるとき、それぞれに同じコードを含める無駄```があります。

* 静的リンクでは、ライブラリ側に更新があって、その内容を反映したいときには、プログラム全体をビルドしなおして、```実行可能ファイルを作り直さなければなりません```。動的リンクの場合は、実行可能ファイルを作り直す必要がありませんが、逆にいえば、勝手に更新が反映されることになるため、```プログラムの動作が変わり、それが不具合につながる可能性```があります（DLL地獄）。
出典 https://programming-place.net/ppp/contents/glossary/sa/static_link.html

## 動的リンキング
プログラムの実行時に共有ライブラリやシステムライブラリをロードしてリンクする手法

### 特徴
* 動的にリンクすると主プログラムがメモリにロードされても，副プログラムはロードされないため，```プロセス起動時のロード時間が静的リンクより高速```になります。また，```プログラムが消費するメモリ空間が少なくて済みます```。しかし，CALL文の実行時に，呼び出し先プログラムのロードと検索処理が実行されるため，CALL文の処理時間は遅くなります。
* 動的にリンクした方がよいケース
処理の流れによって呼ばれないことがある```副プログラムがある場合は，動的にリンクした方がプログラムの実行性能が良く```なります。
出典 http://itdoc.hitachi.co.jp/manuals/3000/30003D0820/GD080296.HTM

* 静的リンクと違って、同じライブラリを使うプログラムが複数あるときに、それぞれに同じコードを含まなくて済み、```実行可能ファイルのサイズも小さくなります```。また、ライブラリ側に更新があって、その内容を反映したいときに、```プログラムをビルドしなおす必要がありません```（API に変更があった場合は除く）。しかし、ライブラリのファイルを差し替えただけで、```プログラムの動作に変更が加わる```ことになるため、それが予期せぬ不具合につながる可能性もあります（DLL地獄）。
出典 https://programming-place.net/ppp/contents/glossary/ta/dynamic_link.html

## 気づき
プログラムを作って動かす際の手順は

１．プログラムを作る
２．プログラムを動かす

です。
出典 https://wa3.i-3-i.info/word14693.html
１でリンクすると静的
２でリンクすると動的になるのか。

# ローダの仕事
ロードモジュールを主記憶装置に読み込ませる作業を```ロード```という。
これを担当するプログラムを```ローダ```という。

## 気づき
モジュールとライブラリの違いは？
### モジュール
モジュールとは、ザックリいうと「```ひとまとまりの機能```を持った部品」です。

基本的に単体で何かするようなものではなく、何かと組み合わせて使用します。
モジュールは「簡単に追加・削除できる」ことが特徴です。

### ライブラリ
ライブラリとは、ザックリいうと「```複数の部品をまとめたもの```」です。

ライブラリも基本的に部品を意味するのですが、主に「モジュールの集合体」という意味で使われます。

例えばプログラミングの世界では、
・モジュールをインポート→```特定の機能```が使えるようになる。
・ライブラリをインポート→```様々な機能```がまとめて使えるようになる。
という感じです。

出典 https://exture-ri.com/2019/10/23/%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%80%81%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%80%81%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A3%E3%81%A6%E4%BD%95/

これから勉強だ。