Хоча існують рамки, створені спеціально з метою прототипування мов програмування (включаючи їх семантику, системи типів, оцінку, а також перевірку властивостей щодо них), найкращий вибір залежить від вашого конкретного випадку та конкретних потреб.
Маючи це на увазі, ви можете скористатися декількома (можливо, не настільки різними) альтернативами (які включають ті, про які ви вже згадували):
- з використанням конкретної мови / рамки, призначеної для створення та прототипування нових мов: як приклад, Redex [1], доменна мова, вбудована в Ракетку, для визначення та перевірки (оперативної) семантики мов програмування, яка, з огляду на визначення мова, забезпечує легке впорядкування таких завдань, як набір тексту (у латекс), перевірка слідів скорочення, одиничне тестування та випадкове тестування (наприклад, для перевірки набору тексту)
- використання загальних мов моделювання, які пропонують легко визначати та виконувати певні аналізи, якщо вони можуть охопити конкретну мову під рукою в необхідній мірі; Сплав [2] є прикладом такого підходу: хоч і досить загальний і гнучкий, мови можна моделювати як відносини між державами, тоді як підтримка перевірки моделі (наприклад, оцінка в рамках такої мови) надається безкоштовно після вираження семантики з модель відношення (наприклад, деякі ідеї для моделювання семантики мови можна знайти в [3])
- вбудовування мови для перевірки його властивостей за допомогою доказів теореми; приклад може визначити мову та її семантику шляхом вбудовування її в систему доказів типу Coq [4] (детальніше про цей підхід, а також обговорення та демонстрація різниці між глибоким і неглибоким вбудовуванням у Coq наведено у [ 5])
- використання Ott (як уже згадувалося, з духом схожим на Redex, але надання нової мови визначення, а не вбудованої); Ott дозволяє визначити мову програмування в зручній нотації, а також створити набір і визначення в системі перевірки (як правило, з глибоким вбудовуванням), де більшість перевірок (тобто доказів) потрібно проводити вручну
- розробка мови та її семантики, а також відповідні перевірки (наприклад, як тести) «з нуля» в мові програмування загального призначення та за потреби перекладу в інші системи для перевірки (деякі мови, як-от Леон [6], включити вбудовані верифікатори, які дозволяють автоматично доводити певні властивості та роблять такий підхід подібним до вбудовування в систему перевірки)
Зауважте, що існує компроміс між тим, наскільки просто використовувати рамку / інструмент (наприклад, так просто, як викладення визначення на папері або в латексі), і наскільки потужними є механізми перевірки властивостей мови (наприклад, вбудовування мова в теоремі може підтвердити дуже детальні властивості).
[1] Кейсі Кляйн, Джон Клементс, Крістос Дімулас, Карл Істлунд, Маттіас Феллейзен, Меттью Флетт, Джей А. Маккарті, Джон Рафкінд, Сем Тобін-Хохштадт та Роберт Брюс Філлер. Проведіть своє дослідження: Ефективність легкої механізації. POPL, 2012 рік.
[2] Деніел Джексон. Сплав: легкий предмет, що моделює позначення. TOSEM, 2002.
[3] Грег Денніс, Фелікс Чанг, Даніель Джексон. Модульна перевірка коду за допомогою SAT. ISSTA, 2006
[4] Система управління офіційними доказами Coq
[5] Формальне обґрунтування програм. Адам Чліпала, 2016 рік
[6] Леон автоматизована система для перевірки, ремонту та синтезу функціональних програм Scala