言語開発フレームワークの使用はどれくらい簡単ですか?


11

これは、フレームワークの形式で言語設計で使用される概念を抽象化することを目的とする抽象化プロジェクトと呼ばれるプロジェクトに焦点を当てた一連の質問の一部です。

構造タイピングに関連する別のページは、ここで表示できます。フレームワークに関する質問と投稿する適切な場所に関連するメタトピックは、ここにあります

言語開発フレームワークを使用するのはどれくらい簡単ですか?

大規模なコード生成フレームワークを作成しました。このフレームワークには、言語固有のコンパイラーに結果を送信する機能も含まれています。使いやすさのトピックは、そのようなフレームワークの例の1つです。CodeDOM、またはCode Document Object Modelです。

マイクロソフトによって書かれたフレームワークであり、一般的なコード構造を記述しますが、一般に多くのことを省き(式強制)、特定の構成体の表現では少し抽象的である傾向がありました。 CodeDOM は、使用されるタイプが汎用インターフェイスである場合、PrivateImplementationTypeonの発行を適切に処理しませんCodeMemberMethodでした。CodeDOMは、最初のコードジェネレーターを作成した最初の理由でした。

フレームワークを簡素化するために私がやろうとしていることの1つは、何かをするために必要な作業量を減らし、アクションとそれらのアクションを構成する特定のタイプに焦点を当てることです。

ここに、私が書いているフレームワークがどのように機能するかを並べて比較します。

//Truncated...
/* *
 * From a project that generates a lexer, this is the 
 * state->state transition character range selection logic.
 * */
var nextChar = nextMethod.Parameters.Add(new TypedName("currentChar", typeof(char).GetTypeReference()));
//...
char start = rangeElement.B.Value.Start;
char end = rangeElement.B.Value.End;
/* *
 * 'start' <= nextChar && nextChar <= 'end'
 * */
currentExpression = start.LessThanOrEqualTo(nextChar).LogicalAnd(nextChar.LessThanOrEqualTo(end));

対CodeDOM:

//Truncated...
var nextChar = new CodeVariableReferenceExpression("nextChar");
//...
var start = new CodePrimitiveExpression(rangeElement.B.Value.Start);
var end = new CodePrimitiveExpression(rangeElement.B.Value.End);
currentExpression = new CodeBinaryOperatorExpression(new CodeBinaryOperatorExpression(start, CodeBinaryOperatorType.LessThanOrEqual, nextChar), CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(nextChar, CodeBinaryOperatorType.LessThanOrEqual, end));

フレームワークの焦点は、言語愛好家と、コードまたはアプリケーションの生成に興味がある人です。コンパイル、コード生成、および言語開発に重点を置いているため、フレームワークは使いやすさまたは生の力に焦点を当てるべきですか?

私の主な目標は、このようなツールの可用性を高めることです。そのため、ドメインに興味のある人は、言語中心のプロジェクトに取りかかる前に、言語理論の分野で多くの経験を必要としません。

私がフレームワークの作成者であることを考えると、「使いやすさ」に対する私の見解は偏っています。したがって、フォーカスと目標がプロジェクトに関連していない他の人にとって意味があるかどうか、別の人に尋ねなければなりません。


1
codereview.stackexchange.comでこの質問をする必要があります。
ロバートハーヴェイ

6
質問は、フレームワークは、生のパワーを犠牲にして使用するのは簡単であるべきかどうか、「より高いレベルのアーキテクチャとソフトウェアシステムの設計が」コードReview.SE、のためのすべてのフィットであることを見ていない、オンではありませんそこにトピックがあり、ここにトピックがあります。コードレビューは、作業中のコードがあり、批評が必要な場合に使用します。

コードジェネレーターへの入力は、別のプログラミング言語です。コード生成への欲求は、生成する言語が十分に強力でないことを意味します。より良い言語には組み込みのコードジェネレータがあります。
ケビンクライン

