9
初学者教育のためのプログラム可視化用 C 仮想マシン Aiguo HE a) C Virtual Machine for Educational Program Visualization for Beginners Aiguo HE a) あらまし 初学者教育のためのプログラム可視化にはプログラムから教育用情報を抽出する必要ある.本論文 は仮想マシンによる教育用情報抽出手法を提案し,更にこの手法を実現するための C 仮想マシン CVM-EP(C Virtual Machine for Educational Purpose) を提案する.CVM-EP は初学者が学ぶ範囲の C 文法をカバーし ており,実行中のプログラムの状態のほか,プログラムに対する理解の向上やプログラム中の問題の検出などの 教育支援用可視化機能の実現に必要な情報を提供する.応用システムでの検証により,CVM-EP が初学者教育 支援機能の実現に有効であり,また十分な性能を有することが判明した. キーワード C 言語,初学者教育支援,プログラム可視化,仮想マシン,e-learning 1. まえがき C 言語は広く利用されるコンピュータ言語の一つで あり [1], 多くの大学で入門言語として学ばれ,中高学 校でも授業やプログラミング競技などで使われてい る.例えば高校生向け IT 競技「パソコン甲子園」 [2] 2014 年プログラミング部門予選では,57%の選手 C 言語を使用した.また 36%の選手が C++言語を 使用したが,その多くは C スタイルのプログラムを 書いた.しかし IT 競技選手のような C プログラミン グに対し興味をもつ初学者の間でも期待された学習目 標が達成されていない人がいる.例えば「パソコン甲 子園」プログラミング部門の予選では,これまで毎年 10%前後の選手が最も簡単な競技問題(標準入出力と 四則演算で解答する文章題)も解けなかった. 初学者の学習意欲と学習効率を向上させるためにプ ログラムの動作を正しく理解させ,プログラムの問題点 が容易に発見できる学習環境としてプログラム可視化 (PV) [3] 手法を利用した学習支援システムが多く提案 されている.例えば独自のプログラミング言語の学習 に特化した Scratch [4] Jeroo [5], 限定された C++ 会津大学大学院コンピュータ理工学研究科,会津若松市 Graduate School of Computer Science and Engineering, The University of Aizu, Aizuwakamatsu-shi, 965–8580 Japan a) E-mail: [email protected] DOI:10.14923/transinfj.2015JDP7011 文法をサポートする Teaching Machine [6] Web- Writer++ [7] 及び Java プログラミング学習を支援す Jeliot [8]AVIS [9]jGRASP [10] VILLE [11] などの研究は PV の有効性を証明した. 一方 C プログラムの教育現場では以下のような PV システムが利用または提案されている. IDE 産業界またはプログラミング熟練者の間 では gdb [12] や,Visual Studio [13] 及び Eclipse [14] などの IDE(Integrated Development Environment) が使用されており,プログラムを行単位で逐次実行し, 実行途中の状態を可視化することで,プログラム開発 効率の向上に貢献している.しかし IDE は初学者教育 用に最適化されていないため,初学者には使いにくい. 例えば IDE は豊富な機能を提供する代わりに,GUI が非常に複雑になっており,その操作方法の習得に多 くの時間が費やされてしまう.実際,筆者の大学では 初学者の多くは C プログラムのデバッグに IDE の機 能を使わず printf 文に頼っている. Java ベースの教育専用システム VINCE [15]VIP [16] VILLE [11] IDE のように実行中のプロ グラムの状態を表示することができ,更に Java で実 装され多くの OS 上で使用できる.ただし VIP はプ ログラムのソースコードに専用の制御コマンドを埋め 込む必要があり,VILLE は可視化対象の C プログラ ムと同じ処理の Java プログラムを用意し,更に双方 のプログラムの対応関係を定義した上で Java プログ 1292 電子情報通信学会論文誌 D Vol. J98–D No. 10 pp. 1292–1300 c 一般社団法人電子情報通信学会 2015

初学者教育のためのプログラム可視化用 C仮想マシンcleast.u-aizu.ac.jp/CVM-EP.pdf · 2017-06-21 · の2014 年プログラミング部門予選では,57%の選手

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 初学者教育のためのプログラム可視化用 C仮想マシンcleast.u-aizu.ac.jp/CVM-EP.pdf · 2017-06-21 · の2014 年プログラミング部門予選では,57%の選手

論 文

初学者教育のためのプログラム可視化用C仮想マシン

Aiguo HE†a)

C Virtual Machine for Educational Program Visualization for Beginners

Aiguo HE†a)

あらまし 初学者教育のためのプログラム可視化にはプログラムから教育用情報を抽出する必要ある.本論文は仮想マシンによる教育用情報抽出手法を提案し,更にこの手法を実現するための C 仮想マシン CVM-EP(C

Virtual Machine for Educational Purpose) を提案する.CVM-EP は初学者が学ぶ範囲の C 文法をカバーしており,実行中のプログラムの状態のほか,プログラムに対する理解の向上やプログラム中の問題の検出などの教育支援用可視化機能の実現に必要な情報を提供する.応用システムでの検証により,CVM-EP が初学者教育支援機能の実現に有効であり,また十分な性能を有することが判明した.

キーワード C 言語,初学者教育支援,プログラム可視化,仮想マシン,e-learning

1. ま え が き

C言語は広く利用されるコンピュータ言語の一つで

