基本情報技術者 2009年 春期 午前(科目A) 問22
問題文
図はプログラムを翻訳して実行するまでの流れを示したものである。コンパイラ、リンカ、ローダの入出力の組合せとして、適切なものはどれか。

選択肢
ア:(正解)
イ:
ウ:
エ:
🔒 解説は解答すると表示されます
コンパイラとリンカ・ローダの入出力関係【午前解説】
正解の理由
本問は「各処理器(コンパイラ・リンカ・ローダ)の入出力」を問う問題です。図の流れを順に追うと、コンパイラは原始プログラム(ソース)を受け取り、機械語を含むオブジェクトファイル(a)を生成します。リンカはそのオブジェクト(a)と別途用意された外部モジュールやライブラリ(b)を入力として受け取り、シンボル解決と再配置を行って実行可能なファイル(c)を出力します。最後にローダがその実行可能ファイル(c)を主記憶に展開して実行イメージを作るため、この組合せが正しい構成になります。以上より、正解は ア です。
解法ステップ
- 図の流れを「誰が何を受け取り何を出すか」で読み替える(コンパイラ→a、リンカ→c)。
- a に当てはまるものがコンパイラの典型出力(オブジェクト)か確認する。
- b がリンカに追加で与えられている点からライブラリ/外部オブジェクトであることを確認する。
- c がローダへ渡されている点から実行可能形式(ロードモジュール/実行ファイル)であることを確認する。
- 各装置の機能(シンボル解決・再配置・ロード)と照らし合わせて正答を選ぶ。
選択肢別の誤答解説
- ア: 正解 — コンパイラ出力がオブジェクト(a)、リンカが外部オブジェクト/ライブラリ(b)を結合して実行可能(c)を出力、ローダがそれを展開する流れで問題図と一致します。
- イ: 誤り — 多くの誤答パターンは a を「実行可能」や「ソース」と誤認するものです。コンパイラの通常出力はソースから直接の実行ファイルではなくオブジェクトです。
- ウ: 誤り — b を「ソースコード」扱いにしているケースは、リンカがソースを直接扱わない点で不適合です。リンカの入力はコンパイル済みオブジェクトやライブラリです。
- エ: 誤り — c を「オブジェクトファイル」などとする誤りは、ローダに渡されるのはロード可能な実行形式であり、リンカ出力の役割を果たさないため不正解です。
よくある誤解
- コンパイラが直接実行可能ファイルを出力すると誤解する:実装によってはワンステップ生成もあるが、伝統的な流れではコンパイラはオブジェクトを出力する。
- ローダがリンク(シンボル解決)を行うと誤解する:動的リンク時にローダが一部を行う場合はあるが、基本的なリンク処理はリンカの役割。
- 「ライブラリ」と「ソース/オブジェクト」を混同する:ライブラリは既成のオブジェクト群であり、リンカの入力になり得る点を区別する必要がある。
補足コラム
- 静的リンクと動的リンク:静的リンクではリンカが最終実行可能ファイルにライブラリコードを組み込みます。動的リンク(共有ライブラリ)ではリンクの一部(シンボル解決や再配置の一部)が実行時ローダ(ランタイムローダ)で行われる場合があります。
- 実行形式の例:Unix系では ELF、Windows では PE が代表的な実行可能ファイルフォーマットで、リンカはこれらのフォーマットで出力します。
- 再配置(relocation):オブジェクト内のアドレス参照を実行時の配置に合わせて修正する処理で、リンカまたはローダが担当します(静的 vs 動的で役割が異なる)。
FAQ
Q1. コンパイラは必ずオブジェクトファイルを出力しますか?
A1. 一般的にはコンパイラはオブジェクトファイルを出力しますが、統合型のツールやオプションにより直接実行ファイルを生成することも可能です。ただし基本概念としては「コンパイラ→オブジェクト、リンカ→実行可能」が標準です。
A1. 一般的にはコンパイラはオブジェクトファイルを出力しますが、統合型のツールやオプションにより直接実行ファイルを生成することも可能です。ただし基本概念としては「コンパイラ→オブジェクト、リンカ→実行可能」が標準です。
Q2. ローダは何をする装置(ソフト)ですか?
A2. ローダは実行可能ファイルを主記憶に展開し、必要に応じて再配置や初期化を行い、実行可能なプロセスイメージを作成します。動的リンクライブラリの読み込みや初期化も担当することがあります。
A2. ローダは実行可能ファイルを主記憶に展開し、必要に応じて再配置や初期化を行い、実行可能なプロセスイメージを作成します。動的リンクライブラリの読み込みや初期化も担当することがあります。
Q3. リンカとローダの境界があいまいになることはありますか?
A3. はい。動的リンクを使う環境では一部のリンク作業を実行時にローダ(ランタイムリンカ)が行うため、役割が重なる場面があります。基本概念を押さえつつ、実際の実装(静的/動的)に注意してください。
A3. はい。動的リンクを使う環境では一部のリンク作業を実行時にローダ(ランタイムリンカ)が行うため、役割が重なる場面があります。基本概念を押さえつつ、実際の実装(静的/動的)に注意してください。
関連キーワード: コンパイラ、リンカ、ローダ、オブジェクトファイル、実行可能ファイル、リンク、ロード、再配置、シンボル解決、共有ライブラリ、ELF、PE

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

