वृद्धिशील "मेकिंग" में हैशिंग एल्गोरिदम का उपयोग क्यों नहीं होता है?


10

मैं एक शुरुआत के साथ makeहूं और मैं सोच रहा हूं कि कब उपयोग करना है make clean

एक सहकर्मी ने मुझे बताया कि वृद्धिशील निर्माण makeफाइलों के टाइमस्टैम्प पर आधारित हैं। इसलिए, यदि आप अपने VCS में किसी फ़ाइल के पुराने संस्करण की जांच करते हैं, तो उसके पास एक "पुराना" टाइमस्टैम्प होगा और इसे "इस फ़ाइल को पुनः स्थापित करने की कोई आवश्यकता नहीं" के रूप में चिह्नित किया जाएगा। फिर, वह फ़ाइल अगले बिल्ड में शामिल नहीं होगी।
उसी सहयोगी के अनुसार, यह उपयोग करने का एक कारण होगा make clean

वैसे भी, मुझे लगभग make cleanStackExchange प्रश्नों से "जब उपयोग करना है " प्रश्न का उत्तर मिला, लेकिन मेरे अन्य प्रश्न तब हैं:

वृद्धिशील makeउदाहरणों के लिए फाइलों की टाइमस्टैम्पों पर निर्भर न होकर एसएचए -1 का उपयोग करके बनाता है ? उदाहरण के लिए, Git दिखाता है कि हम सफलतापूर्वक निर्धारित कर सकते हैं कि क्या SHA-1 का उपयोग करके किसी फ़ाइल को संशोधित किया गया था।
क्या यह गति के मुद्दों के लिए है?


5
make70 के दशक में बनाया गया था। SHA-1 90 के दशक में बनाया गया था। 00 में Git बनाया गया था। आखिरी चीज जो आप चाहते हैं वह कुछ अस्पष्ट बिल्ड के लिए है जो 30 वर्षों से काम कर रहे थे अचानक असफल हो गए क्योंकि किसी ने कोशिश की और परीक्षण किए गए सिस्टम के साथ सभी आधुनिक जाने का फैसला किया।
Ordous

1
फ़ाइलों को हर समय धीमा करना। मुझे लगता है कि git भी परिवर्तित फ़ाइलों के लिए अपनी जाँच को अनुकूलित करने के लिए फाइल सिस्टम मेटाडेटा का उपयोग करता है।
कोडइन्चोस

4
फ़ाइल की तारीखों के आधार पर मूल समाधान बहुत सरल है, इसे हैश कोड को संग्रहीत करने के लिए किसी भी अतिरिक्त फ़ाइलों की आवश्यकता नहीं है, और इसने कई दशकों तक उल्लेखनीय रूप से काम किया। किसी को अधिक जटिल से एक अच्छी तरह से काम कर रहे समाधान को क्यों बदलना चाहिए? इसके अलावा, AFAIK सबसे वीसीएस सिस्टम की जाँच की गई फाइलें "चेकआउट की तारीख" बताती हैं, इसलिए बदली गई फाइलें सही तरीके से "साफ करें" के बिना एक recompile का कारण बनेंगी।
डॉक ब्राउन

@ अच्छा: मनोरंजक, लेकिन क्या यह यहां प्रासंगिक है? सॉफ्टवेयर जंग नहीं करता है; यह बाहर देता है क्योंकि किसी ने आसपास के वातावरण में कुछ बदल दिया। जब तक कि वे नहीं करते, तब भी किस स्थिति में काम करना चाहिए।
रॉबर्ट हार्वे

1
@RobertHarvey बेशक यह है! निश्चित रूप से, यदि आप अपना अपडेट नहीं करते हैं, makeतो आपका सॉफ़्टवेयर नहीं टूटेगा, हालांकि makeनए संस्करणों में पीछे की संगतता का प्रयास करता है। बिना किसी अच्छे कारण के मुख्य व्यवहार में बदलाव करना बहुत विपरीत है। और तारीखें बताती हैं कि यह मूल रूप से SHA-1 का उपयोग करने के लिए क्यों नहीं बनाया गया था, या जब यह उपलब्ध हो गया makeथा तब इसे वापस लेना आसान नहीं था ( तब तक पहले से ही दशकों पुराना था)।
Ordous

जवाबों:


7

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

हालांकि, अधिक गंभीरता से, हैश समान शब्दार्थ को व्यक्त नहीं करेगा। यदि आप जानते हैं कि फ़ाइल T को हैश H 1 के साथ निर्भरता D से बनाया गया था और तब पता चला कि D अब H 2 से राख हो गया है , तो क्या आपको T को फिर से बनाना चाहिए ? शायद हाँ, लेकिन यह भी हो सकता है कि एच 2 वास्तव में फ़ाइल के पुराने संस्करण को संदर्भित करता है । टाइम-स्टैम्प एक आदेश को परिभाषित करते हैं जबकि हैश केवल समानता के लिए तुलनीय हैं।

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

