Ao transformar termos de um idioma para outro, a propriedade intuitivamente desejada é a preservação da semântica (como usada, por exemplo, aqui para uma transformação do CPS):
Estou um pouco preocupado, no entanto, ao conciliar isso com os termos clássicos correção (ou solidez) e integridade dos sistemas lógicos. Normalmente, eu consideraria a declaração acima a propriedade de integridade de (e o inverso a definição de correção).
Intuitivamente, no entanto, um compilador deve estar correto e não completo (como por exemplo, a verificação de tipo geralmente exclui os programas corretos). O inverso da afirmação acima é verdadeira apenas se é injetivo: se o idioma de origem contiver, por exemplo, booleanos e operações neles e a compilação os substituir por codificação da Igreja, o idioma de destino poderá avaliar operações booleanas em termos compilados de literais booleanos e abstrações lambda, que o idioma de origem não pode avaliar.
- Estou certo de presumir que a afirmação acima é propriedade da integridade (para que o requisito intuitivo realmente tenha um nome contra-intuitivo)?
- Também estou certo em minha conclusão de que um compilador não injetor geralmente não está correto?
fonte
Intuitivamente falando, a propriedade de correção para uma transformação em uma linguagem na qual uma noção de avaliação é definida afirma que, se um termo tem uma certa semântica, a imagem do termo por essa transformação é avaliada para a imagem da referida semântica. Em outras palavras, um compilador correto é aquele que transforma um programa em outro programa com o mesmo comportamento (expresso no idioma de destino).
Aqui, deduzo de suas anotações que o idioma de origem é um idioma de termoss com uma noção de avaliação ⇓ : s⇓v significa que s reduz (em qualquer número de etapas) ao valor v . Um compilador corretoc é aquele que transforma qualquer programa s em um programa compilado c(s) que avalia o valor do compilador correspondente c(v) .
Isso corresponde à definição na Wikipedia se os valores se compilarem: ses tem a propriedade ⇓v então o mesmo acontece c(s) .
Um compilador de som não precisa ser injetado: é possível, e extremamente comum, que diferentes programas de origem com a mesma semântica sejam compilados no mesmo programa compilado.
Os compiladores geralmente não estão completos : como você observa, é comum ter termos na linguagem compilada que não possam ser a saída do compilador, ou seja, o compilador não é subjetivo.
fonte