스물 년간의 Pandoc: Haskell 문서 변환기의 역사

소개 – 왜 Pandoc이 중요한가

Pandoc의 20주년은 작은 자체 작성 Markdown 파서가 가장 인기 있는 Haskell 프로그램으로 어떻게 진화했는지를 보여줍니다. 현재 51개의 입력 형식과 76개의 출력 형식을 지원하며 수백만 대의 머신에 설치되어 있습니다. 그 장수는 깨끗한 AST 기반 아키텍처, 강한 타입 지정, 커뮤니티 중심 개발 모델의 힘을 보여줍니다.


선행사: Haskell 먼저, 문서 변환은 둘째

John MacFarlane은 문서 변환기를 작성하기로 결정하기 전에 Haskell을 선택했습니다. A Gentle Introduction to Haskell을 읽고 parsec 파서 콤비네이터 라이브러리로 실험한 후, 그는 regex 기반 HTML 출력 대신 실제 구문 추상 트리(AST)를 생성하는 Markdown 파서를 만들었습니다. 이 설계는 N×M 변환 모델을 가능하게 했습니다: 새로운 리더(파서)와 작성자(렌더러) 각각이 가능한 형식 쌍의 수를 곱합니다.

"I decided to use Haskell, and then decided to write a document converter in it." – John MacFarlane

초기 코드베이스(약 3천 줄)는 Markdown, reStructuredText, HTML, LaTeX, RTF, S5를 지원했으며 GHC의 표준 라이브러리만 필요했습니다.


첫 출시 (2006‑2008): 커뮤니티 중심 가시성

  • 0.1 (2006년 8월) – 저자의 웹사이트에 소스 게시; 두 친구 이메일 외에는 광고 없음.
  • Debian 패키징 (2006년 10월) – Recai Oktaş와의 협력으로 노출 증가.
  • 0.3 (2007) – DocBook 작성자와 각주 구문 추가.
  • 0.4 (2007) – 테이블, 정의 목록, 상첨자 도입 및 첫 Hackage 출시, cabal-install을 통한 의존성 관리 가능.

이러한 출시는 거의 전적으로 저자의 개인 워크플로에 따라 진행되었지만, 각 추가는 새로운 사용 사례를 열어 더 많은 사용자를 끌어들였습니다.


Pandoc 1.x (2008‑2017): 형식 생태계 확장

  • 1.0 (2008년 9월) – MediaWiki, GNU Texinfo, OpenDocument, ODT, 펜스 코드 블록 및 구문 강조 추가. ODT와 강조를 지원하기 위해 MacFarlane은 zip-archivehighlighting-kate 라이브러리를 작성했습니다.
  • 1.4 (2010년 1월) – 사용자 지정 가능한 출력을 위한 유연한 템플릿 시스템 도입.
  • GitHub 마이그레이션 (2010) – Google Code에서 이동하여 가시성이 크게 향상되었습니다.
  • 1.9 (2012) – Word .docx 출력, AsciiDoc 작성자, Beamer/DZSlides 지원 활성화.
  • 2013‑2014 – Markdown 확장, YAML 메타데이터 블록, Lua 맞춤 작성자, JSON 필터, 그리고 인용을 위한 외부 pandoc-citeproc 필터 추가.
  • CommonMark 통합 (2015‑2020)libcmark를 통해 CommonMark 파서 추가 및 이후 네이티브 Haskell 패키지 사용, 동시에 Pandoc의 확장 Markdown 방언 유지.

이 기간 동안 Albert Krewinkel, Jesse Rosenthal, Matthew Pickering과 같은 기여자들이 Org-mode, docx 리더, EPUB 등과 같은 주요 형식 지원을 추가했습니다.


Pandoc 2.x (2017‑2023): 아키텍처 개편 및 성능 향상

  • 2.0 (2017) – 순수 및 I/O 기능이 있는 리더/라이터를 허용하는 PandocMonad 타입클래스 도입 및 빠른 AST 조작을 위한 Lua 필터 추가.
  • Lua 엔진hslua를 기반으로 사용자 작성 Lua 필터 및 맞춤 작성자 가능.
  • Skylighting – 더 빠르고 정확한 구문 강조 라이브러리로 highlighting-kate 대체.
  • 인용 개편 (2.11) – 외부 pandoc-citeproc 필터를 네이티브 Haskell CSL 라이브러리와 순수 Haskell 유니코드 콜레이션 구현으로 대체.
  • 샌드박스 모드 (2.15) – 이전 PandocMonad 설계를 활용하여 부작용 없는 실행 보장.
  • 기본 파일 (2.8) – 재사용 가능한 옵션 컬렉션 허용.
  • 웹 서버 (2.19.1) – Pandoc을 HTTP API로 노출.

2018년 Handshake의 10만 달러 기부는 핵심 유지보수자에게 장학금을 제공하여 빠른 개발 속도를 유지했습니다.


