総視聴再生時間43万分以上(2017年5月13日現在)の動画で基本情報技術者試験の過去問&キーワード解説!スキマ時間に動画!〜これじょIT〜

PR広告

平成27年度春 基本情報技術者試験 午後 問2 ソフトウェア

問2 ソフトウェア

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

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

設問1

言語処理系の種類には、インタプリタやコンパイラなどがある。インタプリタによる実行では、原始プログラムを入力して、逐次解釈しながら実行する(以下、インタプリタ方式という)。コンパイラによる実行では、原始プログラムを入力して、目的とする計算機で実行できるプログラム(以下、実行形式プログラムという)に変換し、その実行形式プログラムを実行する(以下、コンパイラ方式という)。インタプリタ方式とコンパイラ方式を比較したとき、コンパイラ方式の利点として最も適切な答えを、解答群の中から選べ。

解答群

  • ア : 原始プログラムを対話的に確認しながら実行できる。
  • イ : 原始プログラムを変更して、直ちに実行できる。
  • ウ : 実行途中に異常が発生した場合、原始プログラムのどこでどのような原因によって異常が発生したのかを確認しやすい。
  • エ : 目的とする計算機に対応して、実行時間を短縮するための最適化が図れる。

解説

コンパイラ方式の説明は下記の通りです

コンパイラとは、プログラミング言語で記述したソースコードを、コンピュータ実行形式に変換するソフトウェアです!

コンパイラを使うことをコンパイルといいます!

インタプリタ型と比較すると、実行時の処理効率が高いです!

基本情報技術者試験問題には、次のように出たデシよ!

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

(平成26年度春基本情報技術者試験過去問18)

上記のことから、コンパイラ方式の利点として最も適切な答えは「エ : 目的とする計算機に対応して、実行時間を短縮するための最適化が図れる。」となります!

インタプリタ型についても説明を記載しておきます!

インタプリタとは、プログラミング言語で記述したソースコードを、コンピュータ実行形式(オブジェクトコード)に変換→実行する言語処理系です!

設問2

次の記述中の【 】に入れる最も適切な答えを、解答群の中から選べ。

 原始プログラムを、ソフトウェアによって仮想的に構築した計算機(以下、仮想計算機という)で実行できるコード(以下、中間コードという)に変換し、仮想計算機上で中間コードをインタプリタ方式で実行する方法がある。言語Xで記述された原始プログラムを中間コードに変換し、仮想計算機Vのインタプリタで実行する例を、図1に示す。ここで、異なるOSやハードウェア上で動作する仮想計算機Vを用意することによって、【 a 】中間コードの形でプログラムを配布することが可能となる。

平成27年度春 基本情報技術者試験 午後 問2 ソフトウェア 図1

〔図1の説明〕

言語Xで記述された原始プログラムを、仮想計算機Vで実行できる中間コードに変換する(図1①)。

中間コードに変換されたプログラムを仮想計算機Vに入力し、Vのインタプリタで逐次解釈しながら実行する(図1②)。

a に関する解答群

  • ア : 特定のOSやハードウェアに依存しない
  • イ : 特定のOSやハードウェアに依存する
  • ウ : 特定のハードウェアの性能を引き出す
  • エ : 特定のハードウェアのメモリ使用量を低減する

解説

正解は「ア : 特定のOSやハードウェアに依存しない」です!

一般的に、異なるOSやハードウェア上でコンパイル方式を利用すると、ハードウェアやOSごとにコンパイルしないと動作しません。そのため、異なるOSやハードウェアを想定すると非効率となります。異なるOSやハードウェア上で動作する仮想計算機Vを利用する場合、仮想計算機V1つででインタプリタ型で動作すればよいので「特定のOSやハードウェアに依存しない」ことが可能です!

設問3

