KAIST, 미국 국방부가 주목한 C-러스트 기술 선도하다
상태바
KAIST, 미국 국방부가 주목한 C-러스트 기술 선도하다
  • 송윤영 기자
  • yaho1130@hanmail.net
  • 승인 2024.08.13 09:56
  • 댓글 0
이 기사를 공유합니다

KAIST, 프로그래밍 언어 C로 작성한 코드를 러스트(Rust) 언어로 자동 번역하는 기술 세계적으로 선도
백악관과 미 국방부가 메모리 문제를 막기 위해 C 언어 대신 러스트 사용 촉구
C 코드의 안전성에 중요한 여러 핵심 기능을 자동으로 변환하는 C-러스트 코드 번역 기술 선도

(대전=세종충청뉴스) 송윤영 기자= 컴퓨터 시스템을 작동시키기 위해서는 소프트웨어를 작성해야 하는데 그때 필요한 언어가 바로 프로그래밍 언어이다. 실행속도도 빠르고 유지보수도 쉬운 언어가 C언어인데 메모리 할당 및 관리 등에 치명적인 문제점을 가지고 있다. 이런 문제를 해결하기 위해 개발된 프로그래밍 언어는 러스트이다. 미국 백악관이나 국방성에서 메모리 문제를 막기 위해 러스트같이 안전한 언어 사용을 촉구하고 있는데 KAIST 연구진이 C-러스트 코드 번역 기술을 이미 선제적으로 개발하고 선도하고 있어 화제다.

KAIST(총장 이광형)는 전산학부 류석영 교수 연구팀(프로그래밍 언어 연구실)이 C언어의 유니언(union)*을 러스트의 태그드 유니언(tagged union)으로 변환하는 기술을 세계 최초로 개발했다고 13일 밝혔다.

*유니언: 여러 종류의 데이터를 같은 공간에 보관해 메모리 효율을 높이는 C언어의 핵심 기능이다. 그러나 보관된 데이터가 어떤 종류인지 구분하지 않아 메모리 문제를 일으킬 수 있다.

**태그드 유니언: 같은 공간에 보관할 수 있는 여러 종류의 데이터 중 어떤 종류의 데이터를 보관하는지 태그를 붙여서 구분하여, 메모리 문제를 일으키지 않는다.

연구팀은 C언어의 유니언에 특화된 새로운 프로그램 분석 기법을 고안해 러스트의 태그드 유니언으로 자동 번역하는 데 성공했다.

올해 2월 백악관에서도 C언어의 사용을 중단하라고 촉구한 바가 있고 미국 국방고등연구계획국(이하 DARPA)에서 C언어로 작성된 코드를 러스트(Rust)로 자동 번역하는 기술을 개발하는 연구 과제를 발표했다. DARPA는 미국 국방성의 연구·개발을 담당하는 기관이며 인터넷의 원형인 아파넷(ARPANET)을 개발하는 등 혁신적이고 영향력 있는 연구를 지원해 왔다. DARPA는 이 과제를 제안하며 C의 메모리 문제를 막기 위해 러스트같이 안전한 언어를 사용해야 한다고 밝혔다.

러스트는 2015년부터 개발된 프로그래밍 언어다. 운영 체제, 웹 브라우저 개발 등에 쓰이며, 2022년에는 리눅스(Linux) 개발에도 공식 사용되기 시작했다. C와 달리 프로그램 실행 전에 메모리 문제를 탐지하고 예방할 수 있는 것이 특징이다.

류 교수 연구진은 2023년 5월과 2024년 6월에 각각 C의 뮤텍스(mutex)*와 출력 파라미터(output parameter)**를 러스트로 변환하는 기술을 세계 최초로 개발해, 최우수 국제 학술대회인 국제소프트웨어엔지니어링학회(ICSE)와 프로그래밍언어설계구현학회(PLDI)에 발표한 바 있다.

*뮤텍스: 프로그램 동기화에 필요한 기능

**출력 파라미터: 계산 결과 전달에 사용되는 기능

C언어와 러스트의 큰 간극으로 인해 세계적으로도 C-러스트 코드 번역 기술을 성공적으로 개발한 연구팀은 극소수다. 그마저도 포인터(pointer)*를 변환하는 데 머물고 있다. 그러나 류석영 교수 연구팀은 C의 여러 핵심 기능을 변환하는 기법을 연달아 제시해 C-러스트 코드 번역 기술을 선도하고 있다.

*포인터: 데이터 저장 위치를 표현하는 기능

류석영 교수는 “안전한 소프트웨어 제작을 목표로 연구하면서 C-러스트 코드 번역의 중요성을 일찍이 파악하고 각종 프로그래밍 언어 기법들을 코드 번역에 적극적으로 도입하여 나온 결과”라면서, “완전한 자동 번역을 위해 아직 풀어야 할 난제가 많으니 후속 연구에 정진하여 계속 분야를 선도하겠다”고 말했다.

KAIST 전산학부 홍재민 석박사통합과정 학생이 제1 저자로 참여한 이번 연구 결과는 최우수 국제 학술대회인 국제자동소프트웨어엔지니어링학회(ASE)에 채택됐다(논문명: To Tag, or Not to Tag: Translating C's Unions to Rust's Tagged Unions).

한편 이번 연구는 한국연구재단 선도연구센터 및 중견연구자지원사업, 정보통신기획평가원(IITP), 삼성전자의 지원을 받아 수행됐다.

□ 연구개요

1. 연구 배경

