2 điểm bởi GN⁺ 2025-07-11 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp
  • Flix là một ngôn ngữ hướng hiệu ứng do Aarhus University và cộng đồng mã nguồn mở phát triển, kết hợp lập trình hàm, mệnh lệnh và logic trong một ngôn ngữ
  • Cốt lõi là hệ thống hiệu ứng xử lý tác dụng phụ ở cấp độ kiểu; nó nâng cao tính mô-đun và khả năng suy luận thông qua theo dõi độ thuần khiết, hiệu ứng do người dùng định nghĩa, handler và multi-shot resumptions
  • Bề mặt ngôn ngữ rất rộng, bao gồm kiểu dữ liệu đại số, pattern matching, record có thể mở rộng, trait, kiểu kind bậc cao, kiểu và hiệu ứng liên kết, concurrency có cấu trúc, khả năng tương tác Java, cùng Datalog tích hợp sẵn
  • Thư viện chuẩn cung cấp hơn 3.100 hàm, đồng thời có thể truy cập hệ sinh thái Java thông qua Maven, hướng tới phạm vi sử dụng vượt ra ngoài một ngôn ngữ nghiên cứu
  • Trình biên dịch nhắm tới JVM bytecode, có kiến trúc song song và tăng dần, nêu mức tăng tốc 5x–7x trên máy 24 nhân và thông lượng 60.159 lines/sec trên Apple M2 Pro/OpenJDK 21

Định hướng ngôn ngữ của Flix

  • Flix là một ngôn ngữ hướng hiệu ứng dựa trên nguyên tắc, kết hợp lập trình hàm, mệnh lệnh và logic
  • Đơn vị phát triển là Aarhus University và cộng đồng người đóng góp mã nguồn mở
  • Hệ thống hiệu ứng là trụ cột cốt lõi của ngôn ngữ kiểu tĩnh, mô hình hóa tác dụng phụ một cách tường minh để hỗ trợ tính mô-đun và suy luận về chương trình
  • Thông qua hiệu ứng do người dùng định nghĩa và handler, lập trình viên có thể tự triển khai các cấu trúc điều khiển
  • Trong số các ngôn ngữ hướng hiệu ứng, Flix nhấn mạnh các điểm mạnh như triển khai hoàn thiện, thư viện chuẩn rộng, tài liệu chi tiết và hỗ trợ công cụ

Kiểu, độ thuần khiết và hệ thống hiệu ứng

  • Flix hỗ trợ kiểu dữ liệu đại số và pattern matching, các yếu tố cơ bản của lập trình hàm
  • Tuple và record được hỗ trợ tích hợp; record dùng structural typing và có thể mở rộng
  • Trình biên dịch theo dõi chính xác độ thuần khiết của mọi biểu thức trong chương trình
    • Nếu một biểu thức là thuần khiết, nó được bảo đảm không có tác dụng phụ và có tính minh bạch tham chiếu
  • Ngay cả với hàm bậc cao, độ thuần khiết cũng được theo dõi bằng đa hình hiệu ứng
    • Ví dụ, độ thuần khiết của List.map phụ thuộc vào độ thuần khiết của hàm f nhận làm đối số
  • Hiệu ứng đại số cho phép hiệu ứng do người dùng định nghĩa và handler
    • Flix đặc biệt hỗ trợ multi-shot resumptions
    • Effect handler được dùng để tăng khả năng suy luận về chương trình, tính mô-đun và khả năng kiểm thử

Thay đổi dựa trên region và phản ánh độ thuần khiết

  • Flix hỗ trợ thay đổi cục bộ dựa trên region, cho phép dùng trạng thái có thể thay đổi và phép toán phá hủy ở bên trong nhưng vẫn trông như hàm thuần khiết ở bên ngoài
  • Cách này phù hợp với các hàm được viết tự nhiên hơn bằng dữ liệu có thể thay đổi, hoặc các trường hợp cấu trúc dữ liệu có thể thay đổi hiệu quả hơn như thuật toán sắp xếp
  • Phản ánh độ thuần khiết là một cấu trúc metaprogramming trong đó hàm bậc cao kiểm tra độ thuần khiết của đối số hàm và thay đổi hành vi dựa trên thông tin đó
    • DelayList.map thay đổi hành vi giữa đánh giá tức thì và đánh giá trì hoãn tùy theo độ thuần khiết của hàm đối số
    • Ngay cả khi thư viện nội bộ chọn dùng đánh giá trì hoãn hoặc đánh giá song song, ngữ nghĩa nhìn từ phía client vẫn có thể không thay đổi

