1 पॉइंट द्वारा GN⁺ 3 시간 전 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • crustc एक डेमो है जो rustc 1.98.0-nightly (c712ea946 2026-06-16) के पूरे हिस्से को 4.6 करोड़ लाइनों के C कोड में बदलता है, और GCCmake से बिल्ड करने पर एक काम करने वाला Rust compiler बनता है
  • इसका आधारभूत टूल cilly एक Rust compiler backend है जो Rust को C में compile करता है, और यह repository compiler द्वारा खुद को compile करने का सबसे प्रमुख showcase है
  • cilly target C compiler और platform के type layout, size, alignment, character encoding, integer format आदि को witness program के जरिए query करता है, ताकि वह ऐसा C code generate कर सके जिसे कोई विशेष C compiler स्वीकार कर सके
  • मुख्य लक्ष्य यह है कि पुराने या असामान्य hardware पर, जहाँ LLVM/GCC support नहीं है लेकिन C compiler उपलब्ध है, वहाँ Rust का उपयोग संभव हो सके; इसमें TCP के जरिए remote C compiler से संवाद करने वाली network transparency भी शामिल है
  • अभी generate किया गया C, लेखक के workstation ISA यानी ARM64 Linux को target करता है; पूरा cilly toolchain अभी सार्वजनिक उपयोग के लिए तैयार नहीं है और optimization से जुड़े bugs अभी ट्रैक किए जा रहे हैं

rustc को C में बदलने का डेमो

  • crustc एक repository है जो rustc 1.98.0-nightly (c712ea946 2026-06-16) को 4.6 करोड़ लाइनों के C कोड में बदलती है
  • इस C code को GCC और make से build किया जा सकता है, और build का परिणाम एक काम करने वाला Rust compiler होता है
  • रन उदाहरण में LLVM library path सेट करने के बाद ./rustc/rustc --version चलाने पर वही rustc 1.98.0-nightly version प्रिंट होता है
  • generate किया गया Rust compiler code compile कर सकता है और core, alloc, std भी build कर सकता है
  • code में C code के अलावा कुछ C++ LLVM wrappers भी शामिल हैं
    • Rust, LLVM की कुछ functionality expose करने के लिए C++ का उपयोग करता है
    • ये wrappers LLVM version पर निर्भर हैं और इन्हें अलग से build करना झंझट भरा है, इसलिए इन्हें precompiled रूप में दिया गया है

cilly की भूमिका

  • crustc, नई Rust-to-C compiler toolchain cilly का डेमो/टीज़र है
  • पूरी cilly toolchain का लक्ष्य है कि user के Rust code को मनचाहे target के अनुसार C में compile किया जाए
  • यह repository इस तरह बनाई गई है कि cilly compiler को खुद compiler करते हुए दिखा सके
  • cilly एक Rust library भी है और Rust compiler backend भी, यानी plugin के रूप में Rust को C में compile करता है
  • लेखक के अनुसार, वह पिछले 3 साल से Rust को C में compile करने पर काम कर रहे हैं, और rustc_codegen_clr जैसे सार्वजनिक प्रयासों तथा कई निजी प्रयासों के बाद cilly उनका 14वाँ प्रयास है

C compiler के अनुसार code generate करने का तरीका

  • cilly की मुख्य विशेषता यह है कि यह C compiler के अनुसार खुद को ढालता है
  • यह जाँचने के लिए witness program बना सकता है कि कोई विशेष compiler और platform क्या support करते हैं
    • उदाहरण: _Thread_local int KEYWORD_TLS_SUPPORTED; — यह तभी compile होगा जब संबंधित C compiler _Thread_local को support करता हो
  • cilly ऐसा C code generate करने की कोशिश करता है जिसे कोई विशेष C compiler स्वीकार कर सके
  • type layout, size, alignment, character encoding और integer format इसकी query का हिस्सा हैं
    • character encoding के लिए यह जाँचा जाता है कि वह ASCII है या नहीं
    • integer format के लिए यह जाँचा जाता है कि वह two's complement है या नहीं
  • जहाँ संभव हो, fallback का उपयोग किया जाता है
  • ANSI C के बाहर की मान्यताओं से बचने की कोशिश की जाती है, और strict aliasing जैसे आधुनिक C standard व्यवहारों के लिए workaround भी रखे गए हैं
  • कभी-कभी (void*)(uintptr_t)(ptr) जैसे उचित अनुमान की जरूरत पड़ सकती है
    • ऐसे अनुमानों को document किया जाता है, और जहाँ संभव हो CHAR_BIT = 8 जैसे assert जोड़े जाते हैं

