コンパイラの仕事
プログラム言語を使って書いたソースコードを翻訳して機械語のプログラムファイルにする
ことです。
ソースコードからリンカまでの流れ
気づき
コンパイラをすることによって目的プログラムを生成する。
目的プログラムとは?
ソースコードをコンパイルしたものは「オブジェクトコード」
オブジェクトコードの別の呼び名が「目的プログラム(モクテキプログラム)」
出典 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
気づき
プログラムを作って動かす際の手順は
1.プログラムを作る
2.プログラムを動かす
です。
出典 https://wa3.i-3-i.info/word14693.html
1でリンクすると静的
2でリンクすると動的になるのか。
ローダの仕事
ロードモジュールを主記憶装置に読み込ませる作業をロード
という。
これを担当するプログラムをローダ
という。
気づき
モジュールとライブラリの違いは?
モジュール
モジュールとは、ザックリいうと「ひとまとまりの機能
を持った部品」です。
基本的に単体で何かするようなものではなく、何かと組み合わせて使用します。
モジュールは「簡単に追加・削除できる」ことが特徴です。
ライブラリ
ライブラリとは、ザックリいうと「複数の部品をまとめたもの
」です。
ライブラリも基本的に部品を意味するのですが、主に「モジュールの集合体」という意味で使われます。
例えばプログラミングの世界では、
・モジュールをインポート→特定の機能
が使えるようになる。
・ライブラリをインポート→様々な機能
がまとめて使えるようになる。
という感じです。
これから勉強だ。