처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.03.30 21

파서를 WebAssembly로 컴파일한다고? Ohm의 PEG-to-WASM 컴파일러 이야기

Hacker News 원문 보기
파서를 WebAssembly로 컴파일한다고? Ohm의 PEG-to-WASM 컴파일러 이야기

파싱 성능의 새로운 가능성

Ohm이라는 도구를 아시나요? JavaScript로 만들어진 파싱 프레임워크인데요, PEG(Parsing Expression Grammar)이라는 문법 정의 방식을 사용해서 프로그래밍 언어나 DSL(Domain-Specific Language, 특정 분야 전용 언어)을 쉽게 만들 수 있게 해주는 도구예요. 이 Ohm이 PEG 문법을 WebAssembly(이하 WASM)로 직접 컴파일하는 기능을 발표했어요.

이게 왜 의미 있는지 이해하려면, 먼저 파싱이 뭔지부터 짚어볼게요. 파싱은 텍스트를 컴퓨터가 이해할 수 있는 구조로 변환하는 과정이에요. 여러분이 쓰는 모든 프로그래밍 언어, JSON 파서, SQL 파서, 마크다운 렌더러, 이런 것들 내부에 파서가 있어요. 쉽게 말하면, 사람이 쓴 텍스트를 컴퓨터가 "아, 이건 변수 선언이고, 저건 함수 호출이구나"라고 알아먹을 수 있게 해주는 번역기 같은 거예요.

PEG이 뭔데요?

PEG는 Parsing Expression Grammar의 약자인데, 문법을 정의하는 형식 중 하나예요. 전통적인 정규표현식(regex)보다 훨씬 강력하고, BNF 같은 기존 문법 정의 방식보다 직관적이에요. PEG의 핵심 특징은 "순서가 있는 선택(ordered choice)"이에요. 이게 뭐냐면, 문법 규칙에서 여러 대안이 있을 때 위에서부터 순서대로 시도하고, 첫 번째로 매칭되는 것을 쓴다는 거예요. 이 덕분에 문법의 모호성 문제가 원천적으로 사라져요.

Ohm은 이 PEG에 몇 가지 좋은 기능을 얹었어요. 문법 정의와 동작(action) 코드를 분리해서 더 깔끔하게 관리할 수 있게 하고, 문법 상속이라는 기능으로 기존 문법을 확장하기도 쉽게 만들었어요. JavaScript 생태계에서 커스텀 파서가 필요할 때 많이 쓰이는 도구예요.

WASM 컴파일이 가져오는 변화

기존에 Ohm으로 만든 파서는 JavaScript로 실행됐어요. PEG 문법을 읽어서 인터프리터 방식으로 파싱을 수행하는 거죠. 이번에 나온 PEG-to-WASM 컴파일러는 접근 방식이 완전히 달라요. PEG 문법을 분석해서 그에 해당하는 WASM 바이트코드를 직접 생성하거든요.

비유를 들자면, 기존 방식은 요리 레시피를 한 줄씩 읽으면서 요리하는 것이고, 새 방식은 레시피를 미리 분석해서 최적화된 요리 동선을 짜놓고 실행하는 것과 비슷해요. 당연히 후자가 빠르겠죠.

WASM의 장점은 여러 가지인데요. 우선 성능이에요. JavaScript 인터프리터를 거치지 않고 네이티브에 가까운 속도로 실행되니까 파싱 속도가 크게 향상돼요. 특히 대용량 텍스트를 처리할 때 차이가 확연하죠. 두 번째는 이식성이에요. WASM은 브라우저뿐 아니라 Node.js, Deno, 심지어 서버 사이드 WASM 런타임에서도 돌아가거든요. 한번 컴파일해놓으면 어디서든 쓸 수 있어요.

기술적으로 더 들어가볼까요?

컴파일 과정을 좀 더 살펴보면, PEG 문법의 각 규칙이 WASM 함수로 변환돼요. 매칭 실패 시 백트래킹(이전 위치로 돌아가기)도 WASM 수준에서 최적화되어 처리되고요. 메모이제이션(memoization)이라고 해서, 한번 시도한 매칭 결과를 캐싱해두는 기법도 적용되어 있어요. PEG 파서의 최악의 경우 시간복잡도를 선형으로 유지해주는 핵심 기법인데, 이게 WASM의 선형 메모리를 활용해서 더 효율적으로 구현됐어요.

특히 관심 있게 볼 부분은 문자열 매칭 최적화예요. 파싱에서 가장 빈번하게 일어나는 연산이 "현재 위치의 문자가 특정 패턴과 일치하는가"를 확인하는 건데, 이걸 WASM의 메모리 직접 접근으로 처리하면 JavaScript의 문자열 연산보다 훨씬 빨라요.

업계에서의 위치

파싱 도구 시장은 꽤 다양해요. Tree-sitter는 에디터용 증분 파싱에 특화되어 있고, ANTLR은 Java 생태계에서 오랫동안 강자였어요. Pest(Rust), Nom(Rust), Chevrotain(JS) 등도 각자의 영역에서 쓰이고 있고요.

Ohm의 PEG-to-WASM 접근이 독특한 건, WASM을 타겟으로 함으로써 언어 독립적인 파서 생성의 가능성을 열었다는 점이에요. PEG 문법 하나 정의해놓으면 WASM을 지원하는 어떤 환경에서든 그 파서를 쓸 수 있다는 거죠. JavaScript에서 시작했지만 JavaScript에 묶여있지 않게 된 거예요.

한국 개발자에게 주는 시사점

커스텀 설정 파일 포맷, 내부 DSL, 로그 파싱, 템플릿 엔진 같은 걸 만들어야 할 때 Ohm + WASM 조합은 고려해볼 만해요. 특히 "정규표현식으로는 한계가 있고, 풀 파서를 직접 작성하기엔 너무 복잡한" 그 중간 지대에서 위력을 발휘하거든요. 웹 기반 코드 에디터, 마크다운 변환기, 데이터 변환 도구를 만들 때 파싱 성능이 병목인 경우에 특히 유용할 거예요.

한줄 정리

PEG 문법을 WASM으로 직접 컴파일한다는 건, 커스텀 파서를 빠르고 이식 가능하게 만드는 것이 훨씬 쉬워진다는 뜻이에요. 여러분의 프로젝트에서 "직접 파서를 만들어야 했던" 경험이 있나요? 어떤 도구를 사용하셨는지 궁금해요!


🔗 출처: Hacker News

이 뉴스가 유용했나요?

이 기술을 직접 배워보세요

AI 도구, 직접 활용해보세요

AI 시대, 코딩으로 수익을 만드는 방법을 배울 수 있습니다.

AI 활용 강의 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.