কখন এবং কেন পয়েন্টারগুলি ঝুঁকিপূর্ণ হিসাবে দেখা শুরু হয়েছিল?


18

দেখে মনে হচ্ছে প্রোগ্রামিং ভাষার ক্ষেত্রে পয়েন্টার ব্যবহার সম্পর্কে চিন্তাভাবনার ক্রমশ পরিবর্তন হয়েছে যে এটি সাধারণত গৃহীত হয় যে পয়েন্টারগুলিকে ঝুঁকিপূর্ণ বলে বিবেচনা করা হয় (যদি তারা একেবারে "দুষ্ট" বা অনুরূপ ক্রমবর্ধমান না হয়)।

চিন্তাভাবনা পরিবর্তনের জন্য historicalতিহাসিক ঘটনাগুলি কী ছিল? সুনির্দিষ্ট, চূড়ান্ত ঘটনা, গবেষণা বা অন্যান্য উন্নয়ন ছিল?

উদাহরণস্বরূপ, সি থেকে সি ++ জাভাতে রূপান্তরিত করার একটি পৃষ্ঠপোষক দৃষ্টিভঙ্গি পরিপূরক হিসাবে প্রবণতা দেখাবে এবং তারপরে পুরোপুরি পয়েন্টারগুলিকে রেফারেন্স সহ প্রতিস্থাপন করবে। তবে ঘটনাগুলির আসল শৃঙ্খলা সম্ভবত এটির চেয়ে অনেক বেশি সূক্ষ্ম ও জটিল ছিল এবং প্রায় এতটা ক্রমযুক্ত নয়। যে মূল বৈশিষ্ট্যগুলি সেগুলি মূলধারার ভাষাগুলিতে পরিণত করেছে সেগুলি সম্ভবত অন্য কোথাও উদ্ভূত হয়েছিল।

দ্রষ্টব্য: আমি পয়েন্টার বনাম রেফারেন্স বনাম অন্য কিছুের আসল গুণাবলী সম্পর্কে জিজ্ঞাসা করছি না। আমার দৃষ্টি নিবদ্ধ করা এই আপাত স্থানান্তর জন্য যুক্তি উপর।


1
এটি লিবারেল আর্টস শিক্ষার পতনের কারণে হয়েছিল। সমস্ত সিপিইউতে অন্তর্ভুক্ত কম্পিউটিং প্রযুক্তির অন্যতম মৌলিক ধারণা, অপ্রত্যক্ষ রেফারেন্স লোকেরা আর বুঝতে পারে না।

10
পয়েন্টার হয় ঝুঁকিপূর্ণ। কেন আপনি ভাবেন যে চিন্তাভাবনার পরিবর্তন হয়েছে? ভাষার বৈশিষ্ট্য এবং হার্ডওয়্যারে উন্নতি হয়েছে যা পয়েন্টার ছাড়াই সফটওয়্যার লেখার অনুমতি দেয় যদিও কিছু পারফরম্যান্স পেনাল্টি ছাড়াই নয়।
মনিকার ক্ষতি করা বন্ধ করুন

4
@ ডেভইনকাজ যতদূর আমি জানি যে সুনির্দিষ্ট বিকাশ ছিল পয়েন্টারগুলির আবিষ্কার।
মনিকা ক্ষতিগ্রস্ত করা বন্ধ করুন

5
@ নোকমপ্রেডে: আপনি যা লিখেছেন তা সত্য বা প্রমাণ নয়, ন্যায়বিচার just ১৯ 1970০ সালে এখানে অনেক কম প্রোগ্রামার ছিল, জনসংখ্যার "পরোক্ষ রেফারেন্স" এর চেয়ে আরও ভাল বা আরও খারাপ হওয়ার কোনও প্রমাণ আপনার কাছে নেই।
হোয়াজনমাম

3
পয়েন্টারগুলি সর্বদা প্রথম থেকেই ঝুঁকিপূর্ণ বলে বিবেচিত হয়েছে। এগুলিকে সমাবেশ থেকে উচ্চ স্তরের ভাষাগুলিতে সরানো কেবল একটি আপস ছিল।
ফ্রাঙ্ক হিলিমান

উত্তর:


21

যুক্তি ছিল পয়েন্টারের বিকল্পগুলির বিকাশ।

