2008-12-09 18 views
10

बेहतर कोड लिखने के लिए, क्या यह समझना महत्वपूर्ण है कि संकलक क्या करता है?हम कितने संकलक को जानते हैं?

बस कितना पर्याप्त होगा? मैं थोड़ा सा स्क्रबर नहीं हूं, लेकिन मैं सोच रहा था कि संकलक कैसे काम करता है मुझे एक बेहतर प्रोग्रामर बना देगा। क्या मै गलत हु?

यदि हां, तो क्या संसाधनों की सलाह देंगे?

उत्तर

2

मुझे लगता है कि हर प्रोग्रामर कैसे एक संकलक, कैसे स्मृति काम करता है मशीन निर्देश, अनुकूलन में अपने उच्च स्तर के कोड है कि किया जा सकता है बदल जाता है की एक बुनियादी समझ होनी चाहिए, और अपने कोड हार्डवेयर पर निष्पादित करता है। मुझे लगता है कि इससे इस बारे में जागरूक होने में मदद मिलती है ताकि आप अपने कार्यक्रम के प्रदर्शन को बेहतर तरीके से समझ सकें और इससे आपको बेहतर कार्यान्वयन विकल्प बनाने में मदद मिल सकती है।

यह शायद कि आप वास्तव में मशीन कोड लिख सकते हैं या जानते कि वास्तव में क्या आभासी स्मृति वास्तुकला आपके सिस्टम का उपयोग करता है करने में सक्षम हो महत्वपूर्ण नहीं है, लेकिन इन अवधारणाओं मुझे लगता है कि यह मूलभूत विचार महत्वपूर्ण है।

संपादित

उदाहरण के लिए: सी पंक्ति प्रमुख प्रारूप में सरणियों में compilers दुकान डेटा ताकि आप उच्चतम आयाम (सबसे दाएं इंडेक्स) पहले अलग बहुआयामी सरणियों से अधिक पुनरावृति करना चाहिए और उसके बाद सबसे कम आयाम के लिए आगे बढ़ने (बाएं सबसे अधिक सूचकांक)। फोरट्रान बिल्कुल विपरीत है, कॉलम प्रमुख प्रारूप में सरणी संग्रहित करता है। इसका मतलब है कि फोरट्रान में आपको पहले सबसे कम आयाम बदलना चाहिए, उच्चतम आयाम पर आगे बढ़ना चाहिए। यह आपके कोड के कैश हिट अनुपात में सुधार करेगा और बड़े बहुआयामी सरणी के लिए प्रदर्शन में काफी सुधार करेगा।

+0

आजकल दोनों पुनरावृत्तियों के बीच कोई प्रदर्शन अंतर नहीं है। निश्चित नहीं है कि यह क्यों हुआ या कैसे हुआ, लेकिन यदि आप वास्तव में इसे आज़माते हैं तो पुनरावृत्ति वास्तविकता में एक ही समय लेगी। तो सरणी उदाहरण वास्तव में वास्तव में मान्य नहीं है। –

+1

शायद एएसटी पुनर्लेखन स्तर पर अनुकूलक द्वारा तय किया गया ... बस अनुमान लगा रहा है। – dmckee

+1

यह एक समस्या है जिसे एक उन्नत कंपाइलर द्वारा तय किया जा सकता है, लेकिन सभी कंपाइलर ऐसा नहीं करते हैं। यह जानने के लिए और अधिक कारण है कि संकलक कैसे काम करता है और यह क्या कर सकता है। –

20

शायद यह जानने में कोई दिक्कत नहीं होगी कि कंपाइलर आपके कोड को कैसे अनुकूलित करेगा, लेकिन कंपाइलर के लिए न लिखें, लेकिन लोगों को पढ़ने के लिए लिखें।

संकलक के लिए अधिक अनुकूलन करने वाले तरीके से कोड लिखना लोगों को इसे पढ़ने के लिए और अधिक कठिन बना सकता है, और इन दिनों कंपाइलर शायद आपके लिए कोड को अनुकूलित करने के लिए बेहतर जानता है।

+0

