visual tutorial programacion menos lenguajes interpretados interpretado ejemplos descargar compilado cita caracteristicas ruby interpreter interpreted-language compiled-language

programacion - ruby tutorial



¿Es Ruby realmente un lenguaje interpretado si todas sus implementaciones están compiladas en bytecode? (7)

En la respuesta elegida para esta pregunta sobre Blue Ruby , Chuck dice:

Todas las implementaciones actuales de Ruby están compiladas a bytecode. Contrariamente a las afirmaciones de SAP, a partir de Ruby 1.9, MRI incluye un compilador de bytecode, aunque la capacidad de guardar el bytecode compilado en el disco desapareció en algún momento del proceso de fusión de la máquina virtual YARV. JRuby está compilado en archivos .class de Java. No tengo muchos detalles sobre MagLev, pero parece seguro decir que también tomará ese camino.

Estoy confundido acerca de este tema de compilación / interpretación con respecto a Ruby.

Aprendí que Ruby es un lenguaje interpretado y es por eso que cuando guardo cambios en mis archivos de Ruby no necesito volver a compilar el proyecto.

Pero si ahora se compilan todas las implementaciones de Ruby, ¿es justo decir que Ruby es un lenguaje interpretado? O estoy malinterpretando algo?


Casi todos los idiomas se "compilan" hoy en día, si cuenta el código de bytes como compilado. Incluso Emacs Lisp está compilado. Ruby fue un caso especial porque, hasta hace poco, no estaba compilado en el código de bytes.

Creo que tienes razón al cuestionar la utilidad de caracterizar los idiomas como "compilado" vs. "interpretado". Sin embargo, una distinción útil es si el lenguaje crea un código de máquina (por ejemplo, un ensamblador x86) directamente desde el código de usuario. C, C ++, muchos Lisps y Java con JIT habilitado, pero Ruby, Python y Perl no.

Las personas que no conocen mejor llamarán "compilado" a cualquier idioma que tenga un paso de compilación manual por separado y a aquellos que no "interpreten".


En cuanto a la información que obtuve de RubyConf 2011 en Shanghai, Matz está desarrollando un ''MRuby'' (significa Ruby de Matz) para la ejecución de objetivos en dispositivos integrados. Y Matz dijo que el MRuby proporcionará la capacidad de compilar el código ruby ​​en código de máquina para aumentar la velocidad y disminuir el uso de los recursos (limitados) en los dispositivos integrados. Por lo tanto, hay varios tipos de implementación de Ruby y, definitivamente, no todos se interpretan durante el tiempo de ejecución.


Este es posiblemente un poco fuera de tema, pero ...

Iron Ruby es una implementación basada en .net de ruby ​​y, por lo tanto, generalmente se compila a un código de bytes y luego se compila JIT a lenguaje de máquina en tiempo de ejecución (es decir, no se interpreta). También (al menos con otros lenguajes .net, así que supongo que con ruby) ngen se puede usar para generar un binario nativo compilado antes de tiempo, por lo que efectivamente es una versión compilada de código ruby ​​de código de máquina.


Puede ejecutar programas de Ruby de forma interactiva usando irb , el Shell interactivo de Ruby. Si bien puede generar un bytecode intermedio, ciertamente no es un "compilador" en el sentido tradicional.


Sí, Ruby sigue siendo un lenguaje interpretado, o más precisamente, el intérprete de rubíes (MRI) de Matz, que es de lo que las personas suelen hablar cuando hablan de rubíes, sigue siendo un intérprete. El paso de compilación simplemente está ahí para reducir el código a algo que sea más rápido de ejecutar que interpretar y reinterpretar el mismo código una y otra vez.


Un lenguaje compilado generalmente se compila en código de máquina, en lugar de solo código de byte. Sin embargo, algunos generadores de códigos de bytes pueden compilar aún más el código de bytes en el código de máquina.