हालांकि समय-टिकटों पर हैश का उपयोग करने के लिए एक तर्क दिया जा सकता है, मेरा कहना है कि वे एक ही लक्ष्य को प्राप्त करने के लिए एक बेहतर समाधान नहीं हैं, लेकिन एक अलग लक्ष्य प्राप्त करने के लिए एक अलग समाधान है। इनमें से कौन सा लक्ष्य अधिक वांछनीय है बहस के लिए खुला हो सकता है।


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

आप जो कहते हैं, उसमें से अधिकांश सही है। हालाँकि एक अच्छी तरह से कार्यान्वित बिल्ड सिस्टम जो Google ब्लेज़ / bazel (ब्लेज़ का आंतरिक संस्करण, bazel का आंतरिक संस्करण है) जैसे हैश का उपयोग करता है, मेक जैसी टाइमस्टैम्प्ड प्रणाली से पैंट को निकाल देता है। उस ने कहा, आपको बहुत सारे प्रयास दोहराने योग्य बिल्ड में करने होंगे ताकि पुनर्निर्माण के बजाय पुरानी बिल्ड कलाकृतियों का उपयोग करना हमेशा सुरक्षित हो।
btilly

यहां मैपिंग एक से कई नहीं है, यह एक से एक है। तो Dअब हैश H2, और आप कुछ उत्पादन की जरूरत नहीं है T2से बनाया गया D@H2है, तो आप का निर्माण करने और संग्रहीत करने के लिए की जरूरत है। इसके बाद, किस क्रम Dमें H1और H2राज्यों के बीच स्विच होता है, आप कैश्ड आउटपुट का उपयोग कर पाएंगे।
असद सईदुद्दीन

1

पूरी परियोजना को गति देना बहुत धीमा है। आपको हर एक फाइल की हर एक बाइट को पढ़ना होगा। हर बार जब आप git statusया तो चलाते हैं तो हर फाइल में हैश नहीं होता है । न ही वीसीएस चेकआउट आम तौर पर मूल अधिकृत समय के लिए फ़ाइल के संशोधन समय निर्धारित करते हैं। यदि आप ऐसा करने का ध्यान रखते हैं तो एक बैकअप रिस्टोर होगा। पूरे कारण के फाइलसिस्टम में टाइमस्टैम्प इन जैसे मामलों के उपयोग के लिए है।

एक डेवलपर आमतौर पर make cleanतब चलता है जब एक निर्भरता सीधे मेकफाइल परिवर्तनों द्वारा ट्रैक नहीं की जाती है। विडंबना यह है कि इसमें आमतौर पर मेकफिल शामिल होता है। इसमें आमतौर पर संकलक संस्करण भी शामिल होते हैं। आपका मेकफाइल कितना अच्छा लिखा गया है, इसके आधार पर इसमें बाहरी लाइब्रेरी संस्करण शामिल हो सकते हैं।

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


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

1

बिल्ड-सिस्टम में हैश बनाम टाइमस्टैम्प के बारे में कुछ बिंदु:

  1. जब आप किसी फ़ाइल की जांच करते हैं, तो टाइमस्टैम्प को वर्तमान समय में अपडेट किया जाना चाहिए, जो एक पुनर्निर्माण को ट्रिगर करता है। आपके सहकर्मी ने जो वर्णन किया है वह आमतौर पर टाइमस्टैम्प सिस्टम की विफलता मोड नहीं है।
  2. टाइमस्टैम्प हैश की तुलना में थोड़ा तेज है। एक टाइमस्टैम्प प्रणाली को केवल टाइमस्टैम्प की जांच करनी होती है, जबकि एक हैश प्रणाली को टाइमस्टैम्प की जांच करनी चाहिए और फिर हैश की संभावना है।
  3. मेक को हल्का और स्व-निहित होने के लिए डिज़ाइन किया गया है। दूर करने के लिए (2), हैश आधारित प्रणालियाँ आमतौर पर हैश की जाँच के लिए एक पृष्ठभूमि प्रक्रिया चलाती हैं (जैसे फेसबुक का चौकीदार )। यह मेक के डिज़ाइन लक्ष्यों (और इतिहास) के लिए काउंटर है।
  4. जब एक टाइमस्टैम्प बदल गया है लेकिन सामग्री नहीं है, तो अनावश्यक अनावश्यक पुनर्वसन को रोकती है। अक्सर, यह हैश की गणना करने की लागत को रोक देता है।
  5. डैश परियोजनाओं और नेटवर्क पर साझा करने के लिए कलाकृतियों को सक्षम करते हैं। फिर, यह कंप्यूटिंग हैश की लागत को ऑफसेट करता है।
  6. आधुनिक हैश-आधारित बिल्ड-सिस्टम में बज़ेल (Google) और बक (फेसबुक) शामिल हैं।
  7. अधिकांश डेवलपर्स को हैश-आधारित प्रणाली का उपयोग करने पर विचार करना चाहिए, क्योंकि उनके पास उन आवश्यकताओं के समान नहीं है जिनके तहत मेक डिजाइन किया गया था।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.