Кодирование семантики
Семантическое кодирование — это перевод между формальными языками . Для программистов наиболее знакомой формой кодирования является компиляция языка программирования в машинный код или байт-код. Преобразование между форматами документов также является формой кодирования. Компиляция документов TeX или LaTeX в PostScript также является часто встречающимся процессом кодирования. Некоторые препроцессоры высокого уровня, такие как , OCaml Camlp4 также включают кодирование одного языка программирования в другой.
Формально кодирование языка A в язык B — это отображение всех терминов A в B. Если существует удовлетворительное кодирование A в B, B считается, по крайней мере, таким же мощным (или, по крайней мере, столь же выразительным ), как и A.
Характеристики
[ редактировать ]Неформального понятия перевода недостаточно, чтобы помочь определить выразительность языков, поскольку оно допускает тривиальные кодировки, такие как отображение всех элементов A на один и тот же элемент B. Следовательно, необходимо определить определение «достаточно хорошего» кодирования. . Это понятие варьируется в зависимости от приложения.
Обычно кодировка Ожидается, что он сохранит ряд свойств.
Сохранение композиций
[ редактировать ]- надежность
- Для каждого n-арного оператора оператора A существует n-арный оператор из B такой, что
- полнота
- Для каждого n-арного оператора оператора A существует n-арный оператор из B такой, что
(Примечание: насколько известно автору, этот критерий полноты никогда не используется.)
Сохранение составов полезно, поскольку оно гарантирует, что компоненты можно будет исследовать по отдельности или вместе, не «нарушая» каких-либо интересных свойств. В частности, в случае компиляций эта корректность гарантирует возможность приступить к отдельной компиляции компонентов, а полнота гарантирует возможность декомпиляции.
Сохранение сокращений
[ редактировать ]Это предполагает существование понятия редукции как в языке A, так и в языке B. Обычно в случае языка программирования редукция — это отношение, которое моделирует выполнение программы.
Мы пишем за одну ступень снижения и для любого числа шагов приведения.
- надежность
- Для каждого условия языка А, если затем .
- полнота
- За каждый срок языка А и всех терминов языка B, если тогда существует некоторый такой, что .
Такое сохранение гарантирует, что оба языка ведут себя одинаково. Правильность гарантирует сохранение всех возможных вариантов поведения, а полнота гарантирует, что кодирование не добавляет никакого поведения. В частности, в случае компиляции языка программирования корректность и полнота вместе означают, что скомпилированная программа ведет себя в соответствии с семантикой высокого уровня языка программирования.
Сохранение прекращения
[ редактировать ]Это также предполагает существование понятия редукции как в языке A, так и в языке B.
- надежность
- на любой срок , если все сокращения сходятся, то все редукции сходиться.
- полнота
- на любой срок , если все сокращения сходятся, то все редукции сходиться.
В случае компиляции языка программирования надежность гарантирует, что компиляция не приводит к незавершению, например бесконечным циклам или бесконечным рекурсиям. Свойство полноты полезно, когда язык B используется для изучения или тестирования программы, написанной на языке A, возможно, путем извлечения ключевых частей кода: если это исследование или тест доказывает, что программа завершается на B, то она также завершается на A.
Сохранение наблюдений
[ редактировать ]Это предполагает существование понятия наблюдения как на языке A, так и на языке B. В языках программирования типичными наблюдаемыми являются результаты ввода и вывода, в отличие от чистых вычислений. В языке описания, таком как HTML , типичная наблюдаемая величина является результатом рендеринга страницы.
- надежность
- для каждого наблюдаемого в терминах A существует наблюдаемая таких членов B, что для любого термина с наблюдаемым , имеет наблюдаемый .
- полнота
- для каждого наблюдаемого в терминах A существует наблюдаемая на условиях B так, что для любого члена с наблюдаемым , имеет наблюдаемый .
Сохранение симуляций
[ редактировать ]Это предполагает существование понятия моделирования как на языке A, так и на языке B. На одном языке программирования программа имитирует другой, если она может выполнять все те же (наблюдаемые) задачи и, возможно, некоторые другие. Моделирование обычно используется для описания оптимизации во время компиляции.
- надежность
- на каждое условие , если имитирует затем имитирует .
- полнота
- на каждое условие , если имитирует затем имитирует .
Сохранение симуляций — гораздо более сильное свойство, чем сохранение наблюдений, которое оно влечет за собой. В свою очередь оно слабее свойства сохранения бисимуляций . Как и в предыдущих случаях, достоверность важна для компиляции, а полнота полезна для тестирования или подтверждения свойств.
Сохранение эквивалентностей
[ редактировать ]Это предполагает существование понятия эквивалентности как на языке A, так и на языке B. Обычно это может быть понятие равенства структурированных данных или понятие синтаксически разных, но семантически идентичных программ, таких как структурное соответствие или структурная эквивалентность.
- надежность
- если два срока и эквивалентны в A, то и эквивалентны в B.
- полнота
- если два срока и эквивалентны в B, то и эквивалентны в А.
Сохранение дистрибуции
[ редактировать ]Это предполагает существование понятия распределения как на языке A, так и на языке B. Обычно для компиляции распределенных программ, написанных на Acute , JoCaml или E, это означает распределение процессов и данных между несколькими компьютерами или процессорами.
- надежность
- если срок представляет собой композицию двух агентов затем должна состоять из двух агентов .
- полнота
- если срок представляет собой композицию двух агентов затем должна состоять из двух агентов такой, что и .