Засіб програмування мови семантики програмування


11

Чи є який-небудь інструмент для прототипування семантики мови та системи типу програмування, який також дозволяє перевірити типові моделі стандартних властивостей, наприклад, міцність типу?

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

Я знаю про Отта , але він не має такої можливості "перевірки моделі", оскільки він орієнтований на генерування коду для систем допоміжних перевірок.

Будь-яка посилання на існування такого інструменту було б добре.


1
Отт - перший крок, тоді ви робите перевірку моделі у своєму улюбленому помічнику.
Жил "ТАК - перестань бути злим"

@Gilles: Гаразд, але важливим моментом інструменту перевірки моделі є те, що він генерує цілий набір елементів заданого розміру, щоб перевірити, чи дійсно властивість для них дійсна. Таким чином, мені потрібно буде кодувати цю частину покоління для кожної визначеної мови. Чи знали ви, чи є спосіб автоматизувати цей покоління?
Родріго Рібейро

Технічно це можна зробити в помічнику (хоча б в такому, як Coq), але це, мабуть, буде дуже повільно. Асистенти-кореспонденти орієнтовані на докази людей, а не автоматично намагаються мільйони способів усунути проблему. Якщо ви хочете повторно використовувати Ott, ви можете додати допоміжний сервер для своєї улюбленої моделі перевірки.
Жил 'SO- перестань бути злим'

Відповіді:


8

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

Маючи це на увазі, ви можете скористатися декількома (можливо, не настільки різними) альтернативами (які включають ті, про які ви вже згадували):

  • з використанням конкретної мови / рамки, призначеної для створення та прототипування нових мов: як приклад, 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.