2009-12-01 15 views
11

Google की नई भाषा Goexplicitly requiring that all dependencies listed in a module actually be used द्वारा निर्भरता प्रबंधन को आसान बनाने की कोशिश करता है। कंपाइलर एक मॉड्यूल को अस्वीकार कर देगा जो उस मॉड्यूल से कुछ भी उपयोग किए बिना मॉड्यूल पर निर्भरता घोषित करता है।अप्रयुक्त निर्भरताओं को अस्वीकार करने के पेशेवरों और विपक्ष

पैकेज के लिए खुद को आयात करने या किसी भी निर्यात किए गए पहचानकर्ताओं के संदर्भ में पैकेज आयात करने के लिए अवैध है।

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

क्या आपके पास इसे लागू करने वाली अन्य भाषाओं के साथ कोई अनुभव है? इस दृष्टिकोण के पेशेवरों और विपक्ष क्या हैं?

उत्तर

5

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

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

मुझे लगता है कि शायद डिजाइनरों का उद्देश्य एक ऐसी भाषा बनना है जो काफी हद तक आईडीई निर्भर है।

+2

+1। मैं वही निष्कर्ष तक पहुंच गया हूं, मुख्य रूप से इस तथ्य से कि केवल ऑब्जेक्ट फ़ाइलों में हेडर जैसा कुछ भी है, और साथ ही गो में पार्सिंग गो के लिए मॉड्यूल भी शामिल हैं। सख्त मोड के लिए –

0

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

मार्जिन में छोटे रोशनी बल्ब पर राइट क्लिक करें और "सभी अप्रयुक्त निर्भरताओं को हटाएं" का चयन करें।

उन चरों के लिए जो आमतौर पर उपयोग नहीं किए जाते हैं, वे आमतौर पर एक स्क्विगली अंडरलाइन प्राप्त करते हैं, और स्पॉट करने के लिए बहुत आसान हैं।

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

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

+0

+1 - मुझे सुविधा पसंद है, लेकिन मुझे यह भी लगता है कि इसे बंद करने में सक्षम होना एक अच्छा विचार है। –

1

मुझे लगता है कि इसके लिए सबसे बड़ी प्रेरणा, और सबसे बड़ा परिणाम संकलन समय में सुधार है। तकनीकी पूर्वावलोकन वीडियो ने कम समय अवधि में बड़ी मात्रा में कोड संकलित करने की उनकी क्षमता का एक प्रमुख बिंदु बनाया (उनका उदाहरण मैकबुक पर 8 सेकंड में कोड की 200,000 लाइनें थी - कोई मशीन चश्मा नहीं दिया गया था)।

तकनीकी वीडियो में, वे विशेष रूप से उल्लेख करते हैं कि मॉड्यूल को संकलित और लिंक करने के तरीके को बदलने में सबसे बड़े तरीकों में से एक था।

क्लास ए हेडर फाइल C_H में परिभाषित किया गया और C_CPP में कार्यान्वित किया जाता:

यहाँ कैसे कुछ एक मौजूदा सी में काम करेगा/C++ प्रणाली का एक उदाहरण है। कक्षा बी सी से निकला है और फ़ाइलों B_H और B_CPP में लागू किया गया है। कक्षा ए बी से निकला है और फ़ाइलों को ए_एच और ए_सीपीपी में लागू किया गया है।

व्युत्पन्न श्रृंखला के कारण, ए_सीपीपी में ए_एच, बी_एच, और सी_एच शामिल हैं। बी_सीपीपी में बी_एच और सी_एच शामिल हैं। सी_सीपीपी में सी_एच शामिल है। सी प्रीप्रोसेसर की प्रकृति के कारण, जो अनिवार्य रूप से # कट को एक कट और पेस्ट ऑपरेशन में बदल देता है, सी_एच की सामग्री कंपाइलर के माध्यम से 3 बार चलती है और बी_एच दो बार से गुजरती है।

आगे, ए_सीपीपी, बी_सीपीपी, और सी_सीपीपी की सामग्री सभी अपनी ऑब्जेक्ट फाइलों में रहते हैं। इसलिए जब लिंकर एओ को हल करने के लिए जाता है, तो इसे बीओ और सीओ दोनों को लोड और प्रोसेस करने के लिए मजबूर होना पड़ता है। साथ ही, जब यह बीओ को हल करता है, तो उसे फिर से सीओ को संसाधित करना पड़ता है।

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

