1P by GN⁺ 12시간전 | ★ favorite | 댓글 1개
  • Forge는 웹사이트를 스택 기반 언어로 작성해보는 실험적 언어로, HTML 태그를 Forth 스타일 단어로 정의해 사용함
  • 단어 라이브러리로 HTML에 microformats를 붙이기 쉽게 만들며, 사이트는 페이지·라이브러리·스타일시트로 구성됨
  • 단일 바이너리가 .forge 파일을 실행하고, 포함된 WebAssembly 컴파일러가 Forge 소스에서 HTML을 생성함
  • 직접 방문 시 서버가 HTML과 원본 소스를 제공하고, 페이지 이동 시 service worker가 소스를 받아 브라우저에서 컴파일함
  • 상태는 state, localStorage, 서버의 append-only log에 저장할 수 있으며, Forge는 아직 가능성 탐색 단계임

Forge의 기본 아이디어

  • Forge는 웹사이트를 스택 기반 언어로 작성하기 위한 실험적 언어임
  • HTML 태그를 Forth 스타일의 단어(word)로 정의해 사용할 수 있음
    : h1  ( s -- )  "<h1>" emit  .  "</h1>" emit ;
    
    "Hello, World!" h1
    
  • 단어 정의 라이브러리를 만들면 HTML에 microformats를 쉽게 추가할 수 있음
  • 사이트는 페이지, 단어 라이브러리, 스타일시트로 구성됨
    my-site
    ├── lib.forge
    ├── style.css
    └── pages
        ├── about.forge
        ├── hello.forge
        └── notes.forge
    
  • 단일 바이너리로 사이트를 실행함
    forge --log forge.log my-site/
    

렌더링과 상태 처리

  • Forge 바이너리는 .forge 파일에서 HTML을 생성하는 WebAssembly 컴파일러를 포함함
  • 페이지를 직접 방문하면 컴파일러가 서버에서 실행되고, 실제 HTML 소스와 원본 .forge 소스를 함께 제공함
  • 페이지 간 이동에서는 service worker/notes 같은 네트워크 요청을 가로채고 /notes.forge 소스를 가져와 브라우저에서 컴파일러를 실행함
  • 이 구조로 크롤러와 WebMentions에는 서버 사이드 렌더링을 제공하고, 페이지 이동에는 SPA 같은 클라이언트 사이드 렌더링을 제공함
  • 상태는 state, localStorage, 서버의 append-only log에 저장 가능함
  • 예를 들어 “좋아요” 버튼은 클릭 시 "1" 값을 "likes:demo" 토픽에 추가함
    : like-button  ( -- )
        "❤"  "do-like"  on-click ;
    
    : do-like
      "1" "likes:demo" log-append ;
    
    : body
      "I liked this!" p
      like-button ;
    
  • 서버 로그는 한 줄에 JSON 문서 하나를 저장하는 JSONL 형식임
  • 폼은 다른 .forge 페이지로 제출할 수 있고, 제출된 내용은 대상 페이지의 스택에 들어감
  • 백엔드 저장은 대상 페이지가 log-append를 사용해 처리해야 함
  • Forge는 실제 사이트 적용이 확정된 도구라기보다, 작은 스택 기반 웹 언어의 가능성을 탐색하는 단계임

댓글과 토론

Lobste.rs 의견들
  • 맨 위 예제가 내가 개인 웹사이트를 만드는 방식과 정말 비슷해 보임 :)

    "hey" <h1>

    연결형 언어(concatenative language)로 웹사이트를 만든 사람들을 모아 웹링 같은 걸 만들고 아이디어를 나눠보려 했는데, catlang 커뮤니티 안에서도 제대로 시도해 본 사람을 거의 찾지 못했음

    미래에 이 오래된 스레드를 읽고 비슷한 사람을 찾는다면, 10페이지쯤 넘는 웹사이트를 만들었고, 과정 어디에도 AI를 쓰지 않았고, 전부 어떤 형태의 연결형 언어로 작성했다면 알려주면 좋겠음. 예시 사이트 목록이라도 만들어보고 싶음

    • https://stk.junglecoder.com 는 플레이그라운드 구현까지 포함해 전부 StackTalk로 작성했지만, 아직 사이트 규모는 좀 작음

      StackTalk 재구축이 어느 정도 궤도에 오르면 그 부분을 보완할 계획임. https://junglecoder.com 의 일부 페이지도 비슷한 방식으로 만들고 있고, 최근에는 https://junglecoder.com/blarg/tired-of-csharp.html 를 그렇게 만들었음. 사이트 대부분은 아직 Mendoza로 빌드하지만, StackTalk를 정적 사이트 생성기의 기반으로 쓰는 게 꽤 즐거워서 Mendoza에서 pstk로 페이지를 적극적으로 옮길 생각임

    • 확실히 uxn에서 영감을 받았음

    • 안녕! 실제로 https://min-lang.org 같은 몇몇 사이트에서 min을 규칙 엔진으로 쓰고 있음

      내 정적 사이트 생성기인 HastySite는 Nim으로 작성됐고 템플릿에는 mustache를 쓰지만, 모든 기능은 min API로 노출됨

      min 언어 웹사이트에 쓰이는 rules.min 파일 예시는 여기에 있음

  • 내 블로그 글이 여기 올라와서 놀랐음. 맥락이 거의 없는 글이라 질문 있으면 기꺼이 답하겠음

    배경을 덧붙이면, Forge는 Rust로 작성됐고 웹어셈블리, 즉 스택 기반 언어와 네이티브 웹 서버로 컴파일됨. 며칠 여행 중이라 돌아오면 다음 주에 소스를 공개할 계획임

    페이지용 DSL을 만들기 위해 블록을 계속 조합하기 쉬운 점이 정말 마음에 듦. 예상보다 훨씬 표현력이 좋았음

    이 작업은 웹사이트를 작성하는 대안적 방식을 탐구해 온 시리즈의 일부임

    • 연결형/스택 기반 언어가 이런 용도에 정말 잘 맞는다고 느꼈음

      스택은 트리를 순회하거나 구축하는 과정을 표현하는 데 훌륭하고, Forth 계열의 구두점이 적은 문법은 문서 형태의 코드와 꽤 자연스럽게 어울림

      Starting Forth의 오래된 세탁기 예제 정신을 현대적으로 옮기면 The DOM을 다루는 예제가 될 수 있겠다는 글을 반쯤 써놨는데, 다른 사람들도 같은 실마리를 잡고 있어서 반가움