Will Rust Unlock New Possibilities for Software-Defined Vehicles?
자동차에서 Rust, SDV에 새로운 가능성 열 것인가?
2025년 09월호 지면기사  / 

글 | Dipl.-Ing 요나스 볼프(Jonas Wolf), Vector Informatik GmbH, 루카스 비르트(Lukas Wirth), Ferrous Systems GmbH




SDV(Software-Defined Vehicle)를 개발하려면 차량의 전장(E/E) 아키텍처를 총체적으로 전환해야 한다. 따라서 소프트웨어 개발에 새로운 사고방식으로 접근할 필요가 있다. 이를 위해 비용 효율적이면서도 높은 품질로 실현하는 방법을 알아본다.


글 | Dipl.-Ing. 요나스 볼프(Jonas Wolf), Vector Informatik GmbH 
2012년부터 Vector Informatik GmbH에서 다양한 안전 관련 업무를 담당하고 있다. Safety-Critical Rust Consortium의 일원이자 SAE JA-1020의 작성에 이바지했다. 여가 시간에도 Rust로 프로그래밍하는 것을 좋아한다.

루카스 비르트(Lukas Wirth), Ferrous Systems GmbH
2025년까지 Ferrous Systems GmbH에서 소프트웨어 엔지니어로 근무했다. Rust 프로젝트 Rust Analyzer 팀의 오랜 일원이자 Safety-Critical Rust Consortium의 코딩 지침 소위원회 소속이며, Ferrocene 언어 사양의 공동 저자이기도 하다.

출처 | Elektronik Praxis 10호(2025)










현재 임베디드 시스템용 소프트웨어 개발 분야, 그중에서도 특히 자동차 산업에 가장 널리 사용되는 프로그래밍 언어는 C 언어다.
그렇기에 새로운 하드웨어 플랫폼에서 가장 먼저 이용할 수 있는 컴파일러는 C 컴파일러인 경우가 대부분이다.



비용 효율 높은 SDV용 소프트웨어 개발 

현재 자동차 분야에 가장 널리 사용되는 하드웨어 플랫폼용 컴파일러가 있기에 앞으로 SDV에 대안 프로그래밍 언어인 Rust를 사용할 가능성이 열렸다. 
Rust는 C나 C++와는 달리 비교적 최근에 개발된 프로그래밍 언어다. 그러나 Rust에는 고품질 소프트웨어 개발 시 이목을 끄는 몇 가지 차별점이 있다. 예를 들어, 범위 밖(out-of-bound) 접근과 경쟁 상태(race condition)는 소프트웨어 개발 시 테스트하기 가장 까다롭기로 소문난 시나리오다. 그런데 Rust 컴파일러는 이런 시나리오를 컴파일 타임에 방지할 수 있다[1]. Rust는 대규모 커뮤니티가 이끄는 프로그래밍 언어이며 구문은 C, C++, Java에 기반한다. 또한 안전성을 유지하면서도 빠른 실행 속도를 확보하는 것이 이 프로그래밍 언어가 선언한 목표다. Rust로 작성한 소프트웨어의 성능은 C나 C++로 작성한 프로그램에 버금간다[2].
수십 년간 C, C++를 다루며 쌓은 경험과 Rust를 사용하면서 느낀 초기 소견을 바탕으로 그 가능성을 가늠해 볼 수 있다. 효율성 향상은 직접적인 개발 비용과 소프트웨어 유지관리, 지원, 확장에 드는 비용으로 나눠서 분석할 수 있다. 그림 1은 C나 C++로 소프트웨어를 개발할 때 각 프로세스 단계에 드는 현재 비용과 예상 비용을 Rust로 개발할 때 비용과 비교해 보여준다. 완성도를 높이기 위해 프로그래밍 언어와 별개로 작업에 수반되는 노력을 함께 제시했다. 




그림 1 | C/C++를 사용할 때와 Rust를 사용할 때 드는 노력의 상대적 분포



효율성이 가장 크게 향상될 것으로 기대되는 분야는 구현, 테스트, 검토 분야다.

구현: Rust는 코드의 재사용을 장려한다. C 언어를 사용한다면 타입별로 별도의 큐(queue)를 구현해야 할 수 있다. 하지만 강력한 타이핑, 타입-제네릭(type-generic) 파라미터, 매우 뛰어난 런타임 성능을 갖춘 Rust를 사용하는 경우 단 한 번만 구현하면 된다. 이후 컴파일러가 다양한 유스케이스(Use Case)에 맞는 코드를 생성한다.
테스트: C/C++ 환경에서 Vector 등의 소프트웨어 제공업체가 수행하는 범위 밖 접근 분석과 같은 전문 분석은 향후 불필요할 것으로 보인다. 프로그래밍 언어 Rust에 이런 안전성이 내재돼 있기 때문이다. 정적 코드를 분석하는 경우, C나 C++는 추가적인 툴을 장시간 실행해야 하는 반면, Rust는 컴파일러와 함께 표준 설치에 포함되는 툴을 실행하면 된다.
검토: Rust는 기능적 정확성과 같은 핵심적인 측면에 중점을 둔다. 포매팅, 명명 규칙, 시간 경과와 같은 형식적인 문제는 대부분 언어 자체에서 처리하거나 Rust 생태계 내의 툴이 자동으로 처리한다.

