Ruby 파서 문법 개선: Racc(라마)의 도입과 역할

Yudai Takada, "How does Lrama make the Ruby parser grammar G.O.A.T.?"

작성자
EuRuKo
발행일
2025년 01월 13일

핵심 요약

  • 1 Ruby 3.3부터 Bison 대신 자체 파서 생성기 Racc(라마)를 도입하여 문법 유지보수성과 확장성을 크게 개선했습니다.
  • 2 Racc는 기존 Bison의 숫자 참조 방식의 가독성 문제를 명명된 참조로 해결하고, 문법 규칙의 추상화를 위한 매개변수화된 규칙을 제공합니다.
  • 3 Ruby의 파싱 과정은 렉서, 파서, 컴파일러로 구성되며, Racc는 이 중 파서를 생성하여 코드의 추상 구문 트리 생성을 담당합니다.

도입

본 발표는 Ruby 3.3 버전부터 공식적으로 채택된 새로운 파서 생성기 Racc(라마)의 도입 배경과 그 역할에 대해 다룹니다. 기존에는 Bison이라는 범용 파서 생성기를 사용했으나, Ruby의 특정 요구사항을 충족하고 문법의 유지보수성을 향상시키기 위해 Racc로의 전환이 이루어졌습니다. Racc는 Ruby 언어의 파싱 과정을 더욱 효율적이고 유연하게 만드는 핵심적인 도구로 자리매김하고 있습니다.

Racc는 Ruby 언어의 문법을 정의하고 해석하는 데 사용되는 파서 생성기입니다. Ruby가 Racc를 도입하게 된 주요 원인은 크게 두 가지입니다. 첫째, Bison은 Ruby 개발 환경에 설치된 버전을 사용하기 때문에, 새로운 Bison 기능이 Ruby에 즉시 적용되기 어려웠습니다. 둘째, Bison은 PHP, Perl, MySQL 등 다양한 프로젝트에서 사용되므로, Ruby만을 위한 기능 확장이 어렵고 변경에 많은 논의가 필요했습니다. 이러한 한계점을 극복하고 Ruby 문법의 발전을 가속화하기 위해 Racc가 개발되었습니다.

Racc는 다음과 같은 방식으로 Ruby 파서 문법의 유지보수성을 개선했습니다.

1. 숫자 매개변수 참조의 어려움 해결 (Named References)

기존 Bison 기반의 parse.y 파일에서는 파싱 규칙 내에서 특정 컴포넌트의 의미론적 값에 접근할 때 $1, $2와 같은 숫자 참조를 사용했습니다. 이는 규칙이 복잡해질수록 어떤 숫자가 어떤 의미를 가지는지 파악하기 매우 어렵게 만들었습니다.

  • 문제점: parse.y 파일 내에서 $N 형태의 숫자 참조는 가독성을 저해하고 유지보수를 어렵게 함.
  • 해결책: Racc는 명명된 참조(Named References) 기능을 도입하여 $ 뒤에 심볼 이름을 사용하여 참조할 수 있도록 했습니다. 또한, [alias]를 통해 별칭을 부여하는 것도 가능해져 코드의 의미를 명확히 했습니다.

2. 문법 추상화 부재 문제 해결 (Parameterizing Rules)

Bison은 코드 재사용을 위한 추상화 메커니즘이 부족하여, 유사한 문법 구조가 여러 곳에서 반복될 경우 코드가 중복되는 문제가 있었습니다. 이는 특히 키워드 인자(keyword arguments)와 같은 복잡한 구조에서 두드러졌습니다.

  • 문제점: Bison에는 Ruby의 메서드나 모듈처럼 문법 규칙을 추상화하고 재사용할 수 있는 기능이 없어 중복 코드가 발생.
  • 해결책: Racc는 매개변수화된 규칙(Parameterizing Rules)을 도입하여 비-터미널 심볼을 매개변수화할 수 있도록 했습니다. 이를 통해 공통된 구조와 동작을 가진 규칙을 일반화하고 재사용할 수 있게 되어 문법 정의의 간결성과 모듈성을 크게 향상시켰습니다.
  • 표준 라이브러리: Racc는 option, list, nod_list와 같은 일반적인 구조를 위한 표준 라이브러리 규칙을 제공하여, 더욱 간편하게 문법을 정의할 수 있도록 지원합니다.

이러한 개선 사항들을 통해 Racc는 Ruby의 파서 문법을 더욱 강력하고 풍부하게 만들었으며, 개발자들이 Ruby의 문법을 이해하고 확장하는 데 있어 큰 편의성을 제공하게 되었습니다.

결론

결론적으로, Racc의 도입은 Ruby `parse.y` 파일의 유지보수성 문제를 해결하고 문법 정의의 추상화 수준을 높이는 데 결정적인 기여를 했습니다. 명명된 참조와 매개변수화된 규칙은 복잡한 문법 구조를 더욱 명확하고 효율적으로 관리할 수 있게 하였으며, 이는 Ruby 언어의 지속적인 발전과 새로운 기능 추가를 위한 견고한 기반을 마련했습니다. Ruby 문법은 끊임없이 진화하고 있으며, Racc 프로젝트는 이러한 변화를 수용하고 미래의 Ruby를 위한 강력한 파싱 기능을 제공하기 위해 지속적으로 개선될 것입니다. Racc 프로젝트는 GitHub에서 피드백과 기여를 환영하며, 함께 Ruby의 미래를 만들어갈 것을 독려합니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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