হুডের অধীনে, কোনও পয়েন্টার / রেফারেন্স / ইত্যাদি মেমরি ঠিকানা (ওরফে পয়েন্টার) সহ একটি পূর্ণসংখ্যা হিসাবে প্রয়োগ করা হচ্ছে। যখন সি বেরিয়ে আসেন এই কার্যকারিতা পয়েন্টার হিসাবে উন্মুক্ত হয়েছে। এর অর্থ হ'ল অন্তর্নিহিত হার্ডওয়্যার মেমোরিটিকে সম্বোধন করতে যা কিছু করতে পারে তা পয়েন্টার দিয়ে করা যেতে পারে।

এটি সর্বদা "বিপজ্জনক" ছিল তবে বিপদ আপেক্ষিক। আপনি যখন 1000 লাইন প্রোগ্রাম তৈরি করছেন বা যখন আপনার আইবিএম-গ্রেড সফ্টওয়্যার মানের পদ্ধতি রয়েছে তখন এই বিপদটি সহজেই সমাধান করা যেতে পারে। তবে, সমস্ত সফ্টওয়্যার সেভাবে বিকাশ করা হয়নি। এর মতো, সহজ কাঠামোর জন্য একটি আকাঙ্ক্ষা প্রকাশ পেয়েছিল।

আপনি যদি এটির বিষয়ে চিন্তা করেন তবে একটি int&এবং int* constসত্যই একই স্তরের সুরক্ষা থাকে তবে অন্যটির তুলনায় একটিতে খুব সুন্দর সিনট্যাক্স থাকে। int&এটি আরও দক্ষ হতে পারে কারণ এটি কোনও রেজিস্টারে সঞ্চিত কোনও ইন্ট্রাস্ট্রেশনকে উল্লেখ করতে পারে (অ্যানাক্রোনিজম: এটি অতীতে সত্য ছিল, তবে আধুনিক সংকলকগণ অপ্টিমাইজ করার ক্ষেত্রে এতটাই ভাল যে আপনি কোনও রেজিস্টারে একটি পূর্ণসংখ্যার পয়েন্টার রাখতে পারবেন, যতক্ষণ না আপনি কখনই এমন কোনও বৈশিষ্ট্য ব্যবহার করবেন না যার জন্য সত্যিকারের ঠিকানা প্রয়োজন হবে, যেমন ++)

আমরা সরাতে হিসাবে জাভা , আমরা ভাষায় যা কিছু নিরাপত্তার নিশ্চয়তা প্রদান সরাতে। সি এবং সি ++ কিছুই সরবরাহ করেনি। জাভা গ্যারান্টি দেয় যে কেবল আইনী ক্রিয়াকলাপ কার্যকর করা হবে। এটি করার জন্য, জাভা পয়েন্টারগুলি পুরোপুরি সরিয়ে ফেলে। তারা যা খুঁজে পেয়েছিল তা হল রিয়েল কোডে পয়েন্টার / রেফারেন্স অপারেশনগুলির সিংহভাগই এমন জিনিস ছিল যা উল্লেখগুলির পক্ষে যথেষ্ট ছিল। কেবলমাত্র কয়েকটি মুখ্য ক্ষেত্রে (যেমন একটি অ্যারের মাধ্যমে দ্রুত পুনরাবৃত্তি) পয়েন্টারগুলির সত্যই প্রয়োজন ছিল। এই ক্ষেত্রে, জাভা সেগুলি এড়াতে একটি রানটাইম হিট নেয়।

পদক্ষেপ একঘেয়ে হয়নি। সি # পুনঃপ্রবর্তিত পয়েন্টার যদিও খুব সীমিত আকারে। এগুলিকে " অনিরাপদ " হিসাবে চিহ্নিত করা হয়েছে যার অর্থ তারা অবিশ্বস্ত কোড ব্যবহার করতে পারবেন না। তারা কী কী নির্দেশ করতে পারে এবং কী করতে পারে না সে সম্পর্কে তাদের সুস্পষ্ট বিধিও রয়েছে (উদাহরণস্বরূপ, এটি অ্যারের শেষের দিকে পয়েন্টার বাড়ানো কেবল অবৈধ )। যাইহোক, তারা দেখতে পেলেন যে মুষ্টিমেয় কয়েকটি ক্ষেত্রে পয়েন্টারগুলির উচ্চ পারফরম্যান্সের প্রয়োজন ছিল, তাই তারা এগুলিকে আবার পিছনে ফেলেছে।

আগ্রহের বিষয় হ'ল কার্যকরী ভাষাও হবে, যার এ জাতীয় ধারণা নেই, তবে এটি একটি খুব আলাদা আলোচনা।