Song song, đồng thời và trừu tượng hóa

  • Flix giúp dễ đánh giá mã thuần khiết song song, và có thể viết triển khai song song của List.map bằng cấu trúc par
  • Cấu trúc par dùng VirtualThread nhẹ ở bên trong
  • Flix hỗ trợ concurrency có cấu trúc, nên các thread được tạo trong một region cụ thể không thể sống lâu hơn vòng đời của region đó
    • Trong ví dụ, hai thread được tạo trong một region mới tên là rc
    • Luồng điều khiển không rời khỏi region cho đến khi cả hai thread kết thúc
  • Flix dùng trait cho trừu tượng hóa kiểu hỗ trợ các phép toán chung
    • Trait Eq biểu diễn khái niệm bằng nhau và được dùng xuyên suốt thư viện chuẩn
  • Có thể trừu tượng hóa type constructor bằng kiểu kind bậc cao
    • Cả OptionList đều triển khai Foldable
    • Thư viện chuẩn bao gồm các trait chung như Monoid, Functor, Foldable

Kiểu/hiệu ứng liên kết và for-yield

  • Flix hỗ trợ kiểu liên kết, cho phép kiểu trong chữ ký instance phụ thuộc vào kiểu instance
    • Ví dụ trait Coll cho phép mỗi instance collection định nghĩa kiểu phần tử thông qua kiểu liên kết Elm
  • Hiệu ứng liên kết cho phép hiệu ứng của thành viên trait phụ thuộc vào kiểu instance
    • Dễ trừu tượng hóa chung các phép toán thuần khiết và có hiệu ứng, cũng như cấu trúc dữ liệu có thể thay đổi và bất biến
    • Nếu thêm hiệu ứng liên kết Aef vào trait Coll, có thể thêm các instance collection có thể thay đổi
  • forM-yield là một cấu trúc đơn tử tương tự for-comprehension của Scala và ký pháp do của Haskell
    • Đây là cú pháp tiện lợi để dùng pointflatMap do trait Monad cung cấp
  • forA là biểu thức applicative dựa trên trait Applicative
    • Đây là cấu trúc giúp viết dễ hơn mã xử lý lỗi dùng kiểu dữ liệu Validation[e, t]

Khả năng tương tác Java và Datalog

  • Flix hỗ trợ khả năng tương tác Java, cho phép tái sử dụng Java Standard Library và mã trong hệ sinh thái Java
    • Bao gồm truy cập hệ sinh thái thông qua Maven
    • Hỗ trợ tạo đối tượng, gọi phương thức, ngoại lệ, mở rộng class và interface
  • Hỗ trợ Datalog tích hợp là một trong những tính năng độc đáo của Flix
    • Datalog có thể biểu diễn ngắn gọn nhiều bài toán điểm cố định, bao gồm bài toán reachability trên đồ thị
  • Ràng buộc Datalog là giá trị hạng nhất
    • Có thể truyền vào hàm hoặc trả về từ hàm
    • Có thể lưu trong cấu trúc dữ liệu
    • Có thể hợp thành với các ràng buộc Datalog khác và giải chúng
    • Nhờ đó có thể biểu diễn các họ chương trình Datalog
  • Flix cũng hỗ trợ ràng buộc Datalog được làm giàu bằng ngữ nghĩa lattice
    • Có ví dụ tính ngày giao hàng của linh kiện và linh kiện con
    • Một chiếc xe phụ thuộc vào khung gầm và động cơ; chỉ sau khi chờ lắp ráp từng thành phần mới có thể lắp ráp xe
    • Các linh kiện con cũng có thể phụ thuộc vào những linh kiện con khác, khiến bài toán có tính đệ quy
  • Ràng buộc Datalog có ngữ nghĩa lattice là một trong những tính năng nâng cao của Flix và cần kiến thức nền về lý thuyết lattice và điểm cố định

Thư viện chuẩn và danh sách tính năng

  • Flix bao gồm thư viện chuẩn cung cấp hơn 3.100 hàm
    • Module List cung cấp hơn 100 hàm
    • Trait Foldable cung cấp hơn 47 hàm
    • Có thể khám phá toàn bộ thư viện tại api.flix.dev
  • Danh sách tính năng bao gồm
    • Kiểu dữ liệu đại số, pattern matching, hàm hạng nhất
    • Record có thể mở rộng, đa hình tham số
    • Trait, kiểu kind bậc cao, kiểu và hiệu ứng liên kết
    • Đa hình hiệu ứng và hiệu ứng con, phản ánh độ thuần khiết
    • Concurrency kiểu CSP, kênh có buffer và kênh không buffer
    • Ràng buộc Datalog hạng nhất, khả năng tương tác Java
    • Kiểu nguyên thủy unboxed, cú pháp dựa trên từ khóa
    • forM, forA, expression hole
    • Biên dịch sang JVM bytecode, loại bỏ hoàn toàn tail call
    • Kiến trúc trình biên dịch đàn hồi và song song, lỗi dễ đọc với con người

