क्या यह समझने के लिए आवश्यक है कि एक अच्छा प्रोग्रामर होने के लिए हार्डवेयर स्तर पर क्या हो रहा है?


24

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

ऐसा लगता है कि मैं हमेशा एक ही दीवार में चल रहा हूं जब मैं मुसीबत प्रोग्रामिंग में भागता हूं। उदाहरण के लिए, मैंने एक और मंच पर एक सवाल पूछा कि एक पॉइंटर-टू-एरे को कैसे हैंडल किया जाए जो एक फ़ंक्शन द्वारा वापस किया गया था। शुरू में मैं सोच रहा था कि मैं उचित तकनीक नहीं जानता कि C ++ के डिज़ाइनर ने स्थिति को संभालने के लिए सेट किया। लेकिन उन उत्तरों और चर्चाओं से जो मैं देखता हूं कि मुझे वास्तव में वह नहीं मिलता है जब कुछ 'वापस' हो जाता है।

प्रोग्रामिंग प्रोग्राम को समझने के लिए एक अच्छे प्रोग्रामर को कितनी गहराई तक ले जाना चाहिए?


3
मेरी सलाह: कुछ x86 असेंबली (डॉस या अन्यथा) जानें। फिर सी कोड के कुछ छोटे टुकड़ों के आउटपुट कोडांतरक को पढ़ना सीखें। यदि आप आउटपुट को नहीं समझते हैं तो प्रश्न पूछें। दोहराएँ। यह आपको समझने के लिए बाध्य करेगा कि सीपीयू स्तर पर क्या हो रहा है
अर्लज़


अर्लज़ - क्या आपका मतलब है कि मुझे x86 निर्देश सेट का उपयोग करके प्रोग्राम सीखना चाहिए? क्या वह 'सीपीयू स्तर' है?
बेव

नौकरी - thx, यह मजेदार था। उसने वास्तव में कुछ गलतियाँ की हैं, केवल वित्तीय वर्ष।
bev

जवाबों:


33

नहीं, कोई भी नहीं समझता है कि हार्डवेयर स्तर पर क्या हो रहा है।

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

लेकिन उसके बाद फिर से...

हाँ। मेरा मतलब है, आपको यह समझने की ज़रूरत नहीं है कि प्याज के अंदर वास्तव में क्या हो रहा है, लेकिन यह एक मानसिक मॉडल के लिए एक आदर्श मॉडल होने में बहुत मदद करता है। शायद सबसे गहरा हिस्सा नहीं है, जहाँ आपको ट्रांजिस्टर से बना गेट मिला है और इस तरह, या अगली परत या दो, जहाँ आपको माइक्रोकोड मिला है, एक घड़ी, इंस्ट्रक्शन डिकोडिंग यूनिट आदि। अगली लेयर्स, जहाँ आप हैं 'रजिस्टर, ढेर, और ढेर मिल गया है। ये सबसे गहरी परतें होती हैं, जहां आपके साथ क्या होता है, इस पर बहुत अधिक प्रभाव पड़ता है - कंपाइलर आपके कोड को इस स्तर पर चलने वाले निर्देशों में अनुवादित करता है, और यदि आप चाहते हैं कि आप आमतौर पर इन निर्देशों के माध्यम से कदम उठा सकें और पता लगा सकें कि "वास्तव में" क्या हो रहा है।

अधिकांश अनुभवी प्रोग्रामर्स के सिर में इन परतों का थोड़ा परी कथा संस्करण होता है। वे आपको यह समझने में मदद करते हैं कि संकलक क्या बात कर रहा है जब यह बताता है कि "अमान्य पता अपवाद" या "स्टैक ओवरफ़्लो त्रुटि" या ऐसा कुछ था।

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

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


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

@bev: उस मामले में, आपको वास्तव में Arduino जैसे प्लेटफॉर्म की जांच करनी चाहिए।
कालेब

दुखी होने के लिए खेद है, लेकिन मैंने Arduino की जाँच की, और मैं वास्तव में यह नहीं देख सकता कि इसका उपयोग करने से मुझे यह समझने में मदद मिलेगी कि एक संकलक कैसे बिंदुओं और सरणियों का अलग-अलग व्यवहार करता है। मैं क्या नहीं देख रहा हूँ?
bev

