प्रोग्रामिंग में असेंबली सहायता कैसे सीखता है? [बन्द है]


132

मैं लगभग 10 वर्षों से उच्च स्तर की भाषाओं (पायथन, सी #, वीबीए, वीबी.नेट) में प्रोग्रामिंग कर रहा हूं और मुझे पूरी तरह से समझ है कि क्या चल रहा है, "हुड के नीचे।"

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


2
यदि आप वास्तव में जानना चाहते हैं कि आपके कोड के नीचे क्या है, तो इंटेल प्रोसेसर मैनुअल (केवल परिचयात्मक भाग) पर एक नज़र डालें: download.intel.com/products/processor/manual/325462.pdf । हो सकता है कि यह आपकी इच्छा से थोड़ा गहरा हो, लेकिन मुझे यह उपयोगी लगता है।
सुपर जूल

4
यदि आप जानना चाहते हैं कि विशेष रूप से .Net में हूड के तहत क्या होता है, तो आप CIL के बारे में अधिक जानना चाह सकते हैं। यह कुछ मायनों में विधानसभा के समान है, लेकिन बहुत अधिक उच्च स्तर पर है। उसके कारण, वास्तविक असेंबली की तुलना में इसे समझना आसान है।
svick

6
यदि आप असेंबली सीखते हैं, तो आप यह सोचने से बच सकते हैं कि आप forइसके बाहर चर घोषित करके लूप का अनुकूलन कर रहे हैं । उदाहरण
स्ट्रिपलिंगवर्यर

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

14
लर्निंग असेंबली आपको प्रोग्रामिंग लैंग्वेज के कॉन्सेप्ट के लिए गहरे और अगाध प्रेम से रूबरू कराएगी, जो आपको असेंबली में फिर से कॉम्प्लेक्स कोड लिखने से बचाते हैं।
शादुर

जवाबों:


188

क्योंकि आप समझ जाएंगे कि यह वास्तव में कैसे काम करता है।

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

यह बात उबलती है कि हम C # या पायथन में जो कुछ भी लिखते हैं, उसका अनुवाद उन बुनियादी क्रियाओं के अनुक्रम में किया जाना चाहिए, जिन्हें कंप्यूटर निष्पादित कर सकता है। कक्षाओं, जेनेरिक और सूची बोध के संदर्भ में कंप्यूटर के बारे में सोचना आसान है लेकिन ये केवल हमारे उच्च-स्तरीय प्रोग्रामिंग भाषाओं में मौजूद हैं।

हम उन भाषा निर्माणों के बारे में सोच सकते हैं जो वास्तव में बहुत अच्छे लगते हैं, लेकिन चीजों को करने के निम्न-स्तरीय तरीके से बहुत अच्छी तरह से अनुवाद नहीं करते हैं। यह जानकर कि यह वास्तव में कैसे काम करता है, आप बेहतर तरीके से समझेंगे कि चीजें किस तरह से काम करती हैं।


12
+1 के लिए "आप उच्च स्तरीय प्रोग्रामिंग भाषाओं में निर्माणों की सराहना करेंगे" अकेले। बहुत बढ़िया जवाब।
DevSolo

42
सिवाय इसके कि कुछ हफ्तों के बाद, आप C को एक उच्च स्तरीय प्रोग्रामिंग भाषा के रूप में सोचना शुरू करेंगे। जब तक आप निम्न स्तर के एम्बेडेड डिवाइस डेवलपर्स से बात नहीं कर रहे हैं, यह कहते हुए कि ज़ोर से ज़्यादातर लोगों को लगता है कि आप थोड़ा पागल हैं।
डैन नीली

19
@ दान: यह थोड़े मज़ेदार है कि समय के साथ ये शब्द कैसे बदलते हैं। 20 साल पहले, जब मैं प्रोग्रामिंग शुरू कर रहा था, अगर आप किसी से पूछते थे कि वे कहेंगे "बेशक सी एक उच्च-स्तरीय भाषा है!" यह स्पष्ट होना चाहिए ; यह एक मानकीकृत हीप और मेमोरी एक्सेस मॉडल प्रदान करता है। और यह हार्डवेयर से कुछ गंभीर अमूर्तता है; एक निम्न-स्तरीय भाषा में, आपको सभी मेमोरी पतों पर नज़र रखनी होगी, या यदि आप वास्तव में कुछ कर रहे हैं , तो आप अपना स्वयं का आवंटनक लिखते हैं! तो मुझे आश्चर्य होता है कि आज ऐसा कौन सा मापदंड है जो कुछ उच्च-स्तरीय या निम्न-स्तरीय बनाता है?
मेसन व्हीलर

9
उच्च-स्तरीय / निम्न-स्तर बाइनरी नहीं है। एक अच्छी तरह से गोल प्रोग्रामर जिसने अपने कैरियर में असेंबली और पायथन दोनों को लिखा है, वह C या C ++ को मध्य-स्तरीय भाषा मान सकता है।
रसेल बोरोगोव

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

33

यह आपको "हुड के तहत क्या हो रहा है" और कैसे संकेत काम करते हैं और रजिस्टर चर और वास्तुकला (स्मृति आवंटन और प्रबंधन, पैरामीटर पासिंग (मूल्य / संदर्भ द्वारा), आदि) का अर्थ सामान्य रूप से बेहतर समझ देगा।

सी के साथ एक त्वरित नज़र के लिए यह कैसे है?

#include <stdio.h>

main()
{
  puts("Hello World.");
  return(0);
}

इसके साथ संकलित करें gcc -S so.cऔर विधानसभा आउटपुट में देखें so.s:

 $ cat so.s

    .file   "so.c"
    .section    .rodata
.LC0:
    .string "Hello World."
    .text
.globl main
    .type   main, @function
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $16, %esp
    movl    $.LC0, (%esp)
    call    puts
    movl    $0, %eax
    leave
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
    .section    .note.GNU-stack,"",@progbits

2
+1: अच्छी टिप! सी कंपाइलर क्या करता है यह देखकर आप बहुत कुछ सीख सकते हैं।
जियोर्जियो

8
... क्या एसओएस जानबूझकर था? (मदद के लिए कॉल करें, आदि)
इज़काता 19

1
@ इजाता हा हा .. अच्छा एक, मैंने भी ऐसा नहीं देखा। so.cस्टैकओवरफ़्लो प्रश्नों (जैसे मेरे पास so.py, so.awkआदि) के लिए एक मानक फ़ाइल है ताकि चीजों को जल्दी से परख सकें। So.S .. :)
लेवोन

