Penghentian adopsi Swift – penutupan isu dukungan Swift 6.0 di browser Ladybird
(github.com/LadybirdBrowser)- Proyek browser Ladybird telah merangkum daftar masalah yang muncul dalam proses mengubah dukungan Swift 6.0 dari tahap eksperimental menjadi resmi, tetapi kemudian memutuskan untuk tidak lagi melanjutkan adopsi Swift
- Faktor penghambat utama mencakup ketidakcocokan ABI terkait interoperabilitas (interop) Swift dan C++, dependensi siklik header, ketidakmampuan mengembalikan tipe tertentu, dan beberapa di antaranya telah diperbaiki setelah Swift 6.0.0
- Di sistem build CMake juga dilaporkan masalah seperti ketidakcocokan target deployment pada lingkungan Swift + Ninja, kesalahan penanganan
install_name, dan opsi kompilasi yang tidak kompatibel - Pada kode Ladybird sendiri, ditemukan banyak ketidakstabilan build seperti konfigurasi
modulemappada modul AK dan LibGfx, crash frontend Swift, serta konflik namespace tipe - Karena akumulasi keterbatasan teknis ini, integrasi Swift dihentikan, yang berujung pada keputusan untuk tetap mempertahankan pengembangan yang berpusat pada C++
Masalah terkait Swift
- Terdapat banyak bug pada level bahasa dan ABI yang harus diselesaikan agar dukungan Swift 6.0 bisa keluar dari tahap eksperimental
- Kegagalan assertion saat build open source Swift akibat ketidakcocokan versi LLVM
- Masalah ketidakcocokan ABI antara compiler dan bridging header saat mengembalikan
Optional<CxxValueType> - Muncul dependensi siklik modul libstdc++ saat menyertakan header
<execution>di lingkungan Ubuntu 22.04 - Termasuk masalah kompatibilitas C++23 seperti tidak bisa mengembalikan
swift::Optional<swift::String>dan kegagalan memuat header<chrono>
- Sebagian masalah telah diperbaiki pada rilis setelah Swift 6.0.0, tetapi sebagian lain hanya terselesaikan di branch main sehingga belum masuk ke versi stabil
- Di berbagai poin diajukan “workaround (metode build alternatif)”, tetapi itu bukan solusi menyeluruh
Masalah terkait CMake
- Pada kombinasi build Swift dan Ninja,
CMAKE_OSX_DEPLOYMENT_TARGETtidak diterapkan sehingga muncul banyak peringatan- Perlu menetapkan
CMAKE_Swift_COMPILER_TARGETsecara manual
- Perlu menetapkan
- Saat kebijakan CMP0157 diaktifkan, pengaturan direktori
install_namediabaikan sehingga perlu perbaikan manual- Perbaikan terkait direncanakan di-backport ke CMake 3.29 dan 3.30
- Ada masalah ketika opsi linker yang tidak dipahami compiler Swift diteruskan dari dependensi eksternal
Masalah internal proyek Ladybird
- Saat menyusun clang module map untuk modul AK dan LibGfx, terjadi konflik dengan header sistem
- Build gagal karena kesalahan pengenalan modul saat menyertakan
<math.h>
- Build gagal karena kesalahan pengenalan modul saat menyertakan
- Frontend Swift crash pada build debug selama pengujian container AK
- Hanya bisa dihindari dengan build mode rilis
- Frontend Swift berhenti secara abnormal akibat konflik namespace pada tipe
String- Perlu penentuan eksplisit sebagai
AK.StringatauSwift.String
- Perlu penentuan eksplisit sebagai
- Saat menggunakan modul Swift Testing, terdapat crash frontend compiler, serta masalah
AK::StringViewtidak dikenali sebagaiCxxSequenceType
Poin perbaikan tambahan
- Aplikasi crash ketika fungsi C++ di Swift mengembalikan
Optional<CxxType>- Sebagai solusi sementara, digunakan pengembalian array berukuran 0 atau 1
- SourceKit-LSP dan vscode-swift memerlukan
compile_commands.jsondi level root- Dapat diatasi dengan membuat symbolic link
- Di lingkungan Linux, ada ketidaknyamanan karena jalur
<swift/bridging>harus ditambahkan secara manual
Pertanyaan yang belum terjawab
- Belum jelas bagaimana di Swift meneruskan view type atau byte slice milik C++ tanpa penyalinan
- Swift tidak dapat mengenali tipe internal seperti
AK::Optional,AK::HashMap, dan lainnya sebagai setara dengan tipestd:: - Cara integrasi garbage collector Swift dengan manajemen memori Ladybird juga masih belum ditentukan
Isu ini awalnya merupakan dokumen yang mencatat secara sistematis hambatan teknis untuk integrasi Swift 6.0, tetapi setelah tim Ladybird menghentikan adopsi Swift, isu “Swift 6.0 Blockers” pun ditutup.
1 komentar
Komentar Hacker News
Commit penghapusan Swift memiliki sedikit penjelasan tambahan
Ada pesan yang berbunyi, “Karena sudah lama tidak ada kemajuan, adopsi Swift dibatalkan dan dihapus dari codebase”
Commit terkait bisa dilihat di sini
Saya pertama kali mencoba Swift pada 2021, dan setelah lebih dari 10 tahun memakai C#/.NET saya cukup terkejut
Saya pikir C# sudah kompleks, tetapi Swift adalah bahasa yang jauh lebih kompleks
Terutama saat membuat backend API atau lapisan akses data, hampir tidak ada referensi yang bisa dijadikan acuan
Pengetahuan tentang Swift sebagian besar terakumulasi untuk platform Apple, jadi di luar itu rasanya kita harus menjadi perintis
Seperti kata Larry Wall, kompleksitas alat harus disesuaikan dengan kompleksitas masalahnya (menyebut Raku)
Namun aturan seperti “struct dikirim berdasarkan nilai, class dikirim berdasarkan referensi” berbenturan dengan prinsip “mempertahankan satu sumber kebenaran”, sehingga pengalaman pengembangannya terasa membosankan dan lambat
Karena best practice Swift saling bertentangan, tidak ada kemajuan, dan pada akhirnya saya sadar banyak sarannya tidak bisa benar-benar dipercaya
Terlalu banyak syntax sugar, dan ada puluhan cara untuk melakukan hal yang sama, jadi saya harus terus membuka referensi bahasa
Apa pun bahasanya, saya berharap Ladybird nantinya fokus pada implementasi JavaScript yang ramah pengguna
Masalahnya adalah JS disalahgunakan untuk melacak aktivitas pengguna, memblokir paste, atau mengumpulkan terlalu banyak informasi perangkat
Jika seperti Tor dan melaporkan nilai spoofing yang distandardisasi antar pengguna, itu tampaknya bisa membantu privasi
Menyediakannya sebagai opsi toggle tidak masalah, tetapi jika dijadikan default sepertinya akan sulit diadopsi
Penghapusan Swift ini menarik. Alasannya tidak dijelaskan dengan jelas, jadi saya penasaran
Kalau nanti sudah bisa berjalan di Linux, saya ingin mencobanya
Masalahnya adalah Swift tidak bisa mengimpor library beberapa versi C++ sekaligus, atau muncul konflik versi operator
Swift memang bahasa yang bagus, tetapi mungkin terlalu rumit untuk ditambahkan belakangan ke proyek yang sudah besar
Saya penasaran kenapa Ladybird mencoba Swift. Saya kira Rust punya interoperabilitas C++ yang lebih baik
GC Swift juga tampaknya akan merugikan performa browser
Link1, Link2
Ada cara mem-bypass-nya, tetapi produktivitas menurun
Hanya saja tampaknya itu belum cukup untuk Ladybird
Dulu mereka juga sempat membuat bahasa bernama Jakt di SerenityOS, tetapi pada akhirnya tampaknya kembali ke C++
Diskusi lama terkait ada di posting ini
Tidak mengejutkan karena Swift terlalu bergantung pada Apple
Cukup gunakan bagian C++ yang aman dengan baik, dan memang sebagian besar browser ditulis dengan C++
Chromium dan Firefox sedang bertahap menggantinya dengan bahasa yang lebih aman, dan menulis browser baru lagi dengan C++ sama saja mengulangi kesalahan masa lalu
Penggunaan C++ adalah warisan dari era KHTML pada 1998
Apakah itu mencakup fitur STL modern seperti string_view? Tetap saja itu masih jauh dari keamanan memori yang sepenuhnya utuh
Di luar beberapa benchmark tertentu, dalam program nyata hampir selalu lebih lambat
Sayang sekali Swift dihapus. Jadi apakah bahasa internal Jakt kembali menjadi kandidat?
Saya rasa kemungkinan mereka mengadopsi bahasa baru rendah
Jika proyek yang dijalankan dengan sponsor eksternal seperti ini terus begitu, akan sulit bertahan dalam jangka panjang
Saya pikir Swift pada akhirnya cuma bahasa mainan Apple
Apple tidak akan membiarkannya berkembang lebih jauh dari itu
UI Mac Ladybird adalah lapisan tipis di atas AppKit
Itu ditulis dengan Objective-C++, bukan Swift
Lihat kode sumber
Itu dibuat jauh sebelum adopsi Swift, pada masa SerenityOS, jadi saya memakai Objective-C++ hanya karena itu bahasa yang familiar bagi saya
Dulu saya mengkritik saat mereka mengatakan akan beralih ke Swift
Menurut saya desain Swift berantakan, kecepatan kompilasinya lambat, dan kecil kemungkinan tumbuh sebagai bahasa sistem
Karena juga tidak ada ahli yang tersedia, saya rasa keputusan kali ini adalah langkah yang tepat
Fitur seperti Concurrency atau Swift Testing juga merupakan contoh yang didorong sesuai kebutuhan Apple
Pekerjaan lintas platform sebagian besar dijalankan terpisah oleh tim kecil
Bahkan selain Chris Lattner, para lead Swift adalah tokoh yang diakui di komunitas C++
Akan bagus jika kubu Rust mendukung Swift ABI selain C sebagai FFI