Вышел язык программирования Crystal версии 1.0: достоинства, возможности и немного истории

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

Вышел язык программирования Crystal версии 1.0: достоинства, возможности и немного истории

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

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

Если вы не слышали о проекте раньше, то вот его краткое описание.

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

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

Понимаем ваш язык.

Selectel

Что особенного в 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, которая много лет ведет разработку электромобилей, но пока так и не представила рабочий прототип. Но зато сам язык вполне рабочий и его уже можно использовать в своих проектах.

Не пропускайте новые материалы, подписывайтесь на блог Selectel.

Вышел язык программирования Crystal версии 1.0: достоинства, возможности и немного истории
4
15 комментариев

Мне интересно , а если сравнивать с Го , какая разница будет в производительности, на сколько критична она будет. Если мы получим не большую разницу , то не вижу в нем никакого смысла , попытаться стать ещё одним хайповым языком ?

2

Комментарий недоступен

4

Так и не понял зачем он нужен... Компилируемый язык для веб?

1

Видимо, просто конкурент Руби в его же нише.

Что им мешало повернуть логотип...

Наверное, интуитивное понимание, что можно обойтись без «мудрых» советов от местечковых экспертов по всем вопросам в мире (и, по совместительству, мелких пропагандистов)