これは、フレームワークの形式で言語設計で使用される概念を抽象化することを目的とする抽象化プロジェクトと呼ばれるプロジェクトに焦点を当てた一連の質問の一部です。
構造タイピングに関連する別のページは、ここで表示できます。フレームワークに関する質問と投稿する適切な場所に関連するメタトピックは、ここにあります。
言語開発フレームワークを使用するのはどれくらい簡単ですか?
大規模なコード生成フレームワークを作成しました。このフレームワークには、言語固有のコンパイラーに結果を送信する機能も含まれています。使いやすさのトピックは、そのようなフレームワークの例の1つです。CodeDOM、またはCode Document Object Modelです。
マイクロソフトによって書かれたフレームワークであり、一般的なコード構造を記述しますが、一般に多くのことを省き(式強制)、特定の構成体の表現では少し抽象的である傾向がありました。 CodeDOM は、使用されるタイプが汎用インターフェイスである場合、PrivateImplementationType
onの発行を適切に処理しません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));
フレームワークの焦点は、言語愛好家と、コードまたはアプリケーションの生成に興味がある人です。コンパイル、コード生成、および言語開発に重点を置いているため、フレームワークは使いやすさまたは生の力に焦点を当てるべきですか?
私の主な目標は、このようなツールの可用性を高めることです。そのため、ドメインに興味のある人は、言語中心のプロジェクトに取りかかる前に、言語理論の分野で多くの経験を必要としません。
私がフレームワークの作成者であることを考えると、「使いやすさ」に対する私の見解は偏っています。したがって、フォーカスと目標がプロジェクトに関連していない他の人にとって意味があるかどうか、別の人に尋ねなければなりません。