웹사이트 작성을 위한 Forth 영감 언어
Source: Hacker News
아이디어가 어디서 떠올랐는지는 기억이 나지 않지만, 스택 기반 언어로 웹사이트를 작성할 수 있다면 멋질 것 같다는 생각이 들었습니다. 예를 들면 다음과 같습니다:
: h1 ( s -- ) "
## " emit . "
" emit ;
"Hello, World!" h1
그래서 Forge를 만들었습니다.
HTML에 마이크로포맷을 쉽게 추가할 수 있도록 단어 정의 라이브러리를 빠르게 구축했습니다:
: post-content
"Hello, world! This is my first post with Forge!" p ;
: post-body
h-entry-start
"" emit
"2026-05-21T14:00:00Z" "May 21, 2026" dt-published
" · by " emit
"Beto" "/about" p-author
"" 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
각 사이트는 페이지 모음, 단어 라이브러리, 그리고 스타일시트로 구성됩니다:
my-site
├── lib.forge
├── style.css
└── pages
├── about.forge
├── hello.forge
└── notes.forge
단일 바이너리 하나로 웹사이트를 실행합니다:
forge --log forge.log my-site/
이 바이너리는 많은 일을 합니다. .forge 파일로부터 HTML을 생성하는 WebAssembly 컴파일러를 내장하고 있습니다. 페이지를 방문하면 백엔드에서 컴파일러가 실행되어 실제 HTML을 소스 코드에 포함시키고, 원본 .forge 소스도 함께 제공합니다. 하지만 페이지 간 이동 시에는 서비스 워커가 /notes 같은 페이지에 대한 네트워크 요청을 가로채어 /notes.forge 소스를 가져오고, 브라우저에서 컴파일러를 실행해 즉석에서 HTML을 만들어 냅니다. 따라서 크롤러와 WebMentions를 위한 서버 사이드 렌더링과, SPA 경험을 위한 클라이언트 사이드 렌더링을 동시에 제공할 수 있습니다.
언어의 제한이 오히려 매력적입니다. 상태(state), localStorage, 혹은 서버의 추가 전용 로그에 데이터를 영구히 저장할 수 있습니다. 예를 들어, 다음과 같이 게시물에 “좋아요” 버튼을 추가할 수 있습니다:
: like-button ( -- )
"❤" "do-like" on-click ;
: do-like
"1" "likes:demo" log-append ;
: body
"I liked this!" p
like-button ;
버튼을 클릭하면 로그의 토픽 likes:demo에 값 "1"이 추가됩니다. 로그는 단순히 JSONL(줄당 하나의 JSON 문서) 형식입니다. 폼은 다른 .forge 페이지로 전송될 수 있으며, 폼 내용은 스택에 그대로 넣어줍니다. 백엔드에 저장하려면 대상 페이지가 log-append를 사용하면 됩니다.
이 언어가 가진 독특함이 마음에 듭니다. 내 사이트에 쓸 수도 있겠네요—누가 알겠어요? 지금은 아이디어를 탐색하고 있을 뿐입니다.