← 최신 논문
💻 computer science

AdaTrans: Automated C to Rust Transformation via Error-Adaptive Repair

AdaTrans는 전략 기반 검색, 오류 적응형 변환, 그리고 다단계 검증을 활용하여 C 코드를 안전하고 컴파일 가능한 Rust로 성공적으로 변환함으로써, unsafe 구문을 최소화하면서 높은 통과율을 달성하는 자동화된 프레임워크입니다.

원저자: Xiaofan Liu, Zecan Li, Zhuang Zhao, Ziqi Shuai, Yanming Yang, Qi Xin, Jifeng Xuan

게시일 2026-07-01
📖 4 분 읽기☕ 가벼운 읽기

원저자: Xiaofan Liu, Zecan Li, Zhuang Zhao, Ziqi Shuai, Yanming Yang, Qi Xin, Jifeng Xuan

원본 논문은 CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기

개요: 위험한 언어를 안전한 언어로 번역하기

당신에게 아주 빠르고 강력하지만, 동시에 매우 위험하기로 악명 높은 C라는 프로그래밍 언어로 쓰인 오래된 책들이 가득한 거대한 도서관이 있다고 상상해 보세요. C 언어에서는 저자(프로그래머)만이 건물을 안전하게 유지할 유일한 책임자입니다. 만약 저자가 문을 잠그는 것(메모리 해제)을 잊거나 창문을 열어두면(댕글링 포인터), 집 전체가 불타버릴 수 있습니다(크래시 또는 해킹).

이제 이 모든 책을 Rust로 만들어진 새로운 건물로 옮기려고 합니다. Rust는 매우 엄격한 건물 검사관과 같은 현대적인 언어입니다. 이 검사관은 모든 문이 잠겨 있고 모든 창문이 안전하다는 것을 페이지마다 증명하지 않으면 당신이 책을 쓰는 것을 허용하지 않습니다. 만약 당신이 위험한 습관을 몰래 집어넣으려 한다면, 검사관은 문을 쾅 닫으며 "안 됩니다, 허용할 수 없습니다"라고 말할 것입니다.

문제점:
수십 년 동안 C에서 Rust로 이동하는 것은 악몽이었습니다.

  1. 수작업의 고충: 손으로 직접 하기에는 시간이 너무 오래 걸립니다.
  2. 낡은 도구들: 자동화된 도구들이 존재하지만, 종종 속임수를 씁니다. 그들은 코드를 작성하되 위험한 부분들을 "unsafe"라는 표지판 뒤에 숨겨버림으로써, 사실상 건물 검사관을 무시합니다.
  3. AI의 한계: 새로운 인공지능(LLM)은 코드를 작성할 수 있지만, 이들은 Rust의 엄격한 건축 법규를 이해하지 못하는 천재 작가와 같습니다. 그들은 아름다운 이야기를 써 내려가지만, 아주 작은 안전 위반 때문에 검사관에게 즉시 거절당하고 맙니다.

해결책: AdaTrans
저자들은 단순히 추측하는 것이 아니라, 실수를 통해 학습하며 C 코드를 안전한 Rust 코드로 번き하는 스마트한 시스템인 AdaTrans를 구축했습니다. 이것은 마치 마스터 설계사와 검사관 팀이 루프 안에서 함께 협력하는 것과 같습니다.


AdaTrans의 작동 원리: 3단계 댄스

이 시스템은 **시도(Try) → 확인(Check) → 수정(Fix)**의 연속적인 순환 구조로 작동합니다. 과정은 다음과 같습니다.

1. "다단계 검사" (1단계)

AI가 C 코드를 번역하려고 할 때, AdaTrans는 즉시 두 가지 테스트를 통해 코드를 검증합니다.

  • 구문 체크 (Syntax Check): 코드가 유효한 Rust 형태를 갖추었는가? (예: 세미콜론 누락 여부).
  • 안전 및 로직 체크 (Safety & Logic Check): Rust의 엄격한 안전 규칙을 깨뜨리지 않고 컴파일되는가? 그리고 원래의 C 코드가 수행하던 기능을 실제로 수행하는가?
  • 결과: 만약 실패한다면, 시스템은 단순히 "에러"라고 말하는 데 그치지 않고 에러를 분류합니다. 오타인가요? 안전 위반인가요? 아니면 단순히 로직이 틀린 것인가요?

2. "전문 사서" (2단계: 전략 기반 RAG)

