OMeta es un lenguaje de programación orientado a objetos especializado para la coincidencia de patrones , desarrollado por Alessandro Warth e Ian Piumarta en 2007 bajo el Viewpoints Research Institute . El lenguaje se basa en analizar gramáticas de expresión (PEG) en lugar de gramáticas libres de contexto con la intención de proporcionar "una forma natural y conveniente para que los programadores implementen tokenizadores , analizadores sintácticos , visitantes y transformadores de árboles". [1]
El objetivo principal de OMeta es permitir que una audiencia más amplia utilice técnicas generalmente disponibles solo para programadores de idiomas, como el análisis sintáctico. [1] También es conocido por su uso en la creación rápida de prototipos, aunque se observa que los programas escritos en OMeta son generalmente menos eficientes que los escritos en implementaciones vanilla (lenguaje base), como JavaScript . [2] [3]
OMeta se destaca por su uso en la creación de lenguajes específicos de dominio , y especialmente por la facilidad de mantenimiento de sus implementaciones (Newcome). OMeta, como otros metalenguajes , requiere un idioma anfitrión; originalmente fue creado como una implementación COLA. [1]
Descripción
OMeta es un metalenguaje utilizado en la creación de prototipos y la creación de lenguajes específicos de dominio . Se introdujo como "un lenguaje orientado a objetos para la coincidencia de patrones". [1] Utiliza gramáticas de expresión de análisis sintáctico (descripciones de lenguajes "basadas en el reconocimiento de cadenas en lugar de generarlas" [4] ) diseñadas "para manejar tipos arbitrarios de datos", como caracteres, números, cadenas, átomos y listas. Esto aumenta su versatilidad, lo que le permite trabajar con datos estructurados y no estructurados . [1]
La principal ventaja del lenguaje sobre lenguajes similares es su capacidad para utilizar el mismo código para todos los pasos de la compilación (por ejemplo, lectura y análisis sintáctico). OMeta también admite la definición de reglas de producción basadas en argumentos; esto se puede usar para agregar tales reglas al propio OMeta, así como al lenguaje host en el que se está ejecutando OMeta. Además, estas reglas pueden usarse entre sí como argumentos, creando "reglas de orden superior", y heredarse entre sí para ganar producción. reglas del código existente. OMeta es capaz de usar valores booleanos en el lenguaje del host (Verdadero / Falso) mientras se comparan patrones; estos se conocen como "predicados semánticos". OMeta utiliza la coincidencia de patrones generalizada para permitir a los programadores implementar y extender más fácilmente las fases de compilación con una sola herramienta. [1]
OMeta usa gramáticas para determinar las reglas en las que opera. Las gramáticas pueden contener un número indefinido de variables debido al uso de una función __init__ llamada cuando se crea una gramática. Las gramáticas pueden heredarse y llamarse entre sí (utilizando el "mecanismo de invocación de producción extranjera", lo que permite a las gramáticas "tomar prestado" los flujos de entrada de cada uno), al igual que las clases en lenguajes de programación completos. [1] OMeta también da prioridad a las opciones dentro de una gramática determinada para eliminar la ambigüedad, a diferencia de la mayoría de los metalenguajes. Después de hacer coincidir un patrón con una entrada con una gramática determinada, OMeta asigna cada componente del patrón a una variable, que luego alimenta al idioma anfitrión. [5]
OMeta utiliza la coincidencia de patrones para realizar todos los pasos de la compilación tradicional por sí mismo. Primero encuentra patrones en los caracteres para crear tokens, luego hace coincidir esos tokens con su gramática para hacer árboles de sintaxis. Los verificadores de tipo luego hacen coincidir patrones en los árboles de sintaxis para hacer árboles anotados, y los visitantes hacen lo mismo para producir otros árboles. Luego, un generador de código hace coincidir los patrones con los árboles para producir el código. [3] En OMeta, es fácil "atravesar el árbol de análisis sintáctico ya que dicha funcionalidad es compatible de forma nativa". [3]
El metalenguaje se destaca por su facilidad de uso en la mayoría de los lenguajes de programación, aunque se usa más comúnmente en su lenguaje de implementación; OMeta / JS, por ejemplo, se usa en JavaScript. [5] Debido a que requiere un idioma anfitrión, los creadores de OMeta se refieren a él como un "lenguaje parasitario". [6]
Desarrollo
Alessandro Warth e Ian Piumarta desarrollaron OMeta en el Viewpoints Research Institute, una organización destinada a mejorar los sistemas de investigación y la computación personal, en 2007. Primero usaron una Arquitectura Lambda de Objetos Combinados, o COLA (un lenguaje de autodescripción investigado en el Viewpoints Research Institute) como idioma anfitrión de OMeta, y más tarde, con la ayuda de Yoshiki Ohshima, lo transfirió a Squeak Smalltalk para verificar su usabilidad con múltiples idiomas anfitriones. OMeta también se utilizó “para implementar un subconjunto casi completo de… Javascript” como caso de estudio en su artículo introductorio. [1]
Uso
OMeta, al igual que otros metalenguajes, se usa principalmente para crear lenguajes específicos de dominio (DSL en resumen); específicamente, se utiliza para crear rápidamente prototipos de DSL: la velocidad de ejecución lenta de OMeta y los informes de errores poco claros eliminan gran parte de su funcionalidad como lenguaje de programación completo (Heirbaut 73-74). OMeta es útil gracias a su capacidad de utilizar una sintaxis para cada fase de compilación, lo que permite utilizarlo en lugar de varias herramientas independientes en la creación de un compilador. [5] Además, OMeta se valora tanto por la velocidad a la que se puede utilizar para crear DSL como por la cantidad significativamente menor de código que requiere para realizar dicha tarea en comparación con las implementaciones estándar, con informes que muestran alrededor del 26% de muchas líneas. de código funcional como vainilla. [2]
Ejemplos de
El siguiente es un ejemplo de un lenguaje de calculadora básico en C # usando OMeta:
ometa BasicCalc < : Analizador { Dígito = super : d -> d . ToDigit (), Número = Número : n Dígito : D -> ( n * 10 + d ) | Dígito , AddExpr = AddExpr : x ' + ' MulExpr : y -> ( x + y ) | AddExpr : x ' - ' MulExpr : y -> ( x - y ) | MulExpr , MulExpr = MulExpr : x ' * ' primExpr : y -> ( x * y ) | MulExpr : x ' / ' primExpr : y -> ( x / y ) | PrimExpr , PrimExpr = ' ( ' Expr : x ' ) ' -> x | Número , Expr = AddExpr }
También es posible crear subclases de idiomas que ha escrito:
ometa ExponentCalc < : BasicCalc { MulExpr = MulExpr : x ' ^ ' PrimExpr : e -> Matemáticas . pow ( x , e ) | super }
Los lenguajes escritos previamente también se pueden llamar en lugar de heredar:
ometa ScientificCalc < : Analizador { MathFunc : n = Token ( n ) Spaces , AdvExp = MathFunc ( ' sqrt ' ) AdvExp : x -> Math . Sqrt ( x ) | FacExp FacExp = PrimExp : x ' ! ' -> { var r = 1 ; para (; x > 1 ; x -) { r * = x ; } return r ; } | PrimExp PrimExp = externo ( ExponentCalc . Expr ): x -> x Expr = AdvExp }
Versiones
En teoría, OMeta se puede implementar en cualquier lenguaje host, pero se usa con mayor frecuencia como OMeta / JS, una implementación de JavaScript. [5] Warth ha declarado que es mejor dejar que los patrones en "OMeta / X --- donde X es algún idioma anfitrión" sean influenciados por "X" que estandarizados dentro de OMeta, debido al hecho de que los diferentes idiomas anfitriones reconocen diferentes tipos de objetos. [6]
MetaCOLA
MetaCOLA fue la primera implementación de OMeta, utilizada en el documento introductorio del idioma. MetaCOLA implementó los primeros códigos de prueba de OMeta y fue una de las tres formas (las otras son OMeta / Squeak y un OMeta / JS casi terminado) del lenguaje creado antes de su lanzamiento. [1]
OMeta / Chirrido
OMeta / Squeak fue un puerto de OMeta utilizado durante la demostración inicial del sistema. OMeta / Squeak se utiliza "para experimentar con sintaxis alternativas para el sistema Squeak EToys" OMeta / Squeak requiere corchetes y "corchetes puntiagudos" (llaves) en las operaciones de reglas, a diferencia de OMeta / JS, que solo requiere corchetes. [6] OMeta / Squeak 2, sin embargo, presenta una sintaxis más similar a la de OMeta / JS. [7] A diferencia de la implementación COLA de OMeta, la versión Squeak no memoriza resultados intermedios (números de tienda ya usados en el cálculo). [1]
OMeta / JS
OMeta / JS es OMeta en forma de implementación de JavaScript. Se observa que las implementaciones de lenguaje que usan OMeta / JS son más fáciles de usar y más eficientes en espacio que las escritas solo con JavaScript vanilla, pero se ha demostrado que las primeras funcionan mucho más lentamente. Debido a esto, OMeta / JS se considera una herramienta muy útil para la creación de prototipos, pero no se prefiere para implementaciones de lenguajes de producción. [3]
Vs. JavaScript
El uso de herramientas de desarrollo DSL, como OMeta, se considera mucho más fácil de mantener que las “implementaciones vanilla” (es decir, JavaScript) debido a su bajo recuento de NCLOC (líneas de código sin comentarios). Esto se debe en parte al "código de acción semántica que crea los objetos AST o realiza operaciones de cadena limitadas". La falta de “sintaxis libre de contexto” de OMeta permite que se utilice tanto en la creación de analizadores como de léxers a costa de líneas adicionales de código. Los factores adicionales que indican la capacidad de mantenimiento de OMeta incluyen un alto índice de capacidad de mantenimiento "mientras que Halstead Effort indica que el analizador sintético vanilla requiere tres veces más esfuerzo de desarrollo en comparación con el analizador OMeta". Al igual que JavaScript, OMeta / JS admite "la notación de sintaxis completa de Waebric". [3]
Una de las principales ventajas de OMeta responsable de la diferencia en NCLOC es la reutilización de OMeta de su "mecanismo de caminata de árbol" al permitir que el comprobador de tipos herede el mecanismo del analizador, lo que hace que el comprobador de tipos se adapte a los cambios en el analizador OMeta, mientras que JavaScript El mecanismo de caminata de árbol contiene más código y debe adaptarse manualmente a los cambios en el analizador. Otro es el hecho de que las gramáticas de OMeta tienen un "nivel de abstracción más alto ... que el código del programa". También se puede considerar "el resultado del código de acción semántica que crea los objetos AST o realiza operaciones de cadena limitadas", aunque la no semántica de la gramática crea una necesidad de relativamente muchas líneas de código por función debido a la definición explícita de espacios en blanco, un mecanismo implementado para permitir que OMeta actúe como una herramienta única para la creación de DSL. [3]
En términos de rendimiento, OMeta se ejecuta a velocidades lentas en comparación con las implementaciones estándar. El uso de técnicas de retroceso por parte de OMeta es una posible causa principal de esto (el analizador de OMeta "incluye siete operadores de anticipación ... Estos operadores son necesarios para distinguir ciertas reglas entre sí y no pueden quedar fuera de la gramática"); sin embargo, es más probable que esta caída en el rendimiento se deba al método de memorización de OMeta:
“El almacenamiento de los pasos de análisis intermedio hace que el tamaño de la tabla de análisis sea proporcional al número de terminales y no terminales (operandos) utilizados en la gramática. Dado que la gramática del analizador OMeta contiene 446 operandos, se cree que el rendimiento se ve afectado negativamente ”. [3]
Sin embargo, donde OMeta gana tiempo en la implementación básica es en el lexing. JavaScripts vanilla lexer se ralentiza significativamente debido a un método mediante el cual la implementación convierte todo el programa en una cadena a través de Java antes de que comience el lexer. A pesar de esto, la implementación de OMeta se ejecuta significativamente más lenta en general. [3]
OMeta también se queda atrás en términos de informes de errores. Si bien las implementaciones vanilla devuelven el mensaje de error correcto en aproximadamente el "92% de los casos de prueba" en términos de ubicación del error, OMeta simplemente devuelve "¡Error de coincidencia!" a cualquier error dado. Encontrar la fuente a través de OMeta requiere "manualmente ... contar los caracteres de nueva línea en el código de acción semántica para generar al menos el número de línea en el que falla el análisis". [3]
OMeta #
OMeta # es un proyecto de Jeff Moser destinado a traducir OMeta / JS en una funcionalidad de C #; como tal, el diseño de OMeta # se basa en el diseño OMeta / JS de Alessandro Warth. El objetivo del proyecto es brindar a los usuarios la capacidad de crear lenguajes de trabajo con gran simplicidad. Específicamente, OMeta # está diseñado para funcionar como una herramienta única para el desarrollo del lenguaje .NET, reducir la curva de aprendizaje empinada del desarrollo del lenguaje, convertirse en un recurso de enseñanza útil y ser práctico para su uso en aplicaciones reales. [5] OMeta # actualmente usa C # 3.0 como lenguaje anfitrión de OMeta en lugar de 4.0; debido a que C # 3.0 es un lenguaje estático en lugar de uno dinámico, el reconocimiento del lenguaje host dentro de OMeta # es “dos o tres veces más feo y más grande de lo que podría haber sido” en un lenguaje de tipado dinámico. [8]
OMeta # usa clases .NET, o Tipos, como gramáticas y métodos para las “reglas” internas de las gramáticas. OMeta # usa llaves ({y}) para reconocer su idioma anfitrión en gramáticas. El lenguaje se enfoca en una escritura fuerte, limpia y estática muy parecida a la de su lenguaje anfitrión, aunque esto agrega complejidad a la creación del lenguaje. Las nuevas implementaciones en C # también deben ser compatibles con el metalenguaje .NET, lo que hace que la creación sea aún más compleja. Además, para evitar que los usuarios hagan un mal uso accidental de las metarules en OMeta #, Moser ha optado por implementarlas como "una interfaz explícita expuesta a través de una propiedad (por ejemplo, en lugar de" _apply ", tengo" MetaRules.Apply ")." Las partes posteriores de OMeta # están escritas en el lenguaje mismo, aunque la funcionalidad del lenguaje permanece bastante ligada a C #. [9] El código fuente de OMeta # se publica en Codeplex y está destinado a permanecer como un proyecto de código abierto. Sin embargo, las actualizaciones han estado en pausa indefinida desde poco después de los inicios del proyecto, con nuevos compromisos por parte del servidor el 1 de octubre de 2012. [5]
IronMeta
Gordon Tisher creó IronMeta para .NET en 2009, y aunque es similar a OMeta #, es una implementación mucho más compatible y sólida, distribuida bajo licencia BSD en Github.
Ohm
Ohm es un sucesor de Ometa que tiene como objetivo mejorarlo (entre otras cosas) separando la gramática de las acciones semánticas. [10]
Ver también
- ANTLR (otra herramienta para el reconocimiento de idiomas), un metalenguaje similar
- META II Un compilador-compilador temprano , influyente en la implementación de OMeta
- Repositorio github de OMeta / JS .
Referencias
- ^ a b c d e f g h i j Warth, Alessandro e Ian Piumarta. " OMeta: un lenguaje orientado a objetos para la coincidencia de patrones ". Simposio de Lenguas Dinámicas ACM SIGPLAN 2007 (DLS '07). 03rd ed. Vol. TR-2007. Glendale, CA: Viewpoints Research Institute, 2007. Informe técnico de VPRI. Web. 30 de septiembre de 2013.
- ↑ a b Klint, Paul, Tijs Van Der Storm y Jurgen Vinju. " Sobre el impacto de las herramientas DSL en la capacidad de mantenimiento de las implementaciones del lenguaje ". LDTA '10 Actas del Décimo Taller sobre Descripciones de Idiomas, Herramientas y Aplicaciones. Nueva York, NY. Np, 2010. Web. 30 de septiembre de 2013.
- ^ a b c d e f g h i Heirbaut, Nickolas. "Comparación de dos técnicas de implementación para lenguajes específicos de dominio: OMeta / JS vs. Javascript". Tesis. Universidad de Amsterdam, 2009. Web. 30 de septiembre de 2013. < http://dare.uva.nl/document/153293 >.
- ^ Mascarenhas, Fabio, Sergio Medeiros y Roberto Ierusalimschy . Análisis de gramáticas de expresión para datos estructurados. Np: np, nd Web. < Http://www.lbd.dcc.ufmg.br/colecoes/sblp/2011/003.pdf >.
- ^ a b c d e f g h i Moser, Jeff. "Moserware". : OMeta #: ¿Quién? ¿Qué? ¿Cuándo? ¿Dónde? ¿Por qué? , Blogger, 24 de junio de 2008. Web. 30 de septiembre de 2013.
- ^ a b c Warth, Alessandro. "[Ometa] Sobre la sintaxis de OMeta". [Ometa] Sobre la sintaxis de OMeta. Np, 4 de julio de 2008. Web. 16 de octubre de 2013. < http://vpri.org/pipermail/ometa/2008-July/000051.html >.
- ^ Warth, Alessandro. "OMeta / Squeak 2." OMeta / Squeak 2. Np, nd Web. 16 de octubre de 2013. < http://tinlizzie.org/ometa/ometa2.html >.
- ^ Moser, Jeff. "Moserware". : Meta-FizzBuzz , Blogger, 25 de agosto de 2008. Web. 30 de septiembre de 2013.
- ^ Moser, Jeff. "Moserware". : Creación de un blogger de metalenguaje parasitario orientado a objetos, 31 de julio de 2008. Web. 30 de septiembre de 2013.
- ^ "Filosofía de Ohm" .