9
यदि आप संकलित करते हैं gcc -O -c -g -Wa,-ahl=so.s so.cतो आप सी कोड की प्रत्येक पंक्ति के लिए असेंबली आउटपुट देख सकते हैं। इससे यह समझना थोड़ा आसान हो जाता है कि क्या हो रहा है।
मैकी मेसर

1
हां, आउटपुट लंबा है। आप 5:so.cलाइन 5 के लिए कोड खोजने के लिए खोज कर सकते हैं so.c
मैकी मेसर

30

मुझे लगता है कि आप जो जवाब चाहते हैं वह यहां है: http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language

लेख का एक उद्धरण:

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

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

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

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

इसके अतिरिक्त, मैं इस पुस्तक की सिफारिश करूंगा क्योंकि इसमें कंप्यूटर आर्किटेक्चर का सरलीकृत संस्करण है: कम्प्यूटिंग सिस्टम का परिचय: बिट्स और गेट्स से लेकर सी और बियोन्ड, ऑस्टिन संजय जे। पटेल, टेक्सास विश्वविद्यालय, ऑस्टिन संजय जे। पटेल, अरबाना - केंपेन में इलिनोइस विश्वविद्यालय


7
यह वर्णित करता है कि ASM का उपयोग किस लिए किया जाता है, और उल्लेख किया जाता है कि HLL फूला हुआ है, लेकिन ASM सीखने के लिए दिया जाने वाला एकमात्र विशिष्ट लाभ सुपर-फास्ट कोड लिखना है। हां, लेकिन अगर आप ASM सीखते हैं, तो आप वास्तव में इसे ऐप्स में शामिल करने की कितनी संभावना रखते हैं? मान लें कि आप व्यावसायिक एप्लिकेशन लिखते हैं, हार्डवेयर नियंत्रक या डिवाइस ड्राइवर नहीं।

