आप विधानसभा में कार्यक्रम क्यों करते हैं? [बन्द है]


86

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

उदाहरण के लिए, कई आधुनिक 3-डी गेम्स में C ++ और असेंबली में लिखे गए उनके उच्च प्रदर्शन कोर इंजन हैं।

जहाँ तक असेंबली जाती है - असेंबली में लिखा गया कोड है क्योंकि आप अतिरिक्त निर्देशों को छोड़ते हुए या अत्यधिक बाइट्स का उपयोग कर एक कंपाइलर नहीं चाहते हैं, या क्या आप बेहतर एल्गोरिदम का उपयोग कर रहे हैं जिसे आप C में व्यक्त नहीं कर सकते (या बिना व्यक्त नहीं कर सकते हैं) संकलक उन्हें ऊपर उठाते हुए)?

मैं पूरी तरह से यह समझता हूं कि निम्न-स्तरीय सामान को समझना महत्वपूर्ण है। मैं आपको समझने के बाद विधानसभा में क्यों कार्यक्रम को समझना चाहता हूं ।


1
इसी तरह के सवाल पहले से ही हैं, मुझे लगता है ...
मेहरदाद अफश्री

8
Eeeeehh .. तकनीकी रूप से यह एक अलग सवाल है। वे प्रश्न दोनों विधानसभा क्यों सीखते हैं, यही कारण है कि इसमें कार्यक्रम, जो कि .. मुझे लगता है कि अलग है ....?
cgp

4
आप विधानसभा में कार्यक्रम क्यों करते हैं? - आइए उस सवालों के कुछ महत्वपूर्ण जवाबों को देखें: 1) मेरे कोड को बनाए रखने के लिए, 2) लचीला, 3) को सुनिश्चित करने के लिए पोर्टेबिलिटी, 4) परीक्षणशीलता, 5) पठनीयता, ...;)
ivan_ivanovn_ivanoff

9
नौकरी की सुरक्षा ........
सैन जैसिंटो

3
क्योंकि यह मजेदार है .. :)
RainingComputers

जवाबों:


169

मुझे लगता है कि आप इस कथन को गलत बता रहे हैं:

उदाहरण के लिए, कई आधुनिक 3-डी गेम्स में C ++ और असेंबली में लिखे गए उनके उच्च प्रदर्शन कोर इंजन हैं।

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

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

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

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

यहां कुछ और प्रासंगिक उदाहरण दिए गए हैं:

खेलों से उदाहरण

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

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

उच्च प्रदर्शन कंप्यूटिंग

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

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

    यदि आप सोच रहे हैं कि यह क्यों महत्वपूर्ण है, तो इस काम से निकले विज्ञान के लेख को देखें । Lattice QCD का उपयोग करते हुए, इन लोगों ने पहले सिद्धांतों से एक प्रोटॉन के द्रव्यमान की गणना की, और पिछले साल दिखाया कि 90% द्रव्यमान मजबूत बल बंधन ऊर्जा से आता है, और शेष क्वार्क से। वह E = mc 2 क्रिया में है। यहाँ एक सारांश है

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


12
अद्भुत प्रतिक्रिया। काश हम इसे विकी में डाल पाते!
BDD

6
@ पेपरो ... आप कर सकते हैं। StackOverflow पर सवाल और जवाब रचनात्मक कॉमन्स एट्रिब्यूशन लाइसेंस प्राप्त हैं।
हारून मेंपा

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

42

मैंने कई वर्षों तक असेंबली भाषा में कोडिंग नहीं की है, लेकिन मैं कई कारण दे सकता हूं जो मैंने अक्सर देखे हैं:

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

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

  • कुछ हार्डवेयर स्तर तक पहुँच केवल विधानसभा भाषा के माध्यम से संभव / व्यावहारिक है (जैसे, डिवाइस ड्राइवर लिखते समय)।

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

  • API की अनुपस्थिति में कुछ 3D ग्राफिक कार्ड (लगभग 1990 के दशक के अंत में) प्रोग्रामिंग करना अक्सर असेंबली भाषा में अधिक व्यावहारिक और कुशल था, और कभी-कभी अन्य भाषाओं में संभव नहीं होता था। लेकिन फिर से, यह वास्तव में विशेषज्ञ-स्तरीय गेम में त्वरक वास्तुकला के आधार पर शामिल था, जैसे कुछ क्रम में मैन्युअल रूप से डेटा को अंदर और बाहर ले जाना।

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


