学習意図に合わせたコーディング校正ツールの提案
2010SE222

高桑浩行

2010SE225

高島豪人

2010SE229

竹腰達徳

指導教員：蜂巣吉成

1

はじめにことで新しい学習意図に対応することもできる．
なお，本研究で提案するツールは，プログラミング演習

学習者が演習などでプログラムを記述する際には，学習で学習者がプログラムを作成して，テストを行った後で，意図を満たし，プログラミング作法に適したコードを書く

プログラムが学習意図に合っているかを確認するために使ことを意識する必要がある．現在，大学等でプログラミン用されることを想定している，したがって，コンパイルにグを学習する際には，与えられた課題に対してその課題を成功し，実行結果が正しいプログラムのみを対象とし，既満たすプログラムを作成していく形式となっていること

存のコーディングチェッカと本研究で提案する校正ルールが一般的である．実行例と結果が同じであれば良いと考えを併用することを前提とする．て，課題を提出している学習者も存在しており，学習意図やプログラミング作法に適したコードを書こうという意識

コーディングチェッカや学習者向きのフィードバックを持っている学生ばかりだとは言えない．
プログラミング作法に適したコードを記述しているか関連研究2を行うツールはいくつか提案されている．CX-Checker[1]を調べるにはコーディングチェッカを用いる方法がある． は，C 言語プログラムを解析してコーディング規約を満たコーディングチェッカにより一般的なコーディング規約に しているかをチェックするコーディングチェッカである．
反した記述をしていないかを学習者に通知することがで

MISRA-C[2] のコーディング規約をチェックでき，XPathきる．一方で，プログラミング言語の文法などを学ぶ課題などを用いてルールのカスタマイズもできる．

に対して，課題の学習意図に合った記述をしているかは汎

C-Helper[3] は，C 言語初学者向けの静的解析ツールで用的なコーディングチェッカで調べることは難しい．例えある．インデントがされてない，関数定義にセミコロンがば，繰り返しを使った 2 次元配列の走査という学習意図に付いているといった初学者が陥りやすいミスを発見して指対し，行列を 2 次元配列を使って表現した課題を考える． 摘し，可能なら解決策を提案する．
proGrep[4] では学習履歴を収集し，その収集された情報
行列の入出力や和の計算の課題では，2 重の繰り返しで配列を処理しているかを判定すればよいが，行列の積の課題から，学習者の特徴的な行動を抽出して，学習者の出来をでは 3 重の繰り返しで 2 次元配列を処理しているかを調べ判断したり，セミコロンがない，関数の返り値がないなどなければならない．つまり，課題によって学習意図に適しのアドバイスを与えたりできる．ているかの判定基準が異なる場合があり，汎用的なツール

C-Helper，proGrep は，学習者向けのコーディング規約でチェックするのは難しい．ルールのカスタマイズ可能ななどを用い指摘を行うツールなので汎用性が高いが，問題コーディングチェッカを用いて，課題毎にルールを記述す毎の学習意図を考慮した指摘などを行うことを目的としてることも考えられるが，手間がかかり問題作成者の負担がおらず，学習意図に対応したフィードバックを行うことは大きい．

できない．

本研究では，プログラミング演習の課題では一般に問題

CX-Checker はルールのカスタマイズによって学習意図作成者が模範解答プログラムを作成することに着目し，模のチェックもできるが，問題ごとにルールを作ることが必範解答プログラムから学習意図にあったルール (以下，校要であり，手間がかかる．

正ルールと呼ぶ) を作成して，学習者のプログラムをチェッ

3

学習意図に合わせたコーディング校正ルール

3.1

学習意図に合わせたルールの必要性クして指摘する方法を提案する．学習意図とは，問題作成者が学習して欲しいと思う内容であり，文法や典型的な記述を学ぶために必要なものである．本研究ではコーディン

コーディングチェッカとはあらかじめ定められたコー

グ校正とはプログラミング演習において学習意図に合わなディング規約や誤った記述のパターンに基づいてプログい記述を改善することと定義する．模範解答プログラムかラムをチェックし, コーディング規約に違反したところやら校正ルールを作成するためのルールを学習意図ルールと誤った記述のパターンに該当した箇所を指摘するツールでし，学習意図ルールを模範解答プログラムに適用することある．コーディング規約や誤った記述のパターンはどのよで，校正ルールを生成する．過去のプログラミング演習課

