第 3 章 研究のアプローチ 25
4.3 POM/MC のメタモデル
POM/MCを構成するメタモデルとして,C言語メタモデル,抽象プログラムメタモデ
ル,Promelaメタモデルを作成した.各メタモデルの記述には,2.2.3節に示したMOF
を用いた.図4.3に,各メタモデルを示す.ただし,説明上,実際のメタモデルに対し て要素ならびに要素名を簡略化している点に注意されたい.各メタモデルは,抽象意味 グラフ(Abstract Semantic Graph; ASG)[10]を表現している.ASGとは,抽象構文木 (AST;Abstract Syntax Tree)に参照情報を付加したものである.
4.3.1 C言語メタモデル
定義したC言語メタモデルを概説する.C言語メタモデルは,C言語のASGを表現し ている.まず,抽象構文木に関係する定義を示す.宣言を意味するDecl (Declaration)ク ラスが存在する.Declクラスのサブクラスとして,変数宣言を意味するVariableDecl (Variable Declaration)クラスと,関数宣言を意味するFunctionDecl (Function Dec-laration)がある.関数引数を意味するParameterDecl (Parameter Declaration)クラス は,VariableDeclクラスのサブクラスである.また,文を意味するStmt (Statement) クラスが存在し,複合文を意味するCompoundStmt (Compound Statement)クラス,式 宣言を意味するExpStmt (Expression Statement),For文を意味するForStmt (For
Promela C
Abstract program
図 4.3: POM/MCのメタモデル (上:C言語; 中央:抽象プログラム; 下: Promela; それぞ れ一部)
Statement)クラスは,Stmtのサブクラスである.複合文FunctionDeclは,関数宣言 FunctionDeclを構成する.複合文FunctionDeclは,文Stmtからなる.For文ForStmt は,文Stmtと,式Expからなる.式宣言ExpStmtは,式Expからなる.Expクラスのサ ブクラスとして,識別子Identifier,関数コールFunctionCall (Function Call),代 入式AssignmentExp (Assignment Expression),インクリメント演算子IncrementExp (increment Expression), 二項演算子BinaryOp (Binary Operation),配列アクセ スArrayAccess (Array Access),アドレス参照AddressReference (Address Refer-ence)がある.これらは,Expを構成する.また,型指定子TypeSpec (Type Specifier)は,
宣言Declを構成する.TypeSpecのサブクラスとして,参照型指定子ReferceTypeSepc (Reference Type Specifier)と,プリミティブ型指定子PrimitivyTypeSpec (Primitive
Type Specifier)があり,参照型指定子は別の型指定子から構成される複合型である.この
ようなメタモデルによりC言語の構文木をモデルとして表現することができる.
次に参照情報について説明する.メタモデル上では,参照情報はRef (reference)クラ スによって表現している.変数参照VariableRef (Variable Reference)と,関数参照 FunctionRef(Function reference)がRefのサブクラスとして存在する.RefがIdentifier と関連を持ち,VariableRefがVariableDeclと,FunctionRefがFunctionDeclとそ れぞれ関連を持つ.これにより,識別子Identifier(のサブクラス)から宣言Decl(のサ ブクラス)への参照が表現できる.
4.3.2 抽象プログラムメタモデル
抽象プログラムメタモデルは,C言語のメタモデルをベースとして,一般的な手続き型 言語を表現できるように設計した.AGSの表現については,ほぼC言語メタモデルと同じ であるが,一部相違がある.C言語メタモデルではForStmtクラスが存在するが,抽象プ ログラムメタモデルではそれに代わるものとしてIterationStmt (Iteration Statement) が存在する.これは,for文やwhile文など繰り返しを意味する構文を統一的に扱うことを 意図している.
また,抽象プログラムメタモデルの特徴の一つとして,“論理要素”がある.論理要素は,
抽象プログラムメタモデルでは,LogicalElement(Logical Element)で表現している.論 理要素とは,ソースコードレベルの言語要素よりも抽象度の高い役割を示すものである.
図4.3ではライブラリ,特にプロセスに関する論理要素を定義している.ライブラリで提供 される型や関数も,ソースコード上では他の型や関数と同じであるが,特定の意味を持つ ライブラリを用いるという意味を与えることで,Promelaによるモデル化において,特別 に扱うことができる.LogicalElementのサブクラスとして,ライブラリの提供する型を 意味するLibraryTypeSpec(Library Type Specifier),ライブラリの提供する型の宣言を 意味するLibraryFunctionDecl(Library Function Declaration),ライブラリの指定する 関数の参照を意味するLibraryFunctionRef(Library Function Reference)を定義してい る.LibraryTypeSpecのサブクラスとしてMutex型を意味するMutexTypeSpec(Mutex Type Specifier)を定義し,Mutex型について他の型とは異なる特別な意味を与えている.
LibraryFuctionDeclとLibraryFunctionRefについても,それらのサブクラスとして ライブラリの提供する関数について,特別な意味を持たせている.
4.3.3 Promelaメタモデル
Promelaメタモデルでは,Promelaの抽象構文木を表現している.Promelaの構文はC 言語と共通する要素もあるため,C言語メタモデルとPromelaメタモデルは類似している が,異なる部分もある.例えば,C言語ではfor文を意味するForStmが,Promelaでは do文DoStmt(Do Statement)となっている.また,C言語では代入式AssignmentExpは 文Expを構成要素として持つことができるため代入式の中に代入式を入れることができる (a= (b=c))が,類似するPromelaの代入文AssignmentStmtは(Assignment Statement) は文を要素に持つことができないため,代入の代入はできない.また,Promelaの持つプ ロセス機構であるRunStmt(Run Statemenet),メッセージ送受信を行うSendStmt(Send Statement)とRecieveStmt (Receive Statement)をメタモデルに含む.