あり [1], 多くの大学で入門言語として学ばれ,中高学

校でも授業やプログラミング競技などで使われてい

る.例えば高校生向け IT 競技「パソコン甲子園」[2]

の 2014年プログラミング部門予選では,57%の選手

が C言語を使用した.また 36%の選手が C++言語を

使用したが,その多くは C スタイルのプログラムを

書いた.しかし IT競技選手のような Cプログラミン

グに対し興味をもつ初学者の間でも期待された学習目

標が達成されていない人がいる.例えば「パソコン甲

子園」プログラミング部門の予選では,これまで毎年

10%前後の選手が最も簡単な競技問題(標準入出力と

四則演算で解答する文章題)も解けなかった.

初学者の学習意欲と学習効率を向上させるためにプ

ログラムの動作を正しく理解させ,プログラムの問題点

が容易に発見できる学習環境としてプログラム可視化

(PV) [3]手法を利用した学習支援システムが多く提案

されている.例えば独自のプログラミング言語の学習

に特化した Scratch [4]と Jeroo [5], 限定された C++

†会津大学大学院コンピュータ理工学研究科,会津若松市Graduate School of Computer Science and Engineering, The

University of Aizu, Aizuwakamatsu-shi, 965–8580 Japan

a) E-mail: [email protected]

DOI:10.14923/transinfj.2015JDP7011

文法をサポートする Teaching Machine [6] と Web-

Writer++ [7]及び Javaプログラミング学習を支援す

る Jeliot [8],AVIS [9],jGRASP [10] と VILLE [11]

などの研究は PVの有効性を証明した.

一方 Cプログラムの教育現場では以下のような PV

システムが利用または提案されている.• IDE 産業界またはプログラミング熟練者の間

では gdb [12]や,Visual Studio [13]及び Eclipse [14]

などの IDE(Integrated Development Environment)

が使用されており,プログラムを行単位で逐次実行し,

実行途中の状態を可視化することで,プログラム開発

効率の向上に貢献している.しかし IDEは初学者教育

用に最適化されていないため,初学者には使いにくい.

例えば IDE は豊富な機能を提供する代わりに,GUI

が非常に複雑になっており,その操作方法の習得に多

くの時間が費やされてしまう.実際,筆者の大学では

初学者の多くは Cプログラムのデバッグに IDEの機

能を使わず printf文に頼っている.• Javaベースの教育専用システム VINCE [15],

VIP [16]とVILLE [11]は IDEのように実行中のプロ

グラムの状態を表示することができ,更に Java で実

装され多くの OS 上で使用できる.ただし VIP はプ

ログラムのソースコードに専用の制御コマンドを埋め

込む必要があり,VILLEは可視化対象の Cプログラ

ムと同じ処理の Javaプログラムを用意し,更に双方

のプログラムの対応関係を定義した上で Javaプログ

1292 電子情報通信学会論文誌 D Vol. J98–D No. 10 pp. 1292–1300 c©一般社団法人電子情報通信学会 2015

Page 2: 初学者教育のためのプログラム可視化用 C仮想マシンcleast.u-aizu.ac.jp/CVM-EP.pdf · 2017-06-21 · の2014 年プログラミング部門予選では,57%の選手

論文/初学者教育のためのプログラム可視化用 C 仮想マシン

ラムを実行しながら,見かけ上の Cプログラムの可視

化を実現している.これらのシステムは教育コンテン

ツを作成する立場の教員向けのツールとして有効であ

るが,学生が自由に書いたプログラムにそのまま対応

することができない.また VINCEは学生の書いた C

プログラムにも対応するが学習支援機能は逐次実行さ

れる文の説明提示に留まっている.• Trace player ETV [17]は gcc [18]と gdbの

出力ログデータを視覚化するシステムである.Trace

playerではプログラムの逐次実行とそれの逆戻りの表

示が可能であり,プログラムの理解に有効である.し

かし Trace player は可視化対象プログラムの実行と

可視化が同期できない.例えば無限ループが含まれる

プログラムには対処できず,また標準入力が行われた

直後の状態を直ちに可視化できない場合がある.

更に上記 PVシステムに共通する問題点は初学者教

育のための情報の可視化が不十分である.例えば初学

者にプログラムの処理を正しく理解させるためには逐

次評価・実行される文の順番は人間がそのプログラム

の動作を推測・理解していくときにチェックする順番

と一致させること,for 文や while 文が無限ループに

なっている場合はそれを提示すること,またはポイン

タとそれにより参照されている変数の関連を示すには

変数アドレスの可視化が必要であるが,従来の PVシ

ステムではそれは実現されていない.

本研究では上記のような,言語仕様で決めておらず

または熟練者には不必要か非合理的であるが初学者

教育に必要な可視化を「EPV(Educational Program

Visualization)」と定義し,それに必要なプログラム

情報を「EPV用情報」と定義する.EPV用情報の取

得手法についてはまだ十分に研究されていない.

本研究は以下の理由から仮想マシンによる EPV用

情報の抽出手法を提案する.• あらゆる EPV用情報を全て取得するには実行

中のプログラムの状態を推定するための仮想マシンが

必要である.• 仮想マシンを利用すれば PVシステムの開発が

容易になる.例えば Javaプログラミング学習支援用

PVシステムには Java Debugger Interface (JDI) [19]

