ITパスポート 2013年 秋期 問55
問題文
プログラムの実行方式としてインタプリタ方式とコンパイラ方式がある。図は、データを入力して結果を出力するプログラムの、それぞれの方式でのプログラムの実行の様子を示したものである。a、bに入れる字句の適切な組合せはどれか。


選択肢
ア:
イ:(正解)
ウ:
エ:
🔒 解説は解答すると表示されます
インタプリタ方式とコンパイラ方式の図の読み取り【ITパスポート 解説】
正解の理由
図の左側は、ソース プログラム(人が読めるプログラムのこと)をそのまま読みながら実行している構成です。ソース プログラムと入力データが同じ箱(実行装置)に入っており、そこから直接結果が出ています。これはプログラムを実行時に逐次(1行ずつなど)解釈して実行する「インタプリタ(interpreter:通訳者のように逐次翻訳して実行する仕組み)」の特徴です。よって a はインタプリタになります。
右側は、まずソース プログラムを受けて別の箱(目的プログラム=実行可能なプログラム)を出力しており、その目的プログラムに入力データを与えて結果を出しています。これはソースをまとめて翻訳(コンパイル)して実行可能ファイル(目的プログラム)を作り、その後その目的プログラムを実行する「コンパイラ(compiler:一括で翻訳して実行ファイルを作る仕組み)」の特徴です。よって b はコンパイラになります。
したがって、選択肢の組合せは a=インタプリタ、b=コンパイラ、すなわち イ が正解です。
解法ステップ
- 図を見て「ソース プログラムがそのまま実行されているか」「別に目的プログラム(実行ファイル)が作られているか」を確認します。
- ソースをそのまま受け取って入力を処理している箱=インタプリタ。
- ソースを別の目的プログラムに変換してからその目的プログラムに入力を与えている図=コンパイラ。
- 図の左は前者、右は後者なので a=インタプリタ、b=コンパイラと結論づけます。
選択肢別の誤答解説
-
ア(a: インタプリタ、b: インタプリタ)
誤り。右側の図は目的プログラムを生成してから実行している構成なので、インタプリタでは説明できません。 -
イ(a: インタプリタ、b: コンパイラ)
正しい。左はソースを直接実行、右はソースを目的プログラムに変換してから実行、各特徴に合致します。ここが正答です(イ)。 -
ウ(a: コンパイラ、b: インタプリタ)
誤り。左の図に目的プログラムの生成が描かれていないため、コンパイラとは矛盾します。右は目的プログラムを生成しているので、インタプリタとは矛盾します。 -
エ(a: コンパイラ、b: コンパイラ)
誤り。左はソースを直接実行している形なので、コンパイルして目的プログラムを作る図とは一致しません。
よくある誤解
-
「インタプリタは必ず遅い/コンパイラは必ず速い」
一般にコンパイル済みの実行ファイルは高速ですが、最近は JIT(Just‑In‑Time)コンパイルなどで実行時に最適化する仕組みもあり、一概には言えません。 -
「インタプリタはエラー検出ができない」
インタプリタは実行時にエラーを発見しやすい一方、コンパイラは事前に多くの文法エラーや型の不整合を検出できます。ただし、ランタイムの例外(実行時エラー)はどちらにも起こり得ます。 -
「言語=完全にインタプリタ方式かコンパイラ方式か」
言語や実装によって混合されることがあります(例:ソース→バイトコード→実行時にJITでネイティブコード化など)。
補足コラム
- 代表的な実装例
- インタプリタ型の例:Python(通常インタプリタ的に動く。実際はバイトコード化して仮想マシンで実行する実装も多い)、Ruby、古典的なBASIC。
- コンパイラ型の例:C、C++。
- 混合例:Javaはソースをバイトコードという中間形式にコンパイルし、JVM(仮想マシン)が実行時に解釈/JITで最適化します。これは「コンパイル」と「インタプリタ」の中間的な戦略です。
- 目的プログラム(実行可能ファイル)の利点と欠点
- 利点:実行が速く配布しやすい(ソースを公開せずに配布可能)
- 欠点:生成に時間がかかる、プラットフォーム依存(生成された実行ファイルは作成環境によって動作が異なる場合がある)
FAQ
Q1: 「バイトコード」はどちらの方式ですか?
A1: バイトコードは中間形式で、コンパイラがソースから生成する場合もあります(例:Java)。そのバイトコードをインタプリタ風に実行したり、JITでネイティブ化したりするので、単純にどちらか一方とは言えません。
A1: バイトコードは中間形式で、コンパイラがソースから生成する場合もあります(例:Java)。そのバイトコードをインタプリタ風に実行したり、JITでネイティブ化したりするので、単純にどちらか一方とは言えません。
Q2: 「スクリプト言語は全部インタプリタですか?」
A2: いいえ。スクリプト言語でもバイトコード化したり、事前コンパイルする実装があります。言語仕様と実装(どのように動かすか)を区別して考えます。
A2: いいえ。スクリプト言語でもバイトコード化したり、事前コンパイルする実装があります。言語仕様と実装(どのように動かすか)を区別して考えます。
Q3: 「図から見分けるコツは?」
A3: 「別の箱(目的プログラム)を生成しているか」を見れば良いです。生成していればコンパイラ、していなければインタプリタと判断できます。
A3: 「別の箱(目的プログラム)を生成しているか」を見れば良いです。生成していればコンパイラ、していなければインタプリタと判断できます。
関連キーワード: インタプリタ、コンパイラ、ソースプログラム、目的プログラム、バイトコード、JITコンパイル、AOTコンパイル

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

