क्या मुझे विधानसभा में अभ्यास करने की कोशिश करनी चाहिए? [बन्द है]


9

मैं प्रोजेक्ट यूलर प्रॉब्लम 48 देख रहा था :

श्रृंखला, 1 1 + 2 2 + 3 3 + ... + 10 10 = 10405071317।

श्रृंखला के अंतिम दस अंक, 1 1 + 2 2 + 3 3 + ... + 1000 1000 ज्ञात कीजिए

पायथन में मैं एक ही लाइन के साथ ऐसा कर सकता हूं:

sum((x**x for x in xrange(1,1001))

लेकिन इसके समतुल्य विधानसभा 100 लाइनों और एक वास्तविक चुनौती होगी।

क्या मुझे निम्न स्तर की प्रोग्रामिंग में कुछ अंतर्दृष्टि प्राप्त करने के लिए विधानसभा में इन पहेलियों में से कुछ करना चाहिए और यह समझना चाहिए कि कंप्यूटर वास्तव में कैसे काम करता है?


2
यदि आप नहीं जानते कि मेमोरी कैसे काम करती है तो आपको पॉइंटर्स जैसे विषयों से निपटने की उम्मीद कैसे की जा सकती है? अगर आपको समझ में नहीं आता है कि एक कंप्यूटर और ऑपरेटिंग सिस्टम कैसे काम करता है तो आप किसी एप्लिकेशन को कैसे प्रोग्राम कर सकते हैं?
रामहुंड

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

यदि आपको पॉइंटर्स की पूरी हैंग नहीं मिलती है, तो आप पाएंगे कि कुछ स्थानों पर यह एक गंभीर नुकसान है।
डेविड थॉर्नले

3
या तो आपकी पायथन लाइन x ^ 2 में x के लिए 1..1000 में गणना करती है (x के बजाय x के लिए x में x के लिए 1..1000) या अजगर मेरे विचार से भी अधिक जादू है। :)
इंगो

" *पायथन में कार्य करने की शक्ति" बढ़ा है ?

जवाबों:


1

सीखने की सभा से परे, मेरा मानना ​​है कि यह सीखना कि सी जैसी निम्न-स्तरीय भाषा कैसे संकलित है, अत्यधिक मूल्यवान है। तो मेरा जवाब हां है, लेकिन फिर मैं शायद पक्षपाती हूं क्योंकि मुझे निम्न-स्तरीय प्रोग्रामिंग का आनंद मिलता है।

उदाहरण के लिए, बस यह समझना कि सरल कथन कैसे संकलित हैं। निम्नलिखित समारोह,

int func(int val)
{
  int num = val * 5;
  return num;
}

... (दिलचस्प सा कम से कम):

movl    %edi, -20(%rbp)
movl    -20(%rbp), %edx
movl    %edx, %eax
sall    $2, %eax
addl    %edx, %eax

यह कोड स्टैक (वैल, पैरामीटर टू फंक) से तर्क लेता है, इसे बाएं 2 स्थानों पर शिफ्ट करता है (गुणा 2 ^ 2 या 4) और फिर परिणाम में मूल मूल्य जोड़ता है। अंतिम परिणाम 5 से गुणा है। इस तरह का एक उदाहरण संकलक अनुकूलन जैसी कई चीजों के बारे में बताता है। सीधे 5 से गुणा करने के लिए एक निर्देश को कॉल करने के बजाय, यह दो स्थानों को 4 से गुणा करने के लिए स्थानांतरित करता है और फिर मूल मूल्य जोड़ता है। मुझे इस तरह के उदाहरण मिले कि मैंने निचले स्तर पर चीजों की अपनी समझ को बेहतर बनाया।

-Sविकल्प के साथ gcc से कोडांतरक आउटपुट तैयार करें । हालांकि, ध्यान रखें कि परिणाम संकलक और अनुकूलन स्तर से भिन्न होंगे।

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


11