@bev: यदि आप यह जानना चाहते हैं कि कार्यों को कैसे कहा जाता है, तो आप शायद 30 मिनट उस बारे में पढ़ने में बिता सकते हैं और किया जा सकता है। यदि आप एक बेहतर समझ प्राप्त करना चाहते हैं कि सब कुछ एक साथ कैसे काम करता है, तो यह एक छोटी प्रणाली के साथ सबसे आसान होगा। यह एक ही बार में पूरे प्याज को अपने सिर में लेने का सबसे अच्छा तरीका है। AVR, चिप्स का परिवार, जिस पर Arduino आधारित है, एक अच्छा, सामान्य उद्देश्य है, एक निर्देश सेट के साथ सिस्टम का उपयोग करना आसान है जो कि बहुत अधिक परेशानी के बिना सीखने के लिए काफी छोटा है।
कालेब

आह अच्छा। होम पेज उनके उत्पादों के उस पहलू पर थोड़ा मुरीद है। मैं फिर देखूंगा।
bev

10

आप हार्डवेयर स्तर के बारे में बात नहीं कर रहे हैं, आप इस बात के बारे में बात कर रहे हैं कि संकलक वास्तव में क्या करता है जो आप इसे करने के लिए कहते हैं।

आपको निश्चित रूप से इस स्तर की समझ की आवश्यकता है कि यह पता लगाने के लिए कि क्या गलत है, जब यह स्पष्ट नहीं है, खासकर जब मेमोरी स्टॉम्प स्थिति से निपटना।


लोरेन - हाँ! सरल सत्य के लिए धन्यवाद। अब मुझे यह जानने के लिए सबसे अच्छा तरीका जानने की जरूरत है कि c ++ कंपाइलर अपने डेटा प्रकारों के साथ क्या करते हैं। बीटीडब्ल्यू, एक ईई के रूप में, मुझे पता है कि यह हार्डवेयर स्तर नहीं है। मुझे नहीं पता था कि आप सीएस गीक्स को क्या कहते हैं। (फिर भी उस बात के लिए नहीं। कंपाइलर स्तर?)
बीवी १11'११ को ०:

बीटीडब्ल्यू - मेमोरी स्टॉम्प?
बेव

@ ब्वॉय: आपने मेरी बात को यहीं साबित कर दिया - अगर आपको यह भी पता नहीं है कि मेमोरी स्टॉम्प क्या है तो आपके पास एक के कारण एक बग ढूंढने का एक भयानक समय होगा। एक मेमोरी स्टॉम्प तब होता है जब कोई उस स्थान पर लिखता है जिसे यह नहीं माना जाता है और जो कुछ भी वहां हुआ है उसे मिटा देता है। यदि आप भाग्यशाली हैं जो आपने मारा वह तुरंत महत्वपूर्ण था और कम से कम यह उड़ गया। यदि आप इस कार्यक्रम को अनलकी कर रहे हैं तो यह डेटा में कुछ छेदों के साथ जा रहा है।
लोरेन Pechtel

स्पष्टीकरण के लिए धन्यवाद। यह मुझे यह भी दिखाता है कि मैं कितना नहीं जानता, क्योंकि मुझे पता है कि मैं सिर्फ ढेर या स्टैक को लिखता हूं, जिसमें कोई महीन नियंत्रण नहीं है।
bev

@Bev: समस्या तब आती है जब आप कहीं लिखते हैं आपको नहीं लगता कि आप लिख रहे हैं। आपके पास स्टैक पर कुछ है और आप इसे एक पॉइंटर बनाते हैं। आप रूटीन छोड़ देते हैं - आइटम चला जाता है, पॉइंटर नहीं। अब जब आप उस सूचक को लिखते हैं तो क्या होता है ?? या आपके पास 100 वस्तुओं की एक सरणी है - जब आप आइटम # 200 पर लिखते हैं तो क्या होता है?
लोरेन Pechtel

6

प्रोग्राम मेमोरी को समझना! = हार्डवेयर को समझना