Pandoc 3.x (2023‑현재): 모듈화 및 새로운 프론트엔드

  • 3.0 (2023) – 프로젝트를 네 개의 패키지로 분할: pandoc (핵심 라이브러리), pandoc-lua-engine, pandoc-server, pandoc-cli. CLI는 이제 Lua 또는 서버 구성 요소 없이 빌드될 수 있어 경량 사용을 위한 바이너리 크기 감소.
  • Figure 요소 및 청크된 HTML 작성자 – 다중 장 HTML 책에 대한 네이티브 지원 추가.
  • Typst 통합 (3.1.3)typst Hackage 패키지를 통해 완전한 기능의 Typst 리더 생성.
  • Djot 지원 (3.1.12) – 저자가 설계한 Markdown의 후속어인 Djot 마크업 언어에 대한 입력 및 출력 추가.
  • WASM 컴파일 (3.9, 2026년 2월) – 브라우저에서 완전한 Pandoc 실행 가능, "pandoc for the people"라는 GUI 프론트엔드 제공.

2024‑2025년 커뮤니티 기여는 ANSI, mdoc, POD, XML AST, vimdoc, PowerPoint, Excel, BBCode 및 AsciiDoc 리더/작성자를 추가하여 핵심 아키텍처의 지속적인 확장성을 보여줍니다.


영향력을 보여주는 통계

  • 지원 형식 – 51 입력 × 76 출력 = 3,876개의 서로 다른 변환 (확장 변형 제외).
  • 코드 크기 – 핵심 패키지에 약 85천 줄의 Haskell; 종속 패키지를 포함하면 총량이 약 두 배가 됩니다.
  • GitHub 활동 – 7,346개의 닫힌 이슈; 600명 이상의 기여자.
  • 최고 기여자 – John MacFarlane (372,317 줄 변경), Albert Krewinkel (77,136), Jesse Rosenthal (39,664) 등.
  • 설치 규모 – Pandoc은 수백만 대의 컴퓨터에 설치되어 Quarto, Jupyter Notebook 및 많은 CI 파이프라인에 통합되어 있습니다.

Haskell이 결정적인 요인이 된 이유

저자는 Haskell의 대수적 데이터 타입, 강한 정적 타입 지정 및 순수성이 대규모 리팩터링을 안전하고 표현력 있게 만든다고 주장합니다. 순수 함수는 샌드박스 모드가 "입출력 없음" semantics를 강제할 수 있게 보장하며, 타입 시스템은 컴파일 시 불일치를 잡아 회귀 위험을 줄입니다.

"When working with languages without a strong type system, e.g. Python and JavaScript, the lack of these safeguards always makes me afraid to make big changes."

Rust의 성능 장점을 인정하면서도, 저자는 Haskell이 복잡한 문서 변환을 표현하기에 더 인간 친화적이라고 유지합니다.


커뮤니티 반성 (선정된 HN 댓글)

  • 장수 및 효율성 – 한 댓글 작성자는 LLM이 결정적 신뢰도에 근접하더라도 Pandoc이 배치 변환에 대해 에너지 효율 면에서 주문 크기 더 높다고 지적했습니다.
  • 기여자 경험 – 사용자들은 친절한 유지보수자들을 칭찬하며, Haskell에 익숙하지 않은 개발자로부터의 버그 보고 및 PR에 대한 신속하고 친절한 답변을 언급했습니다.
  • 실용적인 워크플로 – 여러 사용자는 이메일‑to‑Markdown 파이프라인, 정적 사이트 생성, 바이너리 문서의 Git diff 정규화에 Pandoc을 사용하는 스니펫을 공유했습니다.
  • 미래 전망 – 일부는 AI 기반 형식 변환이 결국 규칙 기반 변환기를 대체할 수 있다고 우려하지만, 대부분은 Pandoc의 결정적 출력과 낮은 자원 사용이 오늘날에도 관련성을 유지한다고 동의합니다.

앞으로의 전망: AI 시대에서 Pandoc은 살아남을 것인가?

저자는 대형 언어 모델이 이미 마크업 언어 간 번역을 할 수 있다고 추측하지만, Pandoc은 여전히 세 가지 구체적인 장점을 제공한다고 생각합니다:

  1. 생태학적 발자국 – LLM을 실행하는 것보다 훨씬 낮은 에너지 소비.
  2. 결정적 결과 – 동일한 입력은 항상 동일한 출력을 내며, 이는 재현 가능한 과학 워크플로에 필수적입니다.
  3. 성숙도 및 신뢰도 – 수십 년간의 버그 수정 및 커뮤니티 테스트가 안정적인 도구를 만들어냈으며, AI 모델이 아직 따라오지 못했습니다.

그러나 저자는 미래의 AI가 특히 애매한 마크업 사례에서 규칙 기반 변환을 결국 능가할 수 있다고 인정합니다.


결론

Pandoc의 20년 여정—3천 줄짜리 취미 프로젝트에서 WASM‑가능한 생태계로의 모듈화—는 잘 설계된 AST, 강한 타입 지정, 그리고 개방된 기여자 문화가 수십 년간 복잡한 소프트웨어 도구를 지속시킬 수 있음을 보여줍니다. 그 지속적인 관련성은 효율성, 결정적 출력, 그리고 형식, 필터, 통합을 지속적으로 추가하는 활발한 커뮤니티에 달려 있습니다.

Sources