+1 @ नॉटकिलरॉय, लिंक के लिए धन्यवाद और विशेष रूप से पुस्तक की सिफारिश
एंथनी

2
@, मैं वास्तव में यह नहीं देख सकता कि आप व्यवसाय सॉफ्टवेयर क्यों विकसित कर रहे हैं। अगर आप डीबीए हैं, या कंपाइलर लिख रहे हैं या मेमोरी स्पेस सीमित है तो यह एक बात है, लेकिन मुझे नहीं लगता कि बहुत से लोग इसे बार-बार छूते हैं। ऑप्टिमाइज़ेशन में ज्यादातर कंपाइलर द्वारा ध्यान रखा जाता है, जो असेंबली में लिखने का सबसे बड़ा कारण है। कभी-कभी यह याददाश्त लीक होने पर नज़र रखने में मदद करता है।
अप्रैल को ब्रायने जूल

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

2
मैं काफी असहमत हूं। एक स्वचालित ऑप्टिमाइज़र अक्सर तेजी से विधानसभा बनाने में एक मानव प्रोग्रामर को हरा सकता है।
डेडएमजी

22

मेरी विनम्र राय में, यह ज्यादा मदद नहीं करता है।

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

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

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

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


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

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

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

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

21

आप जिस सिस्टम में काम कर रहे हैं, उसमें एक स्तर 'डीप' से परिचित होना चाहिए। एक बार में बहुत दूर जाना बुरा नहीं है, लेकिन यह उतना उपयोगी नहीं हो सकता है जितना कोई व्यक्ति चाहेगा।

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

एक जावा प्रोग्रामर के लिए, कुछ सी सीखने से आपको स्मृति प्रबंधन, तर्कों को पारित करने में मदद मिलेगी। सी में कुछ व्यापक जावा पुस्तकालय लिखना, समझने के लिए एक तरीका होगा जब सेट के कार्यान्वयन का उपयोग करें (क्या आपको हैश चाहिए? या पेड़?)। थ्रेडेड वातावरण में चार * से निपटने से यह समझने में सहायता मिलेगी कि स्ट्रिंग अपरिवर्तनीय क्यों है।

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


1
एक स्तर गहरा अधिकार के बारे में है। मैं एक जोड़े के लिए जाना चाहता हूं, लेकिन यह मानते हुए कि एक C # प्रोग्रामर के लिए MSIL का अध्ययन करने की तुलना में x86 विधानसभा ज्ञान निवेश के लायक है, बहुत अधिक पूछ रहा है। जैसा कि किसी ने असेंबली में असेंबली और सॉलिड स्टेट फिजिक्स का अध्ययन किया है, मुझे नहीं लगता कि गेट डिज़ाइन के भौतिकी को जानने से मुझे इलेक्ट्रॉनिक्स में स्नातक की उपाधि प्राप्त करने के अलावा बिल्कुल भी मदद मिली है।
मुहम्मद अल्करौरी

@ मुहम्मदअल्करौरी मैं वर्तमान रिसाव, रन की लंबाई, प्रतिरोध और प्रणाली पर गर्मी के प्रभाव को समझने की तर्ज पर सोच रहा था। न्यूनतम ट्रेस जुदाई और संचालन सहिष्णुता के नियमों से अधिक निर्णय लेने में अंतर्निहित 'क्यों' की समझ।

