プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案

Slides:



Advertisements
Similar presentations
プラグイン作成講座 Control System Studio 3.0 Takashi Nakamoto
Advertisements

内部ドメイン専用言語支援のため の 型に連動した字句・構文ルールの 変更機構 理学部 情報科学科 千葉研究室 07_02363 市川 和央 指導教員 千葉 滋 教授 1.
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也. 講義計画(あくまで予定) 第 1 回 プログラミング言語の種類と歴史 第 2 回 eclipse の基本操作 第 3 回 eclipse のデバッグ機能 第 4 回 構造化プログラミングの復習 第 5 回 演習 第 6 回 構造化指向からオブジェクト指向へ.
Web アプリをユーザー毎に カスタマイズ可能にする AOP フレームワーク
シーケンス図の生成のための実行履歴圧縮手法
Javaのための暗黙的に型定義される構造体
侵入検知システムの構築と ログの可読性向上
情報伝播によるオブジェクト指向プログラム理解支援の提案
AspectScope によるアスペクトとクラスのつながりの視覚化
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
同期的にアドバイスを活性化できる分散動的アスペクト指向システム
ユーザ毎にカスタマイズ可能な Web アプリケーション用のフレームワークの実装
アスペクト指向プログラミングを用いたIDSオフロード
Java ソフトウェア部品検索システム SPARS-J のための リポジトリ自動更新機能の実現
コーディングにおける 細粒度作業履歴を用いた 手戻り支援ツールの検討
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
遠隔ポイントカット - 分散アスペクト指向プログラミング のための言語機構
概要 Boxed Economy Simulation Platform(BESP)とその基本構造 BESPの設計・実装におけるポイント!
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
暗黙的に型付けされる構造体の Java言語への導入
関心事ごとに視点を切り替えて プログラムを編集できる 統合開発環境の提案と実装
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
統合開発環境のための アスペクト指向システム
シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
横断的関心事に対応したオブジェクト指向言語GluonJとその織り込み関係の可視化ツール
豊富な情報を基にした pointcut を記述できるアスペクト指向言語
ソースコード縮退による ソースコード理解 神谷年洋 科学技術振興事業団 さきがけ研究21 オブジェクト指向シンポジウム2003.
アスペクト指向言語のための 独立性の高いパッケージシステム
バイトコードを単位とするJavaスライスシステムの試作
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
ソフトウェア保守のための コードクローン情報検索ツール
Java における 先進的リフレクション技術
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
プログラムの織り込み関係を可視化するアウトラインビューの提案と実装
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
分散 Java プログラムのための アスペクト指向言語
Josh : バイトコードレベルでのJava用 Aspect Weaver
統合開発環境によって表現された 言語機構によるコードのモジュール化
IDE を活用した言語機構に頼らないコード再利用のためのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
設計情報の再利用を目的とした UML図の自動推薦ツール
アスペクト指向言語のための視点に応じた編集を可能にするツール
メソッドの同時更新履歴を用いたクラスの機能別分類法
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
プログラミング基礎a 第9回 Java言語による図形処理入門(1) Javaアプレット入門
統合開発環境のための プログラミング言語拡張 フレームワーク
開発者との対話を活かした 横断的構造の表現
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
コードクローン解析に基づく デザインパターン適用候補の検出手法
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラム理解のための 付加注釈 DocumentTag の提案
GluonJ を用いたビジネスロジックからのデータベースアクセスの分離
Josh : バイトコードレベルでのJava用 Aspect Weaver
Presentation transcript:

プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案 数理・計算科学専攻 09M37287 松本 久志 指導教員 千葉 滋

プログラムの差分記述 既存のプログラムに対して差分を記述することで 新しいプログラムの開発を行う 仕様の類似したソフトウェアの開発 既存のプログラムに対して差分を記述することで 新しいプログラムの開発を行う 仕様の類似したソフトウェアの開発 組み込みソフトウェア開発 パッケージソフトウェアの複数エディション フリーソフト版とシェアウェア版の差別化 デバッグ用コードの挿入・除去 まず、タイトルにあるプログラムの差分記述について説明します。 これは、既存の~ といった開発手法を指しています。 このような差分記述は、仕様の類似したソフトウェアの開発、たとえば、 組み込み~・・・ のような場合に有効です。 また、もっと身近な例としては、デバッグ用コードの挿入などが挙げられます。

#ifdef/#endifによる差分記述 C/C++のプリプロセス命令 #defineにより差分記述が可能 ソースコード中に直接記述 行単位での任意の差分記述が可能 問題点 可読性の低下 コード変更の必要性 ある差分に関連するコードの抽出が困難 他の言語への導入が困難 構文解析器の拡張が必要 #define SYNC // #define LOG static void run() { Hoge h = new Hoge(); #ifdef SYNC synchronized(lock) { #endif #ifdef LOG System.out.println(“run”); h.run(); } このような差分記述を行うための手法としては、 C/C++の#ifdef/#endifディレクティブを利用する方法が考えられます。 これらの理由から#ifdef/#endifは、差分記述を行うための支援としては不十分であると考えられます。 Javaに#ifdef/#endifを 導入した仮想言語

