11

本物の正直な外部 DSL を構築するためのツールはありますか? いいえ、Ruby、Boo、XML、または別の既存の言語や構文を悪用することについて話しているのではありません。つまり、本当の外部 DSL を意味します。つまり、自分の目的のための自分の言語です。

開発中の言語ワークベンチがいくつかあることは知っており、.NET の「Irony」などについて聞いたことがあります。もちろん、ANTLR、Lex/Yaac などもありますが、私がやろうとしていることには複雑すぎるのではないかと思います。

あなたが使用した、または聞いたことがあるかもしれない DSL ビルダー ツールと、それがどのように役立つか、およびその欠点についての印象について話してください。

4

7 に答える 7

9

私はBoo、Irony.NET、およびGrammaticaと呼ばれるツールキットでDSLを作成しました。パーサジェネレータは複雑すぎると言いますが、判断が早すぎる可能性があります。実際、小さな学習曲線を乗り越えれば、非常に簡単に使用でき、簡単にオーバーライドできる可能性の広大な世界が開かれます。努力。ほとんどのパーサジェネレーターの文法を書くために必要な表記法を学ぶことは、正規表現を学ぶことにいくぶん似ていることがわかりました-それらを入れるには少し心を曲げる必要がありますが、報酬は重要です。

私の意見はこれです:もしあなたのターゲット言語が唖然としたビジュアルデザイナーによって扱われることができるほど単純であるなら、パーサージェネレーターを使ってそれのための文法を書くことは非常に簡単であるはずです。

ターゲットDSLが複雑で、文法を書くのに苦労する必要がある場合は、とにかく、ダムダウンしたビジュアルツールはマスタードをカットせず、とにかく文法を書くことを学ぶ必要があります。

ただし、内部DSLと外部DSLについては長期的には同意します。私はBooで内部DSLを作成し、それを機能させるためにDSL構文を変更する必要があり、それは常にハックのように感じました。Irony.NETまたはANTLRを使用した同じ文法は、より柔軟に実行するのと同じくらい簡単でした。

いくつかのオプションについて説明しているブログ投稿があります。投稿はランタイム式評価用のDSLの作成を中心にしていますが、ツールはすべて同じです。

Irony.NETでの私の経験はすべて前向きであり、Irony.NETを使用して実装されたいくつかの参照言語があり、開始するのに適しています。あなたの言語が単純であれば、立ち上げて実行することは絶対に複雑ではありません。TinyParserと呼ばれるCodeProjectのライブラリもあります。これは、パーサーを純粋なソースコードとして生成するため、非常に興味深いものです。つまり、最終製品にはサードパーティの参照がまったくありません。でも、自分では使ったことがありません。

于 2008-10-03T06:59:40.707 に答える
8

スタンドアロン DSL の作成を検討している場合は、コンパイラの構築を検討していることになり、それを回避する方法はありません。コンパイラの構築プログラミングの必須知識であり、一般に考えられているほど難しいものではありません。Steve Yegge のRigh Programmer Foodは、コンパイラをうまく構築する方法を知ることの価値を要約しています。

始める方法はたくさんあります。記事で言及されている 2 つの論文をチェックすることをお勧めします:コンパイラを書きたいですか? この 2 つの論文を読んでください。最初のLet's build a compilerは非常にアクセスしやすいです。実装言語として Turbo Pascal を使用していますが、他の言語でも簡単に実装できます。ソース コードは非常に明確です。Pascal は単純な言語です。

物事がどのように機能し、関連する用語についてよく理解したら、ANTLRのようなものを掘り下げることをお勧めします。ANTLR には、インタープリターとデバッガーが付属する優れた IDE ANTLRWorksがあります。また、その場で文法の非常に優れた視覚化を生成します。私はそれが学習においてかけがえのないものであると感じました。

ANTLR には優れたチュートリアルがいくつかありますが、最初は少し圧倒されるかもしれません。これは素晴らしいですが、ANTLR 2.0 に対するものであるため、より新しいバージョン (現在の最新バージョンは 3.1) との非互換性に遭遇する可能性があります。

最後に、DSL への別のアプローチがあります: Lisp アプローチです。Lisp の構文のない性質 (あなたのコードは基本的に抽象的な構文ツリーです) を考えると、括弧に慣れれば、そこから無限の言語を形作ることができます :)。

