MacRuby On Rails: MacRuby에서 본 CRuby

[17S08] MacRuby on Rails (ja)

작성자
RubyKaigi
발행일
2025년 10월 05일

핵심 요약

  • 1 MacRuby는 Ruby 1.9와 Objective-C를 융합하여 macOS 환경에 최적화된 Ruby 구현체로, LLVM 기반 VM, AutoZone GC, Foundation 프레임워크 활용 등의 특징을 가지며 CRuby 1.9와의 100% 호환성을 목표로 합니다.
  • 2 발표자는 MacRuby에서 Rails를 실행하기 위한 여정에서 Rails 설치 및 기본적인 명령은 성공했으나, 예외 처리, 상수 탐색, Class/Module.eval 동작 차이 등 CRuby와의 호환성 문제로 인한 수많은 런타임 버그에 직면했습니다.
  • 3 발표자는 예외 스택 관리 버그(#860), 중첩 상수 탐색 문제, CRuby의 특정 `class_eval` 버그 등을 해결하며 MacRuby의 Rails 동작을 개선했고, 궁극적으로 Rails가 완전히 동작하는 MacRuby 1.0 릴리스를 목표로 하고 있습니다.

도입

본 발표는 네트워크 응용 통신 연구소 소속이자 CRuby(리드라인 모듈 담당) 및 MacRuby 커미터인 타카오 코지(高尾工事)가 'MacRuby on Rails: MacRuby에서 본 CRuby'라는 제목으로 진행합니다. 발표자는 먼저 개인의 행복을 추구하는 회사 철학을 소개하며 발표의 서두를 열었습니다. MacRuby는 Ruby 1.9와 Objective-C를 융합하여 macOS 환경에 최적화된 Ruby 구현체로, CRuby 1.9와의 문법적, 동작적 100% 호환성을 목표로 합니다. 이는 단순히 Ruby를 macOS에서 실행하는 것을 넘어, macOS의 고유한 기능들을 적극적으로 활용하여 Ruby 개발 경험을 확장하는 데 중점을 둡니다.

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 블록 내에서 catchthrow를 함께 사용할 때 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되는 버그 등 아직 해결되지 않은 문제가 남아있습니다.

결론

발표자는 MacRuby에서 Rails를 구동하려는 노력이 상당한 진전을 보였으나, 아직 해결해야 할 과제가 남아있음을 강조했습니다. MacRuby의 메인 개발자인 로렌(Laurent)은 Rails가 완전히 동작하면 MacRuby 1.0을 릴리스할 것이라고 밝히며, 이 프로젝트의 중요성을 시사했습니다. 발표자는 현재 Rails가 완전히 동작하는 상태는 아니지만, 9월 말에 있을 RubyConf에서 Rails가 구동되는 MacRuby를 시연할 것을 약속하며 지속적인 개발 의지를 표명했습니다. 이 프로젝트는 MacRuby의 안정성을 높이고 CRuby와의 호환성을 강화하는 데 중요한 역할을 하고 있습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!