Một hệ thống actor mới đã xuất hiện, kết nối các ngôn ngữ lập trình Swift và Erlang, cho phép các ứng dụng Swift tham gia vào các cluster Erlang phân tán. Sự phát triển này mở ra những khả năng thú vị cho việc phát triển ứng dụng native đa nền tảng và đại diện cho một bước tiến quan trọng hướng tới tính toán phân tán thống nhất giữa các hệ sinh thái lập trình khác nhau.
Hệ thống swift-erlang-actor-system bao bọc chức năng C node của Erlang vào framework distributed actor của Swift. Điều này có nghĩa là các chương trình Swift giờ đây có thể giao tiếp trực tiếp với các node Erlang và tham gia vào các cluster Erlang phân tán, vốn từ lâu đã là đặc trưng của khả năng tính toán phân tán chịu lỗi trong hệ sinh thái Erlang.
Triển khai kỹ thuật và kiến trúc
Hệ thống sử dụng thư viện C erl_interface của Erlang cho mạng và tuần tự hóa thông điệp. Các thông điệp được tuần tự hóa bằng External Term Format của Erlang, có thể xử lý bất kỳ giá trị nào trong máy ảo Erlang. Các nhà phát triển đã tạo ra các lớp TermEncoder và TermDecoder có thể chuyển đổi các kiểu Codable của Swift sang định dạng này, làm cho việc tích hợp trở nên liền mạch cho các nhà phát triển Swift.
Một thách thức chính mà nhóm đã giải quyết là việc xác định tên hàm giữa các ngôn ngữ. Swift thường sử dụng tên hàm được mã hóa (mangled) cho các cuộc gọi từ xa, điều này sẽ yêu cầu các node Erlang phải hiểu hệ thống mã hóa tên của Swift. Họ đã giới thiệu macro @StableNames cho phép các nhà phát triển gán tên tùy chỉnh, dễ đọc cho con người cho các phương thức actor, làm cho giao tiếp đa ngôn ngữ trở nên sạch sẽ hơn nhiều.
Các Thành Phần Kỹ Thuật Chính
- Mạng: Thư viện C erl_interface từ Erlang/OTP
- Tuần tự hóa: Định dạng thuật ngữ bên ngoài (ETF)
- Mã hóa thông điệp: Các lớp TermEncoder/TermDecoder cho các kiểu Swift Codable
- Đặt tên hàm: Macro @StableNames để tương thích đa ngôn ngữ
- Vận chuyển: Lớp vận chuyển có thể hoán đổi (hỗ trợ thay thế WebSockets)
- Kiến trúc: Trình duyệt Elixir không giao diện với các tiến trình DOM ảo
Ứng dụng thực tế: Cuộc cách mạng giao diện người dùng native
Khía cạnh hấp dẫn nhất của dự án này không chỉ là cầu nối kỹ thuật giữa các ngôn ngữ, mà là ứng dụng thực tế của nó. Nhóm phát triển đang xây dựng một hệ thống tham vọng hơn nhiều - một hệ thống render các thành phần giao diện người dùng native bằng cú pháp markup giống web. Thay vì các phần tử HTML div truyền thống, các nhà phát triển có thể viết mã giao diện người dùng native như <Text>Hello, world!</Text>
được dịch trực tiếp thành Text(Hello, world!)
của SwiftUI.
Cách tiếp cận này khác biệt đáng kể so với các giải pháp hiện có như React Native hoặc Flutter. Thay vì tạo ra framework giao diện người dùng riêng, nhóm tận dụng các framework giao diện người dùng native hạng nhất trên mỗi nền tảng - SwiftUI cho các thiết bị Apple, Jetpack Compose cho Android, và WinUI3 cho Windows. Điều này có nghĩa là khi Apple phát hành các cập nhật giao diện người dùng mới như thay đổi thiết kế iOS, các ứng dụng được xây dựng với hệ thống này sẽ tự động kế thừa những cải tiến đó mà không cần cập nhật framework.
Kiến trúc chạy một trình duyệt headless được xây dựng bằng Elixir trên thiết bị, với mỗi node trong virtual DOM có process Erlang riêng. Hệ thống thậm chí có thể biên dịch các thư viện JavaScript phía client thành WebAssembly và chạy chúng thông qua trình duyệt headless, có khả năng mang các mẫu phát triển web quen thuộc vào phát triển ứng dụng native.
Các Dự án Liên quan trong Tổ chức otp-interop
- swift-erlang-actor-system: Cầu nối chính giữa Swift-Erlang
- elixir_pack: Đóng gói các ứng dụng Elixir cho iOS/các nền tảng Apple
- crane: Tên làm việc cho trình duyệt headless
- gen_dom: Triển khai Virtual DOM
- selector: Thư viện phân tích cú pháp CSS selector
Hiệu suất và hỗ trợ nền tảng
Hệ thống hiện tại hỗ trợ gần như tất cả các target SwiftUI bao gồm macOS, iPhone, iPad, Apple Vision Pro, và Apple TV. Apple Watch vẫn chưa được hỗ trợ do thiếu BSD sockets API, mặc dù nhóm lưu ý họ có thể xây dựng một backend riêng sử dụng Network framework của Apple nếu cần.
Các thảo luận cộng đồng tiết lộ những cân nhắc hiệu suất thú vị. Trong khi cách tiếp cận trình duyệt dựa trên Elixir mới giới thiệu nhiều overhead hơn so với triển khai dựa trên Rust trước đây, nhóm tin rằng sự đánh đổi này đáng giá để đạt được khả năng tương thích đầy đủ với các framework web phức tạp như LiveView.
Chúng tôi nhận được lợi ích lớn từ việc nhắm mục tiêu các framework giao diện người dùng hạng nhất, chủ yếu là chúng tôi để họ làm công việc. Phát triển một framework giao diện người dùng native tôi nghĩ là nỗ lực lớn hơn rất nhiều so với những gì chúng tôi đã làm, vì vậy chúng tôi để Apple, Google, và Microsoft quyết định trải nghiệm người dùng mong muốn trên thiết bị của họ.
So sánh hỗ trợ nền tảng
Nền tảng | Trạng thái hỗ trợ | Ghi chú |
---|---|---|
macOS | ✅ Được hỗ trợ | Hỗ trợ đầy đủ SwiftUI |
iPhone | ✅ Được hỗ trợ | Hỗ trợ đầy đủ SwiftUI |
iPad | ✅ Được hỗ trợ | Hỗ trợ đầy đủ SwiftUI |
Apple Vision Pro | ✅ Được hỗ trợ | Hỗ trợ đầy đủ SwiftUI |
Apple TV | ✅ Được hỗ trợ | Hỗ trợ đầy đủ SwiftUI |
Apple Watch | ❌ Không được hỗ trợ | Thiếu API BSD sockets |
Android | 🔄 Đang lên kế hoạch | Thông qua Jetpack Compose |
Windows | 🔄 Đang lên kế hoạch | Thông qua WinUI3 |
Ý nghĩa rộng lớn hơn cho phát triển đa nền tảng
Dự án này đại diện cho sự hội tụ của nhiều xu hướng trong phát triển phần mềm. Nó kết hợp độ tin cậy và khả năng phân phối của Erlang với hiệu suất và khả năng truy cập nền tảng native của Swift. Cách tiếp cận này có thể giải quyết thách thức lâu dài của phát triển đa nền tảng mà không hy sinh trải nghiệm người dùng native.
Nhóm cũng đã phát triển các công cụ hỗ trợ bao gồm elixir_pack để đóng gói các ứng dụng Elixir chạy trên iOS và các nền tảng Apple khác, và họ đang khám phá Erlang phân tán cho tương tác client-server với khả năng lọc thông điệp.
Hệ thống swift-erlang-actor-system chứng minh cách các khái niệm tính toán phân tán hiện đại có thể kết nối các hệ sinh thái lập trình truyền thống tách biệt. Mặc dù vẫn đang trong quá trình phát triển, nó chỉ ra một tương lai nơi các nhà phát triển có thể chọn ngôn ngữ tốt nhất cho từng thành phần của hệ thống của họ trong khi duy trì giao tiếp liền mạch giữa chúng. Đối với các nhóm đã đầu tư vào mô hình tính toán phân tán của Erlang, điều này mở ra những khả năng mới để mở rộng hệ thống của họ vào các ứng dụng mobile và desktop native.
Tham khảo: Introducing swift-erlang-actor-system