戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2015年 春期 午後 問02


言語処理系に関する次の記述を読んで、設問1〜3に答えよ。

 言語処理系とは、プログラム言語(以下、言語という)の文法に従って記述された原始プログラムを読み取り、目的とする計算機で実行するための変換をするか、又は逐次解釈しながら実行するためのソフトウェアである。

設問1:

問題文を見る
 言語処理系の種類には、インタプリタやコンパイラなどがある。インタプリタによる実行では、原始プログラムを入力して、逐次解釈しながら実行する(以下、インタプリタ方式という)。コンパイラによる実行では、原始プログラムを入力して、目的とする計算機で実行できるプログラム(以下、実行形式プログラムという)に変換し、その実行形式プログラムを実行する(以下、コンパイラ方式という)。インタプリタ方式とコンパイラ方式を比較したとき、コンパイラ方式の利点として最も適切な答えを、解答群の中から選べ。   解答群  ア:原始プログラムを対話的に確認しながら実行できる。  イ:原始プログラムを変更して、直ちに実行できる。  ウ:実行途中に異常が発生した場合、原始プログラムのどこでどのような原因によって異常が発生したのかを確認しやすい。  エ:目的とする計算機に対応して、実行時間を短縮するための最適化が図れる。

模範解答

エ

解説

解答の導き方

この問題では、インタプリタ方式とコンパイラ方式を比べたとき、コンパイラ方式に当てはまる利点を選びます。
まず、インタプリタは、原始プログラム(人がプログラム言語で書いたプログラム)を「逐次解釈しながら実行」するソフトウェアです。プログラムを読み進めながら動かすため、変更したプログラムをすぐに実行したり、処理の途中でどの部分に問題が起きたかを確認したりしやすい方式です。
一方、コンパイラ方式では、原始プログラムを、目的の計算機で実行できる実行形式プログラム(計算機がそのまま実行できる形のプログラム)に変換してから動かします。実行前に目的の計算機に合わせて変換できるので、処理を効率よく整える最適化(プログラムの実行を速くするなどの工夫)を行えます。その結果、実行時間の短縮が期待できます。
このため、目的の計算機に合わせて実行時間を短縮できるという エ が、コンパイラ方式の利点です。
ほかの選択肢も確認します。
  • ア:原始プログラムを対話的に確認しながら実行するのは、逐次実行するインタプリタ方式に当てはまりやすい特徴です。
  • イ:プログラムを変更してすぐに実行するのも、実行形式プログラムへの変換を先に行わないインタプリタ方式に当てはまりやすい特徴です。
  • ウ:実行中の処理と原始プログラムを対応させて異常の箇所を確認しやすいのは、逐次実行するインタプリタ方式に当てはまりやすい特徴です。
  • エ:目的の計算機に合わせた最適化で実行時間を短縮できるため、コンパイラ方式の利点です。

誤りやすいポイント

  • 「プログラムを変換する方式だから、コンパイラ方式は実行も速い」とだけ覚えないようにしましょう。ここでは、目的の計算機に合わせた最適化ができることが、実行時間の短縮につながる理由です。
  • インタプリタ方式でも、実行前に中間コード(処理系が扱いやすい形に変換したプログラム)を作る場合があります。大切なのは、原始プログラムを逐次解釈して実行するか、実行形式プログラムに変換してから実行するかという違いです。
  • コンパイラ方式では、実行前に変換が必要です。そのため、変更後すぐに動かして確認しやすいという点は、コンパイラ方式の利点とはいえません。

FAQ

Q: コンパイラ方式では、なぜ実行時間を短縮できるのですか?
A: 実行する計算機に合わせて、処理を効率よく整えてから実行形式プログラムを作れるためです。ただし、必ず速くなると決まっているわけではなく、問題が問うているのは最適化による一般的な利点です。
Q: インタプリタ方式では、プログラムをまったく変換しないのですか?
A: そうとは限りません。図1のように中間コードを作る方式もあります。インタプリタ方式の特徴は、実行形式プログラムに変換してから実行するのではなく、プログラムを逐次解釈しながら実行することです。

関連キーワード: インタプリタ、コンパイラ、原始プログラム、実行形式プログラム、最適化

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

 次の記述中のに入れる最も適切な答えを、解答群の中から選べ。    原始プログラムを、ソフトウェアによって仮想的に構築した計算機(以下、仮想計算機という)で実行できるコード(以下、中間コードという)に変換し、仮想計算機上で中間コードをインタプリタ方式で実行する方法がある。言語Xで記述された原始プログラムを中間コードに変換し、仮想計算機Vのインタプリタで実行する例を、図1に示す。ここで、異なるOSやハードウェア上で動作する仮想計算機Vを用意することによって、a中間コードの形でプログラムを配布することが可能となる。
