구현이 없던 4년 반과, Pugs의 1년 — Haskell로 쓰인 Perl 6

2005년 2월 1일, Audrey Tang이 Perl 6의 구현을 Haskell로 쓰기 시작했다. Pugs다. 발표로부터 4년 반, 설계 문서는 쌓여 있었지만 돌아가는 것이 없었다. Pugs는 몇 달 만에 상당 부분을 움직였고, 그리고 구현 자체보다 큰 것을 남겼다 — 「구현할 때마다 공식 테스트 스위트에 테스트를 쓴다」는 운용. 그것이 훗날 roast가 되어, Perl 6의 사양관을 다시 만들었다.

perlrakupugshaskellhistorytestingprogramming-languages

4년 반, 돌아가는 것이 없었다

지난번, Perl 6이 바꾸려 한 9항목을 늘어놓았다. 어느 것이나 언어 하나 분량의 일이고, 게다가 서로 독립적이지 않다는 이야기였다.

그러면, 그동안 무슨 일이 일어나고 있었는가.

2000년 7월의 발표부터 2005년 초까지, Perl 6에는 실용적으로 돌아가는 구현이 없었다. 있었던 것은 설계 문서다. Apocalypse가 쓰이고, Synopsis가 정리되고, Parrot(다음 회의 주역)이 개발되고 있었다. 그러나 Perl 6의 프로그램을 써서 돌릴 수 있는 환경은, 실질적으로 존재하지 않았다.

4년 반이다.

이 기간이 무엇을 의미했는지를, 먼저 적어 두고 싶다.

설계 문서만으로 나아가는 기간에는 고유의 위험이 있다.

  • 쓰면 쓸수록, 정해진 것이 늘어나고 있는 것처럼 보인다
  • 그러나 실제로 써 보기 전에는 알 수 없는 것이 계속 남는다
  • 그리고 아무도 쓰고 있지 않으므로, 그것이 아직 남아 있다는 것을 알아차릴 수 없다

문서는 쌓인다. 진척이 있는 것처럼 보인다. 검증되지 않은 결정이, 검증되지 않은 채 쌓인다.

2005년 2월 1일

Audrey Tang이 Perl 6의 구현을 쓰기 시작했다. 언어는 Haskell. 프로젝트 이름은 Pugs(Perl 6 User’s Golfing System).

왜 Haskell이었는가

이유는 몇 가지 있다.

1. 파서 콤비네이터를 쓸 수 있다. Parsec을 쓰면 복잡한 문법을 빠르게 구현할 수 있다. Perl 6의 문법은 크다. 여기서 속도가 나오는 것은 결정적이었다.

2. 지연 평가가 Perl 6과 대응한다. 4화에서 쓴 지연 리스트 · 무한 수열은, Haskell에서는 언어의 기본 동작이다. 구현이 순순해진다.

3. 대수적 데이터 타입으로 AST를 쓰기 쉽다.

그리고, 아마 이것이 가장 크다.

4. Audrey Tang이 빠르게 쓸 수 있는 언어였다.

여기에 중요한 판단이 있다. 「Perl 6을 Perl로 구현해야 한다」는 전제를 뺀 것이다.

당시의 분위기로서, Perl 6의 구현은 Parrot 위에 만드는 것이라는 양해가 있었다. Pugs는 그것을 무시했다. 돌아가는 것을 최속으로 만드는 것을, 다른 모든 것보다 우선했다.

무슨 일이 일어났는가 — 속도

Pugs의 진척은, 당시 사람들의 증언에 따르면 이상할 정도로 빨랐다. 시작으로부터 몇 달 만에 Perl 6의 상당 부분이 돌아가고, 세계에서 처음으로 Perl 6 프로그램을 실용적으로 쓸 수 있는 환경이 되었다.

4년 반, 돌아가는 것이 없었다. 그리고 1년 만에, 돌아가게 되었다.

이 대비가, Pugs의 역사적 의미의 거의 전부다.

Pugs가 남긴 세 가지

Pugs 자체는 현재 쓰이고 있지 않다. 저장소는 아카이브되어 있다. 그럼에도 Pugs가 Perl 6사의 전환점이라고 여겨지는 것은, 제도로서 남은 것이 있기 때문이다.

1. 사양 테스트 — roast의 기원