कुछ भाषाएं (जावास्क्रिप्ट, PHP) आपको अनुकूलन के तरीके में बहुत कुछ नहीं देती है, इसलिए पठनीय और कुशल के बीच समझौता करना आवश्यक है। –

10

सब पर प्रभाव का कोई सबूत के बिना, मैं समझ संकलनकर्ता और विधानसभा का एक सा के बारे में सिर्फ एक छोटे से जानने के लिए मेरे कोड के लिए होता बारे में बेहतर महसूस। आप Jack Crenshaw's Let's Build a Compiler पढ़कर बहुत कुछ सीख सकते हैं।

तो फिर तुम और अधिक परिष्कृत संकलक तरीकों पर गौर कर सकते हैं, तो आप अपने आप को रुचि रखते हैं।


संपादित करें: यह भी ध्यान देने योग्य बात है कि समस्याओं है कि एक "संकलक" के लिए फोन नहीं है की एक बहुत कुछ अभी भी सबसे अच्छा संकलक तरीकों से सेवा कर रहे हैं लायक है। किसी भी मामूली जटिल कमांड भाषा को पार्स करना एक कंपाइलर समस्या है, भले ही आप निष्पादन योग्य नहीं लिख रहे हों।


EDIT2: सामान्य ग्रंथों में से कई संकलक समस्या है, जो डराना किया जा सकता है या भ्रामक पहली बार में करने के लिए एक काफी सार, गणितीय दृष्टिकोण अपनाते हैं। क्रैनशॉ ट्यूटोरियल लेखक की अधिक सूक्ष्म समझ से सूचित किया जाता है कि "कोड को टक्कर देना शुरू करें" दृष्टिकोण लेता है। अच्छा परिचय, लेकिन यदि आप गंभीर हैं तो अधिक औपचारिक अध्ययन के साथ पालन करना चाहिए।

+0

धन्यवाद! मैं Creenshaw के ट्यूटोरियल में देख रहा हूँ और वास्तव में एक महान प्रारंभिक बिंदु है! –

1

मुझे लगता है कि संकलक क्या करता है यह महत्वपूर्ण बात है (यह एक्स, वाई, जेड विशेषताओं के साथ एक स्पष्टीकरण बनाता है) जिसका अनुवाद आप जिस प्लेटफॉर्म को लक्षित कर रहे हैं उसे जानने में अनुवादित है।

जिस तरह से यह है कि काम करता है अप्रासंगिक हैं (जब तक आप निश्चित रूप से compilers लिख रहे हैं)

सबसे महत्वपूर्ण बात यह है कि हम एक संकलक के बारे में पता होना चाहिए त्रुटियों संदेशों में प्रदर्शित कर रहे हैं।

:) स्पष्ट लगता है लेकिन मैं डेवलपर की संख्या से आश्चर्यचकित हूं कि मैंने संकलक आउटपुट को भी नहीं देखा है।

+0

मैं यह जानना चाहता हूं कि संकलक क्या करता है। 1000 में से 999 बार आप सही हैं। लेकिन आखिरी व्यक्ति यह पता लगाने के लिए एक असली भालू है कि क्या आप दृश्यों के पीछे क्या हो रहा है इसके बारे में कुछ नहीं जानते हैं। – dmckee

+0

हेहेह ... और हमेशा एक बार समय होता है ... – OscarRyz

1

कंपाइलर्स को न सीखें, उनके द्वारा हल की गई समस्याओं को जानें।

0

मुझे लगता है कि वास्तव में वास्तव में महत्वपूर्ण है कि एक दुभाषिया बनाना है: यह आपको प्रोग्रामिंग भाषाओं की अधिक जानकारी देता है, और यही वह है जो आप उपयोग करते हैं ... योजना में यह वास्तव में एक इंटरपेटर बनाने के लिए कठिन नहीं है! लेकिन वास्तव में मैं महान ज्ञान के लिए SICP के पढ़ने के हिस्सों को बहुत प्रोत्साहित करता हूं)।

