¿Qué es una especie de semántica de lenguaje de programación?

9

En el Capítulo 1 de Fundamentos prácticos para lenguajes de programación , el autor menciona que los árboles de sintaxis abstractos están asociados con géneros .

Intuitivamente, los tipos son como los tipos, pero me gustaría saber si tienen una definición precisa. Me alegraría si también se proporcionan algunas referencias.

rslima
fuente

Respuestas:

4

Depende de qué semántica tomemos para tipos y géneros. - Sin embargo, un breve - poco informal - las definiciones podrían ser - Los tipos son clases de AST y los tipos son clases de valores .

Numero47
fuente
4

En realidad, hay mucha similitud entre los tipos para la sintaxis abstracta y los tipos, como se entiende generalmente. Pero los tipos son un concepto sintáctico formal , y los árboles AS también son sintácticos, mientras que los tipos son un concepto semántico .

La terminología proviene de álgebras de término (también llamadas álgebras libres ) y álgebra universal . Estas son esencialmente teorías sintácticas de estructuras algebraicas, analizadas independientemente de cualquier interpretación. Fueron desarrollados en la primera mitad del siglo XX.

Un término puede verse como un árbol, donde los nodos están etiquetados de un conjunto finito de operadores, cada operador tiene una aridad fija que especifica el número de hijas en el árbol. Arity 0 es para hojas. En álgebras de clasificación múltiple, esto se refina con clasificaciones, de modo que cada operador pertenece a una clasificación, y las aridades se reemplazan por una lista ordenada de clasificaciones, que fija para cada hija el tipo de su operador principal. El tipo de operador, junto con la lista de los tipos de su hija, se llama la firma del operador.

En álgebras universales, esto se refina aún más mediante la introducción de relaciones de equivalencia definidas equitativamente entre los términos.

Aunque parece haberse desvanecido un poco, estos conceptos fueron bastante populares y muy estudiados en ciencias de la computación a fines del siglo XX, como álgebras abstractas que luego se consideraron como una base para tipos de datos abstractos, que es, en parte, precursor de lo que es nos clases en programación orientada a objetos.

Las álgebras universales están relacionadas con el desarrollo de la teoría de categorías, que también es fundamental en la visión actual de los tipos y lenguajes de programación.

Las álgebras son objetos sintácticos y están destinadas a ser utilizadas con una interpretación en algunos dominios semánticos correspondientes a los tipos. Una interpretación es un homomorfismo que asigna clasificaciones en dominios de valores (tipos) y operadores en funciones entre esos dominios, de modo que se respetan las firmas y las ecuaciones también en el caso de un álgebra equitativa. Así es como puede aplicar los resultados de la teoría de grupos a cualquier dominio con una operación que respete la definición de un grupo.

Esta organización fue considerada muy conveniente por los primeros investigadores en lenguajes de programación, especialmente aquellos interesados ​​en formalizar lenguajes de programación. Tenía la ventaja de aislar la sintaxis y la semántica, y de ser matemáticamente bien entendido.

Otra razón para adoptarlo fue la preocupación por el desarrollo de herramientas para manipular programas, ya sea en entornos de desarrollo o en sistemas formales para probar las propiedades de los programas (que resultaron ser más y más problemas gemelos).

Esto condujo a la aparición del concepto de árbol de sintaxis abstracta (AST) para lenguajes de programación, que son esencialmente términos de un álgebra de clasificación múltiple (a veces refinada con el uso de la unión de clasificación en algunos sistemas). La AST es la sintaxis de referencia para un lenguaje, a partir de la cual la semántica se puede definir por homomorfismo como en la semántica denotacional.

Esto no solo es conveniente para estudiar la semántica de los lenguajes, sino que los árboles están mejor estructurados que las cadenas y, por lo tanto, una mejor base para desarrollar herramientas de programación y entornos de programación.

Permite aislar el análisis, que tradicionalmente era una parte desordenada, ya que las limitaciones de la tecnología de análisis obligaban al uso de gramáticas distorsionadas. También tiene en cuenta los problemas de presentación.

Permite múltiples representaciones concretas (cadenas o gráficas) de programas, lo que a veces puede ser conveniente (no hay ninguna razón por la cual el uso de signos de puntuación en lugar de tabulaciones, o viceversa, en la sintaxis del programa debería ser forzado en las personas).

Facilita la definición de muchas interpretaciones de programas, y de algún tipo , para analizar las propiedades del programa con interpretaciones abstractas.

Es conveniente para escribir herramientas de manipulación de programas (semi) automatizadas, por ejemplo, para transformaciones automáticas de programas o traducciones entre idiomas.

Las cosas a veces pueden ser un poco más complicadas en la práctica, porque algunas formas de sintaxis abstracta permiten a algunos operadores construir árboles (expresiones) que pertenecen a varios tipos (una forma informal de verlo). Por ejemplo, podría haber una especie de construcciones sintácticas que representan variables (entidades asignables) y otra para expresiones. Pero cualquier variable puede usarse como una expresión, lo contrario es falso.

