4 điểm bởi GN⁺ 2023-09-06 | 1 bình luận | Chia sẻ qua WhatsApp
  • Watlings là một dự án thực hành để học WebAssembly Text Format bằng cách sửa nhiều chương trình nhỏ
  • Mỗi bài tập được hoàn thành theo hướng dẫn trong thư mục exercises, và đáp án được kiểm tra bằng cách chạy npm start 001_hello
  • Để xem lời giải, dùng lệnh npm run show 001_hello; để áp dụng trực tiếp lời giải vào bài tập, dùng npm run solve 001_hello
  • Việc biên dịch và kiểm thử sử dụng Node 23+ cùng wasm-tools, và bên trong script sẽ gọi wasm-tools parse
  • Các bài tập từ số 015 trở đi sử dụng những tính năng WebAssembly mới hơn như exception handling và GC types, đồng thời cần cờ --experimental-wasm-exnref chỉ có trên Node.js 23 trở lên
  • Dự án cung cấp phiên bản web có thể chạy trong trình duyệt, và khuyến nghị dùng VSCode cùng tiện ích mở rộng wat-lsp làm trình soạn thảo
  • Cách học này theo hướng tự tay viết là chính, trong đó công việc và bối cảnh được trình bày qua chú thích trong từng file, giảm phần giải thích xuống mức tối thiểu và giúp người học lặp lại tiếp xúc với cú pháp trong các ngữ cảnh khác nhau
  • Dự án cũng nêu rustlingsZiglings như các ví dụ tham khảo về cấu trúc dự án