कंपाइलर्स के बारे में, यह अधिक जटिल है क्योंकि यहां फोकस कुछ वास्तविक प्रदर्शन/वास्तविक मशीन के लिए कर रहा है। एक प्रोग्रामर के रूप में, यह जानना महत्वपूर्ण है कि कम से कम वे कौन से कार्यों को वैश्विक रूप से निष्पादित करते हैं और वे विवरण के बजाए कब दौड़ते हैं, क्योंकि आजकल वे वास्तव में जेआईटी के साथ जटिल प्रणाली में उभरे हैं ...

0

न्यूनतम, आपको एक अमूर्त स्तर पर भाषा सुविधाओं से परिचित होना चाहिए। यदि आप नहीं जानते कि परिवर्तनीय नाम केस-संवेदी हैं या कैसे संख्याओं को बूलियन में परिवर्तित किया जाता है, तो संभवतया आप एक साधारण 'अगर' खंड को विश्वसनीय रूप से भी लिख नहीं सकते हैं।

अधिकतर, मैंने पाया है कि एक कंपाइलर के आंतरिक कार्यों के बारे में कोई अन्य ज्ञान मुझे और अधिक कुशल कोड लिखने में मदद करता है।

1

मुझे नहीं लगता कि यह एक कंपाइलर कैसे काम करता है, यह प्रोग्रामिंग के बारे में ज्ञान को लगातार सुधारने के लिए आवश्यक है। अब, ऐसा ही होता है कि एक कंपाइलर (या इसके पीछे के सिद्धांत) लिखना सीखना किसी के ज्ञान का विस्तार करने का एक शानदार तरीका होता है।

यदि आप रुचि रखते हैं, तो मैं ड्रैगन बुक प्राप्त करने की अनुशंसा करता हूं, जिसे Compilers: Principles, Techniques and Tools भी कहा जाता है। यह पहली बार थोड़ा भारी हो सकता है, लेकिन यह निश्चित रूप से आपको सोच देगा। यदि आप इसे किसी भी तरह से नहीं बनाते हैं या कुछ हिस्सों पर फंस जाते हैं, तो मैं इसे थोड़ा सा ठंडा करने और बाद में लौटने का सुझाव दूंगा - दूसरी बार घूमना बहुत आसान है।

3

मैंने प्रोग्रामिंग भाषाओं और उन्नत कंपेलरों दोनों को पढ़ाया है।

  1. क्या आपको पता है क्या संकलक क्या कर रहा है, तो आप कर सकते हैं अनजाने कोड ज्यादा से ज्यादा महंगा है कि लिखना नहीं है, तो: यहाँ लगता है कि मैं क्या पता है कि संकलक करता है दो सबसे अधिक उपयोगी कारण हैं कर रहे हैं आप इरादा यह विशेष रूप से सच है यदि आप इसे जानने के बिना स्मृति आवंटित कर रहे हैं। एक उत्कृष्ट उदाहरण, एक पाश, जैसे में तार जोड़ में

    जवाब के रूप में

    के लिए मैं = 1 n करने के लिए

    answer = answer .. strings[i] -- .. is string concatenation 
    

    करते हैं = "" यह कोड है द्विघात, एक द्विघात राशि कर आवंटन और प्रतिलिपि के। बुरी खबर।

  2. कंपाइलर्स के बारे में कुछ जानने का दूसरा बड़ा कारण यह है कि कई बार एक समस्या को छोटी भाषा की आवश्यकता होती है। यदि आप कंपाइलर्स के बारे में कुछ जानते हैं (दुभाषिया यहां उतने ही अच्छे हैं, शायद बेहतर) तो आप एक छोटी सी भाषा बना सकते हैं। यदि आपके पास भाषा की तरह दिखने के बारे में कोई विकल्प है, तो अक्सर किसी और को आपके लिए भाषा बनाने देना बेहतर होता है। Lua एक ऐसी भाषा है जो अन्य कार्यक्रमों द्वारा एक घटक के रूप में उपयोग करने पर विशेष रूप से अच्छा है।