Kiến trúc và hiệu năng trình biên dịch

  • Trình biên dịch Flix có kiến trúc đàn hồi, tăng dần và song song
  • Mọi giai đoạn của trình biên dịch đều song song, có thể tận dụng tăng tốc của từng giai đoạn trên máy 24 nhân
  • Trên máy đa nhân, có thể đạt mức tăng tốc 5x–7x
  • Khi biên dịch lại mã đã được biên dịch trong cùng một instance trình biên dịch, biên dịch tăng dần có thể đem lại cải thiện tốc độ đáng kể
  • Các số liệu hiệu năng trên Apple M2 Pro CPU 10 nhân và OpenJDK 21 như sau
    • Thông lượng toàn bộ trình biên dịch: 60.159 lines/sec
    • Thông lượng chỉ frontend: 140.382 lines/sec
    • Lệnh tái hiện là java -jar flix.jar Xperf --n 21java -jar flix.jar Xperf --frontend --n 21
  • Hiệu năng này đạt được trong khi vẫn hỗ trợ các tính năng ngôn ngữ tốn kém như suy luận kiểu/hiệu ứng, đơn hình hóa và tối ưu hóa toàn chương trình
  • Hiệu năng trình biên dịch chủ yếu được quyết định bởi hiệu năng CPU và băng thông bộ nhớ

Hỗ trợ Visual Studio Code và tích hợp công cụ

  • Trình biên dịch Flix được tích hợp với Visual Studio Code để cung cấp môi trường phát triển
  • Extension VSCode dùng chính trình biên dịch Flix thật, nên có tương ứng 1:1 giữa extension và trình biên dịch
    • Nếu VSCode không báo lỗi thì không có lỗi
    • Khi không có lỗi, VSCode không báo lỗi giả
  • Extension VSCode hỗ trợ các tính năng sau
    • Tô sáng cú pháp dựa trên ngữ nghĩa
    • Chẩn đoán lỗi trình biên dịch inline
    • Tự động hoàn thành khi nhập, tự động hoàn thành nhận biết ngữ cảnh, tự động hoàn thành instance trait, hoàn thành hole dựa trên kiểu
    • Snippet và inlay hint
    • Hover hiển thị kiểu và hiệu ứng của biểu thức
    • Nhảy tới định nghĩa hàm, biến cục bộ, enum
    • Tìm tham chiếu hàm, biến cục bộ, enum và tìm triển khai trait
    • Danh sách symbol của tài liệu và workspace
    • Đổi tên biến cục bộ và hàm
    • Chạy main và chạy test trong editor
  • Flix tích hợp trực tiếp nhiều công cụ vào trình biên dịch
    • OCaml dùng ocaml-lsp làm LSP, utop làm REPL, dune làm công cụ build và opam làm trình quản lý gói
    • Haskell dùng HLS làm LSP, ghci làm REPL, cabal, stack làm công cụ build và trình quản lý gói, Hackage làm kho gói
    • Flix cung cấp trình biên dịch, LSP, REPL, công cụ build và trình quản lý gói đều qua flix, còn kho gói là GitHub

Trạng thái phát triển, mục tiêu JVM và quy mô dự án

  • Flix được phát triển và duy trì bởi các nhà nghiên cứu ngôn ngữ lập trình tại Aarhus University, Đan Mạch
  • Các tổ chức hợp tác là University of Waterloo ở Canada, University of Tubingen ở Đức và Copenhagen University ở Đan Mạch
  • Cộng đồng người đóng góp mã nguồn mở trên toàn thế giới đang tham gia phát triển ngày càng nhiều, và dự án mời gọi đóng góp
  • Thống kê dự án như sau
    • Pull Request đã merge: hơn 4.900
    • Issue đã giải quyết: hơn 3.100
    • Người đóng góp: hơn 70
    • Codebase trình biên dịch: hơn 272.000 dòng
  • Flix nhắm tới JVM
    • JVM có các triển khai mã nguồn mở và thương mại đã được kiểm chứng như OpenJDK, J9, Azul, Graal
    • Có thể dùng trên Mac, Linux, Windows
    • JVM hiện đại cung cấp nhiều garbage collector đời mới
    • Hỗ trợ concurrency và parallelism tốt, bao gồm thread nhẹ của Java 21
    • Có hỗ trợ công cụ, bao gồm debugger và profiler
    • Thông qua tích hợp Maven, có thể truy cập hệ sinh thái gói phong phú của nền tảng Java
  • Tổng funding là 1,1 triệu euro, giúp bảo đảm tính liên tục và độc lập của dự án

Chưa có bình luận nào.

Chưa có bình luận nào.