1 คะแนน โดย GN⁺ 10 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Forge เป็นภาษาเชิงทดลองสำหรับลองเขียนเว็บไซต์ด้วยภาษาที่อิงสแตก โดยนิยามแท็ก HTML เป็นคำแบบ Forth แล้วนำมาใช้
  • มีคลังคำที่ช่วยให้ใส่ microformats ลงใน HTML ได้ง่าย และเว็บไซต์ประกอบด้วยหน้าเว็บ คลังคำ และสไตล์ชีต
  • ไบนารีตัวเดียวสามารถรันไฟล์ .forge ได้ และมี คอมไพเลอร์ WebAssembly ในตัวที่สร้าง HTML จากซอร์สของ Forge
  • เมื่อเข้าชมโดยตรง เซิร์ฟเวอร์จะส่งทั้ง HTML และซอร์สต้นฉบับมาให้ และเมื่อย้ายหน้าระหว่างหน้า service worker จะรับซอร์สไปคอมไพล์ในเบราว์เซอร์
  • สถานะสามารถเก็บไว้ใน state, localStorage และ append-only log บนเซิร์ฟเวอร์ได้ โดย Forge ยังอยู่ในขั้นสำรวจความเป็นไปได้

แนวคิดพื้นฐานของ Forge

  • Forge เป็นภาษาเชิงทดลองสำหรับเขียนเว็บไซต์ด้วยภาษาที่อิงสแตก
  • สามารถนิยามแท็ก HTML เป็นคำ (word) แบบ Forth แล้วนำมาใช้ได้
    : h1  ( s -- )  "" emit  .  "
    
    

" emit ;

"Hello, World!" h1

