Выпуск языка программирования Crystal 1.16

Опубликован релиз языка программирования Crystal 1.16, разработчики которого пытаются совместить удобство разработки на языке Ruby с высокой производительностью приложений, свойственной языку Си. Синтаксис Crystal близок к языку Ruby, но не полностью совместим с ним, несмотря на то, что без переработки выполняются некоторые ruby-программы. Код компилятора написан на языке Crystal и распространяется под лицензией Apache 2.0.

В языке применяется статическая проверка типов, реализованная без необходимости явного указания типов переменных и аргументов методов в коде. Программы на Crystal компилируются в исполняемые файлы, с вычислением макросов и генерацией кода во время компиляции. В программах на языке Crystal допускается подключение биндингов, написанных на языке Си. Распараллеливание выполнения кода производится при помощи ключевого слова «spawn», которое позволяет запустить фоновую задачу в асинхронном режиме, не блокируя основной поток, в виде легковесных потоков, именуемых файберами (Fiber).

Стандартная библиотека предоставляет набор типовых функций, среди которых средства для обработки CSV, YAML, и JSON, компоненты для создания HTTP-серверов и поддержки WebSocket. В процессе разработки можно использовать команду «crystal play», которая формирует web-интерфейс (по умолчанию localhost:8080) для интерактивного выполнения кода на языке Crystal.

Основные изменения:

  • Добавлена экспериментальная поддержка запуска легковесных потоков (fiber) в отдельных контекстах исполнения (Execution Contexts), что позволяет добиться более эффективного параллельного выполнения задач — блокировка потоков в одном контексте, не приводит к остановке выполнения в другом.

       mt_context = Fiber::ExecutionContext::MultiThreaded.new("worker-threads", 4)
    
       10.times do
         mt_context.spawn do
          do_something
         end
       end
    
       gtk = Fiber::ExecutionContext::Isolated.new("Gtk") do
         Gtk.main
       end
       gtk.wait
    
  • В методе Slice.literal обеспечен вывод типа элементов, содержащихся в срезе (slice), и добавлена поддержка работы в интерпретаторе.
  • В макросах sizeof и alignof обеспечено предоставление информации о стабильных типах.

  • В стандартную библиотеку добавлены новые методы: Indexable#find, #find!, EventLoop#wait_readable и #wait_writable.

  • В компилятор добавлен длинный вариант опции »-o» — »--output» и реализована возможность указания каталога в вместо файла (имя файла будет выбрано в соответствии с именем файла с кодом).

  • В генератор документации добавлена возможность включения в документацию приватных и защищённых объектов, а также объектов в библиотечных обвязках (lib, fun, union, cstruct, external, type).

  • В методе «File.match?» задействован новый алгоритм сопоставления файловых путей, позволивший избавиться от некоторых проблем и ограничений. Например, теперь корректно обрабатываются экранирование символов (под маску »\\t» подпадает »\t», а не символ «t»), разделение путей (маска «a**» охватывает «ab», но не срабатывает для «ab/c», а маска »**/a» охватывает «a»), вложенные шаблоны (маска »{[}]}» охватывает »}»), диапазоны (маска »[a-]» охватывает »-»).

  • В именах параметров определений (defs), макросов и блоков объявлены устаревшими суффиксы »?» и »!».

  • В методах Enumerable#sum и #product убрано автоматическое определение типа возвращаемого значения, если тип элементов является объединением (union). При вызове данных методов теперь нужно явно указывать тип, например, вместо »[1, 10000000000_u64].sum» следует писать »[1, 10000000000_u64].sum (0_u64)».

  • В HTTP: Request обеспечен корректный разбор частей URL.

  • Добавлена поддержка набора компиляторов LLVM 20.
  • Объявлены устаревшими вызовы LLVM: ABI и LLVM: TargetMachine#abi.



    Источник: http://www.opennet.ru/opennews/art.shtml? num=63052

© OpenNet