3
আমি নিশ্চিত নই যে জাভাটির কোনও পয়েন্টার নেই এটি বলা ঠিক। পয়েন্টারটি কী এবং কোনটি নয় এটি নিয়ে আমি দীর্ঘ বিতর্কে যেতে চাই না তবে জেএলএস বলে যে "একটি রেফারেন্সের মান একটি পয়েন্টার"। এখানে কেবল কোনও সরাসরি অ্যাক্সেস বা পয়েন্টারগুলির পরিবর্তনের অনুমতি নেই। এটি কেবল সুরক্ষার জন্য নয়, লোকেরা যে কোনও মুহুর্তে যে কোনও মুহুর্তে রয়েছে সেদিকে নজর রাখার ব্যবসায়ের বাইরে রাখাই জিসির পক্ষে সহায়ক।
জিমি জেমস

6
@ জিমি জেমস ট্রু এই উত্তরের উদ্দেশ্যে, পয়েন্টার এবং নয়-পয়েন্টারের মধ্যে বিভাজক রেখাটি ছিল যে এটি পয়েন্টার গাণিতিক ক্রিয়াকলাপগুলিকে সমর্থন করে কিনা, যা সাধারণত রেফারেন্স দ্বারা সমর্থিত নয়।
কর্ট অ্যামোন - মোনিকা

8
@ জিমি জেমস আমি কর্টের এই দৃ with় প্রতিবেদনের সাথে একমত হই যে একটি পয়েন্টার এমন কিছু যা আপনি গাণিতিক অপারেশন করতে পারেন, যদিও কোনও উল্লেখ নেই। আসল প্রক্রিয়া যা জাভা জাতীয় ভাষায় একটি রেফারেন্স প্রয়োগ করে
রবার্ট হার্ভে

3
সাধারণভাবে, সি এবং সি ++ সুনির্দিষ্টভাবে "অপরিজ্ঞাত আচরণগুলি" নির্দিষ্টকরণের মাধ্যমে এই বিপজ্জনক ক্লাবে স্বেচ্ছায় সদস্যতা গ্রহণ করেছিল।
রবিং

2
উপায় দ্বারা, সেখানে হয় সিপিইউ, যা পয়েন্টার এবং সংখ্যার মধ্যে পার্থক্য। যেমন আইবিএম AS / 400-এ আসল 48-বিট সিআইএসসি সিপিইউ তা করে। এবং সত্য, সেখানে একটা বিমূর্ততা স্তর ওএস, যার মানে না শুধুমাত্র CPU- র সংখ্যা এবং পয়েন্টার মধ্যে পার্থক্য এবং পয়েন্টার উপর গাণিতিক নিষেধ নেই নীচে, কিন্তু ওএস নিজেই এমনকি পয়েন্টার কথা কে না জানে এ সব এবং কেউই ভাষায় না । মজার বিষয় হচ্ছে এটি আসল AS / 400 এক সিস্টেম তৈরি করে, যেখানে সি-তে একটি উচ্চ-স্তরের স্ক্রিপ্টিং ভাষা থেকে পুনরায় লেখার কোড এটিকে প্রস্থের ধীর গতিতে কমিয়ে দেয়
Jörg ডব্লু মিটাগ

10

জটিল প্রোগ্রামগুলির জন্য (যেমন পুনরাবৃত্ত বা পরিবর্তনশীল-আকারের ডেটা স্ট্রাকচার) জন্য কিছু ধরণের ইন্ডিয়ারেশন প্রয়োজন। যাইহোক, পয়েন্টারগুলির মাধ্যমে এই নির্দেশনাটি প্রয়োগ করা প্রয়োজন হবে না।

বেশিরভাগ উচ্চ-স্তরের প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি (যেমন সমাবেশ নয়) মোটামুটি স্মৃতি-সুরক্ষিত এবং সীমাহীন পয়েন্টার অ্যাক্সেসকে অস্বীকার করে। সি পরিবারটি এখানে বিজোড় one

