Goeteia: Trình biên dịch Scheme tự lưu trữ sống trong trình duyệt của bạn qua Wasm GC
Goeteia là trình biên dịch Scheme tự lưu trữ, tự biên dịch sang WebAssembly GC ngay trong trình duyệt — không cần máy chủ, chỉ cần một tệp wasm nén 70 KB và một ngăn xếp web phản ứng.
Goeteia là trình biên dịch Scheme chạy hoàn toàn trong trình duyệt của bạn. Trang bạn đang đọc được biên dịch trực tiếp từ mã nguồn Scheme sang WebAssembly GC, không cần biên dịch phía máy chủ. Toàn bộ trình biên dịch là một tệp goeteia.wasm duy nhất (~70 KB nén, được lưu vào bộ nhớ đệm sau lần tải đầu tiên) và quá trình biên dịch lại mất khoảng 15 ms.
Tự lưu trữ đến từng byte
Trình biên dịch được viết bằng tập con của Scheme mà nó biên dịch. Bản dựng tự lưu trữ tự biên dịch lại chính nó, và đầu ra giống hệt nhau từng byte — một điểm cố định được kiểm tra trong CI sau mỗi thay đổi. Mọi bài kiểm tra đều chạy qua cả hai giai đoạn để đảm bảo tính chính xác.
Đối tượng Wasm GC gốc
Fixnum là i31ref không đóng hộp, cặp và bản ghi là cấu trúc GC, và eq? là một ref.eq duy nhất. Không có heap ẩn trong JavaScript: máy chủ chỉ cung cấp hai import luồng byte.
Macro hợp vệ sinh và bao đóng thực sự
Goeteia hỗ trợ syntax-rules và syntax-case thủ tục với fender, dấu ba chấm lồng nhau và datum->syntax. Bao đóng sử dụng tham chiếu hàm có kiểu với điểm vào nhanh theo số tham số và điểm vào chung cho các thủ tục biến đổi. Mọi lời gọi đuôi đều là return_call, do đó vòng lặp 100 triệu lần chạy với ngăn xếp không đổi trong khoảng 150 ms.
call/cc và dynamic-wind
Tiếp tục thoát sử dụng đề xuất xử lý ngoại lệ Wasm: capture là O(1), đường dẫn thường tốn một khối try, và winder mở ra từ trong ra ngoài khi thoát.
Ngăn xếp web phản ứng và 3D
Mô-đun (web sx) cung cấp các mẫu phản ứng trên các tín hiệu chi tiết, một trình kết xuất HTML và một FFI JavaScript. Mô-đun (web three) xây dựng các cảnh Three.js phản ứng, trong khi (web gl) điều khiển WebGL thô qua bộ đệm lệnh — một lời gọi cầu nối mỗi khung hình — với shader được viết dưới dạng s-expression trong (web glsl).
RPC Scheme-to-Scheme
Khi backend cũng là Scheme (Igropyr), các yêu cầu và phản hồi là s-expression. (rpc "/rpc" '(add 1 2 1/2)) trả về (ok 7/2) với số hữu tỉ chính xác. Mô-đun (web fetch) sử dụng Wasm JSPI kiểu trực tiếp; (web ws) và (web sse) đẩy các luồng dữ liệu; (web json) xử lý phần còn lại.
Bắt đầu nhanh
$ git clone https://github.com/guenchi/Goeteia
$ cd Goeteia
$ ./run-tests.sh
$ ./build-self.sh
$ echo '(define (fact n) (if (zero? n) 1 (* n (fact (- n 1)))))
(fact 20)' > fact.ss
$ node rt/compile.mjs goeteia.wasm fact.ss fact.wasm
$ node rt/run.mjs fact.wasm
2432902008176640000Các mô-đun đã biên dịch chạy trên bất kỳ engine nào có Wasm GC và lời gọi đuôi: Node 22+, Chrome/Firefox/Safari hiện tại và wasmtime. Khởi động từ mã nguồn cần Chez Scheme; trình biên dịch wasm đã kiểm tra hoạt động mà không cần nó.
Thảo luận
0 bình luận
Hãy là người đầu tiên thảo luận.