Icallyতিহাসিকভাবে (সম্ভবত এর অংশগুলি পুনরায় লিখে) এটি বিপরীত ছিল। ১৯ 1970০- এর দশকের গোড়ার দিকে প্রথম কম্পিউটারে (সম্ভবত পিডিপি -11 ) প্রোটোটাইপিকাল এম্ব্রোনিক সি চালানো হয়েছিল (সম্ভবত বিসিপিএল ) কোনও এমএমইউ ছিল না এবং কোনও মেমরি সুরক্ষা ছিল না (যা বেশিরভাগ পুরানো আইবিএম / 360 মেইনফ্রেমে বিদ্যমান ছিল )। সুতরাং মেমোরির প্রতিটি বাইট (যারা আক্ষরিক স্ট্রিং বা মেশিন কোড পরিচালনা করে) সহ একটি ভুল প্রোগ্রাম দ্বারা ওভাররাইট করা যেতে পারে (কল্পনা করুন যে কোনও প্রোগ্রামকে প্রিন্টফ (3) ফর্ম্যাট স্ট্রিংয়ে কিছুতে পরিবর্তন %
করা /
হয়েছে )। সুতরাং, আক্ষরিক স্ট্রিং এবং ধ্রুবকগুলি লিখনযোগ্য ছিল।
1975 সালে কিশোর বয়সে, আমি 1960 এর দশকের পুরানো কম্পিউটারগুলিতে মেমরির সুরক্ষা ছাড়াই প্যারিসের প্যালিস দে লা ডকুভার্ট যাদুঘরে কোড করেছিলাম: আইবিএম / 1620 এর একটি মূল মেমরি ছিল - যা আপনি কীবোর্ডের মাধ্যমে সূচনা করতে পেরেছিলেন, তাই আপনাকে কয়েক ডজন টাইপ করতে হয়েছিল খোঁচা টেপে প্রাথমিক প্রোগ্রামটি পড়তে অঙ্কগুলি; সিএবি / 500 এর চৌম্বকীয় ড্রামের স্মৃতি ছিল; আপনি ড্রাম কাছাকাছি যান্ত্রিক সুইচ মাধ্যমে কিছু ট্র্যাক লিখতে অক্ষম করতে পারে।
পরে, কম্পিউটারগুলি কিছু স্মৃতি সুরক্ষা সহ মেমরি ম্যানেজমেন্ট ইউনিটের (এমএমইউ) কিছু ফর্ম পেয়েছিল। এমন একটি ডিভাইস ছিল যা সিপিইউকে কিছু ধরণের মেমরির ওভাররাইট করতে নিষেধ করে। সুতরাং কিছু মেমরি বিভাগ, উল্লেখযোগ্যভাবে কোড সেগমেন্ট (ওরফে .text
বিভাগ) কেবল পঠনযোগ্য হয়ে উঠেছে (অপারেটিং সিস্টেম বাদে যা সেগুলি ডিস্ক থেকে লোড করে)। সংকলক এবং লিঙ্কারের পক্ষে সেই কোড বিভাগে আক্ষরিক স্ট্রিংগুলি রাখা স্বাভাবিক ছিল এবং আক্ষরিক স্ট্রিংগুলি কেবল পঠনযোগ্য হয়ে ওঠে। যখন আপনার প্রোগ্রাম সেগুলি ওভাররাইট করার চেষ্টা করেছিল, তখন এটি খারাপ ছিল, একটি সংজ্ঞায়িত আচরণ । এবং ভার্চুয়াল মেমরিতে কেবল পঠনযোগ্য কোড বিভাগ থাকা একটি উল্লেখযোগ্য সুবিধা দেয়: একই প্রোগ্রামে চলমান বেশ কয়েকটি প্রক্রিয়া একই র্যাম ভাগ করে ( শারীরিক স্মৃতি)পৃষ্ঠাগুলি) সেই কোড বিভাগের MAP_SHARED
জন্য ( লিনাক্সে এমএম্যাপের জন্য পতাকা দেখুন (2) )।
আজ, সস্তা মাইক্রোকন্ট্রোলারদের কিছু পঠনযোগ্য মেমরি রয়েছে (যেমন তাদের ফ্ল্যাশ বা রম) এবং তাদের কোডটি (এবং আক্ষরিক স্ট্রিং এবং অন্যান্য ধ্রুবকগুলি) সেখানে রাখে। এবং প্রকৃত মাইক্রোপ্রসেসরগুলি (আপনার ট্যাবলেট, ল্যাপটপ বা ডেস্কটপের মতো) একটি অত্যাধুনিক মেমরি পরিচালনা ইউনিট এবং ভার্চুয়াল মেমরি এবং পেজিংয়ের জন্য ক্যাশে যন্ত্রপাতি ব্যবহৃত হয় । সুতরাং এক্সিকিউটেবল প্রোগ্রামের কোড বিভাগটি (যেমন ELF ) মেমরিকে কেবল পঠনযোগ্য, ভাগযোগ্য এবং এক্সিকিউটেবল সেগমেন্ট হিসাবে ম্যাপ করা হয় (এমএমএপ (2 দ্বারা ) অথবা লিনাক্সে এক্সিকিউট (2) ; বিটিডাব্লু আপনি এলডি-কে নির্দেশ দিতে পারেনলিখিতযোগ্য কোড বিভাগটি পেতে যদি আপনি সত্যিই চান)। এটি লিখতে বা অপব্যবহার করা সাধারণত একটি সেগমেন্টেশন দোষ ।
সুতরাং সি স্ট্যান্ডার্ডটি ব্যারোক: বৈধভাবে (কেবল historicalতিহাসিক কারণে), আক্ষরিক স্ট্রিংগুলি const char[]
অ্যারে নয় , তবে কেবল char[]
অ্যারেগুলি ওভাররাইট করা নিষিদ্ধ।
বিটিডাব্লু, কয়েকটি বর্তমান ভাষা স্ট্রিং লিটারেলগুলিকে ওভাররাইট করার অনুমতি দেয় (এমনকি ওকামল যা historতিহাসিকভাবে - এবং খারাপভাবে লিখিত আক্ষরিক স্ট্রিং ছিল সেই আচরণটি সম্প্রতি 4.02-এ পরিবর্তিত হয়েছে, এবং এখন কেবল পঠনযোগ্য স্ট্রিং রয়েছে)।
বর্তমান সি কম্পাইলার অপটিমাইজ এবং করতে পারবেন "ions"
এবং "expressions"
তাদের শেষ 5 (সসীম নাল বাইট সহ) বাইট শেয়ার করুন।
আপনার সি সি কোডটি ফাইলের foo.c
সাথে সংকলন করার চেষ্টা করুন gcc -O -fverbose-asm -S foo.c
এবং জিসিসিfoo.s
দ্বারা উত্পন্ন এসেমব্লার ফাইলটি ভিতরে দেখুন
শেষ অবধি , সি এর শব্দার্থবিজ্ঞান যথেষ্ট জটিল ( কমপ্যাকার্ট এবং ফ্রেমা -সি সম্পর্কে এটি আরও পড়ুন যা এটি ক্যাপচার করার চেষ্টা করছে) এবং লিখনযোগ্য ধ্রুবক আক্ষরিক স্ট্রিংগুলি প্রোগ্রামকে দুর্বল এবং আরও কম সুরক্ষিত করার সময় এটি আরও তীব্রতর করে তুলবে (এবং কম সহ) সংজ্ঞায়িত আচরণ), সুতরাং এটি ভবিষ্যতের সি স্ট্যান্ডার্ডগুলি লিখনযোগ্য আক্ষরিক স্ট্রিং গ্রহণ করবে এমনটি খুব কমই। সম্ভবত বিপরীতে const char[]
তারা নৈতিকভাবে হওয়া উচিত তাদের অ্যারে করে দেবে।
আরও লক্ষ করুন যে অনেক কারণে, পরিবর্তনীয় ডেটা স্থির তথ্যের চেয়ে কম্পিউটারের (ক্যাশে সুসংহত), কোড করার জন্য, বিকাশকারী দ্বারা বুঝতে সক্ষম হ্যান্ডেল করা আরও শক্ত। সুতরাং আপনার বেশিরভাগ ডেটা (এবং উল্লেখযোগ্য আক্ষরিক স্ট্রিংগুলি) অপরিবর্তনীয় থাকা ভাল । ফাংশনাল প্রোগ্রামিং দৃষ্টান্ত সম্পর্কে আরও পড়ুন ।
আইবিএম / 7094-এর পুরানো ফোর্টরান 7777 দিনগুলিতে একটি বাগ এমনকি একটি ধ্রুবক পরিবর্তন করতে পারে: আপনি CALL FOO(1)
এবং যদি FOO
এটির ২ টি রেফারেন্স অনুসারে তার যুক্তিটি সংশোধন করতে পারেন তবে বাস্তবায়নটি অন্যান্য সংঘটনগুলি 1 থেকে 2 এ পরিবর্তিত হতে পারে এবং এটি সত্যিই ছিল দুষ্টু বাগ, খুঁজে পাওয়া বেশ শক্ত।