Состоялся релиз языка программирования 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.
С более полным списком изменений можно ознакомиться в примечаниях к выпуску.
>>> Подробности