[Powered by Google Translate] रोब BOWDEN: चलो compilers के बारे में बात करते हैं. इस बिंदु तक, तुम सिर्फ अपने स्रोत कोड टाइप है में कुछ फाइलें, वह यह है कि इस बड़े ब्लैक बॉक्स के माध्यम से उन्हें भेजा बजना, और बाहर अपने निष्पादन फाइल जो आता है वास्तव में क्या आप अपने स्रोत कोड में लिखा है. के रूप में किया गया है कि जादुई रूप में, हम एक करीब ले जा रहे हैं वास्तव में क्या हो रहा है पर देखो जब हम एक फ़ाइल संकलन. तो क्या यह करने के लिए कुछ संकलन करने के लिए क्या मतलब है? खैर, सबसे सामान्य अर्थ में, यह सिर्फ मतलब बदलने कोड एक में लिखा है दूसरे के लिए प्रोग्रामिंग भाषा. लेकिन आम तौर पर जब लोगों का कहना है कि वे कुछ वे संकलन, मतलब है कि वे इसे एक उच्च स्तरीय प्रोग्रामिंग से ले जा रहे हैं एक निचले स्तर के प्रोग्रामिंग भाषा के लिए भाषा. ये बहुत ही व्यक्तिपरक शब्दों की तरह लग सकता है. उदाहरण के लिए, आप शायद सी के एक उच्च के रूप में नहीं लगता है स्तरीय प्रोग्रामिंग भाषा है, लेकिन आप यह संकलन. लेकिन यह सब रिश्तेदार है. जैसा कि हम देखेंगे, विधानसभा कोड और अंततः मशीन कोड है कि हम नीचे संकलन undeniably एक निचले स्तर सी. की तुलना हालांकि हम आज के प्रदर्शन में बजना का उपयोग किया जाएगा, यहाँ विचारों के बहुत सारे अन्य compilers पर ले. बजना के लिए, वहाँ समग्र में चार प्रमुख कदम संकलन. दो, ये एक पूर्वप्रक्रमक द्वारा किया preprocessing संकलक द्वारा किया संकलन, तीन, कोडांतरण कोडांतरक द्वारा किया, और चार, जोड़ने linker द्वारा किया. यह भ्रमित किया जा सकता है कि एक समग्र के substeps की बजना compilers संकलक कहा जाता है, लेकिन हम है कि मिल जाएगा. हम हमारे उदाहरण के रूप में एक सरल नमस्ते दुनिया कार्यक्रम का उपयोग किया जाएगा इस वीडियो में. चलो एक नज़र रखना. पहला कदम preprocessing है. पूर्वप्रक्रमक क्या करता है? बहुत ज्यादा हर सी कार्यक्रम में आप कभी या पढ़ा है लिखा, आप कोड की लाइनों है कि एक हैश के साथ शुरू किया है. मैं यह हैश फोन है, लेकिन आप यह भी पाउंड नंबर, फोन कर सकते हैं साइन इन करने के लिए, या तेज. ऐसी कोई भी लाइन एक पूर्वप्रक्रमक निर्देश है. तुम्हें शायद देखा परिभाषित # # पहले शामिल है, लेकिन वहाँ अधिक कई हैं कि पूर्वप्रक्रमक पहचानता है. चलो एक # हमारे हैलो दुनिया उदाहरण परिभाषित है. अब चलो इस फाइल पर सिर्फ पूर्वप्रक्रमक चलाने के. Clage ई ध्वज पारित करके, आप इसे चलाने के लिए निर्देश बस पूर्वप्रक्रमक. चलो देखते हैं कि क्या होता है. ऐसा लगता है कि बजना बस सब कुछ बाहर spits कमांड लाइन पर. आदेश में इस उत्पादन के सभी एक नई नामक एक फाइल को बचाने के लिए hello2.c, हम हमारे कमांड को hello2.c संलग्न हूँ. अब चलो हमारे preprocessed फ़ाइल पर एक नज़र रखना. वाह, क्या हमारी छोटी सी कार्यक्रम के लिए हुआ है? यदि हम इस फाइल के नीचे करने के लिए सभी रास्ते जाओ, हम देखेंगे कोड है कि हम वास्तव में लिखा है की कुछ. सूचना है कि # को परिभाषित करने के लिए चला गया है और नाम की सभी आवृत्तियों वास्तव में क्या हम में निर्दिष्ट के साथ प्रतिस्थापित किया गया है # रेखा को परिभाषित. इसलिए इन सभी typedefs और समारोह घोषणाओं क्या कर रहे हैं फ़ाइल के शीर्ष पर? सूचना है कि परिभाषित # पूर्वप्रक्रमक ही नहीं था निर्देश है कि हम निर्दिष्ट. हम भी # stdio.h शामिल है. तो पागल लाइनों के सभी वास्तव में सिर्फ stdio.h की नकल की और इस फाइल के शीर्ष में चिपकाया. यही कारण है कि हेडर फाइल तो समारोह के लिए उपयोगी होते हैं घोषणाओं. समारोह के सभी को कॉपी और पेस्ट करें की जरूरत के बजाय घोषणाओं आप अपनी फ़ाइल के शीर्ष पर प्रयोग पर योजना, पूर्वप्रक्रमक कॉपी और हैडर से उन्हें चस्पा करेंगे आप के लिए फ़ाइल. अब है कि हम preprocessing कर रहे हैं, हम पर कदम संकलन. कारण है कि हम इस कदम संकलन फोन है क्योंकि यह है कदम जहां बजना वास्तव में अपनी सी से संकलन विधानसभा कोड. आदेश में बजना विधानसभा के लिए एक फ़ाइल नीचे संकलन है, लेकिन कोई आगे जारी रखने के लिए, इसे पारित एस झंडा कमांड लाइन पर. चलो विधानसभा पर एक नज़र रखना फ़ाइल है कि outputted किया गया था. यह काफी अलग भाषा की तरह लग रहा है. विधानसभा कोड बहुत विशिष्ट प्रोसेसर है. इस मामले में, के बाद से CS50 उपकरण पर चल रहा है आभासी x86 प्रोसेसर, इस x86 विधानसभा कोड है. बहुत कम लोगों को विधानसभा कोड में इन दिनों सीधे लिखते हैं, लेकिन हर सी कार्यक्रम आप कभी भी लिख नीचे तब्दील हो जाता है विधानसभा में. फिर, हम इस विधानसभा में सी संकलन कदम के बाद से हम एक उच्च स्तर से निचले स्तर पर जा रहे हैं प्रोग्रामिंग भाषा. क्या सी की तुलना में विधानसभा निचले स्तर बनाता है? खैर, विधानसभा में, हम बहुत हम क्या कर सकते में सीमित कर रहे हैं. वहाँ कोई नहीं है अगर है, जबकि, के लिए किसी भी तरह की या loops हैं. लेकिन आप एक ही चीजें हासिल कर सकते हैं कि इन पर नियंत्रण संरचनाओं सीमित कार्यों का उपयोग करते हैं कि विधानसभा प्रदान करता है. लेकिन देखने के लिए बस कैसे कम स्तर विधानसभा सच है, चलो चलें हमारे संकलन में एक कदम आगे, कोडांतरण. यह कोडांतरक विधानसभा कोड को बदलने का काम है वस्तु या मशीन कोड में. याद रखें कि कोडांतरक उत्पादन विधानसभा नहीं करता; बल्कि, यह विधानसभा और outputs मशीन कोड में लेता है. मशीन कोड वास्तविक 1 और 0 है कि एक सीपीयू कर सकते हैं समझते हैं, हालांकि हम अभी भी काम का एक छोटा सा छोड़ दिया है इससे पहले कि हम अपने कार्यक्रम चला सकते हैं. चलो पासिंग द्वारा हमारे विधानसभा कोड को इकट्ठा बजना ग झंडा. अब देखते हैं क्या इकट्ठे फ़ाइल में है. खैर, कि हमें बहुत ज्यादा नहीं मदद करता है. याद रखें कि मशीन कोड हैं और शून्य है कि अपने कंप्यूटर को समझ सकता हूँ. इसका मतलब यह नहीं है कि यह आसान करने के लिए समझने के लिए हमें है. तो वास्तव में कैसे कम स्तर विधानसभा है? यह लगभग वस्तु कोड के लिए समान है. विधानसभा से वस्तु कोड के लिए जा रहे हैं एक की बहुत अधिक है एक परिवर्तन से अनुवाद, जो क्यों है एक कोडांतरक पर विचार नहीं हो सकता है किसी भी वास्तविक संकलन करना. वास्तव में, यह बहुत आसान है के लिए मैन्युअल रूप से अनुवाद मशीन कोड को विधानसभा. एक मुख्य समारोह के लिए विधानसभा को देखते हुए, कि पहली पंक्ति षोडश आधारी 0x55 के अनुरूप होता है. बाइनरी में 1010101 है. दूसरी पंक्ति के षोडश आधारी 0x895 अनुरूप होता है. और अगले 0x56. एक अपेक्षाकृत सरल तालिका को देखते हुए, आप अनुवाद कर सकता है विधानसभा कोड में है कि मशीनों को भी समझ सकते हैं. तो वहाँ एक में शेष कदम संकलन है, जो जोड़ने के लिए है. एक बड़ी फ़ाइल में जोड़ने वस्तु फ़ाइलों का एक गुच्छा को जोड़ती है है कि आप वास्तव में अमल कर सकते हैं. जोड़ने प्रणाली बहुत निर्भर है. तो सबसे आसान बजना पाने के लिए सिर्फ वस्तु लिंक एक साथ फाइल करने के लिए फ़ाइलों कि सभी पर बजना फोन है आप एक साथ लिंक करना चाहते हैं. अगर तुम ओ फ़ाइलों निर्दिष्ट है, तो यह पुनर्संसाधन नहीं की आवश्यकता होगी, संकलन, और अपने स्रोत कोड के सभी इकट्ठा. चलो हमारे फाइल में एक गणित समारोह फेंक, तो हम कुछ अंदर लिंक अब चलो इसे वापस वस्तु कोड के लिए नीचे संकलन उस पर फोन बजना. उफ़! चूंकि हम एक गणित समारोह में शामिल है, हम कड़ी करने की आवश्यकता है गणित पुस्तकालय के साथ lm. अगर हम एक साथ का गुच्छा लिंक करना चाहता था. ओ फ़ाइलें हम अपने दम पर लिखा है, हम बस में उन सब को निर्दिष्ट चाहते हैं कमांड लाइन. प्रतिबंध इन फ़ाइलों की कि केवल एक जरूरी है वास्तव में एक मुख्य समारोह को निर्दिष्ट करने के लिए, या किसी और जिसके परिणामस्वरूप निष्पादन योग्य पता नहीं कहाँ से शुरू होगा अपने कोड चल रहा है. एक फ़ाइल निर्दिष्ट में लिंक के बीच क्या अंतर है के साथ मैं और सिर्फ एक फाइल सीधे निर्दिष्ट? कुछ भी नहीं. यह सिर्फ कि बजना करने के लिए वास्तव में क्या फ़ाइल पता होता है lm तरह कुछ का उल्लेख करने के लिए होता है. यदि आपको लगता है कि फाइल स्वयं जानता था, आप यह निर्दिष्ट कर सकते हैं स्पष्ट रूप से. बस याद है कि सभी एल झंडे अंत में आते है अपने ग्राहक की मांग की. और कहा कि सब वहाँ यह है है. जब तुम सिर्फ कुछ फ़ाइलों पर बजना चलाते हैं, यह है कि यह क्या है वास्तव में कर रहे हैं. मेरा नाम रोब Bowden है, और इस CS50 है.