Pregunta

He sido la programación en Ruby desde hace un tiempo sólo con la aplicación estándar de resonancia magnética de Ruby, pero siempre he tenido curiosidad por las otras implementaciones que tanto se habla.

Yo estaba leyendo acerca de Rubinius el otro día, un intérprete de Ruby escrito en Ruby. Traté de mirar hacia arriba en varios lugares, pero yo estaba teniendo un tiempo difícil averiguar exactamente cómo algo como esto funciona. Nunca he tenido mucha experiencia en la escritura compiladores o idioma, pero estoy realmente interesado en averiguarlo.

¿Cómo funciona exactamente un lenguaje puede ser interpretado por sí mismo? ¿Hay un paso fundamental en la recopilación de que yo no entiendo que esto tiene sentido? ¿Puede alguien explicar esto a mí como si yo fuera un idiota (porque eso no sería demasiado lejos de la base de todos modos)

¿Fue útil?

Solución

Es más sencillo de lo que piensa.

Rubinius no es 100% escrito en Ruby, justo en su mayoría.

http://rubini.us/

Un gran aspecto de lenguajes populares como C y Java es que la mayoría de la funcionalidad disponible para el programador está escrito en el lenguaje mismo. Rubinius tiene el objetivo de añadir a esa lista Rubí. Rubyistas podrían más fácilmente añadir características al lenguaje, arreglar errores, y aprender cómo funciona el lenguaje. Siempre que sea posible Rubinius está escrito en Ruby. Cuando no sea posible (aún), es C ++.

Otros consejos

El concepto que busca es compilador de arranque .

significa escribir un compilador (o un intérprete) para el lenguaje bootstrapping Básicamente x en el lenguaje x . Esto se hace ya sea escribiendo un compilador básica en un nivel inferior con la mano (es decir, escribir un compilador de C en la Asamblea), o mediante el uso de un lenguaje de alto nivel diferente.

Más información acerca de bootstrapping en Wikipedia . La respuesta de Greg con respecto a los evaluadores los meta-circular es también muy recomendable, incluyendo el capítulo correspondiente SICP.

En caso de Rubinius, la máquina virtual está escrito en C ++ y se ocupa de todo el bajo nivel (sistema operativo relacionado) operaciones cosas y de base. La máquina virtual tiene su propio formato de código de bytes (como la JVM tiene su propia también) y cuando se inicia Rubinius Se inicia la máquina virtual que se ejecuta el código de bytes. La mayor parte de la biblioteca estándar de Rubinius' (que es parte de la lengua Rubí) se implementa en Ruby sin embargo, en comparación con C (IRM) o Java (JRuby). Además, el código de bytes compilador Rubinius también está escrito en Ruby. Así que sí, en algún momento a principios de en el comienzo que tuvieron que utilizar el estándar intérprete de Ruby (MRI) para arrancar Rubinius. Pero esto no debería ser el caso más (aunque no estoy seguro de si es posible que aún lo necesitan ya que su uso del sistema de construcción de rake).

Supongamos que el idioma en el que está trabajando es un lenguaje, por ejemplo Lisp, aunque no importa. (Podría ser C ++, Java, Ruby, cualquier cosa.)

Bueno, tiene una implementación de Lisp. Llama a esta aplicación Imp (sólo algunas compone nombre corto para la implementación). Desde Imp es un programa en sí mismo, su computadora puede ejecutar. Ahora usted escribe su propia implementación de Lisp escrito en Lisp y lo llamas Circ. Circ es sólo un programa compilado (o interpretado si se quiere) de código Lisp. Su código está escrito para que se lea en un archivo, lo analiza (procesos en datos significativos), y hace algo con los datos. ¿Qué es ese algo? En el caso de Circ, ejecuta los datos.

Pero, ¿cómo hacerlo?

Bueno, supongamos por un simple caso de que el código Circ lee y analiza en algo tan simple como hacer un poco de matemáticas y salida al resultado. Circ procesa el código en los datos fácil de usar (bien para un lenguaje como Lisp es fácil empezar, pero que está más allá del punto) y lo almacena. Bien en Lisp se puede escribir código para exprimir números por lo que el código escrito para Circ puede hacer lo mismo, ya que está escrito en Lisp. Así que los datos procesados ??se enchufa en un código de procesamiento Además ... y listo! Usted tiene el resultado numérico! A continuación, el programa de Circ muestra el resultado.

Lo mismo se puede hacer con las cosas más complejas que la simple matemática. De hecho se puede compilar / interpretar otros aspectos de la lengua. Escribir lo suficiente de estos 'otros aspectos' y pegarlas juntas, se obtiene un compilador para un Lisp escrito en Lisp.

Desde el compilador es compilada por Imp, que puede ser ejecutado por la máquina, y ¡listo! Usted está hecho.

Esta técnica se denomina generalmente un metacircular evaluador atrás y se introdujo por primera varias décadas en el contexto de Lisp.

Una buena descripción de la técnica se puede encontrar en Estructura e Interpretación de programas de ordenador , capítulo 4.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top