ক্লাস হিসাবে মৌলিক ধরণের (ইন্টের মত) প্রয়োগ করার সাবধানতাগুলি কী কী?


27

যখন নকশা এবং একটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং ভাষা implenting, কিছু বিন্দু এক একটি (যেমন মৌলিক ধরনের বাস্তবায়ন পছন্দের করা আবশ্যক int, float, doubleবা সমতুল) শ্রেণীর বা অন্য কিছু হিসাবে। স্পষ্টতই, সি পরিবারের ভাষাগুলির শ্রেণি হিসাবে তাদের সংজ্ঞা না দেওয়ার প্রবণতা রয়েছে (জাভাতে রয়েছে বিশেষ আদিম প্রকার, সি # এগুলি পরিবর্তনযোগ্য স্ট্রাক্ট হিসাবে প্রয়োগ করে ইত্যাদি)।

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

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

মৌলিক ধরণের প্রায়শই ক্লাস না হওয়ার একমাত্র কারণ কি স্থানিক দক্ষতা (এবং উন্নত স্থানিক অঞ্চল, বিশেষত বড় অ্যারেগুলিতে) ?

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

উপরেরটি কি ভুল, বা অন্য কিছু মিস করছি?


উত্তর:


19

হ্যাঁ, এটি কার্যকরীভাবে নেমে আসে। তবে আপনি এটিকে প্রভাবকে (বা বিভিন্ন অপ্টিমাইজেশানগুলি কতটা ভালভাবে কাজ করেন তা গুরুত্বের সাথে বিবেচনা করে) কম দেখছেন বলে মনে হচ্ছে।

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

দ্বিতীয়ত, পালানোর বিশ্লেষণ দ্রুত রূপক ধূলিকণা নয়। এটি কেবলমাত্র সেই মানগুলিতেই প্রযোজ্য যা ভাল, পালাতে পারে না। স্থানীয় গণনাগুলি (যেমন লুপ কাউন্টার এবং গণনার মধ্যবর্তী ফলাফল হিসাবে) অনুকূলকরণ করা অবশ্যই এটি দুর্দান্ত এবং এটি পরিমাপযোগ্য সুবিধা দেবে। তবে মানগুলির একটি বৃহত সংখ্যাগরিষ্ঠ বস্তু এবং অ্যারে ক্ষেত্রে বাস করে। মঞ্জুরি, এগুলি নিজেরাই বিশ্লেষণ থেকে বেঁচে থাকতে পারে, তবে এগুলি সাধারণত পরিবর্তনযোগ্য রেফারেন্সের ধরণের হয়ে থাকে, এগুলির কোনও অ্যালাইজিং পলায়ন বিশ্লেষণের জন্য একটি গুরুত্বপূর্ণ চ্যালেঞ্জ উপস্থাপন করে, যা এখন প্রমাণ করতে হবে যে al উপনামগুলি (1) পালাতে পারে না , এবং (2) বরাদ্দ অপসারণের উদ্দেশ্যে কোনও পার্থক্য তৈরি করবেন না।

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

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

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

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


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

@ থিডোরোস চ্যাটিজিগিয়ানানাকিস আমি পালানোর বিশ্লেষণে বরাদ্দ কৌশল পরিবর্তনের অন্তর্ভুক্ত করেছি (কারণ সত্যই এটি মনে হয় যে এটি কেবল কখনও ব্যবহার করা হয়) for

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

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

@ ডেলানান এটি সত্য যে আমি বেশিরভাগ ভাষাগুলিতে আগ্রহী যা স্টোরেজ সম্পর্কিত বিবরণ বিমূর্ত করে তোলে তবে দয়া করে আপনার মনে হয় প্রাসঙ্গিক যে কোনও কিছু অন্তর্ভুক্ত করতে দ্বিধা বোধ করবেন না যদিও তা সে ভাষাগুলিতে প্রযোজ্য নয়।
থিওডোরোস চ্যাটজিগিয়ানানাকিস

27

মৌলিক ধরণের প্রায়শই ক্লাস না হওয়ার একমাত্র কারণ কি স্থানিক দক্ষতা (এবং উন্নত স্থানিক অঞ্চল, বিশেষত বড় অ্যারেগুলিতে)?

না।

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

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

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


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

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

3
@ ডেলানান - নিশ্চিত, যদিও স্ট্যাটিকালি টাইপড প্রয়োগের সাথে আমার অভিজ্ঞতা আছে, যেহেতু প্রতিটি নন-সিস্টেম কল আদিম ক্রিয়াকলাপে উত্সাহিত করে, ওভারহেড থাকার কারণে পারফরম্যান্সের উপর নাটকীয় প্রভাব পড়ে - যার ফলে গ্রহণের ক্ষেত্রে আরও বেশি নাটকীয় প্রভাব পড়ে।
তেলস্তিন

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

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

4

কেবলমাত্র খুব কম ক্ষেত্রেই আপনার পূর্ণ অবজেক্ট হতে "মৌলিক ধরণের" দরকার হয় (এখানে, কোনও বস্তু এমন ডেটা যা কোনও প্রেরণ প্রক্রিয়াটির পয়েন্টার ধারণ করে বা একটি প্রকারের সাথে ট্যাগ করা হয় যা প্রেরণ প্রক্রিয়া দ্বারা ব্যবহৃত হতে পারে):

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

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

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

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

  • আপনি স্থির টাইপিং বৈশিষ্ট্য নেই। একটি পরিবর্তনশীল আদিম ধরণের বা অবজেক্ট সহ যে কোনও মান ধরে রাখতে পারে। অতএব শক্তিশালী টাইপিংয়ের গ্যারান্টি হিসাবে সমস্ত আদিম ধরণের সর্বদা বাক্স করা দরকার।

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


একটি intসমস্ত ভাষায় খুব কমই অপরিবর্তনীয়।
স্কট হুইটলক

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

1
@amon: কোন বুদ্ধিমান ভাষা নয়; শুধু জাভা: thedailywtf.com/articles/Disgruntled-Bomb-Java-Edition
ম্যাসন হুইলার

get rid of subtyping and decide that interfaces aren't types but type constraints.... such a type system wouldn't be called object-oriented any longer তবে এটি প্রোটোটাইপ ভিত্তিক প্রোগ্রামিংয়ের মতো মনে হচ্ছে যা অবশ্যই OOP is
মাইকেল

1
@ স্কটউইটলক প্রশ্নটি হ'ল যদি আপনার কাছে ইন্ট বি = এ থাকে তবে আপনি বি তে কিছু করতে পারেন যা একটির মান পরিবর্তন করবে। কিছু ভাষা বাস্তবায়ন হয়েছে যেখানে এটি সম্ভব, তবে এটি সাধারণত প্যাথলজিকাল এবং অবাঞ্ছিত হিসাবে বিবেচিত হয়, অ্যারের জন্য এটি করার মতো নয়।
র্যান্ডম 832

2

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

  • অপরিবর্তনীয়তা
  • চূড়ান্ততা (থেকে প্রাপ্ত হতে অক্ষম)
  • স্ট্যাটিক টাইপিং

পরিস্থিতিতে যেখানে একটি কম্পাইলার প্রয়োজন অন্তর্নিহিত উপস্থাপনা মধ্যে একটি বস্তুর মধ্যে একটি আদিম বাক্স যেমন একটি হিসাবে অপেক্ষাকৃত বিরল, হয় Objectরেফারেন্স এটি নির্দেশ করা হয়।

এটি সংকলকটিতে বিশেষ কেস হ্যান্ডলিংয়ের মোটামুটি যোগ করে, তবে এটি কেবল কিছু পৌরাণিক সুপার-অ্যাডভান্সড কম্পাইলারের মধ্যে সীমাবদ্ধ নয়। এই অপটিমাইজেশনটি প্রধান ভাষাগুলিতে বাস্তব উত্পাদন সংকলকগুলিতে। এমনকি স্কেলা আপনাকে নিজের মান শ্রেণির সংজ্ঞা দিতে দেয় allows


1

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

স্মলটাক সংকলক (উত্স কোড -> ভিএম বাইটোকোডস) এবং ভিএম নাটিভাইজার (বাইটকোডস -> মেশিন কোড) উভয়ই উত্পন্ন কোডটিকে (জেআইটি) অনুকূলিত করে যাতে এই মৌলিক অবজেক্টগুলির সাথে প্রাথমিক ক্রিয়াকলাপের জরিমানা হ্রাস করতে পারে।


1

আমি একটি ওও ল্যাং এবং রানটাইম ডিজাইন করছিলাম (এটি সম্পূর্ণ ভিন্ন কারণের জন্য ব্যর্থ হয়েছে)।

সত্যিকারের ক্লাসের মতো জিনিস তৈরিতে সহজাত ভুল নেই; প্রকৃতপক্ষে এটি জিসিকে নকশা করা সহজ করেছে কারণ এখন 3 (শ্রেণি, অ্যারে এবং আদিম) এর পরিবর্তে কেবল 2 ধরণের হ্যাপ শিরোলেখ (শ্রেণি এবং অ্যারে) রয়েছে [এটি সত্য যে এর পরে আমরা শ্রেণি এবং অ্যারে মার্জ করতে পারি তা প্রাসঙ্গিক নয় ]।

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

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