プログラム言語に関する次の記述 a~c のうち, 適切なものだけをすべて挙げたものはどれか。 a 機械語やアセンブリ言語で作成されたプログラムは, 特定の CPU に依存することなく実行できる。 b コンパイラで変換されるプログラムは, 最終的には機械語に変換されてから実行される。 c 人間の言葉に近い規則をもったプログラム言語 (高水準言語) を活用すれば, 機械語では実行できない複雑な演算が実行できるプログラムが開発できる。
平成23年度 特別試験 ITパスポート試験 問81
この問題の解説と、これまでの解答の記録です。
問 81プログラム言語は水準で整理する
不正解ア
「a」だけを挙げているが、a 自体が誤りである。機械語は CPU が直接解釈する命令コードであり、命令の種類・オペランドの形式・ビット表現は CPU のアーキテクチャごとに異なる。アセンブリ言語はその機械語命令に人間が読める記号 (ニーモニック) を一対一で対応させた言語なので、やはり特定の CPU に固有である。つまり機械語やアセンブリ言語で書いたプログラムは、対象とした CPU 以外ではそのまま実行できず、CPU に依存しないという記述は成り立たない。加えて正しい記述である b が漏れている点でも不適切である。
不正解イ
「a, c」を挙げているが、a と c はどちらも誤りであり、正しい b が含まれていない。a が誤りである理由は上記のとおり機械語・アセンブリ言語が CPU 依存だからである。c が誤りである理由は、高水準言語で書かれたプログラムも実行前または実行時に機械語へ翻訳され、CPU は機械語しか実行しないため、機械語で表現できない演算を高水準言語なら実行できるということはないからである。誤りの記述を 2 つ選んでいるので、この選択肢は二重に不適切である。
- ウ
正解 正解はウ「b」。適切な記述は b だけである。b の「コンパイラで変換されるプログラムは, 最終的には機械語に変換されてから実行される」が正しい理由は、CPU が直接解釈・実行できる命令は機械語 (0 と 1 の並びで表された命令コード) だけだからである。C のような人間が読み書きする言語で書かれた原始プログラム (ソースプログラム) は、そのままでは CPU に理解できない。そこでコンパイラが原始プログラム全体を一括して翻訳し、CPU が実行できる形式である目的プログラム (機械語) を生成する。実行時に動いているのはこの機械語であり、ソースコードそのものではない。インタプリタ方式のように 1 行ずつ解釈しながら実行する方式でも、最終的に CPU に渡って処理されるのは機械語の命令であるという点は変わらない。一方、a は機械語・アセンブリ言語が CPU 依存であるという基本を否定しており誤り、c は高水準言語が機械語の能力を超えた演算を可能にすると述べており誤りである。よって適切なものは b のみであり、b だけを挙げている ウ が正解となる。
不正解エ
「b, c」を挙げており、b が正しい点は合っているが、c を余分に含めているため不適切である。c は高水準言語を使えば機械語では実行できない複雑な演算が可能になると述べているが、高水準言語のプログラムもコンパイラやインタプリタを介して最終的には機械語として CPU で実行される以上、実行できる処理の範囲は機械語で書ける範囲と同じである。高水準言語の本当の利点は、人間の言葉や数式に近い記法で書けるので開発効率と可読性が高く、特定の CPU に依存しにくい (移植性が高い) ことであって、演算能力そのものが増えるわけではない。この選択肢は「適切なものだけをすべて」という条件のうち、余計なものを含めない条件を満たしていない。
- プログラム言語は水準で整理する。機械語は CPU が直接実行できる 0 と 1 の命令コードで、アセンブリ言語はそれに記号を対応させた低水準言語であり、どちらも CPU のアーキテクチャに依存する。これに対し C や Java などの高水準言語は人間の言葉や数式に近い記法で書け、同じソースを異なる CPU 向けに翻訳し直せるため移植性が高い。ただし高水準言語であっても実行時には機械語に翻訳されるので、実行できる処理の範囲は機械語と同じである。
- 言語処理プログラムの役割を押さえる。コンパイラは原始プログラム (ソースプログラム) を一括して翻訳し、機械語の目的プログラムを生成してから実行する方式で、インタプリタは 1 行ずつ解釈しながら実行する方式である。方式は違っても、最終的に CPU が処理するのは機械語であるという原則は共通で、この原則が記述 b を正しく、記述 c を誤りと判断する根拠になる。