19

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


3
हे, यह कोडांतरक काम का परिणाम है! आप आम तौर पर बहुत सारे मैक्रोज़ लिखते हैं।
मेहरदाद आफश्री

5
न केवल संतुष्टि, बल्कि परिशुद्धता की प्रशंसा। इसके बारे में सब कुछ के साथ एक संक्षिप्त प्रक्रिया घोषित की जाती है।
बहू

18

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

यहां वह उदाहरण है जिसका मैं उल्लेख कर रहा हूं।


2
+1 बहुत सही। लंबे asm कोड लिखने में इंसान बहुत खराब है।
डेड अकाउंट

ध्यान रखें कि जब कोडांतरक लिखा गया था तब उपकरण हमेशा उपलब्ध नहीं थे।
मार्को वैन डे वोअर्ट

16

मैंने अपनी पहली नौकरी (80) में असेंबली भाषा में पेशेवर प्रोग्रामिंग शुरू की। एम्बेडेड सिस्टम के लिए मेमोरी की मांग - RAM और EPROM - कम थी। आप तंग कोड लिख सकते हैं जो संसाधनों पर आसान था।

80 के दशक के अंत तक मैंने सी पर स्विच कर दिया था। कोड लिखना, डिबग करना और बनाए रखना आसान था। कोड के बहुत छोटे स्निपेट असेंबलर में लिखे गए थे - मेरे लिए यह तब था जब मैं रोल-योर-आरटीओएस में स्विच करने वाला संदर्भ लिख रहा था। (कुछ ऐसा नहीं करना चाहिए जब तक कि यह "विज्ञान परियोजना" न हो।)

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

मुझे लगता है कि आप सबसे सामान्य प्रोग्रामिंग के लिए आधुनिक सी कंपाइलरों को बाहर करने के लिए मुश्किल से दबाए जाएंगे।

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

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


10

"हाँ"। लेकिन, यह समझें कि अधिकांश भाग के लिए कोडांतरक में कोड लिखने के लाभ प्रयास के लायक नहीं हैं। असेंबली में इसे लिखने के लिए मिलने वाला रिटर्न समस्या के बारे में कठिन सोचने पर ध्यान केंद्रित करने और अपना बेहतर समय बिताने से बेहतर होता है कि आप अपना समय बेहतर तरीके से सोचें।

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

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


9

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


उस स्थिति में, मैं एक संकलक आंतरिक उपयोग करूँगा।
मेहरदाद अफश्री

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

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

8

कम से कम MSVC में कंपाइल इंट्रिंसिक्स की तुलना में SSE कोड असेंबली में बेहतर काम करता है। (यानी डेटा की अतिरिक्त प्रतियां नहीं बनाता है)


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

6

मैंने अपने स्रोतों में तीन या चार कोडांतरक दिनचर्या (लगभग 20 एमबी स्रोत) में काम किया है। वे सभी एसएसई (2) हैं , और ऑपरेशन से संबंधित हैं (काफी बड़े - 2400x2048 और बड़े) छवियों पर विचार करें।

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

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

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

बहुत से लोग सोचते हैं कि एम्बेडेड कोडांतरक का एक बहाना है, लेकिन उनके नियंत्रकों के पास उन मशीनों की तुलना में अधिक सीपीयू शक्ति है जिन पर यूनिक्स विकसित किया गया था। ( USD 10 के तहत 40 और 60 MIPS माइक्रोकंट्रोलर के साथ आने वाला माइक्रोचिप )।

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

मुझे अभी भी एक उत्तर पसंद है जब एक प्रोफेसर ने पूछा था कि क्या हम GOTO का उपयोग कर सकते हैं (लेकिन आप ASSEMBLER के रूप में भी पढ़ सकते हैं): "अगर आपको लगता है कि यह 3 पेज का निबंध लिखने के लायक है, तो आपको इसकी आवश्यकता क्यों है, आप इसका उपयोग कर सकते हैं कृपया अपने परिणाम के साथ निबंध जमा करें। "

मैंने उपयोग किया है कि लोवेल सुविधाओं के लिए एक मार्गदर्शक सिद्धांत के रूप में। इसका उपयोग करने के लिए बहुत तंग मत करो, लेकिन सुनिश्चित करें कि आप इसे ठीक से प्रेरित करते हैं। यहां तक ​​कि औचित्य से बचने के लिए कृत्रिम बाधा या दो (निबंध की तरह) फेंक दें।


