Это часть серии вопросов, посвященных проекту под названием «Проект абстракции», целью которого является абстрагирование понятий, используемых в языковом дизайне, в форме фреймворка.
Другая связанная с ним страница, связанная со структурной типизацией, может быть просмотрена здесь . Мета-тема, связанная с запросом о фреймворке и подходящем месте для публикации, находится здесь .
Насколько легко должно быть использование 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));
В центре внимания платформы языковые энтузиасты, а также те, кто заинтересован в создании кода или приложений. Учитывая фокусировку на компиляции, генерации кода и разработке языка, должна ли инфраструктура быть нацелена на простоту использования или простую мощь?
Моя основная цель - повысить доступность таких инструментов, чтобы тем, кто интересуется этой областью, не требовался большой опыт в области теории языка, прежде чем они могли бы начать работать над своими собственными языковыми проектами.
Учитывая, что я являюсь автором фреймворка, мой взгляд на «юзабилити» предвзят. Таким образом, я должен спросить другого, имеют ли смысл и цель смысл для тех, кто не связан с проектом.
источник
Ответы:
Трудно построить структуру языкового развития. Вы должны решить, какие вещи вы хотите, чтобы он поддерживал, затем вы должны решить, какие из них вы знаете, как делать, и как объединить их в единое целое. Наконец, вы вложили достаточно средств, чтобы он работал с реальными языками (например, с типичными компьютерными языками, а также с DSL) и фактически делал что-то полезное. Моя шляпа тебе снята за попытку.
Вы можете сравнить свои усилия с тем, что я начал 15 лет назад, с DMS Software Reengineering Toolkit . DMS предназначен для обеспечения общего анализа, анализа и преобразования кода. При наличии явной спецификации языка он анализирует код, создает AST, восстанавливает код из AST (prettyprint), преобразует код с использованием шаблонов, написанных на целевом языке программирования, создает таблицы символов, вычисляет управление и поток данных и т. Д. Добавляя собственный код, одна заставляет DMS осуществлять широкий спектр эффектов. (Смотрите инструменты на сайте; они все DMS в той или иной форме).
Вот технический документ по DMS, который был несколько лет назад. (Мы продолжаем улучшать это)
Хотя саму DMS было сложно построить, мы обнаружили, что для определения реальных языков для DMS потребовался, соответственно, большой объем разработки, включая IBM COBOL, C # 4.0, Java 1.7, C ++ 11 (и многие другие).
Что мы думаем, что это делает (достаточно хорошо): снизить стоимость строительных инструментов на 1-2 порядка. Это означает, что задачи, которые в противном случае могут занять 1-10 лет, могут рассматриваться простыми смертными как проекты от 1 месяца до 1 года. Что еще не так просто:
Таким образом, есть много возможностей для улучшения. Пусть расцветает много цветов.
источник
На этот вопрос, возможно, ответили в «Мифическом месяце человека», в разделе «Концептуальная целостность». Если нет, то это как минимум очень актуально для вашего вопроса. Хотя Брукс описывает архитектуру всей вычислительной системы, эссе прекрасно применимо к фреймворкам и новым языкам.
Я считаю, что существует положительная корреляция между скоростью принятия любой технологии и ее концептуальной целостностью и простотой использования. Должно быть тематическое исследование недавних технологий, таких как языки, платформы и ОС, чтобы доказать эту корреляцию, но пока не известно ни об одной.
источник