基本情報技術者

【基本情報技術者試験】言語プロセッサ

今回のテーマは「コンパイラ」や「インタプリタ」などの「言語プロセッサ」についてです。
言語プロセッサ?

問題

インタプリタの説明として,適切なものはどれか。

  • ア:原始プログラムを,解釈しながら実行するプログラムである。
  • イ:原始プログラムを,推論しながら翻訳するプログラムである。
  • ウ:原始プログラムを,目的プログラムに翻訳するプログラムである。
  • エ:実行可能なプログラムを,主記憶装置にロードするプログラムである。

基本情報技術者平成31年春期 午前問19

問題

コンパイラにおける最適化の説明として,適切なものはどれか。

  • ア:オブジェクトコードを生成する代わりに,インタプリタ用の中間コードを生成する。
  • イ:コンパイルを実施するコンピュータとは異なるアーキテクチャをもったコンピュータで動作するオブジェクトコードを生成する。
  • ウ:プログラムコードを解析して,実行時の処理効率を高めたオブジェクトコードを生成する。
  • エ:プログラムの実行時に,呼び出されたサブプログラム名やある時点での変数の内容を表示させるようなオブジェクトコードを生成する。

基本情報技術者平成28年春期 午前問19

基本情報技術者試験や応用情報技術者試験で出題される「言語プロセッサ」の問題。

コンパイラやインタプリタの動きを理解していないと難しく感じる問題ですが、動きを理解していればそこまで難しい問題ではありません。

本記事では「言語プロセッサ」について図解を利用して分かりやすく解説しています。

本記事で学べること

  • 言語プロセッサについて理解する
  • コンパイラの動きを理解する
  • インタプリタの動きを理解する
  • 基本情報技術者試験の過去問の解き方を学ぶ

言語プロセッサ

言語プロセッサとは、プログラミング言語で作られたプログラムの翻訳作業を行うソフトウェアの総称です。

プログラミング言語は人間が理解しやすいように作られた言語のため、プログラミング言語で記述したソースコードをコンピュータは理解できません。

プログラミング言語をコンピュータは理解できない

そのため、コンピュータが理解できる機械語に変換する必要があります。

機械語とはコンピュータの中央処理装置(CPU)が直接理解し実行することができる命令からなる言語のことで、CPUのアーキテクチャごとに機械語は異なります。

この機械語へ変換する翻訳作業を行うソフトウェアの総称のことを「言語プロセッサ」といい、主な言語プロセッサには「コンパイラ」「インタプリタ」「アセンブラ」があります。

アセンブラとは、低水準言語に分類される「アセンブリ言語」で書かれたソースコード(プログラム)をコンピュータが理解できる機械語に変換するソフトウェアのことです。それでは「コンパイラ」と「インタプリタ」について説明していきます。

スポンサーリンク

コンパイラ

コンパイラとは、プログラミング言語で記述されたソースコードをコンピュータが理解できる機械語に変換するソフトウェアのことです。

また、コンパイラを使ってソースコードを機械語に変換することを「コンパイル」といいます。

次の例は、コンパイラのイメージ例です。

コンパイラのイメージ例

コンパイラは、プログラミング言語で書かれた「ソースコード」を入力とし、コンピュータが理解できる機械語(オブジェクトコード)を生成します。

コンパイラによって変換される前のコードを「ソースコード」と呼び、変換後のコードを「オブジェクトコード」と呼びます。

中間コード(バイトコード)

ソースコードを直接 機械語(オブジェクトコード)に変換する「C言語」や「C++」などの言語とは違い、ソースコードを一旦 中間コード(バイトコード)と呼ばれるコードに変換する言語もあります。

中間コード(バイトコード)に変換する有名な言語に「Java」があります。

Javaは「Write once, run anywhere」(一度プログラムを書けば、どのコンピュータでも動く)をコンセプトにして開発された言語のため、プラットフォーム(Windows、macOS、Linuxなど)に依存せず、さまざまな環境で動かすことができるのが特徴です。

