Comments
Description
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 –