5

चूँकि आपने सी या सी ++ का उल्लेख उन भाषाओं में नहीं किया है जिन्हें आप जानते हैं। मैं असेंबली के बारे में सोचने से पहले उन्हें अच्छी तरह से सीखने की सलाह दूंगा। C या C ++ उन सभी मूल अवधारणाओं को देगा जो प्रबंधित भाषाओं में पूरी तरह से पारदर्शी हैं और आप इस पृष्ठ में वर्णित अधिकांश अवधारणाओं को एक सबसे महत्वपूर्ण भाषा के साथ समझेंगे, जिसे आप वास्तविक विश्व परियोजनाओं में उपयोग कर सकते हैं। यह आपके प्रोग्रामिंग कौशल के लिए एक वास्तविक अतिरिक्त मूल्य है। कृपया, ध्यान रखें कि असेंबली का उपयोग बहुत विशिष्ट क्षेत्रों में किया जाता है और यह लगभग C या C ++ की तरह उपयोगी नहीं है।

मैं यह भी कहना चाहूंगा कि अप्रबंधित भाषा कैसे काम करती है, इसे समझने से पहले आपको विधानसभा में गोता नहीं लगाना चाहिए। यह लगभग एक अनिवार्य रीडिंग है।

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


5

यदि आप किसी भाषा को अच्छी तरह से जानते हैं, तो आपको कम से कम एब्सट्रैक्शन का एक स्तर कम से कम तकनीकी ज्ञान होना चाहिए।

क्यों? जब चीजें गलत हो जाती हैं, तो अंतर्निहित यांत्रिकी का ज्ञान अजीब समस्याओं को दूर करना आसान बनाता है, और स्वाभाविक रूप से अधिक कुशल कोड लिखता है

उदाहरण के रूप में पायथन (/ CPython) का उपयोग करना, यदि आपको अजीब क्रैश या खराब प्रदर्शन मिलना शुरू हो जाता है, तो सी कोड को डीबग करने का ज्ञान बहुत उपयोगी हो सकता है, इसके साथ ही यह रीफाइन-काउंटिंग मेमोरी मैनेजमेंट विधि का ज्ञान है। यह आपको यह जानने में भी मदद करेगा कि C एक्सटेंशन के रूप में कब / क्या लिखा जाए, इत्यादि ...

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

.. लेकिन, यदि आप सी के साथ अनुभवी हैं, तो "अगले स्तर के नीचे" (विधानसभा) को जानना वास्तव में उपयोगी होगा।

इसी तरह, यदि आप CoffeScript का उपयोग कर रहे हैं तो यह जावास्क्रिप्ट को जानने के लिए बहुत उपयोगी है। यदि आप Clojure का उपयोग कर रहे हैं, तो Java / JVM का ज्ञान उपयोगी है।

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


3

एक छोटा सी प्रोग्राम लिखें, और आउटपुट को अलग करें। बस इतना ही। हालांकि, "हाउसकीपिंग" कोड की अधिक या कम डिग्री के लिए तैयार रहें जो ऑपरेटिंग सिस्टम के लाभ के लिए जोड़ा जाता है।

असेंबली आपको यह समझने में मदद करती है कि हुड के नीचे क्या चल रहा है क्योंकि यह सीधे मेमोरी, प्रोसेसर रजिस्टरों और इस तरह से संबंधित है।

यदि आप वास्तव में चीजों को जटिल करने वाले एक ऑपरेटिंग सिस्टम की जटिलता के बिना नंगे-धातु जाना चाहते हैं, तो विधानसभा भाषा में एक Arduino प्रोग्रामिंग करने का प्रयास करें


3

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

गैर-उच्च स्तरीय भाषा के झुकाव के लिए जोएल का यह मूल्य है: http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html


2

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

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


1

