Це частина серії запитань, яка присвячена проекту, який називається "Абстракційний проект", який має на меті абстрагувати поняття, які використовуються в мовному дизайні у вигляді рамки.
Ще одну сторінку, пов’язану з нею, пов’язану зі структурним набором тексту, можна переглянути тут . Метатему, пов’язану із запитом про рамки та правильне місце для публікації, можна знайти тут .
Наскільки легко використовувати рамку розвитку мови?
Я написав широкомасштабні рамки генерації коду, які також включали можливість надсилати результат до мовного компілятора. Тема зручності використання походить з одного такого базового прикладу: CodeDOM або об'єктної моделі кодового документа.
Це рамка, написана корпорацією Майкрософт, яка описує загальні структури коду, але, як правило, залишає багато позаду (коерциції виразів) і, як правило, є дещо абстрактною у своєму представленні певних конструкцій, щоб прямо випромінювати поганий код на основі того, що ви робили: раніше CodeDOM погано обробляється випромінюють PrivateImplementationType
на CodeMemberMethod
, коли тип використовується був загальний інтерфейс. CodeDOM була моєю оригінальною причиною написання мого першого генератора коду.
Я намагаюся зробити, щоб спростити рамки, - це зменшити кількість роботи, яку потрібно зробити, і зосередитись на діях, порівняно з певними типами, які складають ці дії.
Ось поряд із порівнянням того, як працює рамка, яку я пишу:
//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));
Versus 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));
Основна увага в рамках основної уваги - ентузіасти мови, а також зацікавлені у створенні коду чи програм. Зважаючи на його спрямованість на компіляцію, генерування коду та розвиток мови, чи повинна основна увага зосереджуватись на простоті використання чи сировині?
Моя основна мета - збільшити доступність таких інструментів, тому тим, хто цікавиться доменом, не потрібно багато досвіду в галузі теорії мови, перш ніж вони можуть почати працювати над власними мовно-орієнтованими проектами.
З огляду на те, що я автор рамки, мій погляд на "зручність використання" є необ'єктивним. Таким чином, я повинен запитати іншого, чи має значення фокус і мета для інших, які не пов'язані з проектом.