Una codificación semántica es una traducción entre lenguajes formales . [ 1 ] Para los programadores, la forma más familiar de codificación es la compilación de un lenguaje de programación a código máquina o bytecode . La conversión entre formatos de documento también constituye una forma de codificación. La compilación de documentos TeX o LaTeX a PostScript también es un proceso de codificación común. Algunos preprocesadores de alto nivel, como Camlp4 de OCaml , también implican la codificación de un lenguaje de programación a otro.
Formalmente, una codificación de un lenguaje A en un lenguaje B es una correspondencia entre todos los términos de A y B. Si existe una codificación satisfactoria de A en B, se considera que B es al menos tan potente (o al menos tan expresivo ) como A.
Propiedades
Una noción informal de traducción no basta para determinar la expresividad de los idiomas, ya que permite codificaciones triviales como asignar todos los elementos de A al mismo elemento de B. Por lo tanto, es necesario definir qué constituye una codificación "suficientemente buena". Esta definición varía según la aplicación.
Comúnmente, una codificaciónSe espera que contribuya a preservar varias propiedades.
Conservación de composiciones
- solvencia
- Para cada operador n-ariode A, existe un operador n-ariode B tal que
- lo completo
- Para cada operador n-ariode A, existe un operador n-ariode B tal que
(Nota: hasta donde el autor sabe, este criterio de exhaustividad nunca se utiliza).
La preservación de las composiciones resulta útil en la medida en que garantiza que los componentes puedan examinarse por separado o en conjunto sin alterar ninguna propiedad de interés. En particular, en el caso de las compilaciones, esta integridad garantiza la posibilidad de proceder con la compilación individual de los componentes, mientras que la completitud garantiza la posibilidad de la descompilación.
Conservación de reducciones
Esto presupone la existencia de una noción de reducción tanto en el lenguaje A como en el lenguaje B. Normalmente, en el caso de un lenguaje de programación, la reducción es la relación que modela la ejecución de un programa.
Escribimospara un paso de reducción ypara cualquier número de pasos de reducción.
- solvencia
- Para cada términodel idioma A, sientonces.
- lo completo
- Para cada términodel idioma A y todos los términosdel idioma B, sientonces existe algode tal manera que.
Esta preservación garantiza que ambos lenguajes se comporten de la misma manera. La solidez garantiza que se conserven todos los comportamientos posibles, mientras que la completitud garantiza que la codificación no añada ningún comportamiento. En particular, en el caso de la compilación de un lenguaje de programación, la solidez y la completitud implican que el programa compilado se comporta de acuerdo con la semántica de alto nivel del lenguaje de programación.
Preservación de la terminación
Esto también presupone la existencia de una noción de reducción tanto en el lenguaje A como en el lenguaje B.
- solvencia
- para cualquier término, si todas las reducciones deconvergen, entonces todas las reducciones deconverger.
- lo completo
- para cualquier término, si todas las reducciones deconvergen, entonces todas las reducciones deconverger.
En el caso de la compilación de un lenguaje de programación, la solidez garantiza que la compilación no introduzca errores de terminación, como bucles infinitos o recursiones infinitas. La propiedad de completitud resulta útil cuando se utiliza el lenguaje B para estudiar o probar un programa escrito en el lenguaje A, posiblemente extrayendo partes clave del código: si este estudio o prueba demuestra que el programa termina en B, entonces también termina en A.
Preservación de las observaciones
Esto presupone la existencia de una noción de observación tanto en el lenguaje A como en el lenguaje B. En los lenguajes de programación, los observables típicos son resultados de entradas y salidas, en contraposición a la computación pura. En un lenguaje de descripción como HTML , un observable típico es el resultado de la representación de la página.
- solvencia
- para cada observableen términos de A, existe un observablede términos de B tales que para cualquier términocon observable,tiene observable.
- lo completo
- para cada observableen términos de A, existe un observableen términos de B tales que para cualquier términocon observable,tiene observable.
Preservación de simulaciones
Esto presupone la existencia del concepto de simulación tanto en el lenguaje A como en el lenguaje B. En un lenguaje de programación, un programa simula a otro si puede realizar las mismas tareas (observables) y posiblemente algunas más. Las simulaciones se utilizan normalmente para describir optimizaciones en tiempo de compilación.
- solvencia
- para cada término, sisimulaentoncessimula.
- lo completo
- para cada término, sisimulaentoncessimula.
La preservación de simulaciones es una propiedad mucho más fuerte que la preservación de observaciones, que implica. A su vez, es más débil que la propiedad de preservación de bisimulaciones . Como en casos anteriores, la solidez es importante para la compilación, mientras que la completitud es útil para probar o demostrar propiedades.
Preservación de equivalencias
Esto presupone la existencia de una noción de equivalencia tanto en el lenguaje A como en el lenguaje B. Normalmente, esta noción puede ser la de igualdad de datos estructurados o la de programas sintácticamente diferentes pero semánticamente idénticos, como la congruencia estructural o la equivalencia estructural.
- solvencia
- si dos términosyson equivalentes en A, entoncesyson equivalentes en B.
- lo completo
- si dos términosyson equivalentes en B, entoncesyson equivalentes en A.
Preservación de la distribución
Esto presupone la existencia de una noción de distribución tanto en el lenguaje A como en el lenguaje B. Normalmente, para la compilación de programas distribuidos escritos en Acute , JoCaml o E, esto significa la distribución de procesos y datos entre varios ordenadores o CPU.
- solvencia
- si un términoes la composición de dos agentesentoncesdebe ser la composición de dos agentes.
- lo completo
- si un términoes la composición de dos agentesentoncesdebe ser la composición de dos agentesde tal manera quey.
Véase también
Referencias
- ↑ van Glabbeek, Rob (2018), "Una teoría de las codificaciones y la expresividad (Resumen extendido)" , Lecture Notes in Computer Science , Cham: Springer International Publishing, pp. 183–202 , ISBN 978-3-319-89365-5, consultado el 19 de julio de 2025
{{citation}}: CS1 mantenimiento: parámetro de trabajo con ISBN ( enlace )
Enlaces externos
- Wiki de transformación de programas
- Lenguajes formales