एकल संकलन इकाई: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
एकल संकलन इकाई (एससीयू) [[सी (प्रोग्रामिंग भाषा)]] और [[सी ++]] भाषाओं के लिए एक [[कंप्यूटर प्रोग्रामिंग]] | एकल संकलन इकाई (एससीयू) [[सी (प्रोग्रामिंग भाषा)]] और [[सी ++]] भाषाओं के लिए एक [[कंप्यूटर प्रोग्रामिंग]] विधि है जो कई फाइलों में फैले कार्यक्रमों के संकलन समय को कम करती है। विशेष रूप से यह संकलक को साझा शीर्षलेख फ़ाइलों परिभाषाओं और टेम्पलेट्स से डेटा रखने की अनुमति देता है जिससे उसे प्रत्येक फ़ाइल के लिए उन्हें फिर से बनाने की आवश्यकता न हो यह [[संकलक अनुकूलन]] का एक उदाहरण है। विधि को संपूर्ण प्रोग्राम या स्रोत फ़ाइलों के कुछ सबसेट पर प्रयुक्त किया जा सकता है; जब इसे पूरे प्रोग्राम पर प्रयुक्त किया जाता है तो इसे [[एकता निर्माण]] के रूप में भी जाना जाता है।<ref>{{Cite web |last=Developer |first=Unicorn |date=2017-12-25 |title=C और C++ परियोजनाओं के निर्माण में तेजी लाना|url=https://unicorn-dev.medium.com/speeding-up-the-build-of-c-and-c-projects-453ce85dd0e1 |access-date=2022-03-16 |website=Medium |language=en}}</ref> | ||
== उद्देश्य == | == उद्देश्य == | ||
C/C++ संकलन मॉडल (औपचारिक रूप से अनुवाद वातावरण) में, अलग-अलग {{mono|.c}}/{{mono|.cpp}} स्रोत फ़ाइलों को [[अनुवाद इकाई (प्रोग्रामिंग)]] में प्रीप्रोसेस किया जाता है, जिन्हें बाद में संकलक द्वारा अलग-अलग ऑब्जेक्ट में [[संकलित]] किया जाता है ({{mono|.o}} या {{mono|.obj}}) फ़ाइलें। ये ऑब्जेक्ट फ़ाइलें तब एक निष्पादन योग्य फ़ाइल या लाइब्रेरी बनाने के लिए एक साथ [[लिंकर (कंप्यूटिंग)]] हो सकती हैं। | C/C++ संकलन मॉडल (औपचारिक रूप से अनुवाद वातावरण) में, अलग-अलग {{mono|.c}}/{{mono|.cpp}} स्रोत फ़ाइलों को [[अनुवाद इकाई (प्रोग्रामिंग)]] में प्रीप्रोसेस किया जाता है, जिन्हें बाद में संकलक द्वारा अलग-अलग ऑब्जेक्ट में [[संकलित]] किया जाता है ({{mono|.o}} या {{mono|.obj}}) फ़ाइलें। ये ऑब्जेक्ट फ़ाइलें तब एक निष्पादन योग्य फ़ाइल या लाइब्रेरी बनाने के लिए एक साथ [[लिंकर (कंप्यूटिंग)]] हो सकती हैं। चूँकि यह सामान्य हेडर फ़ाइलों पर कई पास किए जा रहे हैं, और C ++ के साथ, विभिन्न अनुवाद इकाइयों में एक ही टेम्प्लेट (प्रोग्रामिंग) के कई टेम्प्लेट इंस्टेंटेशन हैं। | ||
एकल संकलन इकाई | एकल संकलन इकाई विधि लिंक समय के बजाय संकलन समय पर विभिन्न अनुवाद इकाइयों को एक साथ चिपकाने के लिए प्री-प्रोसेसर निर्देशों का उपयोग करती है। यह दोहराव को समाप्त करने के कारण समग्र निर्माण समय को कम करता है किंतु संपूर्ण इकाई के पूर्ण पुनर्निर्माण की आवश्यकता के कारण वृद्धिशील निर्माण समय (एससीयू में सम्मिलित किसी एकल स्रोत फ़ाइल में परिवर्तन करने के बाद आवश्यक समय) को बढ़ाता है। यदि कोई एकल इनपुट फ़ाइल बदलती है।<ref>{{Cite book |last=Krajewski |first=Marek |url=https://books.google.com/books?id=kiWGDwAAQBAJ&q=%22single+compilation+unit%22 |title=Hands-On High Performance Programming with Qt 5: Build cross-platform applications using concurrency, parallel programming, and memory management |date=2019-01-31 |publisher=Packt Publishing Ltd |isbn=978-1-78953-330-9 |language=en}}</ref> इसलिए यह विधि महत्वपूर्ण ओवरलैप (कई या महंगे सामान्य हेडर या टेम्प्लेट) या स्रोत फ़ाइलों के साथ अधिकांशतः संशोधित स्रोत फ़ाइलों के एक सेट के लिए उपयुक्त है, जिन्हें अधिकांशतः एक साथ पुनर्संकलन की आवश्यकता होती है, जैसे कि एक सामान्य हेडर या टेम्पलेट सहित सभी के कारण जो अधिकांशतः बदलता रहता है .<ref>{{Cite book |last=Schach |url=https://books.google.com/books?id=YrM9xF6adb8C&dq=%22single+compilation+unit%22&pg=PA183 |title=प्रैक्टिकल सॉफ्टवेयर इंजीनियरिंग|date=1992-05-19 |publisher=CRC Press |isbn=978-0-256-11454-6 |pages=183 |language=en}}</ref> | ||
एससीयू का एक और हानि यह है कि यह सीरियल है सभी सम्मिलित स्रोत फ़ाइलों को एक प्रक्रिया में अनुक्रम में संकलित करता है और इस प्रकार इसे समानांतर नहीं किया जा सकता है जैसा कि अलग संकलन ([[distcc|दिस्त्च्क]] या इसी तरह के कार्यक्रमों के माध्यम से) में किया जा सकता है। इस प्रकार एससीयू को संकलन को समानांतर करने के लिए स्पष्ट विभाजन (मैन्युअल विभाजन या कई इकाइयों में शार्डिंग) की आवश्यकता होती है। | |||
एससीयू एक [[अनुकूलन संकलक]] को [[लिंक-समय अनुकूलन]] की आवश्यकता के बिना [[अंतरप्रक्रियात्मक अनुकूलन]] करने की अनुमति देता है, इसलिए [[इनलाइन समारोह|इनलाइन कार्य]] जैसे ऑप्टिमाइज़ेशन की अनुमति देता है और [[ एक्सेप्शन हेंडलिंग |एक्सेप्शन हेंडलिंग]] [[ साइड इफेक्ट (कंप्यूटर विज्ञान) |साइड इफेक्ट (कंप्यूटर विज्ञान)]] , और रजिस्टर आवंटन के कारण निहित कोड ब्लोट से बचने में सहायता करता है। स्वतंत्र संकलन के कारण ये अनुकूलन अधिकांशतः कई संकलकों में संभव नहीं होते हैं जहां संकलन के समय प्रत्येक अनुवाद इकाई में अनुकूलन अलग-अलग होता है किंतु डंब लिंकर बिना किसी अनुकूलन के केवल ऑब्जेक्ट फ़ाइलों को लिंक करता है और इस प्रकार अनुवाद इकाइयों संभव के बीच अंतर-प्रक्रियात्मक अनुकूलन नहीं होता है | |||
== उदाहरण == | == उदाहरण == | ||
उदाहरण के लिए | उदाहरण के लिए यदि आपके पास स्रोत फ़ाइलें हैं {{mono|foo.cpp}} और {{mono|bar.cpp}}, उन्हें एक एकल संकलन इकाई में निम्नानुसार रखा जा सकता है: | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
Line 37: | Line 38: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
अब मानक शीर्षलेख फ़ाइल | |||
अब मानक शीर्षलेख फ़ाइल t{{code|iostream}}ream केवल एक बार संकलित की जाती है, और कार्य बार को किसी अन्य मॉड्यूल से होने के अतिरिक्त कार्य {{code|main}} में रेखांकित किया जा सकता है। | |||
== यह भी देखें == | == यह भी देखें == | ||
* पूर्व संकलित शीर्षलेख | * पूर्व संकलित शीर्षलेख | ||
*C प्रीप्रोसेसर | *C प्रीप्रोसेसर C/C++ प्रीप्रोसेसर | ||
* संपूर्ण कार्यक्रम अनुकूलन | * संपूर्ण कार्यक्रम अनुकूलन | ||
Revision as of 11:55, 2 June 2023
एकल संकलन इकाई (एससीयू) सी (प्रोग्रामिंग भाषा) और सी ++ भाषाओं के लिए एक कंप्यूटर प्रोग्रामिंग विधि है जो कई फाइलों में फैले कार्यक्रमों के संकलन समय को कम करती है। विशेष रूप से यह संकलक को साझा शीर्षलेख फ़ाइलों परिभाषाओं और टेम्पलेट्स से डेटा रखने की अनुमति देता है जिससे उसे प्रत्येक फ़ाइल के लिए उन्हें फिर से बनाने की आवश्यकता न हो यह संकलक अनुकूलन का एक उदाहरण है। विधि को संपूर्ण प्रोग्राम या स्रोत फ़ाइलों के कुछ सबसेट पर प्रयुक्त किया जा सकता है; जब इसे पूरे प्रोग्राम पर प्रयुक्त किया जाता है तो इसे एकता निर्माण के रूप में भी जाना जाता है।[1]
उद्देश्य
C/C++ संकलन मॉडल (औपचारिक रूप से अनुवाद वातावरण) में, अलग-अलग .c/.cpp स्रोत फ़ाइलों को अनुवाद इकाई (प्रोग्रामिंग) में प्रीप्रोसेस किया जाता है, जिन्हें बाद में संकलक द्वारा अलग-अलग ऑब्जेक्ट में संकलित किया जाता है (.o या .obj) फ़ाइलें। ये ऑब्जेक्ट फ़ाइलें तब एक निष्पादन योग्य फ़ाइल या लाइब्रेरी बनाने के लिए एक साथ लिंकर (कंप्यूटिंग) हो सकती हैं। चूँकि यह सामान्य हेडर फ़ाइलों पर कई पास किए जा रहे हैं, और C ++ के साथ, विभिन्न अनुवाद इकाइयों में एक ही टेम्प्लेट (प्रोग्रामिंग) के कई टेम्प्लेट इंस्टेंटेशन हैं।
एकल संकलन इकाई विधि लिंक समय के बजाय संकलन समय पर विभिन्न अनुवाद इकाइयों को एक साथ चिपकाने के लिए प्री-प्रोसेसर निर्देशों का उपयोग करती है। यह दोहराव को समाप्त करने के कारण समग्र निर्माण समय को कम करता है किंतु संपूर्ण इकाई के पूर्ण पुनर्निर्माण की आवश्यकता के कारण वृद्धिशील निर्माण समय (एससीयू में सम्मिलित किसी एकल स्रोत फ़ाइल में परिवर्तन करने के बाद आवश्यक समय) को बढ़ाता है। यदि कोई एकल इनपुट फ़ाइल बदलती है।[2] इसलिए यह विधि महत्वपूर्ण ओवरलैप (कई या महंगे सामान्य हेडर या टेम्प्लेट) या स्रोत फ़ाइलों के साथ अधिकांशतः संशोधित स्रोत फ़ाइलों के एक सेट के लिए उपयुक्त है, जिन्हें अधिकांशतः एक साथ पुनर्संकलन की आवश्यकता होती है, जैसे कि एक सामान्य हेडर या टेम्पलेट सहित सभी के कारण जो अधिकांशतः बदलता रहता है .[3]
एससीयू का एक और हानि यह है कि यह सीरियल है सभी सम्मिलित स्रोत फ़ाइलों को एक प्रक्रिया में अनुक्रम में संकलित करता है और इस प्रकार इसे समानांतर नहीं किया जा सकता है जैसा कि अलग संकलन (दिस्त्च्क या इसी तरह के कार्यक्रमों के माध्यम से) में किया जा सकता है। इस प्रकार एससीयू को संकलन को समानांतर करने के लिए स्पष्ट विभाजन (मैन्युअल विभाजन या कई इकाइयों में शार्डिंग) की आवश्यकता होती है।
एससीयू एक अनुकूलन संकलक को लिंक-समय अनुकूलन की आवश्यकता के बिना अंतरप्रक्रियात्मक अनुकूलन करने की अनुमति देता है, इसलिए इनलाइन कार्य जैसे ऑप्टिमाइज़ेशन की अनुमति देता है और एक्सेप्शन हेंडलिंग साइड इफेक्ट (कंप्यूटर विज्ञान) , और रजिस्टर आवंटन के कारण निहित कोड ब्लोट से बचने में सहायता करता है। स्वतंत्र संकलन के कारण ये अनुकूलन अधिकांशतः कई संकलकों में संभव नहीं होते हैं जहां संकलन के समय प्रत्येक अनुवाद इकाई में अनुकूलन अलग-अलग होता है किंतु डंब लिंकर बिना किसी अनुकूलन के केवल ऑब्जेक्ट फ़ाइलों को लिंक करता है और इस प्रकार अनुवाद इकाइयों संभव के बीच अंतर-प्रक्रियात्मक अनुकूलन नहीं होता है
उदाहरण
उदाहरण के लिए यदि आपके पास स्रोत फ़ाइलें हैं foo.cpp और bar.cpp, उन्हें एक एकल संकलन इकाई में निम्नानुसार रखा जा सकता है:
#include "foo.cpp"
#include "bar.cpp"
कल्पना करना foo.cpp और bar.cpp हैं:
//foo.cpp
#include <iostream> // A large, standard header
#include "bar.h" // Declaration of function 'bar'
int main() // Definition of function 'main'
{
bar();
}
//bar.cpp
#include <iostream> // The same large, standard header
void bar() // Definition of function 'bar'
{
...
}
अब मानक शीर्षलेख फ़ाइल tiostream
ream केवल एक बार संकलित की जाती है, और कार्य बार को किसी अन्य मॉड्यूल से होने के अतिरिक्त कार्य main
में रेखांकित किया जा सकता है।
यह भी देखें
- पूर्व संकलित शीर्षलेख
- C प्रीप्रोसेसर C/C++ प्रीप्रोसेसर
- संपूर्ण कार्यक्रम अनुकूलन
संदर्भ
- ↑ Developer, Unicorn (2017-12-25). "C और C++ परियोजनाओं के निर्माण में तेजी लाना". Medium (in English). Retrieved 2022-03-16.
- ↑ Krajewski, Marek (2019-01-31). Hands-On High Performance Programming with Qt 5: Build cross-platform applications using concurrency, parallel programming, and memory management (in English). Packt Publishing Ltd. ISBN 978-1-78953-330-9.
- ↑ Schach (1992-05-19). प्रैक्टिकल सॉफ्टवेयर इंजीनियरिंग (in English). CRC Press. p. 183. ISBN 978-0-256-11454-6.