본 발표는 마이크로컨트롤러 환경에서 Ruby 언어를 활용하려는 시도인 MicroRuby와 PicoRuby 프로젝트를 소개하며 시작됩니다. 임베디드 시스템 개발 지식 없이도 마이크로컨트롤러 프로그래밍을 쉽게 시작할 수 있는 MicroPython과 같은 에코시스템을 Ruby에서도 구축하고자 하는 목표를 공유합니다. 발표자는 mruby의 창시자가 마이크로컨트롤러 개발에 직접 참여하지 않아 생긴 기회를 포착하여, mruby를 마이크로컨트롤러에 최적화하는 연구를 진행했음을 밝힙니다. 이번 발표의 핵심은 PicoRuby (PicoRuby 컴파일러 + mrb/c VM)와 MicroRuby (PicoRuby 컴파일러 + mruby VM) 간의 메모리 효율성 비교와, mruby의 잠재적 우수성을 입증하는 데 있습니다.
발표는 먼저 Ruby가 마이크로컨트롤러에서 메모리를 소비하는 주요 요인들, 즉 C 함수 스택/힙, Ruby 객체 및 데이터, 콜 스택, IRep (가상 머신 코드), 그리고 심볼 테이블을 설명합니다. 특히, mruby 3.0에 도입된 presym
기능과 Object Space
의 중요성을 강조합니다. presym
은 VM 코드와 심볼 테이블을 ROM에 미리 배치하여 RAM 사용량을 줄이는 빌드상의 혁신적인 기법이며, Object Space
는 Ruby 객체를 효율적으로 할당하고 관리하여 메모리 파편화를 줄이는 역할을 합니다.
이러한 mruby의 특성들을 바탕으로 발표자는 이른바 ‘乾杯 예측(Kanpai Prediction)’을 제시합니다. 이는 작은 애플리케이션(예: Hello World)에서는 mrb/c가 메모리 효율성에서 우위를 보이지만, 대규모 애플리케이션(많은 젬 로드, 많은 객체 생성)에서는 presym
과 Object Space
덕분에 mruby가 mrb/c보다 더 효율적이거나 최소한 그 격차가 크게 줄어들 것이라는 가설입니다. 이 가설을 검증하기 위해, 기존 PicoRuby용으로 개발된 대규모 IoT 애플리케이션인 R2P2를 MicroRuby 환경으로 포팅하는 작업을 진행했습니다.
구현 과정에서는 mruby에 부족했던 선점형 태스크 스케줄링(preemptive task scheduling) 기능을 mrb_context
구조체를 활용하여 성공적으로 구현했습니다. 이는 R2P2와 같은 복잡한 애플리케이션이 마이크로컨트롤러에서 여러 작업을 병렬로 처리할 수 있도록 하는 핵심적인 요소입니다. 또한, 정확한 메모리 사용량 측정을 위해 표준 라이브러리 할당자가 제공하지 않는 기능을 보완하고자 estr_alloc
이라는 자체 메모리 할당자를 개발했습니다.
실제 측정 결과, R2P2를 MicroRuby에서 구동했을 때 약 109KB의 RAM을 사용했으며, 이는 PicoRuby가 동일한 기능을 위해 젬을 로드했을 때의 78KB와 비교했을 때 약 30% 정도의 차이로, 초기 예상보다 훨씬 줄어든 수치임을 확인했습니다. 이 결과는 ‘乾杯 예측’이 실제 애플리케이션 환경에서 유효할 수 있음을 뒷받침합니다. 특히, Wi-Fi 및 BLE 모듈이 탑재된 Raspberry Pi Pico W(520KB RAM)에서는 MicroRuby가 충분히 실용적인 범위 내에서 동작함을 시연했습니다. 발표자는 이 연구를 통해 mruby의 풀스펙 언어 기능이 마이크로컨트롤러에서도 쉽게 활용될 수 있는 토대가 마련되었음을 강조합니다.
결론적으로, 본 연구는 MicroRuby를 통해 마이크로컨트롤러 환경에서 Ruby 언어의 실용성과 효율성을 크게 향상시켰습니다. 특히, `presym`과 `Object Space` 같은 mruby의 독특한 메모리 관리 기법들이 대규모 임베디드 애플리케이션 개발에 있어 중요한 이점을 제공할 수 있음을 실험적으로 입증했습니다. 선점형 태스크 스케줄링의 구현과 맞춤형 메모리 할당자 개발은 MicroRuby의 안정성과 측정 가능성을 높여, 개발자들이 마이크로컨트롤러에서 더욱 풍부한 Ruby 기반 애플리케이션을 구축할 수 있는 기반을 마련했습니다. 비록 아직 해결해야 할 버그가 남아있지만, 이번 연구는 마이크로컨트롤러 생태계에서 Ruby의 역할과 가능성을 확장하는 중요한 진전으로 평가됩니다.