Post

[Program Synthesis #11] 실제 시스템으로 보는 Synthesis: FlashFill, Sketch, STOKE

Program Synthesis 시리즈 11편 – FlashFill, Sketch, STOKE를 통해 실제 시스템이 다양한 synthesis 기법을 어떻게 결합하는지 이해하기

[Program Synthesis #11] 실제 시스템으로 보는 Synthesis: FlashFill, Sketch, STOKE

들어가며 — 이론이 실제 시스템이 되는 순간

지금까지 우리는 Program Synthesis를 다양한 관점에서 살펴봤다.

  • Search → 어떤 프로그램을 탐색할 것인가
  • Representation → 프로그램 공간을 어떻게 표현할 것인가
  • Stochastic → 확률적으로 탐색하는 방법
  • Constraint → 논리적으로 문제를 해결하는 방법

이 모든 접근은 각각 강력하지만,

실제 시스템은 하나의 방법만 사용하지 않는다


현실의 Program Synthesis 시스템은
이 모든 요소를 조합해서 만들어진다.

  • 구조를 제한하고 (Sketch / Grammar)
  • 공간을 압축하고 (VSA / DAG)
  • 탐색을 최적화하고 (Search strategy)
  • constraint로 검증한다 (SMT / CEGIS)

즉 synthesis는 이제

하나의 알고리즘이 아니라 시스템 설계 문제

다.


이 글에서는 대표적인 세 가지 시스템을 통해
이 아이디어가 실제로 어떻게 구현되는지 살펴본다.

  • FlashFill → PBE 기반 synthesis
  • Sketch → constraint-based synthesis
  • STOKE → stochastic superoptimization

이 시스템들을 비교하면,

각 접근이 어디서 강하고, 어떻게 결합되는지

명확하게 드러난다.


FlashFill — Programming by Example의 대표 시스템

FlashFill은 Microsoft Excel에 실제로 들어간
가장 유명한 Program Synthesis 시스템 중 하나다.


문제 설정

FlashFill은 다음과 같은 문제를 해결한다.

몇 개의 input-output 예제가 주어졌을 때,
그 변환을 수행하는 프로그램을 생성하라


예:

1
2
input:  "john doe"
output: "J. Doe"

사용자는 몇 개의 예제만 제공하고,
나머지는 시스템이 자동으로 채운다.


핵심 아이디어

FlashFill의 핵심은 다음 세 가지의 결합이다.

  • DSL (도메인 특화 언어)
  • VSA (Version Space Algebra)
  • Ranking (우선순위 모델)

DSL — 구조 제한

FlashFill은 일반적인 프로그램이 아니라
문자열 변환에 특화된 DSL을 사용한다.


예:

1
Concat(Substring(...), Constant(...))

이렇게 구조를 제한하면

search space가 크게 줄어든다


VSA — 공간 압축

FlashFill은 가능한 프로그램을 하나씩 나열하지 않는다.

대신:

가능한 프로그램 집합을 VSA로 압축해서 표현한다


즉:

  • 수많은 프로그램을 하나의 DAG로 표현
  • 공통 구조 공유

Ranking — 가장 자연스러운 프로그램 선택

여러 후보가 있을 때, FlashFill은 ranking을 사용한다.


예:

  • 더 짧은 프로그램
  • 더 일반적인 패턴
  • 더 “자연스러운” 구조

즉,

확률적 모델 + 휴리스틱


전체 구조

FlashFill은 다음과 같이 동작한다.

  • DSL로 search space 제한
  • VSA로 후보 압축
  • ranking으로 최종 선택

즉,

Representation + Search + Heuristic의 결합


Sketch — Constraint-Based Synthesis의 대표 시스템

Sketch는 Constraint-Based Synthesis를 대표하는 시스템이다.


문제 설정

Sketch는 다음과 같은 형태의 문제를 푼다.

일부가 비어있는 프로그램을 완성하라


예:

1
f(x) = x + ??

여기서 ??는 hole이다.


핵심 아이디어

Sketch의 핵심은 다음과 같다.

  • 프로그램 구조는 사용자가 제공
  • hole을 변수로 변환
  • constraint solving으로 값 결정

Constraint Encoding

Sketch는 프로그램을 constraint로 변환한다.


예:

1
f(x) = x + c

그리고 specification:

1
2
f(1) = 2
f(2) = 3

→ constraint:

\[c = 1\]

CEGIS Loop

Sketch는 단순 solver 호출로 끝나지 않는다.


다음 과정을 반복한다.

  • 예제 기반 constraint 생성
  • solver로 후보 생성
  • counterexample로 refinement

즉,

Constraint + Iteration (CEGIS)


특징

  • 강한 correctness 보장
  • search 대신 solving
  • sketch 품질에 의존

전체 구조

Sketch는 다음과 같이 볼 수 있다.

  • Structure → 사람이 제공
  • Constraint → 문제 정의
  • Solver → 해 결정

즉,

논리 기반 synthesis


Sketch — Constraint-Based Synthesis의 대표 시스템

Sketch는 Constraint-Based Synthesis를 대표하는 시스템이다.


문제 설정

Sketch는 다음과 같은 형태의 문제를 푼다.

일부가 비어있는 프로그램을 완성하라


예:

1
f(x) = x + ??

여기서 ??는 hole이다.


핵심 아이디어

Sketch의 핵심은 다음과 같다.

  • 프로그램 구조는 사용자가 제공
  • hole을 변수로 변환
  • constraint solving으로 값 결정

Constraint Encoding

Sketch는 프로그램을 constraint로 변환한다.


예:

1
f(x) = x + c

그리고 specification:

1
2
f(1) = 2
f(2) = 3

→ constraint:

\[c = 1\]

CEGIS Loop

Sketch는 단순 solver 호출로 끝나지 않는다.


다음 과정을 반복한다.

  • 예제 기반 constraint 생성
  • solver로 후보 생성
  • counterexample로 refinement

즉,

Constraint + Iteration (CEGIS)


특징

  • 강한 correctness 보장
  • search 대신 solving
  • sketch 품질에 의존

전체 구조

Sketch는 다음과 같이 볼 수 있다.

  • Structure → 사람이 제공
  • Constraint → 문제 정의
  • Solver → 해 결정

즉,

논리 기반 synthesis


세 시스템의 비교 — 서로 다른 설계 철학

이제 세 시스템을 비교해보자.


접근 방식

  • FlashFill → PBE + VSA + Ranking
  • Sketch → Constraint + Solver + CEGIS
  • STOKE → Stochastic Search

핵심 차이

  • FlashFill → 구조적 압축 + 휴리스틱
  • Sketch → 논리 기반 해결
  • STOKE → 확률적 탐색

문제 유형

  • FlashFill → 문자열 변환
  • Sketch → 일반적인 synthesis
  • STOKE → 성능 최적화

중요한 관점

이 세 시스템은 서로 경쟁하는 것이 아니다.

서로 다른 문제를 해결하기 위해 설계된 것


즉,

representation + search + constraint의 조합이 다르다


정리 — Program Synthesis는 시스템 설계다

지금까지 FlashFill, Sketch, STOKE를 통해
실제 Program Synthesis 시스템을 살펴봤다.


이 시스템들은 겉으로는 다르지만,
공통된 구조를 가진다.

  • search를 어떻게 할 것인가
  • representation을 어떻게 할 것인가
  • constraint를 어떻게 적용할 것인가

즉 synthesis는 더 이상

하나의 알고리즘 문제가 아니다


대신 다음과 같은 문제다.

여러 요소를 어떻게 결합할 것인가


이 관점에서 보면,

  • FlashFill은 representation 중심
  • Sketch는 constraint 중심
  • STOKE는 search 중심

각각 다른 축을 강조한다.


전체 시리즈를 돌아보며

이 시리즈를 통해 우리는 다음을 살펴봤다.

  • brute-force 탐색에서 시작해
  • 구조와 확률을 도입하고
  • 표현 방식을 바꾸며
  • 논리와 결합하고
  • 실제 시스템으로 확장했다

이 흐름은 하나의 메시지를 보여준다.

Program Synthesis는 점점 더
구조화된 문제 해결 방식으로 발전하고 있다


마지막 관점

이제 synthesis는 다음과 같이 볼 수 있다.

  • 프로그램을 작성하는 것이 아니라
  • 프로그램을 정의하고, 탐색하고, 구성하는 과정

즉,

Programming → Synthesis


이 시리즈는 여기서 마무리되지만,
이 분야는 여전히 빠르게 발전하고 있다.

  • ML 기반 synthesis
  • LLM과의 결합
  • 실제 산업 적용

이제 남은 것은 하나다.

이 아이디어들을 직접 구현해보는 것

This post is licensed under CC BY 4.0 by the author.