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 ()

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

днище как проверка типов в рантайме как в питухоне

Это не днище, а вполне естественно для динамики.

работает как строгая динамическая типизация, но во время компиляции

Нет, это обычная статика.

Crystall

Crystal is statically type checked

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

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

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

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

Хочу заметить, что этой «новизне» — лет примерно 40, с тех пор как в Smalltalk RTTI завезли.

В некоторых местах, например в Kotlin додумались до классов с ограниченным набором наследников. Это позволяет использовать конструкции when/case с явным перебором всех вариантов — компилятор откажется компилировать кусок, если не перечислить всех допустимых наследников. Конечно, else в таком when тоже возможен, но не нужен и даже вреден, так как при явном перечислении типов, добавление нового типа наследника при рефакторинге сразу дает ошибку компиляции всех кусков с when/case. Эдакий enum на стероидах.

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

Smalltalk, Erlang

В теории да но на практике это два разных мира. В эрланге нет иерархии которая подразумевается везде где говорят про ооп. И хотя ее в теории можно накрутить этим никто не будет заниматься из соображений производительности и понятности кода. Те же параметрические модули были похожим экспериментом но их вскоре задеприкейтили.

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

Э, да он же статично типизированный. Интересно, как можно было это не написать в «основных особенностях»? Загадочно мышление перлокодеров.

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

Расскажи с чего ты решил изучать кристал а не какой другой новый язык?

Я когда-то проникся Ruby и считаю его очень комфортным для себя по ряду параметров. На одной из работ пилил Chef (в котором кукбуки пишутся на Ruby DSL) и кое-какой руби софт.

Потом волна хайпа вынесла Go, от него меня тошнит. Но ведь миллион мух девелоперов не могут ошибаться? К тому же поддержка гугла это не фигня какая-то.

Чуть позже нашёл Crystal, уже года три за ним наблюдаю. Жаль, что там разработчиков сильно меньше и денег меньше. Поэтому про него пока мало кто знает.

Написал уже на нём один микросервис, работает в продакшне. Ещё несколько мелких проектов. Так-то я не погромист, а больше админ-девопс.

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

у сабжа еще есть корутины и с типами все получше.

Корутины это охрененно. Просто spawn’ишь и оно просто работает параллельно. Обмен данными — через Channel.

snp ()
Ответ на: комментарий от Ford_Focus

ооп лишь подход к написанию кода программ, его можно организовать и на процедурном языке, не говоря уже о golang, никто не спорит с тем, что возможно проще писать такого рода код если язык разрабатывался именно для написание подобного кода и содержит соответствующие механизмы и языковые конструкции для этого, но меж тем ТС так и не ответил ни на один вопрос. Любой тут может сказать что язык А лучше языка Б, без обоснования своих слов, хотя бы примеры привел бы… Так что альтернативное восприятие скорее у того, кто не понимает что ооп лишь подход, который может иметь разную реализацию лишь бы она была непротиворечива принципам этого подхода.

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

ооп лишь подход к написанию кода программ, его можно организовать и на процедурном языке

Верно, но Go — настоящий ООП-язык, с интерфейсами, объектами, инкапсуляцией, наследованием поведения, полиморфизмом и т.д.

[code=Go] type Canvas interface {…}

type Figure interface { Draw(Canvas) }

type Point struct func (p Point) Draw(c Canvas) {…}

type Square struct func (s Square) Draw(c Canvas) {…}

type Circle struct func (c Circle) Draw(c Canvas) {…}

func (c Canvas) Render(figs []Figure) { c.Clear() for _, f := range figs { f.Draw(c) } } [/code]

Чего ещё нужно-то? Иерархий наследования реализации нет, так это давно признано вредным.

Кристал лучше бы транспилировался в Go :). Был бы Go с паскалевским синтаксисом для любителей. А так он пытается конкурировать с Go на одном поле, но безнадёжно отстаёт — шансов нет.

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

ооп лишь подход к написанию кода программ, его можно организовать и на процедурном языке

можно и сову на глобус натянуть, процедурный язык останется процедурным, а структуры не станут объектами

Ford_Focus ★★★★★ ()
Последнее исправление: Ford_Focus (всего исправлений: 1)
Ответ на: комментарий от Ford_Focus

структуры не станут объектами

ООП на прототипах можно запилить на коленке без особых проблем. Правда при этом получится как в известном высказывании про Си и ЛИСП, т.е. по сути это будет виртуальная недомашина.

no-such-file ★★★★★ ()
Последнее исправление: no-such-file (всего исправлений: 1)

не разобрался как делать биндинги для сложных стктур сишка (которые там содержат 100+полей), в других языках, где утвреждается что есть биндинги, такой же мрак. для простых int окей, а для чего-то более сложного уж лучше на си писать или крестах, чем делать обёртки на кристале\ним.

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

го - отличный язык в своей нише. важнее поддержки гугла например то нужно ли тебе переписывать миллион строк кода которые уже 10 лет крутятся в продакшене при релизе новой версии компилятора. у го с этим всё хорошо, у питухона плохо, поэтому го уже лучше питухона. остальное - это особенности языка которые важны, но не очень, у каждого языка всегда будут свои особенности.

на одних языках пишут миллионы строк кода, а на других этого лучше не делать. на го в принципе можно пробовать, а на питухоне ты закончишь как ютуб или дропбокс, когда у тебя есть огромная старая куча г-на которую даже автор языка не может за 10 лет переписать на новую кучу г-на, и проще это всё уже переписать на другом языке на котором это будет работать без каких-то проблем следующие 20 лет.

го - простой, стройный и логичный язык, его будет сложно сломать. если кристал будет простым, стройным и логичным, то всё будет ок.

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

корутины - это другое, корутина - это обобщение функции, а функция - это специализация корутины. то, что в эрланге и го - это зелёные потоки, а самые годные корутины могут быть в с++, если опять не зафакапят как это обычно бывает хахаха. может быть в с++26 будет что-то годное, или может в новых компиляторах доведут до ума.

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

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

кристал будет простым, стройным и логичным

Так уже почти. Зарелизят 1.0.0 — API зафиксируют и заживём. Под него пока шардов готовых маловато, но со временем и это поправят.

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

Зарелизят 1.0.0 — API зафиксируют и заживём.

им надо ещё переименовать язык, ибо название «crystal» не ищется в поисковиках, та же ошибка, что и у go

anonymous ()