이것이 운영의 핵심인 '두뇌'입니다. AdaTrans는 단순히 AI에게 혼란스러운 에러 메시지를 그대로 보여주는 대신, 전문 사서처럼 행동합니다.

  • 에러가 오타(구문 에러)라면, 사서는 AI에게 "문법 수정" 치트 시트를 건네줍니다.
  • 에러가 안전(소유권/Ownership)에 관한 것이라면, 사서는 메모리를 안전하게 다루는 구체적인 예시가 담긴 "Rust 안전 매뉴얼"을 건네줍니다.
  • 에러가 로직(코드는 실행되지만 결과가 틀린 경우)에 관한 것이라면, 사서는 AI에게 알고리즘 전체를 다시 생각해보라는 "창의적 사고" 프롬프트를 제공합니다.

비유: 자동차를 수리하려고 한다고 상상해 보세요.

  • 타이어가 펑크 났다면, 정비사에게 엔진을 새로 만들라고 부르는 것이 아니라 타이어 패치 키트를 가져오는 것이 맞습니다.
  • 엔진에서 이상한 소리가 난다면, 단순히 볼트를 조이는 것이 아니라 심층 진단이 필요합니다.
    AdaTrans는 AI가 특정한 문제에 맞는 정확한 도구를 얻을 수 있도록 보장합니다.

3. "적응형 온도" (3단계: ESTS)

이것은 비법(Secret Sauce)입니다. AI가 코드를 수정할 때, 얼마나 "창의적"이어 혹은 "조심스러울"지 결정해야 합니다. AdaTrans는 "온도" 조절 다이얼을 사용하여 이를 제어합니다.

  • 낮은 온도 (신중함): 단순한 오타의 경우, AI에게 매우 정밀하게 규칙을 따르라고 지시합니다. 무모한 추측은 금지됩니다.
  • 중간 온도 (균형): 안전 에러의 경우, AI에게 메모리를 구성하는 몇 가지 다른 방법들을 탐색하되 규칙 내에 머물도록 지시합니다.
  • 높ую 온도 (창의적): 로직이 잘못된 경우(예: 수학적 계산이 틀린 경우), AI에게 완전히 새로운 구조를 시도하도록 자유롭게 명령합니다. 현재의 사고 패턴을 깨고 나와야만 올바른 해결책을 찾을 수 있기 때문입니다.

"정체" 감지기:
만약 AI가 똑같은 실수를 계속 반복한다면(마치 꼬리를 잡으려는 강아지처럼), AdaTrans는 이러한 "정체 상태"를 감지합니다. 시스템은 리셋(RESET) 버튼을 눌러 현재의 시도를 버리고, 깨끗한 상태에서 원래의 C 코드로부터 다시 시작합니다. 이는 AI가 막다른 길에서 시간을 낭비하는 것을 방지합니다.


결과: 효과가 있었는가?

저자들은 이를 104개의 서로 다른 프로그래밍 퍼즐(AI가 본 적 없는 LeetCode 콘테스트 출처)을 통해 테스트했습니다.

  • 성공률: AdaTrans는 약 **81%**의 문제를 안전(위험한 "unsafe" 블록이 없음)하면서도 정확(모든 테스트 통과)한 Rust 코드로 성공적으로 번역했습니다.
  • 비교:
    • 기존 AI (Zero-shot): 이 특수한 시스템 없이 AI는 첫 시도에서 약 **25%**의 성공률을 보였습니다. 설령 100번을 무작위로 시도하게 하더라도 **70%**에 그쳤습니다. 반면 AdaTrans는 단 한 번의 스마트한 반복 과정을 통해 **81%**에 도달했습니다.
    • 기존 도구들: 기존 도구들(예: c2rust)은 코드를 컴파일할 수는 있었지만, 안전 규칙을 속이기 위해 "unsafe" 블록을 가득 채웠습니다. AdaTrans는 코드를 99% 안전하게 유지했습니다.
    • 다른 AI 도구들: 최근의 다른 AI 도구들은 복잡한 로직 에러를 처리하지 못해 성공률이 20% 미만에 머물렀습니다.

요약

AdaTrans는 "빠른 번역"과 "안전한 코드" 중 하나를 선택할 필요가 없다는 것을 증명합니다. AI에게 다음과 같은 능력을 부여함으로써 말이죠:

  1. 특정 에러를 경청하고,
  2. 그 에러에 맞는 전문 지식을 참고하며,
  3. 난이도에 따라 창의성 수준을 조절하는 능력.

이를 통해 위험한 옛 코드를 현대적이고 안전한 코드로 성공적으로 이주할 수 있습니다. 이는 마치 AI에게 지도와 나침반, 그리고 언제 조심스럽게 걸어야 하고 언제 과감하게 뛰어내려야 하는지 정확히 아는 가이드를 붙여준 것과 같습니다.

연구 분야의 논문에 파묻히고 계신가요?

연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.

Digest 사용해 보기 →