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

論
文
初学者教育のためのプログラム可視化用 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
文法をサポートする Teaching Machine [6] と Web-
1. ま え が き
Writer++ [7] 及び Java プログラミング学習を支援す
C 言語は広く利用されるコンピュータ言語の一つで
あり [1], 多くの大学で入門言語として学ばれ,中高学
校でも授業やプログラミング競技などで使われてい
る.例えば高校生向け IT 競技「パソコン甲子園」[2]
の 2014 年プログラミング部門予選では,57%の選手
る Jeliot [8],AVIS [9],jGRASP [10] と VILLE [11]
などの研究は PV の有効性を証明した.
一方 C プログラムの教育現場では以下のような PV
システムが利用または提案されている.
•
IDE 産業界またはプログラミング熟練者の間
が C 言語を使用した.また 36%の選手が C++言語を
では gdb [12] や,Visual Studio [13] 及び Eclipse [14]
使用したが,その多くは C スタイルのプログラムを
などの IDE(Integrated Development Environment)
書いた.しかし IT 競技選手のような C プログラミン
が使用されており,プログラムを行単位で逐次実行し,
グに対し興味をもつ初学者の間でも期待された学習目
実行途中の状態を可視化することで,プログラム開発
標が達成されていない人がいる.例えば「パソコン甲
効率の向上に貢献している.しかし IDE は初学者教育
子園」プログラミング部門の予選では,これまで毎年
用に最適化されていないため,初学者には使いにくい.
10%前後の選手が最も簡単な競技問題(標準入出力と
例えば IDE は豊富な機能を提供する代わりに,GUI
四則演算で解答する文章題)も解けなかった.
が非常に複雑になっており,その操作方法の習得に多
初学者の学習意欲と学習効率を向上させるためにプ
くの時間が費やされてしまう.実際,筆者の大学では
ログラムの動作を正しく理解させ,プログラムの問題点
初学者の多くは C プログラムのデバッグに IDE の機
が容易に発見できる学習環境としてプログラム可視化
能を使わず printf 文に頼っている.
(PV) [3] 手法を利用した学習支援システムが多く提案
されている.例えば独自のプログラミング言語の学習
に特化した Scratch [4] と Jeroo [5], 限定された C++
•
Java ベースの教育専用システム VINCE [15],
VIP [16] と VILLE [11] は IDE のように実行中のプロ
グラムの状態を表示することができ,更に Java で実
装され多くの OS 上で使用できる.ただし VIP はプ
†
会津大学大学院コンピュータ理工学研究科,会津若松市
ログラムのソースコードに専用の制御コマンドを埋め
Graduate School of Computer Science and Engineering, The
込む必要があり,VILLE は可視化対象の C プログラ
University of Aizu, Aizuwakamatsu-shi, 965–8580 Japan
ムと同じ処理の Java プログラムを用意し,更に双方
a) E-mail: [email protected]
DOI:10.14923/transinfj.2015JDP7011
1292
電子情報通信学会論文誌
のプログラムの対応関係を定義した上で Java プログ
c 一般社団法人電子情報通信学会 2015
D Vol. J98–D No. 10 pp. 1292–1300 論文/初学者教育のためのプログラム可視化用 C 仮想マシン
ラムを実行しながら,見かけ上の C プログラムの可視
tional Purpose) を提案し,以下の可能性の確認を目
化を実現している.これらのシステムは教育コンテン
的とする.(1) OS に依存しない C 仮想マシンの実現
ツを作成する立場の教員向けのツールとして有効であ
可能性 (2) EPV 用情報取得の可能性 (3) PV システ
るが,学生が自由に書いたプログラムにそのまま対応
ム開発の観点から見た CVM-EP の有効性
することができない.また VINCE は学生の書いた C
以下,2. では EPV 用情報と CVM-EP の設計方針
プログラムにも対応するが学習支援機能は逐次実行さ
について述べ,3. では CVM-EP のシステム構成につ
れる文の説明提示に留まっている.
いて述べる.また 4. では CVM-EP の解析木につい
•
Trace player ETV [17] は gcc [18] と gdb の
出力ログデータを視覚化するシステムである.Trace
player ではプログラムの逐次実行とそれの逆戻りの表
示が可能であり,プログラムの理解に有効である.し
て述べ,5. では応用システムによる CVM-EP の考察
について述べる.
2. EPV 用情報と CVM-EP
かし Trace player は可視化対象プログラムの実行と
2. 1 EPV 用情報
可視化が同期できない.例えば無限ループが含まれる
本研究で考える EPV 用情報は 1. に挙げた教育用
プログラムには対処できず,また標準入力が行われた
PV システムの問題点を解決するためのものに限定
直後の状態を直ちに可視化できない場合がある.
する.
更に上記 PV システムに共通する問題点は初学者教
•
逐次評価・実行
変数宣言文も逐次評価・実
育のための情報の可視化が不十分である.例えば初学
行の対象とし,逐次評価・実行の順番を人間のソース
者にプログラムの処理を正しく理解させるためには逐
コード解読過程に合わせる.図 1 は例として switch
次評価・実行される文の順番は人間がそのプログラム
文と for 文に対する従来の IDE の逐次評価・実行で
の動作を推測・理解していくときにチェックする順番
通過する文の順番と,EPV 用情報が示す順番である
と一致させること,for 文や while 文が無限ループに
(詳細を示すために for 文の制御部分に意図的に改行
なっている場合はそれを提示すること,またはポイン
を挿入した).従来の IDE では switch 文中の case 文
タとそれにより参照されている変数の関連を示すには
と default 文の評価順番を示さず,for 文の繰り返し
変数アドレスの可視化が必要であるが,従来の PV シ
継続条件式評価の表示は 1 回のみである.それに対し
ステムではそれは実現されていない.
EPV 用情報では評価・実行順の表示が改善される.ま
本研究では上記のような,言語仕様で決めておらず
または熟練者には不必要か非合理的であるが初学者
教育に必要な可視化を「EPV(Educational Program
た,ブレークポイントの設定も上のような逐次評価・
実行単位で行えるようにする.
•
変数と関数情報
変数情報にはアドレス,ポイ
Visualization)」と定義し,それに必要なプログラム
ンタ(1 重ポインタ,2 重ポインタなど)及び変数値が
情報を「EPV 用情報」と定義する.EPV 用情報の取
意図的に設定されたか否かの情報が,関数情報には呼
得手法についてはまだ十分に研究されていない.
本研究は以下の理由から仮想マシンによる EPV 用
情報の抽出手法を提案する.
•
あらゆる EPV 用情報を全て取得するには実行
中のプログラムの状態を推定するための仮想マシンが
必要である.
•
仮想マシンを利用すれば PV システムの開発が
容易になる.例えば Java プログラミング学習支援用
PV システムには Java Debugger Interface (JDI) [19]
を有する Java 仮想マシンの果たす役割が大きい.
•
従来の IDE は教育専用でないため直接 EPV 用
情報を取得することは不可能である.
本研究は更に EPV 用情報を提供するための C 仮
想マシン CVM-EP(C Virtual Machine for Educa-
Fig. 1
図 1 細かい逐次評価・実行
Detailed evaluation and execution.
1293
電子情報通信学会論文誌 2015/10 Vol. J98–D No. 10
び出し直前と実行済み関数及び,再帰呼び出しの可視
化を容易にするための情報が含まれる.
•
評価・実行履歴 評価・実行履歴は毎回の逐次評
価・実行後と連続実行が(ブレークポイントまたはプ
ログラムの終了で)停止したときのプログラム状態を
記録したものである.この情報は文の評価・実行順番
と実行前後の状態変化の表示に利用でき,更に Trace
player と異なり,プログラムの実行途中でも,逐次評
図 2 CVM-EP の構成
Fig. 2 CVM-EP’s archtecture.
価・実行の逆戻りがインタラクティブにできる.
•
無効アクセス
適正に初期化されていないポイ
ンタ変数の参照やアドレス演算子&の使い忘れなどの
ようなミスを可視化するための情報である.
•
アクセス対象
(ポインタ変数などを経由して)間接的に参照・変更
される変数を表示するための情報である.
•
拡張し,JavaCC [21] でコンパイルして作成した.
逐次評価・実行で直接または
意味なし無限ループ
本論文ではプログラムの
状態変化が生じない繰り返し処理を意味なし無限ルー
一例として下のリストはパーサー定義中の while 文
と for 文解析部の拡張結果を示す.
(拡張前)
void IterationStatement() : {}
{
プと定義する.初学者が意図的に意味なし無限ループ
( <WHILE> "(" Expression() ")"
を書かないことを前提にし,プログラムの構文解析で
Statement()
は for 文に対しその継続条件と処理本体の文がともに
|
省略された場合はこれを実行不可プログラムとする.
<FOR> "(" [ Expression() ] ";"
またプログラムの実行中では繰り返し文の中で意味な
[ Expression() ] ";"
し無限ループの可能性をできる限りチェックする.
[ Expression() ] ")"
2. 2 CVM-EP の設計方針
CVM-EP の設計に当たって以下のことを考慮する.
• 初学者が学ぶ C 文法をカバーする.
•
言語仕様で規定されていないもの(例えば式の
Statement() )
}
(拡張後)
CVStatement IterationStatement() : {
評価順序)は gcc の処理仕様に準拠する.
•
も提供する.
•
CVExpression i=null, c=null, r=null;
EPV 用情報の他に従来の IDE が提供する情報
多くの OS 上でインターネット経由で使用でき
CVStatement s=null, ss=null;
}
{
るように Java 言語で開発する.
•
( <WHILE> "(" c = Expression() ")"
十分な性能(プログラムを連続モードで実行す
ss = Statement()
るときの速度)を確保する.
{s = new CVWhileStatement(c, ss);}
|
3. CVM-EP の構成
<FOR> "(" [ i = Expression() ] ";"
図 2 は CVM-EP のシステム構成を示す.CVM-EP
[ c = Expression() ] ";"
のアプリケーションは各種初学者教育用 PV システム
[ r = Expression() ] ")"
を想定している.SyntaxTree については 4. で述べ,
ss = Statement()
他の各ブロックについては以下に述べる.
{s = new CVForStatement(i, c, r, ss);}
3. 1 Parser
)
Parser は C プログラムのソースコードを解析し,
{return s;}
SyntaxTree を構築する.Parser の Java 言語ソース
}
コードは Doug South が作成したパーサー定義 [20] を
上のように拡張前の定義では C プログラムの文法チェッ
1294
論文/初学者教育のためのプログラム可視化用 C 仮想マシン
クのみが行われるが,拡張により SyntaxTree の構築機
( 2 ) 履歴データ中の節を走査済節とする.
能が追加される.この例では解析の結果 SyntaxTree
( 3 ) その履歴データを履歴記録から削除する.
上の節 (Node) として式に対応する CVExpression,
( 4 ) アプリケーションに処理の完了を通知する.
while 文に対応する CVWhileStatement, for 文に対
3. 3. 3 連 続 実 行
応する CVForStatement 及び一般の文に対応する
プログラムの連続実行はプログラムの最後またはブ
CVStatement が作成される.
レークポイントが設定された節まで逐次評価・実行を
3. 2 Memory Manager
繰り返すことで実現する.連続実行の場合は,最後に
MemoryManager は以下のデータの管理を行う.
• メモリマップ 仮想のメモリ番地をもち,変数の
行われた逐次評価・実行についてのみ履歴データを作
現在値及び char 型定数(文字列)の値を保持する.
•
成し,アプリケーションへの通知を行う.
3. 4 BuildinFunction と Console
変数情報 データ型,ポインタ階数(0=通常変
BuildinFunction は実行中の C プログラムから呼び
数,1=ポインタ変数,2=二重ポインタ変数),変数名
出される C 標準ライブラリ関数の機能を提供する.ま
及びメモリマップ上の番地,更に配列変数の場合はそ
た Console は標準入出力関数に必要な GUI 機能を提
れの次元数と各次元のサイズを保持する.
供する.
•
定数情報 定数のデータ型,名前,値及びメモリ
マップ上の番地とメモリサイズを保持する.
•
代入情報 メモリマップの各バイトに対し代入操
作が行われたか否かの情報をもつ.
•
アクセス情報 一つの逐次評価・実行で参照また
は変更されたメモリの情報をもつ.
•
関数情報 現在実行中の関数は呼び出し側関数,
ローカル変数及び戻り値をもつ.また同一関数から実
4. SyntaxTree
SyntaxTree は C プログラムの解析結果を多分木構
造でもち,またプログラムの評価・実行の処理を該当
文に対応する節で定義する.プログラムの実行順は
SyntaxTree の中間順 (inorder) 走査で制御する.
この章では Java 言語による SyntaxTree の構造と
木走査の実装について述べる.
行された実行済関数は過去に遡って指定された数分の
4. 1 SyntaxTree の節
情報のみを保持する.
SyntaxTree は以下の三種類の節をもつ.
• 単純節 Parser により認識された文法上の最小
3. 3 State Manager
StateManager はアプリケーション側の要求に従い,
SyntaxTree で定義された走査順に基づき,プログラ
ムの逐次評価・実行またはそれの逆戻りを実現する.
3. 3. 1 逐次評価・実行及び履歴作成
逐次評価・実行では次の処理を行う.
( 1 ) Memory Manager のアクセス情報をリセッ
トする.
( 2 ) SyntaxTree より,前回走査した節から今回
の走査対象節を取得する.
( 3 ) その節のもつ機能で対応する文の評価・実行
を行う.
( 4 ) その節を走査済節にしそれと MemoryMan-
ager の現時点の全データのコピーを履歴データとして
構成要素
•
評価節 この節が頂点となる部分木はプログラ
ムの逐次評価対象に対応する.
•
実行節 この節が頂点となる部分木はプログラ
ムの逐次実行対象に対応する.
節の子節は親節より先に走査される先行節と親節よ
り後に走査される後行節に分かれるが,後行節は二項
式と関数式の引数に現れるインクリメント・デクリメ
ント演算子をもつ後置演算式に対応する実行節のみで
ある.
図 3 は下のプログラムから作成された SyntaxTree
の部分木及び節の例を示す.
for (i = 0; i < 10; i++){
作成し,履歴記録に追加する.
a = i;
( 5 ) アプリケーションに処理の完了を通知する.
b = a*c++;
3. 3. 2 逐次評価・実行の逆戻り
}
逆戻りは次のように履歴データを利用して実現する.
節はその種別,親節,子節(先行節と後行節のリス
( 1 ) 履歴記録中の最後の履歴データを Memory
Manager に戻す.
ト)の情報と,以下のメソッドをもつ.
•
fetchFirst() 自身が頂点となる部分木の中か
1295
電子情報通信学会論文誌 2015/10 Vol. J98–D No. 10
Fig. 4
図 3 Syntax tree の例
Fig. 3 Example of syntax tree.
•
図 4 条件文と繰り返し文木内の走査順
Travase order inside conditional and repetition statement syntax tree.
continue 文節の場合は,SyntaxTree のルート
方向に向かって最初に辿り着いた for 文節または while
ら,最初の走査対象となる評価節または実行節を返す.
•
fetchNext()
走査済の子節を引数として受
け取り,それの次の走査対象を返す.
•
value()
この節に対応する式の現在値を取得
また評価節と実行節は以下のメソッドを有する.
next()
この節の,走査順上の次の評価節ま
たは実行節を取得する.
•
象とする.
•
break 文節の場合は,SyntaxTree のルート方
向に向かって最初に辿り着いた switch 文節,for 文節
または while 文節に対し,その親の fetchNext() を実
する.
•
文節の fetchNext() を実行し,その結果を次の走査対
execute() 評価節の場合は,この節に対応す
行した結果を次の走査対象とする.
•
関数呼び出し節の場合は,呼び出し先の関数節
の fetchFirst() の実行結果を次の走査対象にし,関数
節と関数呼び出し節のペアを管理情報として登録して
る式の値が確定される.また実行節の場合はこの節に
おく.そして return 節または関数部分木の走査が完
対応する式または文の実行処理を行い,プログラムの
了したときには関数呼び出し節の走査で作成された管
状態を変更する.
理情報を用いて,関数呼び出し節の親の fetchNext()
4. 2 SyntaxTree の走査制御
アプリケーション側の制御に従い,最初の逐次評価・
で次の走査先を取得する.
4. 3 実行中の問題検出
実行では main() 関数に対応する節の fetchFirst() で
一部の節はプログラム実行中の問題検出を行いプロ
最初の走査対象節を取得する.また 2 回目以降の逐次
グラムの続行ができないと判断した場合,その原因を
評価・実行では走査済節の next() でその次の走査対象
提示し,処理を中断する.
節を取得する.
制御構造をもつ文に対応する部分木の走査順は走査
4. 3. 1 意味なし無限ループの検出
for 文と while 文節において,図 4 中の節 C が走査
済節の値により制御される.この制御はこれらの部分
されるたびに,MemoryManager 中のメモリマップ,
木の頂点節の fetchNext() で実現する.一例として図
アクセス情報と代入情報を,前回この節が走査された
4 は (a)if 文,(b)for 文と (c)while 文部分木内での走
ときのものと比較する.2 回のデータが同じすなわち
査順を示す.ただし,C は条件式,I は初期化式,R
プログラムの状態に変化がない場合は,意味なし無限
は増分処理式,また St, Sf と S は分岐条件に従い実行
ループの可能性があると判断する.
される文に対応する節である.if 文節は C の値に従い
4. 3. 2 無効アクセスの検出
St と Sf から次の走査対象を決める.for 文節は C の
MemoryManager はアクセス先のアドレス値がメモ
値で for 文木全体の走査終了を判断する.while 文節
リマップの有効範囲内にあるかをチェックする.また
の走査は for 文の部分木から I と R が省略された場合
代入情報を参照し,アクセス先のメモリが代入により
と同様である.
初期化されたかをチェックする.
Jump 文節は走査の後に走査先が強制的に切り替え
られる.この処理は Jump 文節の next() で実現する.
以下にはその一部の例を示す.
1296
5. CVM-EP の実装と評価
前 述 し た 設 計 に 基 づ き CVM-EP を 実 装 し ,更
論文/初学者教育のためのプログラム可視化用 C 仮想マシン
に そ れ の 応 用 シ ス テ ム と し て ,Java3D ベ ー ス の
一方 CVM-EP は Java で実装されており本来の C
PROVIT(PROgram Visualization Tool) [22] とその
プログラム実行環境に比べ,実行速度の低下が避けら
改良版である JavaFX ベースの PROVIT-FX [23] を
れない.これは逐次評価・実行の場合は問題がないが,
開発した.ここでは PROVIT-FX と従来の PV シス
例えば大きい配列を使用するプログラムを最初から最
テムと比較し CVM-EP の学習支援機能を考察する.
後まで一気に実行するような場合は CVM-EP の処理
図 5 は PROVIT-FX の実行画面例である.この画
速度の影響が無視できなくなる.そのため本研究では
面は対象プログラムのソースコードを表示する Code
表 1 に示す実験環境で CVM-EP の性能を調べた.
view, プログラムの状態をグラフィカルに表示する
筆者の大学 1 年が学ぶ最も処理能力が要求されるプ
Image view, 仮想 Console 及び Message area から構
ログラムは輝度平滑化や微分などの濃淡画像処理プロ
成され,以下の操作が可能である.
グラムである.これを考慮し実験は表 2 の処理のプ
•
ブレークポイント(図 5 中ソースコードを覆う
薄緑の長方形)の設定と解除
•
逐次評価・実行とそれの逆戻り
•
ブレークポイントまでの連続実行と連続実行の
ログラムを PROVIT-FX の連続実行モードで実行し,
それぞれの実行時間を測定した.実験に使用したプロ
グラムを下に示す.
void main(){
停止
•
int i, a, b = 100000;
プログラムの先頭に戻る
double da, db = 100000;
5. 1 OS に依存しない C 仮想マシンの実現
本研究はまず現在 JavaFX をサポートしている Win-
for (i = 0; i < 100000; i++){
dows, Mac OS 及び Linux の各 OS 上で PROVIT-FX
a = b + i;
// (1)
を実行させ,筆者の大学の 1 年目前期科目「プログラ
//
a = b*i;
// (2)
ミング入門」の講義に使用されているプログラム例と
//
a = b/(i + 1);
// (3)
演習課題の解答プログラムで CVM-EP の機能を検証
//
a = (int)(db/(i + 200)); // (4)
した.その結果 CVM-EP が各 OS 上で正しく機能す
//
da = db/(i + 200);
// (5)
ることが確認された.
//
da = rand();
// (6)
//
a = rand();
// (7)
}
}
表1 実験環境
Table 1 Test environment.
A
B
C
D
E
F
G
CPU/Clock(GHz)
Memory(GB)
Atom/1.33/2
Pentium/1.2/1.25
Core-i3/1.5/4
Core-i5/1.6/4
Core i5/2.3/4
Core-i7/3.4/8
Core-i5/2.7/8
OS/JRE
Type
Windows8.1/8u25
Windows7-SP1/8u25
Windows8.1/8u25
Windows7-SP1/8u25
Windows8.1/8u25
Windows7-SP1/8u25
OS X Mavericks/7u71
Tablet
Notebook
Notebook
Notebook
Desktop
Desktop
Desktop
表2 実験内容
Table 2 Test cases.
Fig. 5
図 5 PROVIT-FX の実行画面
Execution window of PROVIT-FX.
No.
(1)
(2)
(3)
(4)
(5)
(6)
(7)
処理(10 万回繰り返し)
整数の足し算結果を整数に代入
整数の掛け算結果を整数に代入
整数の割算結果を整数に代入
実数の割り算結果を整数に代入
実数の割り算結果を実数に代入
関数 rand() の戻り値を実数に代入
関数 rand() の戻り値を整数に代入
1297
電子情報通信学会論文誌 2015/10 Vol. J98–D No. 10
上のプログラムは表 2 の処理 1 の実験用に変更されて
される変数を色で強調表示することができた.例えば
おり,ソースコード右側のコメント(番号)は表 2 の
図 5 では 10 行目の printf 文が実行対象文で,その中
で参照される変数「char o」が青色で表示されている.
処理番号である.
実験は表 2 の各処理のプログラムを表 1 の各環境で
5 回実行し,その実行時間の平均値を求めた.表 3 は
また代入情報を利用し図 5 に示すように初期化されて
いない変数 q の値を非表示とすることができた.
5. 2. 4 プログラムの実行中の診断
実験の結果である.
上記実験のほかに 378x547 ドットの PGM フォー
PROVIT-FX は CVM-EP が有効範囲外のメモリ
マット画像データを配列に読み込み 2 値化するプログ
へのアクセスや,意味なし無限ループの可能性及び未
ラム(筆者の大学のプログラム入門授業の例題)を連
初期化変数への参照などの問題点が検出されたときは,
続実行で実行したところ,表 1 の環境 A では 10 秒前
Message area にメッセージを表示する.表 4 はメッ
後,環境 F では 2 秒以内に処理が完了できた.
セージの一覧である.
上記の実験で CVM-EP の性能が初学者教育に十分
であることが判明した.例えば講義のときにノート
5. 2. 5 関 数 情 報
PROVIT-FX は再帰関数呼び出しを簡単に可視化
PC 上の PROVIT-FX で画像処理プログラムを逐次
することができた.図 6 は 2!の値を再帰呼び出し関
実行と連続実行しながらその実行時間を気にせずに解
数 r() で求めるプログラムの可視化例である.図 6 は
説することが可能である.
r(2) の中で r(1) の戻り値を利用して変数 ret の値を計
以上のように本研究は OS に依存しないかつ初学者
算する直前の様子であり,実行中の関数は呼び出し元
教育用システムに必要な性能を有する C 仮想マシンを
関数の下側に,実行済の関数は呼び出し元関数の右下
実現することができた.
側に表示されている.
5. 2 EPV 用情報の取得
5. 2. 6 変数アドレスとポインタ変数
ここでは PROVIT-FX によって CVM-EP が取得
従来の教育用 PV システムは変数のアドレスを直接
する EPV 用情報とその有効性について述べる.
示すことができないが,PROVIT-FX はポインタ変
5. 2. 1 評価・実行履歴
図 5 は逐次評価・実行履歴を利用した表示例である.
PROVIT-FX は過去 6 ステップまで遡り評価・実行
された文を濃さの異なる赤い下線で示し,最も濃い下
線はこれから実行される文を示す.また Trace player
の問題が解決され,プログラムの実行途中でも評価・
実行の逆戻りが可能である.
5. 2. 2 逐次評価・実行の順番
PROVIT-FX は従来の IDE の逐次評価・実行の順
番表示を改善し,例えば図 5 では switch 文に対し図
1 のように逐次評価・実行を表示することができた.
5. 2. 3 アクセス情報と代入情報
表 4 エラーメッセージ
Table 4 Error messages.
エラー内容
未初期化変数への参照
printf() の書式指定の
データ型が異なる
scanf() のアドレス取
得記号&の使用忘れ
配列添え字指定誤り
変数領域以外への代入
ゼロ割
for(while) 文で無意味
な無限ループ
メッセージの例
初期化されいない変数が参照される
1 番目の書式 (%f) は実数値出力に
だけ使用できる
1 番目のパラメータは無効な
アドレス
添え字が 9(配列のサイズ)を超えた
非ユーザメモリへの代入が
検出された
ゼロ割
この for(while) 文は終了しない
可能性がある
PROVIT-FX は逐次評価・実行で変更または参照
表3 実験結果
Table 3 Test results.
処理
(1)
(2)
(3)
(4)
(5)
(6)
(7)
1298
A
734
732
968
1111
1201
1096
1005
環境別処理時間 (ms)
B
C
D
E
F
776 309 278 210 166
768 331 280 213 163
957 415 355 265 202
1037 424 363 276 208
1059 431 374 288 213
970 394 344 269 202
911 375 321 255 198
G
79
68
88
99
103
88
84
図 6 関数の再帰呼び出し
Fig. 6 Recursive call.
論文/初学者教育のためのプログラム可視化用 C 仮想マシン
数とそのアクセス先の関連を簡単に可視化することが
できた.図 7 はポインタ変数で整数の和,差,積と商
学習意欲の向上に寄与することができた.
5. 3 CVM-EP の有効性
を求めるプログラムであり,関数 work() の中で商が
CVM-EP を 利 用 す る PROVIT-FX は ,VIP や
計算される直前の様子である.変数のアドレス値は変
VILLE の問題点を解決し専用コマンドなどを使用
数の左上に小さい文字で表示され,拡大操作で調べる
せずに C プログラムの可視化ができ,利用者に便利
ことができる.
な環境を提供することができた.更に以下の C 文法
表 5 は従来研究と CVM-EP における EPV 用情報
の取得可否や機能提供の有無を示す.CVM-EP を用
をカバーし,Teaching Machine, WebWriter++及び
いて本研究が目標とした EPV 用情報を全て取得する
Jeroo の対応文法不足の問題を解決することができた.
• 基本データ型の単独変数,ポインタ変数と二次
ことができた.
元までの変数配列
教育の現場では,初学者の多くが,プログラムの処
理を正しく理解できず,またプログラムが暴走や異常
終了したとき,その原因を見出すために多くの時間を
•
代入文,if 文,switch 文,while 文,for 文,
continue 文,break 文,return 文
• 自定義関数(関数の再帰呼び出しも可能)
必要とし,学習意欲を維持しにくいことが問題となっ
•
各種の演算子
ている.PROVIT-FX により,詳細な EPV 用情報を
•
標準ライブラリ関数 scanf(), printf(), sqrt(),
学習者に示し,また作成したプログラムの問題点をエ
ラーメッセージとして個々の学習者にフィードバック
srand(), rand(), random(), srandom()
• 数値型定数の define 文
した結果,より短い時間でプログラムを完成できる学
このように CVM-EP を利用することにより PV シ
習者が増え,更に GUI の改善すべき点を指摘する学
ステムは仮想マシンの提供する情報の表示に専念でき
習者が現れるなど,初学者の学習効果,学習効率及び
るようになったため,PV システムの開発を効率的に
行うことができた.
CVM-EP は初学者の学習支援用 PV システム構築
のためのものであるが,500 行以下の単一ファイルの
C プログラムに対応しているので,この範囲のプログ
ラムの一般的なデバッグツールの構築にも利用可能で
ある.
以上のように CVM-EP は初学者の学習という制約
のもとでプログラム可視化ツールを構築する道具とし
て有用性の高いプログラム学習支援環境の構築に寄与
図 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 限定提供(アドレスでの間接アクセスは非
対応)
することができた.
6. む す び
本論文は仮想マシンによる初学者教育のための PV
用情報抽出手法と,その可能性を確認するための C 仮
想マシン CVM-EP を提案した.実装した CVM-EP
とその実験応用システム PROVIT-FX により,初学
者の教育支援に必要でかつ従来の IDE や教育用 PV
システムで実現されていなかった機能を実現すること
ができ,仮想マシンによる初学者教育のための PV 用
情報の抽出が可能であることと,OS 非依存言語 Java
で実装された CVM-EP が十分な処理速度を有するこ
とが示された.
今後は各種初学者教育支援用 C プログラム PV 手
法の提案とともに,CVM-EP の開発を更に進めより
1299
電子情報通信学会論文誌 2015/10 Vol. J98–D No. 10
多くの EPV 用情報を提供し,CVM-EP の API と再
http://www.microsoft.com/ja-jp/dev/, [Online; accessed 10-August-2013].
利用可能クラスファイルを公開する予定である.
文
[1]
献
[14]
Eclipse
TIOBE SOFTWARE: TIOBE Programming Com-
visual interpreter for learning introductory program-
analysis,” Proc. INTERACT ’93 and CHI ’93 Con-
ming with C++,” Proc. 5th Koli Calling Conference
ference on Human Factors in Computing Systems,
on Computer Science Education (KOLI’05), pp.125–
J. Maloney, M. Resnick, N. Rusk, B. Silverman, and
130, 2005.
[17]
dents,” Proceedings of 10th Annual SIGCSE Con-
and environment,” Trans. Comput. Educ., vol.10,
ference on Innovation and Technology in Computer
B. Dorn and D. Sanders, “Using Jeroo to introduce
27, 2003.
Science Education, pp.118–122, Sept. 2005.
[18]
August-2013].
[19]
Oracle Corporation: Java Platform Debugger Archi-
T. Norvell and M. Bruce-Lockhart, “Lifting the hood
tecture, http://www.oracle.com/technetwork/java/
of the computer: Program animation with the teach-
javase/tech/jpda-141715.html [Online; accessed 10-
puter Engineering Conference (CCECE’00), pp.831–
August-2013].
[20]
835, 2000.
Doug South:
C grammar definition for use with
JavaCC, http://java.net/downloads/javacc/contrib/
T. Norvell and M. Bruce-Lockhart, “Teaching computer programming with program animation,” Proc.
grammars/C.jj, [Online; accessed 10-August-2013].
[21]
2004 Canadian Conference on Computer and SoftA. Moreno, N. Myller, E. Sutinen, and M. Ben-Ari,
Java Compiler Compiler tm (JavaCC tm) - The Java
Parser Generator, http://javacc.java.net/, [Online;
ware Engineering Education, pp.1–9, 2004.
accessed 10-August-2013].
[22]
K. Matsumura, D. Shirai, and A. HE, “A C language
“Visualizing programs with Jeliot 3,” Proc. Working
programming education support system based on
Conference on Advanced Visual Interfaces(AVI’04),
software visualization,” Pervasive Computing, pp.9–
pp.373–376, 2004.
14, Dec. 2009.
喜多義弘,片山徹郎,冨田重幸,“プログラム自動可視化
ツール avis を利用した結合テスト実施のための実行経路抽
” 情処学論,vol.51, no.9, pp.1859–1872,
出手法の提案,
Sept. 2010.
[10]
Free Software Foundation: GCC, the GNU Compiler
Collection, http://gcc.gnu.org/, [Online; accessed 10-
ing machine,” Proc. Canadian Electrical and Com-
[9]
M. Terada, “ETV: A program trace player for stu-
E. Eastmond, “The scratch programming language
tiers in Education Conference(FIE’03), vol.1, pp.22–
[8]
A. Virtanen, A.E. Lahtinen, H.-M. Jarvinen, “VIP, a
animations assist learning?: An empirical study and
object-oriented programming,” 33rd Annual Fron-
[7]
G. Rowe and G. Thorburn, “VINCE: an online tu-
pp.359–369, 1998.
[16]
no.4, pp.16:1–16:15, Nov. 2010.
[6]
community,
British Journal of Educational Technology, vol.31,
pp.61–66, CHI ’93, ACM, New York, NY, USA, 1993.
[5]
source
torial tool for teaching introductory programming,”
[2]
[4]
open
2013].
[15]
line accessed 24-April-2014].
パ ソ コ ン 甲 子 園 ,http://web-ext.u-aizu.ac.jp/pcconcours/, [Online accessed 24-April-2014].
[3] J. Stasko, A. Badre, and C. Lewis, “Do algorithm
Foundation
http://www.eclipse.org/, [Online; accessed 10-August-
munity Index for April 2015, http://www.tiobe.com/
index.php/content/paperinfo/tpci/index.html, [On-
International Business Machines Corporation: The
[23]
PROVIT(PROgram VIsualization Tool), http://provit.
u-aizu.ac.jp/home/ [Online; accessed 1-January-2015].
(平成 27 年 2 月 2 日受付,5 月 12 日再受付,
7 月 2 日早期公開)
J.H. Cross and D. Hendrix, “jGRASP: An integrated development environment with visualizations
for teaching java in CS1, CS2, and beyond,” 36th Annual, Frontiers in Education Conference, p.22, Oct.
2006.
[11]
Aiguo He (正員)
T. Rajala, M.-J. Laakso, E. Kaila, and T. Salakoski,
“VILLE - A language-independent program visual-
1988 年名古屋大学大学院電子工学研究
ization tool,” Seventh Baltic Sea Conference on Com-
科博士課程修了.株式会社アイヴィスなど
を経て 2001 年より会津大学.上級准教授.
工学博士.e-Learning,分散協調制御シス
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]
Debugger, http://www.gnu.org/software/gdb/, [Online; accessed 10-August-2013].
[13]
テム,ネットワーク,ソフトウェア工学の
研究に従事.IEEE CS, 電気学会,情報処
Free Software Foundation: GDB: The GNU Project
Microsoft Corporation:
1300
Microsoft Visual Studio,
理学会各会員.