मेमोरी पदानुक्रम समझना == हार्डवेयर को समझना


अपने सामान्य प्रश्न का उत्तर देने के लिए: यह निर्भर करता है। यह हार्डवेयर को समझने में चोट नहीं कर सकता है, लेकिन इसे समझने से सभी मामलों में मदद नहीं मिलेगी।

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

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


Stargazer - मैं अभी तक उस बिंदु पर नहीं हूं जहां मैं प्रदर्शन के मुद्दों के बारे में चिंता कर सकता हूं। उम्मीद है जल्द ही। टिप्पणी के लिए धन्यवाद।
bev

5

यदि आप करते हैं कोडांतरक का एक सा सीखने का फैसला, तो आप शायद 6502 कोडांतरक की तरह कुछ एक कमोडोर 64 पर (बेशक, नकल) जानने के लिए, या 68000 एक Amiga पर करना चाहिए।

आप कमोडोर 64 के कुछ विचार यहाँ प्राप्त कर सकते हैं ...

http://thepiratebay.org/torrent/4609238/Tag3-Saal2-Slot16_00--ID2874-the_ultimate_commodore_64_talk-Main

क्लासिक सब कुछ-आप-की-से-जानने वाली पुस्तक वह है जो यहाँ वर्णित है ...

http://reprog.wordpress.com/2010/03/12/programming-books-part-3-programming-the-commodore-64/

यदि आप चारों ओर देखते हैं तो आप शायद एक पीडीएफ स्कैन पा सकते हैं।

आईएमओ, 6502 Z80 की तुलना में आसान है, और 6886 8086 की तुलना में आसान है - अधिक नियमित निर्देश सेट आदि।

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

C64 पर 6502 का एक विशेष लाभ यह है कि न केवल सीपीयू सरल है, बल्कि हैक-अराउंड-टू-हार्डवेयर के लिए कुछ बहुत ही सरल है। मुझे SID म्यूजिक चिप के साथ खेलने में बहुत मज़ा आता था।

तो - यह शायद एक सार्थक अभ्यास है यदि आप इस पर बहुत अधिक समय खर्च नहीं करते हैं। मैंने अपनी दूसरी भाषा के रूप में 6502 असेंबलर सीखा जब मैं लगभग 14 था, कमोडोर बेसिक के ठीक बाद। लेकिन ज्यादातर यह बहुत सरल काम करने वाला मॉडल हो रहा है ताकि आप कम से कम गलतफहमी के साथ इसमें अधिक परिष्कृत विचार जोड़ सकें।

कुछ उपयोगी चीजें जो आप असेंबलर में काम करना सीख सकते हैं ...

  • सीपीयू रजिस्टर कैसे काम करता है।
  • मैमोरी एड्रेसिंग कैसे काम करता है, जिसमें अप्रत्यक्ष भी शामिल है।
  • सीपीयू स्टैक कैसे काम करता है।
  • बिटवाइज़ तर्क कैसे काम करता है।
  • CPU I / O उपकरणों को कैसे नियंत्रित करता है।
  • काम कैसे बाधित होता है।

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

संभवतः उन सभी चीजों को जानना कितना उपयोगी है, हालांकि, यह एक कठिन सवाल है।

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

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

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

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

अंत में, बहुत सारे उपयोगी मानसिक मॉडल सामान से यह पता चलता है कि कंपाइलर कोड कैसे उत्पन्न करते हैं - और आधुनिक भाषाओं के लिए कोड जनरेशन तब उपलब्ध तुच्छ कंपाइलर से बहुत अलग है।

यह उस के लिए मेरी एक पसंदीदा पुस्तक है ...

http://dickgrune.com/Books/MCD_1st_Edition/

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


स्टीव - वाह। मैं अपने प्रश्न के उत्तर की पूर्णता और ध्यान के साथ अवाक हूँ। इस पूरी बात को लिखने के लिए समय निकालने के लिए बहुत बहुत धन्यवाद। मैं आपके सुझाव जरूर लूंगा।
bev

