Это часть серии вопросов, посвященных проекту под названием «Проект абстракции», целью которого является абстрагирование понятий, используемых в языковом дизайне, в форме фреймворка.
Другая связанная с ним страница, связанная со структурной типизацией, может быть просмотрена здесь . Мета-тема, связанная с запросом о фреймворке и подходящем месте для публикации, находится здесь .
Насколько легко должно быть использование Language Development Framework?
Я написал крупномасштабные фреймворки для генерации кода, которые также включали возможность отправки результата компилятору для конкретного языка. Тема простоты использования возникает из одного такого примера структуры: CodeDOM или объектная модель документа кода.
Это среда, написанная Microsoft, которая описывает общие структуры кода, но, как правило, многое исключает (приведение выражений) и имеет тенденцию быть немного абстрактной в представлении определенных конструкций, чтобы прямо испускать плохой код, основанный на том, что вы делали: ранее 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));
В сравнении с 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));
В центре внимания платформы языковые энтузиасты, а также те, кто заинтересован в создании кода или приложений. Учитывая фокусировку на компиляции, генерации кода и разработке языка, должна ли инфраструктура быть нацелена на простоту использования или простую мощь?
Моя основная цель - повысить доступность таких инструментов, чтобы тем, кто интересуется этой областью, не требовался большой опыт в области теории языка, прежде чем они могли бы начать работать над своими собственными языковыми проектами.
Учитывая, что я являюсь автором фреймворка, мой взгляд на «юзабилити» предвзят. Таким образом, я должен спросить другого, имеют ли смысл и цель смысл для тех, кто не связан с проектом.