Разработчик Колин Ричардс представил открытый проект под названием tmux‑rs. Это первая альфа‑версия порта терминального мультиплексора tmux, написанная на языке программирования Rust.
В описании порта указано, что этот проект находится в стадии альфа-тестирования и имеет множество известных ошибок. tmux-rs написан на почти полностью unsafe Rust. Автор решения советует не используйте эту наработку в том случае, если кто-то не готов мириться с частыми сбоями.
«Около 6 месяцев я тихо портировал tmux с C на Rust. Недавно я достиг большой вехи: кодовая база теперь на 100% (unsafe) Rust. Я хотел бы поделиться процессом портирования исходной кодовой базы с ~67 000 строк кода C на ~81 000 строк Rust (исключая комментарии и пустые строки). Вы можете спросить: зачем вы переписали tmux на Rust? И да, у меня нет на это веской причины. Это хобби‑проект. Как садоводство, но с большим количеством ошибок сегментации», — написал Ричардс в подробном технической публикации в своём блоге по этому проекту.
В ходе разработчик проекта Ричардс не использовал ИИ. Он пробовал задействовать Cursor, но в итоге разработчику пришлось потратить столько же времени на просмотр сгенерированного кода, сколько потребовалось на то, чтобы написать его самому. После этого Ричардс отказался от ИИ-помощников и всё делал вручную.
Ричардс изначально пытался сделать порт с помощью C2Rust, транспилятора C в Rust. Этот инструмент оказался сложным в настройке, а сгенерированный им код хоть и работал, но был в основном неподдерживаемым и в три раза больше, чем исходный C.
В итоге Ричардс решил делать порт полностью самостоятельно, выработав чёткое понимание того, как должен быть построен проект. Для tmux это autotools. Он выяснил, куда добавлять/удалять файлы в autogen.sh и как изменять сгенерированный Makefile для привязки к статической библиотеке, созданной Rust Crate, с помощью опции crate-type = «staticlib». Это означало, что процесс сборки порта не был таким простым, как просто запуск Cargo build. Ричардс написал небольшой скрипт build.sh, который вызывал Cargo, а затем запускал Make. Это работало некоторое время, но каждый раз, когда Ричардс заканчивал перевод файла, ему приходилось перенастраивать и изменять Makefile. В итоге оказалось, что проще поместить всё в один Crate.
В процессе портирования Ричардс допустил много ошибок при переводе кода. Он постарался их обнаружить и исправить в оперативном режиме, но часть из них пока что осталась в проекте.
В ходе работы над этим проектом Ричардс использовал множество различных текстовых редакторов и IDE. В основном рабочем процессе задействовался neovim и пользовательские макросы для ускорения процесса перевода. Например, Ричардс создал макросы vim для таких вещей, как преобразований: «ptr == NULL to ptr.is_null()» и «ptr->field to (*ptr).field». Оказалось, что большинство таких изменений просто сделать, но их трудно сделать все сразу с помощью поиска и замены. Разработчик делал их вручную тысячи раз.
«Хотя код теперь на 100%, я не уверен, что достиг своей главной цели. Мой код, переведённый вручную, не намного лучше, чем вывод C2Rust. Проект не так уж сложно заставить упасть, и я знаю о многих ошибках. Следующая цель — преобразовать кодовую базу в safe Rust. Несмотря на всё это, я выпускаю версию 0.0.1, чтобы поделиться ею с другими поклонниками Rust и tmux», — подытожил Ричардс.
Источник: habr.com