Forge: 스택 기반의 웹 개발 접근 방식
현대 웹 개발 환경은 종종 거대한 프레임워크와 복잡한 빌드 파이프라인에 의해 지배됩니다. 하지만, Forge라고 불리는 새로운 실험적 프로젝트는 Forth에서 영감을 받은 스택 기반 언어의 원칙을 웹사이트 제작에 적용함으로써 이러한 규범에서 근본적인 탈피를 제안합니다.
HTML 생성을 일련의 스택 연산으로 처리함으로써, Forge는 개발자가 페이지 구조와 마이크로포맷(microformats)을 정의하는 방식을 단순화하는 동시에, 현대적인 브라우저 기능을 활용하여 원활한 사용자 경험을 제공하는 것을 목표로 합니다.
핵심 개념: 웹을 위한 Forth
Forge의 핵심은 스택 기반 언어라는 점입니다. 전통적인 명령형 언어에서는 인자와 함께 함수를 호출할 수 있지만, Forge에서는 값을 스택에 푸시(push)하고 그 값을 소비하는 "word" (함수)를 호출합니다.
예를 들어, Forge에서 간단한 헤더를 만드는 방법은 다음과 같습니다:
: h1 ( s -- ) "<h1>" emit . "</h1>" emit ;
"Hello, World!" h1
이 코드 조각에서 : h1 정의는 새로운 word를 생성합니다. 문자열 "Hello, World!"가 스택에 푸시되고, h1 word는 해당 문자열을 소비하여 <h1> 태그로 감쌉니다. 이러한 접근 방식은 개발자가 재사용 가능한 word들의 라이브러리를 구축하여, 특정 사이트 아키텍처에 맞춘 도메인 특화 언어(DSL)를 효과적으로 생성할 수 있게 합니다.
마이크로포맷을 활용한 고급 구조화
Forge의 주요 강점 중 하나는 마이크로포맷과 같은 복잡한 HTML 구조를 얼마나 쉽게 구현할 수 있는지에 있습니다. div와 span의 깊은 계층을 중첩하는 대신, 개발자는 보일러플레이트(boilerplate)를 처리할 수 있는 고수준 word들을 정의할 수 있습니다.
블로그 포스트 본문 정의를 예로 들어 보겠습니다:
: post-body
h-entry-start
"<p class='byline'>" emit
"2026-05-21T14:00:00Z" "May 21, 2026" dt-published
" · by " emit
"Beto" "/about" p-author
"</p>" emit
h-entry-end
"On building a tiny stack-based web language." p-summary
"post-content" e-content
"/hello-world" "permalink" u-url ;
"Hello, world!" "post-body" blog-post
h-entry-start 및 p-summary와 같은 word들로 HTML 태그를 추상화함으로써, 코드는 구문론적 복잡함보다는 콘텐츠 자체에 집중하며 깔끔한 상태를 유지합니다.
하이브리드 렌더링 아키텍처
Forge는 서버 사이드 렌더링(SSR)과 싱글 페이지 애플리케이션(SPA)의 장점을 결합한 정교한 배포 모델을 채택합니다.
- 서버 사이드 렌더링: 단일 바이너리가 웹사이트를 실행합니다. 크롤러나 첫 방문자가 페이지에 접속하면, 백엔드 컴파일러가
.forge파일로부터 HTML을 생성하여 제공합니다. 이는 사이트가 SEO에 친화적이고 WebMentions와 호환되도록 보장합니다. - 클라이언트 사이드 렌더링: 사이트가 로드된 후, 서비스 워커(service worker)가 후속 네트워크 요청을 가로챕니다. 사용자가 새로운 페이지(예:
/notes)로 이동할 때, 서비스 워커는.forge소스 파일을 가져와 브라우저에서 직접 WebAssembly로 컴파일된 컴파일러를 실행하여 즉석에서 HTML을 생성합니다.
이 하이브리드 접근 방식은 정적 사이트의 접근성을 희생하지 않으면서도 SPA의 즉각적인 느낌을 제공합니다.
상태 및 지속성
Forge는 서버의 append-only log를 활용하여 백엔드 상호작용을 것을 단순화합니다. 복잡한 API 엔드포인트나 데이터베이스 스키마 대신, 개발자는 log-append word를 사용하여 데이터를 지속적으로 저장할 수 있습니다.
예를 들어, "좋아요" 버튼은 다음과 같이 구현할 수 있습니다:
: like-button ( -- )
"❤" "do-like" on-click ;
: do-like
"1" "likes:demo" log-append ;
사용자가 버튼을 클릭하면, 값 "1"이 서버의 JSONL (JSON Lines) 파일 내 likes:demo 토픽 아래에 추가됩니다. 이러한 최소한의 지속성 접근 방식은 동적 웹 요소와 관련된 일반적인 오버헤드를 줄여줍니다.
커뮤니티의 반응
이 프로젝트는 "weird"한 실험적 언어를 만드는 데 있어 현대적 도구의 역할에 관한 흥미로운 토론을로 이끌었습니다. 한 관찰자는 현재의 LLM 지원 코딩 시대가 복잡한 시스템의 진입 장벽을 매우 낮추어 주었다고 언급했습니다:
LLM-based coding is enabling so much! The crazy weekend project now can have compilation to native code and web assembly... without breaking a sweat.
언어 자체는 실험적이지만, 이 프로젝트는 개인 블로그—개인적 표현의 공간—가 아마도 관습에 얽매이지 않는 프로그래밍 패러다임을 실험하기에 가장 좋은 장소라는 점을 상려시켜 줍니다. Forge가 주류 도구로 자리 잡을지, 아니면 단순한 호기심의 대상이 될지는 알 수 없지만, Forge는 구식의 스택 기반 로직과 WebAssembly 및 Service Workers와 같은 현대적인 웹 표준을 결합하는 힘을을 보여줍니다.