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


216

यह एक मुख्य धारा की राय है कि असेंबली प्रोग्रामिंग में अधिक समय लगता है और उच्च स्तरीय भाषा की तुलना में सी में प्रोग्राम करना अधिक कठिन होता है। इसलिए ऐसा लगता है कि यह अनुशंसा या माना जाता है कि इन कारणों से उच्च स्तर की भाषा में लिखना बेहतर है। और बेहतर पोर्टेबिलिटी के कारण के लिए।

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

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

यदि पोर्टेबिलिटी कोई समस्या नहीं है, तो वास्तव में, NASM जैसे एक अच्छे असेंबलर से अधिक क्या होगा?

संपादित करें: केवल इंगित करने के लिए। जब आप असेंबली में लिख रहे होते हैं, तो आपको केवल निर्देश कोड में लिखने की ज़रूरत नहीं होती है। आप कार्यक्रमों को अधिक मॉड्यूलर, अधिक बनाए रखने और पढ़ने में आसान बनाने के लिए विभिन्न सार बनाने के लिए मैक्रोज़ और प्रक्रियाओं और अपने स्वयं के सम्मेलनों का उपयोग कर सकते हैं। यह वह जगह है जहाँ अच्छी विधानसभा को लिखने के तरीके से परिचित किया जाता है।


71
लिखो ? कोड पढ़ने के बारे में क्या? आप (और अन्य) कोड को बहुत अधिक पढ़ेंगे जितना आप इसे लिखते हैं
nos

81
मुझे एक नई भाषा क्यों सीखनी चाहिए क्योंकि मेरा कार्यक्रम एक नए मंच पर चलेगा? सीपीयू को फिट करने के लिए मुझे अपने कार्यक्रमों का निर्माण क्यों करना चाहिए, यह जानने के लिए कि कितने रजिस्टर हैं और आप इसके साथ क्या कर सकते हैं? मैं समस्याओं को हल करने की कोशिश करता हूं, न कि कंप्यूटर की बोली लगाता हूं।
जोकिम सॉयर

8
EDIT का सारांश: एक C संकलक का उपयोग कर सकता है।
मीनर्सबर्क

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

11
@changelog: यह नहीं है कि कैसे आप programming.reddit.com को जादू करते हैं।
BoltClock

जवाबों:


331

उच्च स्तर की भाषाओं की तुलना में ASM की खराब सुगमता है और यह वास्तव में बनाए रखने योग्य नहीं है

इसके अलावा, कई अन्य लोकप्रिय भाषाओं की तुलना में बहुत कम एएसएम डेवलपर्स हैं, जैसे सी।

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

क्या होगा अगर अगले सीपीयू में दो बार कई रजिस्टर हों?

इस प्रश्न का उत्तर होगा: संकलक क्या कार्यक्षमता प्रदान करते हैं?

मुझे संदेह है कि आप अपने ASM को बेहतर से बेहतर कर सकते हैं / करना चाहते हैं / gcc -O3कर सकते हैं।


10
gcc अनुकूलन में महान नहीं है, औसत मानव की तुलना में कहीं अधिक बेहतर है, लेकिन कई स्थान ऐसे हैं जहाँ पर ऑप्टिमाइज़र अच्छा काम करने में विफल रहते हैं। हालांकि आपके साथ सहमत हैं अन्यथा।
old_timer

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

@ बेन एस: मैंने शुरू में "बहुत" के बजाय "बहुत" में संपादित किया क्योंकि "बहुत" का उपयोग केवल एकवचन वस्तुओं के लिए किया जाता है। चूंकि "बहुत" का उद्देश्य बहुवचन (डेवलपर्स) है, "कई" सही विकल्प है। लेकिन मैं आपके उत्तर को फिर से संपादित नहीं करूंगा यदि "बहुत कुछ" आप चाहते हैं।
बिली ओनेल

1
ऐसे कई मामले हैं जहां एक कंपाइलर अच्छी तरह से अनुकूलन नहीं कर सकता है, लेकिन अक्सर एक डेवलपर जिसे ऑप्टिमाइज़र की सीमाओं के बारे में पता है, वह असेंबली का सहारा लिए बिना अपने सी कोड का अनुकूलन कर सकता है।
क्वर्टी

