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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Crystal
Crystal language logo.svg
Семантика мультипарадигмальный: объектно-ориентированный
Класс языка язык программирования и объектно-ориентированный язык программирования
Появился в 18 июня 2014
Автор Ary Borenszweig
Разработчик Арье Боренвейг[d]
Расширение файлов .cr
Выпуск 0.31.1 (30 сентября 2019)
Система типов Статическая
Испытал влияние Ruby, Go, Rust, C#, Python
Лицензия Apache License 2.0
Сайт crystal-lang.org
Платформа IA-32 (i386), x86-64
ОС Linux, macOS (Homebrew) [1]

Crystal — это объектно-ориентированный язык программирования общего назначения, спроектированный и разработанный Ary Borenszweig, Juan Wajnerman, Brian Cardiff и более 300 разработчиками[2]. Имея Ruby-подобный синтаксис Crystal является компилируемым и статически типизированным языком, однако объявление типов переменных либо аргументов методов не является обязательным, так как компилятор применяет специальный алгоритм вывода типов[3]. Язык находится в активной стадии разработки и распространяется как свободное и открытое программное обеспечение под лицензией Apache версии 2.0.

История[править | править код]

Работа над новым языком программирования была начата в июне 2011 года в компании Manas. Разработчики поставили перед собой цель создать язык с элегантностью и продуктивностью Ruby и скоростью, эффективностью и безопасностью типов, присущих компилируемым языкам программирования. Первоначально разработка получила название Joy, однако позже была переименована в Crystal.

Первый официальный релиз языка состоялся в июне 2014 года[4][5]. Изначально компилятор языка был написан на Ruby, пока в 2013 году не был переписан на Crystal[6]. В июле 2016 года Crystal вошёл в список индекса TIOBE.

Описание[править | править код]

Несмотря на схожесть синтаксиса, Crystal намного эффективнее, чем Ruby, компилируется в машинный код, используя LLVM, жертвуя при этом динамическими аспектами языка. По результатам тестов Crystal показывает схожую с языком С производительность[7][8][9]. Язык использует Boehm garbage collector, обладает системой макросов, поддерживает дженерики, а также перегрузку методов и операторов.

В Crystal реализован интерфейс вызова функций из двоичных библиотек на языках C, C++ и пр., при этом синтаксис взаимодействия с такими библиотеками максимально упрощён, что позволяет легко создавать библиотеки-обёртки, а не писать весь код с нуля. Также Crystal поддерживает ассемблерные вставки и прямое обращение по указателям - это считается unsafe, но не запрещено, поскольку необходимо, в частности, и для взаимодействия с функциями из внешних библиотек.

Примеры[править | править код]

Hello, world![править | править код]

Простейший вариант написания:

puts "Hello World!"

В объектно-ориентированном стиле:

class Greeter
  def initialize(@name)
  end
 
  def salute
    "Hello #{@name}!"
  end
end

g = Greeter.new("world")
puts g.salute

HTTP Server[править | править код]

require "http/server"

server = HTTP::Server.new do |context|
  context.response.content_type = "text/plain"
  context.response.print "Hello world!"
end

server.bind_tcp 8080
puts "Listening on http://127.0.0.1:8080"
server.listen

Вывод типов и типы объединения[править | править код]

Следующий код объявляет коллекцию (массив), состоящую из элементов различных типов данных. Crystal в данном случае автоматически создаёт тип объединения с индивидуальными типами данных элементов массива.

desired_things = [:unicorns, "butterflies", 1_000_000]
p typeof(desired_things.first) # typeof возвращает типы данных на момент компиляции, в данном случае (Int32 | String | Symbol)
p desired_things.first.class   # метод класса возвращает тип данных времени исполнения, в данном случае Symbol

Конкурентная модель[править | править код]

Каналы (Channel) используются для коммуникации между файберами, которые инстанциируются при помощи команды spawn:

channel = Channel(Int32).new

spawn do
  puts "Перед первой отправки сообщения"
  channel.send(1)
  puts "После второй отправки сообщения"
  channel.send(2)
end

puts "Перед первым получением"
value = channel.receive
puts value # => 1
  
puts "Перед вторым получением"
value = channel.receive
puts value # => 2

Примечания[править | править код]

  1. Installation · GitBook
  2. crystal-lang/crystal. GitHub. Дата обращения 18 февраля 2016.
  3. Brian J. Cardiff. Type inference (part 1) : [арх. 25.10.2019]. — Crystal official, 2013. — 23 September. — Дата обращения: 25.10.2019.
  4. Crystal. crystal-lang.org. Дата обращения 18 февраля 2016.
  5. Why Crystal programming language? | Motion Express | Ruby, Rails, Crystal & developers' techniques. motion-express.com. Дата обращения 18 февраля 2016.
  6. Crystal. crystal-lang.org. Дата обращения 18 февраля 2016.
  7. kostya/benchmarks. GitHub. Дата обращения 18 февраля 2016.
  8. kostya/crystal-benchmarks-game. GitHub. Дата обращения 18 февраля 2016.
  9. smarr/are-we-fast-yet. GitHub. Дата обращения 18 февраля 2016.

Ссылки[править | править код]

Литература[править | править код]

  • Simon St. Laurent, Ivo Balbaert. Programming Crystal: Create High-Performance, Safe, Concurrent Apps. — 1-е изд. — Pragmatic Bookshelf, 2019. — 246 с. — ISBN 1680502867. — ISBN 978-1680502862.