Язык программирования Crystal

    Читая статью Интервью с Эриком Михаельс-Обером, 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 в Праге.

    Средняя зарплата в IT

    113 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 5 537 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 37

      +3
      Crystal, как шампанское.
        –6
        Лаконичность синтаксиса без интерпретируемости уже не торт. Вот если бы что-то вроде HHVM или kPHP для ruby…
          0
          crystal можно и как интерпретатор использовать (т.е. без компиляции бинарника).
            0
            Разве? Он в любом случае компилируется. В одном компиляция вызывается явно, в другом нет.
              +4
              И чем компиляция мешает использованию, как интерпретатора? По мне, так наоборот, это хорошо.
                0
                И правда.

                crystal ./src/Test.cr

                crystal build ./src/Test.cr

                crystal run ./src/Test.cr

                Тогда действительно круто! Только когда это еще использовать можно будет не ясно.
                0
                Сегодня практически все языки компилируются. В одних случаях явно, в других нет. Навскидку только bash с tcl чисто интерпретируемые вспоминаются. php, ruby, python — все они при исполнении скрипта компилируют его в байткод своей ВМ.
                  0
                  Да, но им не нужно компилировать весь код проекта, достаточно только те части, которые используются для данного запуска.
              +5
              А какая связь между лаконичностью и интерпретируемостью вообще?
                –2
                Лаконичный → для интерактивного взаимодействия с системой → интерпретируемый.
                  +1
                  кажется, с того момента, как появился LLVM, понятие «интерпретериумость» вообще потеряло смысл.
                  А начало оно терять смысл когда стали появляться jit'ы у всяких vm.
                    0
                    Я соглашусь, что интерпретируемый язык должен быть лаконичным. Но предпосылок для обратного не вижу.
                      –1
                      Лаконичность дает скорость написания кода, смысл которой теряется со снижением скорости запуска программы.
                        0
                        По-моему, скорость написания (и чтения) программы ценна сама по себе.
                          0
                          Ценна, однозначно.
                –13
                Для новости слишком поздно, русское сообщество рубистов, по крайней мере, уже в курсе,
                  +8
                  Для новости поздно, согласен. Для анонса языка на Хабре нормально.
                    –11
                    Это вроде одно и тоже.
                      +4
                      Анонса на Хабре я не нашел.
                    +14
                    А как насчет «не рубистов»?
                      –3
                      А есть кто-то кроме рубистов? :)
                    +4
                    случайно отправил недописав, а в мобильном приложении нет кнопки «редактировать». Так вот продолжу:
                    а для полноценной статьи слишком мало, хотелось бы увидеть более подробный разбор и сравнение с другими языками.
                      +1
                      А по мне небольшое резюме с ссылками очень хорошо. Я вот узнал о нем только сейчас.
                      +2
                      Где тесты производительности?
                      Я так понимаю до Go ему далеко, но он сильно быстрее Ruby. Где тесты?
                        +3
                          0
                          Некисло, быстрее Go, на уровне Rust. Спасибо за ссылку!
                            +1
                            бегло поглядел код на Go — сплошные касты float64 -> float32, что как бы намекает на адекватность теста, просто замена float32 -> float64 в исходнике ускоряет код на 30%
                            также во всех языках разные генераторы рандома, что тоже намекает
                              0
                              Pull Request и пусть поправят
                          0
                          Почему ему должно быть далеко до Go?
                            0
                            Посмотрел тесты — беру свои слова назад.
                            0
                            0
                            Лаконичность синтаксиса Ruby + скорость C? Как по мне — звучит неплохо.
                            Мне больше по душе идея Rust — лаконичность синтаксиса Haskell + скорость С. Вернее синтаксис, все же, ближе к С, но зато идеи во многом Haskell.
                              +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)
                              }
                              



                              Или вот
                              fn create_enum_variant_pattern(&self,
                                                             cx: &mut ExtCtxt,
                                                             enum_ident: ast::Ident,
                                                             variant: &'a ast::Variant,
                                                             prefix: &str,
                                                             mutbl: ast::Mutability)
                              -> (P<ast::Pat>, Vec<(Span, Option<Ident>, P<Expr>, &'a [ast::Attribute])>)
                              

                                +2
                                Я не знаю, откуда вы взяли первый кусок, но он не компилируется: явно одна из предыдущих версий rust. А во втором я ничего особо криминального со стороны синтаксиса не вижу. Хотя наверное лучше бы программист назвал возвращаемый тип, а не писал его «как есть».
                              0
                              Как считаете, Crystal под qnx будет работать?
                                0
                                поскольку llvm backend для QNX вроде как есть, то будет
                              • НЛО прилетело и опубликовало эту надпись здесь

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

                                Самое читаемое