Языков программирования в мире много — около 8 тысяч, если учитывать вообще все, что может считаться языком программирования, включая всякие шуточные и теоретические проекты. На днях вышла версия 1.0 еще одного языка — Crystal.

Его создатели утверждают, что язык является простым, как Ruby, и быстрым, как С. Назвать его новым нельзя, поскольку разрабатывается он с 2011 года, именно как альтернатива Ruby. Авторы проекта заявляют, что язык теперь готов к использованию в обычных условиях, и является стабильным.

Что это за язык такой?


Если вы не слышали о проекте раньше, то вот краткое его описание. Crystal — это высокоуровневый объектно-ориентированный язык программирования. Его синтаксис очень похож на синтаксис Ruby, но отличается от своего конкурента тем, что компилируется в машинный код посредством LLVM.

По словам разработчиков и сторонних компаний, которые уже протестировали язык, производительность приложений, написанных на Crystal сравнима с приложениями на С. Последний считается более сложным для освоения, чем Ruby. Таким образом, создатели Crystal убивают сразу двух зайцев — дают возможность писать быстрые приложения, и обеспечивают низкий порог входа в разработку.

Что особенного в Crystal?


В первую очередь, то, что это язык со статической типизацией. Этим он отличается от Ruby. На практике это означает, что ошибки несоответствия типов переменных выявляются компилятором уже на стадии переработки исходного кода в машинный, а не в процессе его выполнения интерпретатором.

При этом язык не нуждается в указании конкретных типов переменных либо аргументов метода. Дело в том, что компилятор выводит их самостоятельно при помощи специализированного механизма. Разработчики предусмотрели проблему автоматического управления памятью за счет использования «консервативного» сборщика мусора (garbage collector) Boehm GC. Язык поддерживает как макросы, так и дженерики, плюс способен работать с перегрузкой методов и операторов.

Преимущество Crystal в том, что он, как и Ruby, предлагает независимую от ОС реализацию многопоточности. Легковесные потоки в Crystal называются «волокнами» (fibers). Потоки, как и в языках Go и Clojure, могут взаимодействовать друг с другом посредством каналов, без необходимости прибегать к использованию общей памяти либо же блокировкам.

В Crystal реализован интерфейс вызова функций из библиотек языка С. При этом синтаксис взаимодействия простой — соответственно, с использованием Crystal можно создавать библиотеки-обертки, без необходимости писать код с нуля.

Стандартная библиотека языка представляет широкий спектр типовых функций, включая средства для обработки CSV, YAML, и JSON, компоненты для создания HTTP-серверов и поддержки WebSocket. В процессе разработки предлагается использовать команду «crystal play» которая формирует web-интерфейс (по умолчанию localhost:8080) для интерактивного выполнения кода на языке Crystal.

Что изменилось с релизом 1.0?


Изменений не так много, но их можно назвать критически важными.

Во-первых, в кортежах (tuples) теперь можно обращаться к элементам отличающихся типов по индексу. Компилятор в состоянии определить, к какому типу каждый из них относится.

Во-вторых, стандартную библиотеку очистили от устаревших и не рекомендованных к использованию определений. Это, например, методы:

  • HTTP::Request,
  • HTTP::WebSocket,
  • HTTP::LogHandler,
  • URI#full_path,
  • Time::Span#duration.

В-третьих, разработчики изменили принцип обработки cookie. В финальном релизе метод HTTP::Cookies.from_headers разделен на отдельные серверную и клиентскую версии. Соответственно, значения и имена файлов не кодируются/декодируются из соображений безопасности.

Есть и изменения, которые уже внесены, но пока что не поддерживаются официально. В их числе — многопоточность, которая активируется в среде с многоядерным процессором при помощи флага -Dpreview_mt, поддержка ОС Windows и процессоров с архитектурой ARM.

Есть и несколько менее значительных изменений:

  • В строковых и символьных литералах запрещено использование суррогатных сокращений в escape-последовательностях Unicode, таких как "\uD834". Для кодирования произвольных значений следует использовать нотацию "\x".
  • Метод округления по умолчанию изменен на 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.

Ну и немного истории


Как и говорилось выше, разработка языка началась еще 10 лет назад. Авторы проекта — основатели аргентинской компании Manas Technology Solutions. Изначально язык назывался Joy, а компилятор для него был создан на Ruby. Чуть позже, в 2013 году, он был переписан уже на Crystal.

Официальная версия языка была выпущена в 2014 году. С течением времени Crystal стал проектом с открытым исходным кодом, который распространяется на условиях лицензии Apache License 2.0.

Разработка ведется на деньги инвесторов, среди которых — компания Nikola, которая много лет ведет разработку электромобилей, но пока так и не представила рабочий прототип. Но зато сам язык вполне рабочий и его уже можно использовать в своих проектах.