인자 전달 작업은 호출 시 사용되는 기능과 호출되는 엔티티에 따라 복잡성이 달라집니다. splat
(*args
), 키워드 splat
, 블록 인자(&block
)와 같은 데이터 가변 기능들은 실제 인자에 따라 다르게 작동하며, 때로는 변환 프로토콜과 추가 메서드 호출을 수반합니다. 특히 루비 2 키워드 검사는 사용 여부와 무관하게 성능 비용을 발생시킬 수 있어, JIT 컴파일러 같은 최적화의 필요성을 부각합니다.
발표자는 호출을 여러 범주로 분류합니다. 첫째, ‘인자 전달에 작업이 필요 없는’ 경우는 인자가 스택에 이미 정렬된 가장 효율적인 상황입니다. 둘째, ‘데이터 이동이 필요한’ 경우는 인자가 이동되거나 폐기되어 스택 크기가 변하는 경우입니다. 셋째, 블록 인자(&
약어)와 리파인먼트의 처리는 to_proc
호출 이상의 복잡한 의미론을 가지며, 어휘적 스코프와 상호작용하며 예상치 못한 동작을 유발할 수 있습니다. 넷째, ‘변환 절차’는 특정 유형을 기대하는 인자가 다를 경우 변환 메서드를 호출하는 과정을 설명하며, nil
처리나 변환 실패 시의 특수한 동작(특히 배열 splat
)이 복잡성을 더합니다. 마지막으로 ‘숨겨진 데이터’는 옵션 키워드 매개변수나 forwardable
매개변수처럼 루비가 내부적으로 전달하는 데이터로, 이는 캐싱을 어렵게 만듭니다. ‘메모리 할당’은 rest
매개변수처럼 객체 수명이 즉각적인 호출을 넘어설 때 필수적이며, 이를 피하기 위한 고급 분석은 런타임 구현의 복잡성을 동반합니다. 이러한 분류 작업 과정에서 발표자는 루비에서 두 가지 크래시를 발견했다고 밝히며, 심층적인 의미론 분석의 중요성을 강조합니다.