target-विशिष्ट C code और ABI सीमाएँ

  • cilly का output C code compiler-specific होता है
    • Arm64 के लिए generate किया गया cilly C, riscv32 पर सीधे नहीं चलाया जा सकता
    • लेकिन riscv32 के लिए अलग cilly C generate किया जा सकता है
  • इस repository का generate किया गया rustc C, लेखक के workstation ISA के कारण ARM64 Linux को target करता है
  • cilly द्वारा generate किया गया code आम तौर पर सामान्य rustc से compile हुए code के साथ ABI-compatible होता है
  • कुछ platforms पर rustc ऐसा ABI चुनता है जिसे C में व्यक्त नहीं किया जा सकता, इसलिए पूरी compatibility मुश्किल हो जाती है
  • Arm64 पर sret यानी structure return pointer के कारण सीमाएँ हैं
    • ज़्यादातर platforms पर sret पहले argument वाले ही register में pass होता है, इसलिए पहले argument को output pointer बनाना संभव होता है
    • Arm64 पर sret pointer एक अलग register में pass होता है
    • लेखक के अनुसार native C compiler को छोटे structs के लिए return-by-sret चुनना चाहिए, लेकिन 16 byte से छोटे structs के लिए वह ऐसा नहीं करता

पुराने या असामान्य targets का समर्थन

  • इस project का मुख्य लक्ष्य है कि पुराने या असामान्य hardware पर भी Rust उपयोग में आ सके, जहाँ LLVM/GCC support नहीं है लेकिन C support मौजूद है
  • जब कोई project Rust से C की ओर जाता है, या किसी C project का Rust विकल्प बनाया जाता है, तब ऐसे targets का support न होना Rust की कमी के रूप में सामने आ सकता है
  • cilly, rustc और C compiler को wrap करता है और Rust code को उसी समय C में बदल देता है
  • user के नज़रिए से यह किसी target के लिए इस्तेमाल होने वाले C compiler को define करने जैसा है
  • उदाहरण configuration में sdcc_z180-unknown-none triple और /usr/bin/sdcc, -mz180, --std-c89, -c arguments का उपयोग होता है

network transparency और remote C compiler

  • cilly में network transparency है और यह TCP के जरिए C compiler से बात कर सकता है
  • आवश्यकता पड़ने पर इसे UART जैसे और भी असामान्य communication तरीकों तक बढ़ाया जा सकता है
  • यह तरीका उन platforms के bootstrap paradox को हल करने के लिए है जहाँ C cross-compiler उपलब्ध नहीं है
  • target OS पर एक छोटा C server build करके चलाया जा सकता है, फिर Linux जैसे सामान्य platform पर rustc चलाकर cilly को network के जरिए communicate कराया जा सकता है
  • लेखक ने Arm64 Linux पर rustc चलाते हुए x86 Plan 9 VM के लिए एक छोटा Rust program सफलतापूर्वक compile किया
    • Plan 9 environment output है gnot osversion 2000 cputype 386
    • /tmp/hello_plan9 चलाने का परिणाम Hello, world! है
    • nm output में rust_begin_unwind symbol दिखाई देता है

makefile generation सुविधा

  • cilly वैकल्पिक रूप से object files में markers डाल सकता है और IR को cache directory में save कर सकता है
  • बाद में इन markers को पढ़कर functions और globals को उनकी definition location के आधार पर अलग किया जा सकता है
  • इसी जानकारी के आधार पर makefile वाली directory generate की जा सकती है, ताकि सिर्फ C compiler और make से Rust build किया जा सके

build और run की शर्तें

  • डेमो build के लिए इस्तेमाल किया गया system Ubuntu-आधारित ARM64 Linux था
    • kernel string है Linux spark-2773 6.17.0-1021-nvidia ... aarch64
  • इस्तेमाल किए गए C compiler की जानकारी GCC 13.3.0 और Ubuntu LLD 18.1.3 है
  • build के लिए सही LLVM library चाहिए, और सबसे आसान तरीका है rustup install nightly-2026-06-16 से संबंधित nightly install करना
  • build command में LLVM_LIB_DIR के जरिए libLLVM.so.22.1-rust-1.98.0-nightly path देकर make -j20 चलाया जाता है
  • CFLAGS काम करते हैं, लेकिन कुछ flags compilation को धीमा कर सकते हैं
  • optimization की सिफारिश नहीं की गई है
    • डेमो अभी काफ़ी कच्चा है और optimization से समस्याएँ आ सकती हैं
    • इस पैमाने पर optimization में बहुत समय लग सकता है
  • बिना optimization के लेखक की machine पर यह कुछ ही मिनटों में build हो जाता है
    • मापा गया परिणाम है 937.98s user, 123.77s system, 1352% cpu, 1:18.48 total
  • optimization चालू करने पर ज़्यादातर code जल्दी निकल जाता है, लेकिन कुछ बड़े Rust files पर अटक सकता है

