Fil-C: Garbage In, Memory Safety Out [वीडियो]

Fil-C, एक memory-safe C implementation जो safety को runtime पर enforce करती है, को Rust के मुख्यतः compile-time safety model के विकल्प या पूरक के रूप में देखा जा रहा है। टिप्पणीकार इस बात पर बहस करते हैं कि Fil-C की guarantees कितनी दूर तक जाती हैं—खासकर syscalls, data races, और mmap के संदर्भ में—बनाम Rust और अन्य भाषाएँ (Go, C#, TypeScript, Python) safe wrappers, runtimes, और tooling के ज़रिए क्या प्रदान करती हैं। कई लोग Fil-C के मुख्य मूल्य को बड़े मौजूदा C/C++ codebases को relatively कम बदलावों के साथ harden करने में देखते हैं, जबकि इसकी performance overhead, नए projects के लिए उपयुक्तता, और उस promotional framing पर सवाल उठाते हैं जो कभी-कभी इसे Rust से categorically “safer” के रूप में पेश करती है।

Fil-C बनाम Rust: सुरक्षा मॉडल

  • Fil-C और Rust को अलग-अलग दृष्टिकोणों के रूप में प्रस्तुत किया गया है: Rust undefined behavior को compile-time पर रोकने पर ज़ोर देता है; Fil-C runtime पर undefined behavior को असंभव बनाने पर ज़ोर देता है।
  • कुछ लोगों का तर्क है कि Rust static checking को “prefer” करता है, लेकिन फिर भी runtime checks (bounds checks, debug में overflow, RefCell, आदि) पर निर्भर रहता है, इसलिए यह दावा कि वह सभी undefined behavior को केवल statically रोक देता है, चुनौती दी जाती है।
  • कई टिप्पणियाँ बताती हैं कि ये दृष्टिकोण एक-दूसरे के पूरक हैं: Fil-C-शैली के runtime checks को Rust के unsafe code के चारों ओर लपेटा जा सकता है, जिससे “safety in depth” मिलती है।

Syscalls, mmap, और Runtime Architecture

  • Fil-C का “user libc” एक Fil-C runtime को कॉल करता है जो syscalls को filter करता है, और फिर वे lower-level libc से होकर जाते हैं। दावा यह है कि Fil-C programs syscalls तक memory safe हैं, और syscalls protections से बाहर नहीं निकल सकते (हालाँकि /proc-शैली के tricks को छोड़कर)।
  • एक प्रमुख उदाहरण mmap है: Fil-C एक ऐसा API देता है जिसमें कई mmap capabilities हैं, जबकि memory safety की गारंटी भी बनी रहती है; Rust का safe subset समकक्ष guarantees नहीं दे सकता, और mmap का उपयोग आमतौर पर unsafe होता है।
  • आलोचकों का जवाब है कि Rust में भी safe syscall wrappers हो सकते हैं, और अंततः दोनों systems किसी न किसी unsafe layer पर निर्भर रहते हैं।

Unsafe Code और Trust Boundaries

  • Rust में unsafe code user code और dependencies में दिखाई दे सकता है; trust boundary user-controlled होती है (और forbid(unsafe_code) तथा tooling से इसे कड़ा किया जा सकता है)।
  • Fil-C में regular programs में unsafe blocks नहीं होते; सभी unsafe behavior compiler/runtime तक सीमित रहता है। कुछ लोग इस केंद्रीकरण को स्पष्ट रूप से अधिक सुरक्षित मानते हैं; अन्य इसे केवल वही जोखिम दूसरी जगह ले जाना मानते हैं।

Data Races और Safety की सीमाएँ

  • Fil-C को data races के बावजूद memory safety बनाए रखने वाला बताया गया है; आलोचकों का तर्क है कि कुछ race scenarios में safety properties घट जाती हैं (जैसे racy pointer के जरिए किसी अलग object तक पहुँचना)।
  • टिप्पणीकार इस बात पर ज़ोर देते हैं कि kernel और hardware bugs, /proc tricks, ptrace, process_vm_writev, और इसी तरह की mechanisms किसी भी userspace memory safety guarantee की सीमा के बाहर रहते हैं।

Performance, Use Cases, और Comparisons

  • Fil-C runtime overhead जोड़ता है (एक टिप्पणी में लगभग “2x slower, 4x memory” जैसी तुलना की गई), जिससे यह कुछ contexts के लिए अनुपयुक्त हो जाता है (जैसे kernels, कुछ embedded)।
  • कई लोगों को इसका मुख्य मूल्य बड़े मौजूदा C/C++ codebases को minimal changes के साथ harden करने में दिखता है; कुछ का मानना है कि यह userspace के कुछ हिस्सों में production के लिए पर्याप्त तेज़ भी हो सकता है।
  • Greenfield development के लिए, skeptic लोग Fil-C को mature GC languages (Go, C#, TypeScript, Python) के बजाय चुनने पर सवाल उठाते हैं, क्योंकि वे पहले से memory safety और समृद्ध ecosystems प्रदान करते हैं।

Community और Rhetoric

  • कई टिप्पणियाँ Fil-C चर्चाओं में बार-बार आने वाले “us vs. them” framing पर ध्यान दिलाती हैं, खासकर Rust के मुकाबले, और अतिरंजित या निरपेक्ष दावों (जैसे data-race safety के बारे में) पर चिंता व्यक्त करती हैं।
  • अन्य लोग तर्क देते हैं कि विस्तृत, यहाँ तक कि adversarial, तुलना trade-offs को स्पष्ट करने और साझा समझ बेहतर करने में मदद करती है।