Андреас Румпф (Andreas Rumpf, Araq), автор языка программирования Nim, опубликовал серию отчётов о прогрессе разработки компилятора Nimony, создаваемого как основа для будущего релиза Nim 3.0. На данный момент уже доступен восьмой отчёт. Ключевое достижение последнего времени — переход к самокомпиляции: весь стек инструментов, включая фронтенд, прослойку (middle-end), оптимизатор и бэкенд, теперь может быть собран самим Nimony. Дополнительно реализованы JavaScript-бэкенд, поддержка всех четырёх актуальных режимов управления памятью и работа на платформе FreeBSD. Код проекта написан на Nim и распространяется под лицензией MIT.
Nimony — новая реализация языка Nim, практически не использующая кодовую базу существующего компилятора: с нуля написаны семантический анализ, обобщённые процедуры, разворачивание шаблонов, управление памятью и генерация кода. Цели проекта — инкрементальная перекомпиляция, полностью параллельные сборки, отказ от обязательных предварительных объявлений процедур и типов, типобезопасные дженерики и единая модель конкурентности на основе продолжений (continuations). Этапы компиляции обмениваются данными через текстовый формат NIF, а вместо исполнения макросов в виртуальной машине применяются плагины, компилируемые в нативные исполняемые файлы.
Основные изменения за прошедшие месяцы:
- Самокомпиляция и бэкенды
- Бэкенд nativenif портирован и собирается при помощи Nimony. Вся цепочка инструментов, от фронтенда до генератора нативного кода, компилируется самим Nimony.
- Архитектура перестроена вокруг промежуточного представления NJ («No Jumps»), не содержащего операции break, continue и goto. NJ развивается для использования во фронтендах Nimony и Nim 2.x (текущей версии) и обеспечивает генерацию кода для C/C++, JavaScript и нативных бэкендов x86-64 и ARM64.
- Добавлен JavaScript-бэкенд, включаемый подкомандой j (nimony j file.nim).
- NIFC переименован в Leng для устранения постоянной путаницы между NIF и NIFC.
- Обеспечена сборка DLL, позволяющая разрабатывать части программ на Nimony и подключать их к проектам на Nim 2.x,
- Добавлена поддержка FreeBSD.
- Управление памятью
- В дополнение к имевшимся режимам управления памятью ARC и atomicArc портированы ORC и YRC. Доступна возможность подключения собственных реализаций через переключатель mm:<путь>.
- По умолчанию задействованы типы ref и ptr, не допускающие значения nil. Для совместимости со старым кодом предназначена прагма {.feature: «lenientnils».}.
- Среда выполнения доработана для устойчивости к нехватке памяти (OOM — out-of-memory).
- Языковые возможности и стандартная библиотека
- Реализованы суммарные типы (sum types) и сопоставление с образцом (pattern matching), на основе которых в стандартную библиотеку добавлены типы Opt[T] и Result[T, E] для поддержки функциональной парадигмы программирования.
- Проверка диапазонов выполняется полностью на этапе компиляции: если корректность неявного преобразования не удаётся доказать, компиляция завершается ошибкой.
- Семантика break и block приведена к поведению Nim 3 (RFC 576).
- Реализованы явные циклические зависимости между модулями.
- Решено допустить классические исключения в виде ref object с подтипами (heap-based exceptions) для совместимости с Nim 2.
- Сохранена работоспособность макросов: std/macros отображается на систему плагинов Nimony, что позволяет использовать существующий код метапрограммирования без переписывания.
- Добавлена параллельная форма цикла for («for i in 0 || 1»), реализованная в виде плагина, интегрированного с пулом потоков и циклом событий. Корректность доступа к результатам проверяется статически: import std / [parfor, syncio] proc pfib(n: int): int = if n { 2: return n var r = [0, 0] for i in 0 || 1: # итерации выполняются параллельно r[i] = pfib(n — 1 — i) result = r[0] + r[1]
- В стандартную библиотеку добавлены модули httpclient с собственной реализацией TLS, complex, base64 и heapqueue, а также sort. Блокировки переведены на вызовы, не зависящие от libc.
- Инженерные улучшения
- Кодовая база компилятора переведена на nifcore, очередную итерацию API для работы с NIF, что снизило потребление памяти.
- Для повышения безопасности работы с памятью во внутренних структурах NIF задействован подсчёт ссылок и режим copy-on-write.
- Реализована проверка плагинов перед выполнением. Для проверки во время разработки плагинов поставляется линтер.
- Реализованы совместимые с Nim прагмы .compile, .link, .intdefine, .booldefine и .strdefine. Прагма .build сделана независимой от инструментария сборки, а новая прагма .bundle позволяет подключать собственные бэкенды, работающие поверх Leng.
При тестировании потребления памяти на системе с чипом Apple M1 самый требовательный к памяти процесс фронтенда занимает 45 МиБ, бэкенда — 111 МиБ, а суммарное потребление при восьми одновременно работающих процессах достигает 171 МиБ. Сборка тех же компонентов компилятором Nim 2 требует примерно в пять раз больше памяти, что в значительной мере обусловлено применением clang.
Целью на текущий год в README проекта названа готовность компилятора к промышленному использованию для проектов, укладывающихся в задокументированный набор возможностей. В начале года темп разработки снизился из-за параллельной работы над системой инкрементальной компиляции в Nim 2. Модуль httpclient с собственной реализацией TLS создан для отработки применения Nim в роли встроенного ассемблера.
исправить +/–
- Главная ссылка к новости (https://forum.nim-lang.org/…)
- OpenNews: Релиз языка программирования Nim 2.2.12
- OpenNews: В языке Nim представлен YRC — потокобезопасный сборщик циклических ссылок
- OpenNews: Представлены принципы дизайна компилятора Nimony для будущего Nim 3.0
- OpenNews: Для Nim 3.0 развивается новый компиляторный бэкенд на основе формата NIF
- OpenNews: В openSUSE обеспечена полная поддержка языка программирования Nim
Автор новости: Аноним Лицензия: CC BY 3.0 Короткая ссылка: https://opennet.ru/66488-nim Ключевые слова: nim, nimony При перепечатке указание ссылки на opennet.ru обязательно