うなプログラムにも適用できる汎用的なものが多く，明ら題を調べ，特徴的な学習意図を抽出し，それらを学習意図かに間違っている箇所を指摘したり，推奨しない書き方をルールとした．学習意図ルールと模範解答プログラムから直すためのものであることが多い．この仕組みやツールは校正ルールを生成するツールを試作し，学習者が記述した

初学習者が学習で用いる際にも一定の効果があり，明らか解答プログラムのチェックが行えることを確認した．問題に間違った点やふさわしくない記述を指摘することがで作成者が新しい学習意図ルールをパターンとして記述する

きる．

プログラミング演習における演習問題にはそれぞれ学習答プログラムから学習意図を反映したルールを作成して,意図があり，学習意図に適した記述をすることによって， 学習者のプログラムをチェックして指摘する方法を提案す
文法や典型的な記述例を学ぶためのものである．一般的なる．このルールを校正ルールと呼ぶ．一般に，模範解答プコーディング規約には違反していない記述でも学習意図をログラムは課題の難易度や学習に適しているかを確認した

満たしていない記述は演習問題の解答としては望ましくり，実行例の表示などのために作成され，出題者が想定しない場合がある．これらに対しても不適切な記述であるとた学習意図を反映したプログラムである．模範解答を用い指摘することで，演習における学習効果を上げることがでることで指導者の負担を軽減できると考えた．

きる．

模範解答の制御構造などをそのまま抽出して校正ルール

例えば，2 整数の大きい値を返す関数 max2 を用いて，3とすると，模範解答とほとんど同じプログラム以外は不適整数の最大値を関数 max3 を作成する演習問題では，例 1切としてチェックされる．例えば，関数 max3 の問題におのように 1 回だけ呼び出しても実行結果としては問題ない

いて模範解答が例 2 の場合，max2 の合成関数として校正が，この問題には「関数を作成して適切に呼び出す」といルールを作成すると，例 3 は不適切となり，ルールとしてう学習意図があるので，例 2 や例 3 のように 2 回呼び出すは厳しい．例 3 でも，関数を適切に呼び出すという意図にことが望ましい．

は合うので，これを考慮して校正ルールを作成する必要が(例 1)
123456789101112131415ある．この場合は，関数 max3 内では max2 を 2 回呼び出

int max2( int x, int y ){if( x > y ){return x;}else{
return y;

すという校正ルールが考えられる．

}

欲しいプログラムの特徴的な記述などを表現したものであ}int max3( int x , int y , int z ){int max;
max = max2(x,y);if( max < z ){max = z;}}return max;

(例 2)
12
3

int max3( int x , int y , int z ){return max2( max2( x , y ) , z );

}

(例 3)
123
4
56

int max3(int x, int y, int z){
int m2, m3;
m2 = max2(x, y);m3 = max2(m2, z);return m3;}

本研究では，模範解答プログラムから校正ルールを作成するためのルールを用いることとする．このルールを学習意図ルールと呼ぶ．学習意図ルールは，学習者に学習してる．学習意図ルールを模範解答プログラムに適用して，その問題に合った校正ルールを作成する．

3.3

学習意図ルールの特徴

学習意図ルールを表現するために，過去のプログラミン
グ演習の課題を調べ，その特徴を次のように整理した．

(a) 制御構造を用いた典型的な処理の理解(b) 演算子の理解(c) 関数の適切な利用方法の理解(a) は，繰り返しによる典型的な配列走査などが挙げられる．一般に，1 次元配列は 1 つのループ，2 次元配列は2 重ループで配列の各要素を参照することができる．しかし，2 次元配列による行列のかけ算の場合には，2 次元配列を 3 重ループで処理をすることが望ましい．
学習意図ルールとしては，制御構造と配列参照を記述し汎用的なコーディングチェッカでは max3 で max2 を何たパターンを表現して，模範解答プログラムがこのパター回呼び出すべきなのかの判断ができないので，例 1 の記ンに適合したら，学習者のプログラムにも同じ構造がある述を不適切な記述としてチェックすることは難しい．あるかをチェックする校正ルールを作成するルールとして表現問題では学習意図を満たした記述でも別のある問題では学する．

習意図を満たしていない記述になることもある．例えば，学習意図は制御構造に反映されることが多いと考える

max2 を利用して 4 整数の最大値を求める関数 max4 では，max2 を 3 回呼び出すことが適切な記述になり，max3と max4 では max2 の適切な呼び出し回数が異なる．学習

ので学習意図ルールには制御構造の骨格を記述する．記述することができるのは制御文の if 文，while 文，for 文，
do-while 文，switch 文である．対応した理由は過去の演意図を考慮したチェックを行うには，問題毎に学習意図を習問題の調査により，これらの制御文が学習意図になって反映したルールを作成する必要があるが，問題に合わせていることが多いからである．条件式に関わらず校正する校出題者がルールを作成するのは負担が大きい．

