ऐतिहासिक रूप से (शायद इसके कुछ हिस्सों को फिर से लिखना), यह इसके विपरीत था। 1970 के दशक के पहले कंप्यूटरों पर (शायद PDP-11 ) एक प्रोटोटाइप भ्रूण सी (शायद BCPL ) चल रहा था, कोई MMU और कोई मेमोरी प्रोटेक्शन नहीं था (जो कि ज्यादातर पुराने IBM / 360 मेनफ्रेम पर मौजूद था )। तो स्मृति के हर बाइट (शाब्दिक तार या मशीन कोड से निपटने वाले भी) एक गलत कार्यक्रम द्वारा ओवरराइट किया जा सकता है (एक कार्यक्रम कुछ बदल रहा है की कल्पना %
करने के लिए /
एक में (3) printf प्रारूप स्ट्रिंग)। इसलिए, शाब्दिक तार और स्थिरांक लेखन योग्य थे।
1975 में एक किशोरी के रूप में, मैंने पेरिस में पुराने 1960 के दशक के पुराने कंप्यूटरों पर मेमोरी प्रोटेक्शन के बिना पलैस डे ला डेकोवरटे म्यूजियम में कोडिंग की: आईबीएम / 1620 में केवल एक कोर मेमोरी थी, जिसे आप कीबोर्ड के माध्यम से शुरू कर सकते थे, इसलिए उसे कई दर्जनों टाइप करना पड़ा अंकित टेप पर प्रारंभिक कार्यक्रम को पढ़ने के लिए अंकों का; सीएबी / 500 में एक चुंबकीय ड्रम मेमोरी थी; आप ड्रम के पास यांत्रिक स्विच के माध्यम से कुछ ट्रैक लिखने को अक्षम कर सकते हैं।
बाद में, कंप्यूटर को कुछ मेमोरी प्रोटेक्शन के साथ मेमोरी मैनेजमेंट यूनिट (MMU) का रूप मिला। किसी प्रकार की मेमोरी को अधिलेखित करने के लिए सीपीयू को मना करने वाला एक उपकरण था। तो कुछ मेमोरी सेगमेंट, विशेष रूप से कोड सेगमेंट (उर्फ .text
सेगमेंट) केवल-रीड (ऑपरेटिंग सिस्टम को छोड़कर जो उन्हें डिस्क से लोड किया गया था) बन गए। कंपाइलर और लिंकर के लिए उस कोड सेगमेंट में शाब्दिक तार लगाना स्वाभाविक था, और शाब्दिक तार केवल पढ़ा गया। जब आपके कार्यक्रम ने उन्हें अधिलेखित करने की कोशिश की, यह बुरा था, एक अपरिभाषित व्यवहार । और वर्चुअल मेमोरी में रीड-ओनली कोड सेगमेंट होने से एक महत्वपूर्ण लाभ मिलता है: एक ही प्रोग्राम चलाने वाली कई प्रक्रियाएँ समान रैम ( भौतिक मेमोरी) साझा करती हैंउस कोड सेगमेंट के लिए पेज) ( लिनक्स पर mmap (2) केMAP_SHARED
लिए ध्वज देखें )।
आज, सस्ते माइक्रोकंट्रोलर्स के पास कुछ रीड-ओनली मेमोरी होती है (जैसे उनकी फ्लैश या रॉम), और वहां अपना कोड (और शाब्दिक तार और अन्य स्थिरांक) रखते हैं। और असली माइक्रोप्रोसेसर (जैसे आपके टैबलेट, लैपटॉप या डेस्कटॉप में से एक) में एक परिष्कृत मेमोरी मैनेजमेंट यूनिट और कैश मशीनरी है जिसका उपयोग वर्चुअल मेमोरी और पेजिंग के लिए किया जाता है । इसलिए निष्पादन योग्य कार्यक्रम का कोड खंड (जैसे कि ईएलएफ में ) मेमोरी रीड-ओनली, शरेबल, और एग्जीक्यूटेबल सेगमेंट ( मिमीप द्वारा (2) या लिनक्स पर निष्पादित (2) के रूप में मैप किया जाता है ; बीटीडब्ल्यू आप ld को निर्देश दे सकते हैं)यदि आप वास्तव में चाहते थे) तो एक योग्य कोड खंड प्राप्त करने के लिए। इसे लिखना या गाली देना आमतौर पर एक विभाजन दोष है ।
तो सी मानक बैरोक है: कानूनी रूप से (केवल ऐतिहासिक कारणों के लिए), शाब्दिक तार const char[]
सरणियाँ नहीं हैं, लेकिन केवल char[]
सरणियाँ जिन्हें ओवरराइट करने की मनाही है।
BTW, कुछ मौजूदा भाषाओं में स्ट्रिंग लिटरल को अधिलेखित करने की अनुमति है (यहां तक कि Ocaml जो कि ऐतिहासिक रूप से-और बुरी तरह से गलत लेखन योग्य है) ने हाल ही में 4.02 में उस व्यवहार को बदल दिया है, और अब केवल-पढ़ने के लिए स्ट्रिंग है)।
वर्तमान सी compilers का अनुकूलन और है करने में सक्षम हैं "ions"
और "expressions"
अपने पिछले 5 (समाप्त अशक्त बाइट सहित) बाइट्स को साझा करें।
फाइल में अपनी सी कोड को संकलित करने का प्रयास foo.c
के साथ gcc -O -fverbose-asm -S foo.c
उत्पन्न कोडांतरक फाइल के अंदर और देखो foo.s
द्वारा जीसीसी
अंत में, सी का शब्दार्थ काफी जटिल है ( कॉम्पर्ट और फ्रामा -सी के बारे में अधिक पढ़ें जो इसे पकड़ने की कोशिश कर रहे हैं) और लिखने योग्य लगातार शाब्दिक तार जोड़कर इसे और भी अधिक रहस्यमय बना देगा, जबकि कार्यक्रम कमजोर और कम सुरक्षित (सुरक्षित और कम) परिभाषित व्यवहार), इसलिए यह बहुत संभावना नहीं है कि भविष्य के सी मानकों को लिखने योग्य शाब्दिक तारों को स्वीकार किया जाएगा। शायद इसके विपरीत वे उन्हें const char[]
एरेस बना देंगे जैसा कि उन्हें नैतिक रूप से होना चाहिए।
यह भी ध्यान रखें कि कई कारणों से, निरंतर डेटा की तुलना में, डेवलपर द्वारा समझने के लिए, कोड करने के लिए, कंप्यूटर (कैश सुसंगतता) द्वारा संभाल करने के लिए उत्परिवर्तनीय डेटा कठिन है। इसलिए आपका अधिकांश डेटा (और विशेष रूप से शाब्दिक तार) अपरिवर्तनीय रहना बेहतर होता है । कार्यात्मक प्रोग्रामिंग प्रतिमान के बारे में और पढ़ें ।
आईबीएम / 7094 पर पुराने फोरट्रान77 दिनों में, एक बग भी एक निरंतरता को बदल सकता है: यदि आप CALL FOO(1)
और यदि FOO
इसके तर्क को 2 के संदर्भ में पारित करने के लिए संशोधित किया गया है, तो कार्यान्वयन 1 के 2 में अन्य घटनाओं को बदल सकता है, और यह वास्तव में था शरारती बग, खोजने के लिए काफी मुश्किल है।