Foi lançado o idioma de programação Crystal 1.0. Este lançamento é marcado como a primeira versão significativa, que resume 8 anos de trabalho e sinaliza a estabilização da linguagem e sua prontidão para uso em projetos profissionais. A ramificação 1.x manterá compatibilidade retroativa e garantirá a ausência de alterações na linguagem e na biblioteca padrão que possam impactar a compilação e o funcionamento de código existente.
As versões 1.0.y incluirão apenas correções, enquanto as versões 1.x.0 oferecerão novas funcionalidades e mudanças significativas, mantendo a compatibilidade com o código. Novas ideias e mudanças potencialmente incompatíveis serão desenvolvidas em uma ramificação separada, a partir da qual será formada posteriormente uma versão do Crystal 2.0. Algumas funcionalidades do Crystal 1.0 são declaradas como preliminares e, apesar de estarem na ramificação 1.0, não estão cobertas por suporte oficial. Entre essas funcionalidades estão a programação monotheada, operação na plataforma Windows e uso em sistemas com processadores ARM.
Lembramos que os desenvolvedores do Crystal tentam combinar a facilidade de desenvolvimento da linguagem Ruby com a alta performance de aplicativos, característica da linguagem C. A sintaxe do Crystal é próxima da linguagem Ruby, mas não é totalmente compatível com ela, apesar de alguns programas em Ruby serem executados sem retrabalho. O código do compilador é escrito na linguagem Crystal e distribuído sob a licença Apache 2.0.
A linguagem utiliza verificação de tipo estática, implementada sem a necessidade de especificação explícita dos tipos de variáveis e argumentos de métodos no código. Programas em Crystal são compilados em arquivos executáveis, com resolução de macros e geração de código durante a compilação. Em programas na linguagem Crystal, é permitido o uso de bindings escritos na linguagem C. A paralelização da execução do código é realizada através da palavra-chave "spawn", que permite iniciar uma tarefa em segundo plano de forma assíncrona, sem bloquear o thread principal, na forma de threads leves, chamadas fibras (Fiber).
A biblioteca padrão oferece um grande conjunto de funções comuns, incluindo ferramentas para processamento de CSV, YAML e JSON, componentes para criação de servidores HTTP e suporte a WebSocket. Durante o desenvolvimento, é conveniente usar o comando "crystal play", que cria uma interface web (por padrão em localhost:8080) para execução interativa de código na linguagem Crystal.
Principais mudanças:
- Em tuplas, é permitido o acesso indexado aos elementos de tipos diferentes, pois o compilador tem informações sobre o tipo de cada elemento. Por exemplo: tuple = {1, "hello", 'x'} v = tuple[0..1] # resultará em {1, "hello"} typeof(v) # => Tuple(Int32, String)
- Em literais de strings e caracteres, o uso de abreviações de substitutos em sequências de escape Unicode, como "\uD834", é proibido. Para codificação de valores arbitrários, deve-se usar a notação "\x".
- Na biblioteca padrão, uma grande quantidade de definições, macros e métodos que foram anteriormente marcados como obsoletos foi removida. Isso inclui métodos como Set, StaticArray#[], YAML.new, HTTP::Request, HTTP::WebSocket, Hash#delete_if, Process#kill, etc.
- Agora, nas macros getter e property, é obrigatório especificar o tipo de retorno.
- O método de arredondamento padrão foi alterado para TIES_EVEN ("arredondamento bancário", para o inteiro mais próximo, e para situações limites, para o número par mais próximo). Em Number#round, foi adicionado o parâmetro RoundingMode, permitindo a escolha do método de arredondamento. Entre os métodos disponíveis estão: TIES_EVEN, TIES_AWAY, TO_ZERO, TO_POSITIVE, TO_NEGATIVE.
- Nas coleções, foi assegurado o funcionamento de Enumerable#flat_map e Iterator#flat_map com elementos de tipos mistos.
- Ao serializar sequências Enum, agora são usadas representações em forma de strings com sublinhados.
- Tipos definidos no módulo XML foram alterados de struct para class.
- Por motivos de segurança, a decodificação dos nomes de Cookie foi interrompida, assim como a codificação e decodificação de valores de Cookie (a recodificação é agora responsabilidade de frameworks e aplicativos). O método HTTP::Cookies.from_headers foi dividido em duas versões para servidores e clientes.
Fonte: opennet.ru
