型を認識したメンバ名動的補完機能(下図参照)を実装した。既存のプログラムを利用し、仕様を限定することで、実用的な機能を正味1週間程度という短期間で実装することに成功した。本稿ではその実装について報告する。auto-completion)は、下図の様に、カーソル直前の文字列で始まる単語を編集中の文書から検索し、マッチするものをカーソル位置に挿入する機能である。sabbrev)と呼ぶ。いう静的補完機能がある。コマンドとして処理されるというマニアックなものである)動的/静的補完機能にはタイプ時間の短縮やタイプミス削減の効果があり、テキストエディタには無くてはならない機能のひとつである。単なる文字列マッチングを行うために、非メンバ名の文字列が補完候補に上がってしまう問題がある(下図参照)。適切なメンバ名(上図では“m_var”)だけを補完候補とするべきである。汎用テキストエディタでこのような機能を搭載しているものはほとんど存在しない。(2006年?〜、スクリーンショット)だけである。その型がクラス/構造体であれば、そのメンバ名情報を取得する必要がある。関数はオーバーロード可能なため、引数の型が全て判別できないと、式の型を決定できない場合がある(厳密にはC言語ではオーバーロードはできないが多くのC言語処理系がオーバーロードをサポートしている)。テンプレートまでちゃんとサポートしようとしたら膨大な量の工数を要するのは火を見るよりも明らかである。通常の構文解析はソースコードを最初から最後まで解析するが、本件ではカーソル位置のみの解析で充分であり、このような解析は不要であると同時に無駄に処理能力と処理時間を消費してしまうと予想される。よって、該当箇所のみを低負荷で解析できる、既存の構文解析器とは異なる構文解析方法を考え出す必要がある(と予想される)。(テキストエディタはインクルードディレクトリに関する情報を知らない場合が普通である)。ユーザから動的補完が要求された時点で関連ソースファイル群を構文解析するのでは応答性が悪すぎてストレスになると予想される。よって、あらかじめファイル群の構文解析を行い全ての型の情報を用意しておく必要があると考えられる。ソースファイルをいつどのように構文解析するかも重要な課題である。解析時に待たされるのは嫌なのでマルチスレッドで裏でこっそり解析して欲しいところである。効果的なタイミングでの、再解析が必要な差分箇所のみの再解析を実現したいところである。本件も、それほど容易な課題では無いように思われる。以下の方法で問題を解決した。式の全ての項の型を認識しようとすると難しいが、最初から欲張らずに目標を上手に絞れば難易度は格段に低くできる。ローカル変数、仮引数、クラスメンバ変数、グローバル変数の場合のみ処理対象とすることにした。シンボルとは「変数宣言があり名前がついている変数」のことである。型情報は変数宣言から容易に得ることができる。シンボル以外の場合としては(「型認識に関する課題」で述べた)関数の戻り値に->や.がついたfunc(x)->の形があり得るが、こちらは今回はサポート外として除外した。シンボルの型だけを認識するのであれば、処理は比較的簡単で高速である。教訓:困難なことはとりあえずやらない。明日できることを今日やるな。型のメンバ名情報取得まずは「解析のタイミング」についてだが、クラス/構造体のメンバ変数/関数宣言はそう頻繁に変更されるものではないので、編集のたびに情報を更新する必要はなく、文書保存時に構文解析すれば十分だと考えた。クラス/構造体とメンバ名の情報が含まれている。それを参照して型のメンバ名情報を取得することができる。ファイルの各行は各シンボルの情報を記述するレコードになっている。程度の規模であれば、今日のCPUでは負荷にはならないようだ。実行するのは面倒で、しばしば忘れがちだ。教訓:面倒でむずいことは他人に任せる。ファイルから検索し、型情報をゲット。少ない期間で実装できた。2009年1月から開発を開始し、実装期間が2〜3日、テスト/デバッグ期間が1.5週間程度。他プログラムの処理結果を利用し、仕様を上手く限定したことが要因。開発効率が向上した(と考えている)。具体的には、メンバ変数名/メンバ関数名が何だったか思い出す手間が減ったことが大きい。最初の実装としては満足のいく物だと考えている。ViViScriptで本機能を実装可能にする終わりに現状は実装を開始したばかり。以降で完璧なものに仕上げていく予定。それらの情報を利用したコード自動生成やリファクタリング機能なども順次実装していきたいと考えている。山口実靖准教授にやっていただいた。氏のおかげで箇条書きに毛の生えたような文章がすっかり格調高く正確で理解しやすいものになった。卒論指導でお疲れにもかかわらず、大変にありがたい。この場を借りて御礼申し上げる。