Los preprocesadores sintácticos se introdujeron con la familia de lenguajes Lisp. Su función es transformar los árboles sintácticos según una serie de reglas definidas por el usuario. En algunos lenguajes de programación, las reglas se escriben en el mismo lenguaje que el programa (reflexión en tiempo de compilación). Este es el caso de Lisp y OCaml. Otros lenguajes se basan en un lenguaje totalmente externo para definir las transformaciones, como el preprocesador XSLT para XML, o su homólogo de tipado estático CDuce.

Los preprocesadores sintácticos se utilizan normalmente para personalizar la sintaxis de un lenguaje, extender un lenguaje añadiendo nuevas primitivas, o incrustar un lenguaje de programación de dominio específico (DSL) dentro de un lenguaje de propósito general.

Personalización de la sintaxisEditar

Un buen ejemplo de personalización de la sintaxis es la existencia de dos sintaxis diferentes en el lenguaje de programación Objective Caml. Los programas pueden escribirse indistintamente con la «sintaxis normal» o con la «sintaxis revisada», y pueden ser bonificados con cualquiera de las dos sintaxis bajo demanda.

De forma similar, una serie de programas escritos en OCaml personalizan la sintaxis del lenguaje mediante la adición de nuevos operadores.

Extensión de un lenguajeEditar

Los mejores ejemplos de extensión del lenguaje mediante macros se encuentran en la familia de lenguajes Lisp. Mientras que los lenguajes, por sí mismos, son simples núcleos funcionales dinámicamente tipados, las distribuciones estándar de Scheme o Common Lisp permiten la programación imperativa u orientada a objetos, así como la tipificación estática. Casi todas estas características se implementan mediante el preprocesamiento sintáctico, aunque cabe destacar que la fase de «expansión de macros» de la compilación es gestionada por el compilador en Lisp. Esto todavía puede considerarse una forma de preprocesamiento, ya que tiene lugar antes de otras fases de compilación.

Especializar un lenguajeEditar

Una de las características inusuales de la familia de lenguajes Lisp es la posibilidad de utilizar macros para crear un DSL interno. Normalmente, en un gran proyecto basado en Lisp, un módulo puede estar escrito en una variedad de estos minilenguajes, uno de ellos quizás utilizando un dialecto de Lisp basado en SQL, otro escrito en un dialecto especializado para GUIs o pretty-printing, etc. La biblioteca estándar de Common Lisp contiene un ejemplo de este nivel de abstracción sintáctica en la forma de la macro LOOP, que implementa un minilenguaje tipo Algol para describir la iteración compleja, al tiempo que permite el uso de operadores Lisp estándar.

El preprocesador/lenguaje MetaOCaml proporciona características similares para DSLs externos. Este preprocesador toma la descripción de la semántica de un lenguaje (es decir, un intérprete) y, combinando la interpretación en tiempo de compilación y la generación de código, convierte esa definición en un compilador para el lenguaje de programación OCaml y, desde ese lenguaje, en código de bytes o en código nativo.

admin

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

lg