Kodowanie semantyczne
Kodowanie semantyczne to tłumaczenie między językami formalnymi . Dla programistów najbardziej znaną formą kodowania jest kompilacja języka programowania do kodu maszynowego lub kodu bajtowego. Konwersja między formatami dokumentów to także formy kodowania. Kompilacja TeX lub LaTeX do PostScript to również powszechnie spotykane procesy kodowania. Niektóre preprocesory wysokiego poziomu, takie jak Camlp4 firmy OCaml , obejmują również kodowanie jednego języka programowania w innym.
Formalnie zakodowanie języka A w język B jest odwzorowaniem wszystkich terminów A w B. Jeśli istnieje zadowalające zakodowanie A w B, B jest uważane za co najmniej tak potężne (lub przynajmniej tak wyraziste ) jak A.
Nieruchomości
Nieformalne pojęcie tłumaczenia nie jest wystarczające, aby pomóc określić ekspresyjność języków, ponieważ pozwala na trywialne kodowanie, takie jak mapowanie wszystkich elementów A na ten sam element B. Dlatego konieczne jest określenie definicji „wystarczająco dobrego” kodowania . To pojęcie różni się w zależności od zastosowania.
Zwykle oczekuje się, że kodowanie zachowa szereg właściwości.
Konserwacja kompozycji
- solidność
- każdego n-arnego operatora -arnego że
- argumentowego
- operatora z A istnieje operator n-ary ,
(Uwaga: o ile autor jest świadomy, to kryterium kompletności nigdy nie jest stosowane.)
Zachowanie kompozycji jest przydatne, o ile gwarantuje, że komponenty można badać osobno lub razem bez „zrywania” jakiejkolwiek interesującej właściwości. W szczególności w przypadku kompilacji solidność ta gwarantuje możliwość przeprowadzenia oddzielnej kompilacji komponentów, natomiast kompletność gwarantuje możliwość dekompilacji.
Zachowanie redukcji
Zakłada to istnienie pojęcia redukcji zarówno w języku A, jak iw języku B. Zazwyczaj w przypadku języka programowania redukcja jest relacją, która modeluje wykonanie programu.
Piszemy redukcji i dowolnej liczby kroków
- solidność
- Dla każdego terminu języka A, jeśli następnie .
- kompletność
- Dla każdego terminu języka A i wszystkich terminów języka B, jeśli to istnieje takie, że .
To zachowanie gwarantuje, że oba języki zachowują się w ten sam sposób. Poprawność gwarantuje zachowanie wszystkich możliwych zachowań, podczas gdy kompletność gwarantuje, że żadne zachowanie nie zostanie dodane przez kodowanie. W szczególności w przypadku kompilacji języka programowania solidność i kompletność łącznie oznaczają, że skompilowany program zachowuje się zgodnie z semantyką wysokiego poziomu języka programowania.
Zachowanie wypowiedzenia
Zakłada to również istnienie pojęcia redukcji zarówno w języku A, jak i języku B.
- solidność
- dowolnego terminu zbiegają , to wszystkie redukcje zbiegają się .
- kompletność
- dla dowolnego terminu , jeśli wszystkie redukcje z wszystkie redukcje zbiegają się.
W przypadku kompilacji języka programowania solidność gwarantuje, że kompilacja nie wprowadza niezakończeń, takich jak nieskończone pętle lub nieskończone rekurencje. Właściwość kompletności jest przydatna, gdy język B jest używany do badania lub testowania programu napisanego w języku A, prawdopodobnie poprzez wyodrębnienie kluczowych części kodu: jeśli to badanie lub test dowodzi, że program kończy się w B, to kończy się również w A.
Przechowywanie obserwacji
Zakłada to istnienie pojęcia obserwacji zarówno w języku A, jak iw języku B. W językach programowania typowymi obserwablami są wyniki wejść i wyjść, w przeciwieństwie do czystych obliczeń. W języku opisu, takim jak HTML , typowa obserwacja jest wynikiem renderowania strony.
- solidność
- dla każdego obserwowalnego istnieje obserwowalny takich, że dla dowolnego terminu z obserwowalnym , ma obserwowalny .
- kompletność
- dla każdego obserwowalnego obserwowalny B taki, że dla dowolnego terminu z obserwowalnym , ma obserwowalny .
Zachowanie symulacji
Zakłada to istnienie pojęcia symulacji zarówno w języku A, jak iw języku B. W jednym języku programowania program symuluje inny, jeśli może wykonać wszystkie te same (obserwowalne) zadania i ewentualnie kilka innych. Symulacje są zwykle używane do opisywania optymalizacji czasu kompilacji.
- ZA , jeśli symuluje następnie symuluje .
- T
- kompletność
- dla każdego warunku , jeśli symuluje następnie symuluje .
Zachowanie symulacji jest znacznie silniejszą właściwością niż zachowanie obserwacji, z którym się wiąże. Z kolei jest słabsza niż właściwość zachowania bisymulacji . Podobnie jak w poprzednich przypadkach, solidność jest ważna dla kompilacji, podczas gdy kompletność jest przydatna do testowania lub udowadniania właściwości.
Zachowanie równoważności
Zakłada to istnienie pojęcia równoważności zarówno w języku A, jak i języku B. Zazwyczaj może to być pojęcie równości ustrukturyzowanych danych lub pojęcie składniowo różnych, ale semantycznie identycznych programów, takich jak kongruencja strukturalna lub równoważność strukturalna.
- solidność
- jeśli dwa terminy równoważne to i są równoważne w B.
- kompletności
- , jeśli dwa terminy i są równoważne w B, a następnie i są równoważne w A.
Zachowanie dystrybucji
Zakłada to istnienie pojęcia dystrybucji zarówno w języku A, jak iw języku B. Zazwyczaj w przypadku kompilacji programów rozproszonych napisanych w Acute, JoCaml lub E oznacza to dystrybucję procesów i danych między kilka komputerów lub procesorów.
- solidność
- termin jest złożeniem dwóch wtedy musi być kompozycją dwóch agentów .
- kompletność
- , jeśli termin to kompozycja dwóch agentów musi być kompozycja dwóch agentów takie, że i .