El código de byte en sí mismo es solo un paso intermedio entre el código literal escrito por el usuario y la máquina virtual, aunque aún debe ser interpretado por la máquina virtual (como se hace con Java en una JVM y PHP con un caché de código de operación).


Una pregunta sutil de hecho ... Solía ​​ser que los lenguajes "interpretados" se analizaban y se transformaban en una forma intermedia que era más rápida de ejecutar, pero la "máquina" que los ejecutaba era un programa bastante específico para cada idioma. Los idiomas "compilados" se tradujeron en cambio en las instrucciones del código de máquina admitidas por la computadora en la que se ejecutó. Una distinción temprana era muy básica: estática y dinámica. En un lenguaje escrito de manera estática, una referencia de variable podría resolverse en una dirección de memoria en unas pocas instrucciones de la máquina; usted sabía exactamente dónde en la trama de llamada se refería la variable. En los idiomas escritos dinámicamente, tuvo que buscar (arriba de una lista A o de un marco de llamada) para la referencia. Con el advenimiento de la programación orientada a objetos, la naturaleza no inmediata de una referencia se amplió a muchos más conceptos: clases (tipos), métodos (funciones), incluso interpretación sintáctica (DSL incrustadas como expresiones regulares).

De hecho, la distinción que se remonta a los finales de los 70 no era tanto entre los lenguajes compilados e interpretados, sino si se ejecutaban en un entorno compilado o interpretado. Por ejemplo, Pascal (el primer lenguaje de alto nivel que estudié) se ejecutó en UC Berkeley primero con el intérprete de pxp de Bill Joy, y luego con el compilador que escribió pcc . Mismo idioma, disponible tanto en entornos compilados como interpretados.

Algunos idiomas son más dinámicos que otros, el significado de algo (un tipo, un método, una variable) depende del entorno de tiempo de ejecución. Esto significa que compilado o no hay un mecanismo sustancial de tiempo de ejecución asociado con la ejecución de un programa. Adelante, Smalltalk, NeWs, Lisp, todos fueron ejemplos de esto. Inicialmente, estos lenguajes requerían tanto mecanismo para ejecutarse (en comparación con una C o un Fortran) que eran naturales para la interpretación.

Incluso antes de Java, hubo intentos de acelerar la ejecución de lenguajes complejos y dinámicos con trucos, técnicas que se convirtieron en compilación de subprocesos, compilación justo a tiempo, etc.

Sin embargo, creo que fue Java, que fue el primer lenguaje generalizado que realmente enturbió la brecha del compilador / intérprete, irónicamente, no para que se ejecutara más rápido (pero también para eso) sino para que funcionara en todas partes. Al definir su propio lenguaje de máquina y "máquina" el código de bytes de Java y la máquina virtual, Java intentó convertirse en un lenguaje compilado en algo cercano a cualquier máquina básica, pero no en realidad ninguna máquina real.

Los lenguajes modernos casan todas estas innovaciones. Algunos tienen la naturaleza dinámica, abierta, de los lenguajes interpretados tradicionales (ruby, lisp, smalltalk, python, perl (!)), Que algunos intentan tienen el rigor de la especificación que permite la detección de errores estáticos basados ​​en tipos profundos de lenguajes compilados tradicionales (java, scala). Todos compilan en representaciones independientes de máquinas reales (JVM) para obtener escritura semántica en cualquier lugar.

Entonces, ¿compilado vs. interpretado? Lo mejor de ambos, diría yo. Todo el código está en la fuente (con documentación), cambia cualquier cosa y el efecto es inmediato, las operaciones simples se ejecutan casi tan rápido como el hardware puede hacerlas, las complejas son compatibles y lo suficientemente rápidas, los modelos de hardware y memoria son consistentes en todas las plataformas.

La mayor polémica en los idiomas hoy en día es probablemente si se escriben de forma estática o dinámica, es decir, no lo rápido que se ejecutarán, sino que el compilador encontrará los errores de antemano (a costa del programador que tiene que especificar un tipo de teclado bastante complejo). información) o los errores surgirán en las pruebas y la producción.