कंपाइलर के बारे में आम गलतफ़हमियाँ
(sbaziotis.com)कंपाइलर optimization के बारे में गलतफ़हमियाँ
- क्या optimization सबसे बेहतर program देता है?
- कंपाइलर का लक्ष्य सबसे बेहतर program बनाना नहीं, बल्कि सरल बनाए गए program को सुधारना होता है।
- code size optimization संभव हो सकती है, लेकिन execution time optimization मापन की कठिनाई, optimal substructure की अनुपस्थिति, और hardware model की अशुद्धता जैसी वजहों से कठिन है।
- execution time को code size की तरह सटीक रूप से मापना कठिन है, यह कई कारकों से प्रभावित होता है, और इसमें optimal substructure नहीं होता। उदाहरण के लिए, दो loops को अलग-अलग optimize करने पर भी पूरे program के optimization के लिए उन्हें मिलाना पड़ सकता है। साथ ही, target hardware का सटीक model न होने से optimization कठिन हो जाता है। उदाहरण के लिए, goSLP वैश्विक रूप से optimized SLP vectorization code बनाता है, लेकिन hardware model की अशुद्धता के कारण बना हुआ program optimal नहीं होता और LLVM से धीमा भी हो सकता है।
branch prediction से जुड़ी गलतफ़हमियाँ
- क्या branch weights CPU के branch predictor में इस्तेमाल होते हैं?
- x86 architecture में कंपाइलर branch hints generate नहीं करता।
- branch weights का उपयोग कंपाइलर के code block placement में होता है। (उदाहरण: यदि branch की संभावना अधिक हो, तो instruction cache locality बढ़ाने के लिए target block को current block के ठीक नीचे रखा जाता है)
- हाल की Intel Redwood Cove architecture में branch hints फिर से प्रासंगिक हुए हैं, लेकिन व्यवहार में कंपाइलर ऐसे hints बहुत कम generate करते हैं।
optimization levels के बारे में गलतफ़हमियाँ
- क्या -O3, -O2 की तुलना में बहुत तेज़ code बनाता है?
- Clang में -O2 और -O3 के performance में बड़ा अंतर नहीं होता, और GCC में -O2, Clang की तुलना में कम आक्रामक है, इसलिए थोड़ा अंतर हो सकता है।
- -O3 लगभग code size की परवाह नहीं करता, इसलिए instruction cache की समस्या हो सकती है।
- benchmark करके देखना बेहतर है।
Javascript interpreter और JIT compiler के बारे में गलतफ़हमियाँ
- क्या Javascript interpreter runtime पर JIT compilation इसलिए करता है क्योंकि पहले से पता नहीं होता कि कौन-सा path hot है?
- सिर्फ़ hot path का पता होना काफ़ी नहीं है, type information भी चाहिए।
- type information सिर्फ़ runtime पर ही पता चल सकती है, इसलिए JIT compiler runtime पर code compile करता है।
compiler और interpreter के संबंध के बारे में गलतफ़हमियाँ
- अगर compiler है, तो interpreter की ज़रूरत नहीं होती?
- C/C++ में interpreter बहुत उपयोगी नहीं है, लेकिन WebAssembly जैसे मामलों में interpreter विकास और उपयोग की सरलता, debugging, और security जैसे फ़ायदे दे सकता है।
compiler के middle-end के बारे में गलतफ़हमियाँ
- क्या middle-end target/platform से स्वतंत्र होता है?
- LLVM के मामले में middle-end पूरी तरह target/platform-independent नहीं है।
data locality optimization के बारे में गलतफ़हमियाँ
- क्या compiler data locality को optimize करता है?
- compiler instruction cache locality को optimize करता है, लेकिन data locality को लगभग optimize नहीं करता।
- data locality optimization के लिए code में बड़े पैमाने पर बदलाव चाहिए, और C/C++ compilers ऐसे बदलाव नहीं कर सकते।
- data locality सुधारने के लिए data-oriented design जैसी techniques का उपयोग करना चाहिए।
compile speed के बारे में गलतफ़हमियाँ
- क्या -O0 तेज़ compilation देता है?
- -O0 debugging-friendly और predictable code बनाता है, लेकिन यह हमेशा तेज़ compilation की गारंटी नहीं देता।
- आम तौर पर -O0, -O2 से तेज़ होता है, लेकिन यह project size और compiler पर निर्भर कर सकता है।
- तेज़ compilation के लिए standard compilation pipeline को bypass करने (जैसे TinyCC) या सीधे LLVM IR generate करने पर विचार किया जा सकता है।
template compile speed के बारे में गलतफ़हमियाँ
- क्या templates compile speed को धीमा कर देते हैं?
- C++ templates के धीमे compile होने का कारण C++ का compilation model है।
- templates स्वयं compile speed को बहुत ज़्यादा कम नहीं करते।
- Dlang की standard library Phobos बहुत सारे templates का उपयोग करती है, फिर भी तेज़ी से compile होती है।
separate compilation की उपयोगिता के बारे में गलतफ़हमियाँ
- क्या separate compilation हमेशा फ़ायदेमंद होता है?
- separate compilation में link time लंबा हो सकता है।
- कई projects में unity build (सारा code एक single file में शामिल करना) बेहतर performance देता है।
- unity build whole-program optimization, compile speed improvement, और error log improvement जैसे फ़ायदे देता है।
- ऐसे मामले कम हैं जहाँ separate compilation, unity build से बेहतर हो।
link-time optimization (LTO) के बारे में गलतफ़हमियाँ
- link-time optimization (LTO) link time पर ही क्यों होता है?
- LTO whole-program optimization के लिए किया जाता है।
- सिद्धांत रूप से middle-end में whole-program optimization करना अधिक तार्किक है, लेकिन C/C++ build systems की व्यावहारिक समस्याओं (source files ढूँढ़ना और call graph समझने की कठिनाई) के कारण यह link time पर किया जाता है।
- linker सभी object files ढूँढ़ सकता है, इसलिए compiler object files में LLVM IR जैसी intermediate representation शामिल करता है ताकि linker उसे access कर सके।
inlining optimization के बारे में गलतफ़हमियाँ
- क्या inlining मुख्य रूप से function call instructions हटाने की वजह से उपयोगी है?
- function call instructions हटाना एक फ़ायदा है, लेकिन inlining का सबसे बड़ा फ़ायदा यह है कि यह दूसरी optimizations को संभव बनाता है।
- inlining interprocedural optimization को संभव बनाता है।
- inlining के ज़रिए कई functions का code एक function में मिल जाए, तो मौजूदा intra-function optimization techniques लागू की जा सकती हैं।
inline keyword की भूमिका के बारे में गलतफ़हमियाँ
- क्या inline keyword का inlining optimization से संबंध है?
- C++ में inline keyword मूल रूप से optimizer के लिए hint था, लेकिन C++98 के बाद इसका अर्थ "multiple definitions allowed" हो गया।
- LLVM में inline keyword होने पर inlinehint attribute जोड़ा जाता है और inlining threshold बढ़ाई जाती है, लेकिन उसका प्रभाव बहुत बड़ा नहीं होता।
- किसी function को हमेशा inline करना हो, तो always_inline specifier का उपयोग करना चाहिए।
compiler learning resources के बारे में गलतफ़हमियाँ
- क्या LLVM सीखने के लिए सबसे अच्छा compiler है?
- LLVM शैक्षिक दृष्टि से उपयोगी है, लेकिन यह कई तरह के use cases को support करता है, इसलिए जटिल और विशाल है।
- compiler development सीखने के लिए पहले Go compiler, LDC, DMD जैसे छोटे और सरल compilers को देखना बेहतर है।
undefined behavior के बारे में गलतफ़हमियाँ
-
क्या undefined behavior सिर्फ़ optimization को संभव बनाता है?
- undefined behavior optimization को अक्षम भी कर सकता है।
-
क्या compiler undefined behavior को "बस" define कर सकता है?
- compiler undefined behavior को define कर सकता है, लेकिन इससे performance पर असर पड़ सकता है।
- आदर्श रूप से compiler को सभी undefined behavior को platform के behavior के रूप में define करना चाहिए, लेकिन व्यवहार में यह आसान नहीं है।
AI-आधारित code generation के बारे में गलतफ़हमियाँ
- क्या 99% accuracy वाला code generation ठीक है?
- compiler द्वारा generated code में 99% accuracy भी व्यावहारिक उपयोग के लिए काफ़ी नहीं है।
- code में 1% errors debugging और maintenance में बड़ी कठिनाई पैदा करते हैं।
- बड़े projects में 1% errors बहुत गंभीर समस्याएँ पैदा कर सकते हैं।
- मौजूदा LLM, compilers की तुलना में बहुत धीमे हैं, इसलिए वे online code generation के लिए उपयुक्त नहीं हैं।
अभी कोई टिप्पणी नहीं है.