LINUX.ORG.RU

Crystal 0.16.0

 ,


0

3

Состоялся релиз языка программирования Crystal 0.16.0.

Цели языка:

  • Синтаксис, похожий на Ruby (но совместимость с ним не является целью).
  • Статическая типизация (но без необходимости явного указания типов переменных и аргументов методов).
  • Вызов кода на Си с помощью биндингов, написанных на Crystal.
  • Исполнение и генерация кода во время компиляции (макросы).
  • Трансляция в эффективный нативный код.

Текущее состояние:

  • Проект находится в стадии alpha: язык и стандартная библиотека всё ещё подвергаются значительным изменениям.
  • Компилятор написан на Crystal.

Этот релиз содержит значительное изменение, ломающее обратную совместимость, о котором было объявлено несколько месяцев назад. Также был внесён ряд других незначительных изменений и множество новых вкусностей.

Новый алгоритм вывода типов

Ранее типы переменных выводились путем анализа всех видов использования. Например:

class Some
  def initialize(@var)
  end
end

Some.new(1)

В примере выше типом @var будет являться Int32. Если вы сделаете так:

Some.new(1)
Some.new("hello")

Тогда типом являлся бы Int32 | String (union). И даже в следующем коде тип останется таким же:

class Some
  def initialize(@var)
  end

  def var=(value)
    @var = value
  end
end

some = Some.new(1)
some.var = "hello"

Приведённые выше примеры больше не будут компилироваться, так как теперь компилятор должен знать тип @var наверняка. Например, предположим, что предназначенный тип для @var — Int32, тогда мы могли бы написать:

class Some
  # Так как конструктор принимает только Int32, типом @var будет Int32
  def initialize(@var : Int32)
  end
end

Вывод типов используя литералы и конструкторы:

class Some
  def initialize
    @int = 0            # Int32
    @string = "hello"   # String
    @bools = [] of Bool # Array(Bool)
    @time = Time.new    # Time
  end
end

Обратите внимание, что указание типов для аргументов методов необязательно и никогда не будет обязательным.

Это изменение в будущем позволит реализовать инкрементальную компиляцию и уменьшить общее время компиляции и использование памяти. Прямо сейчас больших проектов на Crystal не много. Возможно, самый большой проект — это сам компилятор, и его компиляция с нуля занимает 16 секунд и 1 GB памяти. Но появятся более крупные проекты, и даже несмотря на то, что компьютер программиста должен быть быстрым и иметь много памяти, нет никаких причин ждать или расходовать CPU и память.

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

Добавлена поддержка FreeBSD и musl libc

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

Именованные аргументы везде

Ранее именованные аргументы могли быть применимы только к тем аргументам, которые имели значение по умолчанию:

def method(x, y = 1)
  x + y
end

method 10           # OK
method 10, y: 20    # OK
method x: 10        # Error
method y: 20, x: 10 # Error

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

Прочие изменения

  • В Array и Range добавлена возможность бинарного поиска.
  • Добавлены типы BigFloat и BigRational.
  • Упрощён маппинг перечислений, BigInt и BigFloat в JSON и YAML.

С более полным списком изменений можно ознакомиться в примечаниях к выпуску.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: Wizard_ (всего исправлений: 7)

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

Вывод: байт-код используют интерпретируемые языки.

А если байт-код используется как промежуточный?

Чувак мы в мире «0 или 1», «false либо true», «вкл. либо выкл». Если следовать твоим рассуждениям Си — это язык среднего уровня.

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

Какой такой оператор, недоумок ты жалкий?!? Речь о фундаментальной особенности системы типов.

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

Раст никакая не «системщина». Он _позволяет_ писать низкоуровневый код, но не заставляет. Ну и что мы видим? Классическое засилие Жабы (как универсального языка). Что пишут на JS - ума не приложу, но походу это в психушку провели тырнет.

В любом случае, видно, что «что-то пилится на гитхабе», но где это в мэйнстриме? Где это в Линуксе? Жаловались же, мол, glibc - отстой, всё устарело, ошибки памяти... ну и чё не пишут на Расте-то? Те же Иксы/Вяленый/Хмырь - уж где-где, а им позарез нужна стабильность и скорость! Пока _подобные_ проекты не будут писать на Го/Растах, для меня эти языки мертвы.

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

Пример на С++ высосан из пальца. Взял ссылку на элемент контейнера, а потом изменяешь контейнер? Наверняка, ссылки инвалидируются. Если у тебя такой код не вызывает подозрений, то ты просто нуб ещё.

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

Жаль, что для Python такого не пилят.

Переходи на темную сторону ^_^

special-k ★★★
()
Ответ на: комментарий от matumba

от создателей, не осиливших сделать хороший компилятор С++

fixed

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

Ну, case по типам там есть - впилить туда проверку на полноту можно уже сейчас; сам язык в альфе - может, добавят возможность явно создавать именованные ADT.

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

Наглая копипаста http://www.viva64.com/en/b/0324/ , авторов C++ анализатора.

Разве там не написано следующее?

The original article can be found here (in Russian). It was translated and published in our blog by the author's permission.

Поэтому никак не копипаста.

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

Шта?!

Я могу еще с десяток таких примеров привести. Они тоже высосаны из пальца?

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

Если у тебя такой код не вызывает подозрений, то ты просто нуб ещё.

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

Но куда мне до мастеров плюсов с лора, у которых безопасный код пишется сам по себе.

Поэтому никак не копипаста.

Ок. Не наглая, но копипаста.

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

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

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

Вы вообще понимаете как работает rust?

Rust вообще не даст вам инвалидировать итератор, в принципе, в то время, как в C++ assert сработает только когда этот код будет вызван, а не при сборке/запуске. Так что «с практической точки зрения проблем» валом.

RazrFalcon ★★★★★
()

Crystal, язык для кристально честных программистов. Если у тебя в душе гниль к Crystal не подходи!

anonymous
()

«Entia non sunt multiplicanda...» (C)

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

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

Ну, может и сделаю пару раз в 10 лет

А в Rust - не сделаешь. Ни разу за всю карьеру.

Но это не та ошибка, которая вызывает проблемы с практической точки зрения.

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

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

Если всплывает в тестах.

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

А вот и закомплексованный нищеброд в треде!

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

Ну не знаю, не знаю. Для Ruby в свое время killer app стал Ruby-on-Rails. Для Go нехилой рекламой является Docker. Так что регулярно появляется информация о том, что какие-то штуки делаются на Go и людям нравится. Вот, буквально вчера увидел: https://blog.acolyer.org/2016/05/04/btrdb-optimizing-storage-system-design-fo...

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

какие-то штуки делаются на Go и людям нравится

Да пох. Эти люди никогда не запилят sass (scss, less), coffeescript (dart, typescript), rubygems и т.д. Они будут дрочить на новые фишки vs и молиться на ms.

Рубисты - это сообщество новаторов.

killer app стал Ruby-on-Rails

гитхаб, твиттер, хероку, сама инфраструктура (https://rubygems.org/ и т.д.). А ведь руби - это даже не питон с его гуглопрошлым.

special-k ★★★
()
Последнее исправление: special-k (всего исправлений: 2)
Ответ на: комментарий от RazrFalcon

А вот и фанатики приехали.

Расслабься, мне изрядно поднадоел ваш бугурт за эти годы.

special-k ★★★
()
Ответ на: комментарий от tailgunner

Системой типов, макросами.

В Python вроде появилась опциональная статическая типизация (что я считаю злом). А Макросы... лучше кодогенерация.

dmxrand
()

Б-же ну зачем? Очередное ненужное ненужно

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