1
मैं यह सुझाव दूंगा कि पीडीपी -11 कोडांतरक, अन्य सभी के मुकाबले सीखने के लिए अच्छा है। अन्य सभी जो सिखाते हैं वे अधिक सीमित हार्डवेयर संसाधनों, और / या अधिक सीमित हार्डवेयर डिज़ाइन और forethought द्वारा बाध्य सीमाएँ हैं। 80 के दशक के सभी आम परिवारों में से एक ऐसा कुछ सिखाता है कि प्रोग्रामिंग मॉडल वास्तव में कितने सीमित हार्डवेयर पर प्राप्त कर सकता है (जहां स्टीव ने विभिन्न पते के स्थानों का उल्लेख किया है, उदाहरण के लिए, खेल में आते हैं)।
ग्रेग ए। वुड्स 3

@Greg - मुझे पीडीपी -11 के साथ खेलने के लिए कभी नहीं मिला, मुझे डर है। न ही एक 8051 - मैंने कुछ समय के लिए कुछ एम्बेडेड काम किया, लेकिन यह एक 8096-परिवार की चिप का उपयोग कर रहा था। मैं बस यहाँ एक नज़र था - दिलचस्प। मैंने कुछ समय पहले हार्वर्ड वास्तुकला के बारे में सुना था, लेकिन मुझे नहीं पता था कि ऐसा कुछ था जो बहुत लोकप्रिय था और अभी भी उपयोग में है।
स्टीव ३४

4

बीस साल पहले यह महत्वपूर्ण था, लेकिन अब इतना नहीं है - सॉफ्टवेयर और आधुनिक हार्डवेयर के बीच बहुत अधिक अमूर्त परतें हैं।

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

आपके शेष प्रश्न से पता चलता है कि आप हार्डवेयर की तुलना में संकलक के साथ अधिक चिंतित हो सकते हैं, जो थोड़ा अलग है। आप ऐसे मामलों में भाग ले सकते हैं जहां यह महत्वपूर्ण है, लेकिन ये या तो तुच्छ होते हैं (अनंत पुनरावृत्ति बहुत अच्छी तरह से काम नहीं करती है) या इस तरह के किनारे के मामले जहां आप इसे हल करने के बारे में अच्छा महसूस कर सकते हैं, लेकिन संभवतः कभी भी एक ही समस्या में नहीं चलेंगे फिर।


हां, आप सही कह रहे हैं, मैं कंपाइलर के साथ अधिक चिंतित हूं। इसके अलावा, कई धागे, कई कोर, आदि के बारे में आपके सुझाव के लिए thx। यह सिर्फ मेरे toLearn नोट्स फ़ाइल में चला गया है।
bev

@bev मल्टीथ्रेडिंग सीखना आसान है, बस इसे तब तक न करें जब तक आपको वास्तव में करना न पड़े और तब भी न करें। मेरे अनुभव में इसके मूल्य से अधिक परेशानी।
स्कीथ

@ स्किथ - टिप के लिए धन्यवाद। मैं इसे याद रखूंगा।
bev

4

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

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

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

कंप्यूटरों के बारे में मेरा दृष्टिकोण बहुत बदल गया है। मैं हॉट चिप्स चला गया हूं, और इससे पहले माइक्रोप्रोसेसर फोरम 1990 के दशक के मध्य तक वापस जा रहा था। मैं शायद की तुलना में प्रोग्रामर्स के 99% कम से कम माइक्रोप्रोसेसर हार्डवेयर के बारे में अधिक जानते हैं - और जानते हुए भी कि मुझे क्या करना है, मैं इस कहूँगा: वे कर रहे हैं नहीं अब और साधारण। वे करते लगभग भौतिक विज्ञान के नियमों को तोड़ने। मैंने निम्न स्तर का बहुत परीक्षण किया है और मैं यह सुनिश्चित करने के लिए कह सकता हूं: सीपीयू द्वारा बनाए गए भ्रम को प्राप्त करना और यह दिखाने के स्तर में कि हार्डवेयर वास्तव में कैसे काम करता है अक्सर अविश्वसनीय रूप से कठिन होता है। काश मैं अपने किसी एक सेटअप की तस्वीर को केबल के नीचे दफन कंप्यूटर के साथ 4 से कम लॉजिक एनालाइजर से सिर्फ एक को ठीक से मापने के लिए पोस्ट कर सकता कैशिंग एक आधुनिक सीपीयू पर कैसे काम करता है (यह सुनिश्चित करने के लिए कि वास्तव में हमने क्या मापा है, यह सुनिश्चित करने के लिए कुछ सीपीयू क्या कर रहा था, और कुछ नहीं)।


