Состоялся релиз языка программирования Crystal 1.0. Выпуск отмечен как первый значительный релиз, который подвёл итоги 8 лет работы и ознаменовал стабилизацию языка и готовность для использования в рабочих проектах. В ветке 1.x будет поддерживаться обратная совместимость и гарантируется отсутствие изменений в языке и стандартной библиотеке, негативно влияющих на сборку и работу существующего кода.
Выпуски 1.0.y будут включать лишь корректирующие исправления, а версии 1.x.0 будут предлагать новую функциональность и значительные изменения, сохраняя при этом совместимостью с кодом. Новые идеи и потенциально несовместимые изменения будут развиваться в отдельной ветке, на базе которой в последующем будет сформирован выпуск Crystal 2.0. Некоторые возможности Crystal 1.0 объявлены как предварительные и несмотря на наличие в ветке 1.0, они не подпадают под официальную поддержку. Среди таких возможностей моногопоточность, работа на платформе Windows, использование на системах с процессорами ARM.
Напомним, что разработчики Crystal пытаются совместить удобство разработки на языке Ruby с высокой производительностью приложений, свойственной языку Си. Синтаксис Crystal близок к языку Ruby, но не полностью совместим с ним, несмотря на то, что без переработки выполняются некоторые ruby-программы. Код компилятора написан на языке Crystal и распространяется под лицензией Apache 2.0.
В языке применяется статическая проверка типов, реализованная без необходимости явного указания типов переменных и аргументов методов в коде. Программы на Crystal компилируются в исполняемые файлы, с вычислением макросов и генерацией кода во время компиляции. В программах на языке Crystal допускается подключение биндингов, написанных на языке Си. Распараллеливание выполнения кода осуществляется при помощи ключевого слова “spawn”, которое позволяет запустить фоновую задачу в асинхронном режиме, не блокируя основной поток, в виде легковесных потоков, именуемых фибрами (Fiber).
Стандартная библиотека предоставляет большой набор типовых функций, в том числе средства для обработки CSV, YAML, и JSON, компоненты для создания HTTP-серверов и поддержки WebSocket. В процессе разработки удобно использовать команду “crystal play” которая формирует web-интерфейс (по умолчанию localhost:8080) для интерактивного выполнения кода на языке Crystal.
Основные изменения:
- В кортежах разрешено индексированное обращение к элементам разных типов, так как компилятор имеет информацию о том, какого типа каждый элемент. Например: tuple = {1, “hello”, ‘x’} v = tuple[0..1] # выдаст {1, “hello”} typeof(v) # => Tuple(Int32, String)
- В строковых и символьных литералах запрещено использование суррогатных сокращений в escape-последовательностях Unicode, таких как “uD834”.
Для кодирования произвольных значений следует использовать нотацию “x”. - В стандартной библиотеке удалена большая порция определений, макросов и методов, ранее помеченных устаревшими. Включая методы Set, StaticArray#[], YAML.new, HTTP::Request, HTTP::WebSocket,Hash#delete_if, Process#kill и т.д.
- В макросах getter и property теперь обязательно требуется указание возвращаемого типа.
- Метод округления по умолчанию изменён на TIES_EVEN (“округление банкира”, до ближайшего целого, а для пограничных ситуаций до ближайшего чётного числа). В Number#round добавлен параметр RoundingMode, позволяющий выбрать метод округления. Среди доступных методов: TIES_EVEN, TIES_AWAY, TO_ZERO, TO_POSITIVE, TO_NEGATIVE.
- В коллекциях обеспечена работа Enumerable#flat_map и Iterator#flat_map с элементами смешанных типов.
- При сериализации последовательностей Enum теперь используются представление в форме строк с подчёркиванием.
- Типы, определённые в модуле XML, переведены с использования struct на class.
- Из соображений безопасности прекращено декодирование имён Cookie, а также кодирование и декодирование значений Cookie (перекодирование переложено на плечи фреймворков и приложений). Метод HTTP::Cookies.from_headers разделён на два варианта для серверов и клиентов.