対象試験と出題頻度
クロスコンパイラは、基本情報技術者(FE)・応用情報技術者(AP)の午前で出題されるテーマです。
「開発ツール」分野の定番選択肢として、エミュレータ・最適化コンパイラ・プログラムジェネレータと並べて出題されるのが王道パターンです。
詳細をクリックして確認
基本情報技術者
応用情報技術者
★★☆☆☆
ランクC(応用)余裕があれば覚える
用語の定義
情報処理試験を勉強していると、「クロスコンパイラって普通のコンパイラと何が違うの?」と引っかかりがちです。
クロスコンパイラ(Cross Compiler)とは、一言で言うと
「動かしているコンピュータとは別のCPUで実行できる目的プログラムを生成する言語処理プログラム」
のことです。
イメージとしては、「日本のキッチンで作って海外で食べてもらうお弁当」です。
調理する場所(開発用PC)と食べる場所(実機)が違っても問題ない、というのがクロスコンパイラの考え方です。
組込み機器のように画面もキーボードも非力な機械では、その機械自身でプログラムを作ることが難しいため、パワフルなPC上で「向こうのCPU向け」の実行ファイルを焼いて持ち込みます。
📊 クロスコンパイラの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Cross Compiler |
| 分類 | 言語処理プログラム(開発ツール) |
| 主な用途 | 組込みシステム・マイコン・ゲーム機などの開発 |
| 対義語 | セルフコンパイラ(自分自身と同じCPU向けに生成) |
解説
そもそもCPUが違うと、機械語(バイナリ命令)の体系が変わります。
x86向けに作った実行ファイルはARMでは動きません。
ところが、組込み機器・IoTデバイス・マイコンのような小型機器は、開発に必要なディスク容量・メモリ・キーボード・ディスプレイを十分に備えていないことがほとんどです。
そこで、開発作業はリッチなPC上で行い、出力する実行ファイルだけをターゲット機器のCPUに合わせる、という分担が生まれます。これを実現するのがクロスコンパイラです。
ホストとターゲットの関係
クロスコンパイラを理解する鍵は「ホスト」と「ターゲット」という2つの登場人物です。
① セルフコンパイラ(ホストとターゲットが同じCPU)
hello.c
ソースコード
コンパイラ
x86 PC上で動作
hello.exe
x86向けバイナリ
x86 PC
同じPCで実行
→ コンパイルした場所と動かす場所が 同じCPU
② クロスコンパイラ(ホストとターゲットが 違うCPU)
hello.c
ソースコード
(同じものでOK)
クロスコンパイラ
x86 PC上で動作
hello_arm
ARM向けバイナリ
ARMマイコン
別の機器で実行
→ コンパイルする場所(ホスト)と動かす場所(ターゲット)の CPUが違う
ポイントは2つあります。
1つ目は「ソースコード(hello.c)は同じものを使い回せる」こと。
2つ目は「出力されるバイナリのCPU種別だけが変わる」ことです。
ホスト側のPCで開発作業を完結させたまま、ターゲット機器が必要とする命令形式のバイナリを生み出せる、これがクロスコンパイラの存在意義です。
セルフコンパイラとの違い
普段私たちがPC上でC言語を学習する際に使うコンパイラは、実行ファイルもそのPC上で動かします。
これは「セルフコンパイラ」と呼ばれ、ホストとターゲットが一致します。一方、クロスコンパイラはホストとターゲットが別CPUであるという1点だけが違います。
| 種別 | ホスト | ターゲット | 代表的な利用例 |
|---|---|---|---|
| セルフコンパイラ | x86 PC | x86 PC | PC上のアプリ開発 |
| クロスコンパイラ | x86 PC | ARM/RISC-V等 | 組込み機器・IoT・スマホアプリ |
コマンドの例(GCCのクロスコンパイル)
イメージを掴むために、Linux上でARM向けにビルドする例を示します。
試験で書き方は問われませんが、「別CPU向けにビルドする」感覚を掴むと記憶に残りやすくなります。
# 通常のGCC(ホスト=ターゲットがx86_64の場合)
$ gcc hello.c -o hello
# ARM向けクロスコンパイラ(ホストはx86 Linux、ターゲットはARM)
$ arm-linux-gnueabi-gcc hello.c -o hello_arm
# 生成物のCPUアーキテクチャを確認
$ file hello_arm
hello_arm: ELF 32-bit LSB executable, ARM, EABI5 …
同じソースコード(hello.c)から、ホスト用とターゲット用の2種類の実行ファイルを作り分けられる点が肝です。
紛らわしい開発ツールとの整理
試験で同じ選択肢に並ぶことの多い用語を一覧で整理しておきます。
| 用語 | 役割 |
|---|---|
| クロスコンパイラ | 別CPU向けの目的プログラムを生成する |
| エミュレータ | 他のコンピュータの動作をソフトウェアで模倣する |
| 最適化コンパイラ | 実行速度・メモリ効率を高めるよう目的コードを改善する |
| プログラムジェネレータ | パラメータからソースコードを自動生成する |
| インタプリタ | ソースコードを逐次解釈しながら実行する |
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 クロスコンパイラの核心を3行で
・ホストとターゲットでCPUが異なる前提で、ターゲット向けの実行ファイルを生成する
・組込み・マイコン・スマホ等、開発環境を載せにくい機器の開発で必須
・エミュレータ(動作の模倣)、最適化コンパイラ(速度向上)とは目的が別物
試験ではこう出る!
クロスコンパイラはFE・APの「開発ツール」分野で繰り返し問われており、出題文がほぼ同じ形で使い回されている定番テーマです。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE H17秋 午前 問36 |
「あるコンピュータ上で、異なる命令形式をもつ別のコンピュータで実行できる目的プログラムを生成する言語処理プログラム」を選ぶ問題。 | ・正解はクロスコンパイラ ・エミュレータ・最適化コンパイラ・ジェネレータがひっかけ |
| AP H27春 午前 問19 |
FE H17秋とほぼ同一文面の問題。「異なる命令形式のコンピュータで実行できる目的プログラム」の生成元を問う。 | ・FEとAPで設問が流用される典型例 ・キーワードは「異なる命令形式」 |
| AP R5秋 午前 問18 |
「当該コンピュータとは異なる命令形式のコンピュータで実行できる目的プログラムを生成する言語処理プログラム」を選ぶ問題。 | ・近年も同一論点で再出題 ・出題文の言い回しが多少変わっても答えは同じ |
📝 IPA試験での出題パターン
パターン1:「定義文を読ませて用語を選ばせる」
「異なる命令形式」「異なるコンピュータで実行できる目的プログラム」というキーワードが出てきたら、迷わずクロスコンパイラを選んでください。これだけで過去問の正答率が一気に上がります。
パターン2:開発ツール4択のひっかけ
選択肢には必ずと言っていいほど「エミュレータ(動作の模倣)」「最適化コンパイラ(コード改善)」「プログラムジェネレータ(コードの自動生成)」が並びます。それぞれの役割が「実行の模倣/改善/生成」であって「別CPU向け生成」ではない、と区別できれば確実に1点取れます。
深追いポイントとして、ツールチェーンやリンカ、ローダーまで踏み込んだ出題は午前ではほぼ見られません。試験ではここまででOKです。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. クロスコンパイラの説明として、最も適切なものはどれでしょうか?
- A. ソースコードを1行ずつ解釈しながら、その場で実行していく言語処理プログラム。
- B. あるコンピュータ上で、それとは異なる命令形式のコンピュータで実行できる目的プログラムを生成する言語処理プログラム。
- C. 他のコンピュータのハードウェアやOSの動作を、ソフトウェアによって模倣する仕組み。
正解と解説を見る
正解:B
解説:
選択肢Bは、まさに過去問(FE H17秋 問36/AP H27春 問19/AP R5秋 問18)で正解として問われたクロスコンパイラの定義そのものです。「異なる命令形式」「目的プログラムを生成」という2つのキーワードが揃っている点に注目してください。
選択肢Aはインタプリタの説明です。逐次解釈・即時実行が特徴で、目的プログラムを生成しません。選択肢Cはエミュレータの説明です。別の機器の動作を模倣するソフトウェアであり、コードを生成する言語処理プログラムではありません。
よくある質問(FAQ)
Q. スマホアプリの開発もクロスコンパイラを使っているのですか?
使っています。WindowsやMac(x86/Apple Silicon)上でAndroid(ARM)やiOS(ARM)向けのアプリをビルドしているため、構造的にはクロスコンパイルです。Android StudioやXcodeが裏側でターゲットCPU向けのツールチェーンを呼び出しているので、開発者が直接コマンドを叩く機会は減りましたが、行われている処理はクロスコンパイルそのものです。
Q. クロスコンパイラとクロスアセンブラは別物ですか?
考え方は同じで、入力する言語が違うだけです。クロスコンパイラはC言語などの高水準言語を入力し、別CPU向けの機械語を出力します。クロスアセンブラはアセンブリ言語を入力し、別CPU向けの機械語を出力します。組込み開発の現場では両方が同じツールチェーンに含まれていることが多く、まとめて「クロス開発環境」と呼ばれます。
Q. ターゲット機器でビルドできない理由は?
主な理由は3つあります。1つ目はリソース不足で、マイコンはRAMが数十KB~数MBしかなく、コンパイラ自体が動きません。2つ目は入出力装置の制約で、キーボードやディスプレイがない機器では編集作業ができません。3つ目は開発効率で、PC上の方がエディタ・デバッガ・バージョン管理が揃っており、開発スピードが段違いに速くなります。
Q. 生成した実行ファイルが動くか、ホスト側で確認する方法はありますか?
エミュレータやシミュレータを併用するのが定番です。例えばQEMUを使えば、x86 PC上でARM向けの実行ファイルを擬似的に動作させて挙動を確認できます。クロスコンパイラ(生成)とエミュレータ(実行模倣)は役割が分かれており、組み合わせることで実機に焼かなくてもデバッグできるのが現代の組込み開発の標準スタイルです。