क्या विधानसभा भाषा सीखना योग्य है? [बन्द है]


92

क्या अभी भी ASM सीखना सार्थक है ?

मैं इसके बारे में थोड़ा जानता हूं, लेकिन मैंने वास्तव में इसका इस्तेमाल नहीं किया है या इसे ठीक से नहीं सीखा है क्योंकि जो कुछ भी मैं असेंबलर में करना सीखता हूं वह 1/10 वीं बार कुछ भाषा जैसे C या C ++ के साथ कर सकता हूं। तो, क्या मुझे वास्तव में ASM सीखना और उपयोग करना चाहिए? क्या यह मुझे पेशेवर रूप से अच्छा करेगा? क्या इससे मेरी संसाधन क्षमता बढ़ेगी? संक्षेप में, क्या यह मुझे एक बेहतर प्रोग्रामर बना देगा?

नोट: मैं एफएएसएम या एनएएसएम जैसी निम्न-स्तरीय विधानसभा के बारे में बात कर रहा हूं और एचएलए (हाई-लेवल असेंबलर) जैसी कोई चीज नहीं ।


2
ध्यान दें, कि असेंबली भाषा प्रोसेसर / कंट्रोलर से बंधी होती है।
rmflow

7
आपका मतलब है कि यह क्रॉस-प्लेटफॉर्म नहीं है? !!
अपरेंटिसहैकर

उदाहरण के लिए: worldofspectrum.org/Z80instructions.html
rmflow

2
ठीक है, इसलिए हर प्रोसेसर के लिए एक अलग विधानसभा भाषा है ??? !!!!!!!!!!!!!!!!!!!!!!!!!
अपरेंटिसहैकर

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

जवाबों:


107

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

मुझे लगता है कि यह समझना उपयोगी है कि निचले स्तरों पर क्या होता है। जैसा कि आप असेंबलर पर रिसर्च करते हैं, आप सीपीयू पाइप लाइनिंग, ब्रांच प्रीडिक्शन, कैश अलाइनमेंट, सिमडी, इंस्ट्रक्शन रिडरिंग आदि के बारे में जानेंगे। इनका ज्ञान आपको बेहतर उच्च-स्तरीय कोड लिखने में मदद करेगा।

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

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

यह आपको सुरक्षा मुद्दों की समझ भी बढ़ाता है - राइट-या-एक्ज़ीक्यूट, स्टैक ओवररन, आदि।

जब आप प्रति-निर्देश स्तर पर क्या हो रहा है, इसके बारे में पता होने पर कुछ संगामिति मुद्दे केवल स्पष्ट हो जाते हैं।

यदि आपके पास पूर्ण स्रोत कोड नहीं है, तो यह डीबग करना कभी-कभी उपयोगी हो सकता है।

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

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


7
लिखित उत्तर +1। सीखना और उपयोग करना दो अलग-अलग चीजें हैं, यह सीखना एक अच्छा विचार है, जब / अगर उपयोग करना है तो अनुभव के साथ आता है।
old_timer

एक उदाहरण देने के लिए, लिनुस टॉर्वाल्ड्स अपने कोड को डिबग करने के लिए एक डिस्सेम्बलर का उपयोग करता है इसलिए मुझे लगता है कि उसे x86 असेंबली का अच्छा ज्ञान है।
इवानजिनो

52

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

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


4
आपका मतलब है कि मुझे बस बुनियादी धक्का, पॉप, Mov और आह्वान कमांड सीखना चाहिए ?
अपरेंटिसहैकर

10
मैं सहमत हूं, विधानसभा को जानने की आवश्यकता इस बात पर बहुत निर्भर करती है कि आप किस प्रोग्रामिंग शाखा के साथ काम कर रहे हैं। वेब / डेस्कटॉप / डेटाबेस? कोडांतरक को भूल जाओ। कंप्यूटर गेम और ग्राफिक्स? यह कुछ हद तक आसान हो सकता है। ओएस विकास या वास्तविक समय एम्बेडेड सिस्टम? यह बहुत जरूरी है। और इसी तरह।
लुंडिन

1
आप अन्य उत्तरों को गलत तरीके से प्रस्तुत कर रहे हैं - कोई भी यह नहीं कह रहा है कि आपको ज़रूरत है / विधानसभा सीखना चाहिए ; सवाल के अनुसार यह उपयोगी या सार्थक है। आपका उत्तर हालांकि अभी भी प्रासंगिक है।
ल्यूक डैंटन

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

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

27

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


23

यह विभिन्न भाषाओं के बहुत सारे सीखने के लिए है, बहुत सारे अलग-अलग प्रतिमानों से। जावा, C ++, C # और पायथन सीखना कोई मायने नहीं रखता, क्योंकि वे सभी एक ही प्रतिमान के उदाहरण हैं।

जैसा कि सभी भाषाओं के मूल (अच्छी तरह से जड़ के करीब) में विधानसभा है, मैं एक के लिए कहता हूं कि विधानसभा सीखना सार्थक है।

फिर, यह एक कार्यात्मक प्रोग्रामिंग भाषा, तर्क प्रोग्रामिंग, स्क्रिप्टिंग भाषा, गणित-आधारित भाषा सीखने के लिए सार्थक है। आपके पास केवल इतना समय है, इसलिए आपको चुनना और चुनना होगा।


और फिर, जब आपने अंततः उन सभी को जान लिया है और आपको लगता है कि आपके पास क्या चल रहा है, इसकी झलक आपको जे की खोज है ।
मीका विडेनमैन

4

डिबगिंग करते समय एएसएम जानना भी उपयोगी है, क्योंकि कभी-कभी आपके पास "त्रुटि का एएसएम डंप" होता है।


2

क्या आपके पास इसका उपयोग करने की कोई योजना है? क्या यह किसी भी तरह से आपकी सहायता करने जा रहा है जो आप वर्तमान में करते हैं या करने की योजना बना रहे हैं? वे दो प्रश्न हैं जो आपको स्वयं से पूछने चाहिए, उन का उत्तर आपके प्रश्न का उत्तर है।

अधिक सामान्य अर्थ में, हाँ, मैं कहूंगा कि मेरी राय अच्छी तरह से सीखने के लायक है (x86 या बांह की तरह कुछ), यह कितनी अच्छी तरह से कार्य करता है, यह इस बात पर निर्भर करता है कि आप क्या प्रोग्रामिंग करते हैं और कैसे इसे डीबग करते हैं।


2

निर्भर करता है कि आप किस प्रोग्रामिंग स्तर तक पहुंचना चाहते हैं। यदि आपको डिबगर्स के साथ काम करने की आवश्यकता है तो YES। यदि आपको यह जानने की जरूरत है कि कंपाइलर कैसे काम करता है तो YES। कोई भी कोडांतरक / डिबगर सीपीयू पर निर्भर है, इसलिए बहुत काम है, बस x86 परिवार की जांच करें कि यह कितना बड़ा और पुराना है।


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