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)

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

как по мне, он достаточно взял от Питона для компилируемого языка

Он взял из Python отступы. Если этого достаточно - ну окей, говорят, в Хаскеле тоже есть отступы - тоже, наверное, из Python взяли.

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

Чтобы не быть голословным:

Поиск за последний год:

created:>2015-05-01 stars:>50 fork:false language:*

JavaScript 3,364

Java 1,939

Python 1,159

Objective-C 897

Swift 810

Go 758

C 442

PHP 440

C++ 439

C# 316

Ruby 274

Rust 118

...

CL 5

D 4

Nimrod 2

Rust конечно далеко, ибо системщина, но тем не менее.

RazrFalcon ★★★★★
()

Я правильно понимаю, что от Ruby там только синтаксис, а такие сущности, как анонимные классы(singleton class) в Crystal не существуют?

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

Ну уже холливара разведение.

Все-таки «машинонезависимый байткод» != «не эффективный код», особенно если если аппаратная поддержка этого байткода (впрочем эффективным он тоже может и не быть).

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

Я правильно понимаю, что от Ruby там только синтаксис, а такие сущности, как анонимные классы(singleton class) в Crystal не существуют?

Я не настоящий сварщик, но скорее всего да.

theNamelessOne ★★★★★
()

все поцоны уже уехали на Go, а поддержка там оGoGo какая, этот crystal в теории интересный конечно, но на практике..

не нужно

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

Он взял из Python отступы.

Не только. Всякие for'ы, логические операции, % для интерполяции строк, общее стремление к простоте. И вообще, какой смысл сдирать из Питона всё?

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

И вообще, какой смысл сдирать из Питона всё?

Вопрос стоял по-другому - «какие общие черты Nim и Python позволили тебе утверждать, что Nim и Python близки так же, как Crystal и Ruby?».

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

какие общие черты Nim и Python позволили тебе утверждать, что Nim и Python близки так же, как Crystal и Ruby

Я заговорил про Ним не потому, что он так же близок. Я заговорил про Ним, потому что считаю его достаточно близким, чтобы юзать как компилируемую замену Питона, и потому что он по декларируемым фичам не хуже языка в ОП. Если ты по каким-то причинам так не считаешь - мне будет интересно их выслушать.

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

раскол сообщества и замедление уже существующих разработок

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

Про «замедление разработок» тоже бред. От того что кучка разрабов пилит Crystal разработка Go или Rust медленнее не идет.

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

Я заговорил про Ним, потому что считаю его достаточно близким, чтобы юзать как компилируемую замену Питона

Юзать? У него же нет библиотек.

он по декларируемым фичам не хуже языка в ОП. Если ты по каким-то причинам так не считаешь

По деклаларируемым фичам - возможно. Но Crystal, в отличие от Nim, может рассчитывать на внимание рубистов. Nim не может рассчитывать вообще ни на что.

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

С программированием с 2003 года!

Я столкнулся... Были F#, VB.NET пиаренные майкрософт. Были всякие Dart, Boo, Golang, Go, R, Rust, Dart, Swift, Clojure, Julia. И это то что более менее распиарено. Теперь каждая компани под свой продукт делает свой баян. Достаточно на лирухе сидеть регулярно и ловить посты об очередном ЯП под номером #18423.

И вот этот пост еще одно непонятное нечто. Т.е я так понимаю Ruby не взлетел. Надо придумывать еще одну хрень поверх старой, которую никто не знает. Ты ж понимаешь, что у человека ограничены возможности. Он не может хорошо выучить новое пока не закончит старое. Или ты предлагаешь бросать сразу текущей ЯП на половине и переходить на новый.

Все эти языки нового не предлагают. Ниша давно заполнена. ФП есть - его хорошо занял Haskell. ООП есть. ОП есть. ПП есть. Интерпретируемые языки - есть. Компилируемые в машинный код - есть. Все пустоты заняты.

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

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

Думал изучить Rust. Только начинаю вникать. Елки-палки снова тоже самое, что видел раньше

Хоть это и оффтопик, но я не удержусь: на чем таком ты программировал, что видел regions?

tailgunner ★★★★★
()

Цели языка: Синтаксис, похожий на Ruby

А еще про красивый и простой код... если нужно все это,то почему бы не использовать руби?:)

А так пока что выходит,что вы пилите своеобразный фреимворк,который не хотите называть фреимворком, еще и совместимость с оригиналом не обещаете.

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

На самом деле от Ruby там только синтаксис, а всё остальное заимствовано из других языков, например макросы из Elixir.

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

Т.е я так понимаю Ruby не взлетел.

Плохо понимаешь. C++ начали делать как надмножество C, Java похожей на C++, PHP — на Perl не потому, что те «не взлетели», а наоборот. Потому что успеха хочется, а подмазаться к популярной вещице всяко добавит плюсов к карме нового поделия. И популярные интерпретируемые ЯП уже давно уперлись в тормоза своих ВМ, не считая тех, которые разрабатывают крупные компании, поэтому Cristal это хорошо, пусть лучше Руби сдохнет.

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

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

Люди осваивают LLVM, дальше больше будет))

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

интерпретируемые ЯП уже давно уперлись в тормоза своих ВМ

«интерпретируемые ЯП» и «ВМ»?)) Знатоки подтянулись))

anonymous
()

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

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

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

