Насколько легко должна использоваться среда разработки языка?


11

Это часть серии вопросов, посвященных проекту под названием «Проект абстракции», целью которого является абстрагирование понятий, используемых в языковом дизайне, в форме фреймворка.

Другая связанная с ним страница, связанная со структурной типизацией, может быть просмотрена здесь . Мета-тема, связанная с запросом о фреймворке и подходящем месте для публикации, находится здесь .

Насколько легко должно быть использование 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));

В центре внимания платформы языковые энтузиасты, а также те, кто заинтересован в создании кода или приложений. Учитывая фокусировку на компиляции, генерации кода и разработке языка, должна ли инфраструктура быть нацелена на простоту использования или простую мощь?

Моя основная цель - повысить доступность таких инструментов, чтобы тем, кто интересуется этой областью, не требовался большой опыт в области теории языка, прежде чем они могли бы начать работать над своими собственными языковыми проектами.

Учитывая, что я являюсь автором фреймворка, мой взгляд на «юзабилити» предвзят. Таким образом, я должен спросить другого, имеют ли смысл и цель смысл для тех, кто не связан с проектом.


1
Вы должны задать этот вопрос на codereview.stackexchange.com .
Роберт Харви

6
Вопрос о том, должна ли инфраструктура быть простой в использовании за счет необработанных ресурсов, вовсе не подходит для Code Review.SE, где «Архитектура более высокого уровня и проектирование программных систем» не тема есть, и есть по теме здесь. Code Review предназначен для случаев, когда у вас есть рабочий код, и вы хотите критиковать.

Вход в генератор кода - это просто еще один язык программирования. Стремление к генерации кода означает, что генерируемый вами язык недостаточно мощный. Лучшие языки имеют встроенные генераторы кода.
Кевин Клайн

@kevincline Типичным примером использования генератора кода является предметно-ориентированный язык, в котором используется универсальная среда генерации кода. Это не очень хороший выбор, альтернативой может быть компиляция на ваш собственный промежуточный промежуточный язык и интерпретация его через виртуальную машину, или перевод его самостоятельно в конструкцию более низкого уровня, но в конце вы делаете то же самое , Это то, на что нацелена эта инфраструктура: когда вам нужно выполнить работу для динамического генерирования кода, вы должны использовать это, а не использовать собственную реализацию того же самого.
Аллен Кларк Коупленд-младший

Дело не в том, что исходного языка недостаточно, а в том, что грамматика языка - это просто текст, пока не будет написано промежуточное программное обеспечение для перевода исходного текста на целевую платформу. В данном случае это CLI (Common Language Infrastructure) или код на языках общего назначения, которые нацелены на CLI. Эта структура направлена ​​на то, чтобы справляться с тяжелой работой: брать представления высокого уровня и переводить их в достаточно низкоуровневые конструкции для генерации IL. т.е. компилятор, просто потому, что вам нужен компилятор, не означает, что ваш язык недостаточно мощный. Это обязательно.
Аллен Кларк Коупленд-младший

Ответы:


2

Трудно построить структуру языкового развития. Вы должны решить, какие вещи вы хотите, чтобы он поддерживал, затем вы должны решить, какие из них вы знаете, как делать, и как объединить их в единое целое. Наконец, вы вложили достаточно средств, чтобы он работал с реальными языками (например, с типичными компьютерными языками, а также с 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 года. Что еще не так просто:

  • Определение новых языков
  • Обработка всех идиотизм современных языков
  • Упрощение написания специального кода для вашей задачи
  • Определение новых, сложных анализов
  • Обработка частичных программ или программ, содержащих ошибки
  • (К исходной точке) Сделайте так, чтобы неопытные могли использовать эти инструменты

Таким образом, есть много возможностей для улучшения. Пусть расцветает много цветов.


0

На этот вопрос, возможно, ответили в «Мифическом месяце человека», в разделе «Концептуальная целостность». Если нет, то это как минимум очень актуально для вашего вопроса. Хотя Брукс описывает архитектуру всей вычислительной системы, эссе прекрасно применимо к фреймворкам и новым языкам.

Я считаю, что существует положительная корреляция между скоростью принятия любой технологии и ее концептуальной целостностью и простотой использования. Должно быть тематическое исследование недавних технологий, таких как языки, платформы и ОС, чтобы доказать эту корреляцию, но пока не известно ни об одной.


Моя единственная проблема с этим ответом - он не дает никакой реальной ценности. Это ссылки на раздел книги и из вашего описания будет применимо только после того, как пакет программного обеспечения был выпущен. Он не дает мне ответа до релиза, так как в основном говорит: «Это будет хорошо, если он прост в использовании и имеет отношение к домену». Я не могу сказать, насколько хорошо это будет сделано, потому что это еще не до такой степени, когда вы можете использовать его. Дело в том, что с компиляторами вы выполняете много-много работы только для того, чтобы понять, что вы только на полпути в гору, и это легко.
Аллен Кларк Коупленд-младший
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.