शायद आवश्यक नहीं कि वास्तव में असेंबलर लिखने में सक्षम हों (जिनमें से अधिकांश आपके सिस्टम के लिए आरंभीकरण और कॉलिंग कन्वेंशन का विवरण)।

यह कुछ समझने लायक है, अगर आप स्रोत के बिना कुछ डिबग करने की कोशिश कर रहे हैं।

लेकिन यह निश्चित रूप से मशीन को कम से कम 'सी' और पॉइंटर्स (अनिवार्य रूप से एक उच्च स्तरीय कोडांतरक) के स्तर पर समझने के लायक है ताकि आप जान सकें कि एक स्ट्रिंग को एक लूप में एक लाख बार छुपाना बुरा क्यों है।


वास्तव में, कुछ अपेक्षाकृत चालाक कार्यान्वयन for i in range(1000000): s = s + '.'मेरे पुन: उपयोग करने वाले "अनुकूलित" संस्करणों की तुलना में अधिक (टी) नहीं बना सकते हैं s। इसी तरह, कई अन्य घटनाक्रम अवैध हैं जो सी ज्ञान के साथ एक उचित धारणा है और एक भोली कार्यान्वयन है। लेकिन सामान्य तौर पर यह हानिकारक से अधिक उपयोगी है। बस ध्यान रखें कि भाषा कार्यान्वयन कभी-कभी आपसे अधिक स्मार्ट होता है;)

2
@delnan -I को अभी एक छोटे से उदाहरण की आवश्यकता थी जहाँ जावा / C # में सहज दिखने वाली चीज़ सिलिकॉन पर बहुत महंगी हो। मैं विशेष रूप से बहुत से ऐसे लोगों के बारे में आया हूं जो सोचते हैं कि एक बड़ी मेमोरी आवंटन और कॉपी तत्काल है।
मार्टिन बेकेट

मुझे विश्वास है कि डेलान :-)
निशांत

5

अच्छा प्रश्न। विधानसभा सीखना निश्चित रूप से अच्छा है और प्रयास के लायक है।

  1. इस तरह के निम्न स्तर की समझ एम्बेडेड सॉफ्टवेयर विकास में अच्छे उपयोग की होगी
  2. निम्न स्तर पर रिफलेक्टरिंग
  3. यह डिबगर का प्रभावी उपयोग करने में आपकी मदद करेगा
  4. आप कोड गुफाओं की तरह सामान में मदद करने के लिए disassembled कोड की समझ दें

2
मैं codec देखने के लिए किया था। मैं इनका बहुत उपयोग करता हूं, लेकिन हम उन्हें अब "डेट्रोइट" कहते हैं। research.microsoft.com/en-us/projects/detours
ProdigySim

1

हां और ना।

हालांकि यह सच है कि यह आपको एक बेहतर समझ प्रदान करेगा कि आपका कोड क्या कर रहा है और क्यों कुछ चीजें सिर्फ एक बुरा विचार है जो आपको प्रयास के बारे में सोचना है।

लर्निंग असेंबलर एक सप्ताहांत परियोजना नहीं है, इसमें आपको बहुत समय लगेगा और आपको यह सोचने की ज़रूरत है कि क्या यह समय बेहतर खर्च किया जा सकता है या नहीं।

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


1

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


क्या यह जानना कि कार का इंजन कैसे आपको बेहतर चालक बनाता है? नहीं, लेकिन यह आपको एक बेहतर कार मालिक बनाता है, क्योंकि यदि इंजन टूट जाता है तो आप इसे ठीक कर सकते हैं।
कैमरन मार्टिन

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

1

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

(जब मैं एचएलएल में लिखे जा रहे होस्ट प्रोग्राम के बारे में बात करता हूं, मेरा मतलब है कि जब मैं x86_64 asm, और BASIC सीखने की कोशिश कर रहा हूं तो C या ObjC, जब मैं Z80, 6502 और 6809 asm पर काम कर रहा हूं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.