programming language crystal ruby performance runtime crystal-lang

ruby - programming - language crystal



¿Por qué Crystal es más rápido que Ruby? (1)

Supongo que es una combinación de cosas:

  • Ruby es interpretado, y el intérprete podría ser mejorado. Por ejemplo, otros lenguajes interpretados como JS o Java tienen un muy buen compilador VM y JIT.
  • Muchas comprobaciones de Ruby que se realizan en tiempo de ejecución, en Crystal se realizan en tiempo de compilación. Por ejemplo, una simple llamada de método en Ruby termina en una búsqueda de método. Incluso con un caché no vencerá una llamada de función nativa. O cuando Ruby decide hacer cosas diferentes según el tipo de argumento, estas verificaciones se realizan en tiempo de ejecución. En Crystal se conocen en tiempo de compilación, por lo que esos cheques desaparecen. Sin esos controles, el compilador puede hacer llamadas en línea y hacer algunas cosas bastante locas (gracias a LLVM). O, por ejemplo, buscar una instancia de varaibles es una búsqueda de hash en Ruby (que yo sepa), mientras que en Crystal es solo una indirección de memoria y carga.
  • En Crystal intentamos evitar asignaciones de memoria extra. Por ejemplo, to_s(io) escribe en un IO en lugar de convertir el objeto en una cadena en la memoria. O tenemos tuplas para arreglos de tamaño fijo que se asignan en la pila. O puede declarar un tipo como una estructura para evitar las asignaciones de pila.
  • Las llamadas a C se realizan directamente, sin envoltorios. Bueno, podrías tener un envoltorio, pero LLVM lo insertará. En Ruby siempre hay que resolver primero un método Ruby.

Probablemente hay muchas más razones, pero están relacionadas.

Me gustaría mucho saber qué hace que Crystal sea más rápido que Ruby, mientras que el código es muy similar. La respuesta corta podría ser que está compilado, y Ruby es interpretado, pero me gustaría entender más sobre las especificaciones del idioma.