Javaプログラムは次の図のように、Java仮想マシンの上で動作します。

Java vm

Javaのコンパイラは、Java仮想マシンで実行可能な形式の中間コード(Javaバイトコード)に変換します。

バイトコードのイメージ例

そして Java仮想マシンは、各プラットフォームの差異を吸収するクッション的なソフトウェアであり、中間コード(Javaバイトコード)で記述されたコンピュータプログラムを解釈し、各プラットフォームで実行可能な形式のコード(機械語)に変換して実行します。

JITコンパイラ(実行時コンパイラ)

JITコンパイラとは Just In Timeの略で、その名の通り「必要なものを必要な時にコンパイルする」コンパイラのことです。

ソフトウェアの実行時にコードのコンパイルを行い実行速度の向上を図るコンパイラで「実行時コンパイラ」とも呼ばれています。

通常のコンパイラは、次の図のようにソースコードから機械語への変換を事前に行います。

コンパイラのイメージ例

それに対しJITコンパイラは、ソフトウェア実行時にソースコード または 中間コード(バイトコード)を機械語に変換します。

JITコンパイラのイメージ例

実行時にコンパイルを行うことでプラットフォーム(Windows、macOS、LinuxなどのOSやハードウェア)に依存しないソースコードや中間コードの状態でソフトウェアを配布することができます。

JITコンパイラは、機械語に変換しながら実行するインタプリタと表面上は同じように動作するが、内部ではコンパイルを行いインタプリタと比べると高速に動作します。

また事前コンパイラ(通常のコンパイラ)と比べると、JITコンパイラは実行時にコンパイルするため、その分の時間がかかるも、実行環境を知った上でそれに応じた生成コードの選択や最適化を行うことができるため、事前コンパイラよりも優れたコードを生成できる可能性があります。

Java」や「JavaScript」などの言語が「JITコンパイラ」を使用しています。

スポンサーリンク

クロスコンパイラ

クロスコンパイラとは、コンパイルを実施するコンピュータとは異なるアーキテクチャをもったコンピュータで動作するオブジェクトコード(機械語)を生成するコンパイラの一種です。

機械語はCPUのアーキテクチャごとに異なるため、アーキテクチャが異なるCPU同士では同じ機械語を使用できません。

クロスコンパイラは、コンパイルを実施するコンピュータ(CPU)とは異なるアーキテクチャをもったコンピュータ(CPU)で動作するオブジェクトコード(機械語)を生成します。

次の図は、クロスコンパイラのイメージ例です。

クロスコンパイラのイメージ図

例えば、電子レンジなどの家電製品に組み込まれたコンピュータは非常に小型であり、このコンピュータでプログラムを開発するのは無理があります。

そこで別のコンピュータで開発を行い、家電製品などに組み込まれたコンピュータ(コンパイルを実施するコンピュータとはアーキテクチャが異なるコンピュータ)で動作するコードを生成します。このときに使用するのがクロスコンパイラです。

トランスコンパイラ

トランスコンパイラとは、あるプログラミング言語で書かれたソースコードを入力として受け取り、別のプログラミング言語の同等のコードを生成するコンパイラの一種です。

コンパイラが、高水準言語(人間が理解しやすい言語)で書かれたソースコードを入力とし、低水準言語(コンピュータが理解しやすい言語)のコードを生成するのに対し、トランスコンパイラでは、同じ程度の水準のコードを生成します。

次の例はトランスコンパイラのイメージ例です。

トランスコンパイラのイメージ例

JavaScriptの上位互換である「TypeScript」はそのまま実行するのではなく、トランスコンパイラを使いJavaScriptプログラムに変換してから実行します。

このように、トランスコンパイラは人間が理解しやすいプログラミング言語を、コンピュータが理解しやすい機械語に変換するのではなく、プログラミング言語を別のプログラミング言語に変換するときに使用します。

インタプリタ

