0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

コンパイラの仕事

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

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

気づき

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

目的プログラムとは?

ソースコードをコンパイルしたものは「オブジェクトコード」
オブジェクトコードの別の呼び名が「目的プログラム(モクテキプログラム)」
出典 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でリンクすると動的になるのか。

ローダの仕事

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

気づき

モジュールとライブラリの違いは?

モジュール

モジュールとは、ザックリいうと「ひとまとまりの機能を持った部品」です。

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

ライブラリ

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

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

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

出典 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/

これから勉強だ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?