কেন সি ++ এবং জাভা উভয়ই "রেফারেন্স" ধারণাটি ব্যবহার করে তবে একই অর্থে নয়?


26

সি ++ এ কোনও ফাংশনের একটি রেফারেন্স আর্গুমেন্ট ফাংশনটিকে রেফারেন্সটিকে অন্য কোনও কিছুতে রেফারেন্স করার অনুমতি দেয়:

int replacement = 23;

void changeNumberReference(int& reference) {
    reference = replacement;
}

int main() {
    int i = 1;
    std::cout << "i=" << i << "\n"; // i = 1;
    changeNumberReference(i);
    std::cout << "i=" << i << "\n"; // i = 23;
}

আনুষাঙ্গিকভাবে, কোনও ফাংশনের স্থির রেফারেন্স আর্গুমেন্ট যদি আমরা রেফারেন্সটি পরিবর্তন করার চেষ্টা করি তবে একটি সংকলন সময় ত্রুটি নিক্ষেপ করবে:

void changeNumberReference(const int& reference) {
    reference = replacement; // compile-time error: assignment of read-only reference 'reference'
}

এখন, জাভা সহ, ডক্স বলছে যে অ-আদিম ধরণের ফাংশন আর্গুমেন্টগুলি রেফারেন্স। অফিসিয়াল ডক্স থেকে উদাহরণ:

public void moveCircle(Circle circle, int deltaX, int deltaY) {
    // code to move origin of circle to x+deltaX, y+deltaY
    circle.setX(circle.getX() + deltaX);
    circle.setY(circle.getY() + deltaY);

    // code to assign a new reference to circle
    circle = new Circle(0, 0);
}

তারপরে চেনাশোনাটি x = y = 0 দিয়ে একটি নতুন সার্কেল অবজেক্টের জন্য একটি রেফারেন্স বরাদ্দ করা হয়েছে তবে এই পুনরায় নিয়োগের কোনও স্থায়ীত্ব নেই, কারণ রেফারেন্সটি মান দ্বারা পাস হয়েছিল এবং পরিবর্তন করতে পারে না।

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

এটি সি ++ পয়েন্টারগুলির সাথে আচরণে আরও মিল। আপনি এটি পয়েন্টযুক্ত বস্তুর মান পরিবর্তন করতে ব্যবহার করতে পারেন, তবে আপনি কোনও ফাংশনে পয়েন্টারের মানটি পরিবর্তন করতে পারবেন না। এছাড়াও, সি ++ পয়েন্টারগুলির মতো (তবে সি ++ রেফারেন্স সহ নয়) জাভাতে আপনি এই জাতীয় যুক্তির মান হিসাবে "নাল" পাস করতে পারেন।

সুতরাং আমার প্রশ্নটি হল: জাভা কেন "রেফারেন্স" ধারণাটি ব্যবহার করে? এটা কি বোঝা যায় যে তারা সি ++ রেফারেন্সের অনুরূপ নয়? অথবা তারা কি সত্যই সি ++ রেফারেন্সের সাথে সাদৃশ্যপূর্ণ এবং আমি কিছু মিস করছি?


10
মনে রাখবেন যে আপনার প্রথম সি ++ উদাহরণে আপনি "অন্য কোনও কিছুর দিকে নির্দেশ করুন" রেফারেন্সটি তৈরি করছেন না। পরিবর্তে, আপনি রেফারেন্স পয়েন্টগুলিতে ভেরিয়েবলের মান পরিবর্তন করছেন। এই ধারণার দিক থেকে বস্তুর বলে যে জাভা রেফারেন্স সহ উল্লেখ করা হয় mutating অনুরূপ,
Xion

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

উত্তর:


48

কেন? কারণ, যদিও সামঞ্জস্যপূর্ণ পরিভাষা পুরো পেশার জন্য সাধারণত ভাল তবে ভাষা ডিজাইনাররা সর্বদা অন্যান্য ভাষা ডিজাইনারদের ভাষার ব্যবহারকে সম্মান করেন না, বিশেষত যদি সেই অন্যান্য ভাষাগুলি প্রতিযোগী হিসাবে বিবেচিত হয়।

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

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

ফলাফলটি হ'ল উভয় ভাষা দুটি ভিন্ন ভিন্ন জিনিসের জন্য একই অস্পষ্ট শব্দটি ব্যবহার করে, উভয়ই একটি নির্দিষ্ট নির্দিষ্ট নাম থেকে লাভ করতে পারে তবে উভয়টিরই শীঘ্রই কোনও স্থানে প্রতিস্থাপনের সম্ভাবনা রয়েছে। প্রাকৃতিক ভাষাও মাঝে মাঝে হতাশ হতে পারে!