testing और ज्ञात समस्याएँ

  • build test के लिए LD_LIBRARY_PATH में nightly LLVM library और ./rustc_driver सेट करके ./rustc/rustc --version चलाया जाता है
  • सामान्य program build करने के लिए std को build करना जरूरी है
    • std न होने पर error[E0463]: can't find crate for std error आता है
    • standard library build के लिए BUILDING_STD.md देखना होगा
  • एक ज्ञात bug यह है कि path normalization की अजीब समस्या के कारण crustc उसी directory में crash कर सकता है जहाँ इसे build किया गया हो, यानी repository root में
  • दूसरी locations पर यह सामान्य रूप से काम करता है

cilly की सार्वजनिक स्थिति

  • cilly अभी सार्वजनिक उपयोग के लिए तैयार नहीं है
  • लेखक ने कहा है कि वह इसे जितनी जल्दी हो सके public करेंगे
  • देरी के कारणों में नौकरी, विश्वविद्यालय का thesis, और हाथ की चोट शामिल हैं
  • पूरी cilly toolchain अभी public न होने का एक कारण यह भी है कि optimization-संबंधी bugs अभी ट्रैक किए जा रहे हैं

1 टिप्पणियां

 
GN⁺ 3 시간 전
Lobste.rs की राय
  • यह दिलचस्प है कि यह दिए गए compiler और platform क्या support करते हैं, यह जांचने के लिए witness program बनाता है
    पारंपरिक C configure build chain आम तौर पर इसी तरह काम करती है, यह काफी अजीब लगता है, लेकिन यह compiler, या transpiler, उस pattern को follow करता है, यह समझ में आता है
    “14वां प्रयास: cilly” — क्या जबरदस्त लगन है, और ऐसी persistence से ईर्ष्या होती है
  • तुलना के लिए, Zig compiler के पूरे हिस्से को C में बदला हुआ version मौजूद है, जो source से build करने की सामान्य प्रक्रिया का हिस्सा है
    इसका आकार 46 लाख lines है, यानी यह इस project से लगभग ठीक एक order of magnitude छोटा है। Generated C code target के हिसाब से बदलता है, लेकिन compiler के हिसाब से नहीं
  • मैं system programmer नहीं हूं, लेकिन सोचता हूं कि क्या इस तरह का project Rust और Zig में से क्या इस्तेमाल करना है, इस पर असर डाल सकता है
    Zig की खूबियों में कई तरह के cross-compile targets का support, self-hosting toolchain, और LLVM को optional dependency के रूप में रखना शामिल है; दुर्लभ platforms के लिए Rust को C में compile कर पाने का वादा Zig की तरफ लक्षित signal जैसा भी लगता है
    • सिर्फ crustc इस्तेमाल करने से ऐसा नहीं होता। क्योंकि बदला हुआ compiler भी मूल compiler जैसे ही compile targets support करता है
      हालांकि दूसरे Rust projects को C में बदलकर ऐसे targets पर चलाना और compile करना संभव है जो सिर्फ C support करते हैं
      फिर भी इसके असर को बढ़ा-चढ़ाकर नहीं आंकना चाहिए। यह बहुत niche समस्या के लिए थोड़ा झंझट वाला समाधान है। rustc का target support पहले से ही व्यापक है, और gcc backend के जरिए यह और बढ़ने वाला है
      Zig के cross-compilation tools शानदार हैं, लेकिन खासकर C वाले उस हिस्से में, जो Zig या Rust से ज्यादा मुश्किल है, सुविधा बढ़ाने की दिशा में ज्यादा हैं; अधिक targets support करने का मतलब अपेक्षाकृत कम है
      आखिरकार Zig और Rust का target support पहले से काफी मिलता-जुलता है, इसलिए यह निर्णायक factor बनना मुश्किल है, और दोनों भाषाओं के बीच इससे कहीं ज्यादा महत्वपूर्ण अंतर हैं
  • शानदार तो है, लेकिन आखिरकार यह LLVM की क्षमता से सीमित नहीं हो जाता?
    • ऐसा क्यों होना चाहिए, समझ नहीं आता। crustc, Rust को C में बदलने वाले toolchain cilly की क्षमता दिखाने वाला सिर्फ एक example है
      पूरा cilly toolchain user के Rust code को किसी भी target के लिए C में compile करता है। मुझे लगता है यह repository सबसे चमकदार demo है, इसलिए compiler को खुद को compile करते हुए दिखाती है
  • mrustc(https://github.com/thepowersgang/mrustc) भी देखने लायक है। यह C++ में लिखा Rust compiler है, जो C में transpile करके फिर GCC को सौंपता है, इसलिए rustc को भी C में बदल सकता है