Audrey Tang은, Pugs에서 기능을 구현할 때마다 공식 테스트 스위트에 테스트를 쓴다는 운용을 시작했다.

이것이 왜 중요한가.

구현은 여럿 있어도 된다. Pugs가 있고, Parrot 위의 구현이 있고, 훗날 다른 것도 나타난다. 그러나 테스트는 공유한다. 테스트는 「Pugs가 이렇게 동작한다」가 아니라, 「Perl 6이란 이렇게 동작하는 것이다」를 쓴 것이기 때문이다.

이 운용이 자라 roast(Repository Of All Spec Tests)가 되고, 최종적으로 「roast가 사양이다」라는 형태에 이른다. 그 이야기는 7화에서 한다.

2. 구현이 설계에 피드백했다

Pugs로 실제로 써 보면, Synopsis의 기술로는 정해지지 않는 점이나, 쓰기 어려운 부분이 구체적으로 나온다. 그것이 Synopsis로 되돌아갔다.

여기에, 이 연재에서 다섯 번째의 「형(型)」이 있다.

구현은, 읽어서 알 수 있는 오류와는 다른 종류의 오류를 낸다.

5년 분량의 설계 문서가 있어도, 써 보기 전에는 알 수 없는 것이 남아 있었다. 그리고 그것은, 문서를 한 번 더 읽어도 발견되지 않는 종류의 것이었다.

3. 커뮤니티의 월경

Haskell 커뮤니티의 사람들이 Perl 6에 관여하게 되었다.

Pugs는 「Perl 사람이 Haskell을 배운다」「Haskell 사람이 Perl 6을 안다」는 입구가 되어, Perl 6의 설계에 타입 시스템 쪽의 어휘를 들여왔다.

Audrey Tang은 이 시기, 커밋 권한을 매우 후하게 나눠준 것으로도 알려져 있다. 패치를 보낸 사람에게 바로 commit 권한을 주는 운용으로, 참여의 문턱을 크게 낮췄다.

이것은 「돌아가는 것이 있다」는 것의 부차적 효과이기도 하다. 돌아가는 것이 있으면, 사람은 작은 기여를 할 수 있다. 설계 문서에는, 작은 기여를 할 방법이 없다.

감속과, 역할의 끝

2007년 전후부터 Pugs의 개발은 감속한다. Audrey Tang이 건강상의 이유 등으로 제일선에서 물러난 것이 직접적인 요인이었다.

⚠️ 여기는 공표된 범위를 넘어 써서는 안 된다. 사실로서 쓸 수 있는 것은, 전임에 가까운 담당자가 한 명 빠진 것이, 프로젝트의 속도에 직접 영향했다는 것이다.

3화에서 「15년이 걸린 이유」의 네 번째로 「전임 담당자가 얇았다」고 썼다. Pugs는 그 가장 선명한 예다. 한 사람의 이탈이, 프로젝트 전체의 속도를 바꿨다.

(Audrey Tang은 그 후 대만의 디지털 담당 정무위원 · 디지털 발전부 장관을 지냈다.)

위치

Pugs는 「실패한 구현」이 아니다. 사양과 구현의 관계를 다시 만든 구현이다.

Pugs 이전 Pugs 이후
설계 문서(Synopsis)가 정본 테스트 스위트(roast)가 정본으로 향한다
구현은 사양을 따르는 것 구현이 사양을 움직이는 일도 있다
Perl 6은 Parrot 위의 것 구현은 여럿 있어도 된다

그리고, 하나 더.

Pugs는 「돌아가는 것이 있다」는 것의 가치를 증명했다. 4년 반의 설계와, 1년의 구현. 후자가 공기를 바꿨다. 이것은 설계가 헛되었다는 의미가 아니다 — Pugs는 Synopsis가 있었기에 빠르게 쓸 수 있었다. 둘 다 필요하다, 그러나 한쪽만으로는 나아가지 않는다는 이야기다.

다음 회는, 그 「다른 한쪽」이 크게 빗나간 이야기를 한다. Perl 6은, 구현 기반의 선정에서 한 번 내기를 빗맞혔다.


다음 회(6화): 범용 VM이라는 내기. Parrot은 「동적 언어 공통의 VM」을 목표로 했고, 그리고 누구의 것도 되지 않았다. MoarVM은 무엇을 버림으로써 완성했는가.

← Back to Perl과 Raku의 계보