정규 표현식 매칭의 주요 접근 방식
발표에서는 정규 표현식 매칭을 위한 네 가지 주요 기법을 제시하며, 특히 DFA 기반 엔진의 단순함과 속도를 강조합니다.
-
DFA 기반 엔진: RE2, Hyperscan 등에서 사용하며, 선형 시간(O(n)) 매칭을 보장하여 백트래킹 문제를 방지합니다.
-
백트래킹 NFA 엔진: Ruby, Python, PCRE 등 대다수 범용 언어에서 채택하고 있는 방식입니다.
-
VM/바이트코드 기반 및 정규 표현식 미분(Derivatives) 방식.
컴파일 파이프라인: 패턴에서 기계로
정규 표현식 엔진은 패턴을 파싱하여 고속 매칭 머신으로 변환하는 일련의 파이프라인으로 구성됩니다.
-
AST(추상 구문 트리): 연산자 우선순위의 모호함을 제거합니다.
- NFA(비결정적 유한 오토마타): Thompson 구성법을 사용하여 리터럴, 연결, 선택( ), 반복(*) 구조를 재귀적으로 결합하여 구축합니다.
- DFA(결정적 유한 오토마타): 부분집합 구성법(Subset Construction)을 통해 NFA의 비결정성을 제거합니다. 하나의 DFA 상태가 NFA 상태들의 집합을 나타내게 함으로써 매칭 시 모호함을 없앱니다.
Ruby를 활용한 구현의 이점
Ruby는 알고리즘 그 자체에 집중할 수 있게 해주는 최적의 언어입니다. Set, Hash와 같은 강력한 내장 데이터 구조와 자동 메모리 관리 기능을 통해, 저수준 언어보다 훨씬 우아하고 명확하게 복잡한 전산학 개념을 코드로 옮길 수 있습니다.