Когда я должен использовать мелкое и глубокое встраивание Розетты для синтеза программ? - PullRequest
0 голосов
/ 10 декабря 2018

В некоторых руководствах по Розетка представлен синтез программ с использованием неглубокое встраивание и другие с использованием глубокое встраивание .

После прочтения Torlak et Bodik's «Рост числа решаемых с помощью ROSETTE языков» , кажется, что поверхностное встраивание хорошо для быстрого прототипирования (так как не требует определения DSL и интерпретатора), а глубокое встраивание хорошо для выполнения запросов с более сильными гарантиями корректности.Является ли это хорошим эмпирическим правилом для принятия решения о том, какое встраивание использовать?

Каковы веские причины для использования мелкого и глубокого встраивания Розетты для синтеза программ?

1 Ответ

0 голосов
/ 11 декабря 2018

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

Глубокое встраивание - этолучший выбор, если вы выполняете программный синтез и ищете (значения, которые представляют) код.

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

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

При глубоком внедрении вы полностью контролируете пространство программ, которые будут искать.По сути, вы можете написать произвольные функции Rosette / Racket, чтобы сгенерировать символическую программу, которая представляет все конкретные программы для поиска.Затем вы также имеете полный контроль над последним этапом - генерацией кода.Как только Rosette возвращает значение (например, AST), которое представляет программу в вашем глубоком встраивании, вы можете обработать ее так, как вы хотите сгенерировать код.При поверхностном встраивании вы ограничены использованием встроенного генератора кода Rosette.

Итак, чтобы сделать вывод, что если вы делаете или планируете делать синтез, используйте глубокое встраивание.Для всего остального (проверка и ангельское выполнение) поверхностное встраивание будет легче и быстрее.

...