Sharon Rosner, Ruby AST 매크로 도구 Steadfast 개발 계획 공개
독립 소프트웨어 개발자 Sharon Rosner가 `quote`와 `unquote`로 Ruby AST를 조립하는 매크로 도구 Steadfast의 개발 계획을 공개했습니다. Ruby Association 지원 과제로, Prism AST를 만들고 변환하는 도구를 개발해 ERB·ActiveRecord·Roda에서의 활용 가능성을 살필 예정입니다. Rosner는 2027년 3월 말 완성을 목표로 제시했습니다.
독립 소프트웨어 개발자 Sharon Rosner가 Ruby용 매크로 도구 Steadfast의 개발 계획을 공개했습니다. Ruby Association 지원 과제로 선정된 이 작업은 quote와 unquote를 이용해 Ruby 코드를 Prism AST로 만들고 변환하는 도구를 개발하는 것이 핵심입니다. Rosner는 AST 생성·조작과 AST를 Ruby 소스로 바꾸는 기능을 만들고, ERB·ActiveRecord·Roda 등에서 활용할 수 있는지 살피겠다고 밝혔습니다.
Ruby에서는 실행 중 코드를 만들 때 Ruby 소스가 든 문자열을 구성해 eval로 실행하는 메타프로그래밍이 흔히 쓰입니다. Rosner는 ERB가 템플릿을 최적화된 Ruby 코드로 컴파일해 eval에 넘기고, Rails도 연관 관계나 스캐폴딩 같은 기능에 유사한 기법을 쓴다고 설명합니다. 이런 방식은 DSL을 실행할 때 드는 성능 부담을 줄이는 데 쓰이지만, 동적으로 소스 문자열을 구성하는 작업은 오류를 일으키기 쉽고 코드 삽입 취약점으로 이어질 가능성도 있습니다.
Rosner가 만든 Papercraft는 HTML을 작성하는 Ruby DSL입니다. header { p { strong(repo_name) } } 같은 코드를 전통적인 빌더 방식으로 처리하면 실행 중 태그를 하나씩 구성합니다. Rosner는 이 과정의 성능 부담을 줄이려고 컴파일러를 만들었습니다. 컴파일러는 태그처럼 고정된 부분을 문자열 버퍼에 쓰는 코드로 바꾸고, repo_name 같은 동적 값은 HTML 이스케이프를 거쳐 버퍼에 추가합니다. Rosner는 이 결과가 ERB 템플릿과 비슷한 성능을 냈다고 설명합니다. 다만 최적화된 코드를 여러 조각으로 동적으로 만들고 조립해야 해 컴파일러 자체가 복잡해졌다고 덧붙였습니다.
Steadfast가 다루려는 quote·unquote 방식은 생성할 코드를 문자열 대신 AST로 표현합니다. AST는 호출·조건·블록 같은 구문을 노드로 나타낸 구조입니다. quote는 Ruby 블록을 AST로 만들고, unquote는 인용된 코드 바깥에서 계산한 값이나 다른 AST 조각을 그 구조에 삽입합니다. 코드 조각을 구문 구조로 조립하면 문자열 안에 Ruby 코드를 다시 넣고 따옴표나 보간을 맞추는 과정을 줄일 수 있습니다.
Rosner는 검증기 생성 예시로 코드 생성 방식을 설명합니다. 기본 구현은 값과 조건 목록을 받아 각 조건에 ===를 적용하고, 조건이 맞지 않으면 예외를 발생시킨 뒤 값을 반환합니다. 문자열 생성 방식은 반복문을 펼쳐 조건마다 raise unless ... 검사문을 만들고, 이를 람다에 넣어 eval에 전달합니다. 이어지는 quote/unquote 예시는 조건마다 === v 비교식 AST를 만들어 람다 본문에 삽입한 뒤, AST를 Ruby 소스로 바꿔 eval에 넘깁니다. 공개된 quote/unquote 코드에서 조건이 삽입되는 형태는 비교식이며, 실패 시 raise하는 문장은 앞선 문자열 생성 예시에 제시돼 있습니다.
공개 저장소의 설계 스케치는 이 방식을 Papercraft 컴파일러에 적용하는 구상을 보여줍니다. 템플릿 블록에서 Prism AST를 얻고 노드를 순회하면서 HTML 태그 호출을 버퍼에 문자열을 추가하는 코드로 바꿉니다. if와 else 같은 구문은 변환된 AST로 유지해 템플릿의 조건 분기를 살립니다. 완성한 AST는 람다 형태의 Ruby 소스로 출력한 뒤 실행하는 흐름입니다. Rosner는 Steadfast를 Prism AST를 소스 코드로 바꾸는 Sirop의 후속 작업으로 소개했으며, Sirop은 현재 Papercraft 컴파일러에서 사용한다고 밝혔습니다. 이 컴파일러 흐름은 저장소에 공개된 설계 스케치의 활용 구상입니다.
과제에서는 quote/unquote 도구와 Prism AST 생성·조작 및 소스 변환 기능을 개발하고, ERB·ActiveRecord·Roda에서의 활용 가능성과 Ruby 런타임 통합, 기법의 한계도 살필 계획입니다. Rosner는 2027년 3월 말까지 프로젝트를 마치는 것을 목표로 제시했습니다. Ruby Association은 선정 과제의 성과를 2027년 4월 무렵 공개하겠다고 안내했습니다. Steadfast 저장소는 공개돼 있으며, 현재 GitHub의 Releases 영역에는 배포 항목이 없습니다.