আনবক্সড প্রকারের চেয়ে উচ্চ-পদমর্যাদার বহুমুখীতা


10

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

আমি মনে করি যে আমি এই ধরণেরগুলি কীভাবে চেক করব তা বুঝতে পারি তবে সংকলন করার সময় আমি কী করব তা নিশ্চিত নই। বর্তমানে, আমি অনেকগুলি সি ++ টেম্পলেটগুলির মতো বিশেষত্ব তৈরি করে বহুবর্ষীয় সংজ্ঞা সংকলন করি, যাতে তারা আনবক্সড মানগুলির সাথে কাজ করতে পারে। উদাহরণস্বরূপ, একটি সংজ্ঞা দেওয়া হয়েছে f<T>, যদি প্রোগ্রামটি কেবল f<Int32>এবং কেবলমাত্র f<Char>, কেবল সংকলিত প্রোগ্রামটিতে সেই বিশেষত্বগুলি উপস্থিত হয়। (আমি আপাতত পুরো প্রোগ্রামের সংকলন ধরে নিচ্ছি।)

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

আমার প্রথম চিন্তা একরকম সঙ্কেতাক্ষরে লিখা rank- ছিল এন র্যাঙ্ক 1 পলিমরফিজম, কিন্তু আমি এটা সাধারণভাবে সম্ভব কারণ গঠনমূলক যুক্তিবিজ্ঞান একটি সূত্র অগত্যা একটি prenex স্বাভাবিক ফর্ম নেই বিশ্বাস করি না।


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

@ ফ্রেড 2281: আমি আসলে ভাষার পুরানো সংস্করণে এরকম কিছু করতাম। আমি বর্তমানে অ-অঙ্কের ধরণের জন্য ট্যাগ তৈরি করি না, এবং কোনও জিসি নেই। আমি মনে করি এটি নীল কে এর পদ্ধতির সাথেও সামঞ্জস্যপূর্ণ।
জন

উত্তর:


6

আমি এই সম্পর্কে কিছুটা ভেবেছি মূল ইস্যুটি হ'ল সাধারণভাবে, আমরা জানি না যে বহুবর্ষের ধরণের মান কত বড়। আপনার কাছে এই তথ্য না থাকলে আপনাকে কোনওভাবে এটি পেতে হবে। মনোমরফিজেশনটি পলিমারফিজমকে দূরে সরিয়ে বিশেষ করে আপনার জন্য এই তথ্যটি পেয়েছে। বক্সিং প্রতিটি আকারের জ্ঞাত আকারের উপস্থাপনের মাধ্যমে এই তথ্যটি পেয়েছে।

তৃতীয় বিকল্প হ'ল ধরণের মধ্যে এই তথ্যের উপর নজর রাখা। মূলত, আপনি যা করতে পারেন তা প্রতিটি ডাটা আকারের জন্য আলাদা ধরণের প্রবর্তন করা, এবং তারপরে পলিমারফিক ফাংশনগুলি নির্দিষ্ট আকারের সমস্ত ধরণের উপরে সংজ্ঞায়িত করা যায় can আমি নীচে যেমন একটি সিস্টেম স্কেচ করব।

Kindsκ::=nType constructorsA::=a:κ.A|α|A×B|A+B|AB|refA|Pad(k)|μα:κ.A

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

দয়াকর নিয়মগুলি এই ইংরেজিকে গণিতে রূপান্তরিত করে এবং এর মতো দেখতে হবে: pha pha qu qu qu

α:nΓΓα:nΓ,α:nA:mΓα:n.A:m
ΓA:nΓB:mΓA×B:n+mΓA:nΓB:nΓA+B:n+1
ΓA:mΓB:nΓAB:1ΓA:nΓrefA:1
ΓPad(k):kΓ,α:nA:nΓμα:n.A:n

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

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

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

μα:1.ref(Pad(2)+int×α)

সুতরাং এটি একটি খালি তালিকার মান, বা কোনও সংযুক্ত তালিকার একটি ইন্টের জোড়া এবং একটি পয়েন্টারকে নির্দেশ করে।

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


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

1

এটি একটি "তাত্ত্বিক কম্পিউটার বিজ্ঞান" সমস্যার তুলনায় সংকলনের সমস্যার কাছাকাছি বলে মনে হচ্ছে, তাই আপনি অন্য কোথাও জিজ্ঞাসা করা ভাল।

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

উদাহরণস্বরূপ, আনবক্সযুক্ত আর্গুমেন্টের নিম্ন-স্তরের উপস্থাপনা সাধারণত খুব কম বিকল্পে শ্রেণিবদ্ধ করা যেতে পারে, যেমন পূর্ণসংখ্যা বা অনুরূপ, ভাসমান-পয়েন্ট বা পয়েন্টার। সুতরাং একটি ফাংশনটির জন্য f<T>, সম্ভবত আপনাকে কেবল তিনটি ভিন্ন আনবক্সযুক্ত বাস্তবায়ন উত্পন্ন করতে হবে এবং আপনি পলিমারফিককে সেই 3 টি ফাংশনের একটি টিউপল হিসাবে উপস্থাপন করতে পারেন, তাই টি 32 এর তাত্ক্ষণিকভাবে ইনস্টল করা টিউলের প্রথম উপাদানটি নির্বাচন করছে, ...


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

4
ওএম-এর প্রশ্নের মধ্যে পুরোপুরি বৈধ টিসিএস সমস্যা রয়েছে, যেমন দমাস-হিন্ডি-মিলনার যখন উচ্চতর র‌্যাঙ্কের প্রকারের সাথে প্রসারিত হয় তখন টাইপ অনুক্রমটি কীভাবে করা যায়। সাধারণ র‌্যাঙ্ক -২ পলিমॉर्फিজমে নির্ধারিত টাইপ-ইনফারেন্স থাকে তবে K> 2 টাইপ-ইনফারেন্সের জন্য অনস্বীকার্য ec দামাস-হিন্ডলি-মিলনার নিষেধাজ্ঞাগুলি এটি পরিবর্তন করে কিনা, আমি জানি না। পরিশেষে, আধুনিক সংকলকগণ যা কিছু করেন সেগুলি টিসিএসের অংশ হওয়া উচিত, তবে সাধারণত কারণ হয় না যে সংকলক প্রয়োগকারীরা তাত্ত্বিকদের তুলনায় এগিয়ে।
মার্টিন বার্গার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.