を有する Java仮想マシンの果たす役割が大きい.• 従来の IDEは教育専用でないため直接 EPV用

情報を取得することは不可能である.

本研究は更に EPV 用情報を提供するための C 仮

想マシン CVM-EP(C Virtual Machine for Educa-

tional Purpose) を提案し,以下の可能性の確認を目

的とする.(1) OSに依存しない C仮想マシンの実現

可能性 (2) EPV 用情報取得の可能性 (3) PV システ

ム開発の観点から見た CVM-EPの有効性

以下,2.では EPV用情報と CVM-EPの設計方針

について述べ,3.では CVM-EPのシステム構成につ

いて述べる.また 4. では CVM-EP の解析木につい

て述べ,5.では応用システムによる CVM-EPの考察

について述べる.

2. EPV用情報とCVM-EP

2. 1 EPV用情報

本研究で考える EPV 用情報は 1. に挙げた教育用

PV システムの問題点を解決するためのものに限定

する.• 逐次評価・実行 変数宣言文も逐次評価・実

行の対象とし,逐次評価・実行の順番を人間のソース

コード解読過程に合わせる.図 1 は例として switch

文と for 文に対する従来の IDE の逐次評価・実行で

通過する文の順番と,EPV 用情報が示す順番である

(詳細を示すために for 文の制御部分に意図的に改行

を挿入した).従来の IDEでは switch文中の case文

と default 文の評価順番を示さず,for 文の繰り返し

継続条件式評価の表示は 1回のみである.それに対し

EPV用情報では評価・実行順の表示が改善される.ま

た,ブレークポイントの設定も上のような逐次評価・

実行単位で行えるようにする.• 変数と関数情報 変数情報にはアドレス,ポイ

ンタ(1重ポインタ,2重ポインタなど)及び変数値が

意図的に設定されたか否かの情報が,関数情報には呼

図 1 細かい逐次評価・実行Fig. 1 Detailed evaluation and execution.

1293

Page 3: 初学者教育のためのプログラム可視化用 C仮想マシンcleast.u-aizu.ac.jp/CVM-EP.pdf · 2017-06-21 · の2014 年プログラミング部門予選では,57%の選手

電子情報通信学会論文誌 2015/10 Vol. J98–D No. 10

び出し直前と実行済み関数及び,再帰呼び出しの可視

化を容易にするための情報が含まれる.• 評価・実行履歴 評価・実行履歴は毎回の逐次評

価・実行後と連続実行が(ブレークポイントまたはプ

ログラムの終了で)停止したときのプログラム状態を

記録したものである.この情報は文の評価・実行順番

と実行前後の状態変化の表示に利用でき,更に Trace

playerと異なり,プログラムの実行途中でも,逐次評

価・実行の逆戻りがインタラクティブにできる.• 無効アクセス 適正に初期化されていないポイ

ンタ変数の参照やアドレス演算子&の使い忘れなどの

ようなミスを可視化するための情報である.• アクセス対象 逐次評価・実行で直接または

(ポインタ変数などを経由して)間接的に参照・変更

される変数を表示するための情報である.• 意味なし無限ループ 本論文ではプログラムの

状態変化が生じない繰り返し処理を意味なし無限ルー

プと定義する.初学者が意図的に意味なし無限ループ

を書かないことを前提にし,プログラムの構文解析で

は for文に対しその継続条件と処理本体の文がともに

省略された場合はこれを実行不可プログラムとする.

またプログラムの実行中では繰り返し文の中で意味な

し無限ループの可能性をできる限りチェックする.

2. 2 CVM-EPの設計方針

CVM-EPの設計に当たって以下のことを考慮する.• 初学者が学ぶ C文法をカバーする.• 言語仕様で規定されていないもの(例えば式の

評価順序)は gccの処理仕様に準拠する.• EPV用情報の他に従来の IDEが提供する情報

も提供する.• 多くの OS上でインターネット経由で使用でき

るように Java言語で開発する.• 十分な性能(プログラムを連続モードで実行す

るときの速度)を確保する.

3. CVM-EPの構成

図 2はCVM-EPのシステム構成を示す.CVM-EP

のアプリケーションは各種初学者教育用 PVシステム

を想定している.SyntaxTree については 4. で述べ,

他の各ブロックについては以下に述べる.

3. 1 Parser

Parser は C プログラムのソースコードを解析し,

SyntaxTree を構築する.Parser の Java 言語ソース

コードはDoug Southが作成したパーサー定義 [20]を

図 2 CVM-EP の構成Fig. 2 CVM-EP’s archtecture.

拡張し,JavaCC [21]でコンパイルして作成した.

一例として下のリストはパーサー定義中の while文

と for文解析部の拡張結果を示す.

(拡張前)

void IterationStatement() : {}

{

( <WHILE> "(" Expression() ")"

Statement()

|

<FOR> "(" [ Expression() ] ";"

[ Expression() ] ";"

[ Expression() ] ")"

Statement() )

}

(拡張後)

CVStatement IterationStatement() : {

CVExpression i=null, c=null, r=null;

CVStatement s=null, ss=null;

}

{

( <WHILE> "(" c = Expression() ")"

ss = Statement()

{s = new CVWhileStatement(c, ss);}

|

<FOR> "(" [ i = Expression() ] ";"

[ c = Expression() ] ";"

[ r = Expression() ] ")"

ss = Statement()

{s = new CVForStatement(i, c, r, ss);}

)

{return s;}

}