そのアプローチを採用する場合は、組み込み可能な Lisp を使用する必要があります。Java では、Clojureがあります。これは、JVM およびそのライブラリと完全に相互運用する Lisp 方言です。個人的には使っていませんが、いい感じです。Scheme には、 LGPL の下でライセンスされているGNU Guileがあります。Common Lisp にはECLがあります、LGPL の下でも。どちらも相互運用性のために C インターフェイスを使用しているため、ほとんどの場合、他の言語に組み込むことができます。ECL は、各 Lisp 関数が C 関数として実装されているという点で、Lisp の中でもユニークです。そのため、必要に応じて C で Lisp コードを書くことができます (たとえば、独自の拡張メソッド内で、Lisp オブジェクトを操作する C 関数を作成できます。 Lisp から呼び出します)。私はしばらくの間、サイド プロジェクトに ECL を使用してきましたが、気に入っています。メンテナーは非常にアクティブで反応が良いです。

于 2008-09-19T14:46:25.410 に答える
4

あなたは本当にRagelをチェックしてください。これは、通常のソース コードにステート マシンを埋め込むためのフレームワークです。Ragel は、C、C++、Objective-C、D、Java、Ruby をサポートしています。

Ragel は、ファイルおよびプロトコル パーサーを作成したり、外部の DSL をステップ実行したりするのに最適です。主な理由は、状態遷移などであらゆる種類のコードを実行できるためです。

Ragel を使用するいくつかの注目すべきプロジェクトは、優れた Ruby Web サーバーであるMongrelです。そして、Ruby ベースの html パーサーであるHpricotは、jQuery に触発されたようなものです。

Ragel のもう 1 つの優れた機能は、ステート マシンを視覚化するgraphvizベースのチャートを生成する方法です。以下は、Ragel State Charts に関するZed Shaw の 記事からの例です。

ラジェル州チャート

于 2008-09-19T13:58:01.953 に答える
2

Xtextはこのために構築されました。

ウェブサイトから:

Xtext は、プログラミング言語およびドメイン固有言語を開発するためのフレームワークです。

パーサー、リンカー、コンパイラー、インタープリターから完全な一流の Eclipse IDE 統合まで、完全な言語インフラストラクチャーのすべての側面をカバーしています。これらすべての側面に優れたデフォルトが付属しており、同時にすべての側面をニーズに合わせて調整できます.

于 2014-10-02T07:45:09.350 に答える
1

私は Irony を使用して良好な結果を得ています。皮肉な点は、DSL を使用するランタイムに簡単に組み込むことができることです。私は、C# で記述されたセマンティック モデルに取り込む外部 DSL を作成しているので、皮肉なことは素晴らしいことです。次に、セマンティック モデルを使用して、StringTemplate でコードを生成します。

于 2009-04-30T12:09:02.850 に答える
1

外部 DSL の実装を計画している場合、Spoofax ( http://strategoxt.org/Spoofax ) はこれを行うための優れた言語ワークベンチです。これは、SDF 、Stratego などのいくつかの最先端技術を活用する、パーサー ベースのテキスト言語ワークベンチです。DSL の実装に加えて、コード補完、アウトライン ビュー、インテリセンスなどの非常に豊富なエディター サービスを利用できます。http://mobl-lang.org/ などのいくつかの言語の構築に使用されています。これをチェックして、提供されるサポートについて理解してください。

Spoofax プロジェクトには、すぐに使用できる素敵なサンプル DSL 実装と Java コード ジェネレーターが付属しています。ツールを使い始めるための出発点として機能する場合があります。

この言語ワークベンチの使用法に関するチュートリアルの詳細: http://strategoxt.org/Spoofax/Tour

それが役に立てば幸い!

于 2010-11-25T17:46:16.983 に答える
0

重大な外部 DSL の場合、解析の問題を回避することはできません。ANTLR は必要最低限​​のものです。確認したいのは、任意の DSL 構文を Java などのターゲット言語にマップするために使用できるプログラム変換システムです。

http://en.wikipedia.org/wiki/Program_transformationを参照してください。

于 2014-09-16T13:08:28.963 に答える