1 bình luận

 
GN⁺ 2023-09-06
Ý kiến trên Hacker News
  • Tôi thường thấy điều này ở nhiều nơi: thứ còn thiếu trong WASM trên trình duyệt không chỉ là truy cập DOM, mà là gần như toàn bộ API web, bao gồm cả fetch hay XMLHttpRequest
    Danh sách các API web được trình duyệt hỗ trợ nhưng WASM chưa hỗ trợ nằm ở đây, và DOM chỉ là một trong số đó: https://developer.mozilla.org/en-US/docs/Web/API
    Dù vậy, nếu GC được chốt và được trình duyệt hỗ trợ thì có khả năng các giao diện như vậy sẽ dùng được. Tài liệu nói rằng khi GC được hỗ trợ, mã WebAssembly có thể tham chiếu và truy cập JavaScript, DOM, cũng như các đối tượng được định nghĩa bằng WebIDL thông thường
    Xem đoạn cuối: https://webassembly.org/docs/web/

    • Đề xuất GC đã xuất hiện từ năm 2018 https://github.com/WebAssembly/proposals/issues/16, và cũng đã có mã: https://github.com/WebAssembly/gc/blob/master/proposals/gc/O...
      Xét đến những khả năng mà nó có thể mở ra, tiến độ có vẻ quá lâu
    • Nếu “giải quyết” được chuyện đó thì cũng có nguy cơ trở thành Java Applets thế hệ tiếp theo
    • Tôi không theo dõi WebAssembly liên tục, nhưng thấy tò mò vì sao thứ từng được gọi là “thuốc chữa” cho JS ngày xưa lại mất nhiều thời gian đến vậy để có được chức năng cơ bản
  • Trông rất giống mô hình của Exercism. Exercism cũng có một khóa WASM miễn phí gồm các bài tập nhỏ: https://exercism.org/tracks/wasm
    Tôi tự hỏi tác giả có cân nhắc đóng góp cho khóa đó hoặc hợp tác với họ không. Như vậy có thể tiếp cận độc giả rộng hơn và tận dụng được các công cụ sẵn có của Exercism

    • Tôi rất thích Exercism, nhưng mô hình bài tập ở đó tự do hơn nhiều, các phần lớn hơn hẳn và tương đối ít mang tính giảng dạy hơn
      Trong một số ngữ cảnh thì đó là mô hình tốt, nhưng định dạng của kho này gần với rustlings hay ziglings hơn, nơi học cú pháp và tính năng thông qua ví dụ mã
      Mô-đun Wasm của Exercism không hẳn là “bị hỏng”, nên tôi không chắc đóng góp của mình có được hoan nghênh không
    • Điều tôi không thích ở Exercism là, trừ các ngôn ngữ phổ biến, bài tập nhìn chung không có hệ thống
      Nói cách khác, nó gần giống một bộ bài kiểu LeetCode được sắp theo độ khó
      Một khóa học đúng nghĩa nên sắp xếp bài tập theo từng tính năng của ngôn ngữ. Exercism đã xây dựng một giao diện tuyệt vời cho việc này, nhưng phần lớn ngôn ngữ lại không tận dụng: https://exercism.org/tracks/csharp/concepts
  • Một trong những cách tôi thích để học ngôn ngữ hoặc framework mới là koans, và cái này làm tôi nhớ đến chúng: https://github.com/ahmdrefat/awesome-koans/blob/master/koans...
    Việc tăng dần mượt mà từ tính năng cơ bản đến nâng cao, nhìn thấy test thất bại, hiểu lý do rồi sửa theo kiểu TDD rất hợp cho việc học. Nó còn đem lại chút dopamine của khoảnh khắc “à ha!” nữa

    • Nghe như một cách hay để tự học ngôn ngữ. Tiếc là thiếu Rust; không biết có ai gợi ý được liên kết nào không
  • Nếu muốn thử nghiệm các tính năng như GC của WASM thì nên dùng wasm-opt của Binaryen thay vì WABT. wasm-opt hỗ trợ nhiều phần mở rộng WASM hơn hẳn

  • Khá tuyệt
    Tôi chưa trực tiếp đào sâu vào WASM, nhưng hướng dẫn này thì tôi định thử, và tôi nghĩ đến nay, sau vài năm, nó đã mang lại lợi ích lớn cho phát triển web
    Nó không phải “sát thủ JavaScript” như một số người từng kỳ vọng, nhưng ngay từ đầu mục tiêu cũng không phải vậy. Thay vào đó, nó tích hợp khá tốt với hệ sinh thái hiện có để tối ưu các trường hợp sử dụng hiện tại, và khi cần tính toán nặng thì cũng mở ra các trường hợp sử dụng mới
    Đây là lợi ích ròng cho mọi nhà phát triển web. Ta có thư viện nhanh hơn, công cụ phát triển ấn tượng hơn, và các binary Node có tính di động tốt hơn

    • Tôi chỉ theo dõi WASM từ xa, và hiểu rằng lý do nó không phải sát thủ JS là vì không thể truy cập trực tiếp DOM hay phần lớn API DOM
      Không biết còn lý do nào khác mà tôi bỏ sót không
  • Rất vui khi thấy việc ứng dụng WebAssembly tiếp tục tiến triển. Ở đây Microsoft thường chỉ được nhắc đến thoáng qua, nhưng nếu quan tâm đến WASM thì rất nên thử nghiệm Blazor WebAssembly
    Đây là một framework rất mạnh, cho phép dùng C#, phần lớn thư viện .NET, thậm chí cả gói NuGet, dưới dạng WASM đã biên dịch trong trình duyệt

    • Khi nói “phần lớn gói NuGet”, tôi tò mò giới hạn là gì
      Nếu một gói cần đọc tệp trên đĩa thì nó sẽ lỗi ngay, hay giao diện đọc tệp sẽ chuyển thao tác đó sang một cơ chế như render phía máy chủ?
    • Theo những gì tôi đọc, có vẻ nó gặp cùng vấn đề như khi biên dịch Go sang WASM. Payload lớn, và ngay cả sau khi nén thường vẫn nhiều MB
  • Dự án hay đấy
    Tôi đang duy trì một kho có liên quan phần nào ở đây: https://github.com/eliben/wasm-wat-samples/

    • Trông thật sự hữu ích. Giá mà tôi biết đến nó khi mới học wat; có vẻ sẽ là tài liệu tham khảo rất tốt
  • Tôi đã thử WASM, nhưng gặp vấn đề khi phơi bày kết nối cơ sở dữ liệu SQLite mà tôi muốn kết nối cục bộ
    Không biết có ai từng làm thứ tương tự hoặc có tài liệu hay nào để gợi ý không

  • Thật thú vị khi WebAssembly trông giống một ngôn ngữ thực sự có thể viết tay ở mức nào đó
    Tôi nghĩ điều đó sẽ hạ thấp đáng kể rào cản gia nhập khi chọn nó làm mục tiêu

  • Khi WebAssembly đang trở thành ngôn ngữ chung của nhiều hệ sinh thái, việc đầu tư thời gian để hiểu vững cách nó hoạt động ngày càng đáng giá