2009-06-25 10 views
6

मान लीजिए कि मैं जावा या पायथन में प्रोग्रामिंग या सी ++ एक साधारण सी समस्या के लिए कर रहा हूँ, एक टीसीपी/यूडीपी गूंज सर्वर या भाज्य की गणना के निर्माण के लिए हो सकता है करते हैं। क्या मुझे आर्किटेक्चर विवरणों के बारे में परेशान करना है, यानी, यदि यह 32 या 64-बिट है?एक मशीन कोड लिखने की वास्तुकला को पता है है?

IMHO, जब तक कि मैं काफी निम्न स्तर के सामान के साथ कुछ प्रोग्रामिंग कर रहा हूँ तो मैं अगर परेशान करने के लिए नहीं है अपने 32 या 64 बिट। मुझसे कहां गलती हो रही है? या मैं सही हूँ ???

+0

मेट आप जावा जैसी भाषाओं के बिंदु को भी समझते हैं? यह बिना किसी प्रोग्राम में बदलाव के सभी समर्थित प्लेटफार्मों पर असम्बद्ध है। –

+0

प्लेटफॉर्म आजादी के मामले में जावा की तुलना में सी ++ के साथ तुलना करने से उल्लिखित भाषाओं/प्लेटफॉर्म की योग्यता और विफलताओं को समझने की कमी दिखाई देती है। –

+0

उल्लेख की गई भाषाएं केवल उदाहरण हैं! मैं तुलना या आलोचना नहीं कर रहा हूँ! – g06lin

उत्तर

15

अधिकांश परिस्थितियों

के लिए सही क्रम/भाषा/संकलक होगा सार उन विवरण है जब तक आप एक निम्न स्तर पर शब्द आकार या बाइनरी के साथ सीधे काम कर रहे हैं।

भी byteorder कर्नेल में एनआईसी/नेटवर्क ढेर से निकाला गया है। यह आपके लिए अनुवादित है। जब सी में सॉकेट प्रोग्रामिंग, आप कभी कभी जब डेटा भेजने नेटवर्क के लिए बाइट आदेश से निपटने के लिए है ... लेकिन जो ऐसा नहीं करता चिंता 32 या 64 बिट मतभेद।

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

जावा जैसी वास्तविक चीजें वर्चुअल मशीन में चलती हैं मशीन एक और चरण को सारणीबद्ध करती है!

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

+2

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

+1

"सैन्य हथियारों के लिए वास्तविक समय नियंत्रक" - बहुत बढ़िया! –

0

आप केवल अगर आप की तरह

 
ret = send(socket, &myStruct, sizeof(myStruct)); 

तार पर भेजने के लिए और कच्चे सी structs प्राप्त के बारे में "endian सत्ता" देखभाल करने के लिए की आवश्यकता होगी लेकिन इस एक सिफारिश की प्रथा नहीं है।

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

+0

नहीं, यह उससे भी बदतर है। फ़ाइलों को किसी भी बाइनरी डेटा को पढ़ने या लिखने पर आपको अंतहीनता की आवश्यकता है, और इससे कोई फर्क नहीं पड़ता कि यह संरचनाओं में है या नहीं। –

+0

यदि आप बाइनरी फाइलों पर लिख रहे हैं, तो आप पहले ही प्रोटोकॉल पर सहमत हुए हैं कि दोनों पार्टियां एक-दूसरे के साथ संवाद करने के लिए उपयोग करेंगी। प्रोटोकॉल फ़ाइल प्रारूप है। – Reginaldo

0

सी ++ में, आपको बहुत सावधान रहना होगा यदि आप कोड लिखना चाहते हैं जो 32 या 64 बिट्स पर उदासीन रूप से काम करता है। कई लोग गलत तरीके से मानते हैं कि int उदाहरण के लिए एक पॉइंटर स्टोर कर सकता है।

+0

मुझे इसके साथ कभी समस्या नहीं हुई है। मुझे उन वर्षों के साथ समस्याएं हुई हैं जिन्होंने सोचा था कि int size_t जैसा ही था। –

+1

किसी प्रकार की चौड़ाई को मानना ​​नहीं है (जब यह उस तरह से मेल नहीं खाता है) बस खराब प्रोग्रामिंग अभ्यास? : पी –

+1

ओह, हाँ, यह है। हालांकि, यह सामान्य प्रोग्रामिंग अभ्यास है। मैंने पहली बार इसे देखा जब मैं एक पाठ्यपुस्तक से पढ़ रहा था जिसने "printf (" int का आकार% d \ n ", sizeof (int)) का प्रयास करने का सुझाव दिया;" और एक छात्र को शून्य प्रिंट किया गया - एक बड़े-एंडियन सिस्टम पर जहां int 16 बिट्स और size_t 32 था। –

15

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

आपको स्मृति की तरह चीजों को समझने की आवश्यकता है यह जानने के लिए कि कैश-मिस क्या हैं और वे आपके प्रोग्राम को क्यों प्रभावित कर सकते हैं। आपको पता होना चाहिए कि कुछ चीजें कैसे लागू की जाती हैं, भले ही आप इसे प्राप्त करने के लिए केवल एक इंटरफेस या उच्च स्तरीय तरीके का उपयोग कर सकें, यह जानकर कि यह कैसे काम करता है यह सुनिश्चित करेगा कि आप इसे सर्वोत्तम तरीके से कर रहे हैं।