1
मुझे निबंध-परीक्षा पसंद है; मुझे इसे अधिक बार उपयोग करने की आवश्यकता हो सकती है;)
पूर्व निहिलो

5

कुछ निर्देश / झंडे / नियंत्रण केवल सी स्तर पर नहीं हैं।

उदाहरण के लिए, x86 पर अतिप्रवाह के लिए जाँच साधारण अतिप्रवाह ध्वज है। यह विकल्प C में उपलब्ध नहीं है।


आप बिट ऑपरेशंस के साथ C में ओवरफ्लो झंडे की गणना कर सकते हैं।
स्वीगी

@ स्वेगी: मुझे यकीन है कि यह बहुत धीमी है।
ब्रायन

यह कितनी बार उपयोगी है? और जब यह होता है, तो यह संभवतः कोडांतरक में छोड़ने का एकमात्र कारण नहीं हो सकता है।

5

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


3

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


3

अन्य उल्लिखित बातों के अलावा, सभी उच्च भाषाओं की कुछ सीमाएँ हैं। यही कारण है कि कुछ लोग अपने कोड पर पूर्ण नियंत्रण रखने के लिए ASM में प्रोग्राम करना चुनते हैं।

अन्य लोग बहुत छोटे निष्पादन का आनंद लेते हैं, 20-60KB की सीमा में, उदाहरण के लिए HiEditor की जाँच करें , जिसे HiEdit नियंत्रण के लेखक द्वारा कार्यान्वित किया गया है, सिंटैक्स हाइलाइटिंग और केवल 50kb में टैब के साथ विंडोज के लिए शानदार शक्तिशाली संपादन नियंत्रण)। मेरे संग्रह में मेरे पास 20 से अधिक ऐसे सोने के नियंत्रण हैं, जैसे ssheets से लेकर html रेंडर तक।


3

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

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

वह बोली सामान्यीकृत है, और कहीं नहीं के रूप में सच के रूप में यह एक दशक पहले था।

लेकिन हे, मात्र तथ्यों को विधानसभा के पक्ष में एक सच्चे हैकर के धर्मयुद्ध में बाधा नहीं होनी चाहिए। ;)


3

यदि आप 128 बाइट रैम और प्रोग्राम मेमोरी के 4K के साथ एक कम अंत 8 बिट माइक्रोकंट्रोलर प्रोग्रामिंग कर रहे हैं तो आपके पास असेंबली का उपयोग करने के बारे में अधिक विकल्प नहीं हैं। कभी-कभी हालांकि अधिक शक्तिशाली माइक्रोकंट्रोलर का उपयोग करते समय आपको सटीक समय पर एक निश्चित कार्रवाई करने की आवश्यकता होती है। असेंबली भाषा तब उपयोगी होती है जब आप निर्देशों को गिन सकते हैं और इसलिए अपने कोड द्वारा उपयोग किए जाने वाले घड़ी चक्रों को माप सकते हैं।


2

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


2

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

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

उदाहरण के लिए SH4 के कुछ मॉडल में 4x4 मैट्रिक्स और 4 वेक्टर निर्देश होते हैं। मैंने हार्डवेयर सुधार से मिलान करने के लिए सुधार मैट्रिक्स को 4x4 तक बढ़ाने की छोटी लागत पर उचित निर्देशों के साथ 3x3 मैट्रिक्स पर बराबर सी ऑपरेशन को बदलकर एक रंग सुधार एल्गोरिथ्म में एक बड़ा प्रदर्शन सुधार देखा । यह असेंबली की एक दर्जन से अधिक पंक्तियों को लिखने और संबंधित डेटा प्रकारों के मिलान समायोजन को ले जाने और आसपास के सी कोड में मुट्ठी भर स्थानों पर ले जाने के द्वारा प्राप्त किया गया था।


2

यह उल्लेख नहीं लगता है, इसलिए मैंने सोचा कि मैं इसे जोड़ूंगा: आधुनिक खेल विकास में, मुझे लगता है कि कम से कम कुछ विधानसभा में लिखा जा रहा है जो सीपीयू के लिए बिल्कुल भी नहीं है। यह GPU के लिए, shader प्रोग्राम के रूप में है

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