러스트(Rust)는 C 언어와 달리 프로그램의 메모리 문제를 실행 전에 탐지할 수 있는 언어다. 그래서 기존 C 코드를 러스트로 자동 번역하는 것이 중요하다. 이때 C의 각 기능을 러스트의 적절한 기능으로 변환해야 한다. C의 유니언(union)은 여러 타입(type)의 데이터를 같은 공간에 보관해 메모리 효율을 높이는 기능이다. 그러나 각 공간에 저장된 데이터의 타입을 언어 수준에서 기록하지 않는다. 개발자가 저장된 데이터의 타입을 직접 판단하여 바르게 사용해야 하는 것이다. 이를 위해 개발자는 대개 데이터의 타입을 나타내는 태그(tag) 값을 별도로 기록한다. 하지만 태그 값을 잘못 기록하는 등 실수할 수 있다. 그러면 데이터를 잘못된 타입으로 처리하여 메모리 문제가 일어난다. 한편 러스트는 언어 수준에서 태그와 유니언을 하나로 묶은 태그드 유니언(tagged union)이라는 기능을 제공한다. 태그 값이 올바른지 실행 전에 자동으로 검사하기 때문에 메모리 문제가 일어날 수 없다. 따라서, 코드 번역 시에 각 유니언의 태그 값이 저장된 위치를 찾고 유니언을 태그드 유니언으로 변환하는 기법을 개발하고자 하였다.

2. 연구 내용

각 유니언의 태그 값이 저장된 위치를 찾는 프로그램 분석 기법과 분석 결과를 바탕으로 유니언을 태그드 유니언으로 대체하는 프로그램 변환 기법을 개발하였다. 프로그램 분석 기법은 세 가지 목표를 만족하도록 설계하였다. 첫째, 각 구조체(struct)에 저장된 값을 파악할 수 있어야 한다. 대개 구조체 안에 유니언과 태그 값이 저장되기에, 태그 값의 위치를 찾는 데 있어 필수적이다. 이를 위해 가리키는 곳(points-to) 분석을 도입하여, 데이터 흐름이 복잡해도 구조체 관련 정보를 알아낼 수 있게 하였다. 둘째, 분석이 효율적이어야 한다. 전체 프로그램 대신 유니언이 사용되는 부분만 분석해도 된다는 점에 착안하여 효율적인 분석을 만들었다. 필요 부분만 선택적으로 분석할 수 있도록 함수내(intraprocedural) 분석을 도입하였다. 셋째, 분석이 부정확할 때도 태그 값의 위치를 찾을 수 있어야 한다. 분석이 부정확한 경우가 존재함은 수학적으로 증명된 내재적인 한계다. 이를 해결하고자 부정확한 분석 결과를 처리하는 휴리스틱(heuristic) 알고리즘을 도입하였다. 한편, 프로그램 변환 기법은 단순한(naïve) 변환과 자연스러운(idiomatic) 변환의 두 가지 변환 전략으로 구성하였다. 단순한 변환은 모든 코드에 적용할 수 있는 대신 통상적인 러스트 코드와 다른 형태의 코드를 만든다. 반면, 자연스러운 변환은 일부 코드에만 적용할 수 있지만 통상적인 러스트 코드와 유사한 코드를 만든다. 두 전략을 병용함으로써 넓은 범위의 코드를 처리하면서도 통상적인 러스트 코드에 가까운 코드를 만들 수 있다. 실제 C 프로그램의 번역에 적용한 결과, 제시한 기술이 정확하고 올바르고 효율적으로 유니언을 태그드 유니언으로 변환함을 확인할 수 있었다.

3. 기대 효과

제시된 방법론은 다양한 실제 C 프로그램을 번역할 때 유니언을 태그드 유니언으로 변환하는 데 성공했다. C 개발자들은 유니언을 복잡한 데이터 흐름과 함께 사용하기 때문에 효율적이고 정확하게 태그 값의 위치를 찾는 것은 어려운 일이다. 본 연구에서 제안한 분석 기술은 고도화된 분석 기법과 휴리스틱 알고리즘을 효과적으로 결합하여 이러한 어려움을 극복할 수 있음을 보였다. 유니언은 C의 핵심 기능 중 하나로서, 이를 자동으로 번역한 것은 C-러스트 코드 번역의 큰 진전이다. 또한, 프로그램 분석 기법과 휴리스틱 알고리즘을 결합하는 접근 방법이 C의 다른 기능을 번역하는 데도 활발히 응용되어 C-러스트 코드 번역의 적용 범위를 넓힐 것이라 기대한다.

□ 그림 설명

그림 1. 제시한 번역 기법의 전체 과정 도식. C 코드를 문법적 번역기를 사용해 유니언을 사용하는 러스트 코드로 번역한다. 분석 후보 선정, 가리키는 곳 분석, 휴리스틱 알고리즘의 단계를 통해 코드를 분석한다. 분석 결과를 바탕으로 두 가지 변환 전략을 적용하여 유니언을 태그드 유니언으로 변환한다.

그림 2. 유니언을 사용하는 C 코드의 기존 번역 결과와 제안한 기법을 적용한 번역 결과. 기존 번역 결과는 유니언을 태그드 유니언으로 대체하지 않아 메모리 문제를 방지하지 못했다. 반면, 제안한 기법을 적용한 번역 결과는 유니언을 태그드 유니언으로 대체해 메모리 문제를 방지했다.

 


댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글 0
댓글쓰기
계정을 선택하시면 로그인·계정인증을 통해
댓글을 남기실 수 있습니다.
주요기사
이슈포토