上のように拡張前の定義ではCプログラムの文法チェッ

1294

Page 4: 初学者教育のためのプログラム可視化用 C仮想マシンcleast.u-aizu.ac.jp/CVM-EP.pdf · 2017-06-21 · の2014 年プログラミング部門予選では,57%の選手

論文/初学者教育のためのプログラム可視化用 C 仮想マシン

クのみが行われるが,拡張により SyntaxTreeの構築機

能が追加される.この例では解析の結果 SyntaxTree

上の節 (Node) として式に対応する CVExpression,

while 文に対応する CVWhileStatement, for 文に対

応する CVForStatement 及び一般の文に対応する

CVStatementが作成される.

3. 2 Memory Manager

MemoryManagerは以下のデータの管理を行う.• メモリマップ 仮想のメモリ番地をもち,変数の

現在値及び char型定数(文字列)の値を保持する.• 変数情報 データ型,ポインタ階数(0=通常変

数,1=ポインタ変数,2=二重ポインタ変数),変数名

及びメモリマップ上の番地,更に配列変数の場合はそ

れの次元数と各次元のサイズを保持する.• 定数情報 定数のデータ型,名前,値及びメモリ

マップ上の番地とメモリサイズを保持する.• 代入情報 メモリマップの各バイトに対し代入操

作が行われたか否かの情報をもつ.• アクセス情報 一つの逐次評価・実行で参照また

は変更されたメモリの情報をもつ.• 関数情報 現在実行中の関数は呼び出し側関数,

ローカル変数及び戻り値をもつ.また同一関数から実

行された実行済関数は過去に遡って指定された数分の

情報のみを保持する.

3. 3 State Manager

StateManagerはアプリケーション側の要求に従い,

SyntaxTree で定義された走査順に基づき,プログラ

ムの逐次評価・実行またはそれの逆戻りを実現する.

3. 3. 1 逐次評価・実行及び履歴作成

逐次評価・実行では次の処理を行う.

( 1) Memory Manager のアクセス情報をリセッ

トする.

( 2) SyntaxTree より,前回走査した節から今回

の走査対象節を取得する.

( 3) その節のもつ機能で対応する文の評価・実行

を行う.

( 4) その節を走査済節にしそれと MemoryMan-

agerの現時点の全データのコピーを履歴データとして

作成し,履歴記録に追加する.

( 5) アプリケーションに処理の完了を通知する.

3. 3. 2 逐次評価・実行の逆戻り

逆戻りは次のように履歴データを利用して実現する.

( 1) 履歴記録中の最後の履歴データを Memory

Managerに戻す.

( 2) 履歴データ中の節を走査済節とする.

( 3) その履歴データを履歴記録から削除する.

( 4) アプリケーションに処理の完了を通知する.

3. 3. 3 連 続 実 行

プログラムの連続実行はプログラムの最後またはブ

レークポイントが設定された節まで逐次評価・実行を

繰り返すことで実現する.連続実行の場合は,最後に

行われた逐次評価・実行についてのみ履歴データを作

成し,アプリケーションへの通知を行う.

3. 4 BuildinFunctionと Console

BuildinFunctionは実行中の Cプログラムから呼び

出される C標準ライブラリ関数の機能を提供する.ま

た Consoleは標準入出力関数に必要な GUI機能を提

供する.

4. SyntaxTree

SyntaxTreeは Cプログラムの解析結果を多分木構

造でもち,またプログラムの評価・実行の処理を該当

文に対応する節で定義する.プログラムの実行順は

SyntaxTreeの中間順 (inorder)走査で制御する.

この章では Java 言語による SyntaxTree の構造と

木走査の実装について述べる.

4. 1 SyntaxTreeの節

SyntaxTreeは以下の三種類の節をもつ.• 単純節 Parserにより認識された文法上の最小

構成要素• 評価節 この節が頂点となる部分木はプログラ

ムの逐次評価対象に対応する.• 実行節 この節が頂点となる部分木はプログラ

ムの逐次実行対象に対応する.

節の子節は親節より先に走査される先行節と親節よ

り後に走査される後行節に分かれるが,後行節は二項

式と関数式の引数に現れるインクリメント・デクリメ

ント演算子をもつ後置演算式に対応する実行節のみで

ある.

図 3は下のプログラムから作成された SyntaxTree

の部分木及び節の例を示す.

for (i = 0; i < 10; i++){

a = i;

b = a*c++;

}

節はその種別,親節,子節(先行節と後行節のリス

ト)の情報と,以下のメソッドをもつ.• fetchFirst() 自身が頂点となる部分木の中か

1295

Page 5: 初学者教育のためのプログラム可視化用 C仮想マシンcleast.u-aizu.ac.jp/CVM-EP.pdf · 2017-06-21 · の2014 年プログラミング部門予選では,57%の選手

電子情報通信学会論文誌 2015/10 Vol. J98–D No. 10

図 3 Syntax tree の例Fig. 3 Example of syntax tree.

ら,最初の走査対象となる評価節または実行節を返す.• fetchNext() 走査済の子節を引数として受

け取り,それの次の走査対象を返す.• value() この節に対応する式の現在値を取得

する.

また評価節と実行節は以下のメソッドを有する.• next() この節の,走査順上の次の評価節ま

