stringtranslate.com

OMeta

OMeta es un lenguaje de programación orientado a objetos especializado en la búsqueda de patrones , desarrollado por Alessandro Warth e Ian Piumarta en 2007 en el Viewpoints Research Institute . El lenguaje se basa en gramáticas de expresión de análisis (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 , 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 lenguajes, 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 simples (lenguaje base), como JavaScript . [2] [3]

OMeta es conocido 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, al igual que otros metalenguajes , requiere un lenguaje anfitrión; fue creado originalmente como una implementación COLA. [1]

Descripción

OMeta es un metalenguaje utilizado para crear prototipos y lenguajes específicos de dominio . Fue presentado como "un lenguaje orientado a objetos para la búsqueda de patrones". [1] Utiliza gramáticas de expresión de análisis (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 tanto con datos estructurados como no estructurados . [1]

La principal ventaja del lenguaje sobre lenguajes similares es su capacidad de usar el mismo código para todos los pasos de compilación, por ejemplo, análisis léxico y sintáctico. OMeta también admite la definición de reglas de producción basadas en argumentos; esto se puede usar para agregar dichas reglas a OMeta y al lenguaje host en el que se ejecuta OMeta. Además, estas reglas pueden usarse entre sí como argumentos, creando "reglas de orden superior" y heredándose entre sí para obtener reglas de producción del código existente. OMeta es capaz de usar booleanos del lenguaje host (Verdadero/Falso) durante la coincidencia de patrones; estos se conocen como "predicados semánticos". OMeta usa la coincidencia de patrones generalizada para permitir que los programadores implementen y extiendan más fácilmente las fases de compilación con una sola herramienta. [1]

OMeta utiliza 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 heredar y llamarse entre sí (utilizando el "mecanismo de invocación de producción externa", que permite que las gramáticas "tomen prestados" los flujos de entrada de las demás), de forma muy similar a las clases en los lenguajes de programación completos. [1] OMeta también prioriza las opciones dentro de una gramática dada para eliminar la ambigüedad, a diferencia de la mayoría de los meta-lenguajes. Después de hacer coincidir un patrón con una entrada de una gramática dada, OMeta asigna cada componente del patrón a una variable, que luego alimenta al lenguaje anfitrión. [5]

OMeta utiliza la comparación 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 crear árboles sintácticos. Luego, los verificadores de tipos hacen coincidir patrones en los árboles sintácticos para crear árboles anotados, y los visitantes hacen lo mismo para producir otros árboles. Luego, un generador de código hace coincidir patrones en los árboles para producir el código. [3] En OMeta, es fácil "recorrer el árbol de análisis, ya que dicha funcionalidad está soportada 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 utiliza más comúnmente en su lenguaje de implementación (OMeta/JS, por ejemplo, se utiliza en JavaScript). [5] Debido a que requiere un lenguaje anfitrión, los creadores de OMeta se refieren a él como un "lenguaje parásito". [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 informática personal, en 2007. Primero utilizaron una arquitectura combinada de objetos Lambda (COLA), un lenguaje autodescriptivo investigado en el Viewpoints Research Institute, como lenguaje anfitrión de OMeta y, más tarde, con la ayuda de Yoshiki Ohshima, lo trasladaron a Squeak Smalltalk para verificar su usabilidad con múltiples lenguajes anfitriones. OMeta también se utilizó "para implementar un subconjunto casi completo de... JavaScript" como caso de estudio en su artículo introductorio. [1]

Usar

OMeta, al igual que otros metalenguajes, se utiliza principalmente para crear lenguajes específicos de dominio (DSL); específicamente, se utiliza para crear rápidamente prototipos de DSL; la baja velocidad de ejecución de OMeta y los informes de errores poco claros eliminan gran parte de su función 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 para crear un compilador. [5] Además, OMeta es valorado tanto por la velocidad a la que se puede utilizar para crear DSL como por la cantidad significativamente menor de código que necesita para realizar dicha tarea en contraste con las implementaciones estándar, con informes que muestran alrededor de un 26 % más de líneas de código funcional que las estándar. [2]

Ejemplos

El siguiente es un ejemplo de un lenguaje de calculadora básico en C# usando OMeta:

 ometa BasicCalc < : Parser { 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 }                                                                       

[5]

También es posible crear subclases de lenguajes que haya escrito:

 ometa ExponentCalc < : BasicCalc { MulExpr = MulExpr : x ' ^ ' PrimExpr : e -> Math . pow ( x , e ) | super }              

[5]

Los lenguajes previamente escritos también pueden llamarse en lugar de heredarse:

 ometa ScientificCalc < : Parser { 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 = foráneo ( ExponentCalc . Expr ): x -> x Expr = AdvExp }                                                   

[5]

Versiones

En teoría, OMeta se puede implementar en cualquier lenguaje anfitrión, pero se utiliza con más frecuencia como OMeta/JS, una implementación de JavaScript. [5] Warth ha afirmado que es mejor dejar que los patrones en "OMeta/X---donde X es algún lenguaje anfitrión" sean influenciados por "X" en lugar de estandarizarlos dentro de OMeta, debido al hecho de que los diferentes lenguajes anfitriones reconocen diferentes tipos de objetos. [6]

MetaCOLA

MetaCOLA fue la primera implementación de OMeta, utilizada en el documento introductorio del lenguaje. MetaCOLA implementó los primeros códigos de prueba de OMeta y fue una de las tres formas (las otras son OMeta/Squeak y una OMeta/JS casi terminada) del lenguaje creadas antes de su lanzamiento. [1]

OMeta/Chirrido

OMeta/Squeak fue un port 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 de Squeak no memoriza resultados intermedios (almacena números ya utilizados en el cálculo). [1]

OMeta/JS

OMeta/JS es OMeta en forma de implementación de JavaScript. Se ha observado que las implementaciones de lenguaje que utilizan OMeta/JS son más fáciles de usar y más eficientes en términos de espacio que las escritas utilizando solo JavaScript, pero se ha demostrado que las primeras tienen un rendimiento mucho más lento. Debido a esto, OMeta/JS se considera una herramienta muy útil para la creación de prototipos, pero no es la preferida para las implementaciones de lenguajes de producción. [3]

En contra de JavaScript

El uso de herramientas de desarrollo DSL, como OMeta, se considera mucho más fácil de mantener que las "implementaciones tradicionales" (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 lo utilice tanto en la creación de analizadores sintácticos como de analizadores léxicos a costa de líneas de código adicionales. Otros factores 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áctico tradicional requiere tres veces más esfuerzo de desarrollo en comparación con el analizador sintáctico 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 su "mecanismo de recorrido por árboles" por parte de OMeta, al permitir que el verificador de tipos herede el mecanismo del analizador, lo que hace que el verificador de tipos se adapte a los cambios en el analizador de OMeta, mientras que el mecanismo de recorrido por árboles de JavaScript contiene más código y debe adaptarse manualmente a los cambios en el analizador. Otra 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 la 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 sola herramienta para la creación de DSL. [3]

En términos de rendimiento, se ha descubierto que OMeta funciona 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 importante de esto (el analizador sintáctico de OMeta "incluye siete operadores de anticipación... Estos operadores son necesarios para distinguir ciertas reglas entre sí y no se pueden dejar fuera de la gramática"); sin embargo, es más probable que esta caída del rendimiento se deba al método de memorización de OMeta:

"El almacenamiento de los pasos de análisis intermedios 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 con respecto a la implementación original es en el análisis léxico. El analizador léxico original de JavaScript se ralentiza significativamente debido a un método por el cual la implementación convierte todo el programa en una cadena a través de Java antes de que comience el analizador léxico. A pesar de esto, la implementación de OMeta se ejecuta significativamente más lento en general. [3]

OMeta también se queda atrás en términos de notificación de errores. Mientras que las implementaciones de vainilla 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!" ante cualquier error dado. Encontrar la fuente a través de OMeta requiere "contar manualmente... los caracteres de nueva línea en el código de acción semántica para mostrar al menos el número de línea en el que falla el análisis". [3]

OMeta#

OMeta# es un proyecto de Jeff Moser que tiene como objetivo traducir OMeta/JS a una función de C#; como tal, el diseño de OMeta# se basa en el diseño de 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á destinado a funcionar como una herramienta única para el desarrollo del lenguaje .NET , reducir la pronunciada curva de aprendizaje 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 dinámico, el reconocimiento del lenguaje anfitrión dentro de OMeta# es "dos o tres veces más feo y grande de lo que podría haber sido" en un lenguaje tipado dinámicamente. [8]

OMeta# utiliza clases .NET, o tipos, como gramáticas y métodos para las "reglas" internas de las gramáticas. OMeta# utiliza llaves ( { y } ) para reconocer su lenguaje anfitrión en las gramáticas. El lenguaje se centra en la tipificación estática, limpia y fuerte, muy similar a la de su lenguaje anfitrión, aunque esto añade 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 utilicen incorrectamente de forma accidental las metarreglas 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 OMeta#, aunque las funciones del lenguaje siguen estando bastante ligadas a C#. [9] El código fuente de OMeta# está publicado 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 del inicio del proyecto, con nuevas confirmaciones por parte del servidor el 1 de octubre de 2012. [5]

Meta de hierro

Gordon Tisher creó IronMeta para .NET en 2009 y, si bien es similar a OMeta#, es una implementación mucho más sólida y con más soporte, distribuida bajo licencia BSD en GitHub.

Ohm

Ohm es un sucesor de Ometa que pretende mejorarlo (entre otras cosas) separando la gramática de las acciones semánticas. [10]

Véase también

Referencias

  1. ^ abcdefghij Warth, Alessandro e Ian Piumarta. "OMeta: un lenguaje orientado a objetos para la búsqueda de patrones". Simposio de lenguajes dinámicos ACM SIGPLAN 2007 (DLS '07). 03.ª ed. Vol. TR-2007. Glendale, California: Viewpoints Research Institute, 2007. Informe técnico de VPRI. Web. 30 de septiembre de 2013.
  2. ^ ab Klint, Paul, Tijs Van Der Storm y Jurgen Vinju. "Sobre el impacto de las herramientas DSL en la capacidad de mantenimiento de las implementaciones de lenguajes". LDTA '10 Actas del décimo taller sobre descripciones, herramientas y aplicaciones de lenguajes. Nueva York, NY. Np, 2010. Web. 30 de septiembre de 2013.
  3. ^ abcdefghi Heirbaut, Nickolas. "Comparación de dos técnicas de implementación para lenguajes específicos de dominio: OMeta/JS frente a Javascript". Tesis. Universidad de Ámsterdam, 2009. Web. 30 de septiembre de 2013. <http://dare.uva.nl/document/153293>.
  4. ^ Mascarenhas, Fabio, Sergio Medeiros y Roberto Ierusalimschy . Análisis de gramáticas de expresiones para datos estructurados. Np: np, nd Web.<http://www.lbd.dcc.ufmg.br/colecoes/sblp/2011/003.pdf>.
  5. ^ abcdefghi 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.
  6. ^ abc 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>.
  7. ^ Warth, Alessandro. "OMeta/Squeak 2". OMeta/Squeak 2. Sin título, sin fecha. Web. 16 de octubre de 2013.<http://tinlizzie.org/ometa/ometa2.html>.
  8. ^ Moser, Jeff. "Moserware": Meta-FizzBuzz, Blogger, 25 de agosto de 2008. Web. 30 de septiembre de 2013.
  9. ^ Moser, Jeff. "Moserware.": Building an Object-Oriented Parasitic Metalanguage Blogger, 31 de julio de 2008. Web. 30 de septiembre de 2013.
  10. ^ "Filosofía de Ohm".

Enlaces externos