Как стать автором
Поиск
Написать публикацию
Обновить

Представлен открытый проект tmux-rs — версия терминального мультиплексора tmux на Rust

Время на прочтение3 мин
Количество просмотров3.4K

Разработчик Колин Ричардс представил открытый проект под названием 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», — подытожил Ричардс.

Теги:
Хабы:
Всего голосов 4: ↑4 и ↓0+7
Комментарии20

Другие новости

Ближайшие события