1
अपने दिन के काम में एफडब्ल्यूआईडब्ल्यू मैं हमारे उत्पाद को जीसीसी -ओ -0 के साथ संकलित करता हूं, क्योंकि जीडीबी को लाइव सिस्टम पर संलग्न करने में सक्षम होने और अस्तित्व से बाहर चर के कारण पागल न होने के कारण, बहुत अधिक के एक नरक के लायक है कंपनी की तुलना में यह एक और 4 बिलियन सीपीयू साइकिल प्रतिदिन (कुल 3 ट्रिलियन में से) छोड़ना होगा। पूर्णांक क्रंच करना केवल अड़चन नहीं है।
बेरंड जेन्ड्रीसेक

1930

नरक, मैं एक संकलक हूँ।

जब आप यह वाक्य पढ़ रहे थे तो मैंने हज़ारों पंक्तियों को स्कैन किया था। मैंने शैक्षणिक अनुसंधान की एक विशाल राशि के आधार पर सैकड़ों विभिन्न अनुकूलन तकनीकों का उपयोग करते हुए आपकी एक ही पंक्ति के अनुकूलन की लाखों संभावनाओं के माध्यम से देखा, जिसे आप वर्षों से प्राप्त कर रहे हैं। मैं कोई शर्मिंदगी महसूस नहीं करूंगा, यहां तक ​​कि एक मामूली ick भी नहीं, जब मैं तीन-लाइन लूप को हजारों निर्देशों में परिवर्तित करता हूं तो बस तेजी से बनाने के लिए। मुझे अनुकूलन की महान लंबाई पर जाने या गंदे चालें करने में कोई शर्म नहीं है। और अगर आप मुझे नहीं चाहते हैं, तो शायद एक या दो दिन के लिए, मैं ऐसा व्यवहार करूंगा और आप इसे पसंद करेंगे। मैं आपके द्वारा उपयोग की जाने वाली विधियों को आपके कोड की एक भी पंक्ति को बदलने के बिना भी बदल सकता हूं। मैं आपको यह भी दिखा सकता हूं कि विधानसभा में आपका कोड कैसा दिखेगा, यदि आप चाहें तो विभिन्न प्रोसेसर आर्किटेक्चर और विभिन्न ऑपरेटिंग सिस्टम और विभिन्न विधानसभा सम्मेलनों में। हाँ, सभी सेकंड में। क्योंकि, तुम जानते हो, मैं कर सकता हूं; और आप जानते हैं, आप नहीं कर सकते।

PS ओह, जिस तरह से आप अपने लिखे गए कोड का आधा उपयोग नहीं कर रहे थे। मैंने तुम्हारा उपकार किया और उसे दूर फेंक दिया।


99

मैंने 6502, Z80, 6809 और 8086 चिप्स के लिए कोडांतरक के शेडलोड लिखे हैं। जैसे ही मैं संबोधित कर रहे प्लेटफार्मों के लिए सी कंपाइलर उपलब्ध हो गया, मैंने ऐसा करना बंद कर दिया और तुरंत कम से कम 10x अधिक उत्पादक बन गया। अधिकांश अच्छे प्रोग्रामर उन उपकरणों का उपयोग करते हैं जो वे तर्कसंगत कारणों के लिए उपयोग करते हैं।


72

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

C को 'उच्च स्तरीय असेंबली' के रूप में सोचना संभव है, लेकिन इससे कुछ कदम ऊपर उठें और आप एक अलग दुनिया में हैं। C # में आप इसे लिखने के बारे में दो बार नहीं सोचते:

foreach (string s in listOfStrings) { /* do stuff */ }

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

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

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


क्या अापको उस बारे में पूर्ण विशवास है? मुझे लगता है कि कोड पूरा में पढ़ना याद है कि यह मामला नहीं था ...
jcolebrand

1
मुझे यकीन है कि एक बिंदु है जहां 'कम पंक्तियों' का लाभ 'समय से पहले अनुकूलन' नुकसान द्वारा पीटा जाता है। लेकिन मैंने उम्र में कोड पूरा नहीं देखा है ...
egrunin

