본문으로 건너뛰기

128개 프로그래밍 언어를 순환하는 콰인 릴레이: Quine Relay

A Ruby program that generates a Rust program that generates a Scala program...

github.com

핵심 요약

  1. Ruby로 시작해 Rust, Scala 등 128개 언어를 거쳐 다시 원래의 Ruby 코드로 돌아오는 거대한 순환형 콰인 프로그램이다.
  2. Ubuntu 25.10 환경에서 수많은 컴파일러와 인터프리터를 설치하거나 Docker를 사용하여 전체 실행 과정을 재현할 수 있다.
  3. 50개 언어로 시작하여 현재 128개 언어까지 확장되었으며, 각 언어의 빌드 및 실행 명령어가 체인 형태로 정교하게 연결되어 있다.

도입

Quine Relay는 Yusuke Endoh가 개발한 프로젝트로, 한 언어의 출력이 다음 언어의 소스 코드가 되는 과정을 반복하여 최종적으로 최초의 소스 코드를 생성하는 콰인(Quine)의 확장판이다. 현재 Ruby를 기점으로 총 128개의 프로그래밍 언어를 지원하며, 각 언어의 문법과 컴파일러 특성을 활용해 거대한 순환 고리를 형성한다. 이는 단순한 코드 생성을 넘어 각 언어 환경의 상호 운용성을 극단적으로 보여주는 기술적 예술 작품이다.

상세 요약

128개 언어의 순환 구조와 원리

Quine Relay는 QR.rb라는 Ruby 프로그램에서 시작한다. 이 프로그램은 Rust 코드를 출력하고, Rust 코드는 Scala 코드를 출력하는 방식으로 이어진다. 이 과정은 총 128개의 언어를 거치며, 마지막 언어인 REXX가 다시 처음의 QR.rb와 동일한 코드를 생성함으로써 순환을 완성한다. 이는 프로그래밍 언어 자체가 데이터이자 실행 주체가 되는 콰인의 원리를 다중 언어 환경으로 확장한 것이다. 각 단계의 프로그램은 다음 언어의 유효한 소스 코드를 생성해야 하므로, 128개 언어의 문법을 모두 충족하는 정교한 설계가 반영되어 있다.

실행 환경 구축 및 의존성 관리

이 프로젝트를 실행하기 위해서는 100개가 넘는 언어의 컴파일러와 인터프리터가 필요하다. Ubuntu 25.10(Questing Quokka) 기준으로 apt-get을 통해 수많은 패키지를 설치해야 하며, 일부 패키지가 없는 언어들은 프로젝트 내 vendor/ 디렉토리에 포함된 자체 구현체를 빌드하여 사용한다. Ruby를 활용한 향상된 명령줄 구성 가능성에서 다루는 쉘 활용 능력처럼, 이 프로젝트 역시 수많은 명령줄 도구를 체인 형태로 연결하여 동작한다.

  • Ubuntu 직접 설치: 제공된 긴 apt-get install 명령어를 통해 모든 의존성을 해결한 후, make -C vendor로 번들 인터프리터를 빌드한다. 실행 전 ulimit -s unlimited 설정을 통해 스택 크기 제한을 해제해야 하는 경우도 있다.
  • Docker 사용: 복잡한 설치 과정을 피하기 위해 Docker 이미지 빌드를 지원한다. docker build -t qr . 명령어로 이미지를 생성하고, maxima 등 특정 명령어 실행을 위해 --privileged 모드로 컨테이너를 실행해야 한다.

실행 프로세스 및 검증

전체 실행 과정은 각 언어의 소스 코드를 생성하고 이를 해당 컴파일러로 실행하여 다음 단계의 소스를 만드는 파이프라인으로 구성된다. 예를 들어 Ruby에서 시작하여 Rust, Scala, Scheme, Scilab, sed 등을 거치는 과정은 다음과 같은 명령어로 이어진다.

  1. ruby QR.rb > QR.rs (Ruby -> Rust)
  2. rustc QR.rs && ./QR > QR.scala (Rust -> Scala)
  3. scalac QR.scala && scala QR > QR.scm (Scala -> Scheme) 이와 같은 과정이 128번 반복되며, 마지막에 생성된 QR2.rb가 원본 QR.rb와 일치하는지 diff 명령어로 확인하여 무결성을 검증한다.

프로젝트의 역사와 포함 언어

초기 50개 언어로 시작된 이 프로젝트는 Ubuntu 버전 업데이트에 따라 지원 언어를 지속적으로 변경하고 확장해 왔다. 최신 버전에서는 WebAssembly(Text/Binary), Swift, Kotlin, TypeScript 등 현대적인 언어부터 INTERCAL, Brainfuck, Whitespace와 같은 난해한 프로그래밍 언어(Esoteric Language)까지 폭넓게 포함하고 있다. 각 언어의 포함 기준은 기본적으로 Ubuntu 공식 패키지 저장소에 등록되어 있는지 여부를 따르며, 그렇지 않은 경우 vendor/에 별도 구현을 포함한다. 저자인 Yusuke Endoh는 이러한 난해하고 예술적인 프로그래밍 기법을 다룬 서적을 출간하기도 했다.

결론

이 프로젝트는 프로그래밍 언어의 다양성과 컴파일러/인터프리터의 동작 원리를 극단적인 형태로 보여주는 예술적 프로그래밍의 정수다. 단순한 재미를 넘어 수많은 언어 환경을 하나의 파이프라인으로 통합하는 기술적 복잡성을 내포하며, Docker 환경을 통해 누구나 이 거대한 순환 과정을 직접 검증할 수 있는 환경을 제공한다. 개발자들에게 언어의 제약을 넘어선 창의적인 코드 설계의 가능성을 시사한다.