সি বি এর বাইরে বিবর্তিত হয়েছিল যা কাঁচা সমাবেশে খুব পাতলা বিমূর্ততা ছিল। বি এর একক প্রকার ছিল: শব্দটি। শব্দটি একটি পূর্ণসংখ্যা বা পয়েন্টার হিসাবে ব্যবহার করা যেতে পারে। যখন পুরো স্মৃতিটি একক সংলগ্ন অ্যারে হিসাবে দেখা হয় তখন এই দুটি সমতুল্য। সি এটি বরং নমনীয় পন্থা ধরে রেখেছে এবং সহজাতভাবে অনিরাপদ পয়েন্টার গাণিতিকটিকে সমর্থন করে চলেছে। সি এর পুরো টাইপ সিস্টেমটি বেশি চিন্তাভাবনা করে। মেমরি অ্যাক্সেসের এই নমনীয়তাটি সি এর প্রাথমিক উদ্দেশ্যে খুব উপযুক্ত করে তুলেছিল: ইউনিক্স অপারেটিং সিস্টেমের প্রোটোটাইপিং। অবশ্যই ইউনিক্স এবং সি বেশ জনপ্রিয় হয়ে উঠল, যাতে মেমরির ক্ষেত্রে এই নিম্ন-স্তরের পদ্ধতির প্রয়োজন হয় না এমন অ্যাপ্লিকেশনগুলিতেও সি ব্যবহার করা হয়।

আমরা যদি সি এর আগে আগত প্রোগ্রামিং ভাষাগুলির দিকে নজর রাখি (যেমন, ফোর্টরান, আলগোল উপভাষা সহ Pas উল্লেখযোগ্যভাবে, নাল পয়েন্টার ধারণাটি 1965 সালে আলগোল ডাব্লু এর জন্য উদ্ভাবিত হয়েছিল। তবে সেগুলির কোনও ভাষাই সি-জাতীয়, দক্ষ নিম্ন-বিমূর্ত সিস্টেমের ভাষা হতে চেষ্টা করেনি: ফোর্টরানকে বৈজ্ঞানিক কম্পিউটিংয়ের জন্য বোঝানো হয়েছিল, আলগোল বেশ কিছু উন্নত ধারণা তৈরি করেছিল, লিস্প ছিল শিল্প-গ্রেড ভাষার চেয়ে গবেষণার প্রকল্পের আরও বেশি, এবং কোবোল ব্যবসায়িক অ্যাপ্লিকেশনগুলিতে মনোনিবেশিত হয়েছিল।

আবর্জনা সংগ্রহ 50 এর দশকের শেষের দিক থেকে, অর্থাৎ সি এর আগে (70 এর দশকের শুরু থেকেই) বিদ্যমান ছিল। জিসির সঠিকভাবে কাজ করার জন্য মেমরির সুরক্ষা প্রয়োজন। সি এর আগে ও পরে ভাষাগুলি জিসিকে একটি সাধারণ বৈশিষ্ট্য হিসাবে ব্যবহার করেছিল। অবশ্যই এটি একটি ভাষাকে আরও জটিল এবং সম্ভবত ধীর করে তোলে যা মেনফ্রেমের সময় বিশেষত লক্ষণীয় ছিল। জিসি ভাষাগুলি গবেষণা-ভিত্তিক হয়ে থাকে (উদাঃ লিস্প, সিমুলা, এমএল) এবং / অথবা শক্তিশালী ওয়ার্কস্টেশনগুলির প্রয়োজন (যেমন ছোট্ট টাল্ক))

ছোট এবং আরও শক্তিশালী কম্পিউটারগুলির সাথে সাধারণ এবং জিসি ভাষাগুলিতে বিশেষত কম্পিউটার কম্পিউটিং আরও জনপ্রিয় হয়ে উঠেছে। অ-রিয়েল টাইম অ্যাপ্লিকেশনগুলির জন্য (এবং কখনও কখনও এমনকি তখনও) জিসি এখন পছন্দের পদ্ধতির। তবে জিসি অ্যালগরিদমগুলি তীব্র গবেষণার বিষয়ও ছিল। বিকল্প হিসাবে, জিসি ছাড়াই আরও ভাল মেমরির সুরক্ষা আরও বিকাশ করা হয়েছে, বিশেষত গত তিন দশকে: উল্লেখযোগ্য উদ্ভাবনগুলি হ'ল সি ++ এবং মরিচের আজীবন সিস্টেম / ধার ধারক হিসাবে স্মার্ট পয়েন্টার।

জাভা একটি মেমোরি-নিরাপদ প্রোগ্রামিং ভাষা হয়ে উদ্ভাবন করেনি: এটি মূলত জিসিড, মেমরি নিরাপদ স্মলটালক ভাষার শব্দার্থ গ্রহণ করেছে এবং তাদের সি ++ এর বাক্য গঠন এবং স্থির টাইপিংয়ের সাথে সংযুক্ত করে। এরপরে এটি আরও ভাল, সরল সি / সি ++ হিসাবে বিপণন করা হয়েছিল। তবে এটি কেবলমাত্র পৃষ্ঠের সি ++ বংশধর। জাভাটির পয়েন্টারগুলির অভাব সি ++ ডেটা মডেলকে প্রত্যাখ্যান করার চেয়ে স্মার্টটাক অবজেক্ট মডেলকে অনেক বেশি owedণী।

