OMeta
OMetaは、2007 年にViewpoints Research Instituteの下で Alessandro Warth と Ian Piumarta によって開発された、パターン マッチングに特化したオブジェクト指向プログラミング言語です。この言語は、「プログラマーがトークナイザー、パーサー、ビジター、およびツリートランスフォーマーを実装するための自然で便利な方法」を提供することを目的として、文脈自由文法ではなく構文解析式文法(PEG)に基づいています。
OMeta の主な目標は、構文解析など、一般に言語プログラマーだけが利用できる手法を、より多くのユーザーが使用できるようにすることです。また、OMeta で書かれたプログラムは、JavaScript などのバニラ (ベース言語) 実装で書かれたプログラムよりも一般的に効率が悪いことが知られていますが、プロトタイプを迅速に作成するために使用することでも知られています。
OMeta は、ドメイン固有言語の作成での使用、特にその実装の保守容易性 (Newcome) で知られています。OMeta は、他のメタ言語と同様に、ホスト言語を必要とします。元々は COLA 実装として作成されました。
コンテンツ
1 説明
1.1 発達 1.2 使用法 1.3 例
2 バージョン
2.1 メタコラ 2.2 OMeta/Squeak 2.3 Oメタ/JS
2.3.1 対。JavaScript
2.4 OMeta# 2.5 鉄メタ 2.6 オーム
3 こちらもご覧ください
4 参考文献
説明
OMeta は、ドメイン固有言語のプロトタイピングと作成に使用されるメタ言語です。「パターンマッチングのためのオブジェクト指向言語」として紹介されました。文字、数字、文字列、アトム、リストなど、「任意の種類のデータを処理する」ように設計された構文解析式文法(「文字列を生成するのではなく、文字列を認識することに基づく」言語の記述)を使用します。これにより汎用性が高まり、構造化データと非構造化データの両方で作業できるようになります。
同様の言語に対するこの言語の主な利点は、コンパイルのすべてのステップで同じコードを使用できることです (例: lexing と parsing)。OMeta は、引数に基づくプロダクション ルールの定義もサポートしています。これを使用して、そのようなルールを OMeta 自体と、OMeta が実行されているホスト言語に追加できます。さらに、これらのルールは互いに引数として使用し、「高次のルール」を作成し、互いに継承して生産性を高めることができます。既存のコードからのルール。OMeta は、パターン マッチング中にホスト言語のブール値 (True/False) を使用できます。これらは「セマンティック述語」と呼ばれます。OMeta は一般化されたパターン マッチングを使用して、プログラマーが単一のツールでコンパイルのフェーズをより簡単に実装および拡張できるようにします。
OMeta は文法を使用して、OMeta が動作するルールを決定します。文法は、文法が作成されるときに呼び出される __init__ 関数の使用により、不特定の数の変数を保持できます。文法は、完全なプログラミング言語のクラスと同じように、継承するだけでなく、互いに呼び出すこともできます (「外部プロダクション呼び出しメカニズム」を使用して、文法が互いの入力ストリームを「借用」できるようにします)。 OMeta はまた、ほとんどのメタ言語とは異なり、あいまいさを取り除くために、特定の文法内のオプションに優先順位を付けます。入力を特定の文法にパターン マッチングした後、OMeta はパターンの各コンポーネントを変数に割り当て、それをホスト言語に渡します。
OMeta は、パターン マッチングを使用して、従来のコンパイルのすべての手順を単独で実行します。最初に文字のパターンを見つけてトークンを作成し、次にそれらのトークンを文法に一致させて構文ツリーを作成します。次に、タイプチェッカーが構文ツリーのパターンを照合して注釈付きツリーを作成し、訪問者が同じことを行って他のツリーを生成します。次に、コード ジェネレーターがツリーをパターン マッチングしてコードを生成します。 OMeta では、「そのような機能がネイティブにサポートされているため、解析ツリーをトラバースする」のは簡単です。
メタ言語は、ほとんどのプログラミング言語での使いやすさで知られていますが、実装言語で最も一般的に使用されています。たとえば、OMeta/JS は JavaScript で使用されています。ホスト言語を必要とするため、OMeta の作成者はそれを「寄生言語」と呼んでいます。
発達
Alessandro Warth と Ian Piumarta は、2007 年に研究システムとパーソナル コンピューティングの改善を目的とした組織である Viewpoints Research Institute で OMeta を開発しました。彼らは最初に結合オブジェクト ラムダ アーキテクチャ (COLA) (Viewpoints Research Institute で調査された自己記述型言語) を使用しました。 OMeta のホスト言語として、その後、大島良樹の支援を受けて、複数のホスト言語での有用性を検証するために Squeak Smalltalk に移植しました。OMeta は、その紹介論文のケース スタディとして、「Javascript のほぼ完全なサブセットを実装するために」も使用されました。
使用法
OMeta は、他のメタ言語と同様に、主にドメイン固有言語(略して DSL) を作成するために使用されます。具体的には、DSL のプロトタイプを迅速に作成するために使用されます — OMeta は実行速度が遅く、エラー レポートが不明確であるため、完全なプログラミング言語としての機能の多くが失われます (Heirbaut 73–74)。OMeta は、コンパイルのすべての段階で 1 つの構文を使用できるため便利です。OMeta を使用すると、コンパイラを作成する際に複数のツールを個別に使用する必要がなくなります。さらに、OMeta は、DSL の作成に使用できる速度と、バニラの実装とは対照的に、そのようなタスクを実行するために必要なコード量が大幅に少ないことの両方で高く評価されており、レポートでは行数が約 26% 減少しています。バニラとしての機能コードの。
例
以下は、OMeta を使用した C# の基本的な電卓言語の例です。
ometa BasicCalc < :パーサー { 桁=スーパー: d -> d . 数字に(),
数字=数字: n桁: D -> ( n * 10 + d )
| | 桁, AddExpr = AddExpr : x ‘ + ‘ MulExpr : y -> ( x + y )
| | AddExpr : x ‘ – ‘ MulExpr : y -> ( x – y )
| | MulExpr 、 MulExpr = MulExpr : x ‘ * ‘ primExpr : y -> ( x * y )
| | MulExpr : x ‘ / ‘ primExpr : y -> ( x / y )
| | PrimExpr 、 PrimExpr = ‘ ( ‘ Expr : x ‘ ) ‘ -> x
| | 数,
Expr = AddExpr }
あなたが書いた言語のサブクラスを作成することも可能です:
ometa ExponentCalc < : BasicCalc { MulExpr = MulExpr : x ' ^ ' PrimExpr : e -> Math . pow ( x , e )
| | 素晴らしい }
以前に書かれた言語も、継承するのではなく呼び出すことができます。
ometa ScientificCalc < :パーサー {
MathFunc : n =トークン( n )スペース、
AdvExp = MathFunc ( ‘ sqrt ‘ ) AdvExp : x -> Math . 平方根( x )
| | FacExp FacExp = PrimExp : x ‘ ! ‘-> {
var r = 1 ;
for (; x > 1 ; x –) { r *= x ; } rを返します。 } | | PrimExp PrimExp =外部( ExponentCalc . Expr ): x -> x
Expr = AdvExp
}
バージョン
OMeta は、理論的には任意のホスト言語に実装できますが、ほとんどの場合、JavaScript 実装である OMeta/JS として使用されます。 Warth は、「OMeta/X—X はホスト言語である」のパターンは、OMeta 内で標準化されるよりも「X」の影響を受けるほうがよいと述べています。オブジェクト。
メタコラ
MetaCOLA は OMeta の最初の実装であり、言語の紹介論文で使用されました。MetaCOLA は OMeta の最初のテスト コードを実装し、リリース前に作成された言語の 3 つの形式 (その他は OMeta/Squeak とほぼ完成した OMeta/JS) の 1 つです。
OMeta/Squeak
OMeta/Squeak は、システムの最初のデモンストレーション中に使用された OMeta のポートです。OMeta/Squeak は、「Squeak EToys システムの代替構文を実験するために」使用されます。OMeta/Squeak は、角括弧のみを必要とする OMeta/JS とは異なり、ルール操作で角括弧と「先のとがった角括弧」(波括弧) を必要とします。ただし、OMeta/Squeak 2 は、OMeta/JS の構文に似た構文を備えています。 OMeta の COLA 実装とは異なり、Squeak バージョンは中間結果を記憶しません (計算で既に使用されている数値を格納します)。
Oメタ/JS
OMeta/JS は、JavaScript 実装の形式の OMeta です。OMeta/JS を使用した言語実装は、通常の JavaScript のみを使用して記述されたものよりも使いやすく、スペース効率が高いことが注目されていますが、前者は実行がはるかに遅いことが示されています。このため、OMeta/JS はプロトタイピング用の非常に便利なツールと見なされていますが、実稼働言語の実装には適し
対。JavaScript
OMeta などの DSL 開発ツールの使用は、NCLOC (コードの非コメント行) 数が少ないため、「普通の実装」(つまり JavaScript) よりもはるかに保守しやすいと考えられています。これは、「AST オブジェクトを作成するか、限定された文字列操作を実行するセマンティック アクション コード」が原因の 1 つです。OMeta には「コンテキストフリー構文」がないため、追加のコード行を犠牲にして、パーサーとレクサーの両方の作成に使用できます。OMeta の保守性を示すその他の要因には、「Halstead Effort は、OMeta パーサーと比較してバニラ パーサーが 3 倍の開発労力を必要とすることを示している」高い保守性指数が含まれます。JavaScript と同様に、OMeta/JS は「Waebric の完全な構文表記」をサポートします。
NCLOC の違いの原因となっている OMeta の主な利点の 1 つは、タイプチェッカーがパーサーからメカニズムを継承できるようにすることで、OMeta が「ツリー ウォーキング メカニズム」を再利用していることです。これにより、タイプチェッカーは OMeta パーサーの変更に適応します。ツリー ウォーキング メカニズムにはより多くのコードが含まれており、パーサーの変更に手動で適応させる必要がもう 1 つは、OMeta の文法が「プログラム コードよりも高い抽象化レベル」を持っているという事実です。また、「AST オブジェクトを作成するか、制限された文字列操作を実行するセマンティック アクション コードの結果」と見なすこともできますが、文法の非セマンティクスにより、明示的な空白定義 (メカニズムOMeta が DSL 作成用の単一のツールとして機能できるように実装されています。
パフォーマンスに関しては、OMeta はバニラの実装に比べて実行速度が遅いことがわかっています。OMeta によるバックトラッキング技術の使用は、これの潜在的な主な原因です (OMeta のパーサーには「7 つの先読み演算子が含まれています…これらの演算子は、特定のルールを互いに区別するために必要であり、文法から除外することはできません」)。ただし、このパフォーマンスの低下は、OMeta のメモ化方法が原因である可能性が高くなります。
「中間解析ステップの格納により、解析テーブルのサイズは、文法で使用される終端と非終端 (オペランド) の数に比例します。OMeta パーサーの文法には 446 のオペランドが含まれているため、パフォーマンスが低下すると考えられます。悪影響を受けます。」
ただし、OMeta が通常の実装で時間を稼いでいるのは、字句解析です。JavaScript のバニラ レクサーは、レクサーが開始する前に実装が Java を介してプログラム全体を文字列に変換する方法のために、大幅に遅くなります。それにもかかわらず、OMeta の実装は全体的に大幅に遅くなります。
OMeta は、エラー報告の点でも遅れをとっています。通常の実装では、エラーの場所に関して「テスト ケースの約 92%」で正しいエラー メッセージが返されますが、OMeta では単に「Match failed!」が返されます。任意のエラーに。OMeta を介してソースを見つけるには、「少なくとも解析が失敗した行番号を出力するために、セマンティック アクション コード内の改行文字を手動でカウントする」必要が
OMeta#
OMeta# は、OMeta/JS を C# 機能に変換することを目的とした Jeff Moser によるプロジェクトです。そのため、OMeta# の設計は、Alessandro Warth の OMeta/JS 設計に基づいています。このプロジェクトの目標は、ユーザーが作業言語を非常に簡単に作成できるようにすることです。具体的には、OMeta# は、.NET 言語開発のための単一のツールとして機能し、言語開発の急激な学習曲線を短縮し、有用な教育リソースとなり、実際のアプリケーションでの使用に実用的であることを目的としています。 OMeta# は現在、OMeta のホスト言語として 4.0 ではなく C# 3.0 を使用しています。C# 3.0 は動的言語ではなく静的言語であるため、OMeta# 内でのホスト言語の認識は、動的に型付けされた言語で「以前よりも 2 ~ 3 倍醜く、大きくなっています」。
OMeta# は、文法および文法の内部「ルール」のメソッドとして、.NET クラスまたはタイプを使用します。OMeta# は中かっこ ( { と } ) を使用して、そのホスト言語を文法で認識します。この言語は、ホスト言語と同様に強力でクリーンな静的型付けに重点を置いていますが、これにより言語の作成が複雑になります。C# での新しい実装は、.NET メタ言語とも互換性がなければならず、作成がさらに複雑になります。さらに、ユーザーが OMeta# の metarules を誤って誤用するのを防ぐために、Moser はそれらを「プロパティを介して公開される明示的なインターフェイス (たとえば、”_apply” の代わりに “MetaRules.Apply” を使用)」として実装することを選択しました。OMeta# の後半部分は、言語自体で記述されていますが、言語の機能は C# にかなり関連付けられたままです。 OMeta# のソース コードは Codeplex に投稿されており、オープン ソース プロジェクトとして存続する予定です。しかし、2012 年 10 月 1 日のサーバーによる再コミットにより、プロジェクトの開始直後から更新は無期限に中断されています。
鉄メタ
Gordon Tisher は2009 年に .NET 用のIronMeta を作成しました。これは OMeta# に似ていますが、GitHub で BSD ライセンスの下で配布されている、はるかにサポートされた堅牢な実装です。
オーム
Ohmは Ometa の後継であり、(とりわけ) 文法を意味アクションから分離することによって Ometa を改善することを目的としています。
こちらもご覧ください
類似のメタ言語であるANTLR (言語認識用の別のツール)
META II OMeta の実装に影響を与えた初期のコンパイラ-コンパイラ
OMeta/JS github リポジトリ。
参考文献
^次の場所にジャンプ:a b c d e f g h i j Warth、Alessandro、Ian Piumarta。「OMeta: パターン マッチングのためのオブジェクト指向言語」。ACM SIGPLAN 2007 動的言語シンポジウム (DLS ’07)。03版 巻。TR-2007。カリフォルニア州グレンデール: Viewpoints Research Institute、2007 年。VPRI テクニカル レポート。ウェブ。2013 年 9 月 30 日。
^次の場所にジャンプ:a b Klint、Paul、Tijs Van Der Storm、Jurgen Vinju。「言語実装の保守性に対する DSL ツールの影響について」。LDTA ’10 言語記述、ツール、およびアプリケーションに関する第 10 回ワークショップの議事録。ニューヨーク、ニューヨーク。Np、2010年。ウェブ。2013 年 9 月 30 日。
^次の場所にジャンプ:a b c d e f g h i Heirbaut、ニコラス。「ドメイン固有言語の 2 つの実装手法の比較: OMeta/JS と Javascript の比較」論文。アムステルダム大学、2009 年。ウェブ。2013 年 9 月 30 日。
^ Mascarenhas、Fabio、Sergio Medeiros、 Roberto Ierusalimschy . 構造化データの式文法の解析。Np: np, nd Web.< http://www.lbd.dcc.ufmg.br/colecoes/sblp/2011/003.pdf >. ^次の場所にジャンプ:a b c d e f g h i モーザー、ジェフ。「モーザーウェア」:OMeta#: 誰? 何?いつ?どこ?なぜ?、ブロガー、2008 年 6 月 24 日。ウェブ。2013 年 9 月 30 日。
^次の場所にジャンプ:a b c ワース、アレッサンドロ。「 OMeta の構文について」 OMeta の構文について。Np、2008 年 7 月 4 日。ウェブ。2013 年 10 月 16 日
^ ワース、アレッサンドロ. 「OMeta/Squeak 2.」OMeta/Squeak 2. Np、nd Web。2013 年 10 月 16 日。< http://tinlizzie.org/ometa/ometa2.html >。
^ モーザー、ジェフ. 「モーザーウェア」: Meta-FizzBuzz、ブロガー、2008 年 8 月 25 日。ウェブ。2013 年 9 月 30 日。
^ モーザー、ジェフ. 「モーザーウェア」: オブジェクト指向の寄生メタ言語ブロガーの構築、2008 年 7 月 31 日。Web。2013 年 9 月 30 日。
^ 「オームの哲学」 . ·