Web Analytics Made Easy - StatCounter

工業大学生ももやまのうさぎ塾

うさぎでもわかるをモットーに大学レベルの数学・情報科目をわかりやすく解説!

うさぎでもわかる計算機システム Part10 コンパイラの基礎・分割コンパイルの流れ

こんにちは、ももやまです。

今回から再び計算機の中身について学ぶ計算機システムの続きをやっていきたいと思います。

 

最初はコンパイラの基礎と分割コンパイルの流れについて簡単にですがまとめています。

 

前回の計算機システムの記事はこちら

(Part09は組み合わせ回路や順序回路の論理回路系に関する内容です! もしよろしければご覧ください!)

 

1.機械語・アセンブリ言語と高級言語(復習)

まずは機械語・アセンブリ言語・高級言語の3つの復習を簡単にですがしたいと思います。

(1) 機械語

プロセッサ(CPU)が直接実行できて0, 1(2進数)の並びで書かれた言語のことを機械語と呼びます。

機械語の実行内容はプロセッサに依存します。

 

(2) アセンブリ言語

2進数そのままだと人間が読み書きするのに大変めんどいので、人間にとってわかりやすくした言語アセンブリ言語と呼びます。

アセンブリ言語は機械語と1対1対応しています。

 

(3) 高級言語

人間にとってさらにわかりやすく、読み書きしやすい言語のことを高級言語と呼びます。

皆さんが聞いたことのあるC言語、Java、Python、Rubyなどはすべて高級言語です。

 

もし忘れてしまった人はこちらの記事に詳しく書いてあるので復習しましょう。

 

2.コンパイラ・アセンブラ・インタプリタ

次にある言語で書かれたプログラムを実行できるように機械語に変換するソフトウェアを紹介していきましょう。

(1) コンパイラ

高級言語を低級言語(アセンブリや機械語)に変換(コンパイル)するソフトウェアのことをコンパイラと呼びます。

コンパイラの動きについては次の記事(Part11)で説明したいと思います。

 

主にC, Javaなどはコンパイラを用いて機械語に変換されます。

(2) アセンブラ

アセンブリ言語を機械語に変換(アセンブル)するソフトウェアのことをアセンブラと呼びます。

アセンブリ言語はそれぞれのニーモニック(オペコード・オペランド)を対応する機械語に1対1で変換することができます。

 

コンパイラ・アセンブラなどは、ある言語で書かれたプログラムを別の言語に変換するソフトウェアなのでトランスレータと呼ばれることもあります。

(3) インタプリタ

ソースコードを1行(1ステップ)ずつ機械語に直し、実行するソフトウェアのことをインタプリタと呼びます。

コンパイラとの違いとしては、コンパイラは一気にプログラムを機械語に直していく(翻訳)に対し、インタプリタは1行ずつ逐次的にプログラムを直していく(解釈)点が異なります。

 

1行ずつプログラムを翻訳していくため、コンパイラに比べると実行速度は落ちてしまいます

(すでに日本語に翻訳された本を読む(コンパイラ)のと、英語で書かれた本を少しずつ日本語訳して読む(インタプリタ)のでは読むスピードは当然違いますよね。)

 

Python, Ruby, Perl, Prologなどのスクリプト言語はインタプリタを用いて機械語に解釈されていきます。

3.分割コンパイルの流れ

複数ファイルを分割コンパイルし、実行するまでの流れを説明していきたいと思います。

下に図も用意しているので各Stepと一緒にご覧ください。

 

Step1:各ソースファイルを分割コンパイル

まず、それぞれのソースファイル・ヘッダファイルを分割コンパイルし、オブジェクトモジュールが入ったオブジェクトファイルを生成します。

 

例えばソースファイル dashi.c とヘッダファイル dashi.h を分割コンパイルすると dashi.o というオブジェクトファイルが生成されます。

(拡張子 .o の o はオブジェクトの o です!)

 

Step2:生成した各オブジェクトファイルをリンク

つぎに、Step1で生成した各オブジェクトファイルと既存のライブラリをリンク(結合)します。

このリンクするソフトウェアのことをリンカ(linker)と呼びます。

 

Step3:リンカで作成した実行可能ファイルを読み込み実行

リンカから1つの実行可能ファイルが生成されます。この実行可能ファイルのことをロードモジュールと呼びます。

(実行可能ファイルはWindowsであれば拡張子はexe、MacやLinuxなどのUnix系であれば outなどになります。例:Dashijiru.exe  Dashijiru.out)

 

最後に作成したロードモジュールを主記憶(メインメモリ)に読み込むことでプログラムを実行することができます。

ロードモジュールを主記憶に読み込む(ロードする)ソフトウェアのことをローダと呼びます。

 

今の流れを図に表すと下のようになります。

f:id:momoyama1192:20191130180238g:plain

 

 

4.練習問題

では、基本情報などの問題を使って3問ほど練習してみましょう。

練習1

インタプリタの説明として、適切なものはどれですか。

[基本情報技術者平成31年春期 午前問19]

ア:原始プログラムを、解釈しながら実行するプログラムである。
イ:原始プログラムを,推論しながら翻訳するプログラムである。
ウ:原始プログラムを,目的プログラムに翻訳するプログラムである。
エ:実行可能なプログラムを,主記憶装置にロードするプログラムである。

 

練習2

コンピュータで実行可能な形式の機械語プログラムを何と呼ぶか。

[ITパスポート平成25年春期 問60]

ア:オブジェクトモジュール
イ:ソースコード
ウ:テキストデータ
エ:ロードモジュール

 

練習3

リンカの機能として適切なものはどれか。

[ITパスポート平成25年春期 問60]

ア:作成したプログラムをライブラリに登録する。
イ:実行に先立ってロードモジュールを主記憶にロードする。
ウ:相互参照の解決などを行い、複数の目的モジュールなどから一つのロードモジュールを生成する。
エ:プログラムの実行を監視し、ステップごとに実行結果を記録する。

 

5.練習問題の答え

解答1

解答:ア

インタプリタはソースコードを解釈しながら機械語になおしていくソフトウェアでしたね。なので答えはアです。

(ちなみにウがコンパイラ、エがローダを指します。)

 

解答2

解答:エ

実行可能な機械語ファイルのことをロードモジュールと呼ぶのでしたのね。なので答えはエとなります。

 

解答3

解答:ウ

複数のオブジェクトモジュールから1つのロードモジュールを生成するファイルのことをリンカと呼ぶのでしたね。

なので答えはウとなります。

(ちなみにイはローダのことです。)

 

6.さいごに

今回はコンパイラの基礎、分割コンパイルの流れについて簡単にですが説明しました。

次回はよりコンパイラの流れを詳細に(字句解析とか構文解析などを中心に)説明していきたいと思います。