次の記述中の【 】に入れる正しい答えを、解答群の中から選べ。

 仮想計算機Vにおけるインタプリタ方式による実行時に、繰り返し実行される処理などの情報(以下、プロファイル情報という)を収集しておき、その内容を解析して、特定の処理の中間コードをプログラムの実行途中で実行形式プログラムに変換し、以後の実行に実行形式プログラムを利用する方法として、図2のような動的コンパイル方式がある。実行形式プログラムを実行途中から利用することによって、以後のプログラムの実行性能の向上が期待できるので、Javaなどの言語処理系で採用されている方式である。

〔図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

解説

まずはインタプリタ方式の場合の実行時間を求めましょう!必要は下記の通りです

  • 関数Fを400回呼ぶ
  • 関数Fの中間コードは400命令(あまり関係ない?)
  • 関数Fが1回呼ばれると実行する中間コードは2,000命令
  • インタプリタによる中間コード1命令の実行時間は500ナノ秒

インタプリタ方式の場合の実行時間

= 関数Fを呼ぶ回数(400回) × 関数Fが1回当たりに実行する中間コード(2,000命令) × 中間コード1命令の実行時間(500ナノ秒)

= 400 × 2,000 × 500 ナノ秒

= 400,000,000 ナノ秒

= 0.4 秒(ナノ秒=10-9

インタプリタ方式の場合の実行時間は0.4秒(【 b 】=0.4)

【 c 】の解説は間違いです。非常に申し訳ありません...

次に動的コンパイル方式の場合の実行時間を求めましょう!必要は下記の通りです

  • 関数Fを400回呼ぶ
  • 関数Fの中間コードは400命令(あまり関係ない?)
  • 関数Fが1回呼ばれると実行する中間コードは2,000命令
  • 関数Fが101回目に呼び出されるときに動的コンパイラが起動され、関数Fの中間コードを実行形式プログラムに変換(100回目まではインタプリタ方式)
  • 動的コンパイラの起動時間は0.1秒
  • コンパイル時間は、中間コード1,000命令当たりで0.1秒
  • インタプリタによる中間コード1命令の実行時間は500ナノ秒
  • 実行形式プログラムによる中間コード1命令の実行時間は10ナノ秒

関数Fを100回呼ぶまではインタプリタ方式なので、先ほどと同じように...

インタプリタ方式の場合の実行時間

= 関数Fを呼ぶ回数(100回) × 関数Fが1回当たりに実行する中間コード(2,000命令) × 中間コード1命令の実行時間(500ナノ秒)

= 100 × 2,000 × 500 ナノ秒

= 100,000,000 ナノ秒

= 0.1 秒(ナノ秒=10-9

動的コンパイラの起動時間は0.1秒

コンパイル時間は、中間コード1,000命令当たりで0.1秒。関数Fが1回当たりに実行する中間コードは2,000命令なので...0.2秒

実行形式プログラムの実行時間。関数Fはあと300回呼ばれる

= 関数Fを呼ぶ回数(300回) × 関数Fが1回当たりに実行する中間コード(2,000命令) × 中間コード1命令の実行時間(10ナノ秒)

= 300 × 2,000 × 10 ナノ秒

= 6,000,000 ナノ秒

= 0.006 秒(ナノ秒=10-9

動的コンパイラの起動時間(0.1秒) + コンパイル時間(0.2秒) + 実行形式プログラムの実行時間(0.006秒)

= 0.306秒

関数Fを100回インタプリタ方式で呼ぶ場合の実行時間(0.1秒)+関数Fを100回実行形式プログラムで呼ぶ場合の実行時間(0.306秒)

= 0.406秒

動的コンパイル方式の場合の実行時間は0.406秒(【 c 】=0.406)

タグ: ,,,

PR広告

フェイスブックコメント

平成28年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成28年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成28年度春 基本情報技術者試験 午後 テキスト・動画解説

平成28年度春 基本情報技術者試験 午前 テキスト・動画解説

平成27年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午前 テキスト・動画解説

平成26年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成26年度春 基本情報技術者試験 午前 テキスト・動画解説