क्रेन्शॉ का ट्यूटोरियल खराब नहीं है। यदि आप इस पर अपना हाथ डाल सकते हैं तो एक और अच्छी किताब पी। जे ब्राउन की इंटरैक्टिव कंपाइलर्स और दुभाषियों पर पुस्तक है। यह प्रिंट से बहुत लंबा है, लेकिन आप इसे पुस्तकालय में पा सकते हैं।

मैं कंपाइलरों पर कई वसा स्नातक पाठ्यपुस्तकों से बचूंगा। एक वसा अंडरग्रेड टेक्स्ट जो संकलक-उत्सुकता के लिए अधिक सार्थक हो सकता है माइकल स्कॉट की प्रोग्रामिंग-भाषा व्यावहारिक है।

1

डेवलपर के रूप में वास्तव में अच्छी तरह से गोल होने के लिए मुझे लगता है कि आपको सामान्य रूप से कंपाइलर्स के बारे में कुछ पता होना चाहिए और वे कैसे काम करते हैं, शायद एक साधारण लिखने का भी प्रयास किया।

विशिष्ट कंपेलरों के लिए, हालांकि, अधिकांश डेवलपर्स केवल एक चीज़ को जान सकते हैं: बाइनरी कोड के बजाय आउटपुट असेंबली भाषा में कंपाइलर स्विच। आउटपुट असेंबली भाषा की जांच करने से आपको पता चलेगा कि कंपाइलर आपके कोड को अनुकूलित करने के लिए क्या कर रहा है, और यह पता लगाने में आपकी सहायता कर सकता है कि यह आपके कोड को फिर से लिखने के लिए कैसे बेहतर है।
प्लस, यह आपके निम्न-स्तर के ज्ञान को रीफ्रेश करने के लिए "प्रोग्रामर का अभ्यास" मजेदार है।

3

मुझे लगता है कि यह आपको एक सूक्ष्म तरीके से निश्चित रूप से बेहतर प्रोग्रामर बना देगा।

यह कैसे काम करता है इसकी एक सामान्य समझ आपको आपके द्वारा लिखे गए कोड के बारे में अधिक जागरूक करने में मदद करेगी। मैंने कई अनुभवी डेवलपर्स को देखा है जो एक नई भाषा सीखते समय कुछ मौलिक अवधारणाओं को समझने के लिए संघर्ष करते हैं। यदि आप जानते हैं कि एक कंपाइलर कैसे काम करता है और (शायद अधिक महत्वपूर्ण) कोड कैसे निष्पादित किया जाता है तो आप इन अवधारणाओं को बेहतर समझेंगे। मैं ढेर बनाम ढेर, पॉइंटर्स इत्यादि के बारे में बात कर रहा हूं

यदि आप कुछ पाठ का विश्लेषण या अनुवाद करने के लिए कोड लिखने की आवश्यकता है तो यह आसान हो सकता है। मैंने एक बार कुछ एसक्यूएल स्थितियों को किसी अन्य कस्टम प्रारूप में अनुवाद करने के लिए एक प्रोग्राम लिखा था और इसके लिए एक छोटा पार्सर लिखना सबसे सरल और सबसे शानदार तरीका था (या तो मुझे लगता है :))

इसके अलावा, एक गहरी समझ कंपाइलर विशेष रूप से इसके लिए अनुकूलित करने में आपकी सहायता कर सकता है, लेकिन यह वास्तव में कठिन हो सकता है और हमेशा अनुशंसित नहीं किया जाता है, क्योंकि कोबर्ड ने कहा था।

2

क्या आपको डीबगर का प्रभावी ढंग से उपयोग करने में कोई रूचि है? तो ठीक। क्या आपको विश्वसनीय या कुशल कोड लिखने में कोई रूचि है? तो ठीक।