C++ был первым популярным ООП языком из ныне живущих. Это попытка не потерять силу Си и добавить объекты. А уже потом наплодили всяких Ruby, Java, C# и иже с ними. Я знаю что по истории была Simula. Но это не было чистым ООП языком как Smaltalk. Но как и все ЯП с притензий на «чистоту» они были обречены на забвения. С++ является нечто принципиально новым. Как ML. Как в свое время был Lisp и FORTRAN. Это ранее неведомая новинка. Хотя все языки являются подмножеством лиспа, ибо все там уже есть и так.

А за жемчужину скажу, что это первый скриптовый язык. Который позоционирует себя некий инструмент общего назначения. А потом появился питончик. Понимаешь, общих целей. Причем язык сильно выделялся на фоне остальных уже своим синтаксисом. Это был первый. А что такое PHP. С чего начинается изучение каноничного PHP?! С этих вот штук «<?php» "?>". Тем более это попытка сделать препроцессор для динамического генерирования страниц HTML.

И вообще не вижу визуальной связи между PHP и Perl. Это два разных языка. И вообще для плюсовика PHP сплошной баян, но без типов и с этими гадскими «$» повсюду. Я знаю что в жемчуженке это все было. Но там были @ и %, бог знает еще что. И конечно регэкспы.

Так что не надо ляляля.

Вренемся к главной теме. Что такого в Crystal??? Почему его не называют диалектом Ruby!? Так было бы честнее.

bs1988
()

Язык чисто для любителей Ruby, Но так как доля Ruby постепенно снижается, скорее всего через 3-4 года это будет некое маргинальное сообщество. Зачем изучать язык без библиотек, который не взлетит с вероятностью 90%?

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

А за жемчужину скажу, что это первый скриптовый язык.

Вот и выросло поколение...

Я знаю что по истории была Simula. Но это не было чистым ООП языком как Smaltalk.

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

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

А за жемчужину скажу, что это первый скриптовый язык. Который позоционирует себя некий инструмент общего назначения. А потом появился питончик.

Историю то следует повторить вам видимо... Релиз Python был в 1991 году, тогда как Ruby зарелизился в 1995.

Да и вообще Perl был тоже языком общего назначения уже с 1987.

abc
()
Ответ на: комментарий от st4l1k

Но ведь библиотек и правда нет. И перенести RoR на Crystal... об этом вообще где-нибудь идет речь?

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

Не стыдно быть таким толстым?

У него же нет библиотек.

У него куча биндингов и есть пакетный менеджер.

Crystal, в отличие от Nim, может рассчитывать на внимание рубистов.

Они оба сейчас подходят для дома и всяких внутрикорпоративных дел (впрочем, насчёт Crystal я не уверен). Обсуждать вероятность их попадания в продакшен - гадание на кофейной гуще.

anonymous
()

Вызов кода на Си с помощью биндингов

Может, имелось в виду, бинарных исполняемых файлов? Или он сишные исходники схавывает и компилит?

segfault ★★★★★
()

Лет через 10 про него скажут: он умер не родившись.

anonymous
()

Так и не понял, зачем этот язык нужен... Просто, еще один ничем не примечательный, никому не нужный язык...

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

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

Я могу ошибаться, но сходу мощной системы типов в Crystal я тоже не вижу.

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

насколько я знаю

Cython — питон-деривед яп с питон-инспиред синтаксисом. В нём есть возможность исполнения обычного кода через либпитон, правда профита в таком случае не будет. Так что вполне легитный вопрос.

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

Именно на своих языках каждый и должен писать. Про DSL слышал когда либо, дебил?

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

Зачем изучать язык без библиотек, который не взлетит с вероятностью 90%?

А, ты та ленивая тварь, которая и строчки не напишет без помощи библиотек? Современные погромисты совсем разучились выполнять задачи только средствами языка.

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

А за жемчужину скажу, что это первый скриптовый язык. ... А потом появился питончик.

Надеюсь вы в курсе, что Питон вышел в 1991 году, а Руби в 1995? И именно Питон повлиял на Руби, Коффескрипт и Свифт. Свифт сейчас наиболее интересный и грамотный из всех компилируемых языков, Кристал интересен только тем, кто хочет мигрировать с Руби в системном программировании. С открытием Свифта все эти Nim, Crystal, Rust, Go если и не померкнут, то придётся им очень туго.

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

И именно Питон повлиял на Руби

Какие ваши доказательства?

Руби — это гремучая смесь из Perl-а и Smalltalk-а. Привкуса Python-а там не чувствуется. Кроме того, в 1995-ом состоялся публичный релиз Ruby, а работать над ним Matz начал за пару лет до того, и вот, что он по этому поводу сказал:

I knew Python then. But I didn't like it, because I didn't think it was a true object-oriented language---OO features appeared to be add-on to the language. As a language manic and OO fan for 15 years, I really wanted a genuine object-oriented, easy-to-use scripting language. I looked for, but couldn't find one.

С открытием Свифта все эти Nim, Crystal, Rust, Go если и не померкнут, то придётся им очень туго.

Боюсь, феномен Go сильно недооценен. Свежее подтверждение, в двух словах: язычок так себе, но практичный, простой и удобный.

Лично я не понимаю, как Go может считаться удобным. Но я вообще много чего не понимаю, а вот растущая популярность Go показывает, что для очень многих программистов Go оказался именно тем, что им нужно. То, что их знания при этом ограничиваются чем-то вроде PHP, Python и Java, принципиально ничего не меняет.

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