गो चीजों को अलग-अलग दृष्टिकोण देता है। शब्द सीधे PDF from their tech talk से बाहर में:

"जाओ संकलक वस्तु फ़ाइल से सकर्मक निर्भरता प्रकार की जानकारी खींचती है - लेकिन केवल यह क्या जरूरत है A.go B.go पर निर्भर करता है, तो सी पर निर्भर करता है। .go: - संकुचित कागो, बीगो, फिर एगो - एगो संकलित करने के लिए, कंपाइलर बो को सह स्केल को पढ़ता है, यह गतिशील हो सकता है। "

ठीक है, मामूली स्पर्श किया जाता है। यह प्रासंगिक क्यों है? उत्तर गो टेक टॉक पीडीएफ में भी है:

"पैकेज मॉडल: स्पष्ट निर्भरता तेजी से निर्माण सक्षम करने के लिए।"

मेरा अनुमान है कि कि जाओ डेवलपर्स रुख यह है कि जब संकलन बार यहां तक ​​कि बहुत बड़ी परियोजनाओं के लिए, सेकंड में मापा जाता है, कि यह लिए डेवलपर्स के लिए अधिक उपयोगी है संकलन बार कम है कि रखने के ले लिया। मान लें कि मुझे कोड की 200,000 लाइनों को संकलित करने में 8 सेकंड लगते हैं और पता चलता है कि मुझे यह पता लगाने और इसे ठीक करने के लिए एक अतिरिक्त पैकेज आयात, 5-10 सेकेंड (एक अच्छा आईडीई, या अपने देव पर्यावरण के साथ अच्छी परिचितता) मिला है, और recompile करने के लिए एक और 8 सेकंड। इसे 30 सेकंड कुल कॉल करें - और अब मेरे सभी भविष्य संकलन 10 सेकंड रेंज में रहते हैं। या हम अनावश्यक निर्भरताओं सहित हमारे मॉड्यूल को बढ़ने दे सकते हैं, और उस संकलन समय को 8 से 10, 12, या 15 सेकंड तक रेंगते हैं। यह बहुत अधिक प्रतीत नहीं होता है क्योंकि हम सभी मिनटों के समय पर संकलन करने के लिए उपयोग किए जाते हैं - लेकिन जब आप यह महसूस करना शुरू करते हैं कि यह 25% प्रदर्शन गिरावट है, तो आप एक मिनट के लिए इसके बारे में सोचें और सोचें।

संकलन समय पहले से ही बिजली तेज हो रहे हैं। इस बात पर भी विचार करें कि प्रोसेसर की गति अभी भी बढ़ रही है (अगर अतीत में उतनी ज्यादा नहीं है) और यह कि उपलब्ध कोर की संख्या भी बढ़ रही है (और बड़ी मात्रा में कोड संकलित करना बहु-थ्रेडिंग के लिए उपयुक्त है)। 8 सेकंड में कोड की 200,000 लाइनों का मतलब आज है कि 10 साल में तत्काल तत्काल संकलन की 200,000 लाइनों की कल्पना करना अनुचित नहीं है। मुझे लगता है कि गो टीम ने अतीत की बातों को संकलित करने के लिए यहां एक सचेत निर्णय लिया है, और जब आप जिस मुद्दे को लाते हैं, वह केवल इसका एक छोटा सा हिस्सा है, तो अभी भी इसका एक हिस्सा है।

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

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

+0

"यदि मॉड्यूल ए को मॉड्यूल बी की आवश्यकता होती है जिसके लिए मॉड्यूल सी की आवश्यकता होती है, तो अधिकांश कंपाइलर्स सी संकलित करेंगे, बी और सी (फिर से) संकलित करेंगे, और उसके बाद ए, बी (दोबारा), और सी (फिर से) संकलित करें और फिर लिंकिंग समस्याओं को हल करें" - नहीं वे नहीं करेंगे। वे एक बार प्रत्येक स्रोत फ़ाइल संकलित करते हैं, फिर उन्हें एक साथ लिंक करें। –

+0

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

+0

हां, शीर्षकों को एक से अधिक बार शामिल किया जाता है, क्योंकि वे प्रीप्रोसेसर द्वारा संभाले जाते हैं। यदि आपके पास हेडर फाइलों में कोड की 'बड़ी' बिट्स हैं, तो यूआर यह गलत है। –

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