基本情報技術者試験(平成27年 午後 問2 図1)
〔図1の説明〕 (1) 言語Xで記述された原始プログラムを、仮想計算機Vで実行できる中間コードに変換する(図1①)。 (2) 中間コードに変換されたプログラムを仮想計算機Vに入力し、Vのインタプリタで逐次解釈しながら実行する(図1②)。   aに関する解答群  ア:特定のOSやハードウェアに依存しない  イ:特定のOSやハードウェアに依存する  ウ:特定のハードウェアの性能を引き出す  エ:特定のハードウェアのメモリ使用量を低減する

模範解答

a:ア

解説

解答の導き方

この設問では、中間コードでプログラムを配布すると、特定のOSやハードウェアとの関係がどうなるかを考えます。
  1. 原始プログラムは、プログラマが言語の文法に従って書いたプログラムです。設問では、これを「仮想計算機Vで実行できる」中間コードに変換します。中間コードとは、元のプログラムと、実際に実行する計算機向けの形式との間にあるコードです。
  2. 仮想計算機とは、ソフトウェアで仮想的に構築した計算機です。図1では、中間コードを仮想計算機Vに入力し、インタプリタで実行しています。インタプリタとは、プログラムを読みながら、順番に解釈して実行するソフトウェアです。
  3. 図1では、中間コードを複数の環境に配布しています。それぞれの環境で仮想計算機Vが動けば、同じ形式の中間コードを実行できます。OS(Operating System:コンピュータの基本動作や資源を管理するソフトウェア)やハードウェア(コンピュータを構成する機器)が異なっていても、対応する仮想計算機が用意されていればよいからです。
したがって、中間コードは「特定のOSやハードウェアに依存しない」形で配布できます。これがアです。
イは、特定のOSやハードウェアに依存するという意味なので、異なる環境で同じ中間コードを使えるという説明に合いません。ウの性能向上や、エのメモリ使用量の低減も、図1で示されている仕組みからは判断できません。

誤りやすいポイント

  • 中間コードを実行するには、どの環境でも何も用意しなくてよい、という意味ではありません。実行する環境には、その中間コードに対応した仮想計算機が必要です。
  • 仮想計算機を使う利点は、特定のOSやハードウェアに中間コードを直接結び付けずに配布できることです。ハードウェアの性能を引き出すことや、メモリ使用量を減らすことが、この設問で問われている利点ではありません。
  • 「インタプリタ方式」は、中間コードを実行する方法を示しています。中間コードがどのOSやハードウェアに依存するかは、仮想計算機を介して実行する仕組みから判断します。

FAQ

Q: どのOSやハードウェアでも、同じ中間コードを必ず実行できますか?
A: いいえ。実行する環境に、その中間コードを扱える仮想計算機が必要です。仮想計算機がなければ、中間コードを実行できません。
Q: 中間コードは、原始プログラムと同じものですか?
A: いいえ。原始プログラムを、仮想計算機で実行できる形式に変換したものが中間コードです。
Q: インタプリタは、何をするソフトウェアですか?
A: プログラムを読みながら、その内容を順番に解釈して実行するソフトウェアです。

関連キーワード: 中間コード、仮想計算機、インタプリタ、原始プログラム、プラットフォーム依存性

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

 次の記述中のに入れる正しい答えを、解答群の中から選べ。    仮想計算機Vにおけるインタプリタ方式による実行時に、繰り返し実行される処理などの情報(以下、プロファイル情報という)を収集しておき、その内容を解析して、特定の処理の中間コードをプログラムの実行途中で実行形式プログラムに変換し、以後の実行に実行形式プログラムを利用する方法として、図2のような動的コンパイル方式がある。実行形式プログラムを実行途中から利用することによって、以後のプログラムの実行性能の向上が期待できるので、Javaなどの言語処理系で採用されている方式である。