インタプリタとは、プログラミング言語で書かれたソースコード(プログラム)を、コンピュータが解釈・実行できる形式に変換しながら同時に少しずつ実行していくソフトウェアのことです。

次の図はインタプリタのイメージ例です。

インタプリタのイメージ例

事前に機械語に変換しておくコンパイラとは違い、インタプリタはコンピュータが解釈・実行できる形式(機械語)に変換しながら実行します。

インタプリタはソースコードを即時に実行できるが、機械語に変換しながら実行するため、コンパイラに比べると「処理速度が遅い」というデメリットがあります。

インタプリタを使う言語は「PHP」「Perl」「Ruby」「Python」といったスクリプト言語(簡易的なプログラミング言語のこと)がほとんどのため「スクリプト言語 = インタプリタ方式の言語」というイメージがありますが、実際は必ずしもスクリプト言語がインタプリタ方式であるとは限りません。(例えば、JavaScriptはスクリプト言語だが、インタプリタではなくJITコンパイラを使用している)

バイトコードインタプリタ

バイトコードインタプリタとは、中間コード(バイトコード)を実行するインタプリタのことです。

次の図は、バイトコードインタプリタのイメージ例です。

バイトコードインタプリタのイメージ例

ソースコードを仮想マシン上で動作する中間コード(バイトコード)にコンパイル(変換)し、コンパイルした中間コード(バイトコード)をバイトコードインタプリタでコンピュータが解釈・実行できる形式(機械語)に変換しながら実行しています。

スポンサーリンク

基本情報技術者試験 過去問の解説

基本情報技術者試験 平成31年春期 午前問19

問題

インタプリタの説明として,適切なものはどれか。

  • ア:原始プログラムを,解釈しながら実行するプログラムである。
  • イ:原始プログラムを,推論しながら翻訳するプログラムである。
  • ウ:原始プログラムを,目的プログラムに翻訳するプログラムである。
  • エ:実行可能なプログラムを,主記憶装置にロードするプログラムである。

基本情報技術者平成31年春期 午前問19

インタプリタの説明はどれか。設問のア~エを順番に確認していきます。

ア:原始プログラムを,解釈しながら実行するプログラムである。

正解インタプリタの説明です。

イ:原始プログラムを,推論しながら翻訳するプログラムである。

不正解:トランスレータの説明です。

ウ:原始プログラムを,目的プログラムに翻訳するプログラムである。

不正解:コンパイラの説明です。

エ:実行可能なプログラムを,主記憶装置にロードするプログラムである。

不正解:ローダの説明です。

「ア」が正解です。

基本情報技術者試験 平成28年春期 午前問19

問題

コンパイラにおける最適化の説明として,適切なものはどれか。

ア:オブジェクトコードを生成する代わりに,インタプリタ用の中間コードを生成する。
イ:コンパイルを実施するコンピュータとは異なるアーキテクチャをもったコンピュータで動作するオブジェクトコードを生成する。
ウ:プログラムコードを解析して,実行時の処理効率を高めたオブジェクトコードを生成する。
エ:プログラムの実行時に,呼び出されたサブプログラム名やある時点での変数の内容を表示させるようなオブジェクトコードを生成する。

基本情報技術者平成28年春期 午前問19

コンパイラの最適化の説明はどれか。設問のア~エを順番に確認していきます。

ア:オブジェクトコードを生成する代わりに,インタプリタ用の中間コードを生成する。

不正解:バイトコードインタプリタで実行する中間コードの説明です。

イ:コンパイルを実施するコンピュータとは異なるアーキテクチャをもったコンピュータで動作するオブジェクトコードを生成する。

不正解:クロスコンパイラの説明です。

ウ:プログラムコードを解析して,実行時の処理効率を高めたオブジェクトコードを生成する。

正解コンパイラにおける最適化の説明です。

エ:プログラムの実行時に,呼び出されたサブプログラム名やある時点での変数の内容を表示させるようなオブジェクトコードを生成する。

不正解:ソフトウェアのデバッグを支援するデバッガの説明です。

「ウ」が正解です。