7
ধন্যবাদ, "এলিয়াস" (একই মান / উদাহরণের জন্য) এবং জাভা রেফারেন্স হিসাবে "নেস্টিয়ার নিম্ন স্তরের অপারেশন ছাড়াই পয়েন্টার (castালাই, যুক্তকরণ ...)" হিসাবে সি ++ উল্লেখগুলি ভাবা সত্যিই আমার জন্য বিষয়গুলি স্পষ্ট করে।
শিবান ড্রাগন

14
জাভাতে পয়েন্টার নেই এবং এটি নিয়ে গর্বিত, সুতরাং শব্দ হিসাবে "পয়েন্টার" ব্যবহার করা কোনও বিকল্প ছিল না। NullPointerExceptionজেএলএস "পয়েন্টার" শব্দটি ব্যবহার করে বা কী সম্পর্কে ?
টোবিয়াস ব্র্যান্ড্ট 13

7
@ তোবিয়াস ব্র্যান্ড: NullPointerExceptionকোনও পয়েন্টার নয়, তবে এটি একটি ব্যতিক্রম এটি ইঙ্গিত করে যে নীচের স্তরে একটি ন্যূনাল পয়েন্টারটি পাস / অবহেলিত হয়েছিল। ব্যবহার Pointerএকটি ব্যতিক্রম অংশ হিসেবে, কিছু যদি, কদর্য ইমেজ তারা have.The JLS যোগ হয়েছে , পয়েন্টার উল্লেখ কারণ জাভার VM- র প্রধানত একটি ভাষায় লেখা হয়েছিল যে তাদের ব্যবহারসমূহ। ইন্টার্নালগুলি কীভাবে কাজ করে তা বর্ণনা না করে আপনি ভাষা চশমা সঠিকভাবে বর্ণনা করতে পারবেন না
এলিয়াস ভ্যান ওটেজেম

3
@ তোবিয়াস ব্র্যান্ড: জাভা পুরো জায়গা জুড়ে পয়েন্টার ব্যবহার করে; হিপ অবজেক্টগুলি এমন কিছু মাধ্যমে উল্লেখ করা হয় যা সমস্ত ব্যবহারিক উদ্দেশ্যে একটি পয়েন্টার। এটা ঠিক যে জাভা প্রোগ্রামারটিতে পয়েন্টার ধরণের কোনও ক্রিয়াকলাপ প্রকাশ করে না।
জন বোদে

2
আমি জাভা / .NET রেফারেন্সের জন্য "অবজেক্ট আইডি" শব্দটি পছন্দ করি। বিট স্তরে, এই জাতীয় জিনিসগুলি সাধারণত পয়েন্টারের অনুরূপ কিছু হিসাবে প্রয়োগ করা যেতে পারে, তবে কিছুই তাদের হওয়ার প্রয়োজন হয় না। গুরুত্বপূর্ণটি হ'ল একটি অবজেক্ট আইডিতে ফ্রেমওয়ার্ক / ভিএম কোনও অবজেক্ট সনাক্ত করার জন্য যা কিছু তথ্য প্রয়োজন।
সুপারক্যাট

9

একটি উল্লেখ একটি জিনিস যা অন্য জিনিস বোঝায় thing বিভিন্ন ভাষায় "রেফারেন্স" শব্দের আরও নির্দিষ্ট অর্থ বোঝানো হয়েছে, সাধারণত "সমস্ত খারাপ দিক ব্যতীত পয়েন্টারের মতো কিছু"। সি ++ জাভা বা পার্লের মতো একটি নির্দিষ্ট অর্থ নির্ধারণ করে।

সি ++ তে রেফারেন্সগুলি আরও বেশি পছন্দ (যেমন পয়েন্টারের মাধ্যমে প্রয়োগ করা যেতে পারে) like এটি রেফারেন্স বা আর্গুমেন্টের মাধ্যমে পাস করার অনুমতি দেয় ।

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


6

এটি মূলত আলগোলে 68-এ ফিরে যায় এবং আংশিকভাবে সি পয়েন্টারকে যেভাবে সংজ্ঞায়িত করে তার বিরুদ্ধে একটি প্রতিক্রিয়া দেখায়।

অ্যালগল 68 একটি ধারণা উল্লেখ করেছে যা একটি রেফারেন্স বলে। এটি প্যাস্কেলের পয়েন্টার হিসাবে (উদাহরণস্বরূপ) বেশ অনেকটা একই ছিল। এটি এমন একটি ঘর ছিল যা NIL বা কোনও নির্দিষ্ট ধরণের কোনও অন্য কোষের ঠিকানা ধারণ করে। আপনি কোনও রেফারেন্স বরাদ্দ করতে পারেন, সুতরাং রেফারেন্স একবারে একটি ঘরের এবং অন্যকে পুনরায় নিয়োগের পরে আলাদা আলাদা ঘর উল্লেখ করতে পারে। এটি সি বা সি ++ পয়েন্টার গাণিতিকের সাথে সামঞ্জস্যপূর্ণ কোনও কিছু সমর্থন করে না support