पैकेट कार्य के लिए, आपको यह समझने की आवश्यकता है कि प्लेटफ़ॉर्म पर डेटा कैसे संग्रहीत किया जाता है और नेटवर्क पर एक अलग प्लेटफ़ॉर्म पर भेजने के तरीके को डेटा कैसे पढ़ा जा सकता है (एंडियन-नेस) बदल सकता है।

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

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

+0

मैं पूरी तरह से आपसे सहमत हूं! – g06lin

+1

आखिरी बिट बहुत अच्छी तरह से रखा गया है: "यह कभी भी पता नहीं होता है" – BCS

1

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

एक ही सी ++ के लिए कहा नहीं किया जा सकता है, जिसमें आप अपने आप को कभी कभी पूछने के लिए यदि आप एक 32 या 64 बिट्स मशीन

3

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

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

6

आपको कभी-कभी परेशान होना चाहिए।

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

double x = fun1(); 
double y = x; 

System.out.println(fun2(x)); 

assert(y == x); 

, बस क्योंकि y स्मृति में रजिस्टर के बाहर मजबूर और 80 से 64 बिट्स से काट दिया गया।

+1

क्या इसका मतलब यह नहीं है कि लिनक्स जेवीएम मानक नहीं है? आईआईआरसी, जावा परिभाषित करता है फ्लोटिंग-पॉइंट ऑपरेशंस बहुत विस्तार से। –

+1

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

+2

हां, यह है एक बग। यह जीएनयू जावा में एक बग के रूप में रिपोर्ट किया गया था, लेकिन अनदेखा किया गया: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16122 –

2

जब तक आप सही तरीके से काम करते हैं, तो आपको लगभग अधिकांश भाषाओं के बारे में जानने की आवश्यकता नहीं होती है। कई लोगों पर, आपको कभी भी जानने की आवश्यकता नहीं है, क्योंकि भाषा व्यवहार अलग-अलग नहीं होता है (जावा, उदाहरण के लिए, रनटाइम व्यवहार को ठीक से निर्दिष्ट करता है)।

सी ++ और सी में, चीजों को सही ढंग से करने से int के बारे में धारणाएं शामिल नहीं होती हैं। Int में पॉइंटर्स न डालें, और जब आप स्मृति आकार या पते के साथ कुछ भी कर रहे हैं तो size_t और ptrdiff_t का उपयोग करें। डेटा प्रकारों के आकार पर भरोसा न करें: int कम से कम 16 बिट्स होना चाहिए, लगभग हमेशा 32 है, और कुछ आर्किटेक्चर पर 64 हो सकते हैं। यह न मानें कि फ़्लोटिंग-पॉइंट अंकगणित अलग-अलग मशीनों पर बिल्कुल उसी तरह किया जाएगा (आईईईई मानकों में उनमें कुछ छूट है)।

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

6

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

Integer a = 100; 
Integer b = 100; 

System.out.println(a == b); 

true मुद्रित करने के लिए गारंटी है कि।

Integer a = 300; 
Integer b = 300; 

System.out.println(a == b); 

true प्रिंट करने की गारंटी नहीं है। यह रनटाइम पर निर्भर करता है। कल्पना ने इसे पूरी तरह से खुला छोड़ दिया। ऐसा इसलिए है क्योंकि मुक्केबाजी -128 और 127 के बीच एक अंतर "इंटर्न" ऑब्जेक्ट्स (जिस तरह से स्ट्रिंग अक्षर का इंटर्न किया जाता है) के समान होता है, लेकिन भाषा रनटाइम के कार्यान्वयन को उस सीमा को बढ़ाने के लिए प्रोत्साहित किया जाता है यदि वे चाहें।

मैं व्यक्तिगत रूप से संबंध एक पागल निर्णय के रूप में, और मुझे आशा है कि वे इसे ठीक करने के बाद के बाद से (एक बार लिखने कहीं चला?)

+0

आपको जावा – GogaRieger

+0

रोचक का एक और बेवकूफ डिज़ाइन निर्णय मिला ... "आंतरिक" ऑब्जेक्ट विवरण में देख रहे हैं! एक लिनक्स x86 32 बिट सिस्टम पर 1.6.0_14 जेवीएम पर, मुझे तब तक सच है जब तक ए और बी <128. – g06lin

+0

दाएं आकार का आकार मिला, लेकिन यह हस्ताक्षरित है (-128 से 127) - http देखें: //java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7 –

0

जावा के साथ और .net तुम सच में जब तक साथ परेशान करने के लिए नहीं है आप बहुत कम स्तर की चीजें कर रहे हैं जैसे twiddling बिट्स। यदि आप सी, सी ++, फोर्टन का उपयोग कर रहे हैं तो आप शायद प्राप्त कर सकते हैं लेकिन मैं वास्तव में "stdint.h" जैसी चीजों का उपयोग करने की अनुशंसा करता हूं, जहां आप स्पष्ट होने के लिए uint64_t और uint32_t जैसी निश्चित घोषणाओं का उपयोग करते हैं। साथ ही, आपको लिंकिंग के आधार पर विशेष रूप से पुस्तकालयों के साथ निर्माण करने की आवश्यकता होगी, उदाहरण के लिए एक 64 बिट सिस्टम डिफ़ॉल्ट 64 बिट संकलन मोड में जीसीसी का उपयोग कर सकता है।

0

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

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

संबंधित मुद्दे