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.