इस सवाल का मेरा जवाब अपेक्षाकृत हाल ही में विकसित हुआ है। मौजूदा जवाबों ने कवर किया है कि मैंने अतीत में क्या कहा होगा। वास्तव में, यह अभी भी शीर्ष उत्तर द्वारा कवर किया गया है - "उच्च-स्तरीय प्रोग्रामिंग में निर्माण की सराहना करते हैं" बिंदु, लेकिन यह एक विशेष मामला है जो मुझे लगता है कि ध्यान देने योग्य है ...

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

खैर, अगर आप 6502 कोडांतरक से निम्नलिखित को समझते हैं ...

LDA variable
CLC
ADC #1
STA variable

यह वास्तव में सिर्फ कदम है। फिर जब आप एक असाइनमेंट स्टेटमेंट में अनुवाद करना सीख जाते हैं ...

variable = variable + 1;

आपको गणितीय समीकरण के लिए एक भ्रामक उपमा की आवश्यकता नहीं है - आपके पास पहले से ही इसे मैप करने के लिए एक सही मानसिक मॉडल है।

EDIT - निश्चित रूप से यदि आप जो स्पष्टीकरण प्राप्त करते हैं, LDA variableवह मूल रूप से है ACCUMULATOR = variable, जो कि आपको कुछ ट्यूटोरियल और संदर्भों से वास्तव में मिलता है, तो आप वापस वहीं समाप्त हो जाते हैं जहां आपने शुरू किया था और यह बिल्कुल भी मदद नहीं करता है।

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

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


0

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

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

" SSE के लिए ऑप्टिमाइज़िंग: ए केस स्टडी " लेख से पता चलता है कि अगर आप विधानसभा जाते हैं तो क्या करना संभव है। लेखक एल्गोरिदम को 100 चक्र / वेक्टर से 17 चक्र / वेक्टर से अनुकूलित करने में कामयाब रहा।


1
लेखक ने C ++ संस्करण में किसी भी वेक्टर निर्देश या आंतरिक का उपयोग नहीं किया। आपको SSE कोड लिखने के लिए कोडांतरक की आवश्यकता नहीं है।
gnasher729

@ gnasher729 हां, आपको जरूरत नहीं है। लेकिन विधानसभा के साथ, कार्यक्रम बहुत तेजी से चल सकता है। एक मानव होशियार हो सकता है (सभी दुर्लभ मामलों में) के बाद संकलक।
B18овиЈ

0

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

इसके अतिरिक्त आधुनिक (पढ़ें - 70-80 के बाद डिज़ाइन किया गया) प्रोसेसर असेंबली आपको यह जानने के लिए पर्याप्त संख्या में विवरण नहीं देगी कि क्या चल रहा है (जो कि अधिकांश प्रोसेसर पर है)। जहां तक ​​शेड्यूलिंग निर्देश चलते हैं, आधुनिक पु (सीपीयू और जीपीयू) काफी जटिल हैं। असेंबली की मूल बातें (या pseudoassembly) को जानने से कंप्यूटर वास्तुकला की पुस्तकों / पाठ्यक्रमों को समझने की अनुमति मिलेगी जो आगे के ज्ञान (कैश, आउट-ऑफ-ऑर्डर निष्पादन, एमएमयू आदि) प्रदान करेंगे। आमतौर पर आपको उन्हें समझने के लिए जटिल ISA जानने की आवश्यकता नहीं है (MIPS 5 काफी लोकप्रिय IIRC है)।

प्रोसेसर क्यों समझते हैं? यह आपको और अधिक समझ दे सकता है कि क्या हो रहा है। मान लें कि आप भोले तरीके से मैट्रिक्स गुणा लिखते हैं:

for i from 0 to N
    for j from 0 to N
        for k from 0 to N
            A[i][j] += B[i][k] + C[k][j]

