Парадигма | Многопарадигма : объектно-ориентированный, параллельный |
---|---|
Разработан | Ари Бореншвейг, Хуан Вайнерман, Брайан Кардифф |
Разработчик | Технологические решения Манас |
Впервые появилось | 18 июня 2014 г.; 6 лет назад (18.06.2014) |
Предварительный выпуск | 0.35.1 / 19 июня 2020 г.; 4 месяца назад (2020-06-19) |
Дисциплина печати | статическая, выведенная, структурная, утка |
язык реализации | Crystal |
Платформа | IA-32 (i386), x86-64, AArch64 |
OS | Linux, macOS, FreeBSD, OpenBSD |
Лицензия | Лицензия Apache 2.0 |
Расширения имен файлов | .cr |
Веб-сайт | crystal-lang.org |
Создан под влиянием | |
Ruby, C, Rust, Go,C#,Python |
Crystal - это универсальный, объектно-ориентированный язык программирования, разработанный и разработанный Эри Боренсвейг, Хуан Вайнерман, Брайан Кардифф и более 300 участников. Благодаря синтаксису, вдохновленному языком Ruby, это скомпилированный язык с статической проверкой типов, но указывать типы переменных или аргументов метода обычно не требуется. Типы разрешаются с помощью расширенного глобального алгоритма вывода типа . Кристалл в настоящее время находится в активной разработке. Он выпущен как бесплатное программное обеспечение с открытым исходным кодом под лицензией Apache License версии 2.0.
Работа над языком началась в июне 2011 года с целью объединить элегантность и производительность Ruby с скорость, эффективность и безопасность типов компилируемого языка. Первоначально названный Joy, он был быстро переименован в Crystal.
Компилятор Crystal сначала был написан на Ruby, но позже переписан на Crystal, таким образом, с ноября 2013 года он стал самообслуживанием. первая официальная версия была выпущена в июне 2014 года. В июле 2016 года Crystal присоединился к TIOBE index.
Хотя синтаксис напоминал язык Ruby, Crystal компилируется в гораздо более эффективный собственный код, используя LLVM backend, за счет исключения динамических аспектов Ruby. Однако расширенный вывод глобального типа, используемый компилятором Crystal, в сочетании с использованием типов объединения, дает Crystal ощущение языка сценариев более высокого уровня в большей степени, чем многие другие сопоставимые языки программирования. В языке есть автоматизированная сборка мусора, и в настоящее время предлагается сборщик Boehm. Crystal обладает макросистемой и поддерживает дженерики, а также перегрузку методов и операторов. Модель параллелизма Crystal основана на обмене последовательными процессами (CSP) и реализует легкие волокна и каналы (для связи между волокнами), вдохновленные Go.
Это самый простой способ написать программу Hello World в Crystal:
помещает «Hello World!»
То же, что и в Ruby.
Или используя стиль объектно-ориентированного программирования :
class Greeter def initialize (@name: String) end def salute помещает "Hello # {@ name}!" end end g = Greeter.new ("world") g.salute
требует "http / server" server = HTTP :: Server.new do | context | context.response.content_type = "text / plain" context.response.print "Привет, мир! Время # {Time.now}" end server.bind_tcp ("0.0.0.0", 8080) ставит "Прослушивание http: / /0.0.0.0:8080 "server.listen
require" socket "def handle_client (client) message = client.gets client.puts message end server = TCPServer.new (" localhost ", 1234) а client = server.accept? spawn handle_client (client) end
Следующий код определяет массив, содержащий различные типы без общего предка, который можно использовать. Crystal автоматически создает тип объединения из типов отдельных элементов.
desire_things = [: unicorns, "butterflies", 1_000_000] p typeof (desire_things.first) # typeof возвращает тип времени компиляции, здесь (Int32 | String | Symbol) p desire_things.first.class # метод класса возвращает тип среды выполнения, здесь Symbol
Каналы могут использоваться для связи между волокнами, которые инициируются с помощью ключевого слова spawn
.
channel = Channel (Int32).new spawn do put "Before первая отправка "channel.send (1) помещает" Перед второй отправкой "channel.send (2) end помещает" Перед первым приемом "value = channel.receive помещает значение # =>1 помещает" Перед вторым приемом "value = channel.receive помещает значение # =>2