2009-12-18 22 views
14

He decidido escribir un pequeño intérprete como mi próximo proyecto, en Ruby. ¿Qué conocimientos/habilidades tendré que tener para tener éxito?
Todavía no he decidido el idioma para interpretar, pero estoy buscando algo que no sea un lenguaje de juguete, pero sería relativamente fácil escribir un intérprete. Gracias de antemano.¿Cómo escribir un intérprete?

+0

¿eh? Si no se decide sobre el idioma, ¿cómo puede saberlo? Algunos pueden ser muy simples de interpretar, incluso utilizando bibliotecas ... –

+0

Creo que es mucho más fácil escribir un intérprete de Ruby en Lisp que viceversa. – Svante

+0

Svante, no estoy tan seguro de eso. –

Respuesta

29

Tendrá que aprender por lo menos:

  • análisis léxico (la agrupación de caracteres en tokens)
  • análisis sintáctico (agrupación fichas juntas en la estructura)
  • árbol de sintaxis abstracta (que representan la estructura del programa en un conjunto de datos estructura)
  • representación de datos (suponiendo que su idioma tendrá variables)
  • un bucle de evaluación que "ejecuta" su programa

Puede encontrar una excelente introducción a algunos de estos temas en el texto introductorio Structure and Interpretation of Computer Programs. El lenguaje utilizado en ese libro es Scheme, que es un lenguaje robusto y bien especificado que es ideal para su primera implementación de intérprete. Muy recomendable.

+0

Gracias por la gran respuesta. Solo curiosidad, ¿cuánto tiempo crees que llevará completar un intérprete simple y funcional? – bennybdbc

+2

La respuesta a esa pregunta depende de muchos factores, los más importantes de los cuales son: (a) el nivel de experiencia de la persona que realiza la implementación, y (b) la elección del idioma para interpretar. También quizás (c) la elección del lenguaje de implementación. Como suposición aproximada, para un programador intermedio que aprende las técnicas, podría decir que un par de semanas de trabajo dedicado. –

1

No es tan difícil. aquí hay un LISP interpreter in ruby y la fuente es tan pequeña que se supone que debes copiarla/pegarla. pero vas a aprender LISP ahora? jeje.

5

no han decidido sobre el lenguaje para interpretar todavía, pero estoy en busca de algo que no es un lenguaje de juguete, pero sería relativamente fácil escribir un intérprete para . Gracias por adelantado.

Pruebe algún dialecto de Lisp como Scheme o Clojure. (Ahora hay una idea: Clojure-en-Ruby, que se integra con Ruby y Clojure con Java.)

Con Lisp, no hay necesidad de preocuparse por la idiosincracia de la sintaxis, ya que la sintaxis de Lisp está mucho más cerca de el árbol de sintaxis abstracta.

+1

Clorure suena como un idioma que Scooby Doo cavaría. – FMc

+0

Ha sido hecho http://www.springerlink.com/content/q3n77q7172831288/ y http://onestepback.org/index.cgi/Tech/Ruby/LispInRuby.red –

2

This SICP chapter muestra cómo escribir un intérprete Lisp en Lisp (un evaluador metacircular). En mi opinión, este es el mejor lugar para comenzar. Luego puede pasar al Lisp in Small Pieces para aprender a escribir intérpretes avanzados y compiladores para Lisp. La ventaja de implementar un lenguaje como Lisp (¡en Lisp en sí mismo!) Es que obtienes el analizador léxico, analizador sintáctico, AST, representación de datos/programas y REPL de forma gratuita. ¡Usted puede concentrarse en la tarea de hacer funcionar su gran lenguaje!

2

tenía una idea similar hace un par de días. LISP es de lejos el más fácil de implementar porque la sintaxis es muy simple, y las estructuras de datos que el lenguaje manipula son las mismas estructuras en las que está escrito el código. Por lo tanto, solo necesita una implementación mínima y puede definir el resto en términos de sí mismo.

Sin embargo, si está tratando de aprender sobre el análisis sintáctico, es posible que desee hacer un lenguaje más complejo con Abstract Syntax Trees, etc.

Si desea ver mi implementación de lisp (literalmente hace dos días), consulte mylisp.googlecode.com. Todavía estoy trabajando en ello, pero es increíble el tiempo que tardó en hacer funcionar las cosas existentes.

1

Si sólo está haciendo esto por diversión, hacer su propio lenguaje, sencillo y sólo intentarlo. Mi recomendación sería algo así como un BASIC clásico realmente simple (sin elementos visuales básicos u orientados a objetos). Con los números de línea, GOTO, INPUT e IMPRESIÓN, y eso es todo. Llegas a hacer lo básico y entiendes mejor cómo funcionan las cosas.

¿El conocimiento que necesitará?

  • Tokenización (giro que gran parte de los personajes en algo más eficiente legible, efectivamente dividirlo en 'palabras')
  • de análisis (que pasan las fichas y la construcción de una estructura de datos de la misma)
  • Interpretación (recorriendo la estructura de datos y ejecutando cada comando)

Y para este último también necesitará una forma de mantener las variables. Por lo general, solo implementaría una "pila", un gran bloque de datos donde puede marcar un área al final.

1

No implementa en Lisp, pero me pareció Write Yourself A Scheme in 48 Hours ser un documento muy útil cuando iba a comenzar con Haskell (aunque no he tenido en cualquier lugar cerca de terminarlo después de 48 horas; YMMV). También le da mucha información sobre intérpretes en general.

Cuestiones relacionadas