Ruby LSP를 통한 DSL 정적 분석: 루비 매직 활용하기

[EN] Embracing Ruby magic: Statically analyzing DSLs / Vinicius Stock @vinistock

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

핵심 요약

  • 1 Ruby LSP는 루비의 동적인 DSL(Domain Specific Language)을 정적으로 분석하기 위한 새로운 API를 도입했습니다.
  • 2 선언형 DSL과 호출 사이트 DSL을 구분하여 각 유형에 맞는 효율적인 분석 방식을 제공합니다.
  • 3 정확성과 성능의 균형을 유지하고, 커뮤니티 애드온을 통해 확장성을 확보하며 루비 개발 경험을 향상시킵니다.

도입

루비의 동적인 특성, 특히 DSL(Domain Specific Language)은 코드 분석에 있어 독특한 도전 과제를 제시합니다. 본 발표는 Ruby LSP(Language Server Protocol)가 이러한 DSL을 어떻게 정적으로 분석하고, 개발자 경험을 향상시키기 위한 새로운 API와 아키텍처를 소개합니다. 정적 분석의 중요성과 DSL의 개념을 명확히 함으로써, 루비 개발 환경의 미래를 조망합니다.

정적 분석은 실제 코드 실행 없이 프로그램의 동작을 예측하는 기술로, LSP 기능(정의로 이동, 호버 정보, 자동 완성)을 가능하게 하며, 사이드 이펙트 방지 및 실행 시간 단축이라는 이점을 제공합니다. DSL은 루비의 동작 방식을 확장하여 특정 도메인에 특화된 문법을 제공합니다. 발표자는 DSL을 크게 두 가지 유형으로 분류합니다. 첫째는 belongs_to와 같이 코드 선언을 변경하는 ‘선언형 DSL(Declaration DSL)’이며, 둘째는 validate처럼 심볼의 의미를 오버로드하여 동적 디스패치를 활용하는 ‘호출 사이트 DSL(Call Site DSL)’입니다.

루비 DSL의 정적 분석은 런타임 값의 영향과 제어 흐름, 그리고 툴링 성능 제약으로 인해 복잡합니다. 동적으로 정의되는 메서드나 조건부 실행은 정적 분석의 정확도를 저해하며, 편집기 환경에서의 실시간 반응성을 유지하기 위해 분석 속도가 중요합니다.

Ruby LSP는 루비 코드를 위한 언어 서버이자 VS Code 확장으로, 정확한 정적 분석과 DSL 이해를 목표로 합니다. 모든 DSL 유형을 직접 처리하는 대신, Add-on API를 통해 각 젬이 자신의 DSL을 Ruby LSP에 가르칠 수 있도록 확장성을 제공합니다. Ruby LSP의 아키텍처는 방문자(Visitor) 패턴과 옵저버(Observer) 패턴을 결합하여, AST(추상 구문 트리)를 한 번만 순회하여 여러 리스너가 동시에 정보를 수집할 수 있도록 최적화되어 있습니다.

Add-on API는 Indexing Enhancements를 통해 선언형 DSL을 처리합니다. 이 API는 add_method, add_module, add_class와 같은 메서드를 사용하여 동적으로 정의된 선언을 LSP에 알립니다. 예를 들어, belongs_to 호출 시 동적으로 생성되는 reader/writer 메서드를 인식하게 함으로써 정확한 코드 탐색을 가능하게 합니다.

호출 사이트 DSL은 Go to Definition과 같은 개별 기능별로 확장됩니다. Add-on은 팩토리 메서드를 통해 새로운 리스너를 생성하고, node_context를 활용하여 심볼 노드가 validate와 같은 특정 메서드 호출에 사용되었는지 확인한 후, 인덱스를 통해 해당 심볼이 가리키는 실제 메서드 선언을 찾아 편집기에 제공합니다.

Add-on API는 커뮤니티로부터 큰 관심을 받았으며, 다양한 DSL에 대한 지원이 확장되고 있습니다. 또한, Ruby LSP는 LLM(Large Language Model) 및 AI 도구에 코드베이스 정보를 노출하는 MCP 서버 프로토타입과 같은 새로운 통합을 모색하고 있습니다.

결론

루비의 점진적 타이핑 시스템은 정확성과 유용성, 그리고 성능 사이의 균형을 찾는 것이 중요합니다. Ruby LSP는 동적인 루비의 특성을 고려하면서도 개발자에게 유용한 도구를 제공하기 위해 노력하고 있습니다. DSL 분석을 위한 혁신적인 접근 방식과 애드온을 통한 확장성은 루비 개발 경험을 지속적으로 향상시킬 것입니다. 향후 타입 어노테이션의 혁신을 통해 루비의 동적인 특성을 더욱 효과적으로 처리할 수 있을 것으로 기대됩니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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