HOME»基本情報技術者平成27年春期問題»午後問2
基本情報技術者過去問題 平成27年春期 午後問2
⇄問題文と設問を画面2分割で開く⇱問題PDF問2 ソフトウェア
言語処理系に関する次の記述を読んで,設問1~3に答えよ。
言語処理系とは,プログラム言語(以下,言語という)の文法に従って記述された原始プログラムを読み取り,目的とする計算機で実行するための変換をするか,又は逐次解釈しながら実行するためのソフトウェアである。
言語処理系とは,プログラム言語(以下,言語という)の文法に従って記述された原始プログラムを読み取り,目的とする計算機で実行するための変換をするか,又は逐次解釈しながら実行するためのソフトウェアである。
設問1
言語処理系の種類には,インタプリタやコンパイラなどがある。インタプリタによる実行では,原始プログラムを入力して,逐次解釈しながら実行する(以下,インタプリタ方式という)。コンパイラによる実行では,原始プログラムを入力して,目的とする計算機で実行できるプログラム(以下,実行形式プログラムという)に変換し,その実行形式プログラムを実行する(以下,コンパイラ方式という)。インタプリタ方式とコンパイラ方式を比較したとき,コンパイラ方式の利点として最も適切な答えを,解答群の中から選べ。
解答群
- 原始プログラムを対話的に確認しながら実行できる。
- 原始プログラムを変更して,直ちに実行できる。
- 実行途中に異常が発生した場合,原始プログラムのどこでどのような原因によって異常が発生したのかを確認しやすい。
- 目的とする計算機に対応して,実行時間を短縮するための最適化が図れる。
解答選択欄
解答
- エ
解説
インタプリタとコンパイラの特徴は次の通りです。
- インタプリタ方式
- ソースコードを1文ずつ解釈しながらプログラムを実行していく方式。
実行にはソースコードに対応するインタプリタシステムが必要で、コンパイラ方式と比較して処理速度は遅いが、プログラムの中身が見えるので変更→テストの作業を手軽に行える利点がある。
Perl,PHP,Javascript,Python,Rubyなどスクリプト言語がインタプリタ方式である。 - コンパイラ方式
- ソースコードを機械語などに一括して変換した実行形式ファイルを生成し、実行時にはそのファイルを読み出して処理を行う方式。
実行形式ファイルからは元となったソースコードが見えないため容易に修正することができないが、機械語に変換する過程で処理の最適化が行われるので、実行時に機械語に変換するインタプリタと比較すると高速な処理ができる。また実行ファイル単体で動作するので実行時に他のソフトウェアを必要としない利点もある。
C,C++,C#,FORTRAN,COBOL,Pascalなどのプログラム言語がコンパイラ方式である。
- どちらも対話的な実行環境を構築できます。
- インタプリタ方式の利点です。
- どちらもデバッグ機能を組み込むことができるので確認のしやすさは変わりません。
- 正しい。コンパイラ方式の利点です。
設問2
次の記述中の に入れる最も適切な答えを,解答群の中から選べ。
原始プログラムを,ソフトウェアによって仮想的に構築した計算機(以下,仮想計算機という)で実行できるコード(以下,中間コードという)に変換し,仮想計算機上で中間コードをインタプリタ方式で実行する方法がある。言語Xで記述された原始プログラムを中間コードに変換し,仮想計算機Vのインタプリタで実行する例を,図1に示す。ここで,異なるOSやハードウェア上で動作する仮想計算機Vを用意することによって,a中間コードの形でプログラムを配布することが可能となる。〔図1の説明〕
原始プログラムを,ソフトウェアによって仮想的に構築した計算機(以下,仮想計算機という)で実行できるコード(以下,中間コードという)に変換し,仮想計算機上で中間コードをインタプリタ方式で実行する方法がある。言語Xで記述された原始プログラムを中間コードに変換し,仮想計算機Vのインタプリタで実行する例を,図1に示す。ここで,異なるOSやハードウェア上で動作する仮想計算機Vを用意することによって,a中間コードの形でプログラムを配布することが可能となる。〔図1の説明〕
- 言語Xで記述された原始プログラムを,仮想計算機Vで実行できる中間コードに変換する(図1①)。
- 中間コードに変換されたプログラムを仮想計算機Vに入力し,Vのインタプリタで 逐次解釈しながら実行する(図1②)。
a に関する解答群
- 特定のOSやハードウェアに依存しない
- 特定のOSやハードウェアに依存する
- 特定のハードウェアの性能を引き出す
- 特定のハードウェアのメモリ使用量を低減する
解答選択欄
- a:
解答
- a=ア
解説
中間コード方式は、JavaやC#などのプログラム言語で採用されているもので、ソースコード(原始プログラム)を一度バイトコードという中間コードとして出力し、実行時には中間コードを仮想マシン(仮想計算機)上で解釈して実行する方式です。
通常は、実行するOSやハードウェアが異なればプログラムもその環境に合わせたものを用意しなくてはなりません。しかし中間コード方式ではOSやハードウェアごとに異なる仮想マシンを用意し、その仮想マシンにプラットフォームごとの機械語を生成させることで同じ中間コードを異なるプラットフォーム上で動作させることを可能にしています。
したがってこの方式で生成される中間コードの特徴は「特定のOSやハードウェアに依存しない」が適切です。
∴a=ア
通常は、実行するOSやハードウェアが異なればプログラムもその環境に合わせたものを用意しなくてはなりません。しかし中間コード方式ではOSやハードウェアごとに異なる仮想マシンを用意し、その仮想マシンにプラットフォームごとの機械語を生成させることで同じ中間コードを異なるプラットフォーム上で動作させることを可能にしています。
したがってこの方式で生成される中間コードの特徴は「特定のOSやハードウェアに依存しない」が適切です。
∴a=ア
設問3
次の記述中の に入れる正しい答えを,解答群の中から選べ。
仮想計算機Vにおけるインタプリタ方式による実行時に,繰り返し実行される処理などの情報(以下,プロファイル情報という)を収集しておき,その内容を解析して,特定の処理の中間コードをプログラムの実行途中で実行形式プログラムに変換し,以後の実行に実行形式プログラムを利用する方法として,図2のような動的コンパイル方式がある。実行形式プログラムを実行途中から利用することによって,以後のプログラムの実行性能の向上が期待できるので,Javaなどの言語処理系で採用されている方式である。〔図2の説明〕
〔条件〕
仮想計算機Vにおけるインタプリタ方式による実行時に,繰り返し実行される処理などの情報(以下,プロファイル情報という)を収集しておき,その内容を解析して,特定の処理の中間コードをプログラムの実行途中で実行形式プログラムに変換し,以後の実行に実行形式プログラムを利用する方法として,図2のような動的コンパイル方式がある。実行形式プログラムを実行途中から利用することによって,以後のプログラムの実行性能の向上が期待できるので,Javaなどの言語処理系で採用されている方式である。〔図2の説明〕
- 主プログラムと主プログラムから呼び出される関数Fが中間コードに変換されたプログラムがある。
- 仮想計算機Vのインタプリタは,中間コードを逐次解釈しながら実行する(図2①)。このとき,関数Fが呼び出される回数をプロファイル情報として収集する(図2②)。
- 仮想計算機Vは,関数Fが呼び出される都度,プロファイル情報を解析し,関数Fを実行形式プログラムに変換するかどうかを判定する。
- (3)で変換すると判定した場合,仮想計算機Vは,動的コンパイラを起動して関数Fを実行形式プログラムに変換する(図2③)。
- (4)で関数Fを変換した後は,関数Fが呼び出されたときには実行形式プログラムが実行される(図2④)。
〔条件〕
- 主プログラムの実行時間は考えない。
- プロファイル情報を収集する時間と,仮想計算機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:
解答
- b=オ
- c=エ
解説
〔bについて〕
呼出し回数は400回、関数Fの呼出し1回で中間コード2,000命令が実行され、1命令が500ナノ秒で実行されます。
したがって総実行時間は、
400×2,000×500=400,000,000(ナノ秒)=0.4(秒)
∴b=オ:0.4
〔cについて〕
まず動的コンパイラの起動が0.1秒、コンパイル時間は0.1秒/1000命令なので
0.1+(400/1000)×0.1=0.14(秒)
2つを合わせると0.14秒です。中間コードの実行時間は、最初から100回目の呼出しまでが500ナノ秒/命令、コンパイル後の101回目から400回目までの300回が10ナノ秒/命令なので、
100×2,000×500+300×2,000×10
=100,000,000+6,000,000
=106,000,000(ナノ秒)
=0.106(秒)
最後にコンパイラの起動時間、コンパイル時間、命令の実行時間を足し合わせます。
0.14+0.106=0.246(秒)
∴c=エ:0.246
呼出し回数は400回、関数Fの呼出し1回で中間コード2,000命令が実行され、1命令が500ナノ秒で実行されます。
したがって総実行時間は、
400×2,000×500=400,000,000(ナノ秒)=0.4(秒)
∴b=オ:0.4
〔cについて〕
まず動的コンパイラの起動が0.1秒、コンパイル時間は0.1秒/1000命令なので
0.1+(400/1000)×0.1=0.14(秒)
2つを合わせると0.14秒です。中間コードの実行時間は、最初から100回目の呼出しまでが500ナノ秒/命令、コンパイル後の101回目から400回目までの300回が10ナノ秒/命令なので、
100×2,000×500+300×2,000×10
=100,000,000+6,000,000
=106,000,000(ナノ秒)
=0.106(秒)
最後にコンパイラの起動時間、コンパイル時間、命令の実行時間を足し合わせます。
0.14+0.106=0.246(秒)
∴c=エ:0.246