@kevinclineコードジェネレーターの一般的な使用例は、汎用コード生成フレームワークを利用するドメイン固有の言語です。これは実際にはあまり選択肢ではありません。代替手段は、独自の内部中間言語にコンパイルしてVMを介して解釈するか、自分で下位レベルの構成に変換することですが、最終的には同じことをしています。それがこのフレームワークの目的です。コードを動的に生成する作業を行う必要がある場合は、これを使用するのと同じものの独自の実装をウィングします。
アレクサンダーモロウ

ソース言語が不十分であるということではなく、ソーステキストからターゲットプラットフォームに翻訳するための中間ソフトウェアが記述されるまで、言語文法は単なるテキストであるということです。この場合、CLIを対象とするのは、共通言語インフラストラクチャ(CLI)、または汎用言語のコードです。このフレームワークは、高レベルの表現を取り、それらをIL生成のための十分に低レベルの構成体に変換するという面倒な作業を処理することを目的としています。つまり、コンパイラーは、コンパイラーが必要だからといって、言語が十分に強力ではないという意味ではありません。必須です。
アレクサンダーモロウ

回答:


2

言語開発フレームワークを構築するのは難しい。どのような種類のサポートをサポートするかを決定する必要があります。次に、どの方法をどのように実行するか、そしてそれらをまとまりのあるものに統合する方法を決定する必要があります。最後に、十分な投資を行って、実際の言語(たとえば、典型的なコンピューター言語とDSL)で動作し、実際に何か役に立つことを行います。試してみてください。

あなたの努力を、私が15年前に始めたDMS Software Reengineering Toolkitと比較できます。DMSは、コードの汎用解析、分析、および変換を提供することを目的としています。明示的な言語仕様を指定すると、コードの解析、ASTの構築、ASTからのコードの再生成(プリティプリント)、ターゲットプログラミング言語で記述されたパターンを使用したコードの変換、シンボルテーブルの構築、制御とデータフローの計算などが行われます。 1つは、DMSにさまざまなエフェクトを実行させることです。(サイトのツールを参照してください。これらはすべて何らかの形式のDMSです)。

ここだDMS上の技術的な論文 ISは、数年前にあったように。(改善を続けています)

DMS自体の構築は困難でしたが、IBM COBOL、C#4.0、Java 1.7、C ++ 11(および他の多く)を含むDMSに実際の言語を定義するには、それに対応するエンジニアリングの大部分が必要であることがわかりました。

私たちが考えていること(合理的には):ツールを構築するコストを1〜2桁下げます。これが意味することは、そうでなければ1-10年かかるかもしれないタスクは、1ヶ月-1年のプロジェクトとして単なる人間によって考えられることができるということです。まだ簡単ではないこと:

  • 新しい言語の定義
  • 現在の言語のすべての熟語を処理する
  • タスク固有のカスタムコードを簡単に記述できるようにする
  • 新しい複雑な分析の定義
  • 部分的なプログラム、またはエラーを含むプログラムの処理
  • (最初の点まで)専門家でない人でも簡単にこれらのツールを使用できるようにする

だから、改善の余地はたくさんあります。多くの花を咲かせましょう。


0

この質問は、The Mythical Man Month、「Conceptual Integrity」セクションで回答された可能性があります。そうでない場合は、少なくともあなたの質問に非常に関連しています。Brooksはコンピューティングシステム全体の設計について説明していますが、このエッセイはフレームワークと新しい言語に完全に当てはまります。

テクノロジーの採用率とその概念的整合性と使いやすさの間には正の相関関係があると思います。この相関関係を証明するために、言語、フレームワーク、OSなどの最近のテクノロジーのケーススタディがあるはずですが、まだ何もわかっていません。


この答えの私の唯一の問題は、それが本当の価値を提供しないことです。書籍のセクションを参照しており、説明からソフトウェアパッケージがリリースされた後にのみ適用されます。リリース前の回答はありません。基本的には「使いやすく、ドメインに関連するものであればうまくいく」ということです。それがどれだけうまくいくかは言えません。なぜなら、それがまだあなたがそれを使うことができるポイントになっていないからです。コンパイラに関することは、山の半分しか登っていないことを認識するためだけに、あなたはたくさんの仕事をすることです。それは簡単なことです。
アレクサンダーモロウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.