リンカの機能は何か ローダ・デバッガとの役割の違いを整理
基本情報技術者試験 平成30年度秋期 午前 問20 / ソフトウェア › 開発ツール
過去問にチャレンジ
リンカの機能として,適切なものはどれか。
- ア
作成したプログラムをライブラリに登録する。
- イ
実行に先立ってロードモジュールを主記憶にロードする。
- ウ
相互参照の解決などを行い,複数の目的モジュールなどから一つのロードモジュールを生成する。
- エ
プログラムの実行を監視し,ステップごとに実行結果を記録する。
会話形式の解説
講師今回はリンカの機能を問う問題です。プログラムは、翻訳する、結合する、主記憶に載せる、実行を調べる、という段階を経て動きます。各選択肢がどの段階の作業を書いているかに注目してください。
受験者リンカとローダがいつも混ざってしまいます。「主記憶にロードする」という選択肢も、リンカの仕事のような気がしてしまいました。
講師そこが一番の引っかけです。まず、コンパイラが出力する目的モジュールの中身を考えてみましょう。目的モジュールは、原始プログラムを機械語に翻訳したものです。ほかのモジュールにある関数などへの参照はどうなっていると思いますか。
受験者別のファイルにある関数の場所は、翻訳した時点ではまだ分からないということでしょうか。
講師そのとおりです。参照が未解決のまま残っています。この相互参照を解決して、複数の目的モジュールを一つの実行可能な形、つまりロードモジュールにまとめるのがリンカです。ですから、相互参照を解決して一つのロードモジュールを生成するという選択肢が正解です。
受験者では主記憶にロードするほうは、リンカが作ったロードモジュールを使う次の段階の作業ということですね。
講師はい。ロードモジュールを主記憶に配置するのはローダの役割です。リンカの担当はロードモジュールを作るところまで、と区切って覚えると混ざりにくくなります。
受験者ライブラリに登録する選択肢も迷いました。リンカはライブラリを使うと聞いた気がします。
講師よく覚えていますね。リンカは、ライブラリに登録済みのモジュールを取り出してロードモジュールに組み込むことはできます。ただ、登録すること自体はアーカイバなど、ライブラリを作成するツールの役割です。使う側と作る側を分けて考えてください。
受験者実行を監視してステップごとに記録するものは、実行中の作業なので、実行前に結合するリンカとは違いますね。
講師そうです。それはデバッガやトレーサのような検証用ツールの機能です。時点が実行中なので、リンカではないと判断できます。
受験者整理すると、リンカは目的モジュールの参照を解決して結合しロードモジュールを作る、ローダはそれを主記憶に載せる、デバッガやトレーサは実行中を調べる、ライブラリへの登録は別のツール、ということですね。
講師完璧です。補足すると、ここで扱ったのは実行前にまとめて結合しておく静的リンキングです。実行時に共有ライブラリなどと結び付ける動的リンキングという方式もあります。各選択肢が「どの時点で」「何を」行う作業かに注意すると、リンカとローダを取り違えにくくなります。
まとめ
リンカ(連係編集プログラム)は、目的モジュール間に残っている未解決の相互参照を解決し、複数の目的モジュールを結合して一つのロードモジュールを生成します。ロードモジュールを主記憶に配置するのはローダで、リンカの担当はロードモジュールを作るところまでです。リンカはライブラリに登録済みのモジュールを組み込めますが、ライブラリへの登録はアーカイバなどの役割です。実行中の監視や記録はデバッガやトレーサが行います。各作業が「どの時点で」「何を」行うものかを見ると区別しやすくなります。
解答・解説
正解はウです
この問題のテーマ
プログラムを作ってから実行するまでに使う道具のうち、リンカが受け持つ役割を、ローダやデバッガなどの役割と区別できるかを問う問題です。
解き方の考え方
原始プログラムを翻訳する、目的モジュールを結合する、主記憶に載せる、実行を調べる、という流れの中で、各段階を担当する道具を順に当てはめます。コンパイラが出力する目的モジュールには、ほかのモジュールへの参照が未解決のまま残っています。この参照を解決して一つの実行可能な形にまとめるのがリンカです。それぞれの選択肢がどの段階の作業を書いているかを見れば、正解を絞り込めます。
選択肢ごとの解説
- ×ア 作成したプログラムをライブラリに登録する。アの「プログラムをライブラリに登録する」作業は、ライブラリを作成・管理する側の仕事です。リンカはライブラリに登録済みのモジュールを取り出して組み込むことはできますが、登録すること自体はリンカの機能ではありません。
- ×イ 実行に先立ってロードモジュールを主記憶にロードする。イの「実行に先立ってロードモジュールを主記憶にロードする」作業は、ローダの役割です。リンカが担当するのはロードモジュールを作るところまでで、そのロードモジュールを主記憶に配置するのは次の段階になります。
- ○ウ 相互参照の解決などを行い,複数の目的モジュールなどから一つのロードモジュールを生成する。ウは、モジュール間の相互参照を解決し、複数の目的モジュールを結合して一つのロードモジュールを作ると説明しています。これはリンカの中心的な機能そのものなので、この選択肢が正解です。
- ×エ プログラムの実行を監視し,ステップごとに実行結果を記録する。エの「実行を監視し、ステップごとに結果を記録する」作業は、プログラムが動いている間に行うものです。これはデバッガやトレーサのような検証用ツールの機能で、実行前にモジュールを結合するリンカの機能とは違います。
補足
ここで扱っているのは、実行前にまとめて結合しておく静的リンキングです。これに対し、実行時に共有ライブラリなどと結び付ける動的リンキングという方式もあります。問題文が「どの時点で」「何を」行うのかに注意すると、リンカとローダを取り違えにくくなります。
POINT
- リンカ(連係編集プログラム)は、目的モジュール間の外部参照を解決し、それらを結合して一つのロードモジュールを生成します。
- リンカは、必要に応じてライブラリに登録済みのモジュールを取り出し、ロードモジュールに組み込むこともできます。
- ロードモジュールを主記憶に配置するのはローダで、リンカとは別の役割です。
- 実行中の動きを監視したり記録したりするのはデバッガやトレーサの役割です。
