Ngừng áp dụng Swift – khép lại vấn đề hỗ trợ Swift 6.0 của trình duyệt Ladybird
(github.com/LadybirdBrowser)- Dự án trình duyệt Ladybird đã tổng hợp danh sách các vấn đề phát sinh trong quá trình chuyển hỗ trợ Swift 6.0 từ giai đoạn thử nghiệm sang chính thức, nhưng sau đó quyết định không tiếp tục thúc đẩy việc áp dụng Swift nữa
- Trở ngại chính là các vấn đề liên quan đến khả năng tương tác (interop) giữa Swift và C++ như không khớp ABI, phụ thuộc vòng giữa các header, không thể trả về một số kiểu nhất định; nhiều mục đã được sửa sau Swift 6.0.0
- Trong hệ thống build CMake, cũng có các vấn đề được báo cáo như không khớp deployment target trong môi trường Swift + Ninja, lỗi xử lý
install_name, và các tùy chọn biên dịch không tương thích - Ngay trong mã nguồn của Ladybird, cũng đã xác nhận nhiều điểm bất ổn khi build như cấu hình modulemap của AK và LibGfx, Swift frontend bị crash, xung đột namespace kiểu dữ liệu
- Do các ràng buộc kỹ thuật tích lũy này, việc tích hợp Swift đã bị dừng lại, dẫn đến quyết định tiếp tục duy trì phát triển xoay quanh C++
Các vấn đề liên quan đến Swift
- Có nhiều bug ở cấp độ ngôn ngữ và ABI cần được giải quyết để đưa hỗ trợ Swift 6.0 ra khỏi giai đoạn thử nghiệm
- Xảy ra lỗi assertion khi build bản mã nguồn mở của Swift do không khớp phiên bản LLVM
- Vấn đề không khớp ABI giữa compiler và bridging header khi trả về
Optional<CxxValueType> - Trên Ubuntu 22.04, khi include header
<execution>thì phát sinh phụ thuộc vòng của mô-đun libstdc++ - Bao gồm cả các vấn đề tương thích C++23 như không thể trả về
swift::Optional<swift::String>, không tải được header<chrono>
- Một số vấn đề đã được sửa trong các bản phát hành sau Swift 6.0.0, nhưng một số khác chỉ được giải quyết trên nhánh main nên chưa xuất hiện trong bản ổn định
- Ở nhiều mục có đưa ra “workaround (cách build lách tạm thời)”, nhưng đó không phải là giải pháp hoàn chỉnh
Các vấn đề liên quan đến CMake
- Khi kết hợp Swift với build bằng Ninja,
CMAKE_OSX_DEPLOYMENT_TARGETkhông được áp dụng, gây ra nhiều cảnh báo- Cần tự thiết lập
CMAKE_Swift_COMPILER_TARGET
- Cần tự thiết lập
- Khi bật chính sách CMP0157, thiết lập thư mục
install_namebị bỏ qua, nên phải sửa thủ công- Bản vá liên quan dự kiến sẽ được backport vào CMake 3.29 và 3.30
- Tồn tại vấn đề các tùy chọn link mà compiler Swift không hiểu được truyền từ các dependency bên ngoài
Các vấn đề nội bộ trong dự án Ladybird
- Khi cấu hình clang module map của các mô-đun AK và LibGfx, xảy ra xung đột với system header
- Khi include
<math.h>, build thất bại do lỗi nhận diện mô-đun
- Khi include
- Swift frontend crash ở bản build debug trong quá trình test container của AK
- Chỉ có thể tránh bằng cách build ở chế độ release
- Xung đột namespace của kiểu
Stringkhiến Swift frontend kết thúc bất thường- Cần chỉ định tường minh là
AK.StringhoặcSwift.String
- Cần chỉ định tường minh là
- Khi dùng mô-đun Swift Testing, tồn tại lỗi crash của compiler frontend và vấn đề
AK::StringViewkhông được nhận diện làCxxSequenceType
Các hạng mục cải thiện bổ sung
- Trong Swift, khi hàm C++ trả về
Optional<CxxType>thì ứng dụng bị crash- Giải pháp tạm thời là trả về mảng có kích thước 0 hoặc 1
- SourceKit-LSP và vscode-swift yêu cầu
compile_commands.jsonở cấp thư mục gốc- Có thể xử lý bằng cách tạo symbolic link
- Trên Linux, vẫn còn bất tiện là phải thêm thủ công đường dẫn
<swift/bridging>
Các câu hỏi chưa được giải quyết
- Chưa rõ cách để trong Swift truyền các kiểu view hoặc byte slice của C++ mà không cần copy
- Swift không thể nhận diện các kiểu riêng như AK::Optional, AK::HashMap tương đương với các kiểu của std::
- Cách tích hợp garbage collector của Swift với cơ chế quản lý bộ nhớ của Ladybird cũng vẫn chưa được xác định
Vấn đề này vốn là tài liệu ghi chép có hệ thống các trở ngại kỹ thuật cho việc tích hợp Swift 6.0, nhưng sau đó khi đội ngũ Ladybird ngừng áp dụng Swift, issue “Swift 6.0 Blockers” cũng được khép lại.
1 bình luận
Ý kiến trên Hacker News
Commit gỡ bỏ Swift có kèm thêm một chút giải thích
Có thông điệp: “Vì trong thời gian dài không có tiến triển nào nên đã từ bỏ việc áp dụng Swift và loại nó khỏi codebase”
Có thể xem commit liên quan tại đây
Tôi lần đầu dùng Swift vào năm 2021, và sau hơn 10 năm làm với C#/.NET thì thực sự bất ngờ
Tôi từng nghĩ C# đã phức tạp, nhưng Swift còn là một ngôn ngữ phức tạp hơn nhiều
Đặc biệt khi xây backend API hay tầng truy cập dữ liệu thì gần như không có tài liệu để tham khảo
Kiến thức về Swift chủ yếu tích lũy quanh nền tảng Apple, nên ở các mảng khác gần như có cảm giác phải trở thành người khai phá
Như Larry Wall từng nói, độ phức tạp của công cụ phải tương xứng với độ phức tạp của vấn đề (nhắc đến Raku)
Nhưng các quy tắc như “struct truyền theo giá trị, class truyền theo tham chiếu” lại xung đột với nguyên tắc “duy trì một nguồn chân lý duy nhất”, khiến trải nghiệm phát triển trở nên nhàm chán và chậm chạp
Tôi không tiến triển được vì các best practice mâu thuẫn nhau của Swift, và cuối cùng nhận ra nhiều lời khuyên thực ra không đáng tin
Có quá nhiều cú pháp sugar, và có đến hàng chục cách để làm cùng một việc, nên lúc nào cũng phải tra lại language reference
Dù là ngôn ngữ nào đi nữa, tôi hy vọng sau này Ladybird sẽ tập trung vào một bản triển khai JavaScript thân thiện với người dùng
Việc JS bị lạm dụng để theo dõi hoạt động người dùng, chặn dán nội dung hoặc thu thập quá nhiều thông tin thiết bị là một vấn đề
Nếu trình duyệt báo về các giá trị giả mạo được chuẩn hóa giữa những người dùng giống như Tor thì có lẽ sẽ giúp bảo vệ quyền riêng tư hơn
Cung cấp như một tùy chọn bật/tắt thì ổn, nhưng để mặc định thì có lẽ khó được chấp nhận
Việc gỡ bỏ Swift khá thú vị. Lý do không được giải thích rõ ràng nên tôi thấy tò mò
Chỉ cần nó chạy được trên Linux thì sau này tôi sẽ thử
Swift gặp vấn đề khi không thể import đồng thời nhiều thư viện C++ phiên bản khác nhau, hoặc phát sinh xung đột phiên bản toán tử
Swift là ngôn ngữ tốt, nhưng có lẽ quá phức tạp để thêm vào một dự án lớn ở giai đoạn sau
Tôi thắc mắc vì sao Ladybird lại thử Swift. Tôi nghĩ Rust chẳng phải có khả năng tương tác với C++ tốt hơn sao?
GC của Swift cũng có vẻ bất lợi cho hiệu năng trình duyệt
Liên kết 1, Liên kết 2
Có cách lách qua, nhưng năng suất bị giảm
Chỉ là có vẻ chừng đó vẫn chưa đủ với Ladybird
Trước đây họ còn tạo ra ngôn ngữ Jakt trong SerenityOS, nhưng có vẻ cuối cùng vẫn quay về C++
Có thể xem thảo luận cũ liên quan ở bài này
Swift là một ngôn ngữ phụ thuộc vào Apple quá nhiều, nên chuyện này không có gì bất ngờ
Chỉ cần dùng tốt phần an toàn của C++ là đủ, mà thực tế hầu hết trình duyệt đều được viết bằng C++
Chromium và Firefox đang dần thay thế bằng các ngôn ngữ an toàn hơn, và viết lại một trình duyệt mới bằng C++ chỉ là lặp lại sai lầm trong quá khứ
Việc dùng C++ là di sản còn sót lại từ thời KHTML năm 1998
Nó có bao gồm các tính năng STL hiện đại như string_view không? Dù vậy thì vẫn còn khá xa mới đạt được an toàn bộ nhớ hoàn toàn
Trừ một vài benchmark, trong chương trình thực tế thì gần như lúc nào cũng chậm hơn
Thật tiếc khi Swift bị gỡ bỏ. Vậy không biết ngôn ngữ riêng Jakt có lại trở thành ứng viên không
Tôi nghĩ khả năng họ đưa vào một ngôn ngữ mới là không cao
Một dự án vận hành bằng tài trợ bên ngoài mà như vậy thì về dài hạn có thể khó duy trì
Tôi nghĩ Swift rốt cuộc chỉ là ngôn ngữ đồ chơi của Apple
Apple sẽ không để nó phát triển vượt xa hơn thế
UI Mac của Ladybird là một lớp mỏng đặt trên AppKit
Nó được viết bằng Objective-C++, không phải Swift
Xem mã nguồn
Nó được làm từ thời SerenityOS, rất lâu trước khi có chuyện đưa Swift vào, nên dùng Objective-C++ đơn giản chỉ vì đó là ngôn ngữ tôi quen thuộc
Trước đây khi họ nói sẽ chuyển sang Swift, tôi đã chỉ trích điều đó
Tôi cho rằng thiết kế của Swift lỏng lẻo, tốc độ compile cũng chậm, và khó có khả năng phát triển thành ngôn ngữ hệ thống
Họ cũng không có chuyên gia, nên tôi nghĩ quyết định lần này là đúng đắn
Các tính năng như Concurrency hay Swift Testing cũng là những ví dụ được thúc đẩy theo nhu cầu của Apple
Phần việc cross-platform chủ yếu do các nhóm nhỏ làm riêng
Ngay cả ngoài Chris Lattner, các lead của Swift cũng đều là những người được cộng đồng C++ công nhận
Sẽ rất hay nếu phía Rust hỗ trợ cả Swift ABI bên cạnh C như một phần của FFI