지피지기 백전백퇴

프로젝트를 Rust로 변환하기


서론

나는 그냥 tmux에 약간 커스터마이징을 하고 싶었을 뿐이고, tmux에서 기본적으로 제공하는 기능들로는 뭔가 부족해보여서 뭔가 새로 만들어보고 싶었을 뿐이고… 토큰이 남아버릴 것 같았을 뿐이고…

방법 1: 해줘

처음에는 “여기 tmux가 있다. 여기서 프로토콜에 해당하는 부분을 trait으로 정의해봐.”

그다음에 “이 프로토콜을 구현한 서버를 만들고 tmux의 기능을 최대한 구현해봐. tmux client랑 함께 사용이 가능해야 해”

평가 1: 망함

tmux에 이렇게나 많은 기능들이 있는줄은 몰랐다. 짜잘한 기능에서 미세하게 기능이 틀어져서, 해당 부분을 conformance test로 만들고 수정하기를 반복해도, 이대로는 100% 변환에 무리가 있을 거라는 결론을 얻었다.

방법 2: 해줘

다음에는 C2rust라는 프로젝트를 써서 C를 그대로 unsafe Rust로 변환한 다음에 적당히 고쳐보자… 고 맘먹었다. 의외로 C2Rust는 별다른 설정 없이도 변환에 성공했다!

평가 2: 이건 Rust이지만 Rust가 아니다

엄청한 *mut 포인터의 향연!

방법 3: 해줘

이제 모든 메모리 할당/해제를 추적해서 적당히 Box, Vec, CString 등의 owned struct로 변환해달라고 해보자.

결과 3: 망함

LLM은 맘편하게 Box::new 한다음 바로 Box::into_raw하고, free를 그냥 drop(Box::from_raw(…))로 변환하는 꼼수로 당신의 요구사항을 우회하려고 할 것이다. 어차피 리눅스 환경에서는 malloc/free나Box::new,Box::drop이 서로 그냥 동작하기 때문에, 테스트로 잡아낼 수 있는 건 아니다.

방법 4: 그만해

한동안 필드 하나하나 손으로 꼽아가며, “야 이건 Box::into_raw 안하고 처리해봐”를 반복해 봤다. LLM이 똑똑하니 이정도만 얘기해도 into_raw, from_raw를 꽤나 줄일 수는 있었다.

결론

요새 LLM이 잘 해줘서 C 코드를 적당히 safe한 Rust로 변환하는게 그리 어려운 일은 아니다…? (과연?)