2

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

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

अंत में, यदि आपके पास इंटरप्ट सर्विस रूटीन हैं, तो asm दुनिया में सभी अंतर पैदा कर सकता है - ऐसे कुछ ऑपरेशन हैं जिन्हें आप अभी बाधित नहीं करना चाहते हैं, और आप चाहते हैं कि आपका इंटरप्ट हैंडलर "अंदर और बाहर निकले"। .. आप लगभग पूरी तरह से जानते हैं कि आपके ISR में क्या होने वाला है अगर यह asm में है, और यह आपको खूनी चीजों को कम रखने के लिए प्रोत्साहित करता है (जो वैसे भी अच्छा अभ्यास है)।


2

खेल बहुत अच्छा प्रदर्शन कर रहे हैं और इस बीच हालांकि ऑप्टिमाइज़र बहुत अच्छे हैं "मास्टर प्रोग्रामर" अभी भी विधानसभा में सही भागों को कोड करके कुछ और प्रदर्शन को निचोड़ने में सक्षम है।

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


2

मैंने केवल एक डेवलपर से उसकी असेंबली के उपयोग के बारे में बात की है। वह फर्मवेयर पर काम कर रहा था जो एक पोर्टेबल एमपी 3 प्लेयर के लिए नियंत्रण से निपटता था। असेंबली में काम करने के 2 उद्देश्य थे:

  1. गति: विलंब न्यूनतम होना चाहिए।
  2. लागत: कोड के साथ न्यूनतम होने से, इसे चलाने के लिए आवश्यक हार्डवेयर थोड़ा कम शक्तिशाली हो सकता है। जब लाखों-करोड़ों इकाइयां उत्पादन करती हैं, तो यह और बढ़ सकता है।

2

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

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


2

पिछली बार जब मैंने कोडांतरक में लिखा था कि मैं कंपाइलर को लिबाक-मुक्त, स्थिति स्वतंत्र कोड उत्पन्न करने के लिए मना नहीं सकता था।

अगली बार शायद उसी कारण से होगा।

बेशक, मेरे पास अन्य कारण थे


2

बहुत सारे लोग विधानसभा भाषा को बदनाम करना पसंद करते हैं क्योंकि उन्होंने कभी भी इसके साथ कोड करना नहीं सीखा है और केवल अस्पष्ट रूप से इसका सामना किया है और इसने उन्हें या तो उत्तेजित या कुछ हद तक डरा दिया है। सच्चे प्रतिभाशाली प्रोग्रामर यह समझेंगे कि C या असेंबली को कोसना बेहूदा है क्योंकि वे प्रशंसात्मक हैं। वास्तव में एक का फायदा दूसरे का नुकसान है। C के व्यवस्थित वाक्यविन्यास नियम स्पष्टता में सुधार करते हैं, लेकिन साथ ही साथ किसी भी संरचनात्मक नियमों से मुक्त होने से सभी पावर असेंबली को छोड़ देता है! सी-कोड निर्देश गैर-अवरोधक कोड बनाने के लिए किया जाता है, जो तर्क शक्ति की स्पष्टता का तर्क दे सकता है लेकिन यह एक शक्ति हानि है। C में कंपाइलर if / /ifif / else / end के अंदर छलांग नहीं लगाएगा। या आपको अलग-अलग चर पर दो / अंत छोरों के लिए दो लिखने की अनुमति नहीं है जो एक दूसरे को ओवरलैप करते हैं, आप स्व संशोधित कोड नहीं लिख सकते हैं (या सहज तरीके से नहीं कर सकते हैं), आदि .. पारंपरिक प्रोग्रामर उपरोक्त द्वारा छेड़े गए हैं, और इन तरीकों की शक्ति का उपयोग करने का कोई विचार भी नहीं होगा क्योंकि वे पारंपरिक नियमों का पालन करने के लिए उठाए गए हैं। । यहाँ सच है: आज हमारे पास कंप्यूटिंग शक्ति के साथ मशीन है कि हम उनके लिए उपयोग करने वाले अनुप्रयोग को अधिक करते हैं लेकिन मानव मस्तिष्क उन्हें नियम मुक्त कोडिंग वातावरण (= असेंबली) में कोड करने में असमर्थ है और इसके लिए प्रतिबंधात्मक नियमों की आवश्यकता है स्पेक्ट्रम को कम करने और कोडिंग को सरल बनाता है। मेरे पास खुद का लिखा हुआ कोड है जो उपरोक्त उल्लिखित सीमाओं के कारण अत्यधिक अक्षम होने के बिना सी कोड में नहीं लिखा जा सकता है। और मैंने अभी तक गति के बारे में बात नहीं की है, जो ज्यादातर लोगों को लगता है कि विधानसभा में बैठने का मुख्य कारण है, अच्छी तरह से यह है कि अगर आप मन C में सोचने तक सीमित हैं तो आप हमेशा के लिए संकलक के गुलाम हैं। मैंने हमेशा सोचा था कि शतरंज के खिलाड़ी मास्टर्स आदर्श विधानसभा प्रोग्रामर होंगे जबकि सी प्रोग्रामर सिर्फ "डेम" खेलते हैं।


