11 điểm bởi GN⁺ 2025-03-30 | 1 bình luận | Chia sẻ qua WhatsApp
  • Xee là một engine thực thi XML được phát triển bằng Rust, hỗ trợ các phiên bản mới nhất của XPath 3.1 và XSLT 3.0
    • XPath là ngôn ngữ truy vấn XML, còn XSLT là ngôn ngữ dùng để chuyển đổi tài liệu XML sang tài liệu khác
  • Dự án gồm công cụ dòng lệnh xee và thư viện Rust xee-xpath, có thể thực thi các truy vấn XPath
  • Dựa trên hiệu năng và khả năng tích hợp của Rust, nó có thể được mở rộng sang nhiều ngôn ngữ khác nhau (ví dụ: đã có binding cho PHP)
  • Trong tương lai, dự kiến cũng có thể chạy trên trình duyệt thông qua WebAssembly (WASM)

Lịch sử của XML và vị thế hiện nay

  • XML xuất hiện vào cuối thập niên 1990 và từng là công nghệ cực kỳ phổ biến cho đến đầu những năm 2000
  • Sau đó, với sự xuất hiện của JSON và các định dạng khác, XML không còn là xu hướng chủ đạo, nhưng vẫn được dùng rộng rãi trong lưu trữ và truyền dữ liệu, cũng như trong các định dạng tài liệu (docbook, JATS) hay một phần của web (SVG, MathML)
  • XML vẫn là một công nghệ quan trọng, và Xee hướng tới việc hiện đại hóa hệ sinh thái công nghệ XML
  • Tác giả từng tạo ra thư viện XML lxml cho Python, nên là một nhà phát triển hiếm hoi hiểu sâu cả Rust lẫn XML, và đang quay lại với thế giới XML thông qua Xee

XPath và XSLT là những ngôn ngữ lập trình hoàn chỉnh

  • XPath là ngôn ngữ dùng để điều hướng và truy vấn XML; với tính chất là một ngôn ngữ hàm, nó có biến, câu lệnh điều kiện, vòng lặp, định nghĩa hàm và nhiều thành phần khác
  • XSLT là ngôn ngữ chuyển đổi dựa trên template, sử dụng XPath làm ngôn ngữ biểu thức nhúng để chuyển XML sang các định dạng khác
  • Cả hai đều là những ngôn ngữ lập trình chính thức với năng lực rất mạnh

Giới hạn của stack XML mã nguồn mở hiện nay

  • Trong hệ sinh thái Java, có Saxon như một triển khai XPath/XSLT hiện đại, đồng thời cung cấp nhiều binding ngôn ngữ và cả runtime JavaScript
  • Trong khi đó, phần lớn các bản phân phối Linux mặc định cung cấp libxml2libxslt
  • Các thư viện C này chỉ hỗ trợ XPath 1.0 và XSLT 1.0, tức vẫn dừng ở đặc tả được ban hành từ năm 1999
  • Trong bối cảnh thiếu các lựa chọn mã nguồn mở hỗ trợ đặc tả mới, Xee đưa ra một phương án thay thế hiện đại được viết bằng Rust

Văn hóa lấy đặc tả làm trung tâm trong thế giới XML

  • Cộng đồng XML có văn hóa rất nặng về đặc tả → nếu một tính năng không có trong đặc tả thì sẽ không được xem là tính năng “thật sự”
  • Nhờ vậy tốc độ phát triển có thể chậm, nhưng nền tảng thì rất vững chắc
  • RESTXQ, framework REST cho XPath và XQuery, đã được thảo luận từ năm 2012 và đến tận 2024 vẫn còn đang bàn về các cập nhật đặc tả

Kiến trúc triển khai ngôn ngữ của Xee

  • Việc triển khai tham khảo cuốn Crafting Interpreters
  • XPath đi qua các bước token hóa → AST → biểu diễn trung gian (IR) → bytecode → thực thi bằng trình thông dịch
  • Trình thông dịch bytecode này tương tự stack machine được dùng trong Python, Java và nhiều ngôn ngữ khác
  • XSLT cũng được triển khai trên cùng kiến trúc; chỉ frontend là khác, còn các thành phần còn lại được dùng chung với XPath