たは実行節を取得する.• execute() 評価節の場合は,この節に対応す

る式の値が確定される.また実行節の場合はこの節に

対応する式または文の実行処理を行い,プログラムの

状態を変更する.

4. 2 SyntaxTreeの走査制御

アプリケーション側の制御に従い,最初の逐次評価・

実行では main() 関数に対応する節の fetchFirst() で

最初の走査対象節を取得する.また 2回目以降の逐次

評価・実行では走査済節の next()でその次の走査対象

節を取得する.

制御構造をもつ文に対応する部分木の走査順は走査

済節の値により制御される.この制御はこれらの部分

木の頂点節の fetchNext()で実現する.一例として図

4は (a)if文,(b)for文と (c)while文部分木内での走

査順を示す.ただし,C は条件式,I は初期化式,R

は増分処理式,また St, Sfと Sは分岐条件に従い実行

される文に対応する節である.if文節は Cの値に従い

Stと Sfから次の走査対象を決める.for文節は Cの

値で for 文木全体の走査終了を判断する.while 文節

の走査は for文の部分木から Iと Rが省略された場合

と同様である.

Jump文節は走査の後に走査先が強制的に切り替え

られる.この処理は Jump文節の next()で実現する.

以下にはその一部の例を示す.

図 4 条件文と繰り返し文木内の走査順Fig. 4 Travase order inside conditional and repeti-

tion statement syntax tree.

• continue文節の場合は,SyntaxTreeのルート

方向に向かって最初に辿り着いた for文節またはwhile

文節の fetchNext()を実行し,その結果を次の走査対

象とする.• break 文節の場合は,SyntaxTree のルート方

向に向かって最初に辿り着いた switch文節,for文節

または while文節に対し,その親の fetchNext()を実

行した結果を次の走査対象とする.• 関数呼び出し節の場合は,呼び出し先の関数節

の fetchFirst()の実行結果を次の走査対象にし,関数

節と関数呼び出し節のペアを管理情報として登録して

おく.そして return 節または関数部分木の走査が完

了したときには関数呼び出し節の走査で作成された管

理情報を用いて,関数呼び出し節の親の fetchNext()

で次の走査先を取得する.

4. 3 実行中の問題検出

一部の節はプログラム実行中の問題検出を行いプロ

グラムの続行ができないと判断した場合,その原因を

提示し,処理を中断する.

4. 3. 1 意味なし無限ループの検出

for文と while文節において,図 4中の節 Cが走査

されるたびに,MemoryManager 中のメモリマップ,

アクセス情報と代入情報を,前回この節が走査された

ときのものと比較する.2回のデータが同じすなわち

プログラムの状態に変化がない場合は,意味なし無限

ループの可能性があると判断する.

4. 3. 2 無効アクセスの検出

MemoryManagerはアクセス先のアドレス値がメモ

リマップの有効範囲内にあるかをチェックする.また

代入情報を参照し,アクセス先のメモリが代入により

初期化されたかをチェックする.

5. CVM-EPの実装と評価

前述した設計に基づき CVM-EP を実装し,更

1296

Page 6: 初学者教育のためのプログラム可視化用 C仮想マシンcleast.u-aizu.ac.jp/CVM-EP.pdf · 2017-06-21 · の2014 年プログラミング部門予選では,57%の選手

論文/初学者教育のためのプログラム可視化用 C 仮想マシン

にそれの応用システムとして,Java3D ベースの

PROVIT(PROgram Visualization Tool) [22]とその

改良版である JavaFXベースの PROVIT-FX [23] を

開発した.ここでは PROVIT-FXと従来の PVシス

テムと比較し CVM-EPの学習支援機能を考察する.

図 5は PROVIT-FXの実行画面例である.この画

面は対象プログラムのソースコードを表示する Code

view, プログラムの状態をグラフィカルに表示する

Image view, 仮想 Console及びMessage areaから構

成され,以下の操作が可能である.• ブレークポイント(図 5中ソースコードを覆う

薄緑の長方形)の設定と解除• 逐次評価・実行とそれの逆戻り• ブレークポイントまでの連続実行と連続実行の

停止• プログラムの先頭に戻る

5. 1 OSに依存しない C仮想マシンの実現

本研究はまず現在 JavaFXをサポートしているWin-

dows, Mac OS及びLinuxの各OS上でPROVIT-FX

を実行させ,筆者の大学の 1年目前期科目「プログラ

ミング入門」の講義に使用されているプログラム例と

演習課題の解答プログラムで CVM-EPの機能を検証

した.その結果 CVM-EPが各 OS上で正しく機能す

ることが確認された.

図 5 PROVIT-FX の実行画面Fig. 5 Execution window of PROVIT-FX.

一方 CVM-EPは Java で実装されており本来の C

プログラム実行環境に比べ,実行速度の低下が避けら

れない.これは逐次評価・実行の場合は問題がないが,

例えば大きい配列を使用するプログラムを最初から最

後まで一気に実行するような場合は CVM-EPの処理

速度の影響が無視できなくなる.そのため本研究では

表 1に示す実験環境で CVM-EPの性能を調べた.

筆者の大学 1年が学ぶ最も処理能力が要求されるプ

ログラムは輝度平滑化や微分などの濃淡画像処理プロ

グラムである.これを考慮し実験は表 2 の処理のプ

ログラムを PROVIT-FXの連続実行モードで実行し,