यह आपके उद्देश्य के लिए 'काफी अच्छा' हो सकता है (यदि यह 4x4 मैट्रिक्स है तो इसे वेक्टर निर्देशों के लिए संकलित किया जा सकता है)। हालांकि जब आप बड़े पैमाने पर सरणियों को संकलित करते हैं तो काफी महत्वपूर्ण कार्यक्रम होते हैं - उनका अनुकूलन कैसे करें? यदि आप असेंबली में कोड लिखते हैं तो आपके पास कुछ% सुधार हो सकता है (जब तक कि आप ज्यादातर लोग ऐसा नहीं करेंगे - भोले तरीके से, रजिस्टरों को कम करके, लगातार मेमोरी को लोड करना / स्टोर करना और धीमी गति से प्रोग्राम करना और फिर एचएल भाषा में) ।

हालाँकि, आप थियो लाइनों को उलट सकते हैं और जादुई रूप से प्रदर्शन प्राप्त कर सकते हैं (क्यों? मैं इसे 'होमवर्क' के रूप में छोड़ता हूं) - IIRC बड़े मैट्रिस के लिए विभिन्न कारकों के आधार पर यह 10x भी हो सकता है।

for i from 0 to N
    for k from 0 to N
        for j from 0 to N
            A[i][j] += B[i][k] + C[k][j]

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

for i from 0 to N
    for K from 0 to N/n
        for J from 0 to N/n
            for kk from 0 to n
                for jj from 0 to n
                    k = K*n + kk
                    j = J*n + jj
                    A[i][j] += B[i][k] + C[k][j]

संक्षेप में - एक विधानसभा की मूल बातें जानने से आप प्रोसेसर डिजाइन से विभिन्न 'विवरणों' में खुदाई कर सकते हैं जो आपको तेज प्रोग्राम लिखने की अनुमति देगा। RISC / CISC या VLIW / वेक्टर प्रोसेसर / SIMD / ... आर्किटेक्चर के बीच अंतर जानना अच्छा हो सकता है। हालाँकि, मैं x86 से शुरू नहीं करूँगा क्योंकि वे काफी जटिल होते हैं (संभवतः एआरएम भी) - यह जानना कि एक रजिस्टर क्या है आदि शुरुआत के लिए पर्याप्त है।


मुझे यह दिलचस्प लगा कि आपने कई कोड नमूने प्रदान किए, लेकिन उनमें से कोई भी असेंबली भाषा में नहीं है।
रॉबर्ट हार्वे

-1

आम तौर पर यह डीबगिंग उद्देश्यों के लिए बहुत महत्वपूर्ण है। जब एक निर्देश के बीच में सिस्टम टूट जाता है और त्रुटि का कोई मतलब नहीं है तो आप क्या करते हैं? जब तक आप केवल सुरक्षित कोड का उपयोग कर रहे हैं, तब तक यह .NET भाषाओं के साथ एक समस्या से बहुत कम है - सिस्टम लगभग हमेशा आपको ढाल देगा कि हुड के नीचे क्या चल रहा है।


-2

संक्षेप में मुझे लगता है कि इसका उत्तर यह है क्योंकि यदि आप असेंबली सीखते हैं तो आप अधिक कर सकते हैं। असेंबली लर्निंग असेंबली डिवाइस प्रोग्रामिंग, सुरक्षा पैठ और परिधि, रिवर्स इंजीनियरिंग और सिस्टम प्रोग्रामिंग के दायरे तक पहुंच प्रदान करता है, जो कि अगर आप असेंबलर को नहीं जानते हैं तो काम करना बहुत कठिन है।

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

इसके अलावा, आपको अपने प्रोग्राम की पठनीयता के साथ बढ़ी हुई प्रोग्राम एक्जीक्यूशन स्पीड को तौलना होगा, जब आप आखिरी संस्करण लिखने के एक साल बाद उसे बदलने के लिए बस बेस से छूट जाएंगे या कोड बेस पर वापस आएंगे।


-3