व्यक्तिगत रूप से मुझे फ्रंटेंड से अधिक बैकएंड की परवाह है। मैं x86 के बजाय एआरएम के लिए संकलन की अनुशंसा करता हूं, इस मामले में आप आवश्यक रूप से असेंबलर नहीं सीख रहे हैं (जहां मैं अपने स्वयं के डिस्सेबलर को लिखने की सलाह देता हूं), इसलिए यदि आप जीसीसी का उपयोग करते हैं तो इसका डिस्सेबलर होता है और आप देख सकते हैं कि आपका उच्च स्तरीय कोड क्या बदल सकता है अंतिम परिणाम, साथ ही संकलक विकल्पों के साथ आप कितना परिवर्तन कर सकते हैं। यह उच्च स्तर के भाषा प्रोग्रामर के लिए एक आंख खोलने का अनुभव है, यह समझने के लिए कि एक ही कोड में संकलक और कमांड लाइन विकल्पों के आधार पर जंगली रूप से अलग-अलग परिणाम हो सकते हैं।

कंपाइलर के बीच में मैं एलसीसी और एसडीसीसी दोनों की सिफारिश करता हूं।आप या एल सी सी किताब खरीदने के लिए नहीं चाहते हो सकता है हो सकता है:

[http://www.cs.princeton.edu/software/lcc/][1]

आप न की जरूरत है, हालांकि, स्रोत नेट पर (कई रूपों में) है। जैसा कि एसडीसीसी (छोटा डिवाइस सी कंपाइलर है, मूल रूप से 8051 और अन्य 8 बिट माइक्रो के लिए बनाया गया है)। मेरी सिफारिश है कि इंटरफ़ेस में जाना है जहां संकलक बैकएंड को पूरा करता है, आप पाएंगे कि आपका कोड परमाणु भागों की एक श्रृंखला में बदल गया है, कभी-कभी रिवर्स पॉलिश की तरह। ए = बी +7; निरंतर पूर्णांक लोड होने का अंत हो सकता है 7. परिवर्तनीय बी को अगले उपलब्ध रजिस्टरों में स्मृति से पढ़ें। बी के साथ 7 प्लस रजिस्टर जोड़ें और अगले उपलब्ध रजिस्टर में सेव करें। एक के लिए स्मृति में स्थान में रजिस्टर में मूल्य स्टोर करें।

आप इसे जीसीसी के साथ भी कर सकते हैं, लेकिन आप यह महसूस कर सकते हैं कि जीसीसी उतना ही महान नहीं है जितना आप थे। मिश्रणों की संख्या और बैकएंडों की संख्या और मिश्रण में हाथों की संख्या आदि के कारण, यह बहुत बड़ा और जटिल है। हालांकि यह प्राप्त होता है, और उन भाषाओं और प्लेटफार्मों के लिए काम करता है जिनके विशेषज्ञों को बनाए रखा जाता है। कौन सी जीसीसी आपको सिखा सकती है कि अन्य लोग ऐसा नहीं कर सकते हैं, फ्रंटेंड पर विभिन्न भाषाओं को एक सामान्य मध्यम भाषा में उबाल दिया जाएगा जो पिछला अंत प्रत्येक प्लेटफॉर्म के लिए विशिष्ट निर्देशों में बदल जाता है।

अंत में अग्रभाग। अधिकांश भाग लोगों के लिए बाइसन/yacc का उपयोग करें, जो एक उपकरण है जिसे आप अपनी उच्च स्तरीय भाषा के लिए विवरण बनाते हैं और टूल आपके विवरण के आधार पर उपयोगकर्ता इनपुट को पार्स कर सकता है और यदि आप चाहें तो इसे इस मध्य भाषा में बदल सकते हैं।

यदि आप अपने शौक या करियर सॉफ्टवेयर के साथ करियर करने की योजना बनाते हैं तो मैं कहूंगा कि आपको इस अभ्यास के माध्यम से कई बार नहीं जाना चाहिए। आपके कोड की समग्र गुणवत्ता, आपके कोड की विश्वसनीयता, आपके कोड का प्रदर्शन, और दक्षता लेखन कोड इस ज्ञान से प्रभावित होगा।

मैं कथन से सावधान रहूंगा "कंपाइलर के लिए मत लिखो, लेकिन लोगों को पढ़ने के लिए लिखें।" वहाँ बहुत बुरा कोड है क्योंकि इस तरह के बयान का दुरुपयोग किया जाता है। रखरखाव के परिणामों के लिए कोड लिखना खराब कोड में परिणाम बनाए रखना है। रखरखाव विश्वसनीयता और प्रदर्शन के साथ पारस्परिक रूप से अनन्य है। मैं व्यक्तिगत रूप से खराब कोड की तुलना में विश्वसनीयता और प्रदर्शन करता हूं कि कोई भी कॉलेज ग्रेड बनाए रख सकता है।

आप समय के साथ सीखेंगे, संकलक के लिए लिखने के लिए बहुत कठिन प्रयास नहीं करेंगे। बस अपने कोड के साथ अपमानजनक न हों, भाषा की जीई whiz सुविधाओं का उपयोग न करें। यदि आपको कुछ कंपाइलर सुविधा को समझने के लिए अतिरिक्त शोध करना पड़ता है, तो आप यह सुनिश्चित कर सकते हैं कि अधिकांश दुनिया इसे समझ में नहीं आती है जिसमें व्यक्ति को कंपाइलर्स में लागू करना है। इसलिए आप उस सुविधा को संकलकों में लगातार काम नहीं करने की उम्मीद कर सकते हैं, इसलिए आपको इसे पहले स्थान पर उपयोग करना चाहिए। इसका मतलब यह भी है कि एक विशिष्ट कंपाइलर के लिए अपना कोड लिखने की कोशिश न करें, जीसीसी और इसकी विशेषताओं से बहुत जुड़ा न हो, एसडीसीसी और एलसीसी और माइक्रोसॉफ्ट और बोर्लैंड और किल और अन्य को आजमाएं। अपना कोड साफ, सरल, पठनीय और पोर्टेबल बनाएं।

नीचे पंक्ति, यदि आप सॉफ़्टवेयर लिखने के बारे में गंभीर हैं, तो आपको पूरी तरह से यह जानने की आवश्यकता है कि कंपाइलर कैसे काम करता है। जीसीसी, एसडीसीसी, एलसीसी, (और वीबीसीसी अगर आप इसे पा सकते हैं) सभी मुफ़्त, खुले स्रोत हैं, और एक सीखने का अनुभव प्रदान करते हैं जो आपके कोडिंग कौशल में सुधार करेगा।

1

ब्लॉग पोस्ट में, Steve Yegge ने जोर दिया कि सभी प्रोग्रामर should know how compilers work। उन्होंने कहा कि अब तक के रूप में कहने के लिए चला जाता है:

कोमल, अभी तक आग्रहपूर्ण कार्यकारी सारांश: आप कैसे compilers काम पता नहीं है, तो आप कैसे कंप्यूटर काम नहीं पता है।यदि आप 100% नहीं हैं, तो सुनिश्चित करें कि आप जानते हैं कि कंप्यूटर्स काम कैसे करते हैं, तो आप नहीं जानते कि वे काम कैसे करते हैं।

लेख में, वह कंपाइलर्स को जानने की आवश्यकता के लिए एक आकर्षक तर्क बनाता है। वह असली दुनिया के उदाहरण भी प्रदान करता है और सूचीबद्ध करता है जहां पार्स और विश्लेषण करना सीखना उपयोगी होगा।

+0

अच्छा। मैंने उस ब्लॉग पोस्ट को पढ़ा, और यह एक महान है! कंप्यूटर्स के बारे में अधिक जानने के लिए आपने किन संसाधनों का उपयोग किया? (कॉलेज कक्षाओं से अलग) –

+0

ईमानदारी से, मैंने कोलाज के बाद से कंपाइलर्स के साथ बहुत कुछ नहीं किया था। येग के पद ने मुझे इसमें वापस आने के लिए प्रेरित किया। मैंने एफ # के बारे में एक अच्छा पार्सर पढ़ा है। तो मुझे लगता है कि मैं जैक क्रैनशॉ (http://compilers.iecc.com/crenshaw/) द्वारा लेट्स बिल्ड ए कंपाइलर पढ़ूंगा और फिर एफ # में एक डीएसएल कंपाइलर लिखने का प्रयास करूंगा। – epotter

संबंधित मुद्दे