it
August 7, 2022

Nim

Nim — компилируемый, статически типизированный язык программирования… Ай, к чёрту википедию.

Наткнулся я на него совершенно случайно, когда читал статью на realpython про ускорение кода на Python через си-инклюды. Ужаснулся, закрыл статью, ушёл искать что-то еще.

В итоге наткнулся на эту статью, в которой рассказывается про nimporter в связке с nimpy. Nimpy позволяет nimporter импортировать нимовские модули прямо в питонячий код и работать с ними как обычно. Ну не магия ли это?

Самый кайф в том, что nim-код компилируется в статический бинарь, которому для запуска не нужны никакие зависимости, скорость на уровне Си, а синтаксис очень простой и сильно напоминает Python (и никаких указателей).

Правда этим чудо-костылём я так и не воспользовался, потому что не нашёл, чтобы такого в моих микро-проектах можно было бы ускорить и благополучно про nim на какое-то время забыл.

И тут недавно я переустановил себе Linux (недавно написал статью с обзором конфигов) и как это у меня обычно бывает — начал смотреть “а чего бы такого автоматизировать?”. Листаю свой конфиг шелла и вижу громозкое описание переменной PATH (не нравится мне идея туеву хучу бинарей пихать в системные каталоги, поэтому кастомных путей у меня там полно).

Есть идея — запихать все пути из конфига шелла в отдельный файлик и оттуда его считывать в конфиг.

Что обычно берут люди, когда нужно что-то заскриптовать в линуксе? Правильно — Bash. Bash это что? Попаболь. Возиться с ним не очень-то хочется, ибо синтаксис неочевидный, дебажить проблематично, один гемор короче.

Попробовал сначала решить эту задачу на Python. Получилось чертовски медленно, а в конфиге шелла скорость очень важна, ведь пока не отработает скрипт конфига, промпт не отрисуется.

Хорошо, питон отбрасываем. Что у нас еще есть? Раст? Как из пушки по воробьям стрелять… Нужно что-то простое и быстрое. Вспоминаю про Nim. За пару часов написал маленький скриптик. Получилось красиво, быстро, удобно.

Теперь вместо длиннющего export PATH="$PATH:/home/dadyarri/.nimble/bin:/home/dadyarri/.npm/packages/bin:/home/dadyarri/bin:/home/dadyarri/scripts:/home/dadyarri/.local/bin"

стало export PATH="$PATH:$(/home/dadyarri/bin/getpath)"

Ну не супер ли?

Плюсы:

  • Красивый, питоноподобный синтаксис;
  • Статическая типизация;
  • Высокая скорость запуска;
  • Для запуска не нужны зависимости.
  • Удобный менеджер пакетов nimble (своего репозитория у nim нет, используется git)

Минусы:

  • Бардак в стандартной библиотеке (std/parsexml, std/xmlparser, std/xmltree, например);
  • Опциональные круглые скобки при вызове фукнкций (это конечно больше придирка);
  • Очень странное ООП. Допустим есть let file: File = open("somefile.txt", fileMode.FmWrite). Можно прочесть его содержимое, вызвав (в моём понимании, как в прочих языках) метод объекта: file.write("some text"), а можно, вызвав функцию: write(file, "some text");
  • Паршивая документация, которая обычно сводится к автоматически сгенерированным из кода спискам методов, перечислений и прочего, причём даже не у всех элементов есть описание;
  • Местами идиотские сообщения об ошибках, которые вообще не дают никаких подсказок о факапе и единственный способ их решить — лезть в код или в ишью.

Энивей, nim классный, есть куда развиваться. Не думаю, что он может стать чем-то серьёзным вроде дотнета (по крайней мере не скоро), но как альтернатива башу для скриптинга вполне себе неплохо.