Thế giới đặc tả XML/XPath/XSLT đồ sộ

  • XPath 3.1 và XSLT 3.0 phức tạp hơn rất nhiều và có nhiều tính năng hơn so với phiên bản 1.0
  • Chỉ riêng các tài liệu đặc tả cần tham chiếu để triển khai đã dài hơn 1800 trang, và nhiều đặc tả còn phụ thuộc lẫn nhau
  • Ví dụ:
    • XPath 3.1, Mô hình dữ liệu XQuery/XPath, Hàm và toán tử, XML Schema (cấu trúc/kiểu dữ liệu)
    • XSLT 3.0, Đặc tả tuần tự hóa, Không gian tên XML, XML Base, xml:id v.v.
    • Do còn bao gồm cả tính năng biểu thức chính quy, dự án cũng triển khai một regex engine riêng → regexml

Tình trạng triển khai hiện tại của Xee

  • Đã hoàn thành phần ngôn ngữ cốt lõi của XPath 3.1 cùng phần lớn thư viện chuẩn
  • Một số hàm liên quan đến định dạng trong thư viện chuẩn vẫn chưa được triển khai
  • Trong bộ kiểm thử tương thích XPath 3.1, Xee vượt qua 20130 trên tổng số 21859 bài kiểm thử (khoảng 92%)
  • Toàn bộ kiểm thử chạy xong trong khoảng 13 giây → hiệu năng rất nhanh
  • XSLT vẫn chưa hoàn thiện, nhưng nền tảng kiến trúc đã sẵn sàng để tiếp tục mở rộng

Tìm kiếm người đóng góp

  • Hoan nghênh các nhà phát triển quan tâm đến Rust và XML, hoặc hứng thú với việc triển khai ngôn ngữ lập trình hay tối ưu hóa truy vấn
  • Có thể đóng góp ở nhiều mảng như triển khai tính năng theo đặc tả, tối ưu hóa, cải thiện hiệu năng truy vấn v.v.
  • Xee đang ở thời điểm cần sự hỗ trợ từ cộng đồng mã nguồn mở như một triển khai XML hiện đại bên ngoài hệ sinh thái Java

Tôi vẫn còn rất thời thượng. Dù là đang làm việc với XML.

1 bình luận

 
GN⁺ 2025-03-30
Ý kiến trên Hacker News
  • Thật vui khi thấy có người tạo ra một bản triển khai XSLT 3 và XPath 3 mã nguồn mở đúng nghĩa

    • Trong các dự án trước đây tôi chỉ dùng XSLT & XPath 1.0, vì ngoài hệ Java/.NET thì hỗ trợ khá thiếu thốn
    • Saxon rất tuyệt, nhưng tôi vẫn mong trong thế giới mã nguồn mở sẽ có thêm nhiều bản triển khai XSLT 2.0 và XPath 2.0 trở lên
    • XSLT 3.0 là một đặc tả rất tốt, nhưng cần thêm những cách khác để chạy nó theo hướng mã nguồn mở
  • Có một lượng lớn nguồn XML đang tồn tại

    • Ví dụ, kho lưu trữ Wikipedia là 42GB văn bản chưa nén
    • Nếu lưu nó trong bộ nhớ dưới dạng đã được parse hoàn toàn thì có thể cần hơn 100GB
    • Streaming là lời giải, nhưng hiện vẫn chưa được hỗ trợ
  • Việc dùng XML vẫn rất ngầu

    • Cần có một thư viện hiệu năng cao, chất lượng cao được viết bằng Rust
    • Một thư viện Python dựa trên đó có thể trở thành nền tảng tốt
  • XML là một cách tiếp cận dựa trên tiêu chuẩn cho khả năng tương tác dữ liệu

    • Khi mới học, tôi ghét nó vì nó không thân thiện với lập trình viên
    • Nhưng giờ tôi đã hiểu giá trị của một tiêu chuẩn lâu đời
    • XML trông giống như chuẩn dữ liệu mà máy tính ưa thích
  • XSLT vẫn được hỗ trợ rộng rãi trên các trình duyệt lớn

  • Việc có thể biên dịch sang WASM là một điểm tích cực

    • Đã từng có lúc nhóm Chrome định gỡ bỏ hỗ trợ libxml và XSLT
    • Đây là bằng chứng cho thấy công việc xây dựng công cụ nền tảng quan trọng đến mức nào
  • Gần đây tôi đã viết một trình transpiler XSLT 2

    • Viết engine XPath là phần khó nhất
  • Tôi tò mò không biết XPath và XSLT hiện nay giải quyết bài toán nào một cách thanh lịch

  • Tôi thích làm việc ngoài hệ sinh thái Java

    • Việc trình đọc XML có khả năng phục hồi lỗi là rất quan trọng
  • Tôi tự hỏi liệu một ngày nào đó bản triển khai này có thể được dùng cho phần triển khai MSXML trong Wine hay không

    • Trước đây tôi từng viết một bản triển khai XPath 1.1 cho Wine, nhưng đã không thể merge nó vào được