6
असेंबली के लिए एक तर्क के रूप में "समय से पहले अनुकूलन" का उपयोग करने के लिए थोड़ा विडंबना ... (मैं शायद आपको गलत व्याख्या करता हूं। मुझे लगता है कि यह हास्यास्पद है।)
बर्नड जेन्ड्रिसक

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

@phresnel: की foreachतुलना में कहीं अधिक काम करता है for- यह एक विशेष प्रकार के इटरेटर को तत्काल तैयार करता है और उसका उपयोग करता है।
इगुनुनिन

15

पठनीयता, रख-रखाव, कम कोड और इसलिए कम बग, और बहुत आसान होने के अन्य लोगों के जवाब के अलावा, मैं एक अतिरिक्त कारण जोड़ूंगा:

कार्यक्रम की गति।

हां, असेंबली में आप हर अंतिम चक्र का उपयोग करने के लिए अपने कोड को ट्यून कर सकते हैं और इसे उतनी ही तेजी से बना सकते हैं जितना कि शारीरिक रूप से संभव है। हालाँकि समय किसके पास है? यदि आप एक पूरी तरह से बेवकूफ सी प्रोग्राम नहीं लिखते हैं, तो कंपाइलर आपके लिए अनुकूलन का एक बहुत अच्छा काम करेगा। संभवतः आपके द्वारा किए गए अनुकूलन में से कम से कम ९ ५% अनुकूलन कर रहे हैं, इसके बिना आपको इसके किसी भी हिस्से पर नज़र रखने की चिंता है। यहाँ निश्चित रूप से 90/10 तरह का नियम है, जहाँ पिछले 5% अनुकूलन में आपका 95% समय समाप्त हो जाएगा। तो परवाह क्यों?


4
+1। कोडांतरक कोड लिखना और फास्ट असेंबलर कोड लिखना दो अलग चीजें हैं। यदि आप एक अच्छे संकलक का उपयोग करते हैं, तो आपको मुफ्त में फास्ट असेंबलर कोड मिलता है।
निकी

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

यदि आप अनुकूलन के बारे में परवाह करते हैं, तो आपको कंपाइलर से ऐसा करना चाहिए ... यदि आप अनुकूलन के बारे में परवाह नहीं करते हैं, लेकिन आप अभी भी असेंबली का उपयोग कर रहे हैं, तो आप बस मूर्खतापूर्ण हो रहे हैं।
ब्रायन पोस्टो

@dwelch: मुझे लगता है कि कुछ स्क्रिप्ट-किडिज़ हो सकते हैं जो यह पता लगाने की जहमत नहीं उठाते कि वे कैसे उपकरण का उपयोग करते हैं। लेकिन मुझे संदेह है कि उनके जैसे लोग कभी तेज कोडर कोड लिख पाएंगे।
निकी

13

यदि एक औसत उत्पादन कार्यक्रम में कोड की 100k लाइनें हैं, और प्रत्येक पंक्ति 8-12 कोडांतरक निर्देशों के बारे में है, तो यह 1 मिलियन कोडांतरक निर्देश होंगे।

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

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


8

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


8
"असेंबली लैटिन है"।
एड्रियानो वरोली पियाज़ा

4
@ एड्रियानो: सिवाय इसके कि कई, कई अलग-अलग बोलियाँ हैं और उनमें से कोई भी एक जैसी नहीं दिखती।
जोआचिम सॉउर

1
ज़रूर, लेकिन मेरा मतलब था कि उनमें से किसी में प्रोग्राम करना सीखना आपको एक मशीन की वास्तुकला पर एक अंतर्दृष्टि देता है जो आपको उच्च स्तर पर मदद करता है। जब तक आप पृष्ठांकित स्मृति से निपटते हैं, उस स्थिति में आप समाप्त हो जाते हैं। जैसे कैतुलस से कारमेन 16 पढ़ना।
एड्रियानो वरोली पियाज़ा

5
@ एड्रियानो "असेंबली लैटिन" है, नो एसम गुफामैन ग्रंट है। हिरण के लिए रॉक 2grunt के लिए एक ग्रंट, आग के लिए 3grunt - साधारण सामान के लिए अच्छा है, लेकिन एक साम्राज्य चलाने के लिए मुश्किल है।
मार्टिन बेकेट

