Swift अपनाना बंद — Ladybird ब्राउज़र में Swift 6.0 सपोर्ट इश्यू बंद
(github.com/LadybirdBrowser)- Ladybird ब्राउज़र प्रोजेक्ट ने Swift 6.0 सपोर्ट को प्रयोगात्मक चरण से औपचारिक रूप से अपनाने की प्रक्रिया में सामने आए मुद्दों की सूची तैयार की थी, लेकिन बाद में Swift अपनाने को आगे न बढ़ाने का फैसला किया
- मुख्य बाधाएँ Swift और C++ interoperability (Interop) से जुड़ी ABI असंगतियाँ, header circular dependency, कुछ types को return न कर पाना जैसी थीं, और इनमें से कई मुद्दे Swift 6.0.0 के बाद ठीक किए गए
- CMake build system में भी Swift + Ninja वातावरण में deployment target mismatch,
install_nameहैंडलिंग त्रुटि, incompatible compiler options जैसी समस्याएँ रिपोर्ट हुईं - Ladybird के अपने कोड में भी AK और LibGfx modules के modulemap configuration, Swift frontend crash, type namespace conflict सहित कई build instability पाई गईं
- इन जमा हुई तकनीकी सीमाओं के कारण Swift integration रोक दी गई, और इसका परिणाम C++-केंद्रित development बनाए रखने के निर्णय के रूप में निकला
Swift से जुड़ी समस्याएँ
- Swift 6.0 सपोर्ट को प्रयोगात्मक चरण से बाहर लाने के लिए हल किए जाने वाले language और ABI स्तर के bugs बड़ी संख्या में मौजूद थे
- LLVM version mismatch के कारण Swift open source build के समय assertion failure होता था
Optional<CxxValueType>return करने पर compiler और bridging header के बीच ABI mismatch समस्या- Ubuntu 22.04 वातावरण में
<execution>header शामिल करने पर libstdc++ module circular dependency होती थी swift::Optional<swift::String>return न कर पाना,<chrono>header लोड न होना जैसी C++23 compatibility समस्याएँ भी शामिल थीं
- कुछ समस्याएँ Swift 6.0.0 के बाद की releases में ठीक हुईं, लेकिन कुछ केवल main branch में ही हल हुईं और stable version में शामिल नहीं हुईं
- कई मदों में “workaround (वैकल्पिक build तरीका)” सुझाया गया, लेकिन यह पूर्ण समाधान नहीं था
CMake से जुड़ी समस्याएँ
- Swift और Ninja build संयोजन में
CMAKE_OSX_DEPLOYMENT_TARGETलागू न होने से कई warnings आती थींCMAKE_Swift_COMPILER_TARGETको manually सेट करना पड़ता था
- CMP0157 policy सक्षम होने पर
install_namedirectory setting अनदेखी हो जाती थी, इसलिए manual correction की ज़रूरत पड़ती थी- संबंधित fix को CMake 3.29, 3.30 में backport करने की योजना थी
- Swift compiler जिन link options को समझ नहीं पाता, वे external dependencies से pass होने की समस्या भी मौजूद थी
Ladybird प्रोजेक्ट के अंदरूनी मुद्दे
- AK और LibGfx modules के clang module map configuration के दौरान system headers से conflict होता था
<math.h>शामिल करने पर module recognition error के कारण build fail हो जाता था
- Swift frontend AK container tests के दौरान debug build में crash हो जाता था
- केवल release mode build से ही इससे बचा जा सकता था
Stringtype namespace conflict के कारण Swift frontend असामान्य रूप से बंद हो जाता थाAK.StringयाSwift.Stringके रूप में explicitly निर्दिष्ट करना पड़ता था
- Swift Testing module इस्तेमाल करने पर compiler frontend crash होता था, और
AK::StringViewके लिए CxxSequenceType को न पहचानने की समस्या भी थी
अतिरिक्त सुधार बिंदु
- Swift में जब C++ function
Optional<CxxType>return करता था, तो application crash हो जाता था- अस्थायी समाधान के रूप में size 0 या 1 के array return करने का उपयोग किया गया
- SourceKit-LSP और vscode-swift को root स्तर पर compile_commands.json चाहिए होता था
- symbolic link बनाकर इसे हल किया जा सकता था
- Linux वातावरण में
<swift/bridging>path को manually जोड़ना पड़ने की असुविधा भी थी
अनसुलझे प्रश्न
- Swift में C++ के view type या byte slice को बिना copy किए पास करने का तरीका स्पष्ट नहीं था
- Swift AK::Optional, AK::HashMap जैसे अपने types को std:: types के बराबर नहीं पहचान पाता था
- Swift garbage collector और Ladybird की memory management को integrate करने का तरीका भी तय नहीं था
यह इश्यू Swift 6.0 integration के लिए तकनीकी बाधाओं को व्यवस्थित रूप से दर्ज करने वाला दस्तावेज़ था, लेकिन बाद में Ladybird टीम ने Swift अपनाना बंद कर दिया, और “Swift 6.0 Blockers” इश्यू बंद कर दिया गया।
1 टिप्पणियां
Hacker News की रायें
Swift हटाने वाले commit में थोड़ा अतिरिक्त स्पष्टीकरण है
इसमें यह संदेश शामिल है: “काफ़ी समय से कोई प्रगति नहीं हुई, इसलिए Swift अपनाने का प्रयास छोड़कर इसे codebase से हटा दिया गया”
संबंधित commit यहाँ देखा जा सकता है
मैंने 2021 में पहली बार Swift इस्तेमाल किया था, और 10 साल से ज़्यादा C#/.NET करने के बाद आकर मैं हैरान रह गया
मुझे C# भी जटिल लगता था, लेकिन Swift उससे कहीं ज़्यादा जटिल भाषा निकली
ख़ासकर backend API या data access layer बनाते समय देखने लायक सामग्री लगभग नहीं थी
Swift का ज़्यादातर ज्ञान Apple platforms के लिए जमा हुआ है, इसलिए उसके बाहर के क्षेत्रों में लगता था जैसे आपको लगभग पायनियर बनना पड़ेगा
जैसा Larry Wall ने कहा था, tool की complexity समस्या की complexity के मुताबिक होनी चाहिए (Raku का उल्लेख)
लेकिन “struct value से pass होता है, class reference से pass होती है” जैसे नियम और “single source of truth बनाए रखना” वाला सिद्धांत आपस में टकराते रहे, जिससे development उबाऊ और धीमा हो गया
Swift की विरोधाभासी best practices की वजह से कोई प्रगति नहीं हुई, और आख़िर में समझ आया कि बहुत-सी सलाहों पर भरोसा नहीं किया जा सकता
syntax sugar बहुत ज़्यादा है, और एक ही काम करने के दर्जनों तरीके हैं, इसलिए हर बार language reference देखनी पड़ती थी
भाषा कोई भी हो, उम्मीद है कि Ladybird आगे चलकर user-friendly JavaScript implementation पर ध्यान दे
JS का user activity tracking, paste block करना, या device की ज़रूरत से ज़्यादा जानकारी इकट्ठा करने में दुरुपयोग होना एक समस्या है
Tor की तरह अगर users के बीच standardized spoofed values report किए जाएँ, तो privacy protection में मदद मिल सकती है
toggle option के रूप में देना ठीक है, लेकिन default के रूप में रखना शायद adoption के लिए मुश्किल होगा
Swift हटाना दिलचस्प है. वजह साफ़ तौर पर नहीं बताई गई, इसलिए जिज्ञासा है
अगर यह Linux पर चलने लगे तो मैं बाद में इसे test करने का सोच रहा हूँ
समस्या यह थी कि Swift एक साथ कई C++ version libraries import नहीं कर पा रहा था, या operator version conflicts हो रहे थे
Swift अच्छी भाषा है, लेकिन पहले से बड़े project में बाद में जोड़ने के लिए शायद यह बहुत जटिल थी
जिज्ञासा है कि Ladybird ने Swift क्यों आज़माया. मुझे लगा था कि Rust की C++ interoperability बेहतर नहीं है क्या
Swift का GC भी browser performance के लिए नुक़सानदेह लग सकता है
लिंक1, लिंक2
workaround हैं, लेकिन productivity गिरती है
हालांकि Ladybird के लिए शायद यह काफ़ी नहीं था
पहले SerenityOS में उन्होंने Jakt नाम की भाषा भी बनाई थी, लेकिन लगता है कि अंततः वे फिर C++ पर लौट आए
इस बारे में पुरानी चर्चा इस पोस्ट में है
Swift, Apple पर बहुत निर्भर भाषा है, इसलिए यह चौंकाने वाली बात नहीं है
C++ के सुरक्षित हिस्सों का ठीक से इस्तेमाल कर लिया जाए तो वह काफ़ी है, और वास्तव में ज़्यादातर browsers C++ में ही लिखे गए हैं
Chromium और Firefox धीरे-धीरे अधिक सुरक्षित भाषाओं से हिस्से बदल रहे हैं, और नए browser को फिर से C++ में लिखना अतीत की गलती दोहराने जैसा है
C++ का उपयोग 1998 के KHTML दौर की विरासत है
क्या इसमें
string_viewजैसी आधुनिक STL features शामिल हैं? फिर भी यह पूरी memory safety से काफ़ी दूर हैकुछ benchmarks को छोड़ दें तो वास्तविक programs में यह लगभग हमेशा धीमी होती है
Swift हटना अफ़सोसजनक है. तो क्या उनकी अपनी भाषा Jakt फिर से उम्मीदवार बन सकती है, यह सोच रहा हूँ
मुझे नहीं लगता कि वे किसी नई भाषा को अपनाने की संभावना रखते हैं
बाहरी sponsorship पर चलने वाला project अगर ऐसा करे, तो लंबे समय तक टिकना कठिन हो सकता है
मुझे लगता है Swift आख़िरकार सिर्फ़ Apple की खिलौना भाषा भर है
Apple उसे उससे आगे बढ़ने नहीं देगा
Ladybird का Mac UI, AppKit के ऊपर रखी गई एक पतली layer है
यह Swift में नहीं बल्कि Objective-C++ में लिखा गया है
source code देखें
यह Swift अपनाने से बहुत पहले, SerenityOS के समय बनाया गया था, इसलिए Objective-C++ इस्तेमाल करने की वजह बस यह थी कि वही परिचित भाषा थी
जब पहले Swift पर जाने की बात हुई थी, तब मैंने इसकी आलोचना की थी
मेरा मानना था कि Swift का design ढीला-ढाला है, compile speed भी धीमी है, और इसके system language के रूप में बढ़ने की संभावना कम है
experts भी नहीं थे, इसलिए मुझे लगता है यह फ़ैसला सही रहा
Concurrency या Swift Testing जैसी सुविधाएँ भी Apple की ज़रूरतों के मुताबिक आगे बढ़ाई गईं
cross-platform काम ज़्यादातर अलग छोटे teams कर रहे हैं
Chris Lattner को छोड़ भी दें, तो Swift leads C++ community में मान्यता प्राप्त लोग थे
अच्छा होगा अगर Rust ecosystem, C के साथ Swift ABI को भी FFI के लिए support करे