それぞれの実行時間を測定した.実験に使用したプロ

グラムを下に示す.

void main(){

int i, a, b = 100000;

double da, db = 100000;

for (i = 0; i < 100000; i++){

a = b + i; // (1)

// a = b*i; // (2)

// a = b/(i + 1); // (3)

// a = (int)(db/(i + 200)); // (4)

// da = db/(i + 200); // (5)

// da = rand(); // (6)

// a = rand(); // (7)

}

}

表 1 実 験 環 境Table 1 Test environment.

CPU/Clock(GHz)OS/JRE Type

Memory(GB)

A Atom/1.33/2 Windows8.1/8u25 Tablet

B Pentium/1.2/1.25 Windows7-SP1/8u25 Notebook

C Core-i3/1.5/4 Windows8.1/8u25 Notebook

D Core-i5/1.6/4 Windows7-SP1/8u25 Notebook

E Core i5/2.3/4 Windows8.1/8u25 Desktop

F Core-i7/3.4/8 Windows7-SP1/8u25 Desktop

G Core-i5/2.7/8 OS X Mavericks/7u71 Desktop

表 2 実 験 内 容Table 2 Test cases.

No. 処理(10 万回繰り返し)(1) 整数の足し算結果を整数に代入(2) 整数の掛け算結果を整数に代入(3) 整数の割算結果を整数に代入(4) 実数の割り算結果を整数に代入(5) 実数の割り算結果を実数に代入(6) 関数 rand() の戻り値を実数に代入(7) 関数 rand() の戻り値を整数に代入

1297

Page 7: 初学者教育のためのプログラム可視化用 C仮想マシンcleast.u-aizu.ac.jp/CVM-EP.pdf · 2017-06-21 · の2014 年プログラミング部門予選では,57%の選手

電子情報通信学会論文誌 2015/10 Vol. J98–D No. 10

上のプログラムは表 2の処理 1の実験用に変更されて

おり,ソースコード右側のコメント(番号)は表 2の

処理番号である.

実験は表 2の各処理のプログラムを表 1の各環境で

5回実行し,その実行時間の平均値を求めた.表 3は

実験の結果である.

上記実験のほかに 378x547 ドットの PGM フォー

マット画像データを配列に読み込み 2値化するプログ

ラム(筆者の大学のプログラム入門授業の例題)を連

続実行で実行したところ,表 1の環境 Aでは 10秒前

後,環境 Fでは 2秒以内に処理が完了できた.

上記の実験で CVM-EPの性能が初学者教育に十分

であることが判明した.例えば講義のときにノート

PC 上の PROVIT-FX で画像処理プログラムを逐次

実行と連続実行しながらその実行時間を気にせずに解

説することが可能である.

以上のように本研究は OSに依存しないかつ初学者

教育用システムに必要な性能を有する C仮想マシンを

実現することができた.

5. 2 EPV用情報の取得

ここでは PROVIT-FX によって CVM-EP が取得

する EPV用情報とその有効性について述べる.

5. 2. 1 評価・実行履歴

図 5は逐次評価・実行履歴を利用した表示例である.

PROVIT-FX は過去 6 ステップまで遡り評価・実行

された文を濃さの異なる赤い下線で示し,最も濃い下

線はこれから実行される文を示す.また Trace player

の問題が解決され,プログラムの実行途中でも評価・

実行の逆戻りが可能である.

5. 2. 2 逐次評価・実行の順番

PROVIT-FXは従来の IDEの逐次評価・実行の順

番表示を改善し,例えば図 5 では switch 文に対し図

1のように逐次評価・実行を表示することができた.

5. 2. 3 アクセス情報と代入情報

PROVIT-FX は逐次評価・実行で変更または参照

表 3 実 験 結 果Table 3 Test results.

処理環境別処理時間 (ms)

A B C D E F G

(1) 734 776 309 278 210 166 79

(2) 732 768 331 280 213 163 68

(3) 968 957 415 355 265 202 88

(4) 1111 1037 424 363 276 208 99

(5) 1201 1059 431 374 288 213 103

(6) 1096 970 394 344 269 202 88

(7) 1005 911 375 321 255 198 84

される変数を色で強調表示することができた.例えば

図 5では 10行目の printf文が実行対象文で,その中

で参照される変数「char o」が青色で表示されている.

また代入情報を利用し図 5に示すように初期化されて

いない変数 qの値を非表示とすることができた.

5. 2. 4 プログラムの実行中の診断

PROVIT-FX は CVM-EP が有効範囲外のメモリ

へのアクセスや,意味なし無限ループの可能性及び未

初期化変数への参照などの問題点が検出されたときは,

Message area にメッセージを表示する.表 4 はメッ

セージの一覧である.

5. 2. 5 関 数 情 報

PROVIT-FX は再帰関数呼び出しを簡単に可視化

することができた.図 6 は 2!の値を再帰呼び出し関

数 r()で求めるプログラムの可視化例である.図 6は

r(2)の中で r(1)の戻り値を利用して変数 retの値を計

算する直前の様子であり,実行中の関数は呼び出し元

関数の下側に,実行済の関数は呼び出し元関数の右下

側に表示されている.

5. 2. 6 変数アドレスとポインタ変数

従来の教育用 PVシステムは変数のアドレスを直接

示すことができないが,PROVIT-FX はポインタ変