1
@ मर्टिन: क्या आपने कभी रोमन अंक के साथ जटिल अंकगणित करने की कोशिश की है?
एड्रियानो वरोली पियाज़ा

6

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

हालाँकि, वास्तव में कोडांतरक में बहुत कोड लिखने के लिए, कई कारण हैं जो बहुत अधिक नहीं हैं।

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

  • उच्च-स्तरीय भाषाओं (यहां तक ​​कि C और C ++) में कोड बहुत कम लाइनों में कार्यक्षमता का संचालन करता है, और यह देखते हुए काफी शोध है कि बग्स की संख्या स्रोत कोड की लाइनों की संख्या के साथ संबंधित है। यानी, एक ही समस्या, कोडांतरक और C में हल की गई, कोडांतरक में अधिक बग केवल इसलिए होंगे क्योंकि यह अधिक लंबा है। यही तर्क उच्च स्तर की भाषाओं जैसे पर्ल, पायथन आदि के लिए कदम को प्रेरित करता है।

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

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


6

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

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

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


6

जब आप असेंबली में लिख रहे होते हैं, तो आपको केवल निर्देश कोड में लिखने की ज़रूरत नहीं होती है। आप कार्यक्रमों को अधिक मॉड्यूलर, अधिक बनाए रखने और पढ़ने में आसान बनाने के लिए विभिन्न सार बनाने के लिए मैक्रोज़ और प्रक्रियाओं और अपने स्वयं के सम्मेलनों का उपयोग कर सकते हैं।

तो आप जो मूल रूप से कह रहे हैं, वह यह है कि एक परिष्कृत कोडांतरक के कुशल उपयोग के साथ, आप अपने ASM कोड को C (या वैसे भी अपने स्वयं के आविष्कार की एक और निम्न-ईश-स्तरीय भाषा) के करीब और करीब बना सकते हैं, जब तक कि आप बस हैं सी प्रोग्रामर के रूप में उत्पादक के रूप में।

क्या इससे आपके प्रश्न का उत्तर मिलता है? ;-)

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

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

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

संक्षेप में: आप C को पसंद नहीं कर सकते हैं, लेकिन इसका यह अर्थ नहीं है कि C का उपयोग करने का प्रयास कुछ बेहतर करने के प्रयास से अधिक है।


5

असेंबली विभिन्न माइक्रोप्रोसेसरों के बीच पोर्टेबल नहीं है।


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

6
शायद आप वास्तुकला का मतलब है ।
बेन एस

2
@ बेलिंडी - आप x86 परिवार के भीतर विभिन्न प्रोसेसर को लक्षित कर सकते हैं, लेकिन निश्चित रूप से x86 संस्करण और एक एआरएम प्रोसेसर या एक Z80 या 8051 के बीच विधानसभा निर्देशों में कोई समानता नहीं है।
15

सच है, लेकिन तब आप c80 में या तो z80 प्रोग्राम नहीं कर सकते। मुझे लगता है कि हम सभी सामान्य x86 / x64 प्रोसेसर के बारे में बात कर रहे हैं।
ब्लाइंडी

1
सारी दुनिया एक x86 नहीं है। "विभिन्न माइक्रोप्रोसेसरों" के बारे में कुछ भी नहीं पता चलता है कि वे सभी एक ही निर्देश सेट को निष्पादित करते हैं।
बेरंड जेन्ड्रीसेक

5

यही कारण है कि हम अब और बाहर बाथरूम में नहीं जाते हैं, या हम लैटिन या अरामी क्यों नहीं बोलते हैं।

प्रौद्योगिकी के साथ आता है और चीजों को आसान और अधिक सुलभ बनाता है।

EDIT - आपत्तिजनक लोगों को रोकने के लिए, मैंने कुछ शब्द हटा दिए हैं।


4
आप अभी भी Technology
लुडाइट्स

1
"हम लैटिन नहीं बोलते हैं?"
नम

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

4

क्यों? सरल।

इसकी तुलना करें:

        for (var i = 1; i <= 100; i++)
        {
            if (i % 3 == 0)
                Console.Write("Fizz");
            if (i % 5 == 0)
                Console.Write("Buzz");
            if (i % 3 != 0 && i % 5 != 0)
                Console.Write(i);
            Console.WriteLine();
        }

