2 điểm bởi GN⁺ 2026-02-09 | 1 bình luận | Chia sẻ qua WhatsApp
  • Đây là dự án được thiết kế để chạy mã Scheme trên WebAssembly (trình duyệt hỗ trợ GC), bao gồm trình biên dịch Scheme→Wasm và bộ công cụ Wasm hoàn chỉnh
  • Được xây dựng dựa trên GNU Guile, không có phụ thuộc bổ sung và có cấu trúc tự chứa (toolchain self-contained)
  • Có thể kiểm thử nhị phân Hoot thông qua trình thông dịch Wasm trong môi trường Guile REPL
  • Phiên bản mới nhất là v0.7.0, kèm các liên kết tới tệp phát hành, chữ ký, tài liệu và thông báo chính thức
  • Đây là một nỗ lực mở rộng ngôn ngữ Scheme lên môi trường web, cho thấy tiềm năng mở rộng hệ sinh thái Lisp trên trình duyệt

Tổng quan về Hoot

  • Hoot là dự án do Spritely Institute phát triển, cho phép chạy mã Scheme trên WebAssembly (Wasm)
    • Hoạt động trên các trình duyệt web hỗ trợ tính năng GC (Garbage Collection)
    • Bao gồm trình biên dịch chuyển mã Scheme sang Wasm và bộ công cụ hoàn chỉnh cho phát triển liên quan đến Wasm
  • Được xây dựng trên Guile và không có thêm phụ thuộc bên ngoài
    • Bộ công cụ tự hoàn chỉnh và tích hợp trình thông dịch Wasm, cho phép kiểm thử trực tiếp nhị phân Hoot trong Guile REPL