正ルールを生成するので，学習意図ルールを記述する際には，条件式の中には何も書かない．

3.2

校正ルールと学習意図ルール

学習意図ルールでは{ }を記述することによって入れ子本研究では，プログラミング演習の課題では一般に出題構造を表現し，入れ子構造が異なるプログラムを区別する者が模範解答プログラムを作成することに着目し，模範解ことができる．以下が入れ子構造が異なるプログラムの例

(c) は 3.1 で挙げた関数を作成して適切に呼び出す処理である．プログラムによって呼び出す関数名や回数が異なるので，(a)(b) のようなパターンとして記述することは難しい．
学習意図ルールとしては，模範解答のプログラムで作成されている関数 (main 関数を除く) とその中で呼び出されである．配列を次元に応じて [ ]，[ ][ ]，[ ][ ][ ] という形式で記述することもできる．学習意図ルールの記述方法を拡張 BNF を用いて示す．ている関数名と回数を抽出し，学習者のプログラムでも同様に呼出されているかをチェックする校正ルールを作成するルールとして表現する．関数呼び出しが適切かをより厳密にチェックするは関数の返り値や実引数などのデータフ
ロー関係を調べることも考えられる．しかし，本研究では実行結果が正しい学習者のプログラムを対象としているので，データフロー関係は考慮せずに，呼出し回数でチェック行う．なお，呼び出されている関数には scanf 関数やprintf 関数などの入出力関数は含めないこととする．これは，同じ結果を出力する printf 関数の呼出しは複数通り考えられ，必ずしも模範解答通りにする必要はないからである．

以下が学習意図ルールの記述の例である．
下記は 3 重ループ文で 2 次元配列の処理を行っている例である．
12345674

校正ツールの設計と実現

4.1

概要

本研究では従来のツールでは対応できない各問題の学習意図に応じた細かい指摘をすることができるコーディング

for ( ){
for( ){for ( ){}}}[ ][ ]

校正ツールを提案し，既存のコーディングチェッカと本研究で提案する校正ツールを併用することでより学習に適した校正支援を行う．ツールの全体像を図 1 に示す．
校正ルール生成ツールに模範解答となるコードと学習意図ルールを入力し，コードを解析する．字句解析されたコードが学習意図ルールのパターンに適合した場合，校正

下記は 1 次元配列の最大値を求める処理の例である．
123456=[]for ( ){
if ([ ]){[]}}

ルールとして生成する．コーディング校正ツールに学習者のコードを入力し，解析する．そして校正ルールを満たしているか確認し，指摘箇所を表示する．
本研究では，実行結果が正しく出力されるプログラムに対して校正ルールを生成，確認することが前提なので，データフロー解析を行わなくても，制御文や構造等を確認(b) は剰余演算子 % を用いた処理などが挙げられる．例えば，文字を n 文字ずらすシーザー暗号の計算などに剰余演することにより，校正ルールを生成，確認ができると考え算を利用できる．

利用した．

1

たので，本研究では，字句解析が可能である TEBA[5] をn = n % 26

しかし，学習者によっては % を用いずに余りを求める処理を記述する場合がある．
1
2
3while (n>= 26){n −= 26;}

この記述の実行結果は正しいが，簡潔な処理を学んで欲図 1 ツールの全体像

しい．学習意図ルールとしては，特定の字句をパターンとして表現して，模範解答プログラムがこのパターンに適合した場合に，学習者のプログラムにも同じ構造があるかをチェックする校正ルールを作成するルールとして表現する．

4.2

模範解答からの校正ルールの生成方法

模範解答のコードに 3.3 の (a)(b) の学習意図ルールから校正ルールを生成する方法は，模範解答のコードに TEBA

を利用し，字句解析を行い，3.3 の (a)(b) の学習意図ルーているが，カウンタ変数の初期値や終了条件もチェックす