साथ में

.locals init (
    [0] int32 i)
L_0000: ldc.i4.1 
L_0001: stloc.0 
L_0002: br.s L_003b
L_0004: ldloc.0 
L_0005: ldc.i4.3 
L_0006: rem 
L_0007: brtrue.s L_0013
L_0009: ldstr "Fizz"
L_000e: call void [mscorlib]System.Console::Write(string)
L_0013: ldloc.0 
L_0014: ldc.i4.5 
L_0015: rem 
L_0016: brtrue.s L_0022
L_0018: ldstr "Buzz"
L_001d: call void [mscorlib]System.Console::Write(string)
L_0022: ldloc.0 
L_0023: ldc.i4.3 
L_0024: rem 
L_0025: brfalse.s L_0032
L_0027: ldloc.0 
L_0028: ldc.i4.5 
L_0029: rem 
L_002a: brfalse.s L_0032
L_002c: ldloc.0 
L_002d: call void [mscorlib]System.Console::Write(int32)
L_0032: call void [mscorlib]System.Console::WriteLine()
L_0037: ldloc.0 
L_0038: ldc.i4.1 
L_0039: add 
L_003a: stloc.0 
L_003b: ldloc.0 
L_003c: ldc.i4.s 100
L_003e: ble.s L_0004
L_0040: ret 

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


3

मुझे लगता है कि ASM यहां तक ​​कि x86 (_64) उन मामलों में समझ में आता है जहां आप निर्देशों का उपयोग करके बहुत कुछ हासिल करते हैं जो एक कंपाइलर के लिए अनुकूलित करना मुश्किल है। उदाहरण के लिए x264 अपने एन्कोडिंग के लिए बहुत सारे ऐश का उपयोग करता है, और गति लाभ बहुत बड़ा है।


2

मुझे यकीन है कि कई कारण हैं, लेकिन दो त्वरित कारण हैं जिनके बारे में मैं सोच सकता हूं

  1. असेंबली कोड निश्चित रूप से पढ़ने में कठिन है (मैं लिखने के लिए इसके अधिक समय लेने के लिए सकारात्मक हूं)
  2. जब आपके पास किसी उत्पाद पर काम करने वाले डेवलपर्स की एक विशाल टीम होती है, तो यह आपके कोड को तार्किक ब्लॉकों में विभाजित करने और इंटरफेस द्वारा संरक्षित करने में सहायक होता है।

1
ध्यान दें कि आप असेंबली को तार्किक ब्लॉकों में भी अलग कर सकते हैं।
पॉल विलियम्स

2

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

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


2

पोर्टेबिलिटी हमेशा एक मुद्दा है - अभी नहीं तो कम से कम अंततः। प्रोग्रामिंग उद्योग पुराने सॉफ़्टवेयर को पोर्ट करने के लिए हर साल अरबों खर्च करता है, जो उस समय लिखा गया था, "स्पष्ट रूप से" कोई पोर्टेबिलिटी समस्या नहीं थी।


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

या हम C # का उपयोग नहीं कर सकते क्योंकि Windows अगले वर्ष के आसपास नहीं हो सकता है?
मार्टिन बेकेट

उदाहरण के लिए Apple के MacIntosh कंप्यूटर जो मोटोरोला MC68000 सीरीज प्रोसेसर, पावरपीसी (IBM et all) और अब Intel के x86 (IA-32 (e)) प्रोसेसर पर आधारित हैं। तो हाँ, पोर्टेबिलिटी किसी भी सिस्टम के लिए एक मुद्दा है जो लंबे समय से उपयोग किया जाता है, और किसी भी प्रोग्रामर को उनके कोड द्वारा काटे जाने की उम्मीद नहीं की गई है जो अभी तक अनुभवी नहीं है।
mctylr

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

इसका मतलब है कि - मेरे पास बहुत अधिक पोर्टिंग मुद्दे हैं क्योंकि एक उच्च-स्तरीय ढांचा 6 महीने पहले से बदल गया था क्योंकि मैं एक x86 में निर्देश बदल गया था - खासकर जब से हाथ से कोडित एसम सबसे सरल तरीकों से चिपक जाता है।
मार्टिन बेकेट

