Новая версия языка программирования Nim 0.18.0

Представлен значительный релиз языка системного программирования Nim 0.18.0. Язык использует статическую типизацию и создан с оглядкой на Pascal, C++, Python и Lisp. Код проекта поставляется под лицензией MIT.

Исходный код на языке Nim компилируется в представление на C, C++ или JavaScript. В дальнейшем полученный C/C++ код компилируется в исполняемый файл при помощи любого доступного компилятора (clang, gcc, icc, Visual C++), что позволяет добиться производительности близкой к Си, если не учитывать затраты на выполнение сборщика мусора. По аналогии с Python в Nim в качестве разделителей блоков применяются отступы. Регистр написания символов в идентификаторах не учитывается. Поддерживаются средства метапрограммирования и возможности для создания предметно-ориентированных языков (DSL).

В новом выпуске отмечается ряд существенных новшеств и изменений, связанных с проведением чистки стандартной библиотеки перед релизом 1.0. Также внесена большая порция изменений, нарушающих обратную совместимость. Оператор индексирования »[]» теперь выдаёт ошибку, если запрошенный диапазон выходит за границы строки, вместо выдачи подпадающий под запрос части строки (например, var myString = «hello world»; myString[6 … 45] теперь инициирует исключение IndexError). Также изменена логика обработки коллекций оператором »$» и прекращено приведение массивов array[x, char] к типу cstring. Спецсимвол »\n» теперь выводит только код перевода строки без кода возврата каретки.

Среди новшеств:

  • Добавлен модуль strformat, предоставляющий поддержку форматируемых строковых литералов, позволяющих определить строку, содержащую подстановки (например let name = «Fred»; doAssert fmt«My name is {name}.»), в стиле «f»-строк Python 3.6;
  • В генератор документации добавлен макрос runnableExamples, позволяющий протестировать работу приводимых примеров кода;
  • Добавлен новый макрос mapLiterals, упрощающий создание массивов и последовательностей (например, «let x = mapLiterals ([12, 34, 15, 1], uint32)»);
  • Изменён алгоритм управления памятью. Новый алгоритм TLSF позволяет снизить фрагментацию памяти, ценой усложнения операций alloc и dealloc;
  • Серия изменений в модулях для асинхронного ввода/вывода. Представлена унифицированная реализация asyncdispatch и новая процедура getIoHandler, возвращающая дескриптор ввода/вывода или epoll/kqueue. В модуле asyncjs появилась новая реализация async await для бэкенда JavaScript;
  • Пакетный менеджер Nimble обновлён до версии 0.8.10, в которой появилась возможность размещения нескольких пакетов Nimble в одном репозитории Git или Hg;
  • Из stdlib в обособленные пакеты Nimble переведены библиотеки gentabs, libuv, polynumeric, pdcurses, romans, libsvm и joyent_http_parser. Объявлены устаревшими basic2d и basic3d, вместо которых следует использовать такие пакеты, как glm, arraymancer и neo.

© OpenNet