応用情報技術者 2023年 秋期 午前2 問18
問題文
あるコンピュータ上で、当該コンピュータとは異なる命令形式のコンピュータで実行できる目的プログラムを生成する言語処理プログラムはどれか。
選択肢
ア:エミュレーター
イ:クロスコンパイラ(正解)
ウ:最適化コンパイラ
エ:プログラムジェネレーター
🔒 解説は解答すると表示されます
クロスコンパイラ【午前2解説】
正解の理由
問題文が指す「当該コンピュータとは異なる命令形式のコンピュータで実行できる目的プログラムを生成する」機能は、ソースコードをホスト(コンパイルを実行する機械)とは異なるターゲット(生成される実行環境)の命令形式・ABI向けに機械語を出力する仕組みを指します。これはコンパイラの一種で、特にホストとターゲットが異なる場合を扱うため「クロスコンパイラ」と呼ばれます。選択肢では イ がこれに該当します。
解法ステップ
- 問題文のキーワード抽出:「異なる命令形式」「目的プログラムを生成」→ ホストとターゲットが異なるコンパイル処理を示す。
- 各選択肢の定義確認:
- エミュレーター:他環境の命令を解釈・実行するソフト(実行時のシミュレーション)
- クロスコンパイラ:別の命令形式(別ISA/OS)向けにバイナリを生成するコンパイラ
- 最適化コンパイラ:生成コードの性能向上を目的に最適化するコンパイラ(ターゲットは同一が前提)
- プログラムジェネレーター:高レベル仕様からソース等を自動生成するツール(必ずしも別ISA向けではない)
- 要件に一致するものを選択:上の比較から イ(クロスコンパイラ)を選ぶ。
選択肢別の誤答解説
-
ア: エミュレーター
エミュレーターは別ISA向けの命令をホスト上で解釈・実行(模倣)するものであり、「目的プログラムを生成する」役割は持ちません。実行手段であって、生成手段ではない点が異なります。 -
ウ: 最適化コンパイラ
最適化コンパイラはコードの生成品質(速度やサイズ)を改善しますが、ホストとターゲットが異なることを示すものではありません。最適化を行うかどうかはクロス/ネイティブに関わらず存在します。 -
エ: プログラムジェネレーター
プログラムジェネレーターは仕様からソースコードやテンプレートコードを生成するツールで、必ずしも別命令形式の機械語(目的プログラム)を直接生成するわけではありません。生成物のレベルと目的が問題の条件と一致しません。
よくある誤解
-
クロスコンパイラは「エミュレーターと同じ」と混同する
エミュレーターは実行、クロスコンパイラは生成(ビルド)を行う点が根本的に異なります。生成したバイナリは実機でそのまま動きますが、エミュレーター上で動かす場合は翻訳・解釈のコストがかかります。 -
「最適化コンパイラ=クロスコンパイラ」と考える誤り
最適化の有無はターゲットの違いとは無関係です。最適化は生成コードの品質向上、クロスは生成先プラットフォームの違いを指します。
補足コラム
クロスコンパイルは組込み開発やOS間移植、クロスプラットフォームビルドで頻繁に用いられます。一般にツールチェーンは「コンパイラ(gcc/clangなど)+アセンブラ+リンカ+ライブラリ(Cランタイム等)」で構成され、ターゲットを表すトリプル(例: arm-none-eabi、x86_64-w64-mingw32)を用いて特定します。ホストでビルドしてターゲット向けバイナリを生成するため、テストはエミュレータ(QEMU等)か実機で行います。
例(ARM向けにクロスコンパイルするコマンド例):
# arm-none-eabi ツールチェーンを用いた例
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -O2 -o main.elf main.c
# 別にリンカスクリプトやライブラリ指定が必要な場合が多い
FAQ
Q1: クロスコンパイラとクロスアセンブラの違いは何ですか?
A1: クロスコンパイラは高水準言語(Cなど)からターゲット機械語を生成します。クロスアセンブラはアセンブリ言語から機械語を生成するツールで、どちらもホストとターゲットが異なり得ますが入力レベルが異なります。
A1: クロスコンパイラは高水準言語(Cなど)からターゲット機械語を生成します。クロスアセンブラはアセンブリ言語から機械語を生成するツールで、どちらもホストとターゲットが異なり得ますが入力レベルが異なります。
Q2: クロスコンパイルで異なるOS用バイナリも作れますか?
A2: はい。ターゲットトリプルにOS情報を含められるツールチェーンなら、異なるOS向けの実行形式を生成できます(例: LinuxホストからWindows用のPEを生成する交差ツールチェーンなど)。
A2: はい。ターゲットトリプルにOS情報を含められるツールチェーンなら、異なるOS向けの実行形式を生成できます(例: LinuxホストからWindows用のPEを生成する交差ツールチェーンなど)。
Q3: 生成したバイナリが実機で動かない場合は?
A3: ABI不一致、ライブラリ不足、リンカスクリプトの誤り、エンドiannessやCPU拡張の不整合などが原因です。まずはターゲット仕様(CPU世代、ABI、ライブラリ)を確認し、エミュレータで実行確認するとデバッグが容易です。
A3: ABI不一致、ライブラリ不足、リンカスクリプトの誤り、エンドiannessやCPU拡張の不整合などが原因です。まずはターゲット仕様(CPU世代、ABI、ライブラリ)を確認し、エミュレータで実行確認するとデバッグが容易です。
関連キーワード: コンパイラ、クロスコンパイル、エミュレーター、ホスト、ターゲット、ツールチェーン、ABI、リンカ、組込み開発

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