কমপক্ষে অ্যালগল defined৮ হিসাবে সংজ্ঞায়িত জিনিসগুলির হিসাবে, তবে উল্লেখগুলি মোটামুটি পরিষ্কার ধারণা ছিল যা অনুশীলনে ব্যবহার করার জন্য মোটামুটি আনাড়ি ছিল। বেশিরভাগ পরিবর্তনশীল সংজ্ঞাগুলি আসলে রেফারেন্সের ছিল, সুতরাং তারা হাত থেকে পুরোপুরি হাতছাড়া না হওয়ার জন্য একটি শর্টহ্যান্ড স্বরলিপিটি সংজ্ঞায়িত করেছিল, তবে তুচ্ছ ব্যবহারের চেয়ে আর কোনও উপায় যে কোনও উপায়ে চমত্কার পেতে পারে।

উদাহরণস্বরূপ, একটি ঘোষণার মতো সংজ্ঞাটি INT j := 7;সত্যই সংকলক দ্বারা একটি ঘোষণার মতো আচরণ করে REF INT j = NEW LOC INT := 7। সুতরাং, আপনি অ্যালগল 68-এ যা ঘোষণা করেছেন তা সাধারণত একটি রেফারেন্স ছিল, যা পরে স্তূপে বরাদ্দকৃত কিছু উল্লেখ করার জন্য আরম্ভ করা হয়েছিল এবং এটি (allyচ্ছিকভাবে) কিছু নির্দিষ্ট মান অন্তর্ভুক্ত করার জন্য আরম্ভ করা হয়েছিল। জাভা থেকে ভিন্ন, তবে তারা foo bar = new foo();"আমাদের পয়েন্টারগুলি পয়েন্টার নয়," সম্পর্কে ক্রমাগতভাবে ফাইবগুলিকে বলার চেষ্টা করার বা তার পরিবর্তে আপনাকে এর জন্য বুদ্ধিমান বাক্য গঠন বজায় রাখার চেষ্টা করেছিল।

পাস্কাল এবং এর বেশিরভাগ বংশধর (প্রত্যক্ষ এবং ... আধ্যাত্মিক উভয়) আলগোল 68 রেফারেন্স ধারণাটিকে "পয়েন্টার" হিসাবে নামকরণ করেছিলেন তবে ধারণাকে মূলত একই রাখে: পয়েন্টারটি এমন একটি চলক ছিল যা হয় রাখা হয়েছিল nil, বা আপনার বরাদ্দকৃত কিছুটির ঠিকানা was স্তূপে (যেমন, অন্তত জেনসেন এবং রাইথ দ্বারা নির্ধারিত হিসাবে, কোনও "অ্যাড্রেস-অফ" অপারেটর ছিল না, সুতরাং পয়েন্টারটির পক্ষে সাধারণভাবে সংজ্ঞায়িত ভেরিয়েবলটি উল্লেখ করার কোনও উপায় ছিল না)। "পয়েন্টার" হওয়া সত্ত্বেও কোনও পয়েন্টার গাণিতিক সমর্থন করা যায় নি।

সি এবং সি ++ এতে কয়েকটি টুইস্ট যুক্ত করেছে। প্রথমত, তারা কি , তাই একটি পয়েন্টার কিছু গাদা বরাদ্দ না শুধুমাত্র পাঠাতে পারেন একটি ঠিকানা অফ অপারেটর আছে, কিন্তু কোন পরিবর্তনশীল, এটা কিভাবে বরাদ্দ হোক না কেন। দ্বিতীয়ত, তারা পয়েন্টারে গাণিতিক সংজ্ঞায়িত করে - এবং অ্যারে সাবস্ক্রিপ্টগুলি মূলত পয়েন্টার পাটিগণিতের জন্য কেবল একটি সংক্ষিপ্ত সংকেত হিসাবে সংজ্ঞায়িত করে, সুতরাং পয়েন্টার পাটিগণিত বেশিরভাগ সি এবং সি ++ তে সর্বব্যাপী (অনিবার্য পাশের) is

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

যদিও এটি কিছুটা আলাদাভাবে বেরিয়ে এসেছিল, সি ++ প্রায় একই সমস্যাটির সাথে আটকে ছিল: "পয়েন্টার" শব্দটি ইতিমধ্যে জানা ছিল এবং বোঝা গিয়েছিল, সুতরাং তারা এই ভিন্ন জিনিসের জন্য তাদের একটি আলাদা শব্দের দরকার ছিল যা তারা অন্য কিছুকে বোঝায়, তবে অন্যথায় বেশ ছিল লোকেরা "পয়েন্টার" বলতে যা বোঝায় তার থেকে কিছুটা আলাদা। সুতরাং, যদিও এটি একটি আলগোল 68 রেফারেন্স থেকেও লক্ষণীয়ভাবে পৃথক, তারা "রেফারেন্স" শব্দটিও আবার ব্যবহার করেছেন।


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

0

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


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