Читая статью Интервью с Эриком Михаельс-Обером, RubyHero-2014, наткнулся на упоминание ЯП Crystal.
«Что за зверь?» — подумал я и полез искать информацию. То, что я нашел, меня, признаюсь, впечатлило.

Знакомьтесь — 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)


  1. jonic
    16.05.2015 01:42
    +3

    Crystal, как шампанское.


  1. sferrka
    16.05.2015 04:30
    -6

    Лаконичность синтаксиса без интерпретируемости уже не торт. Вот если бы что-то вроде HHVM или kPHP для ruby…


    1. googol
      16.05.2015 05:35

      crystal можно и как интерпретатор использовать (т.е. без компиляции бинарника).


      1. fuCtor
        16.05.2015 05:50

        Разве? Он в любом случае компилируется. В одном компиляция вызывается явно, в другом нет.


        1. Mingun
          16.05.2015 11:23
          +4

          И чем компиляция мешает использованию, как интерпретатора? По мне, так наоборот, это хорошо.


          1. sferrka
            16.05.2015 13:22

            И правда.

            crystal ./src/Test.cr

            crystal build ./src/Test.cr

            crystal run ./src/Test.cr

            Тогда действительно круто! Только когда это еще использовать можно будет не ясно.


        1. Bal
          16.05.2015 21:04

          Сегодня практически все языки компилируются. В одних случаях явно, в других нет. Навскидку только bash с tcl чисто интерпретируемые вспоминаются. php, ruby, python — все они при исполнении скрипта компилируют его в байткод своей ВМ.


          1. sferrka
            17.05.2015 06:25

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


    1. Amomum
      16.05.2015 18:15
      +5

      А какая связь между лаконичностью и интерпретируемостью вообще?


      1. ilammy
        16.05.2015 19:33
        -2

        Лаконичный > для интерактивного взаимодействия с системой > интерпретируемый.


        1. bormotov
          16.05.2015 19:46
          +1

          кажется, с того момента, как появился LLVM, понятие «интерпретериумость» вообще потеряло смысл.
          А начало оно терять смысл когда стали появляться jit'ы у всяких vm.


        1. Amomum
          16.05.2015 20:02

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


          1. sferrka
            17.05.2015 06:19
            -1

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


            1. Amomum
              17.05.2015 07:16

              По-моему, скорость написания (и чтения) программы ценна сама по себе.


              1. sferrka
                17.05.2015 07:44

                Ценна, однозначно.


  1. tonymadbrain
    16.05.2015 10:56
    -13

    Для новости слишком поздно, русское сообщество рубистов, по крайней мере, уже в курсе,


    1. AMar4enko Автор
      16.05.2015 11:14
      +8

      Для новости поздно, согласен. Для анонса языка на Хабре нормально.


      1. tonymadbrain
        16.05.2015 11:16
        -11

        Это вроде одно и тоже.


        1. AMar4enko Автор
          16.05.2015 11:17
          +4

          Анонса на Хабре я не нашел.


    1. AStek
      16.05.2015 11:57
      +14

      А как насчет «не рубистов»?


      1. 1101_debian
        16.05.2015 17:49
        -3

        А есть кто-то кроме рубистов? :)


  1. tonymadbrain
    16.05.2015 11:14
    +4

    случайно отправил недописав, а в мобильном приложении нет кнопки «редактировать». Так вот продолжу:
    а для полноценной статьи слишком мало, хотелось бы увидеть более подробный разбор и сравнение с другими языками.


    1. kolpeex
      16.05.2015 12:19
      +1

      А по мне небольшое резюме с ссылками очень хорошо. Я вот узнал о нем только сейчас.


  1. paco
    16.05.2015 14:15
    +2

    Где тесты производительности?
    Я так понимаю до Go ему далеко, но он сильно быстрее Ruby. Где тесты?


    1. foi
      16.05.2015 17:34
      +3

      1. AMar4enko Автор
        16.05.2015 19:36

        Некисло, быстрее Go, на уровне Rust. Спасибо за ссылку!


        1. neolink
          17.05.2015 00:07
          +1

          бегло поглядел код на Go — сплошные касты float64 -> float32, что как бы намекает на адекватность теста, просто замена float32 -> float64 в исходнике ускоряет код на 30%
          также во всех языках разные генераторы рандома, что тоже намекает


          1. paco
            17.05.2015 10:29

            Pull Request и пусть поправят


    1. stepik777
      16.05.2015 19:09

      Почему ему должно быть далеко до Go?


      1. paco
        16.05.2015 20:14

        Посмотрел тесты — беру свои слова назад.



  1. justaguest
    16.05.2015 15:20

    Лаконичность синтаксиса Ruby + скорость C? Как по мне — звучит неплохо.
    Мне больше по душе идея Rust — лаконичность синтаксиса Haskell + скорость С. Вернее синтаксис, все же, ближе к С, но зато идеи во многом Haskell.


    1. 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)
      }
      


      1. ZyXI
        17.05.2015 01:37
        +2

        Я не знаю, откуда вы взяли первый кусок, но он не компилируется: явно одна из предыдущих версий rust. А во втором я ничего особо криминального со стороны синтаксиса не вижу. Хотя наверное лучше бы программист назвал возвращаемый тип, а не писал его «как есть».


  1. pandas
    16.05.2015 18:58

    Как считаете, Crystal под qnx будет работать?


  1. eugzol
    16.05.2015 21:29

    Даёшь бесплатный RubyMotion :)