2

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

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

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

यदि आपकी समस्याओं को कुशल विधानसभा भाषा में व्यक्त करना आसान है, हालांकि, आपके लिए अधिक शक्ति है।


2

अन्य लोगों ने जो कुछ कहा है, उनमें से अधिकांश डिट्टो है।

C का आविष्कार करने से पहले के अच्छे पुराने दिनों में, जब केवल उच्च स्तरीय भाषाएं COBOL और FORTRAN जैसी चीजें थीं, तो बहुत सारी चीजें थीं जो सिर्फ कोडांतरक का सहारा लिए बिना संभव नहीं थीं। यह लचीलेपन की पूर्ण चौड़ाई प्राप्त करने का एकमात्र तरीका था, सभी उपकरणों को एक्सेस करने में सक्षम होना, आदि लेकिन फिर सी का आविष्कार किया गया था, और लगभग कुछ भी जो विधानसभा में संभव था सी। मैंने सी में बहुत कम विधानसभा लिखी है। फिर।

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


हाँ, हाजिर। फ़ोर्ट्रान डिस्क और टेप I / O आईबीएम मेनफ्रेम पर वर्षों पहले बेकार था, इसलिए हमने 370 / असेंबलर में अपने स्वयं के I / O रूटीन लिखे और उन्हें फ़ोर्टन IV कोड से बुलाया। और विधानसभा कोड लिखने ने मुझे वास्तव में अंतर्निहित वास्तुकला को समझा। मैंने अभी कुछ वर्षों के लिए कोई विधानसभा कोड नहीं लिखा है और मेरे साथ काम करने वाले सभी युवा लोगों ने कभी भी कोई लिखा नहीं है - लेकिन मेरी इच्छा है कि वे ऐसा करें, यह बहुत शैक्षिक है।
साइमन नाइट्स

2

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

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

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

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


ब्लैक बॉक्स चीज़ के लिए +1। हां, हम ब्लैक बॉक्स का उपयोग कर रहे हैं, और उनमें (बहुत आसान) झांकने का कोई तरीका नहीं है। सी # फॉरच वास्तव में कैसे काम करता है ? कौन जाने। Microsoft ने कहा, यह एकदम सही है। तो होना ही चाहिए।
ern0

इसके अलावा, यह मत भूलो कि 'उच्च-स्तरीय भाषा' के साथ वास्तविक दुनिया में बहुत सारे अन्य सामान आते हैं। C मानक पुस्तकालयों (गणित, स्ट्रिंग प्रोसेसिंग, I / O आदि) के साथ आता है, और फिर जावा जैसे भारी भार कनेक्टिविटी, छवि प्रसंस्करण, डेटा प्रसंस्करण, वेब देव आदि के लिए अन्य पैकेजों और पुस्तकालयों के भार के साथ आते हैं। यह एक प्रश्न है। एक मंच पर 1 विस्तृत कार्य करने के लिए अपना ध्यान केंद्रित करने के लिए अपने समय का उपयोग करने के लिए (इस प्रकार विधानसभा का उपयोग करके) बनाम एक ही समय खर्च करने में बहुत बड़ा कार्य हो रहा है, जिसमें कई मंच न्यूनतम कीड़े के साथ चल रहे हैं।
jbx

1

मैं अभी COMP में विधानसभा सीख रहा हूँ, और जबकि यह दिलचस्प है, यह भी लिखने में बहुत अक्षम है। आपको काम करने के लिए चीजों को प्राप्त करने के लिए अपने सिर में अधिक विवरण रखना होगा, और इसके समान चीजों को लिखने के लिए धीमा होना चाहिए। । उदाहरण के लिए, C ++ में लूप के लिए एक सरल 6 लाइन 18 लाइनों या असेंबली के अधिक के बराबर हो सकती है।

व्यक्तिगत रूप से, यह सीखने का एक बहुत मज़ा है कि हार्डवेयर स्तर पर चीजें कैसे काम करती हैं, और यह कैसे कंप्यूटिंग के काम के लिए मुझे अधिक सराहना देता है।


1

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

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

