統合開発環境のための
プログラミング言語拡張
フレームワーク
理学部 情報科学科
05_22951 松本 久志
指導教員 千葉滋
言語拡張システムの必要性
言語拡張を容易にするためのシステム
◦ ドメイン固有言語の作成
例 : O/Rマッピング
◦ 既存言語の補填
例 : Open class
@Refines(A.class)
class B {
void hoge() { .. }
}
コンパイラのためのシステム
◦ Polyglot [Myers ら ‘2003]
◦ JastAdd [Hedin ら ‘2003]
統合開発環境のための
言語拡張システム
統合開発環境への対応
◦ 現在ではコンパイラの
提供だけでは不十分
従来技術 Polyglot, JastAdd など
◦ 編集時の支援がない
対話的なエラー報告
Eclipseでは編集時に専用の処理
提案 : 編集時のエラー出力を操作する
メタオブジェクトプロトコル(MOP)
言語拡張をメタオブジェクトで記述
編集時とコンパイル時の2つのMOP
◦ 編集時メタオブジェクト
編集時に出力するエラーを制御
◦ コンパイル時メタオブジェクト
ソースコード変換で言語拡張を実装
編集時のMOPの動作
エラーの出力を操作
◦ 必要のないエラーを除去
◦ 新たに必要なエラーを追加
ソース変換は行わない
◦ 厳密なエラー解析はコンパイル時に行えば良い
@Refines(A.class)
class B {
void hoge() { .. }
}
@Refines(A.class)
class B {
void hoge() { .. }
}
class A {}
class A {}
コンパイル時のMOPの動作
拡張言語のソースコードを変換
◦ 文字列としての変換
◦ ASTを利用した変換
元の言語の構文解析器を用いてASTを生成
変換後既存のコンパイラでコンパイル
@Refines(A.class)
class B {
void hoge() { .. }
}
class A {}
class A {
void hoge() { .. }
}
実装
EclipseのJava開発環境を拡張可能に
◦ JDTプラグインを拡張
言語拡張者の作業
メタオブジェクトのメソッドを上書き
◦ 編集時: finalizeProblems
エラー出力の操作
引数:ソースファイルの解析結果
標準JDTが作成、発見したエラー情報を含む
◦ コンパイル時: convertSources
抽象構文木を取り出し変形
ソースの変換
適用例
@Refinesによるopen classの機構
言語拡張に由来した
エラーの除去
拡張された言語の
コンパイル及び
実行が可能
エラー操作は18行
ソース変換は32行
の記述で実現
記述例
@Refinesによるopen classの機構
編集時のエラー出力の操作
コンパイル時のソース変換
@Override
@Override
public void convertSources() {
public void finalizeProblems(CompilationUnitDeclaration u) {
for(CTUnit unit : CTMOP.getUnits()) {
List<CategorizedProblem> newList
/* ビジターパターンを用いて
= new LinkedList<CategorizedProblem>();
CompilationResult result = u.compilationResult();
@Refinesアノテーションを検索 */
unit.getCompilationUnit().accept(new ASTVisitor() {
for(CategorizedProblem problem : result.problems){
public boolean visit(SingleMemberAnnotation node) {
if(problem.isError()) {
if(node.getTypeName().toString().equals(“Refines”)
if(problem.getCategoryID() ==
CategorizedProblem.CAT_TYPE) {
&& node.getParent() instanceof TypeDeclaration) {
// @Refinesアノテーションに関するエラーは無視
: // フィールド及びメソッドのコピー
if(problem.getArguments()[0].equals(“Refines”)) continue;
}
}
}
: // 他のエラー判定条件
}
newList.add(problem);
}
}
}
}
unit.compilationResult().problems
= newList.toArray(new CategorizedProblem[newList.size()]);
}
関連研究
拡張可能コンパイラ
◦ Polyglot [Myers ら ‘2003]
拡張しやすいJavaフロントエンドフレームワーク
◦ JastAdd [Hedin ら ‘2003]
属性文法による意味解析
差分のみの記述で構文拡張可能
編集時メタオブジェクト
◦ “Expressive programs through presentation extension”
[Eisenberg ら ‘2007]
編集時とコンパイル時のMOPを提供
編集時のソースコードの表示を制御
まとめと今後の課題
統合開発環境に対応した
言語拡張フレームワークの提案
◦ コンパイル時及び編集時のMOPを提供
編集時にエラー出力の操作を行う
コンパイル時にソース変換を行う
◦ JDTを拡張して実装
今後の課題
◦ ASTの操作の簡易化
◦ エラーの判別方法の確立
© Copyright 2026 ExpyDoc