表 4 エラーメッセージTable 4 Error messages.

エラー内容 メッセージの例未初期化変数への参照 初期化されいない変数が参照されるprintf() の書式指定の 1 番目の書式 (%f) は実数値出力にデータ型が異なる だけ使用できるscanf() のアドレス取 1 番目のパラメータは無効な得記号&の使用忘れ アドレス配列添え字指定誤り 添え字が 9(配列のサイズ)を超えた変数領域以外への代入 非ユーザメモリへの代入が

検出されたゼロ割 ゼロ割for(while) 文で無意味 この for(while) 文は終了しないな無限ループ 可能性がある

図 6 関数の再帰呼び出しFig. 6 Recursive call.

1298

Page 8: 初学者教育のためのプログラム可視化用 C仮想マシンcleast.u-aizu.ac.jp/CVM-EP.pdf · 2017-06-21 · の2014 年プログラミング部門予選では,57%の選手

論文/初学者教育のためのプログラム可視化用 C 仮想マシン

数とそのアクセス先の関連を簡単に可視化することが

できた.図 7はポインタ変数で整数の和,差,積と商

を求めるプログラムであり,関数 work() の中で商が

計算される直前の様子である.変数のアドレス値は変

数の左上に小さい文字で表示され,拡大操作で調べる

ことができる.

表 5は従来研究と CVM-EPにおける EPV用情報

の取得可否や機能提供の有無を示す.CVM-EP を用

いて本研究が目標とした EPV用情報を全て取得する

ことができた.

教育の現場では,初学者の多くが,プログラムの処

理を正しく理解できず,またプログラムが暴走や異常

終了したとき,その原因を見出すために多くの時間を

必要とし,学習意欲を維持しにくいことが問題となっ

ている.PROVIT-FXにより,詳細な EPV用情報を

学習者に示し,また作成したプログラムの問題点をエ

ラーメッセージとして個々の学習者にフィードバック

した結果,より短い時間でプログラムを完成できる学

習者が増え,更に GUI の改善すべき点を指摘する学

習者が現れるなど,初学者の学習効果,学習効率及び

図 7 変数アドレスとポインタ変数Fig. 7 Address and pointer varialble.

表 5 EPV 用情報の提供状況Table 5 EPV information offered by conventional

PV systems and CVM-EP.

EPV 用情報従来研究(文献番号で示す) CVM

[6] [11] [15] [16] [17] -EP

評価・実行履歴 × *1 × × *1 ○評価・実行順番 × × × × × ○アクセス情報 *2 × × *2 × ○代入情報 × × × × × ○関数情報 × × × × × ○無効アクセス ○ × × × × ○無限ループ × × × × × ○変数アドレス × × × × × ○

○ 提供 × 未提供∗1 限定提供(標準入力と無限ループは非対応)∗2 限定提供(アドレスでの間接アクセスは非対応)

学習意欲の向上に寄与することができた.

5. 3 CVM-EPの有効性

CVM-EP を利用する PROVIT-FX は,VIP や

VILLE の問題点を解決し専用コマンドなどを使用

せずに C プログラムの可視化ができ,利用者に便利

な環境を提供することができた.更に以下の C 文法

をカバーし,Teaching Machine, WebWriter++及び

Jerooの対応文法不足の問題を解決することができた.• 基本データ型の単独変数,ポインタ変数と二次

元までの変数配列• 代入文,if 文,switch 文,while 文,for 文,

continue文,break文,return文• 自定義関数(関数の再帰呼び出しも可能)• 各種の演算子• 標準ライブラリ関数 scanf(), printf(), sqrt(),

srand(), rand(), random(), srandom()

• 数値型定数の define文

このように CVM-EPを利用することにより PVシ

ステムは仮想マシンの提供する情報の表示に専念でき

るようになったため,PVシステムの開発を効率的に

行うことができた.

CVM-EPは初学者の学習支援用 PVシステム構築

のためのものであるが,500行以下の単一ファイルの

Cプログラムに対応しているので,この範囲のプログ

ラムの一般的なデバッグツールの構築にも利用可能で

ある.

以上のように CVM-EPは初学者の学習という制約

のもとでプログラム可視化ツールを構築する道具とし

て有用性の高いプログラム学習支援環境の構築に寄与

することができた.

6. む す び

本論文は仮想マシンによる初学者教育のための PV

用情報抽出手法と,その可能性を確認するための C仮

想マシン CVM-EP を提案した.実装した CVM-EP

とその実験応用システム PROVIT-FX により,初学

者の教育支援に必要でかつ従来の IDE や教育用 PV

システムで実現されていなかった機能を実現すること

ができ,仮想マシンによる初学者教育のための PV用

情報の抽出が可能であることと,OS非依存言語 Java

で実装された CVM-EPが十分な処理速度を有するこ

とが示された.

今後は各種初学者教育支援用 C プログラム PV 手

法の提案とともに,CVM-EPの開発を更に進めより

1299

Page 9: 初学者教育のためのプログラム可視化用 C仮想マシンcleast.u-aizu.ac.jp/CVM-EP.pdf · 2017-06-21 · の2014 年プログラミング部門予選では,57%の選手

電子情報通信学会論文誌 2015/10 Vol. J98–D No. 10

多くの EPV用情報を提供し,CVM-EPの APIと再

利用可能クラスファイルを公開する予定である.