नहीं, मैं सी के साथ रहना और एचएलएल के साथ उत्पादकता समय के खिलाफ प्रदर्शन में कभी-कभार थोड़ी मंदी से निपटना चाहूंगा।


1

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

उन्होंने कहा, मुझे लगता है कि अभी भी विधानसभा के लिए वैध उपयोग हैं। उदाहरण के लिए, मेरे पास बड़ी मात्रा में डेटा संसाधित करने, SIMD का उपयोग करने और "हर बिट पवित्र है" [उद्धरण V.Stob] दृष्टिकोण का अनुसरण करने के लिए बहुत सारे अनुकूलित विधानसभा मार्ग हैं। (लेकिन ध्यान दें कि भोले-भाले विधानसभा कार्यान्वयन अक्सर बहुत खराब होते हैं जो आपके लिए एक संकलक उत्पन्न करेगा।)


1

C एक मैक्रो असेम्बलर है! और यह सबसे अच्छा है!

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

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


1

लोग भूल जाते हैं कि दूसरी दिशा भी है।

आप असेंबलर में पहले स्थान पर क्यों लिख रहे हैं? कार्यक्रम को वास्तव में निम्न स्तर की भाषा में क्यों नहीं लिखा जाता है?

के बजाय

mov eax, 0x123
add eax, 0x456
push eax
call printInt

आप बस लिख सकते हैं

B823010000
0556040000
50 
FF15.....

ऐसा बहुत है फायदे हैं, आप अपने कार्यक्रम का सही आकार जानते हैं, आप अन्य निर्देशों के इनपुट के रूप में निर्देशों के मूल्य का पुन: उपयोग कर सकते हैं और इसे लिखने के लिए आपको किसी असेंबलर की भी आवश्यकता नहीं है, आप किसी भी पाठ संपादक का उपयोग कर सकते हैं ...

और जिस कारण से आप अभी भी असेंबलर को पसंद करते हैं, यही कारण है कि अन्य लोग C को पसंद करते हैं ...


0

क्योंकि यह हमेशा इस तरह से होता है: समय बीत जाता है और अच्छी चीजें भी दूर हो जाती हैं :(

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


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

0

$$$

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

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


0

HLL का लाभ तब और अधिक होता है जब आप असेंबली की तुलना C से उच्च स्तर की भाषा से करते हैं, जैसे Java या Python या Ruby। उदाहरण के लिए, इन भाषाओं में कचरा संग्रह है: स्मृति के एक टुकड़े को मुक्त करने के बारे में चिंता करने की कोई आवश्यकता नहीं है, और बहुत जल्दी मुक्त होने के कारण कोई स्मृति लीक या कीड़े नहीं हैं।


0

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

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

हमें अपने कॉलेज के पाठ्यक्रमों में विधानसभा का परिचय मिला है। यह अवधारणाओं को स्पष्ट करने में मदद करेगा। हालाँकि मुझे संदेह है कि हम में से कोई भी विधानसभा में 90% कोड लिखेगा। आज गहराई से विधानसभा ज्ञान कितना प्रासंगिक है?


-2

इन उत्तरों के माध्यम से फ़्लिप करते हुए, मैंने शर्त लगाई कि 9/10 उत्तरदाताओं ने कभी असेंबली के साथ काम नहीं किया है।

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


1
+1 बिना किसी एएसएम अनुभव के लोगों का उल्लेख करते हैं, और एक और +1 को "सी लाइक इन असम" के लिए चाहिए। जब मैं सी ++ (हाँ, सीपीपी, सी) नहीं लिख रहा हूं, तो मैं कोडिंग कर रहा हूं, मैं इसे कोड कर रहा हूं जैसे कि यह थे, जैसे कि कोई नया / मॉलोक () बिल्कुल भी उपयोग नहीं कर रहा है।
ern0

तो आप बहुत सारी चीजों का उपयोग करते हैं जैसे कि char buf [MAX_PATH] जो तब खत्म हो जाती है जब किसी के पास MAX_PATH + n आकार का डेटा होता है? ;)
paulm

1
@ अंपुलम - आपका मतलब सी की तरह है?
रोब

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

1
बस देखा कारण है कि मैं संदिग्ध था और हाँ, मुझे यकीन है कि redditors और HNers यहाँ बता सकते हैं।
रोब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.