LINUX.ORG.RU

Вышел Crystal 0.34.0

 , ,


3

5

Вышла новая версия Crystal, компилируемого языка программирования с синтаксисом Ruby, главные особенности которого — рантайм с «вмонтированным» event loop’ом, в котором все операции ввода-вывода асинхронны, поддержка многопоточности (пока включается флагом при компиляции) и исключительно простая и удобная работа с библиотеками на Си.

Начиная с версии 0.34.0, язык официально начинает твёрдой поступью двигаться в сторону первого настоящего релиза (т.е. версии 1.0).

В новой версии Crystal можно отметить следующие изменения и улучшения в порядке их важности:

  • В API добавлена новая библиотека журналирования Log, которая, в отличие от старой, умеет направлять сообщения в разные бекенды и по-разному эти сообщения фильтровать в зависимости от «источника».

  • Рудименты из мира разработки на Си, Errno и WinError, использовавшиеся для примитивов ввода-вывода, уходят в прошлое благодаря иерархии исключений IO::Error (впрочем, использовать Errno никто пока не запрещает).

  • Убрана автоматическая подстановка else nil из оператора case/when/else. Это сделано для того, чтобы исключить случайный пропуск разработчиком одной из веток when при матчинге по детерминированным случаям наподобие enum’ов и прохода по типам из Union’а. Т.е., проще говоря, вот такой код больше работать не будет без указания ещё одного when (when Char) или задания else-ветки:

a = 1 || 'x' || "foo"
case a
when Int32
  # ...
when String
  # ...
end
  • Опция компилятора disable_overflow больше недоступна. Для операций с переполнением используйте методы &+, &-, &*.

  • Array#fill теперь летает быстрее пули, благодаря замене туповатого цикла на один простой memset;

  • Менеджер шардов (пакетов), называющихся, как это ни парадоксально, shards, теперь использует более быстрый и эффективный алгоритм удовлетворения зависимостей Molinillo, подсмотренный в CocoaPods (Swift) и Builder (Ruby).

  • Добавлена поддержка LLVM 10, что по идее даст нам некий рост производительности, стабильности, etc.

… и множество других, на мой субъективный взгляд, менее существенных улучшений.

Хотелось бы отметить, что Crystal — это построенный на LLVM язык, позволяющий писать приложения порой быстрее, проще и лаконичнее, чем на его интерпретируемых «собратьях», и при этом получать на выходе довольно шустрый бинарник. На фоне Golang выделяется абсолютно полноценным ООП, поддержкой дженериков и очень простым и понятным синтаксисом. По своему назначению во многом аналогичен Nim, но при этом явным образом ориентирован на практическое применение «здесь и сейчас», благодаря чему имеет в своём API-арсенале множество нормально документированных удобных и качественных инструментов, поддерживаемых разработчиками языка и потому весьма стабильных.

>>> Анонс в блоге Crystal

★★★★★

Проверено: cetjs2 ()
Последнее исправление: Virtuos86 (всего исправлений: 4)
a = 1 || 'x' || "foo"
case a
when Int32
  # ...
when String

Ну то есть в этом языке можно положить в переменную Int, а потом попытаться вытащить строку и никто слова против не скажет. Молодцы, как раз для продакшена.

Ниша у языка какая? Заменить кого? Судя по

Array#fill теперь летает быстрее пули благодаря замене туповатого цикла на один простой memset;

Это явно не попытка заменить Си. А тогда кого? Java? C#?

PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

Ну то есть в этом языке можно положить в переменную Int, а потом попытаться вытащить строку и никто слова против не скажет. Молодцы, как раз для продакшена.

Скажет: https://play.crystal-lang.org/#/r/8uhu

case — это не «попытка вытащить строку», а «код, если переменная — строка» (её не вытаскивают как строку).

Ниша у языка какая?

В первом абзаце описано, разве нет? Ruby-like синтаксис, ну и он ещё очень быстрый, о чём не было упомянуто: https://github.com/kostya/benchmarks

Заменить кого?

А все ЯП кого-то заменяют, а не дополняют и не дают выбор?

AlexWayfer
()
Ответ на: комментарий от stasolog

Ruby рулит! Однако, он интерпретируемый, а не компилируемый, да.

saahriktu ★★★★★
()
Ответ на: комментарий от PPP328

Это явно не попытка заменить Си. А тогда кого? Java? C#?

вообще любая попытка заменить что-то что работает и не поломано туповата сама по себе.

anonymous
()
Ответ на: комментарий от PPP328

Это явно не попытка заменить Си. А тогда кого? Java? C#?

Ещё один Ruby.

kostyarin_ ★★
()
Ответ на: комментарий от PPP328

Ну то есть в этом языке можно положить в переменную Int, а потом попытаться вытащить строку и никто слова против не скажет.

Это не так. Указанная выше запись, видимо, не слишком наглядна (в переменной будет число 1 без вариантов), она приведена в оригинальном анонсе просто для того, чтобы компилятор сам вывел Union-тип, а не обычный. Тем не менее в каждый конкретный момент времени переменная выведенного на этапе компиляции Union-типа может принадлежать только к одному классу/типу, и без проверки в духе if var.is_a?(Class) просто так нельзя использовать соотв методы Class’а

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от PPP328

Судя по всему, в примере этом был Union. У них заявлена статическая типизация и вывод типов. Можно прочитать про метод as, там более детально описано, что происходит.

h4tr3d ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.