求められる支援 差分を自由にon/off可能 ある差分に関連するコードをまとめて扱う 既存のIDEの拡張が容易 コンパイル時の適用・非適用 編集時の表示・非表示 コードを変更しない ある差分に関連するコードをまとめて扱う 関連コードの抽出 リファクタリング 既存のIDEの拡張が容易 既存のエディターやコンパイラを流用 そのため本研究では、差分記述の支援としてこのようなものが必要であると考えました。

提案:レイヤー機構付きIDE レイヤーとは 差分に関連するソースコード断片 IDE上でまとめて操作可能 #define SYNC // #define LOG static void run() { Hoge h = new Hoge(); #ifdef SYNC synchronized(lock) { #endif #ifdef LOG System.out.println(“run”); h.run(); } レイヤーとは 差分に関連するソースコード断片 IDE上でまとめて操作可能 レイヤーごとの表示・非表示(エディター) レイヤーごとの適用・非適用(コンパイラ) ベースとなるプログラム ログ出力に関するコード 同期に関するコード static void run() { Hoge h = new Hoge(); h.run(); } System.out.print(“run”); synchronized(lock) { }

レイヤーのファイル上での表現 ソースファイル内ではプリプロセス命令により注釈 レイヤーの選択状況と併せてIDEが解釈 解釈されたソースコード レイヤーの 選択状況 static void run() { Hoge h = new Hoge(); #ifdef SYNC synchronized(lock) { #endif #ifdef LOG System.out.println(“run”); h.run(); } static void run() { Hoge h = new Hoge(); h.run(); } synchronized(lock) { } ○ ベースレイヤー × ログレイヤー ○ 同期レイヤー

IDEの提供する操作 (1/2) レイヤーのon/offの切り替え エディター上での表示・非表示 コンパイル時の適用・非適用 static void run() { Hoge h = new Hoge(); synchronized(lock) { System.out.print(“run”); h.run(); } static void run() { Hoge h = new Hoge(); synchronized(lock) { h.run(); } static void run() { Hoge h = new Hoge(); h.run(); } ログ・同期両方の レイヤーを適用 ログレイヤーのみ適用 ログ・同期両方の レイヤーを非適用

IDEの提供する操作 (2/2) 指定したレイヤーの着色 背景色を変更 差分に関連するコードを視覚的に抽出可能 static void run() { Hoge h = new Hoge(); synchronized(lock) { System.out.print(“run”); h.run(); } static void run() { Hoge h = new Hoge(); synchronized(lock) { System.out.print(“run”); h.run(); } static void run() { Hoge h = new Hoge(); synchronized(lock) { System.out.print(“run”); h.run(); } ベースレイヤーを選択 ログレイヤーを選択 同期レイヤーを選択

IDE内部の処理 ソースコードをプリプロセッサにより変換 変換したコードをエディターやコンパイラへ 既存のエディターやコンパイラを流用可能

実装:LayerIDE 対象言語 Eclipseプラグイン Java + #ifdef/#endif ビュー エディター ビルダー レイヤーの操作 エディター プリプロセス命令を解釈して表示 ビルダー プリプロセス命令を解釈してコンパイル

ビュー レイヤーの操作を統括して行う レイヤー状態の変化を通知 レイヤーの表示 レイヤーの作成・削除・統合 レイヤーのon/off 着色するレイヤーの選択 レイヤー状態の変化を通知 エディターの表示を変更 自動および手動でコンパイル

エディター レイヤー状態を反映して表示 コードの折りたたみによりコードの非表示を表現 プリプロセス命令は灰色で表示 差分の存在を示す 可読性の低下を防ぐ

ビルダー クラスファイルの生成 自動ビルド プリプロセッサ処理後JDTのコンパイラに処理を委譲 ソースファイルの保存時 レイヤー構成の変更時 既存のコンパイラの流用

デモ LayerIDEを用いて差分記述を行った GUI・CUIの切り替え コア部分およびGUI・CUI・LOGの3つのレイヤーで構成 ぷよぷよ(パズルゲーム)の連鎖シミュレーター コア部分およびGUI・CUI・LOGの3つのレイヤーで構成 引数からフィールドを生成し、 連鎖をシミュレート 状態などのログを出力 LOG差分 コア部分 シミュレートした連鎖を グラフィカルに表示 シミュレートした連鎖を コンソールに表示 GUI差分 CUI差分

LayerIDE内部の処理 ファイルの読み込み後に変換 エディターは新たに作成 ビルダーは流用可能 想定していた実装 実際の実装 拡張ポイントによる 処理の追加が困難

関連研究 AspectJ [Kiczalesら ‘2001] Colored IDE [Kästner ら ‘2008] アスペクト指向言語 横断的関心事をモジュール化 差分を横断的関心事として捉える メソッド単位より細かい粒度の改変が困難 コンパイラの拡張が必要 Colored IDE [Kästner ら ‘2008] Eclipseプラグイン ASTに対してFeatureを関連付ける エディタ上では色を付けて表示 言語に依存する 完全な形のASTが存在する必要がある

まとめ レイヤー機構付きIDEの提案 LayerIDEの実装 レイヤーとは IDE上で差分を操作可能 Eclipseプラグイン 編集時の表示・非表示 コンパイル時の適用・非適用 レイヤーの着色 LayerIDEの実装 Eclipseプラグイン Java + #ifdef/#endif