मैं एल्गोरिदम सीखने की सलाह दूंगा: सॉर्टिंग, लिंक्ड सूची, बाइनरी ट्री, हैशिंग, आदि।

यह भी सीखें कि कंप्यूटर प्रोग्राम समूहों की संरचना और व्याख्या को देखें। कुछ आदिम कमांड, एक लिस्प आदिम और कुछ असेंबलर उत्तेजक)।

अंत में यदि आपको सीखना चाहिए कि असेंबलर एआरएम की तरह एक आसान सीखता है (यह भी x86 की तुलना में लगभग 4 गुना अधिक उपकरणों में उपयोग किया जाता है)।


-8

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

सीपीयू के काम करने के तरीके से भाषाओं का डिज़ाइन निकलता है। निम्न स्तर के कार्यक्रमों पर अधिक, उच्च स्तर के कार्यक्रमों पर कम।

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

कुछ उदाहरण: कई जावा प्रोग्रामर हैं जो यह नहीं समझते हैं कि यह काम क्यों नहीं करता है, और यह जानने से भी कम है कि इसे चलाने पर क्या होता है।

String a = "X";
String b = "X";
if(a==b)  
    return true;

यदि आप एक छोटे से कोडांतरक को जानते थे तो आप हमेशा जानते होंगे कि यह एक मेमोरी लोकेशन की सामग्री नहीं है। पॉइंटर वेरिएबल में संख्या जो उस स्थान पर "पॉइंट" करता है।

इससे भी बदतर, यहां तक ​​कि प्रकाशित पुस्तकों में भी आप कुछ ऐसा पढ़ेंगे जैसे जेएवीए प्राइमिटिव्स संदर्भ द्वारा मूल्य और वस्तुओं द्वारा पारित किए जाते हैं, जो पूरी तरह से गलत है। जावा में सभी तर्क मूल्य द्वारा पारित किए जाते हैं, और जावा केवल कार्यों के लिए ऑब्जेक्ट को पारित नहीं कर सकते हैं, जो मूल्य से पारित हो जाते हैं।

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

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


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

6
कभी भी आप जावा के बारे में दावा करते हैं कि यह गलत है। String a = "X"; String b = "X"; if( a==b) return true;जिसके साथ शुरू होता है वास्तव == trueमें ऐसा कुछ होता है जिसे String interningकंपाइलर कहते हैं । अन्य सभी जावा स्टेटमेंट भी गलत हैं। जावा में संकेत नहीं हैं, इसमें ऐसे संदर्भ हैं जो समान नहीं हैं । और इनमें से किसी का भी किसी भी फैशन में असेंबलर से कोई लेना-देना नहीं है। जावा मूल्य के साथ-साथ संदर्भों द्वारा भी प्राथमिकताओं को पारित करता है। जावा में पॉइंटर्स नहीं हैं, इसलिए यह उन्हें किसी भी चीज़ से पारित नहीं कर सकता है। एएसएम को जानने के लिए फिर से अप्रासंगिक।

मैंने हमेशा सोचा था कि उच्च-स्तरीय भाषाएं ऑब्जेक्ट (मशीन कोड) या छद्म कोड में संकलित की जाती हैं, और एएसएम में नहीं।
फ्रैंक आर।

@FrankComputer सही है, लेकिन मशीन कोड असेंबली निर्देशों के लिए 1: 1 का बहुत अधिक नक्शा बाइट करता है, इसलिए आप आसानी से एक कोड ऑब्जेक्ट और ASM (डिकंपाइलिंग या असेंबलिंग) के बीच अनुवाद कर सकते हैं
dbr

2
@FrankComputer ने पिछली बार Gcc संकलित C / C ++ / फोरट्रान / जावा / ada / etc को आंतरिक बाइट कोड और आंतरिक बाइट कोड से कोडांतरक तक देखा। इसके बाद यह कोडांतरक कोड को कोड कोड में बदलकर इसे मशीन कोड में बदल देता है।
ctrl-alt-delor
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.