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 классный, есть куда развиваться. Не думаю, что он может стать чем-то серьёзным вроде дотнета (по крайней мере не скоро), но как альтернатива башу для скриптинга вполне себе неплохо.