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)
Ответ на: комментарий от anonymous

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

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

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

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

Crystall

Crystal is statically type checked

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

Пишу, когда надо, в ООП-стиле на Go.

Я тоже могу писать в «ООП-стиле» на си, но настоящим ООП это не будет.

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

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

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

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

А я прямо постоянно пишу в ООП-стиле на Perl5. Но после Crystal мне кажется, что я пытаюсь катить камень в гору, а он всё время падает мне на голову.

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

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

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

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

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

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

Smalltalk, Erlang

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

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

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

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

Дело вкуса и привычки. Кому-то, наверняка, и скобки ущербны, отступы, точки с запятой и т.д.

Я привык к end и без них мой парсер в мозгу работает гораздо хуже.

OSBuster
()

Ruby уже научился своеобразному JIT и должен давать примерно ту же скорость. Сабж еще нужен?

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

Вопрос насколько этот JIT сравним LLVM, но насколько я понимаю у сабжа еще есть корутины и с типами все получше.

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

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

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

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

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

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

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

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

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

Он очень своеобразный и имеет в применимости достаточно небольшой тип задач.

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

Уж лучше бы {}.

А затем Гвидо затянулся ещё раз и подумал, а нафиг эти скобки, хватит отступов.

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

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

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

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

ооп понятие растяжимое, только у таких анскилов как ты.

anonymous
()
Ответ на: комментарий от 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)
Ответ на: комментарий от gedisdone

кресты таки другой язык, хоть и вдохновлённый процедурным. Вот выйдет GoPP, тогда обсудим

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

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

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

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

Go, от него меня тошнит.

почему? ведь он «явным образом ориентирован на практическое применение «здесь и сейчас»», всё как вы любите

anonymous
()

Божественный язык с божественным синтаксисом Ruby и божественной производительностью (в сравнении с Ruby).

Alve ★★★★★
()

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

anonymous
()

Очередное ненужно, которое даже до версии 1.0 не доросло. Ребята, учите лучше яву или c++ или c#, работать в стране уже некому, а вы все играетесь.

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

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

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

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

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

учите лучше яву или c++ или c#,

маскабад

работать в стране уже некому

а в стране 1с и пхп

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

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

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

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

ООП на прототипах

Худшее из двух миров. Не надо так делать.

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

(true ruby way) 😉

Ты подменяешь ожидаемую логику. Я – нет (0 still true).

class Integer
  def to_b?
    true
  end
end
kostyarin_ ★★
()
Последнее исправление: kostyarin_ (всего исправлений: 1)
Ответ на: комментарий от anonymous

явным образом ориентирован на практическое применение «здесь и сейчас»

Crystal тоже. Но от него не тошнит.

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

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

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

snp
()

crystal использует boehm gc, значит в бенчмарках будет уступать многим, в т.ч. nim’у

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

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

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

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