Phát hành và phát triển

  • Bản phát hành mới nhất là phiên bản v0.7.0, cung cấp liên kết tới tệp tải xuống, chữ ký, tài liệu và thông báo chính thức
    • Tệp phát hành: guile-hoot-0.7.0.tar.gz
    • Đồng thời cung cấp tệp tài liệu, tệp chữ ký và trang tin tức liên quan
  • Phiên bản phát triển có thể truy cập tại kho Codeberg (https://codeberg.org/spritely/hoot)

Tài liệu liên quan

  • Có nhiều bài viết về các trường hợp sử dụng xây dựng trang web tương tác với Hootchạy Scheme trong trình duyệt
    • “Building interactive web pages with Hoot”
    • “Scheme in the browser: A Hoot of a tale”
    • “Lisp Game Jam - ‘Wireworld’ - Hoot's low level Wasm tooling in action”
  • Có thể xem thêm thông tin từ góc nhìn nhà phát triển qua blog của Andy Wingovideo phỏng vấn của System Crafters

1 bình luận

 
GN⁺ 2026-02-09
Ý kiến trên Hacker News
  • Thật thú vị khi thấy việc phát triển Guile gần đây trở nên sôi động hơn
    Tuy vậy cũng có chút tiếc nuối vì có vẻ khá nhiều người từ cộng đồng Racket trước đây đang chuyển sang đây
    Cộng đồng bị chia tách là điều đáng buồn, và Guile vẫn cho cảm giác còn thua Racket về hiệu năng lẫn độ đa dạng thư viện

    • Theo trải nghiệm của tôi thì lại ngược hẳn. Guile có tốc độ khởi động nhanh hơn Racket, và phần lớn công việc của tôi đều thiên về I/O, nên Guile phù hợp hơn
      Benchmark có thể cho ra kết quả khác, nhưng có lẽ vẫn nên tự kiểm chứng
    • Hiện Guile dùng kiến trúc bytecode VM + JIT, nên chậm hơn Chez/Racket nhưng vẫn khá nhanh
      Nhanh tới mức có thể chạy game ở 60fps, và GC cũng hiếm khi xảy ra
      Hệ sinh thái thư viện cũng đã cải thiện rất nhiều so với trước đây
    • Tôi nhớ từng đọc một bài blog nói rằng cộng đồng Racket trước đây từng có vấn đề “Missing Stair”
      (wiki về Missing Stair)
      Sau vụ đó, việc cộng đồng bị chia rẽ có vẻ là kết quả khó tránh khỏi
    • Tôi vui vì Guile đang được chú ý, nhưng cũng không nên đánh giá thấp Racket
      • Công việc về WASM của Guile rất hứa hẹn, và phía Racket cũng có Jens Axel Soegaard đang phát triển compiler liên quan
      • Việc rehost dựa trên Chez của Racket có vẻ là một lựa chọn đúng đắn, và cấu trúc nội bộ chắc cũng đã dễ xử lý hơn Guile
      • Racket vẫn mạnh về metaprogramminghệ thống module
        Ví dụ, có thể dùng Overeasy để viết test, và McFly để viết tài liệu inline
      • Dòng họ Scheme vẫn là ngôn ngữ dành cho những người không cần bận tâm đến “từ khóa xin việc”
        Tâm lý ngành gần đây trở nên khó khăn hơn sau AI code generationsự sụp đổ của đầu tư VC cũng có tác động
    • Tôi tò mò không biết Hoot, một implementation khác của Guile (ví dụ chạy trên V8), đã từng được benchmark hay chưa
  • Bản thân dự án thì rất hay, nhưng tôi vẫn nghĩ giá mà họ dùng một ngôn ngữ khác thay vì Guile

    • Dù sao thì Guile cũng là ngôn ngữ của Guix, nên hệ sinh thái khá phong phú
      Có thể dễ dàng tạo reproducible build thông qua Guix
      Tuy nhiên, các vấn đề liên quan đến debugger, macro expander, và thư viện chuẩn R6RS vẫn còn tồn tại
      Hỗ trợ multicore của Racket trước đây khá nặng, nhưng giờ có vẻ đã cải thiện nếu so với fibers/futures của Guile
    • Nếu ý là nên dùng một implementation Scheme khác thay vì Guile, thì chỉ cần viết theo cú pháp chuẩn R6RS/R7RS là việc port sẽ không quá khó
  • Thật mừng khi lại thấy những nỗ lực kiểu này để compile sang WASM
    Trước đây tôi cứ tưởng nhiệt đã nguội rồi, nhưng nếu ngày càng có nhiều ngôn ngữ như vậy thì sẽ rất tốt vì có thể tránh JavaScript

  • Dự án này khiến tôi nghĩ về định hướng tương lai của ngôn ngữ lập trình
    Nếu AI trở thành bên viết code chủ đạo, ngôn ngữ có lẽ sẽ chuyển sang ưu tiên tính rõ ràng và giảm lỗi
    Sẽ bớt thú vị hơn với con người, nhưng là loại code dễ chỉnh sửa hơn
    Trong bối cảnh đó, những ngôn ngữ như Rust có lẽ sẽ đứng đầu bảng
    Tuy nhiên tôi vẫn tò mò liệu một ngôn ngữ như Hoot có thể giành được chỗ đứng trong các lĩnh vực chuyên môn hay sẽ chỉ dừng ở mức ngôn ngữ cho dân chơi/hobby

    • Tôi cũng từng tự hỏi ngôn ngữ lấy AI làm trung tâm sẽ trông như thế nào, và có lẽ họ Scheme/Lisp mới là hướng gần với điều đó
  • Thật sự rất ngầu! Không biết liệu nó có thể chạy trên Cloudflare Workers không

  • Mong Guile sẽ hỗ trợ Windows tốt hơn một chút

  • repl.wasm có dung lượng 1.6MiB nên có vẻ hơi lớn. Không biết ví dụ todo thì sẽ là bao nhiêu

    • REPL này không phải binary nhỏ nhất, nhưng khi nén gzip thì còn 339K
      Vẫn chưa áp dụng tối ưu hóa wasm-opt
      Hoot là một AOT compiler, nên trong REPL có thêm mã cho macro expander, hệ thống module runtime, interpreter, v.v.
      Ví dụ thực tế là todo.wasm có kích thước khoảng 566K (143K khi nén), và còn bao gồm cả thuật toán diff virtual DOM
      Với các tối ưu hóa bổ sung như giảm số biến cục bộ hoặc áp dụng đề xuất stack switching, có lẽ kích thước sẽ còn giảm thêm
      Vấn đề liên quan được tổng hợp tại đây
  • woot (cảm thán ngắn)

  • Đây mới đúng là hình hài mà JavaScript vốn hướng tới
    Nếu Netscape không ép dùng cú pháp kiểu C/Java, thì có lẽ nó đã trở thành một ngôn ngữ như thế này