¿Cuál es el significado de la oración "queríamos que se compilara para que no se quemara la CPU haciendo las cosas mal".

10

Estaba leyendo este artículo. Tiene el siguiente párrafo.

¿Y resultó Scala ser rápido? Bueno, ¿cuál es tu definición de rápido? Casi tan rápido como Java. No tiene que ser tan rápido como C o Asamblea. Python no es significativamente más rápido que Ruby. Queríamos hacer más con menos máquinas, aprovechando mejor la concurrencia; queríamos que se compilara para que no se quemara la CPU haciendo las cosas mal.

Estoy buscando el significado de la última oración. ¿Cómo hará que el lenguaje interpretado haga que la CPU haga cosas "incorrectas"?

usuario2434
fuente
3
Llamar a cualquier cosa que se compila al código de bytes JVM interpretado es un poco liberal con el uso.
Plataforma

Respuestas:

47

Si el código dice

A = A + 1

el código compilado hace esto

add A, 1

el código interpretado hace esto (o alguna variación)

look up the location of A in the symbol table
find the value of A
see that 1 is a constant
get its value
add the value of A and the value of 1
look up the location of A in the symbol table
store the new value of A

¿captar la idea?

Mike Dunlavey
fuente
3
A veces, la simplificación excesiva realmente hace que la imagen sea más clara ;-) (solo para completar: muchos intérpretes conocidos optimizan algunos de los pasos, por lo que están a medio camino entre las dos "implementaciones" de muestra aquí).
Joachim Sauer
3
@JoachimSauer: Tienes razón, por supuesto. Todavía es difícil hacer que un intérprete funcione con menos de un factor de penalización de 10 velocidades en comparación con el código compilado. Si el lenguaje es uno que realmente pasa todo su tiempo en funciones compiladas subordinadas que deben llamarse de todos modos, como las bibliotecas de matemáticas o las E / S, el costo de la interpretación no es un problema.
Mike Dunlavey
1
Esta es una descripción increíble
Jamie Taylor
13

queríamos que se compilara para que no se quemara la CPU haciendo las cosas mal.

Parece que se refieren a compilado vs interpretado. Lo más probable es que se deba a la historia completa de Twitter moviendo tareas de procesamiento en segundo plano a Scala (compiladas) después de desarrollarse inicialmente en Ruby On Rails (interpretado).

Una explicación del código compilado vs interpretado aquí .

Con un lenguaje compilado, el código que ingresa se reduce a un conjunto de instrucciones específicas de la máquina antes de guardarse como un archivo ejecutable. Con los idiomas interpretados, el código se guarda en el mismo formato que ingresó. Los programas compilados generalmente se ejecutan más rápido que los interpretados porque los programas interpretados deben reducirse a instrucciones de máquina en tiempo de ejecución.

KrisG
fuente
Feliz de darte tu primer +1. ¡Bienvenido a P.SE!
haylem
44
(Vale la pena mencionar que Scala, ya que está en la JVM, técnicamente solo se compila en bytes).
haylem
No sabía que Scala estaba basado en JVM. Lo que significa que es probablemente JIT compilado. En ese caso, ¿por qué Twitter no se mudó de Ruby on Rails a JRuby? Se podría pensar que sería una migración más fácil con el beneficio de compilar.
KrisG
3
También buscaban un mejor modelo de concurrencia y tenían problemas con la recolección de basura de Ruby. El artículo lo describe en detalle.
scrwtp
9

"Cosas incorrectas" aquí significa la sobrecarga que le toma al intérprete analizar y procesar el código. Está conectado con la noción de lenguajes interpretados vs compilados. Hay varios modelos de traducción de código en uso, que se dividen aproximadamente en una de las siguientes categorías:

  • Compilación nativa: el código fuente se compila directamente en el código de máquina. El mejor rendimiento a expensas de la portabilidad. Comúnmente asociado con C y C ++,
  • Compilación intermedia: el código fuente se compila en un lenguaje intermedio simplificado (bytecode), que luego se interpreta o compila (compilación justo a tiempo) en el código de la máquina durante la ejecución. Mejor portabilidad que el código nativo, mejor rendimiento que la interpretación pura al tiempo que conserva algunas de las ventajas de la interpretación (como el enlace tardío). Los ejemplos incluyen C #, Java y otros lenguajes dirigidos a JVM y .NET CLR,
  • Interpretación: el código fuente no se traduce directamente al código de la máquina, sino que lo interpreta y ejecuta un programa de intérprete dedicado. Los intérpretes varían en sofisticación, en la implementación ingenua, sin embargo, se reduce a analizar, analizar y ejecutar el código fuente línea por línea. La interpretación permite una mayor flexibilidad que la compilación, por lo tanto, los lenguajes interpretados hacen un uso más amplio del tipeo dinámico o la reflexión, por ejemplo. A menudo se considera que los lenguajes interpretados ofrecen una mayor productividad del desarrollador, ya que requieren menos código repetitivo y se prestan muy bien para la creación rápida de prototipos. Lo malo es un rendimiento reducido. Comúnmente asociado con JavaScript, Ruby o Python.

Por lo tanto, la elección entre lenguaje interpretado y compilado se reduce a la pregunta: ¿qué valoramos más, la productividad o el rendimiento del desarrollador? La migración descrita en el artículo parece seguir la misma línea de pensamiento, con un fuerte lenguaje de prototipos Ruby reemplazado por Scala basado en JVM debido a consideraciones de rendimiento.

scrwtp
fuente
-1 la forma en que está redactada la respuesta, parece demasiado simplista. Se ignora por completo la materia como JIT ( just-in-time compilación ) - que es por la forma en cómo se ejecuta sobre Scala JVM / CLR
mosquito
Cierto. Reescrita la respuesta, agregaba poco al tema por así decirlo.
scrwtp
-3

En este caso, he the wrong stuffentendido que significa falta de seguridad de tipo en código no compilado.

Por lo tanto, no solo el código se interpreta más lento, sino que también tiene más errores ...

Neil Twist
fuente
8
Asume que los lenguajes compilados son de tipo seguro y los interpretados no. Hay muchos ejemplos de contadores. Por ejemplo, lisp se puede compilar y no está muy tipeado, mientras que Haskell se puede interpretar y es MUY seguro
Zachary K
1
Igualar "no es seguro para escribir" con "más buggy" es FUD impulsado por personas con productos para vender.
usuario16764
1
@ user16764: No es FUD si es verdad. IME las personas que presionan tonterías sobre el tema para vender productos son las que intentan minimizar el vínculo entre la tipificación dinámica y los errores. ("Es solo un tipo de error ", etc.)
Mason Wheeler