Добрый вечер всем!
Тут подумалась интересная учебная задача: написать статический анализатор, верифицирующий программы на языке Урбана Мюллера. На самом деле этот язык называется иначе, но из соображений благозвучия я буду называть его по имени автора.
Это минималистичный полный по Тьюрингу язык (алгоритмическая полнота доказана). Синтаксис определяется следующей грамматикой:
PROGRAM = CODE
CODE = "+" | "−" | "<" | ">" | "." | "," | CODE CODE | "[" CODE "]"
Семантика описывается в терминах машины, похожей на машину Тьюринга. Есть полубесконечная лента, в ячейках которой находятся байты, т.е. целые числа от 0 до 255. По ней ползает головка. Операции языка:
• "+" и "−" инкрементируют и декрементируют текущую ячейку,
• "<" и ">" сдвигают головку влево и вправо соответственно,
• "." отправляет байт в текущей ячейке на устройство вывода,
• "," считывает байт с устройства ввода и записывает в текущую ячейку,
• CODE1 CODE2 означает конкатенацию двух программ, сначала выполнить CODE1, потом CODE2,
• "[" CODE "]" — повторять CODE до тех пор, пока в текущей ячейке не ноль.
Изначально головка находится в крайне левой позиции, все ячейки ленты заполнены нулями.
Задача верификатора определить, не происходит ли арифметического переполнения (декремента нуля или инкремента 255) и выхода за границы ленты.
Если я достаточно разберусь в верификации программ, предложу эту задачу на курсовую работу по компиляторам на следующий код. Или на диплом.
Интересно, на Агде можно написать DSL с типами, описывающий только корректные программы на языке Урбана Мюллера?
С уважением,
Александр Коновалов
Добрый вечер всем!
Тут подумалась интересная учебная задача: написать статический анализатор, верифицирующий программы на языке Урбана Мюллера. На самом деле этот язык называется иначе, но из соображений благозвучия я буду называть его по имени автора.
Это минималистичный полный по Тьюрингу язык (алгоритмическая полнота доказана). Синтаксис определяется следующей грамматикой:
PROGRAM = CODE
CODE = "+" | "−" | "<" | ">" | "." | "," | CODE CODE | "[" CODE "]"Семантика описывается в терминах машины, похожей на машину Тьюринга. Есть полубесконечная лента, в ячейках которой находятся байты, т.е. целые числа от 0 до 255. По ней ползает головка. Операции языка:
• "+" и "−" инкрементируют и декрементируют текущую ячейку,
• "<" и ">" сдвигают головку влево и вправо соответственно,
• "." отправляет байт в текущей ячейке на устройство вывода,
• "," считывает байт с устройства ввода и записывает в текущую ячейку,
• CODE1 CODE2 означает конкатенацию двух программ, сначала выполнить CODE1, потом CODE2,
• "[" CODE "]" — повторять CODE до тех пор, пока в текущей ячейке не ноль.Изначально головка находится в крайне левой позиции, все ячейки ленты заполнены нулями.
Задача верификатора определить, не происходит ли арифметического переполнения (декремента нуля или инкремента 255) и выхода за границы ленты.
Если я достаточно разберусь в верификации программ, предложу эту задачу на курсовую работу по компиляторам на следующий код. Или на диплом.
Интересно, на Агде можно написать DSL с типами, описывающий только корректные программы на языке Урбана Мюллера?
С уважением,
Александр Коновалов
Добрый вечер!
Понятно, что задача неразрешимая. Но для любой неразрешимой задачи, требующей ответа «да/нет», можно дать приближённое решение «да/нет/не знаю». И чем меньше область этого «не знаю», тем решение точнее.
«Бедный студент! Пожалейте!»
Да, сам понял это спустя некоторое время после отправки письма.
Но автоматически распознавать какие-нибудь простые классы заведомо корректных и заведомо некорректных программ уже интересно. Например, если можно доказать, что с каждым символом программы ассоциирована конкретная ячейка ленты (т.е. всегда, когда выполняется i-я команда, головка находится над j-й ячейкой), то программа удовлетворяет двум свойствам: (а) она использует конечную память, (б) головка не выходит за пределы ленты. Думаю, распознавать такие программы можно абстрактной интерпретацией (не все, конечно, т.к. все невозможно) и такое под силу студенту.
Более сложное свойство — доказать для такой программы (с конечной памятью), что нигде не происходит переполнения вниз или вверх. Причём переполнение снизу распознавать проще, т.к. ноль учитывается управляющей конструкцией — циклом. Если совершён выход из цикла, значит в этой ячейке заведомый ноль и декрементировать её нельзя. Если мы вошли в цикл, значит, в ячейке не ноль, и декрементировать её один раз гарантированно безопасно. В остальных случаях декремент выполняется над неизвестным значением.
Кстати, трансляция языка Урбана Мюллера в язык Си задаётся следующей процедурой. Напомню грамматику:
PROGRAM = CODE
CODE = "+" | "−" | "<" | ">" | "." | "," | CODE CODE | "[" CODE "]"
Сама процедура описывается функцией C(…):
C(PROGRAM) ::=
int main() {
char tape[MAX] = { '\0' };
char *head = &tape[0];
C(CODE)
return 0;
}
C("+") ::= ++*head;
C("−") ::= −−*head;
C("<") ::= −−head;
C(">") ::= ++head;
C(".") ::= putchar(*head);
C(",") ::= *head = getchar();
C(CODE1 CODE2) ::= C(CODE1) C(CODE2)
C("[" CODE "]") ::= while (*head) { C(CODE) }
Есть и другая задача, проще. Взять готовый верификатор языка Си (или модел-чекер, я пока в них не разобрался), скормить ему оттранслированную программу с языка У. М. и посмотреть на результат.
С уважением,
Александр Коновалов
--
Вы получили это сообщение, поскольку подписаны на группу "Метавычисления и специализация программ".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес metacomputation...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/metacomputation-ru/CAM7HiMmbKOR%2Bv-UjW5kgKbS%2BeT4pE51ywLu0s5R7AoCYR-BFYQ%40mail.gmail.com.
Есть и другая задача, проще. Взять готовый верификатор языка Си (или модел-чекер, я пока в них не разобрался), скормить ему оттранслированную программу с языка У. М. и посмотреть на результат.
Добрый день, Андрей!
Спасибо за ответ. Тему верификации программ мне ещё изучать и изучать.
Смотрю на свои границы незнания и аж страшно становится: верификация программ, частичные вычисления, логика, теория категорий…
С уважением,
Александр Коновалов
From: metacompu...@googlegroups.com <metacompu...@googlegroups.com> On Behalf Of Andrei Klimov
Sent: Saturday, March 20, 2021 10:42 PM
To: metacomputation-ru <metacompu...@googlegroups.com>
Subject: Re: Верификатор языка Урбана Мюллера
On Sat, Mar 20, 2021 at 9:32 PM 'Александр Коновалов' via Метавычисления и специализация программ <metacompu...@googlegroups.com> wrote:
--
Вы получили это сообщение, поскольку подписаны на группу "Метавычисления и специализация программ".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес metacomputation...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/metacomputation-ru/CAM7HiM%3DWXCfqLPjv5VnBAKhx7n6sXVD7HHaQp%2BVhbw9LKG91sg%40mail.gmail.com.
Прошу прощения за спам. В предыдущем письме забыл спросить.
А с чего мне лучше изучать тему верификации программ? Есть ли какие-нибудь хорошие учебники или обзорные книги на эту тему?
С уважением,
Александр Коновалов
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/metacomputation-ru/019201d71fee%245fcb8590%241f6290b0%24%40mail.ru.
Добрый день, Андрей!
Спасибо за ответ. Тему верификации программ мне ещё изучать и изучать.
Смотрю на свои границы незнания и аж страшно становится: верификация программ, частичные вычисления, логика, теория категорий…
Прошу прощения за спам. В предыдущем письме забыл спросить.
А с чего мне лучше изучать тему верификации программ? Есть ли какие-нибудь хорошие учебники или обзорные книги на эту тему?
Добрый день, Андрей!
«ещё бы я посоветовал отслеживать линию статической типизации»
С этой темой я более-менее знаком, не знаю только зависимые типы. Кстати, вывод параметрических типов Хиндли-Милнера входит и в промышленные языки, например модный на сегодня Rust основан на нём.
Про соответствие Карри-Ховарда мне нужно будет почитать лекции Антонины. Так до них ещё и не добрался.
Спасибо!
Александр Коновалов
From: metacompu...@googlegroups.com <metacompu...@googlegroups.com> On Behalf Of Andrei Klimov
Sent: Tuesday, March 23, 2021 11:06 PM
To: metacomputation-ru <metacompu...@googlegroups.com>
Subject: Re: Верификатор языка Урбана Мюллера
On Tue, Mar 23, 2021 at 5:11 PM 'Александр Коновалов' via Метавычисления и специализация программ <metacompu...@googlegroups.com> wrote:
--
Вы получили это сообщение, поскольку подписаны на группу "Метавычисления и специализация программ".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес metacomputation...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/metacomputation-ru/CAM7HiMkE3sLB7b1tV_wNtL3hOkOm03YmwZf5OFP_RfOFY85c5Q%40mail.gmail.com.