(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(93790508, "init", { defer: true, clickmap:true, trackLinks:true, accurateTrackBounce:true }); ym(93790508, 'hit', window.location.href);

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

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

Справочно. Назвать язык новым нельзя, поскольку разрабатывается он с 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.

0
15 комментариев
Написать комментарий...
Константин Глядяев

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

Ответить
Развернуть ветку
Аккаунт удален

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

Ответить
Развернуть ветку
Константин Глядяев

Скоро придут дженерики ) мне вот норм и так, но на вкус и цвет , как говорится

Ответить
Развернуть ветку
Аккаунт удален

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

Ответить
Развернуть ветку
Константин Глядяев

Хз, вот в моем окружении целая куча ждунов, которые что то все ждут и ноют =)

Ответить
Развернуть ветку
Артурас Лапинскас

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

Ответить
Развернуть ветку
Роман Романов

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

Ответить
Развернуть ветку
Андрей Агеев

Скорее попытка не заставлять рубистов учить новый синтаксис и при этом не заниматься некрофилией на рубях

Ответить
Развернуть ветку
Роман Романов

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

Ответить
Развернуть ветку
⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝⃝

Зачем

Ответить
Развернуть ветку
Роман Романов

Чтобы походило на букву C.

Ответить
Развернуть ветку
Andrew

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

Ответить
Развернуть ветку
Andrey Bulygin

Это альтернатива скорее Go чем C

Ответить
Развернуть ветку
Аккаунт удален

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

Ответить
Развернуть ветку
Никита Матлинг

Просто пытаются сделать язык похожий на уровень C. Мне кажется это будет невозможно в ближайшее время.

Ответить
Развернуть ветку
12 комментариев
Раскрывать всегда