ルと同じ構造の場合，校正ルールとして生成する．3.3 のることで，典型的な配列走査を記述しているかを判定する(c) の学習意図ルールから校正ルールを生成する方法は， ことができると考える．例えば下記 1，2，3 はどれも同じ
模範解答のコードを TEBA で字句解析を行い，関数呼び 実行結果となるが，1 の記述が望ましい．
出しのパターンの数を調べ，校正ルールとして生成する． 1. for (i=0; i<size; i++)a[i]4.3 校正ルールによる学習者のコードの確認方法
2. for (i=0; i<=size-1; i++)
学習者のコードが 3.3 の (a)(b) の校正ルールの確認方
a[i]法は，学習者のコードを TEBA を利用し，字句解析を行 3. for (i=1; i<=size; i++)い，3.3 の (a)(b) の生成した校正ルールと同じ構造の場合，a[i-1]校正ルールを満たしたと確認する．3.3 の (c) の校正ルー
また，3.3 の (c) は関数呼び出しのパターンの数から校正
ルの確認方法は， 学習者のコードを TEBA を利用し，字 ルールを生成しており，呼び出す関数の順番は考慮してい句解析を行い，関数呼び出しのパターンの数を調べ，生成ない．これは前提として実行結果が正しく出力されるプロ

した校正ルールと関数呼び出しのパターンの数が同数の場

グラムが対象であり，関数呼び出しの数が模範解答と同数合，校正ルールを満たしたと確認する．

ならば，正しくプログラムが書けていると判断したからで実現と検証

4.4ある．呼び出す関数の順番を考慮して校正ルールを生成するには，データフローを含む校正ルールにする必要がある．

校正ルール生成ツールとコーディング校正ツールを実装

本研究では，出題者に学習意図ルールを記述で作成してし，校正ルール生成ツールによって 3.3 で挙げた学習意図もらうことにより，学習意図ルールの数を増やしていくこルールと模範解答を用いて校正ルールが生成されることをとができ，学習意図ルールを繰り返し利用できる．

確認した．その校正ルールを用いてコーディング校正ツールによって演習者のコードがチェックされることを確認した．校正ルール生成ツールは C 言語で約 120 行，コーディング校正ツールは C 言語で約 120 行である．

5

本研究では，学習者に問題毎の学習意図を満たしてもらうことを目的に，模範解答から校正ルールを自動生成し，フィードバックを行うツールを提案し，試作した．今後の提案した校正ツールは，模範解答プログラムの学習意図の記述に合わない記述を校正箇所として提示するが，意図に合わないプログラム (アンチプログラムと呼ぶ) を出題者が作成して，その記述に合った学習者の記述を校正箇所として提示する方法もある．学習意図に合わない記述をアンチ学習意図ルールとして表し，アンチプログラムに適用して，校正ルールを生成する．出題者にはアンチプログラ
ムを作成する手間が増えるが，典型的な好ましくない記述があらかじめわかっている場合は，その記述を直接指摘することができる．(例 4) は成績評価を行うアンチプログラ
ムの例である．else if の条件式が (score >= 70 && score< 80) となっているが，(score >= 70) とでも同じ実行結果が出るので，アンチプログラムは不必要な条件を書いている．この記述を学習意図ルールにすることにより，演習者が同様な記述をしたときに，指摘することができる．

1
2
3
4
5
6
78

おわりに学習者のコードが校正ルールを満たしているかを確認し，考察

(例 4)

6

成績評価を行うアンチプログラムの例

if( score >= 80 && score <= 100)printf("A\n");else if( score >= 70 && score < 80)
printf("B\n");else if( score >= 60 && score < 70)
printf("C\n");else if( score >= 0 && score < 60)
printf("F\n");配列の繰り返しの学習意図について，今回試作したツールは繰り返しの中で配列を参照しているかのみをチェックし課題としては，学習意図ルールの追加をしていくことが挙げられる．

参考文献[1] 大須賀俊憲，小林隆志，et al.：“CX-Checker：柔軟なカスタマイズが可能な C 言語コーディングルール
チェッカー”, 情報処理学会論文誌， Vol. 53， No. 2，pp. 590-600， 2012.
[2] Motor Industry Software Reliability Association：“MISRA C3: Guidelines for the Use of the C Language in Critical Systems 2012”, Nuneaton, UK:
MIRA, 2012. ISBN 978-1-906400-10-1.
[3] 内田公太，権藤克彦：“C-Helper:C 言語初学習者向け静的解析ツールの提案”, ソフトウェア工学の基礎
XIX 日本ソフトウェア科学会 FOSE2012，近代科学社， pp. 231-232， 2012.
[4] 長 慎也，筧 捷彦：“proGrep-プログラミング学習履歴検索システム”, 情報処理学会研究報告．コンピュータと教育研究会報告，vol. 2005，NO. 15，pp. 29-36，
2005．
[5] 吉田敦，蜂巣吉成，et al.：“属性付き字句系列に基づくソースコード書き換え支援環境”, 情報処理学会論文誌， vol. 53， No. 7， pp. 1832-1849， 2012.