• Блоки: Всякий раз, когда вы вызываете метод для объекта, вы можете передать блок кода. Затем этот блок может быть вызван из реализации метода с помощью ключевого слова yield
. Эта идиома допускает всевозможные итерации и манипуляции с потоком управления и широко распространена среди разработчиков Ruby. Crystal также имеет замыкания, которые можно использовать, когда блоки не подходят друг другу.
• Сбор мусора: Объекты хранятся в куче, и их память автоматически освобождается, когда они больше не используются. Существуют также объекты, созданные из структуры, размещенной во фрейме стека текущего выполняемого метода, и они перестают существовать, как только метод завершается. Таким образом, программисту не приходится иметь дело с ручным управлением памятью.
• Метапрограммирование: Хотя Crystal не является динамическим языком, он часто может вести себя так, как если бы он им был, благодаря мощному метапрограммированию во время компиляции. Программист может использовать макросы и аннотации вместе с информацией обо всех существующих типах (статическое отражение) для генерации или мутирования кода. Это обеспечивает множество динамических идиом и паттернов.
• Одновременное (Concurrent) программирование: Программа Crystal может создавать новые волокна (легкие потоки) для выполнения блокирующего кода, координируясь с каналами. Асинхронное программирование становится простым в рассуждении и следовании. Эта модель была в значительной степени вдохновлена Go и другими параллельными языками, такими как Erlang.
• Кроссплатформенные: программы, созданные с помощью Crystal, могут работать на Linux, MacOS и FreeBSD, нацеливание x86 или ARM (как 32-битный, так и 64-битный). Это включает в себя новые кремниевые чипы от Apple. Поддержка Windows экспериментально, она еще не готова. Компилятор также может производить небольшие статические двоичные файлы на каждой платформе без зависимостей для простоты распространения.
• Безопасность времени выполнения: Crystal является безопасным языком – это означает, что нет неопределенного поведения и скрытых сбоев, таких как доступ к массиву за его пределами, доступ к свойствам по null
или доступ к объектам после того, как они уже были освобождены. Вместо этого они становятся либо исключениями во время выполнения, ошибками во время компиляции, либо не могут произойти из-за защиты во время выполнения. У программиста есть возможность повысить безопасность, используя явно небезопасные функции языка, когда это необходимо.
• Программирование низкого уровня: хотя Crystal безопасен, всегда есть вариант использовать небезопасные функции. Такие вещи, как работа с необработанными указателями, обращение к нативным библиотекам C или даже использование сборки непосредственно, доступны для смелых. Во многих общих библиотеках C есть безопасные обертки, готовые к использованию, что позволяет им использовать свои функции из кристаллической программы.
На первый взгляд Crystal очень похож на Ruby, и многие синтаксические примитивы одинаковы. Но Crystal пошел своим путем, черпая вдохновение из многих других современных языков, таких как Go, Rust, Julia, Elixir, Erlang, C#, Swift и Python. В результате он сохраняет большую часть хороших частей красивого синтаксиса Ruby, в то же время внося изменения в основные аспекты, такие как метапрограммирование и параллелизм.
Программы Crystal также БЫСТРЫЕ
С самого начала Crystal создавался как быстрый. Он следует тем же принципам, что и другие быстрые языки, такие как C. Компилятор может анализировать исходный код, чтобы узнать точный тип каждой переменной и расположение памяти перед выполнением. Затем он может создать быстрый и оптимизированный собственный исполняемый файл без необходимости что-либо угадывать во время выполнения. Этот процесс широко известен как предварительная компиляция.
Компилятор Crystal построен на основе LLVM, той же инфраструктуры компилятора, которая используется в Rust, Clang и Apple Swift. В результате Crystal извлекает выгоду из того же уровня оптимизации, что и эти языки, что делает его хорошо подходящим для приложений с интенсивными вычислениями, таких как машинное обучение, обработка изображений или сжатие данных.
Но не все приложения привязаны к процессору. В большинстве случаев на карту поставлены другие ресурсы, такие как сетевые коммуникации или локальный диск. Все вместе они известны как ввод-вывод. Crystal имеет модель параллелизма, аналогичную горутинам Go или процессам Erlang, где несколько операций могут выполняться за циклом событий, не блокируя процесс и не делегируя слишком много работы операционной системе. Эта модель идеально подходит для таких приложений, как веб-службы или инструменты управления файлами.