Los primeros documentos sobre esto, para lenguajes de programación, datan de mediados de los setenta. La conceptualización en ese momento estaba destinada a la producción de entornos de programación conscientes de la sintaxis (luego se usó la palabra "dirigida"). Busque Mentor y Centaur en Europa y el sintetizador del programa Cornell en los Estados Unidos. Fueron los dos primeros sistemas en utilizar tales conceptos de manera práctica. Muchos otros se desarrollaron después.

Pero la sintaxis abstracta es anterior a estos sistemas. El lenguaje Lisp (1958) tenía una sintaxis abstracta, lo cual no es sorprendente, ya que fue desarrollado por un lógico, y con el propósito de hacer programas que manipulen programas (ver también ML y LCF ... que vino después). Pero Lisp no estaba ordenado: todo era sintácticamente una lista y una estructura más refinada dependía esencialmente de la semántica. Esto llevó a algunas personas a considerar, algo incorrectamente, que Lisp no tenía sintaxis.

babou
fuente
¿Diría que hay 2 jerarquías diferentes, una en la tierra de sintaxis y otra en la tierra de semántica? En sintaxis tenemos como AST y clases y clases de clases. En semántica tenemos valores, tipos, tipos ... etc. ¿No hay lenguajes que unifiquen ambos en un entorno de desarrollo como Twelf o Coq?
CMCDragonkai
@CMCDragonkai Diría (salvo posibles errores) precisamente lo que dije. No llamaría a estas jerarquías, sino dominios del (meta) discurso. La separación de sintaxis-semántica distingue de qué hablamos y cómo lo hacemos, lo que requiere representación. No debe mezclar la sintaxis y la semántica del mismo idioma, pero la sintaxis de un idioma puede ser un objeto de discurso, por lo tanto, pertenece a la semántica de otro idioma. En ese sentido, es posible que veas unificación, que se maneja con cuidado. La sintaxis siempre se genera de forma finita, mientras que la semántica no tiene esa restricción.
babou
2

En el capítulo cuatro, parece que los tipos son para la sintaxis y los tipos son para la semántica.

El cuadro de sintaxis de ejemplo en la página 40 trata los tipos en el idioma L {num str}. Aparentemente, los tipos son categorías en la sintaxis del lenguaje.

En particular, "más" tiene un tipo, que es la categoría sintáctica de su resultado. El tipo de operador "más" se llama "Exp". Eso representa el hecho de que sintácticamente, una invocación del operador "más" es una expresión. Una invocación del operador "más" puede llenar una posición en un árbol de sintaxis abstracta donde se permite una expresión. Ese es el tipo de construcción que es un "plus". Así es como encaja en la estructura de un texto que representa un programa.

El sistema de tipos en la página 41 trata los tipos en el lenguaje L {num str}. El tipo de operador "más", dado que sus operandos tienen el tipo "num", es "num". Este juicio es una descripción parcial de la semántica del operador "plus". Es decir, parte del significado del operador "más" es la combinación de dos números para producir un número. Este significado distingue "más" de otras expresiones.

Además, hay un tipo llamado "Typ" que contiene los dos tipos, "num" y "str".

minopret
fuente
1
Bueno, lo usa en este concepto, pero no lo define claramente. Encontré el término "lógica de muchos ordenamientos" que me parece que las clases y los tipos son conceptos realmente cerrados. Solo quería saber una definición clara para ambos.
rslima
Tiene algo que ver con "sistemas de tipo puro". Sospecho que podríamos considerar que la presentación en " Cálculos de Lambda con tipos " es convencional. Pero no es conciso. Todavía no he encontrado una referencia que proporcione definiciones claras y concisas de término, tipo, tipo y tipo.
minopret
¿Qué pasa con los jefes de producción en un analizador sintáctico? Muchas veces terminas clasificando gramáticas con nombres similares como Expresión o Tipo.
CMCDragonkai
1

Al comienzo del Capítulo 1, Harper da una pista de lo que quiere decir con la palabra ordenar :

La sintaxis de un lenguaje especifica los medios por los cuales se pueden combinar varios tipos de frases (expresiones, comandos, declaraciones, etc.) para formar programas.

Define la frase de la palabra como un árbol de sintaxis abstracta, que luego analiza.

jcora
fuente
Me parece que se utilizó "clasificaciones" con su significado habitual en inglés aquí, sinónimo de "clases".
Raphael
@Raphael Sí, pero parece que ese significado es consistente con el último uso formal, ¿no le parece?
jcora
No exactamente. La frase "este tipo de X" puede aparecer a menudo en el libro; Esta oración no indica de ninguna manera que algo se está definiendo. (Además, este pasaje no coincide con la forma en que entiendo el término "ordenar").
Raphael
@Raphael OK, explique cómo este uso en particular es inconsistente, ciertamente me informaría, porque así es como lo entiendo actualmente.
jcora
La noción de "ordenar" que conozco está asociada con nodos individuales del AST, no con un árbol completo (que es lo que usted dice "frase" significa en su fuente).
Raphael