ITパスポート 2011年 春期 問81
問題文
プログラム言語に関する次の記述a〜cのうち、適切なものだけをすべて挙げたものはどれか。
a 機械語やアセンブリ言語で作成されたプログラムは、特定のCPUに依存することなく実行できる。
b コンパイラで変換されるプログラムは、最終的には機械語に変換されてから実行される。
c 人間の言葉に近い規則をもったプログラム言語(高水準言語)を活用すれば、機械語では実行できない複雑な演算が実行できるプログラムが開発できる。
選択肢
ア:a
イ:a, c
ウ:b(正解)
エ:b, c
🔒 解説は解答すると表示されます
プログラム言語に関する記述 a〜c のうち適切なものはどれか【ITパスポート 解説】
正解の理由
設問の記述 b「コンパイラで変換されるプログラムは、最終的には機械語に変換されてから実行される。」は正しいため、正しい選択肢は ウ です。
理由をやさしく言うと、最終的にコンピュータのハードウェア(CPU:中央処理装置、Central Processing Unit)が実行できるのは「機械語(machine code:CPUが直接理解する0と1の命令)」だからです。コンパイラ(compiler:高水準言語を機械語や中間コードに変換するソフト)は、直接ネイティブな機械語に変換する場合もありますし、一旦バイトコード(bytecode:中間形式)に変換してから実行時にさらに変換(または解釈)される場合もあります。しかしどの場合でも、最終的にはCPUが理解できる命令(機械語)として処理されます。よって b は適切です。
解法ステップ
- 各記述のキーワードを確認する(機械語、アセンブリ、コンパイラ、高水準言語)。
- 用語の定義を思い出すか短く確認する。
- 機械語:CPUが直接実行する命令(0と1)。
- アセンブリ言語:機械語に対応したニーモニック(人が読める記号)にしたもの。
- コンパイラ:ソースコードを別の形式(機械語や中間コード)に変換するソフト。
- 高水準言語:人間に近い書き方のプログラミング言語(例:C、Python、Java)。
- 各記述が定義と矛盾していないかを判断する。
- 正しい記述だけを含む選択肢を選ぶ。
この順で読めば、迷わず b のみ正しいと判断できます。
選択肢別の誤答解説
- ア: a(「機械語やアセンブリ言語で作成されたプログラムは、特定のCPUに依存することなく実行できる。」)
- 誤りです。機械語(machine code)はCPUの命令セット(例:x86、ARM)に依存します。アセンブリ言語(assembly language:機械語の人間向け表現)も同様にCPU依存です。別のCPUでは命令の形式やレジスタが違うため、そのままは動きません。
- 例:スマホ(ARM)向けの機械語は、一般的なPC(x86)ではそのまま実行できません。
- イ: a, c
- a が誤りなため、この組合せは誤りです(c の説明は下記参照)。
- ウ: b
- 正しい選択です。コンパイラ変換後のプログラムは、いずれにせよ最終的にCPUが実行可能な形(機械語)として動作します。たとえ中間のバイトコードを経由しても、実行時にはバイトコードを解釈またはネイティブ化(JIT:Just-In-Time コンパイル)するプログラムが機械語で動いています。
- エ: b, c
- b は正しいですが、c が誤りなのでこの組合せは誤りです。
- c「高水準言語を活用すれば、機械語では実行できない複雑な演算が実行できるプログラムが開発できる。」は誤りです。高水準言語は表現が楽になるだけで、計算能力自体(理論上実行可能な計算)は機械語でも表現できます。機械語は低レベルな手段ですが、原理的には同じ計算を実行可能です。
よくある誤解
- 「高水準言語なら機械語でできないことができる」
- 誤解です。高水準言語は書きやすさや抽象化を与えるだけで、計算の「できる限界」は変わりません(計算理論におけるチューリング完全性の話)。
- 「コンパイラは必ず最初から機械語にする」
- 部分的に誤解です。多くのコンパイラはネイティブ機械語に直接変換しますが、Java のようにバイトコードに変換する場合もあります。重要なのは最終的にCPUが実行できる形になる、という点です。
- 「アセンブリは機械語とまったく同じもの」
- 人が読みやすい表記(ニーモニック)ですが、対応する機械語がCPU依存である点は同じです。アセンブラ(assembler)はアセンブリを機械語に変換します。
補足コラム
- 中間形式と仮想マシン
- Java はソースをバイトコードに変換し、JVM(Java Virtual Machine:仮想マシン)がそのバイトコードを実行します。JVM 自体は機械語で動作しており、さらに実行時にバイトコードをネイティブに変換するJIT(Just-In-Time)を使うこともあります。つまり「一度バイトコードにしているから機械語と無関係」というわけではありません。
- ポータビリティ(移植性)と依存関係
- 高水準言語+仮想マシンの組合せは「書いたプログラムを複数のCPUで動かしやすくする」利点があります。これは「機械語に依存しないプログラムがある」という意味ではなく、実行環境(仮想マシン)を各CPU向けに用意することで実現しています。
(簡単な例)
/* C言語は通常コンパイルしてネイティブ実行 */
int main() { return 0; }
# Python はインタプリタやバイトコードを用いることが多い(例:PyPyはJITを使う)
print("Hello")
FAQ
Q1. コンパイラとインタプリタはどう違いますか?
A1. コンパイラ(compiler)はソース全体を別の形式(機械語や中間コード)に一括変換します。インタプリタ(interpreter)はソースや中間コードを逐次読み解いて実行します。実際は「どちらか一方だけ」というより、両者の技術を組み合わせた実装も多いです。
A1. コンパイラ(compiler)はソース全体を別の形式(機械語や中間コード)に一括変換します。インタプリタ(interpreter)はソースや中間コードを逐次読み解いて実行します。実際は「どちらか一方だけ」というより、両者の技術を組み合わせた実装も多いです。
Q2. 機械語とアセンブリはどちらを覚えれば良いですか?
A2. 初心者はまず高水準言語でアルゴリズムや考え方を学ぶのが効率的です。必要に応じて低レベル(アセンブリ)を学ぶと、コンピュータ内部の動きが理解しやすくなります。
A2. 初心者はまず高水準言語でアルゴリズムや考え方を学ぶのが効率的です。必要に応じて低レベル(アセンブリ)を学ぶと、コンピュータ内部の動きが理解しやすくなります。
Q3. 高水準言語で書いたものは必ず速くなるのですか?
A3. 速さは言語そのものだけで決まらず、コンパイラや実行環境、アルゴリズムによります。高水準言語は生産性が高い反面、最適化によってはネイティブの手書きのコードより遅くなる場合があります。
A3. 速さは言語そのものだけで決まらず、コンパイラや実行環境、アルゴリズムによります。高水準言語は生産性が高い反面、最適化によってはネイティブの手書きのコードより遅くなる場合があります。
関連キーワード: 機械語、アセンブリ言語、コンパイラ、インタプリタ、バイトコード、JIT、CPU依存、高水準言語、ポータビリティ

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

