A кодировка семантики - это перевод между формальными языками. Для программистов наиболее знакомая форма кодирования - это компиляция языка программирования в машинный код или байт-код. Преобразование между форматами документов также является формой кодирования. Компиляция документов TeX или LaTeX в PostScript также часто встречается в процессах кодирования. Некоторые препроцессоры высокого уровня, такие как OCaml Camlp4, также включают кодирование одного языка программирования в другой.
Формально, кодирование языка A в язык B - это отображение всех терминов A в B. Если существует удовлетворительное кодирование A в B, B считается по крайней мере столь же мощным (или, по крайней мере, как выразительный) как A.
Содержание
- 1 Свойства
- 1.1 Сохранение композиций
- 1.2 Сохранение сокращений
- 1.3 Сохранение окончаний
- 1.4 Сохранение наблюдений
- 1.5 Сохранение моделирования
- 1.6 Сохранение эквивалентностей
- 1.7 Сохранение распределения
- 2 См. Также
- 3 Внешние ссылки
Свойства
Неформального понятия перевода недостаточно для определения выразительности языков, поскольку он допускает тривиальные кодировки, такие как отображение всех элементов A в один и тот же элемент B. Следовательно, необходимо определить определение «достаточно хорошей» кодировки. Это понятие меняется в зависимости от приложения.
Обычно ожидается, что кодировка сохранит ряд свойств.
Сохранение композиций
- звук
- Для каждого n-арного оператора в A существует n-арный оператор of B такой, что
- полнота
- Для каждого n-арного оператора of A существует n-арный оператор из B такой, что
(Примечание: насколько известно автору, этот критерий полноты никогда не используется.)
Сохранение композиций полезно постольку, поскольку оно гарантирует, что компоненты могут быть исследованы отдельно или вместе без " ломая "любую интересную собственность. В частности, в случае компиляции эта надежность гарантирует возможность продолжения отдельной компиляции компонентов, в то время как полнота гарантирует возможность декомпиляции.
Сохранение сокращений
Предполагается, что понятие редукции существует как на языке A, так и на языке B. Обычно в случае языка программирования редукция - это отношение, моделирующее выполнение программы.
Мы пишем для одного шага сокращения и для любого количества ступеней редукции.
- звук
- Для каждого термина языка A, если , то .
- полнота
- Для каждого термин языка A и все термины языка B, если тогда существует некая такая, что .
Это сохранение гарантирует, что оба языка ведут себя одинаково. Надежность гарантирует, что все возможные варианты поведения сохраняются, в то время как полнота гарантирует, что кодирование не добавляет поведения. В частности, в случае компиляции языка программирования надежность и полнота вместе означают, что скомпилированная программа ведет себя в соответствии с семантикой высокого уровня языка программирования.
Сохранение завершения
Это также предполагает наличие понятия редукции как на языке A, так и на языке B.
- звук
- для любого термина , если все сокращения сходятся, то все сокращения converge.
- полнота
- для любого термина , если все сокращения сходятся, то все сокращения сходиться.
В случае компиляции языка программирования надежность гарантирует, что при компиляции не будет прерывания, такого как бесконечные циклы или бесконечные рекурсии. Свойство полноты полезно, когда язык B используется для изучения или тестирования программы, написанной на языке A, возможно, путем извлечения ключевых частей кода: если это исследование или тест доказывают, что программа завершается в B, то она также завершается в A.
Сохранение наблюдений
Это предполагает существование понятия наблюдения как на языке A, так и на языке B. В языках программирования типичные наблюдаемые являются результатами входных и выходных данных в противоположность чистым вычислениям.. На языке описания, таком как HTML, типичное наблюдаемое является результатом визуализации страницы.
- звук
- для каждого наблюдаемого с точки зрения A существует наблюдаемое терминов B так, что для любого термина с наблюдаемым , имеет наблюдаемую .
- полноту
- для для каждого наблюдаемого на условиях A существует наблюдаемое на условия B такие, что для любого термина с наблюдаемым , имеет наблюдаемый .
Сохранение симуляций
Это предполагает наличие понятия симуляции на обоих язык A и язык B. В одном из языков программирования программа имитирует другую, если может выполнять все те же (наблюдаемые) задачи и, возможно, некоторые другие. Моделирование обычно используется для описания оптимизаций во время компиляции.
- звук
- для каждого члена , если имитирует , затем имитирует .
- полнота
- для каждого термина , если имитирует затем имитирует .
Сохранение имитаций это свойство гораздо более сильное, чем сохранение наблюдений, которое оно влечет за собой. В свою очередь, это слабее свойства сохранения бисимуляций. Как и в предыдущих случаях, надежность важна для компиляции, а полнота полезна для тестирования или доказательства свойств.
Сохранение эквивалентностей
Предполагается наличие понятия эквивалентности как для языка A, так и для языка B. Обычно это может быть понятие равенства структурированных данных или понятие синтаксически различных все же семантически идентичные программы, такие как структурная конгруэнтность или структурная эквивалентность.
- звук
- если два члена и эквивалентны в A, тогда и эквивалентны в B.
- полнота
- , если два члена и эквивалентны в B, затем и эквивалентны в A.
Сохранение распределения
Это предполагает наличие понятия распределения как на языке A, так и на языке B. Обычно для компиляции распределенных программ, написанных на JoCaml или E, это означает распределение процессов и данных между несколькими компьютерами или процессорами.
- звук
- , если термин представляет собой композицию двух агентов , затем должен быть составом двух агентов .
- полнота
- , если термин - это композиция из двух агентов , затем должен быть составом двух агентов такой, что и .
См. Также
Внешние ссылки