Rust에는 관련 프레임워크가 이미 통합되어 있으므로 테스트에 드는 노력이 절감된다.
개발 과정에서도 오류 밀도가 줄어들기에 소프트웨어의 유지보수 작업에 드는 노력이 대폭 줄어들 것으로 예상된다. 그림 2는 소프트웨어의 전체 수명 주기 동안 20% 향상된 효율성 수치를 보여준다. 이런 수치는 Google의 Rust 사용 경험과 일치한다[3].




그림 2 | Rust를 사용할 때와 사용하지 않을 때 일반적으로 개발에 드는 노력



Rust 생태계 - 개요            

소프트웨어 개발의 효율성을 높이는 요인 외에도 Rust 생태계 또한 중요한 역할을 한다. 
모든 프로그래밍 언어의 핵심은 컴파일러와 관련 표준 라이브러리다. Rust용 컴파일러는 설치가 간편하며[4] 다양한 플랫폼을 지원한다. Rust 컴파일러의 기반(컴파일러 백엔드)은 LLVM 프레임워크이며, Clang 컴파일러도 이 프레임워크를 기반으로 한다. 그 결과 Rust는 링크 타임 최적화 등 해당 분야에서 이용가능한 생산 성숙기 및 최적화의 이점을 직접적으로 누릴 수 있다.
Rust가 자동차 산업 시장에서 성공을 거두려면 널리 사용되는 Infineon의 TriCore 아키텍처를 위한 검증된 컴파일러를 이용할 수 있어야만 한다. ARM 아키텍처를 사용하는 프로세서를 위한 Ferrocene 등 검증된 컴파일러가 존재한다. GCC용 Rust 컴파일러 프론트엔드 포팅이 진행 중이지만, 현재 주요 개발 단계에서 다소 뒤처지고 있다.
C 및 C++와 같이 임베디드 시스템에 널리 사용되는 언어의 단점 중 하나는 표준화된 패키지 관리 시스템이 없다는 점이다. 또한 소프트웨어 조립에 사용가능한 툴이 굉장히 많다. 이런 맥락에서, Rust는 처음부터 Cargo라는 매우 편리한 시스템을 제공한다. Cargo를 사용하면 의존성을 관리할 수 있으며, 복잡한 컴파일러 호출을 사용자에게서 숨길 수 있다. Cargo가 관리하고 빌드할 수 있는 단위, 즉 라이브러리 또는 프로그램을 “크레이트(crate)”라고 한다.
Rust는 기능성이 우수하며 광범위한 표준 라이브러리를 갖추고 있어 폭넓은 요구사항을 충족한다. 해당 라이브러리에서 다루지 않는 영역을 위한 기타 성숙도 높은 라이브러리도 존재한다. 운영체제가 없는 임베디드 시스템을 프로그래밍하는 경우 필요한 함수 범위가 줄어들지만, Rust가 원칙적으로 제공하는 보증은 여전히 유효하다. 현재 다양한 주체가 안전 관련 프로젝트에 사용될 첫 번째 부분의 검증을 진행하고 있다.
Rust에는 작성된 소프트웨어를 위한 테스트 프레임워크가 이미 통합돼 있다. 따라서 의존성을 따로 고려하지 않아도 돼 테스트 작성 작업이 눈에 띄게 간편해진다. 이는 서로 다른 라이브러리(크레이트) 간 테스트 절차 표준화로도 이어져 이미 충분한 테스트를 거친 코드 재사용성을 높인다.
오늘날 C 및 C++에 기반한 수많은 유무료 툴이 사용되는 분야에서, Rust의 clippy는 정적 코드 분석이라는 중요 작업을 눈에 띄지 않게, 그러나 다른 툴만큼 강력하게 수행한다. clippy 규칙 집합은 지속적으로 확장되고 있으며 개발자에게 나쁜 코드에 대한 힌트를 주는 것은 물론 어떻게 개선하면 좋을지도 알려준다.
C++에 익숙한 사람이라면 누구나 표준 C++ 라이브러리 및 매우 중요한 라이브러리(Google Test, Boost)조차도 각각 전혀 다른 명명 규칙과 포매팅 규칙으로 구현돼 있음을 알 수 있다. Rust는 rustfmt(표준 설치에 포함) 덕에 전체 Rust 생태계의 코드 포매팅을 통일할 수 있어 차별화된다. rust-analyzer는 입력 시 명명 규칙을 위반하는 이름을 곧바로 감지한다.



코드 커버리지 - 가장 큰 격차

