...

0.2MB - 高知工科大学

by user

on
Category: Documents
4

views

Report

Comments

Transcript

0.2MB - 高知工科大学
平成 27 年度
学士学位論文
プログラムの構造を短く指定することに
よるコード補完手法の提案
A code completion method by briefly specifying
the structure of a program
1160378
米田 裕司
指導教員
高田 喜朗
2016 年 2 月 24 日
高知工科大学 情報学群
要旨
プログラムの構造を短く指定することによるコード補完手法
の提案
米田 裕司
ソフトウェア開発の生産性を向上させる方法の一つとして, コーディングを効率化す
るためのコード補完がある. コード補完は, コードの不足部分を補完する技術である. こ
の技術はコードの入力やライブラリ参照の労力を減らすだけでなく, 構文エラーの元と
なるミスタイプを防ぐことができる. しかし, 統合開発環境やテキストエディタに組み込
まれているコード補完機能は主にトークン単位の単純なものを対象とし, コードの構造
を補完することができないという問題がある.
一方, HTML/CSS を編集するエディタの一部には ZenCoding という省略した記法で
コードを短く指定して展開するプラグインがある.
そこで本研究では, ZenCoding のコードを短く指定して展開する機能をプログラムに
応用し, プログラムに対しても構造を補完するシステムを構築した. 既存のコード補完機
能を備えたテキストエディタと, そのテキストエディタに提案手法を組み込んだものそ
れぞれの環境で, ソースコードを入力し打鍵数を比較した. その結果, 提案手法を組み込
むことで大幅に打鍵数を削減できることが分かった.
キーワード
コード補完, 統合開発環境, 構文解析
–i–
Abstract
A code completion method by briefly specifying
the structure of a program
Yuji YONEDA
Code completion improves efficiency of coding and productivity of software development. Code completion is a technique to complement a part of code based on already
typed code. The technique reduces the efforts of typing codes and searching for library
functions. Moreover, it prevents mistyping that causes syntax errors. However, the
function of code completion in integrated development environments (IDEs) and text
editors mainly targets at the completion of tokens and cannot complement the structure
of the code.
In contrast, some HTML/CSS editors have plug-ins that can generate a part of
code by briefly specifying the structure of the code in the notation called ZenCoding.
In this thesis, the function of ZenCoding for briefly specifying and generating the
strcture is applied to programs, and a system to complement the structure of a program is developed. We compare the number of keying for inputting source codes on a
text editor with proposed code completion to that on a text editor with existing code
completion. As a result, the number of keying is reduced by embedding the proposed
method.
key words
code completion, integrated development environment, parsing
– ii –
目次
第1章
はじめに
1
1.1
研究の背景と目的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2
対象とする言語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.3
論文の構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
背景技術
4
2.1
コード補完 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.2
ZenCoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.3
使用したソフトウェア・ライブラリ . . . . . . . . . . . . . . . . . . . .
7
第2章
第3章
2.3.1
Sublime Text2 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.3.2
PEG.js
7
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
提案システム
8
3.1
提案システムの概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
3.2
提案システム . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
3.2.1
エディタ部 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
3.2.2
コード変換部 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
第4章
実験
15
評価実験 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
第5章
考察
20
第6章
おわりに
21
まとめと今後の課題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
4.1
6.1
– iii –
目次
謝辞
22
参考文献
23
– iv –
図目次
1.1
プログラムにおいて同じ構文が繰り返す場合 . . . . . . . . . . . . . . . .
2
1.2
プログラムにおいて構文が何重にもネストする場合 . . . . . . . . . . . .
2
2.1
Eclipse によるメソッド補完前の様子 . . . . . . . . . . . . . . . . . . . .
5
2.2
Eclipse によるメソッド補完時の様子 . . . . . . . . . . . . . . . . . . . .
5
2.3
ZenCoding によるコード補完 . . . . . . . . . . . . . . . . . . . . . . . .
6
3.1
提案システムによるコード補完例 1 . . . . . . . . . . . . . . . . . . . . .
9
3.2
提案システムによるコード補完例 2 . . . . . . . . . . . . . . . . . . . . .
10
3.3
提案システム構成図
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3.4
構文解析に使用される文法を EBNF で表したもの . . . . . . . . . . . . .
14
4.1
既存手法の節約指数と節約率の散布図 . . . . . . . . . . . . . . . . . . . .
19
–v–
表目次
3.1
コマンドと展開されるコード片 . . . . . . . . . . . . . . . . . . . . . . .
13
4.1
実験対象のコードの問題問題名と解法 . . . . . . . . . . . . . . . . . . . .
16
4.2
各ソースコードに対する節約率 . . . . . . . . . . . . . . . . . . . . . . .
17
4.3
各ソースコードに対する既存手法の節約指数 . . . . . . . . . . . . . . . .
18
– vi –
第1章
はじめに
1.1
研究の背景と目的
近年, 情報化社会の発展に伴って情報技術の需要が高まり, ソフトウェアはありとあら
ゆる製品やサービス等に用いられているとともにソフトウェア開発の量が増加している.
それによってソフトウェア開発のコストが増大しており, ソフトウェア開発の生産性を
向上させることが求められている.
ソフトウェア開発全体においてコーディングの工程は一部であるが, この作業を避け
ては開発を進めることができない. また, 他の工程が良くてもコーディングの工程で間違
いがあれば他の工程の遅れを発生させることになる. そのため, コーディングを効率的に
行いつつ間違いを減らさなければならない.
開発の生産性を向上させる方法の一つとして, コーディングを効率化させるためのコー
ド補完がある. コード補完は途中まで記述されたコードの続きなどのコードの不足部分
を補完する機能である. このコード補完は多くのテキストエディタや統合開発環境など
に組み込まれている. この機能はコーディング時の入力やライブラリの参照の労力を軽
減させるだけでなく, 構文エラーの原因となるミスタイプも防ぐことができる.
統合開発環境やテキストエディタが提供するコード補完機能は主にトークン単位の単
純なものである. しかし, プログラムは同じトークンの繰り返しだけではなく, 制御構文
等の似た構造も出現する. その例として, 図 1.1 の様に同じ構文が繰り返したり, 図 1.2
のように構文が何重にもネストする場合がある. このような同じコードを何度も入力し
ないためにはプログラムの構造レベルで入力補完が行える必要がある.
–1–
1.1 研究の背景と目的
一方, HTML/CSS を効率的に編集する手段として, ZenCoding [1] というコードの構
造を短く指定して補完する機能がある.
そこで本研究ではそのコードを短く指定して補完する機能をプログラムに応用し, プ
ログラムに対しても構造を補完するシステム構築した. それが有効なコード補完方法で
あるのかどうかを評価する.
if (...) {
...
} else if (...) {
...
} else if (...) {
...
} else if (...) {
...
} else {
...
}
図 1.1 プログラムにおいて同じ構文が繰り返す場合
while (...) {
...
if (...) {
...
if (...) {
...
return ...;
}
}
}
図 1.2 プログラムにおいて構文が何重にもネストする場合
–2–
1.2 対象とする言語
1.2
対象とする言語
本研究では, プログラミング言語 Java を対象としてプログラムの構造を短く指定する
ことによるコード補完手法の研究を行う. Java を選択した理由は現在最も使われてい
る言語のひとつであり, 実験に使用するソースコードの入手が容易であるということと,
Java はオブジェクト指向言語かつプログラムを構造化して記述することが多いことから
構造を指定して補完するというシステムに適していると考えたからである.
1.3
論文の構成
本論文は, 本章を含めて6章で構成されている. 第1章では, 研究の背景と目的, 研究対
象の言語について述べる. 第2章では, 背景技術であるコード補完と ZenCoding の機能
と使用したソフトウェア・ライブラリについて述べる. 第3章では, 提案システムの概要
として大まかな動作を示し, システムの処理手順について述べる. 第4章では, 提案シス
テムが有効であるか評価実験を行い, その結果について述べる. 第5章では, 実験結果に
対しての考察について述べる. 第6章では, 研究のまとめと今後の課題について述べる.
–3–
第2章
背景技術
2.1
コード補完
コード補完とは開発者が途中まで記述したコードから不足部分を推測して, そのコー
ドを自動的に補完する機能のことである. この機能はコーディング時の入力やライブラ
リの参照の労力を減らすとともにエラーの原因となるミスタイプ等を防ぐことができ
る. 例えば, 統合開発環境 Eclipse[2] でプログラミング言語 Java を使った場合を考える.
図 2.1 の様な状況でクラス Foo 型のオブジェクト foo のメソッドを補完する際は 4 行目
の”foo.” を入力した後にショートカットキーなどを用いて入力補完を開始させる. その
時 Eclipse はオブジェクト foo の型情報やメンバのアクセス権限などからそのあとに入
力できるメンバを推測する. この場合オブジェクト foo の型は Foo で, クラス Foo のスー
パークラスは Object であることから, 現在のスコープからクラス Foo のアクセスできる
メンバとクラス Object のアクセスできるメンバの候補を図 2.2 の様に提示する. 開発者
はこの中から次に入力したいコードを選択することで補完が完了する. このようにコー
ド補完を用いることで入力の労力を軽減させ, 同時にそこから呼んではいけないメソッ
ドなどを記述するのを防ぎ, 単純なタイプミス等を防ぐことができる. また, それに加え
て, 開発者がそのオブジェクトから利用できるメンバを把握していない場合にメンバの
型情報や使い方を表示し, そのクラスへの理解を深める効果もある.
–4–
2.1 コード補完
図 2.1 Eclipse によるメソッド補完前の様子
図 2.2 Eclipse によるメソッド補完時の様子
–5–
2.2 ZenCoding
2.2
ZenCoding
ZenCoding とは, HTML/CSS を短く効率的に書くためのテキストエディタや統合開
発環境向けのプラグインである. 現在, Sublime Text, Atom, Eclipse 等の多くのテキス
トエディタや統合開発環境に対応している.
ZenCoding は HTML/CSS を短く書く機能が色々備わっているが, 1 つの大きな機能と
してコードの構造を短く記述し, それを元にコードを生成するというものがある. HTML
のコードの一部分を書く際を考える. まず, div タグがあってその id 属性は”aaaa” とし,
その中に class 属性として”bbbb” を持つ div タグと, id 属性として”cccc” を持つ ul タグ
があるとする. 次にその ul タグの中に li タグが 5 つあるというコードを補完したいとす
る. その場合 ZenCoding では”div#aaaa>div.bbbb+ul#cccc>li*5” と入力しテキストエ
ディタに補完を実行させれば, 図 2.3 のようなコードが生成される. なお, ZenCoding で
の ”#” , ”.” や ”>” などの記号は CSS のセレクタからきている. セレクタは HTML の
タグに対してスタイル適用する要素を指定するのに使われる. ”#” は id 名を付けた要素
を指定するのに用いられ, ”.” は class 名を付けた要素を指定するのに用いられ, ”>” は指
定の要素の階層の子要素を指定するのに用いられる. 例えば p タグの要素の子要素とし
て class 属性 dddd を持った div タグを指定したい場合は, ”p>div.dddd” と記述する.
< div id = " aaaa " >
< div class = " bbbb " > </ div >
< ul id = " cccc " >
< li > </ li >
< li > </ li >
< li > </ li >
< li > </ li >
< li > </ li >
</ ul >
</ div >
図 2.3 ZenCoding によるコード補完
–6–
2.3 使用したソフトウェア・ライブラリ
2.3
使用したソフトウェア・ライブラリ
本研究を行うにあたって, 次のソフトウェアとライブラリを利用した.
2.3.1
Sublime Text2
Sublime Text2 はクラスプラットフォームなソースコードエディタで, 現在 Mac OSX,
Windows, Linux 上で動作する. テキストエディタがプログラミング言語 Python による
Application Programmin Interface(API) を提供しており, これを用いて, このテキスト
エディタのプラグインを作成することで開発者自身でこのテキストエディタを拡張して
いくことができる.
本研究では, このテキストエディタの API を用いて提案システムを実装した.
2.3.2
PEG.js
PEG.js は形式文法である Parsing Expression Grammar(PEG)[4] で文法を定義可能な
JavaScript から利用できるパーサジェネレータである. PEG は少なくとも LL(k) 文法や
LR(k) 文法を表現できることと, 文脈自由文法と違い優先度の付いた選択を行うことが
できるため曖昧な文法が発生しないことと, 線形時間で構文解析を行えるアルゴリズム
が存在することなどからプログラミング言語や DSL の解析に向いている. そのため, 近
年はあらゆる言語を対象とした PEG を扱うコンパイラコンパイラが開発されている.
本研究では入力文字列を構文解析し, AST を生成する際に用いた.
–7–
第3章
提案システム
3.1
提案システムの概要
提案システムは, ZenCoding のコードの構造を記述し補完する機能をプログラムに応
用し複雑なコードの構造を補完する. このシステムはプログラミング言語 Java のソー
スコードを対象としたコード補完を行う. このシステムはテキストエディタ Sublime
Text2 のプラグインとして動きテキストエディタ上でコードの構造の省略形を入力し
補完を行う. 例えば, public クラスの中に main メソッドを作ってその中にインデック
ス変数 i を使って 0 から 99 までインクリメントしながら 100 回繰り返すループを設
置し, その中で if 文による 4 分岐するコードの骨組みを作りたいとする. その場合は
式;pcls>lpin[i,100]>if+2*elif+els を指定して補完を実行すれば, 図 3.1 の用にコード片を
生成することができる. また, 挿入されたコード片の穴埋めの部分である/*# ... #*/の
部分にはショートカットキー等を用いれば, そこにカーソルが移動してその文字列が選
択された状態になり文字列を挿入できる. 式中の pcls は public クラスを生成するコマン
ド, lpin[i,100] はインデクス変数 i を用いて 100 回繰り返すループを生成するコマンド,
if は if 文を生成するコマンド, elif は else if 文を生成するコマンドで els は else 文を生
成するコマンドである. 式の演算子は全て右結合で, 演算子 > は右の構文を左の構文の
子とし, 演算子 + は右の構文を左の構文と同じ階層に構文を連ねるものである. 演算子
∗ は指定回数分同じ階層に構文を重ねる. また, 括弧を使い演算子の結合順序を変える
事もできる. 括弧を使った例として, まず public クラスがありその中に一つの public メ
ソッドがある. その public メソッドの中に if 文, while 文による無限ループと return 文
–8–
3.1 提案システムの概要
が同じ階層にある. そして, 無限ループ内で if 文がありその中で無限ループを抜けるため
の break 文があるというコードを補完したい場合は”;pcls>pmtd>if+(ilp>if>brk)+rt” と
入力すれば, 図 3.2 の様にコード片が生成される. これは if 文を生成する if コマンドや
return 文を生成する rt コマンドよりも括弧内の式が先に評価されるためである.
このような構造を表す演算子と各構文等を表すコマンドを組み合わせて式を指定する
ことで直感的にコマンドの構造を補完することができる.
public class /*# name #*/ {
/*# fields #*/
public static void main ( String [] args ) throws IOException {
/*# stmts #*/
for ( int i = 0;
i < 100; i ++) {
/*# stmts #*/
if (/*# cond #*/) {
/*# stmts #*/
}
else if (/*# cond #*/) {
/*# stmts #*/
}
else if (/*# cond #*/) {
/*# stmts #*/
}
else {
/*# stmts #*/
}
}
}
}
図 3.1 提案システムによるコード補完例 1
–9–
3.2 提案システム
public class /*# name #*/ {
/*# fields #*/
public /*# type #*/ /*# name #*/(/*# arg #*/) {
/*# stmts #*/
if (/*# cond #*/) {
/*# stmts #*/
}
while ( true ) {
/*# stmts #*/
if (/*# cond #*/) {
/*# stmts #*/
break ;
}
}
return /*# ret expr #*/;
}
}
図 3.2 提案システムによるコード補完例 2
3.2
提案システム
提案システムは, プラグインによるエディタを制御するエディタ部のプログラムと,
コードの構造を指定する式である構造指定式を構文解析し, コード片へ変換するコード
変換部のプログラムからなる. 提案システムを図にすると 3.3 の様になる. エディタ部の
プログラムは Sublime Text2 のプラグインとして Python プログラムとして組まれてい
る. コード変換部のプログラムは Node.js 上で動作する JavaScript プログラムとして実
現している. 各部分の処理について述べる.
3.2.1
エディタ部
エディタから補完をショートカットキー等で実行されたらカーソルの位置から先頭の
方向へ 1 文字ずつたどりつつ, 文字”;” に突き当たるまで文字を取得し, その文字を全て
– 10 –
3.2 提案システム
ᥦ᱌ᡭἲ䝅䝇䝔䝮
㻿㼡㼎㼘㼕㼙㼑㻌㼀㼑㼤㼠㻞
䝁䞊䝗ኚ᥮㒊
䜶䝕䜱䝍㒊
䝔䜻䝇䝖
䜶䝸䜰
䜹䞊䝋䝹఩⨨
䜻䞊ධຊ
䠄䝔䜻䝇䝖
䜶䝸䜰䛾ไᚚ䠅
;whl>if
ᵓ㐀ᣦᐃᘧ
ᵓᩥタᐃ䝣䜯䜲䝹 㻗
㻭㻿㼀⏕ᡂฎ⌮
ᢳ㇟ᵓᩥᮌ
㻭㻿㼀ホ౯ฎ⌮
䝁䞊䝗∦
䝔䜻䝇䝖䜶䝸䜰
䛾᧯స
while ( ) {
if () {
䞉䞉䞉
図 3.3 提案システム構成図
文字列として連結する. 連結してできた文字列をコード変換部へ送り, 帰ってきた文字列
をカーソルの位置へ挿入する.
エディタからショートカットキー等で/*# ... #*/となっている穴埋め部分へのカーソ
ルの移動が実行されたら, カーソル位置から最後の方向へ正規表現”/\*# .*? #\*/” で
検索しもっとも近い部分にカーソルを移動させ, その部分へ移動する. この正規表現で
の”\*” は正規表現の演算子ではなく文字”*” そのものを表し, ”.” は任意の 1 文字を表
し, *?は演算子”*” が最小マッチを行うものとする.
– 11 –
3.2 提案システム
3.2.2
コード変換部
コード変換部はエディタ部から渡された構造指定式を構文設定ファイルによって AST
に変換し, それを再帰的に評価して挿入するコードを生成している. AST を生成する際
の構文解析は PEG.js という JavaScript のライブラリを用いている.
構造指定式は図 3.4 の EBNF によって表現された文脈自由文法に従って構文解析さ
れ AST に変換される. まず, 構文を指定するコマンド間の構造のつながりを表す非終
端記号 connection から構文解析を始める. 非終端記号 connection を構成する規則は非
終端記号 command を演算子”>” と演算子”+” を使って全て右結合で連結する規則で
ある. 演算子”>’ は演算子の左のコマンドに子として右のコマンドを連結させるもの
で, 演算子”+” は演算子の左のコマンドと同じ階層に右のコマンドを連結させるもの
である. 次に, 非終端記号 command を構成する規則は, 括弧によって演算子の優先順
位を変えるものと, コマンドを整数回繰り返させるものと設定されたコマンドを表す
非終端記号 additionalCommand からなりたつ. 非終端記号 additonalCommand はコマ
ンド単体を表すもので, ”if” や”whl” 等がある. この文法に従って AST に変換した後
は, AST を再帰的に評価していきコード片へ変換をする. AST を再帰で辿っていき,
additionalCommand の要素を発見したら表 3.1 の対応表に従いコードを生成する. コマ
ンドの内”[ ]” がついているものは引数付きのコマンドで, その中のカンマで区切られた
引数部分に文字列や整数値を入力するとコマンドを展開したときに, その引数名と対応
する”%%” 二つで囲まれた場所に引数に与えた値が入る. 例えば, ”;lpin[index,1000]” と
指定してコード片を生成すると”for (int index = 0; index < 1024; index++) {/*# stmts
#*/}” の様になる. AST を全て巡回して得られたコード片をエディタ部へ渡してコード
変換部の処理は終わる.
– 12 –
3.2 提案システム
表 3.1 コマンドと展開されるコード片
コマンド
展開されるコード片
lpin[indexVer,times]
for (int %%indexVar%% = 0; %%indexVar%% < %%times%%; %%indexVar%%++) {/*# stmts #*/}
lpn[times]
for (int i = 0; i < %%times%%; i++) {/*# stmts #*/}
lpi[indexVer]
for (int %%indexVar%% = 0; %%indexVar%% < /*# times #*/; %%indexVar%%++) {/*# stmts #*/}
fr
for (/*# expr #*/) {/*# stmts #*/}
psmtd
public static /*# type #*/ /*# name #*/(/*# arg #*/) {/*# stmts #*/}
pmtd
public /*# type #*/ /*# name #*/(/*# arg #*/) {/*# stmts #*/}
rmtd
private /*# type #*/ /*# name #*/(/*# arg #*/) {/*# stmts #*/}
mtd
/*# type #*/ /*# name #*/(/*# arg #*/) {/*# stmts #*/}
main
public static void main(String[] args) throws IOException {/*# stmts #*/}
ilp
while (true) {/*# stmts #*/}
if
if (/*# cond #*/) {/*# stmts #*/}
sw
switch (/*# expr #*/) {}
cs
case /*# expr #*/:/*# stmts #*/ break;
whl
while (/*# cond #*/) {/*# stmts #*/}
for
for (/*# init expr #*/; /*# cond #*/; /*# step expr #*/) {/*# stmts #*/}
els
else {/*# stmts #*/}
elif
else if (/*# cond #*/) {/*# stmts #*/}
icst
if (%%obj%% instanceof %%type%%) {%%type%% /*# var #*/ = (%%type%%) %%obj%%;/*# stmts #*/}
try
try {/*# stmts #*/}
cat
catch (/*# arg #*/) {/*# stmts #*/}
fin
finally {/*# stmts #*/}
rt
return /*# ret expr #*/;
cnt
continue;
brk
break;
pcls
public class /*# name #*/ {/*# fields #*/}
cls
class /*# name #*/ {/*# fields #*/}
clse
class /*# name #*/ extend /*# name #*/ {/*# fields #*/}
clsi
class /*# name #*/ implements /*# name #*/ {/*# fields #*/}
clsei
class /*# name #*/ Extend /*# name #*/ implements /*# name #*/ {/*# fields #*/}
syso
System.out.println(/*# obj #*/);
impx[pack]
import %%pack%%./*# class #*/;
imp
import /*# class #*/;
v
/*# type #*/ /*# name #*/;
vi
/*# type #*/ /*# name #*/ = /*# init #*/;
– 13 –
3.2 提案システム
start = connection
connection
= command , " >" , connection
| command , "+" , connection
| command ;
command
= "(" , connection , ")"
| times
, "*"
, command
| a d d i t i o n a l C om ma n d ;
times = INT ;
a d d i t i o n a l C o m m an d = " if " | " els " | " whl " | " for " | " sw " | ....
INT = DIGIT_EX_ZERO , { DIGIT };
DIGIT = "0" | DIGIT_EX_ZERO ;
DIGIT_EX_ZERO = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
図 3.4 構文解析に使用される文法を EBNF で表したもの
– 14 –
第4章
実験
4.1
評価実験
提案手法によって効率的にコーディングできるかどうかについて評価するために, 打
鍵数がどれだけ削減できたか測定する実験を行う. 既存のコード補完機能を備えたテキ
ストエディタ Sublime Text2 とそのテキストエディタに提案手法を組み込んだものそれ
ぞれの環境で, ソースコードを誤りなく入力した場合の打鍵数をキー入力監視ツールに
よって測定する. 打鍵数は, 入力文字数ではなく, キーボードのキーを押した回数とする.
評価基準が入力文字数ではないのは例えば, Ctrl キーと C キーを順に打鍵する際, 打鍵
数による評価だと作業量が 2 と計測されるのに対して文字入力数による評価だと計測上
作業量 1 であるという問題点があるからである. 打鍵数は提案システムを評価する上で
入力文字数による評価よりも妥当な基準だと考えられる.
1つのソースコードに対する既存の環境での打鍵数を nKeybase , その環境に提案シス
テムを導入した場合の打鍵数 nKeyprop として, 提案手法の打鍵数の節約率を
1 − nKeyprop /nKeybase
と定義する. 入力するソースコードとして, AIZU ONLINE JUDGE(AOJ)[3] の問題番
号 2000, 2001, 2002, 2003, 2100, 2101, 2102, 2103, 2014, 2015 番の解答のソースコード
を使用した. これらのコードの各問題の問題名と解法を表 4.1 に示す. 実験の結果は表
4.2 の様になった. 節約率の平均は約 19%で, 中央値は約 17%となった.
– 15 –
4.1 評価実験
表 4.1 実験対象のコードの問題問題名と解法
問題番号
問題名
解法
2000
Mysterious Gems
シミュレーション
2001
Amida, the City of Miracle
シミュレーション
2002
X-Ray Screening System
全探索+枝刈り
2003
Railroad Conflict
幾何学
2100
Saizo
問題文通り
2101
Perfect Number
問題文通り
2102
Rummy
全探索
2103
Battle Town
シミュレーション
2104
Country Road
貪欲法
2105
Rhythm Machine
全探索
– 16 –
4.1 評価実験
表 4.2 各ソースコードに対する節約率
打鍵数
問題番号
節約率
既存補完
提案手法
2000
1518
1371
10%
2001
845
706
16%
2002
1581
1312
17%
2003
3402
2831
17%
2100
679
517
24%
2101
588
437
26%
2102
1137
843
26%
2103
1345
1184
12%
2104
492
335
32%
2105
1282
1184
8%
次 に, 各 ソ ー ス コ ー ド の 文 字 数 を nChar と し, 既 存 手 法 の 節 約 指 数 を 1 −
nKeybase /nChar と定義する. この節約指数は, おおよそ元のソースコードに対しての
既存補完方法の打鍵数節約率の割合となり, 計算すると表 4.3 の様になる.
– 17 –
4.1 評価実験
表 4.3 各ソースコードに対する既存手法の節約指数
問題番号
既存補完の
既存補完の
打鍵数
節約指数
文字数
2000
2013
1518
25%
2001
1416
845
40%
2002
2828
1581
44%
2003
4760
3402
29%
2100
764
679
11%
2101
833
588
29%
2102
2105
1137
46%
2103
1924
1345
30%
2104
629
492
22%
2105
1954
1282
34%
各ソースコードに対する節約率と既存補完の節約指数の関係を散布図に表すと図 4.1
のようになり, 殆ど相関関係がないことが分かった.
– 18 –
4.1 評価実験
ઇ༁ི
‫ع‬ଚघ๑͹ઇ༁ࢨ਼
図 4.1 既存手法の節約指数と節約率の散布図
– 19 –
第5章
考察
実験の結果, 既存の入力補完に加えて提案システムを組み込むと節約率が平均で約
19%となり大幅な打鍵数の削減が行えた. また, 各ソースコードに対する節約率と既存補
完の間に相関関係が認められないという結果から, 既存の補完手法で補完できる部分と
別の部分の補完ができていると思われる. そのため, 提案手法の補完できる構造を増やせ
ば節約率が上がりやすいと考えられる.
今回行った実験では打鍵数の削減ができたことから, 少なくともこれから入力するプ
ログラムの構造が分かっている場合にこの提案手法を使うとコーディングを効率できる
ことが分かった. プログラムの構造が分かっている場合とは, 他言語のコードを移植する
場合や設計時に処理の詳細が細かく決まっている場合などが挙げられる. また, すべての
コーディングの場面で本当に実用性があるかどうかの検討はまだできていない. 提案手
法が実用的かどうかは次の方法で評価できると考えられる. まず, 被験者に書いてもらう
課題のプログラムの仕様を用意する. 被験者に既存のコード補完と提案手法のコード補
完について一定時間の学習を行ってもらった後に, 課題のプログラムを作成し入力して
もらい, キー入力監視ツールを使い入力したキーを記録するとともに, 課題を解くのにか
かった時間を記録する. そこから得られた, 入力キーから課題にかけた打鍵数やミスタイ
プ数などから提案手法で効率的にコーディングが行えるかどうか検証することで, 実用
性を評価できると考えられる.
– 20 –
第6章
おわりに
6.1
まとめと今後の課題
本研究では, HTML/CSS に使われている ZenCoding のコードの構造を短く指定して
記述する記法をプログラムに応用し, プログラムに対しても構造を補完するシステムを
構築した. その結果, 打鍵数を大幅に削減することに成功した. 本研究では Java のソー
スコードだけを対象にシステムを構築したが, ほかのプログラミング言語でも同様なシ
ステムは構築できると思われる. 今後の課題として, 他の言語に対応させた場合にどの程
度本システムが有効なのか, プログラミング言語の特性によって効果がどの程度変化す
るのか検証していきたい.
– 21 –
謝辞
本研究を行うにあたって, 指導教員として多くのご指導を頂いた高知工科大学情報
学群, 高田喜朗准教授に深い感謝の意を表します. また, 副査を引き受けていただいた高
知工科大学情報学群, 松崎公紀准教授と鵜川始陽准教授に心より感謝します. 本研究を進
めるにあたって, 様々なアドバイスを頂きました高田研究室の皆様, 同期として共に励ま
しあった五十嵐達郎氏, 髙岡翔大氏, 中西拓也氏に感謝致します. 最後に, 日ごろよりご支
援いただきました関係者の皆様に心より御礼申し上げます.
– 22 –
参考文献
[1] “Zen Coding - a new wayof writing HTML and CSS code,” https://code.google.com/archive/p/zen-coding/.
[2] “Eclipse - The Eclipse Foundation open source community website.,” https://eclipse.org/.
[3] “AIZU ONLINE JUDGE: Programming Challenge,” http://judge.u-aizu.ac.jp/.
[4] Bryan Ford, “Parsing Expression Grammars: A Recognition-Based Syntactic Foundation”
– 23 –
Fly UP