基本情報技術者 2012年 秋期 午前(科目A) 問20
問題文
プログラムを構成するモジュールの結合を、プログラムの実行時に行う方式はどれか。
選択肢
ア:インタプリタ
イ:オーバレイ
ウ:静的リンキング
エ:動的リンキング(正解)
プログラムを構成するモジュールの結合を、プログラムの実行時に行う方式はどれか。【午前2 解説】
要点まとめ
- 結論:モジュールの結合をプログラムの「実行時」に行う方式は動的リンキングであり、正解はエです。共有ライブラリを使って実行時にシンボルを解決します。
- 根拠:動的リンキングは実行時にロード済みの共有ライブラリや dlopen 等でライブラリを読み込み、アドレス解決や結合を行うため実行時結合の定義に合致します。
- 差がつくポイント:静的リンキングはリンク時に結合、オーバレイはメモリ管理の手法、インタプリタは実行方式であり結合(リンク)とは性質が異なります。
正解の理由
動的リンキングは実行ファイル起動時あるいは実行中に共有ライブラリを読み込み、シンボル(関数や変数)のアドレスを解決して結合(リンク)します。これにより同一ライブラリを複数プロセスで共有したり、ライブラリの差し替えやセキュリティパッチを実行ファイルの再リンクなしで反映できます。問題の「プログラムの実行時に行う」という条件に最も合致するため、動的リンキング(エ)が正解です。
よくある誤解
- インタプリタ = 実行時に結合する、は誤り:インタプリタはソースやバイトコードを逐次実行する方式であり、モジュールのリンキング(シンボル解決)を指すものではありません。
- オーバレイと動的リンキングを混同する:オーバレイは限られたメモリでコード領域を差し替える手法であって、シンボルの結合(リンク)そのものを指しません。
- 動的リンキングは常に遅い、は短絡的:ロード時や初回解決でオーバーヘッドはあるものの共有メモリや更新容易性などの利点があり、一概に劣るとは言えません。
解法ステップ
- 問題文で「実行時に行う」とある語句に着目する。
- 各選択肢の定義を思い出す(インタプリタ、オーバレイ、静的リンキング、動的リンキング)。
- 「リンク=シンボル結合」を行うのは静的リンキング(リンク時)か動的リンキング(実行時)かを比較する。
- 実行時に結合する定義に一致する動的リンキングを選ぶ。
選択肢別の誤答解説
- ア: インタプリタ
誤り。インタプリタはソースやバイトコードを逐次実行する方式であり、モジュールの「リンク(結合)」を指す言葉ではありません。ランタイムで動的に処理は行うが、設問の意味するリンキングとは異なります。 - イ: オーバレイ
誤り。オーバレイは限られた主記憶を有効利用するためにプログラムのある領域を差し替えて実行する手法であり、モジュール同士のシンボル解決や結合(リンキング)を行う方式ではありません。 - ウ: 静的リンキング
誤り。静的リンキングはリンク時(ビルド時)にオブジェクトファイルを結合して単一の実行ファイルを作る方式で、実行時に結合する方式ではありません。 - エ: 動的リンキング
正解。動的リンキングは実行時に共有ライブラリをロードし、シンボルを解決して結合する方式で、設問の条件「プログラムの実行時に行う方式」に該当します。
補足コラム
動的リンキングの実例としては Unix 系の .so、Windows の .dll があり、Unix では ld.so(動的ローダ)が起動時に共有ライブラリを読み込みます。プログラム中で動的にライブラリを読み込む場合は dlopen/dlsym(POSIX)や LoadLibrary/GetProcAddress(Windows)を使ってランタイムに結合します。静的リンキングは配布が単純で依存関係が少ない利点があり、組込みやブートローダでは今も用いられます。動的リンキングを使う際はABI互換性やライブラリのバージョン管理、セキュリティ(悪意あるライブラリのロード回避)に注意が必要です。
参考コマンド例(Linux):
# 動的リンクでライブラリをリンク(コンパイルはデフォルトで動的)
gcc main.c -o main -lmylib
# 動的にライブラリを開く(C)
void *h = dlopen("libmylib.so", RTLD_LAZY);
void (*f)() = dlsym(h, "func_name");
FAQ
Q: 動的リンキングは起動時だけでなく実行中にも行われますか?
A: はい。共有ライブラリは起動時に読み込まれることが多いですが、dlopen 等を使えば実行中に動的に読み込んで結合できます(遅延ロードも可能)。
A: はい。共有ライブラリは起動時に読み込まれることが多いですが、dlopen 等を使えば実行中に動的に読み込んで結合できます(遅延ロードも可能)。
Q: オーバレイは現在でも使われますか?
A: 組込みや極端にメモリが制約される環境では使われますが、現代のOSと仮想メモリ環境ではあまり一般的ではありません。
A: 組込みや極端にメモリが制約される環境では使われますが、現代のOSと仮想メモリ環境ではあまり一般的ではありません。
Q: 静的リンキングの利点は何ですか?
A: 配布が単純でライブラリ依存の問題が少ないこと、外部変更による動作不安定化を避けられる点が挙げられます。一方で実行ファイルが大きくなる欠点があります。
A: 配布が単純でライブラリ依存の問題が少ないこと、外部変更による動作不安定化を避けられる点が挙げられます。一方で実行ファイルが大きくなる欠点があります。
関連キーワード: 動的リンキング、共有ライブラリ、dlopen、LoadLibrary、静的リンキング、オーバレイ、インタプリタ、動的ローダ、PIC、シンボル解決

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

