9

Estoy comenzando un proyecto en el que necesito implementar un intérprete liviano. El intérprete se usa para ejecutar algoritmos científicos simples. (. Por ejemplo, los matemáticos) El lenguaje de programación que este intérprete uso debe ser simple, ya que se dirige a los desarrolladores de software noConstruyendo un intérprete simple

El intérprete debe apoyar lenguajes de programación básicos características:

  • Los números reales, variables, matrices multidimensionales
  • binarios (+, -, *, /,%) y booleanas (==,! =, <,>, < =,> =) operaciones
  • Loops (para, al tiempo) , Expresiones condicionales (si)
  • Funciones

MathWorks MatLab es un buen ejemplo de adónde voy, simplemente mucho más simple. El intérprete se usará como un entorno para demostrar algoritmos; algoritmos simples como encontrar el promedio de un conjunto de datos/matriz, o algoritmos ligeramente más complicados como Gaussian elimination o RSA.

El recurso mejor/más práctico que encontré sobre el tema es la entrada de Ron Ayoub en Code Project (Parsing Algebraic Expressions Using the Interpreter Pattern), un ejemplo perfecto de una versión reducida de mi problema.

El Libro del Dragón Púrpura parece ser demasiado, ¿algo más práctico?

El intérprete se implementará como una biblioteca .NET, utilizando C#. Sin embargo, los recursos para cualquier plataforma son bienvenidos, ya que la parte de arquitectura de diseño de este problema es la más desafiante.

¿Algún recurso práctico?

(evita por favor “esto no es trivial” respuestas o “por qué volver a inventar la rueda”)

Respuesta

10

lo escribiría en ANTLR. Escribe la gramática, deja que ANTLR genere un analizador C#. Puede ANTLR solicitar un árbol de análisis sintáctico, y posiblemente el intérprete ya puede operar en el árbol de análisis sintáctico. Quizás deba convertir el árbol de análisis sintáctico a una representación interna más abstracta (aunque ANTLR ya permite omitir la puntuación irrelevante al generar el árbol).

2

Puede parecer extraño, pero Game Scripting Mastery es un gran recurso para aprender a analizar, compilar e interpretar código.

que realmente debe comprobar que funciona:

http://www.amazon.com/Scripting-Mastery-Premier-Press-Development/dp/1931841578

+0

¡Libro excepcional! El lenguaje de scripts descrito en el libro se implementa en C# en http://www.codeproject.com/KB/cs/Conscript.aspx –

+0

Lo curioso es que Alex Varanese y yo nos remontamos mucho atrás, solíamos hablar sobre irc en nuestros jóvenes adolescentes. Es interesante ver que él es un autor ahora. Era un maestro del ensamblaje x86. – FlySwat

2

Una forma de hacerlo es examinar el código fuente de un intérprete existente. He escrito un intérprete de Javascript en el lenguaje de programación D, puede descargar el código fuente desde http://ftp.digitalmars.com/dmdscript.zip

Walter Bright, Marte Digital

1

Ha considerado el uso IronPython? Es fácil de usar desde .NET y parece cumplir todos sus requisitos. Entiendo que Python es bastante popular para la programación científica, por lo que es posible que sus usuarios ya estén familiarizados con ella.

2

Lua fue diseñado como un intérprete extensible para uso de los no programadores. (Los primeros usuarios fueron geólogos petroleros de Brasil, aunque el user base has broadened considerably desde entonces.) Puede tomar Lua y agregar fácilmente sus algoritmos científicos, visualizaciones, lo que tiene. Está magníficamente diseñado y puede continuar con la tarea que tiene entre manos.

Por supuesto, si lo que realmente quieres es la diversión de construir el tuyo, entonces el otro consejo es razonable.

0

El lenguaje de programación que utilizará este intérprete debe ser simple, ya que se dirige a desarrolladores que no son de software.

Voy a mencionar esta parte de su pregunta. Un lenguaje simple no es lo que realmente desea entregar a los desarrolladores que no son de software. Los lenguajes eliminados requieren más esfuerzo por parte del programador. Lo que realmente desea es un lenguaje de dominio específico bien diseñado y bien implementado (DSL).

En este sentido, repetiré lo que Norman Ramsey recomienda con Lua. Tiene una excelente reputación como base para DSL de alta calidad. Una DSL bien documentada y útil requiere tiempo y esfuerzo, pero ahorrará tiempo a todos en el largo plazo cuando los expertos en el dominio pueden actualizarse rápidamente y requieren un soporte mínimo.

0

Estoy sorprendido de que nadie haya mencionado xtext todavía. Está disponible como Eclipse plugin y IntelliJ plugin. Proporciona no solo el analizador como ANTLR, sino toda la interconexión (incluidos el analizador, el vinculador, el contador de tipos, el compilador) necesarios para una DSL. Puede verificar su código fuente en Github para entender cómo funciona un intérprete/compilador.

Cuestiones relacionadas