文 献[1] TIOBE SOFTWARE: TIOBE Programming Com-

munity Index for April 2015, http://www.tiobe.com/

index.php/content/paperinfo/tpci/index.html, [On-

line accessed 24-April-2014].

[2] パ ソ コ ン 甲 子 園 ,http://web-ext.u-aizu.ac.jp/pc-

concours/, [Online accessed 24-April-2014].

[3] J. Stasko, A. Badre, and C. Lewis, “Do algorithm

animations assist learning?: An empirical study and

analysis,” Proc. INTERACT ’93 and CHI ’93 Con-

ference on Human Factors in Computing Systems,

pp.61–66, CHI ’93, ACM, New York, NY, USA, 1993.

[4] J. Maloney, M. Resnick, N. Rusk, B. Silverman, and

E. Eastmond, “The scratch programming language

and environment,” Trans. Comput. Educ., vol.10,

no.4, pp.16:1–16:15, Nov. 2010.

[5] B. Dorn and D. Sanders, “Using Jeroo to introduce

object-oriented programming,” 33rd Annual Fron-

tiers in Education Conference(FIE’03), vol.1, pp.22–

27, 2003.

[6] T. Norvell and M. Bruce-Lockhart, “Lifting the hood

of the computer: Program animation with the teach-

ing machine,” Proc. Canadian Electrical and Com-

puter Engineering Conference (CCECE’00), pp.831–

835, 2000.

[7] T. Norvell and M. Bruce-Lockhart, “Teaching com-

puter programming with program animation,” Proc.

2004 Canadian Conference on Computer and Soft-

ware Engineering Education, pp.1–9, 2004.

[8] A. Moreno, N. Myller, E. Sutinen, and M. Ben-Ari,

“Visualizing programs with Jeliot 3,” Proc. Working

Conference on Advanced Visual Interfaces(AVI’04),

pp.373–376, 2004.

[9] 喜多義弘,片山徹郎,冨田重幸,“プログラム自動可視化ツール avisを利用した結合テスト実施のための実行経路抽出手法の提案,” 情処学論,vol.51, no.9, pp.1859–1872,

Sept. 2010.

[10] J.H. Cross and D. Hendrix, “jGRASP: An inte-

grated development environment with visualizations

for teaching java in CS1, CS2, and beyond,” 36th An-

nual, Frontiers in Education Conference, p.22, Oct.

2006.

[11] T. Rajala, M.-J. Laakso, E. Kaila, and T. Salakoski,

“VILLE - A language-independent program visual-

ization tool,” Seventh Baltic Sea Conference on Com-

puting Education Research (Koli Calling 2007), eds.

by R. Lister and Simon, vol.88, pp.151–159, CRPIT,

ACS, Koli National Park, Finland, 2007.

[12] Free Software Foundation: GDB: The GNU Project

Debugger, http://www.gnu.org/software/gdb/, [On-

line; accessed 10-August-2013].

[13] Microsoft Corporation: Microsoft Visual Studio,

http://www.microsoft.com/ja-jp/dev/, [Online; ac-

cessed 10-August-2013].

[14] International Business Machines Corporation: The

Eclipse Foundation open source community,

http://www.eclipse.org/, [Online; accessed 10-August-

2013].

[15] G. Rowe and G. Thorburn, “VINCE: an online tu-

torial tool for teaching introductory programming,”

British Journal of Educational Technology, vol.31,

pp.359–369, 1998.

[16] A. Virtanen, A.E. Lahtinen, H.-M. Jarvinen, “VIP, a

visual interpreter for learning introductory program-

ming with C++,” Proc. 5th Koli Calling Conference

on Computer Science Education (KOLI’05), pp.125–

130, 2005.

[17] M. Terada, “ETV: A program trace player for stu-

dents,” Proceedings of 10th Annual SIGCSE Con-

ference on Innovation and Technology in Computer

Science Education, pp.118–122, Sept. 2005.

[18] Free Software Foundation: GCC, the GNU Compiler

Collection, http://gcc.gnu.org/, [Online; accessed 10-

August-2013].

[19] Oracle Corporation: Java Platform Debugger Archi-

tecture, http://www.oracle.com/technetwork/java/

javase/tech/jpda-141715.html [Online; accessed 10-

August-2013].

[20] Doug South: C grammar definition for use with

JavaCC, http://java.net/downloads/javacc/contrib/

grammars/C.jj, [Online; accessed 10-August-2013].

[21] Java Compiler Compiler tm (JavaCC tm) - The Java

Parser Generator, http://javacc.java.net/, [Online;

accessed 10-August-2013].

[22] K. Matsumura, D. Shirai, and A. HE, “A C language

programming education support system based on

software visualization,” Pervasive Computing, pp.9–

14, Dec. 2009.

[23] PROVIT(PROgram VIsualization Tool), http://provit.

u-aizu.ac.jp/home/ [Online; accessed 1-January-2015].

(平成 27 年 2 月 2 日受付,5 月 12 日再受付,7 月 2 日早期公開)

Aiguo He (正員)

1988 年名古屋大学大学院電子工学研究科博士課程修了.株式会社アイヴィスなどを経て 2001 年より会津大学.上級准教授.工学博士.e-Learning,分散協調制御システム,ネットワーク,ソフトウェア工学の研究に従事.IEEE CS, 電気学会,情報処

理学会各会員.

1300