基本情報技術者試験(平成27年 午後 問2 図2)
〔図2の説明〕 (1) 主プログラムと主プログラムから呼び出される関数Fが中間コードに変換されたプログラムがある。 (2) 仮想計算機Vのインタプリタは、中間コードを逐次解釈しながら実行する(図2①)。このとき、関数Fが呼び出される回数をプロファイル情報として収集する(図2②)。 (3) 仮想計算機Vは、関数Fが呼び出される都度、プロファイル情報を解析し、関数Fを実行形式プログラムに変換するかどうかを判定する。 (4) (3)で変換すると判定した場合、仮想計算機Vは、動的コンパイラを起動して関数Fを実行形式プログラムに変換する(図2③)。 (5) (4)で関数Fを変換した後は、関数Fが呼び出されたときには実行形式プログラムが実行される(図2④)。    動的コンパイル方式を適用する場合には、実行時間に加えて動的コンパイラの起動時間やコンパイル時間を考慮する必要がある。図2に示す関数Fを、インタプリタ方式で実行した場合と、動的コンパイル方式で実行した場合の実行時間について考える。ここで、各方式の実行条件は、次の条件に示すとおりである。主プログラムから関数Fの呼出し回数が400回のとき、インタプリタ方式の場合の実行時間はb秒であり、動的コンパイル方式を適用した場合の実行時間はc秒である。   〔条件〕 ・主プログラムの実行時間は考えない。 ・プロファイル情報を収集する時間と、仮想計算機Vから実行形式プログラムを呼び出すのに必要な処理時間は考えない。 ・関数Fの中間コードは400命令から成り、関数Fが1回呼び出されたときに実行する中間コードの命令数は、2,000命令である。 ・動的コンパイル方式を適用した場合、関数Fが101回目に呼び出されるときに動的コンパイラが起動され、関数Fの中間コードを実行形式プログラムに変換する。 ・動的コンパイラの起動時間とコンパイル時間は、実行時間に含める。 ・動的コンパイラの起動時間は0.1秒とし、コンパイル時間は、中間コード1,000命令当たりで0.1秒とする。 ・インタプリタによる中間コード1命令の実行時間は500ナノ秒とし、中間コード1命令に対応する実行形式プログラムの実行時間は10ナノ秒とする。   b, cに関する解答群  ア:0.106  イ:0.146  ウ:0.206  エ:0.246  オ:0.4  カ:0.406

模範解答

b:オ、c:エ

解説

解答の導き方

この問題では、関数Fを400回呼び出すときにかかる時間を、インタプリタ方式と動的コンパイル方式でそれぞれ求めます。
中間コードは、プログラムをいったん別の形式にしたものです。インタプリタは、その中間コードを1命令ずつ読み取りながら実行するソフトウェアです。一方、動的コンパイル方式では、プログラムの実行中に中間コードを実行形式プログラムへ変換し、その後の実行に利用します。
b:インタプリタ方式の実行時間
条件には、関数Fが1回呼び出されたときに実行する中間コードの命令数は「2,000命令」、インタプリタによる中間コード1命令の実行時間は「500ナノ秒」とあります。
400回呼び出すと、実行する命令数は次のとおりです。
1命令に500ナノ秒かかるため、実行時間は次のとおりです。
1秒は1,000,000,000ナノ秒なので、
したがって、bは 0.4秒 です。
c:動的コンパイル方式の実行時間
動的コンパイル方式では、関数Fが101回目に呼び出されるときにコンパイルが始まります。そのため、1回目から100回目まではインタプリタで実行し、101回目から400回目までは実行形式プログラムで実行します。
まず、1回目から100回目までのインタプリタによる実行時間です。
次に、コンパイルにかかる時間を求めます。関数Fの中間コードは400命令で、コンパイル時間は中間コード1,000命令当たり0.1秒です。
動的コンパイラの起動時間0.1秒も加えます。
最後に、101回目から400回目までの実行形式プログラムによる実行時間を求めます。呼び出し回数は、400回から最初の100回を引いて300回です。実行形式プログラムでは、1命令当たり10ナノ秒かかります。
以上を合計します。
したがって、cは 0.246秒 です。実行形式プログラムでの実行は速くなりますが、動的コンパイラの起動時間とコンパイル時間も実行時間に含める点がポイントです。

誤りやすいポイント

  • 動的コンパイル方式でも、最初から実行形式プログラムで動くわけではありません。101回目の呼び出しより前の100回分は、インタプリタで実行します。
  • 101回目から400回目までの呼び出し回数は300回です。101回目も含めて数えます。
  • コンパイル時間は、関数Fの中間コードの400命令を基に計算します。呼び出し時に実行する2,000命令を基にするのではありません。
  • 動的コンパイル方式の合計には、インタプリタでの実行時間、動的コンパイラの起動時間、コンパイル時間、実行形式プログラムでの実行時間のすべてを含めます。

FAQ

Q: なぜ動的コンパイル方式では、実行時間が短くなることがあるのですか?
A: コンパイルには時間がかかりますが、コンパイル後は実行形式プログラムを使うため、繰り返し実行する処理の実行時間を短くできるからです。この問題では、コンパイルにかかる時間も含めて比較しています。
Q: プロファイル情報とは何ですか?
A: プログラムの実行中に集める、処理の実行回数などの情報です。どの処理を実行形式プログラムに変換すると効果が大きいかを判断するのに使えます。
Q: 1ナノ秒は何秒ですか?
A: 1ナノ秒は10億分の1秒です。そのため、ナノ秒で表された時間を秒に直すときは、1,000,000,000で割ります。

関連キーワード: インタプリタ、動的コンパイル、プロファイル情報、実行形式プログラム、コンパイル時間

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

戦国ITクイズ機能

\ せっかくなら /

基本情報技術者を
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について