Наскільки простою повинна бути система мовної розробки?


11

Це частина серії запитань, яка присвячена проекту, який називається "Абстракційний проект", який має на меті абстрагувати поняття, які використовуються в мовному дизайні у вигляді рамки.

Ще одну сторінку, пов’язану з нею, пов’язану зі структурним набором тексту, можна переглянути тут . Метатему, пов’язану із запитом про рамки та правильне місце для публікації, можна знайти тут .

Наскільки легко використовувати рамку розвитку мови?

Я написав широкомасштабні рамки генерації коду, які також включали можливість надсилати результат до мовного компілятора. Тема зручності використання походить з одного такого базового прикладу: 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));

Основна увага в рамках основної уваги - ентузіасти мови, а також зацікавлені у створенні коду чи програм. Зважаючи на його спрямованість на компіляцію, генерування коду та розвиток мови, чи повинна основна увага зосереджуватись на простоті використання чи сировині?

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

З огляду на те, що я автор рамки, мій погляд на "зручність використання" є необ'єктивним. Таким чином, я повинен запитати іншого, чи має значення фокус і мета для інших, які не пов'язані з проектом.


1
Ви повинні задати це питання на codereview.stackexchange.com .
Роберт Харві

6
Питання про те, чи має бути рамка проста у використанні за рахунок сировинної енергії, зовсім не підходить для Code Review.SE, де "архітектура вищого рівня та дизайн програмних систем" не є Тема там, і є темою тут. Перегляд коду - це коли ви маєте робочий код і хочете критики.

Вхід до генератора коду - лише інша мова програмування. Прагнення до створення коду означає, що мова, яку ви генеруєте, недостатньо потужна. Кращі мови мають вбудовані генератори коду.
Кевін Клайн

@kevincline Типовим випадком використання для генератора коду є специфічна для домену мова, яка використовує рамки генерації коду загального призначення. Це насправді не є великим вибором, альтернативою було б скласти свою власну внутрішню проміжну мову та інтерпретувати її через VM або перекласти її в конструкцію нижчого рівня, але врешті-решт ти робиш те саме . Це те, що ця рамка має на меті зробити, коли вам потрібно виконати роботу, щоб динамічно генерувати код, ви використовуватимете це, а не крилати власну реалізацію того самого.
Аллен Кларк Коупленд-молодший

Справа не стільки в тому, що мова-джерело недостатня, це те, що граматика мови - це лише текст, поки не буде написано посередницьке програмне забезпечення для перекладу з вихідного тексту на цільову платформу. У цьому випадку це загальна мовна інфраструктура (CLI) або код загальномовними мовами, націлений на CLI. Рамка має на меті впоратися з бурхливою роботою взяття представлень на високому рівні та перетворення їх на досить низькі конструкції для створення IL. тобто компілятор, тому що вам потрібен компілятор, це не означає, що ваша мова недостатньо потужна. Це потрібно.
Аллен Кларк Коупленд-молодший

Відповіді:


2

Це складно створити рамки розвитку мови. Ви повинні вирішити, які саме речі ви хочете, щоб вони підтримували, тоді ви повинні вирішити, які з тих, кого ви начебто знаєте, як робити, і як їх об'єднати в цілісне ціле. Нарешті, ви зробите достатньо інвестицій, щоб вона працювала з реальними мовами (наприклад, типовими комп'ютерними мовами, а також DSL) і насправді робить щось корисне. Моя шапка знята для вас за спробу.

Ви можете порівняти свої зусилля з тим, який я розпочав 15 років тому, інструментарієм перепроектування програмного забезпечення DMS . DMS призначений для загального розбору, аналізу та перетворення коду. З урахуванням явної специфікації мови, він буде аналізувати код, будувати AST, регенерувати код з ASTs (niceprint), трансформувати код за допомогою шаблонів, написаних цільовою мовою програмування, будувати таблиці символів, керувати обчисленнями та потоком даних тощо. Додавши спеціальний код, один змушує DMS здійснювати найрізноманітніші ефекти. (Дивіться інструменти на сайті; вони всі DMS в тій чи іншій формі).

Ось технічний документ про DMS, як це було кілька років тому. (Ми продовжуємо її вдосконалювати)

Незважаючи на те, що DMS самостійно було важко побудувати, ми виявили, що для визначення реальних мов для DMS потрібна була відповідно велика частина техніки, включаючи IBM COBOL, C # 4.0, Java 1.7, C ++ 11 (та багато інших).

Ми вважаємо, що це (досить добре): знизити вартість будівельних інструментів на 1-2 порядки. Це означає, що завдання, які в іншому випадку можуть зайняти 1-10 років, можуть розглядатися простими смертними як проекти на один місяць-1 рік. Що ще не просто:

  • Визначення нових мов
  • Поводження з усіма ідіозіями сучасних мов
  • Полегшаючи написання спеціального коду, специфічного для вашого завдання
  • Визначення нових складних аналізів
  • Обробка часткових програм або програм, що містять помилки
  • (До вашого початкового пункту) Зробіть полегшення для неекспертів використання цих інструментів

Отже, є багато можливостей для вдосконалення. Нехай зацвітає багато квітів.


0

На це питання, можливо, відповіли в Міфічному місяці людини, в розділі "Концептуальна цілісність". Якщо ні, то, принаймні, дуже важливо для вашого питання. Навіть незважаючи на те, що Брукс описує архітектуру цілої обчислювальної системи, есе чудово застосовується до рамок і нових мов.

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


Єдине моє питання з цією відповіддю полягає в тому, що воно не надає реальної цінності. Чи є посилання розділом книги, і з вашого опису буде застосовна лише після випуску програмного пакету. Це не дає мені відповіді перед випуском, тому що в основному він говорить: "Це буде добре, якщо він простий у використанні та стосується домену". Я не можу сказати, наскільки це буде добре, оскільки це ще не до того, де ви можете ним скористатися. Справа з компіляторами полягає в тому, що ви багато і багато працюєте, тільки щоб зрозуміти, що ви лише на півдорозі гори, і це легка частина.
Аллен Кларк Коупленд-молодший
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.