crustc: पूरे rustc को C में रूपांतरित करना
(github.com/FractalFir)crustcएक डेमो है जोrustc 1.98.0-nightly (c712ea946 2026-06-16)के पूरे हिस्से को 4.6 करोड़ लाइनों के C कोड में बदलता है, औरGCCवmakeसे बिल्ड करने पर एक काम करने वाला Rust compiler बनता है- इसका आधारभूत टूल
cillyएक Rust compiler backend है जो Rust को C में compile करता है, और यह repository compiler द्वारा खुद को compile करने का सबसे प्रमुख showcase है cillytarget 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 करता है; पूरा
cillytoolchain अभी सार्वजनिक उपयोग के लिए तैयार नहीं है और 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-nightlyversion प्रिंट होता है - 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 toolchaincillyका डेमो/टीज़र है- पूरी
cillytoolchain का लक्ष्य है कि user के Rust code को मनचाहे target के अनुसार C में compile किया जाए - यह repository इस तरह बनाई गई है कि
cillycompiler को खुद 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 जोड़े जाते हैं
- ऐसे अनुमानों को document किया जाता है, और जहाँ संभव हो
target-विशिष्ट C code और ABI सीमाएँ
cillyका output C code compiler-specific होता है- Arm64 के लिए generate किया गया
cillyC, riscv32 पर सीधे नहीं चलाया जा सकता - लेकिन riscv32 के लिए अलग
cillyC generate किया जा सकता है
- Arm64 के लिए generate किया गया
- इस repository का generate किया गया
rustcC, लेखक के 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 पर
sretpointer एक अलग register में pass होता है - लेखक के अनुसार native C compiler को छोटे structs के लिए return-by-sret चुनना चाहिए, लेकिन 16 byte से छोटे structs के लिए वह ऐसा नहीं करता
- ज़्यादातर platforms पर
पुराने या असामान्य 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-nonetriple और/usr/bin/sdcc,-mz180,--std-c89,-carguments का उपयोग होता है
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!हैnmoutput मेंrust_begin_unwindsymbol दिखाई देता है
- Plan 9 environment output है
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
- kernel string है
- इस्तेमाल किए गए 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-nightlypath देकर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 stderror आता है- standard library build के लिए
BUILDING_STD.mdदेखना होगा
- एक ज्ञात bug यह है कि path normalization की अजीब समस्या के कारण
crustcउसी directory में crash कर सकता है जहाँ इसे build किया गया हो, यानी repository root में - दूसरी locations पर यह सामान्य रूप से काम करता है
cilly की सार्वजनिक स्थिति
cillyअभी सार्वजनिक उपयोग के लिए तैयार नहीं है- लेखक ने कहा है कि वह इसे जितनी जल्दी हो सके public करेंगे
- देरी के कारणों में नौकरी, विश्वविद्यालय का thesis, और हाथ की चोट शामिल हैं
- पूरी
cillytoolchain अभी public न होने का एक कारण यह भी है कि optimization-संबंधी bugs अभी ट्रैक किए जा रहे हैं
1 टिप्पणियां
Lobste.rs की राय
पारंपरिक C
configurebuild chain आम तौर पर इसी तरह काम करती है, यह काफी अजीब लगता है, लेकिन यह compiler, या transpiler, उस pattern को follow करता है, यह समझ में आता है“14वां प्रयास: cilly” — क्या जबरदस्त लगन है, और ऐसी persistence से ईर्ष्या होती है
इसका आकार 46 लाख lines है, यानी यह इस project से लगभग ठीक एक order of magnitude छोटा है। Generated C code target के हिसाब से बदलता है, लेकिन compiler के हिसाब से नहीं
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 पहले से ही व्यापक है, औरgccbackend के जरिए यह और बढ़ने वाला हैZig के cross-compilation tools शानदार हैं, लेकिन खासकर C वाले उस हिस्से में, जो Zig या Rust से ज्यादा मुश्किल है, सुविधा बढ़ाने की दिशा में ज्यादा हैं; अधिक targets support करने का मतलब अपेक्षाकृत कम है
आखिरकार Zig और Rust का target support पहले से काफी मिलता-जुलता है, इसलिए यह निर्णायक factor बनना मुश्किल है, और दोनों भाषाओं के बीच इससे कहीं ज्यादा महत्वपूर्ण अंतर हैं
crustc, Rust को C में बदलने वाले toolchaincillyकी क्षमता दिखाने वाला सिर्फ एक example हैपूरा
cillytoolchain user के Rust code को किसी भी target के लिए C में compile करता है। मुझे लगता है यह repository सबसे चमकदार demo है, इसलिए compiler को खुद को compile करते हुए दिखाती हैrustcको भी C में बदल सकता है