সুতরাং জাভা, রুবি, এবং সি # এর মতো "আধুনিক" ভাষাগুলিকে সি এর মতো কাঁচা পয়েন্টারগুলির সমস্যা কাটিয়ে ওঠা হিসাবে ব্যাখ্যা করা উচিত নয়, তবে এটি সি সহ অনেকগুলি traditionsতিহ্যগুলি থেকে আঁকানো হিসাবে দেখা উচিত, তবে ছোট্ট টাল্ক, সিমুলা, র মতো সুরক্ষিত ভাষা থেকেও নেওয়া উচিত, বা লিস্প।


4

আমার অভিজ্ঞতায় পয়েন্টারগুলি সবসময়ই অনেকের কাছে চ্যালেঞ্জিং ধারণা হয়ে দাঁড়িয়েছে। ১৯ 1970০ সালে, আমি যে বিশ্ববিদ্যালয়ে যোগ দিচ্ছিলাম তার একটি বুড়ো বি 500 ছিল এবং আমরা আমাদের প্রোগ্রামিং প্রকল্পের জন্য বর্ধিত আলগোল ব্যবহার করি। হার্ডওয়্যার আর্কিটেকচারটি ডেটা শব্দের উপরের অংশে বর্ণনাকারী এবং কিছু কোডের উপর ভিত্তি করে ছিল। এগুলি স্পষ্টভাবে ডিজাইন করা হয়েছিল যাতে অ্যারেগুলি শেষের দিকে হাঁটার অনুমতি ছাড়াই পয়েন্টার ব্যবহার করতে দেয়।

নাম বনাম মান রেফারেন্স এবং B5500 অ্যারে কীভাবে কাজ করেছিল তা সম্পর্কে আমরা উত্সাহিত শ্রেণিকক্ষ আলোচনা করেছি। আমাদের মধ্যে কয়েকজন তাৎক্ষণিকভাবে ব্যাখ্যা পেয়ে গেল। অন্যরা তা করেনি।

পরে, এটি কিছুটা ধাক্কা খেয়েছিল যে হার্ডওয়্যার আমাকে পলাতক পয়েন্টারগুলি থেকে রক্ষা করেনি - বিশেষত সমাবেশের ভাষায়। স্নাতক শেষ হওয়ার পরে আমার প্রথম কাজটিতে, আমি একটি অপারেটিং সিস্টেমে সমস্যাগুলি সমাধান করতে সহায়তা করেছি। প্রায়শই আমাদের কাছে কেবলমাত্র ডকুমেন্টেশন ছিল মুদ্রিত ক্র্যাশ ডাম্প। আমি মেমরি ডাম্পগুলিতে পলাতক পয়েন্টারগুলির উত্স সন্ধানের জন্য একটি নকশ তৈরি করেছি, তাই প্রত্যেকেই "অসম্ভব" ডাম্পগুলি বের করার জন্য আমাকে দিয়েছিলেন। অন্য যে কোন ধরণের ত্রুটির চেয়ে পয়েন্টার ত্রুটির কারণে আমাদের আরও বেশি সমস্যা হয়েছিল।

আমি যাদের সাথে কাজ করেছি তাদের মধ্যে অনেকে ফোরট্রান লিখতে শুরু করে, তারপর সি তে চলে আসে, সি লিখেছিল যা অনেকটা ফররানের মতো ছিল, এবং পয়েন্টারগুলি এড়ায়। কারণ তারা কখনই পয়েন্টার এবং রেফারেন্সগুলিকে অভ্যন্তরীণ করে না, জাভা সমস্যা তৈরি করে। প্রায়শই, ফরট্রান প্রোগ্রামারদের জন্য বুঝতে চ্যালেঞ্জিং যে কীভাবে অবজেক্ট অ্যাসাইনমেন্টটি কাজ করে।

আধুনিক ভাষাগুলি আমাদের টাইপস এবং অন্যান্য ত্রুটি থেকে সুরক্ষিত রেখে "হুডের নীচে" পয়েন্টারগুলির প্রয়োজনীয় জিনিসগুলি করা আরও সহজ করে তুলেছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.