जेरी - आपकी टिप्पणियों के लिए धन्यवाद। एक ईई होने के नाते, मैं कुछ उच्चतर अमूर्त स्तरों की तुलना में ट्रांजिस्टर स्तर के साथ अधिक आरामदायक हूं। मैं वास्तव में सिर्फ सोच रहा हूं कि एक अच्छा C ++ प्रोग्रामर होने के लिए मुझे क्या जानना चाहिए।
bev

यह तस्वीर दिलचस्प लगती है। आप इसे पोस्ट क्यों नहीं कर सकते?
मेसन व्हीलर

@ ब्वॉय: आपको वास्तव में एक अच्छे प्रोग्रामर बनने के लिए ट्रांजिस्टर के स्तर पर कुछ भी जानने की जरूरत नहीं है । वे सार एक कारण के लिए हैं, और आप लगभग हमेशा मशीन कोड / असेंबली के नीचे एक अमूर्त स्तर पर कुछ भी विचार कर सकते हैं पूरी तरह से अप्रासंगिक होने के लिए और बस यह मान लें कि यह काम करता है।
मेसन व्हीलर

@MasonWheeler: मैं इसे ले गया जहाँ मैं काम करता था, लेकिन जब से मैं वहाँ कोई काम नहीं करता हूँ, तब तक पहुँचना शायद थोड़ा और मुश्किल होगा (शायद असंभव नहीं है - मैंने अच्छे पदों पर छोड़ दिया, लेकिन फिर भी। ..)
जेरी कॉफिन

1

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

हालाँकि, मैं अभी भी कहूंगा कि सभी मामलों में, जितना अधिक आप जानते हैं, उतना बेहतर होगा कि आप एक प्रोग्रामर होंगे। प्रोग्रामिंग का हिस्सा एक ही समय में अमूर्त के कई स्तरों को टटोलने में सक्षम हो रहा है।

यदि आप C ++ में प्रोग्रामिंग कर रहे हैं, तो आपको इस बात की बहुत अच्छी समझ होनी चाहिए कि आधुनिक CPU कैसे काम करता है, कम से कम एब्सट्रैक्शन के स्तर पर जो कंपाइलर काम करता है। (सीपीयू के अंदर ऐसी चीजें चल रही हैं जो संकलक के लिए भी पारदर्शी हैं)।


स्कॉट - "एक आधुनिक सीपीयू कैसे काम करता है .." की बहुत अच्छी समझ से, क्या आपका मतलब है कि डिजिटल लॉजिक कैसे काम करता है (जैसे कि karnaugh मैप्स, ट्रुथ टेबल और AND / NOR / XOR गेट्स कैसे काम करते हैं)? या क्या आपका मतलब है कि संकलक किन संसाधनों का सीधे उपयोग करता है (अर्थात रजिस्टर)?
bev

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

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

@ScottWhitlock - धन्यवाद - यह केवल विशिष्ट सिफारिशों की तरह है जिसकी मुझे तलाश थी।
बेव

0

मैं सी जैसी उच्च स्तरीय भाषाओं के ओवरल डिज़ाइन के बारे में एक बिंदु जोड़ना चाहूंगा।

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

C प्रोग्राम्स और UNIX सिस्टम का DMR का पेपर पोर्टेबिलिटी पहला है जो मुझे C के लिए (अमूर्त) मशीन मॉडल पर चर्चा करने के लिए याद है।

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


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

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

और, btw, मैं वास्तव में जवाब दिया था, अल्बर्ट स्पष्ट रूप से, ओपी से एक सच्चा सवाल: एक को भाषा की डिजाइन के मूल में सार मशीन को सक्षम करने के लिए हार्डवेयर की समझ का पर्याप्त होना चाहिए।
ग्रेग ए। वुड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.