19.04.2021

Доступен язык программирования Crystal 1.0

Состоялся релиз языка программирования 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 разделён на два варианта для серверов и клиентов.

Источник.