MacRuby의 아키텍처 및 특징
MacRuby는 CRuby와 달리 독자적인 아키텍처를 가집니다. 주요 특징은 다음과 같습니다:
-
LLVM 기반 VM: CRuby의 Ruby VM 대신 LLVM을 사용하여 VM을 구현합니다. 이는 바이트코드 생성 및 컴파일 과정에서 C++와 LLVM에 대한 깊은 이해를 요구합니다.
-
AutoZone GC: CRuby의 내장 GC 대신 macOS의 AutoZone 기능을 활용한 세대별 스레드 GC(Garbage Collector)를 채택합니다.
-
Foundation 프레임워크 활용: 일부 내장 라이브러리를 macOS 10의 핵심 기술인 Foundation 프레임워크를 사용하여 재구현합니다.
-
Cocoa 프레임워크 연동: macOS 개발 시 주로 사용되는 Cocoa 프레임워크를 Ruby 코드에서 직접 호출할 수 있으며, GUI 애플리케이션 개발에 있어서는 거의 완성 단계에 이르렀습니다. 이는 MacRuby의 독자적인 강점 중 하나입니다.
Rails on MacRuby 도전기
발표자는 2011년 3월 중순, MacRuby에서 Rails가 동작할지에 대한 순수한 호기심으로 프로젝트를 시작했습니다. 초기에는 대부분의 기능이 작동하지 않을 것이라 예상했지만, 놀랍게도 macgem install rails 명령을 통해 Rails가 성공적으로 설치되었고, SQLite3-Ruby와 같은 필수 Gem들도 쉽게 설치할 수 있었습니다. rails new를 통한 프로젝트 생성과 generate scaffold 명령까지는 문제없이 실행되었으나, CRuby 대비 현저히 느린 실행 속도(예: 0.x초 vs 15초)를 보였습니다. 그러나 스캐폴드 실행 및 서버(WEBrick) 구동 시 abort 또는 알 수 없는 오류가 발생하며 본격적인 디버깅의 필요성을 느꼈습니다. MacRuby는 개발 단계였기에 디버그용 코드가 많아 조건이 충족되지 않으면 즉시 abort되는 경우가 잦았습니다.
주요 버그 및 해결 과정
Rails 동작을 위해 발표자가 해결해야 했던 주요 버그와 그 과정은 다음과 같습니다:
-
예외 처리 문제 (트랙 #860):
begin-rescue블록 내에서catch와throw를 함께 사용할 때abort되는 문제가 발생했습니다. 이는throw시 예외가 스택에서 잘못 제거되어end블록에서 중복 제거를 시도할 때 발생하는 문제였습니다. 발표자는 예외를 필요한 경우에만 스택에서 제거하도록 코드를 수정하여 해결했습니다. - 상수 탐색 문제:
- 중첩 상수 탐색 실패:
Module A; class B; end와 같은 중첩 상수 정의 시, 당시 MacRuby는Object에서만 상수를 탐색하고Module A의 스코프를 고려하지 않아B를 찾지 못했습니다. 이는ActiveSupport라이브러리에서 광범위하게 사용되므로 Rails 동작에 필수적인 문제였습니다. - 역사적 상수 탐색 (Historical Constant Lookup) 부재:
Module.nesting과 같은 CRuby의 역사적 상수 탐색 기능이 구현되지 않아, 특정 스코프에서 상수를 올바르게 찾지 못하는 문제가 있었습니다. Class.eval/Module.eval동작 차이: 문자열을 전달하는Class.eval과 블록을 전달하는Class.eval의 상수 탐색 스코프가 CRuby와 다르게 작동했습니다. 특히 실행 시점의 스코프와 정의 시점의 스코프 차이가 중요했습니다.
- 중첩 상수 탐색 실패:
- CRuby 버그 발견 및 기여: 특정
class_eval시나리오에서 Ruby 1.9와 1.8.7의 동작이 달랐는데, 발표자가 마츠모토 유키히로에게 문의하여 Ruby 1.9의 버그로 확인되었습니다. 이는 CRuby 1.9.3에서 1.8.7의 동작을 따르도록 수정되는 계기가 되었습니다.
디버깅에 필요한 지식 및 현재 상황
MacRuby 디버깅을 위해서는 CRuby 코드에 대한 깊은 이해(약 90%가 CRuby 코드 베이스 복사본), Objective-C, 그리고 LLVM (C++로 작성된 바이트코드 생성 및 컴파일 로직)에 대한 지식이 필수적이었습니다. 특히 LLVM 관련 정보 부족으로 난이도가 높았다고 언급했습니다. 이러한 노력 끝에 상수 탐색 문제가 해결되면서 Rails 동작이 크게 개선되었으나, ‘Welcome aboard’ 페이지의 링크 클릭 시 abort되는 버그 등 아직 해결되지 않은 문제가 남아있습니다.