1
JIT- एक बार / कई परिदृश्यों के बाहर, अधिकांश आधुनिक CPU पर प्रदर्शन के लिए स्व-संशोधित कोड उपयोगी नहीं है। लेकिन स्थिरांक के रूप में तुरंत भरना एक मजेदार संभावना है। सी gotoएक फ़ंक्शन के भीतर असंरचित छलांग की अनुमति देता है, हालांकि। एक if()ही फ़ंक्शन में एक लूप के अंदर एक ब्लॉक में शामिल करना। जैसे godbolt.org/z/IINHTgdo{}while()एक अनियंत्रित लूप में कूद को व्यक्त करने के लिए एक लूप में स्विच / केस का उपयोग करके डफ का डिवाइस भी देखें । लेकिन कुछ बिंदु पर यह asm में लिखने के लिए स्पष्ट हो सकता है यदि आप उस स्तर तक गड़बड़ कर रहे हैं।
पीटर कॉर्ड्स

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

1

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


1

अगर मैं GCC और विजुअल C ++ 2008 (जिसे विजुअल C ++ 9.0 भी कहा जाता है) को पछाड़ने में सक्षम हूं तो लोग मुझे इंटरव्यू देने में रुचि लेंगे कि यह कैसे संभव है।

यही कारण है कि फिलहाल मैं सिर्फ विधानसभा में चीजों को पढ़ता हूं और आवश्यकता पड़ने पर __asm ​​int 3 लिखता हूं।

मुझे उम्मीद है कि इस मदद ...


1

मैंने कुछ वर्षों के लिए विधानसभा में नहीं लिखा है, लेकिन मैं जिन दो कारणों का इस्तेमाल करता था:

  • बात की चुनौती! जब मैं x86 असेंबली ( डॉस और विंडोज 3.1 के दिनों ) में सब कुछ लिखूंगा, तो मैं कई महीने पहले आया था । इसने मुझे मूल रूप से निम्न स्तर के संचालन, हार्डवेयर I / O , आदि का एक हिस्सा सिखाया ।
  • कुछ चीजों के लिए इसका आकार छोटा रखा गया (फिर टीएसआर लिखते समय DOS और Windows 3.1 )

मैं फिर से कोडिंग असेंबली को देखता रहता हूं, और यह चुनौती और चीज की खुशी से ज्यादा कुछ नहीं है। मेरे पास ऐसा करने का कोई अन्य कारण नहीं है :-)


1

मैंने एक बार एक डीएसपी परियोजना को संभाला था, जो कि पिछले प्रोग्रामर ने ज्यादातर असेंबली कोड में लिखी थी, सिवाय टोन-डिटेक्शन लॉजिक के, जो सी में लिखी गई थी, फ्लोटिंग-पॉइंट (एक निश्चित-बिंदु डीएसपी पर!) का उपयोग करते हुए। टोन डिटेक्शन लॉजिक वास्तविक समय के 1/20 पर चला।

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

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


0

एंड्रॉइड फोन पर जावा अनुप्रयोगों के लिए बाईटेकोड की व्याख्या करने वाले दलविक वीएम डिस्पैचर के लिए कोडांतरक का उपयोग करता है। यह फिल्म (लगभग 31 मिनट, लेकिन इसकी पूरी फिल्म देखने के लायक है!) बताती है कि कैसे

"अभी भी ऐसे मामले हैं जहां एक मानव एक संकलक से बेहतर कर सकता है"।


0

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

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