웹사이트 작성을 위한 Forth 영감 언어

발행: (2026년 5월 23일 AM 12:00 GMT+9)
4 분 소요

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를 사용하면 됩니다.

이 언어가 가진 독특함이 마음에 듭니다. 내 사이트에 쓸 수도 있겠네요—누가 알겠어요? 지금은 아이디어를 탐색하고 있을 뿐입니다.

0 조회
Back to Blog

관련 글

더 보기 »