group-telegram.com/gepardchan/145
Last Update:
Чем я еще заnimался
Расскажу, пожалуй, еще одну интересную историю про Nim.
Но сначала познакомлю вас с действующими лицами сего повествования:
* nim
: компилятор Nim, лучшего языка программирования в мире. Можете считать примерным аналогом rustc
из мира Rust.
* nimble
: пакетный менеждер для языка Nim. Примерный аналог cargo
из мира Rust.
* choosenim
: утилита, которая умеет устанавливать nim
и nimble
нужных версий, а также обновлять их. Примерный аналог rustup
из мира Rust.
Теперь можно начинать рассказ.
Однажды я заметил, что мой CI-пайплайн программы на Nim замедлился аж на целых пять минут! Все мы прекрасно помним xz
и Jia Tan, и как из-за тормозов openssh
был найден очень хорошо спрятанный бэкдор. Но в случае с openssh
замедление составляло сотни миллисекунд, а здесь — аж целых пять минут! Паранойя зашкаливает, желание разобраться — еще больше.
В итоге, используя метод grep'а и внимательного чтения нагрепанного кода (очень полезный метод, кстати), я выяснил вот что:
* choosenim
скачивает бинарники nim
и nimble
(и еще кучу разных других нужных вещей), и распаковывает их
* перед тем, как создать ссылки на распакованные бинарники в нужной папке, choosenim
зовет nimble --version
, чтобы напечатать предупреждение, если версия nimble
слишком древняя и не поддерживается
* nimble
перед тем, как показать свою версию, проверяет свое окружение, и обнаруживает, что компилятора nim
нет на месте
* далее nimble
пытается исправить это безобразие. Для этого он сам клонирует репу с компилятором nim
и собирает его из исходников!
* сборка компилятора — конечно же, дело небыстрое, и занимает те самые пять минут. Скажем лишь спасибо, что компилятор собирается довольно быстро, и не приходится ждать часами.
В общем, предсказуемо никакого Jia Tan'а здесь не оказалось, зато оказался банальный баг. А с багами поступают обычно просто: репортят и ждут фикса. Пофиксили его, впрочем, быстро и легко: теперь --version
лишь выводит версию и больше ничего сделать не пытается.
Выводы из этой истории делайте сами.
BY Гепардово гнездо
Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260
Share with your friend now:
group-telegram.com/gepardchan/145