테스트 품질의 중요 지표 중 하나는 테스트 커버리지다. 소프트웨어의 경우 코드 커버리지를 매우 흔하게 활용한다. 주요 자동차 제조업체의 품질 요구사항 및 중요 애플리케이션에 적용되는 몇몇 표준은 달성해야 할 테스트 커버리지 요건을 엄격히 규정하고 있다.
지금까지 Rust에서는 LLVM 컴파일러 프레임워크에 내장된 코드 커버리지 인스트루먼테이션인 llvm-cov를 사용해 소위 구문 커버리지만을 측정할 수 있었다. 그러나 연구 결과에 따르면 이는 테스트 깊이가 충분한지 나타내는 지표로는 부족하다[5]. MC/DC와 같은 더욱 엄격한 커버리지 메트릭을 충족하려면 기본 LLVM 컴파일러 프레임워크도 변경해야 한다. 이런 확장 기능의 구현은 이미 시작됐다[6].
그러나 항공 산업 분야의 정의를 Rust에 그대로 적용할 수는 없다. 예를 들어 소위 결합자(combinator)라고 불리는 and_then, or_else 등에 대한 솔루션을 여전히 찾아야 하는데, 해당 부분에서는 인스트루먼테이션의 제어 흐름이 보이지 않기 때문이다. 이런 결합자는 관용적으로 사용되는 경우가 잦다. Rust에는 C++에서와 같은 매크로가 없지만, 그럼에도 필수적인 소위 선언적 매크로와 절차적 매크로를 제공한다. 이를 활용해 추상 구문 트리를 변경하고 확장할 수 있다. 다만, 이 경우 코드 커버리지도 반드시 측정해야 한다.
프로그램 성능 분석을 위한 디버거와 프로파일러는 대개 어떤 프로그래밍 언어가 사용되었는지와는 별개다. 따라서 성숙도가 높은 툴이 이미 다양하게 나와 있다. 많은 경우, 임베디드 시스템 개발에 필요한 하드웨어 프로브와 관련 소프트웨어도 Rust의 사용으로 인한 혁신을 뒷받침한다.
소프트웨어의 복잡성을 측정하는 코드 메트릭은 아직 Rust 생태계에서 확립되지 않았다. 코드 크기를 측정하는 tokei나 rust-code-analysis와 같은 툴이 존재한다. 하지만 아직 기존 임베디드 프로그래밍에서 일반적으로 사용되는 수준에는 미치지 못한다.



곧 발표 예정된 코딩 지침   

C 및 C++ 환경의 경우, MISRA는 중요한 프로젝트에 사용할 수 있는 각 프로그래밍 언어의 하위 집합을 정의하는 합리적 규칙 집합의 대표적인 예로 자리매김하고 있다. Rust의 경우는 공인된 지침은 없지만, 곧 발표될 예정이다. SAE의 JA-1020 표준[7]은 이 여정의 첫걸음이 될 것이다. 한편, Rust Foundation의 주관으로 더욱 개방적인 프로세스로 추가 지침을 마련할 Safety-Critical Rust Consortium[8]이 결성됐다. 
Rust를 사용하는 것만으로도 일부 규칙[9]이 불필요해지므로, Rust는 C, C++에 비해 상당한 이점을 지닌다. SDV에 최적인 프로그래밍 언어가 Rust라고 주장하는 목소리가 높다. Rust의 결정적인 이점은 더 견고한 소프트웨어를 만드는 데 그치지 않고, 전체 소프트웨어 개발 프로세스의 효율성을 높인다는 점에 있다. 현재 Rust 생태계에는 여전히 격차가 존재하지만(표) 조만간 해결될 것으로 보인다.
이런 문제가 해결된다면 Rust는 자동차 부문에서 확고한 입지를 다질 잠재력이 있다. 더욱 견고한 코드를 빌드하는 것은 물론, 예상되는 비용 효율성 또한 우수하기 때문이다.



표 | 해당 툴의 성숙도를 포함한 Rust 생태계 개요


 



참고문헌 
[1] Rust’s Memory Safety Guarantees: How the Compiler Protects Your Code, https://ataiva.com/rust-memory-safety/
[2] The Computer Language Benchmarks Game, https://benchmarksgame-team.pages.debian.net/benchmarksgame/ fastest/rust.html
[3] Rust developers at Google are twice as productive as C++ teams, https://www.theregister.com/2024/03/31/rust_ google_c/
[4] rustup, https://rustup.rs/
[5] Evaluation and improvement of automated software test suites, http://dx.doi.org/10.18419/opus-10640
[6] Towards Modified Condition/Decision Coverage of Rust. https://arxiv.org/abs/2409.08708
[7] [WIP] Recommendations for the Rust Programming Language in Safety-Related Systems JA1020, https://www.sae. org/standards/content/ja1020/
[8] Safety-Critical Rust Consortium, https://rustfoundation.org/safety-critical-rust-consortium/
[9] MISRA C:2025 Addendum 6 - Applicability of MISRA C:2025 to the Rust Programming Language, https://misra.org.uk/ app/uploads/2025/03/MISRA-C-2025-ADD6.pdf
 

연관기사:   유럽의 전통이 소프트웨어를 만날 때



<저작권자 © AEM. 무단전재 및 재배포, AI학습 이용 금지>


  • 100자평 쓰기
  • 로그인


  • 세미나/교육/전시

TOP