Formally Verified Linear-Time Invertible Lexing

이 논문은 Stainless 검증기를 사용하여 구현된 ZipLex 프레임워크를 소개하며, 이는 정규식과 최장 일치 semantics 를 충족할 뿐만 아니라 토큰 시퀀스의 역변환 (invertibility) 을 보장하고 검증된 메모이제이션을 통해 Flex 방식의 2 차 시간 복잡도 문제를 해결하는 선형 시간 성능을 달성합니다.

Samuel Chassot, Viktor Kunčak

게시일 Mon, 09 Ma
📖 3 분 읽기☕ 가벼운 읽기

Each language version is independently generated for its own context, not a direct translation.

1. 문제 상황: "레고 블록을 다시 조립할 수 있을까?"

컴퓨터가 텍스트를 읽을 때, 이를 레고 블록에 비유해 볼 수 있습니다.

  • 원문 (Input): 긴 레고 벽돌 줄입니다.
  • 분석 (Lexing): 컴퓨터가 이 벽돌들을 잘게 나누어 "이것은 '문자' 블록, 저것은 '숫자' 블록"이라고 분류하는 작업입니다.
  • 출력 (Printing): 분류된 블록들을 다시 원래대로 조립하여 텍스트를 만드는 작업입니다.

기존의 문제점:
기존의 컴퓨터 분석기들은 "이 블록이 '문자'다"라고 분류하는 데는 능숙했지만, 분류된 블록을 다시 조립했을 때 원래 텍스트와 정확히 똑같은지를 보장하지 못했습니다.

  • 예시: "val x = 1"이라는 문장이 있습니다. 분석기가 공백을 무시하고 "val", "x", "=", "1"로 나눕니다.
  • 만약 개발자가 이 블록들을 다시 조립할 때 공백을 잘못 넣으면 "val x=1"이 됩니다.
  • 이걸 다시 분석하면, 컴퓨터는 "x="를 하나의 이름으로 잘못 인식할 수 있습니다. 정보를 잃어버린 (되돌릴 수 없는) 상태가 된 것입니다.

2. ZipLex 의 해결책: "완벽한 거울"

ZipLex 는 이 문제를 해결하기 위해 두 가지 핵심 아이디어를 사용합니다.

A. "되돌릴 수 있는" 분석 (Invertibility)

ZipLex 는 단순히 텍스트를 분류하는 것을 넘어, 분류된 블록을 다시 조립하면 반드시 원래 텍스트가 나오도록 설계되었습니다.

  • 비유: 마치 거울을 보는 것과 같습니다. 거울에 비친 모습 (분류된 토큰) 을 다시 거울에 비추면 (다시 텍스트로 변환), 원래의 내 얼굴 (원래 텍스트) 과 100% 똑같아야 합니다.
  • 이를 위해 ZipLex 는 "이 블록은 원래 이 글자에서 왔어"라는 정보를 잃지 않고 저장합니다.

B. "부드러운" 연결 (Separability)

가장 어려운 점은 인접한 블록을 합칠 때입니다.

  • 비유: "cat"과 "dog"라는 블록이 있다고 칩시다. 그냥 붙이면 "catdog"이 됩니다. 하지만 "ca"와 "t"를 붙이면 "cat"이 되고, "t"와 "a"를 붙이면 "ta"가 되어 의미가 달라질 수 있습니다.
  • ZipLex 는 블록들이 서로 붙었을 때 혼동되지 않도록 미리 규칙을 정해둡니다. (예: "cat" 다음에 "dog"가 오면 안전하지만, "ca" 다음에 "t"가 오면 위험할 수 있으니 미리 체크합니다.)
  • 이 규칙을 **R-Path(경로)**라고 부르는데, 마치 레고 블록의 연결 부위가 서로 딱 맞아야만 (Separable) 조립이 가능하다는 안전장치와 같습니다.

3. 속도 문제: "기억력 좋은 비서" (Memoization)

보통 "정확한 것"과 "빠른 것"은 상충됩니다. ZipLex 는 메모이제이션 (Memoization) 기술을 써서 이 딜레마를 해결했습니다.

  • 비유: ZipLex 는 아주 똑똑한 비서입니다. 이전에 "이런 패턴을 분석했더니 이 결과가 나왔어"라고 계산한 적이 있다면, 그 결과를 메모장에 적어둡니다.
  • 나중에 똑같은 패턴이 나오면, 처음부터 다시 계산하지 않고 메모장에서 바로 가져옵니다.
  • 덕분에 ZipLex 는 텍스트 길이에 비례해서 선형적으로 (Linear) 매우 빠르게 작동합니다. (기존의 정밀한 분석 도구들은 텍스트가 길어지면 속도가 급격히 느려지는 '이차 함수' 형태였는데, ZipLex 는 직선처럼 일정하게 빠릅니다.)

4. 왜 이것이 중요한가요? (실제 효과)

이 논문은 ZipLex 가 실제로 얼마나 강력한지 증명했습니다.

  1. 정확성 보장: 수학적으로 증명된 (Formally Verified) 코드이므로, "이 토큰을 다시 조립하면 원래 글자가 나온다"는 것을 100% 확신할 수 있습니다.
  2. 압도적인 속도: 기존에 검증된 도구들 (Verbatim++, Coqlex 등) 보다 100 배 (두 자릿수) 이상 빠릅니다.
    • 비유: 다른 검증된 도구들이 "정밀한 수작업"을 하느라 느리다면, ZipLex 는 "정밀한 수작업의 원리를 알고 있는 로봇"처럼 빠릅니다.
  3. 실용성: JSON 파일 정렬이나 프로그래밍 언어 분석 같은 실제 업무에서도 잘 작동하며, 텍스트 길이가 아무리 길어져도 속도가 떨어지지 않습니다.

요약

ZipLex"컴퓨터가 텍스트를 분석할 때, 실수하지 않고 (정확성), 다시 원상복구도 가능하게 (되돌림), 그리고 아주 빠르게 (선형 속도)" 처리해주는 새로운 도구입니다.

마치 완벽한 레고 조립 키트처럼, 한 번 분해한 블록을 다시 조립하면 절대 모양이 변하지 않고, 그 과정이 매우 효율적으로 이루어지도록 만든 것입니다. 이는 미래의 안전한 소프트웨어와 컴파일러를 만드는 데 큰 발걸음이 될 것입니다.