«Что за зверь?» — подумал я и полез искать информацию. То, что я нашел, меня, признаюсь, впечатлило.
Знакомьтесь — Crystal
Создавая язык, авторы задавались следующими целями:
- иметь максимально похожий на Ruby синтаксис
- иметь вывод типов
- вызывать код на C с помощью написания байндингов
- иметь возможность выполнения кода и кодогенерации на стадии компиляции
- компилировать все это в нативный код
Лаконичность синтаксиса Ruby + скорость C? Как по мне — звучит неплохо.
Первый коммит в репозиторий на гитхабе был сделан 2-го сентября 2012 года. На данный момент разработка языка находится на стадии альфы версии 0.7.1 — синтаксис и стандартная библиотека могут подвергаться изменениям.
Интересно, что в версии 0.7.0 весь IO по-умолчанию стал асинхронным. В Crystal, как и в Go, для укрощения многопоточности можно использовать каналы. Вот как выглядит использование каналов на примере вычисления простых чисел (пример из репозитория, портирован с Go):
def generate(chan)
i = 2
loop do
chan.send(i)
i += 1
end
end
def filter(in_chan, out_chan, prime)
loop do
i = in_chan.receive
if i % prime != 0
out_chan.send(i)
end
end
end
def run_filter(in_chan, out_chan, prime)
spawn { filter(in_chan, out_chan, prime) }
end
ch = Channel(Int32).new
spawn { generate(ch) }
100.times do
prime = ch.receive
puts prime
ch1 = Channel(Int32).new
run_filter(ch, ch1, prime)
ch = ch1
end
В репозитории можно найти внушительное количество примеров использования языка для решения самых разных задач, в их числе реализация красно-черных деревьев, трассировка лучей, решение задачи N тел, нейронная сеть, интерпретатор brainfuck. Также есть пример простого http-сервера.
6-го июля разработчики выступают с докладом о языке на конференции Curry On в Праге.
Комментарии (36)
sferrka
16.05.2015 04:30-6Лаконичность синтаксиса без интерпретируемости уже не торт. Вот если бы что-то вроде HHVM или kPHP для ruby…
googol
16.05.2015 05:35crystal можно и как интерпретатор использовать (т.е. без компиляции бинарника).
fuCtor
16.05.2015 05:50Разве? Он в любом случае компилируется. В одном компиляция вызывается явно, в другом нет.
Mingun
16.05.2015 11:23+4И чем компиляция мешает использованию, как интерпретатора? По мне, так наоборот, это хорошо.
sferrka
16.05.2015 13:22И правда.
crystal ./src/Test.cr
crystal build ./src/Test.cr
crystal run ./src/Test.cr
Тогда действительно круто! Только когда это еще использовать можно будет не ясно.
Bal
16.05.2015 21:04Сегодня практически все языки компилируются. В одних случаях явно, в других нет. Навскидку только bash с tcl чисто интерпретируемые вспоминаются. php, ruby, python — все они при исполнении скрипта компилируют его в байткод своей ВМ.
sferrka
17.05.2015 06:25Да, но им не нужно компилировать весь код проекта, достаточно только те части, которые используются для данного запуска.
Amomum
16.05.2015 18:15+5А какая связь между лаконичностью и интерпретируемостью вообще?
ilammy
16.05.2015 19:33-2Лаконичный > для интерактивного взаимодействия с системой > интерпретируемый.
bormotov
16.05.2015 19:46+1кажется, с того момента, как появился LLVM, понятие «интерпретериумость» вообще потеряло смысл.
А начало оно терять смысл когда стали появляться jit'ы у всяких vm.
Amomum
16.05.2015 20:02Я соглашусь, что интерпретируемый язык должен быть лаконичным. Но предпосылок для обратного не вижу.
tonymadbrain
16.05.2015 10:56-13Для новости слишком поздно, русское сообщество рубистов, по крайней мере, уже в курсе,
AMar4enko Автор
16.05.2015 11:14+8Для новости поздно, согласен. Для анонса языка на Хабре нормально.
tonymadbrain
16.05.2015 11:14+4случайно отправил недописав, а в мобильном приложении нет кнопки «редактировать». Так вот продолжу:
а для полноценной статьи слишком мало, хотелось бы увидеть более подробный разбор и сравнение с другими языками.kolpeex
16.05.2015 12:19+1А по мне небольшое резюме с ссылками очень хорошо. Я вот узнал о нем только сейчас.
paco
16.05.2015 14:15+2Где тесты производительности?
Я так понимаю до Go ему далеко, но он сильно быстрее Ruby. Где тесты?foi
16.05.2015 17:34+3AMar4enko Автор
16.05.2015 19:36Некисло, быстрее Go, на уровне Rust. Спасибо за ссылку!
neolink
17.05.2015 00:07+1бегло поглядел код на Go — сплошные касты float64 -> float32, что как бы намекает на адекватность теста, просто замена float32 -> float64 в исходнике ускоряет код на 30%
также во всех языках разные генераторы рандома, что тоже намекает
justaguest
16.05.2015 15:20Лаконичность синтаксиса Ruby + скорость C? Как по мне — звучит неплохо.
Мне больше по душе идея Rust — лаконичность синтаксиса Haskell + скорость С. Вернее синтаксис, все же, ближе к С, но зато идеи во многом Haskell.
kyrylo
16.05.2015 18:35+12Вы это серьезно про лаконичность синтаксиса? Я не знаком с Rust, но читать вот
это невозможноstruct Wrapped<T>(T); impl<'self,A,B> Shr<&'self fn(&A) -> B, Wrapped<B>> for Wrapped<A> { fn shr(&self, f: & &'self fn(&A) -> B) -> Wrapped<B> { Wrapped((*f)(&**self)) } } fn main () { let string = Wrapped(1i) >> (|&x| x + 1) >> (|&x| 2*x) >> (|x| x.to_str()); println(*string) }
ZyXI
17.05.2015 01:37+2Я не знаю, откуда вы взяли первый кусок, но он не компилируется: явно одна из предыдущих версий rust. А во втором я ничего особо криминального со стороны синтаксиса не вижу. Хотя наверное лучше бы программист назвал возвращаемый тип, а не писал его «как есть».
jonic
Crystal, как шампанское.