- หากสร้างคลังสำหรับนิยามคำ ก็จะสามารถเพิ่ม **microformats** ให้กับ HTML ได้ง่าย
- เว็บไซต์ประกอบด้วยหน้าเว็บ คลังคำ และสไตล์ชีต
```text
my-site
├── lib.forge
├── style.css
└── pages
    ├── about.forge
    ├── hello.forge
    └── notes.forge
  • รันเว็บไซต์ด้วยไบนารีเพียงตัวเดียว
    forge --log forge.log my-site/
    

การเรนเดอร์และการจัดการสถานะ

  • ไบนารีของ Forge มี คอมไพเลอร์ WebAssembly ที่สร้าง HTML จากไฟล์ .forge อยู่ภายใน
  • เมื่อเข้าชมหน้าโดยตรง คอมไพเลอร์จะทำงานบนเซิร์ฟเวอร์ และส่งทั้งซอร์ส HTML จริงกับซอร์ส .forge ต้นฉบับมาพร้อมกัน
  • ระหว่างการย้ายหน้าระหว่างหน้า service worker จะดักคำขอเครือข่ายอย่าง /notes แล้วดึงซอร์ส /notes.forge มารันคอมไพเลอร์ในเบราว์เซอร์
  • โครงสร้างนี้ทำให้รองรับการเรนเดอร์ฝั่งเซิร์ฟเวอร์สำหรับ crawler และ 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 ;
    
  • ล็อกของเซิร์ฟเวอร์ใช้รูปแบบ JSONL ที่เก็บเอกสาร JSON หนึ่งรายการต่อหนึ่งบรรทัด
  • ฟอร์มสามารถส่งไปยังหน้า .forge อื่นได้ และข้อมูลที่ส่งมาจะถูกวางลงในสแตกของหน้าปลายทาง
  • การจัดเก็บข้อมูลฝั่งแบ็กเอนด์ต้องให้หน้าปลายทางจัดการผ่าน log-append
  • Forge ยังไม่ใช่เครื่องมือที่ยืนยันแล้วว่าจะนำไปใช้กับเว็บไซต์จริง แต่ยังอยู่ในขั้นสำรวจความเป็นไปได้ของภาษาเว็บขนาดเล็กที่อิงสแตก

1 ความคิดเห็น

 
ความคิดเห็นจาก Lobste.rs
  • ตัวอย่างบนสุดดูคล้ายกับวิธีที่ฉันทำเว็บไซต์ส่วนตัวมากจริง ๆ :)

    "hey"

    ฉันเคยพยายามรวบรวมคนที่ทำเว็บไซต์ด้วยภาษาประกอบแบบ concatenative language เพื่อทำอะไรคล้าย ๆ webring และแลกเปลี่ยนไอเดียกัน แต่แม้แต่ในชุมชน catlang ก็แทบหาคนที่ลองทำจริงจังไม่เจอ

    ถ้าในอนาคตมีใครมาอ่านเธรดเก่านี้แล้วกำลังมองหาคนที่ทำคล้ายกัน ถ้าคุณเคยทำเว็บไซต์ยาวเกินสัก 10 หน้า ไม่ได้ใช้ AI เลยในขั้นตอนใด ๆ และเขียนทั้งหมดด้วยภาษาประกอบไม่ว่ารูปแบบไหน ก็อยากให้บอกกันหน่อย ฉันอยากลองทำรายชื่อเว็บไซต์ตัวอย่างดู

    • https://stk.junglecoder.com เขียนทั้งหมดด้วยStackTalk รวมถึงตัว playground implementation ด้วย แต่ตอนนี้ขนาดไซต์ยังค่อนข้างเล็ก

      พอการสร้าง StackTalk ใหม่เข้าที่เข้าทางมากขึ้น ฉันวางแผนจะเติมส่วนนี้ให้ครบ หน้าเว็บบางหน้าของ https://junglecoder.com ก็ทำในแนวคล้ายกัน และล่าสุด https://junglecoder.com/blarg/tired-of-csharp.html ก็ทำแบบนั้นเหมือนกัน เว็บไซต์ส่วนใหญ่ยัง build ด้วย Mendoza แต่การใช้ StackTalk เป็นฐานของ static site generator นั้นสนุกมากพอสมควร เลยตั้งใจจะย้ายหน้าต่าง ๆ จาก Mendoza ไปเป็น pstk อย่างจริงจัง

    • ได้แรงบันดาลใจจากuxnอย่างชัดเจน

    • สวัสดี! ผมใช้minเป็น rules engine จริง ๆ กับบางเว็บไซต์ เช่น https://min-lang.org

      static site generator ของผม HastySite เขียนด้วย Nim และใช้ mustache สำหรับ template แต่ฟังก์ชันทั้งหมดถูกเปิดให้ใช้ผ่าน min API

      ตัวอย่างไฟล์ rules.min ที่ใช้กับเว็บไซต์ของภาษา min ดูได้ที่นี่

  • ตกใจเหมือนกันที่โพสต์บล็อกของผมมาโผล่ที่นี่ เป็นโพสต์ที่แทบไม่มีบริบทเลย ถ้ามีคำถามยินดีตอบครับ

    เพิ่มพื้นหลังอีกนิด Forge เขียนด้วย Rust และคอมไพล์ไปเป็น WebAssembly ซึ่งก็คือภาษาแบบ stack-based พร้อมกับ native web server ผมกำลังเดินทางอยู่สองสามวัน พอกลับมาแล้วสัปดาห์หน้าวางแผนจะปล่อยซอร์ส

    ผมชอบมากที่มันทำให้ประกอบบล็อกไปเรื่อย ๆ เพื่อสร้าง DSL สำหรับหน้าเว็บได้ง่าย มันแสดงพลังในการเขียนได้มากกว่าที่คาดไว้เยอะ

    งานนี้เป็นส่วนหนึ่งของซีรีส์ที่ผมใช้สำรวจวิธีทางเลือกในการเขียนเว็บไซต์

    • รู้สึกว่าภาษาแบบ concatenative/stack-based เหมาะกับงานแบบนี้มากจริง ๆ

      stack นั้นยอดเยี่ยมมากในการแสดงกระบวนการเดินหรือสร้าง tree และไวยากรณ์แบบ Forth ที่มีเครื่องหมายน้อยก็เข้ากันได้ค่อนข้างเป็นธรรมชาติกับโค้ดที่มีลักษณะเป็นเอกสาร

      ผมเขียนค้างไว้ครึ่งหนึ่งเกี่ยวกับไอเดียว่า ถ้าจะนำจิตวิญญาณของตัวอย่างเครื่องซักผ้าเก่าใน Starting Forth มาปรับให้ทันสมัย มันก็น่าจะกลายเป็นตัวอย่างการจัดการ The DOM ได้ และก็ดีใจที่เห็นคนอื่นจับปลายทางเดียวกันนี้เหมือนกัน