Se ha lanzado el lenguaje de programación Crystal 1.0. Esta versión se marca como el primer lanzamiento significativo, que resume 8 años de trabajo y simboliza la estabilización del lenguaje y su preparación para su uso en proyectos de trabajo. La rama 1.x mantendrá la compatibilidad hacia atrás y garantiza que no habrá cambios en el lenguaje y la biblioteca estándar que afecten negativamente la compilación y el funcionamiento del código existente.
Las versiones 1.0.y incluirán solo correcciones, mientras que las versiones 1.x.0 ofrecerán nuevas funcionalidades y cambios significativos, manteniendo la compatibilidad con el código. Nuevas ideas y cambios potencialmente incompatibles se desarrollarán en una rama separada, a partir de la cual se formará posteriormente el lanzamiento de Crystal 2.0. Algunas características de Crystal 1.0 se declaran como preliminares y, a pesar de su presencia en la rama 1.0, no están cubiertas por el soporte oficial. Entre estas características se encuentran la programación monohilo, la compatibilidad con la plataforma Windows y el uso en sistemas con procesadores ARM.
Recordemos que los desarrolladores de Crystal intentan combinar la facilidad de desarrollo del lenguaje Ruby con la alta eficiencia de las aplicaciones propias del lenguaje C. La sintaxis de Crystal es similar a la de Ruby, pero no es completamente compatible con él, a pesar de que algunos programas de Ruby se ejecutan sin modificaciones. El código del compilador está escrito en Crystal y se distribuye bajo la licencia Apache 2.0.
El lenguaje utiliza una verificación de tipos estática, implementada sin necesidad de especificar explícitamente los tipos de variables y parámetros de métodos en el código. Los programas en Crystal se compilán en archivos ejecutables, con la evaluación de macros y la generación de código durante la compilación. En los programas en Crystal se permite la conexión de bindings escritos en C. La paralelización de la ejecución del código se realiza mediante la palabra clave "spawn", que permite iniciar una tarea en segundo plano de forma asíncrona, sin bloquear el hilo principal, en forma de hilos ligeros llamados fibras (Fiber).
La biblioteca estándar proporciona un amplio conjunto de funciones comunes, incluidos medios para el procesamiento de CSV, YAML y JSON, componentes para crear servidores HTTP y soporte para WebSocket. Durante el desarrollo, es conveniente usar el comando «crystal play», que genera una interfaz web (por defecto en localhost:8080) para la ejecución interactiva de código en el lenguaje Crystal.
Principales cambios:
- En las tuplas se permite el acceso indexado a elementos de diferentes tipos, ya que el compilador tiene información sobre el tipo de cada elemento. Por ejemplo: tuple = {1, «hola», ‘x’} v = tuple[0..1] # devolverá {1, «hola»} typeof(v) # => Tuple(Int32, String)
- En los literales de cadena y carácter se prohíbe el uso de abreviaturas de sustitución en secuencias de escape Unicode, como «\uD834». Para codificar valores arbitrarios, se debe utilizar la notación «\x».
- En la biblioteca estándar se ha eliminado una gran cantidad de definiciones, macros y métodos que anteriormente estaban marcados como obsoletos. Esto incluye métodos como Set, StaticArray#[], YAML.new, HTTP::Request, HTTP::WebSocket, Hash#delete_if, Process#kill, etc.
- En los macros, ahora es obligatorio especificar el tipo de retorno en getter y property.
- El método de redondeo por defecto ha cambiado a TIES_EVEN ("redondeo bancario", hacia el entero más cercano, y en situaciones límite hacia el número par más cercano). En Number#round se ha añadido el parámetro RoundingMode, que permite elegir el método de redondeo. Entre los métodos disponibles están: TIES_EVEN, TIES_AWAY, TO_ZERO, TO_POSITIVE, TO_NEGATIVE.
- En las colecciones, se garantiza el funcionamiento de Enumerable#flat_map e Iterator#flat_map con elementos de tipos mixtos.
- Al serializar secuencias de Enum, ahora se utilizan representaciones en forma de cadena con subrayado.
- Los tipos definidos en el módulo XML han sido convertidos de struct a class.
- Por razones de seguridad, se ha detenido la decodificación de nombres de Cookie, así como la codificación y decodificación de valores de Cookie (la recodificación se deja a cargo de los frameworks y aplicaciones). El método HTTP::Cookies.from_headers se ha dividido en dos variantes para servidores y clientes.
Fuente: opennet.ru
