정적 분석은 실제 코드 실행 없이 프로그램의 동작을 예측하는 기술로, 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 서버 프로토타입과 같은 새로운 통합을 모색하고 있습니다.