জাভাকের মতো সংকলকগুলি কী স্বয়ংক্রিয়ভাবে খাঁটি ফাংশন সনাক্ত করে সেগুলি সমান্তরাল করে?


12

খাঁটি ফাংশনগুলি পেরেল্লাইজাইজিংয়ের সুবিধার্থে পরিচিত। এটি কার্যকরী প্রোগ্রামিং সম্পর্কে কী যা এটিকে সহজাতভাবে সমান্তরাল বাস্তবায়নের সাথে খাপ খাইয়ে নিয়ে যায়?

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


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

@ রায়ানরিচ, জাভা-এর মতো অপরিষ্কার কার্যকরী ভাষায় ফাংশনাল প্রোগ্রামিং ব্যবহারের কোনও কার্যকারিতা রয়েছে কি? ফাংশনাল প্রোগ্রামিং এর লাভগুলি কি পরিমিতরূপের মতো নিখুঁতভাবে কার্যকরী হয়?
নবীন

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

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

6
জাভাক হচ্ছে জাভা সংকলক, যা জাভা সোর্স কোড নেয় এবং জাভা বাইট কোড শ্রেণীর ফাইল তৈরি করে। এটি কী করতে পারে (এবং ধারণা করা হয়) এটি বেশ সীমাবদ্ধ। বাইট কোড বর্গ ফাইলের মধ্যে সমান্তরালতা প্রবর্তনের জন্য এটির স্বাধীনতা বা প্রয়োজনীয় অন্তর্নিহিত প্রক্রিয়া নেই।
এরিক tদ

উত্তর:


33

জ্যাভাকের মতো সংকলকগুলি যখন কোনও পদ্ধতি খাঁটি ফাংশন হয় তা সনাক্ত করার জন্য যথেষ্ট স্মার্ট।

এটি "স্মার্ট যথেষ্ট" কোনও প্রশ্ন নয়। একে বলা হয় পিউরিটি অ্যানালাইসিস এবং সাধারণ ক্ষেত্রে এটি অসম্ভব: এটি হ্যালটিং সমস্যা সমাধানের সমতুল্য।

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

এমনকি এটি যেখানে কাজ করে সেখানেও অ্যালগরিদমগুলি জটিল এবং ব্যয়বহুল।

সুতরাং, এটি সমস্যা # 1: এটি কেবলমাত্র বিশেষ ক্ষেত্রে কাজ করে

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

এটি কেবল তখনই কার্যকর হয়, যখন আপনার পুরো প্রোগ্রাম বিশ্লেষণ থাকে, যখন পুরো প্রোগ্রামটি একই ভাষায় লেখা হয় এবং সমস্ত একবারে একবারে সংকলিত হয়। আপনি কোনও লাইব্রেরি ব্যবহার করতে পারবেন না।

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

আপনি এখনই অনুমান হিসাবে, গণনা কতক্ষণ সময় নেবে তা নির্ধারণ করা সাধারণ ক্ষেত্রে অসম্ভব অসম্ভব (এটি সুনির্দিষ্ট সময় লাগবে কি না, আমরা বুঝতে পারি না যে কতটা সময় ব্যয় করতে হবে) এমনকি কঠিন এবং ব্যয়বহুলও বিশেষ ক্ষেত্রে।

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

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

দ্রষ্টব্য, উদাহরণস্বরূপ, হটস্পট সি 2 জেআইটি সংকলক আসলে কিছু অটো-ভেক্টরাইজেশন সম্পাদন করে , যা স্বয়ং-সমান্তরালনেরও একটি রূপ।


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

@Deduplicator ওয়েল, আপনার সংজ্ঞা উপর নির্ভর করে definition, একটি অসম ব্যবহার definitionএর purityসম্ভবত অস্পষ্ট
বিড়াল

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

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

1
@ জার্গডাব্লু মিটাগ আমি জানি যে ওপি জাভাক সম্পর্কে জিজ্ঞাসা করে, তবে আমি বাজি ধরব যে তারা ধরে নিচ্ছে যে জাভ্যাকটি অপ্টিমাইজেশনের জন্য দায়ী। এবং তারা দৃly়রূপে জানেন যে সি 2 আছে। আমি বলছি না, আপনার উত্তরটি খারাপ। এটি ঠিক যে জাভাককে কোনও অপ্টিমাইজেশন করা (ব্যবহারের মতো তুচ্ছ ঘটনা বাদ দেওয়া StringBuilder) বুদ্ধিমানের কাজ নয়, তাই আমি এটিকে বরখাস্ত করব এবং সহজভাবে ধরে নেব, ওপি জাভাক লিখেছে তবে এর অর্থ হটস্পট। আপনার সমস্যা # 2 জাভ্যাকের কোনও কিছুরই অনুকূলকরণের বিরুদ্ধে একটি দুর্দান্ত কারণ ।
মার্টিনাস

5

Upvated উত্তর একটি জিনিস নোট করতে ব্যর্থ। থ্রেডগুলির মধ্যে সুসংগত যোগাযোগ অত্যন্ত ব্যয়বহুল। যদি ফাংশনটি প্রতি সেকেন্ডে অনেক মিলিয়ন কল হারে সম্পাদন করতে সক্ষম হয়, তবে এটি আপনাকে ঠিক তেমনটি না রেখে সমান্তরালে আরও বেশি আঘাত দেয় ts

পারমাণবিক ভেরিয়েবলের সাথে ব্যস্ত লুপগুলি ব্যবহার করে সিঙ্ক্রোনাস আন্ত-থ্রেড যোগাযোগের দ্রুততম রূপটি দুর্ভাগ্যক্রমে শক্তি-অদক্ষ। আপনার যদি শক্তি সঞ্চয় করতে শর্ত ভেরিয়েবলগুলি ব্যবহার করতে হয় তবে আপনার আন্তঃ-থ্রেড যোগাযোগের কার্যকারিতা ক্ষতিগ্রস্থ হয়।

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

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

সুতরাং, আপনার প্রশ্নের উত্তর হ'ল না , সংকলকগুলি বিশেষত জাভা বিশ্বে খাঁটি ফাংশনগুলিকে স্বয়ংক্রিয়ভাবে সমান্তরাল করার পক্ষে যথেষ্ট "স্মার্ট" নয়। এগুলি স্বয়ংক্রিয়ভাবে সমান্তরাল না করে স্মার্ট!


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

@ নাট: হাস্যকরভাবে খুব শক্ত। এটির জন্য 100 মিমি সেকেন্ডের রানটাইম স্কেলে খাঁটি ফাংশন সনাক্তকরণের প্রয়োজন হবে এবং সংকলকটি তার পুনরাবৃত্তিতে ধ্রুবকগুলি না থাকা লুপের রানটাইম সম্পর্কে কোনও ধারণা পাওয়ার আশা করে (এবং যে কেসগুলি আপনি চান না) নির্বোধ।
জোশুয়া

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

1
@ জোশুয়া: জেআইটি সংকলকের পক্ষে সত্যই অনেক সহজ। জেআইটি সংকলকটি এটিও নির্ধারণ করতে পারে যে কোনও ফাংশন খাঁটি নাও হতে পারে, তবে এখনও পর্যন্ত কোনও কলই অশুচি আচরণের ডাক দেয়নি।
gnasher729

আমি @ জোশুয়ার সাথে একমত আমার কর্মক্ষেত্রে একটি হার্ড-টু-প্যারালিয়ালাইজ আলগোরিদম রয়েছে। আমি কিছু সরল আনুমানিককরণ (এবং এইভাবে অ্যালগরিদম পরিবর্তন করে) করেও ম্যানুয়ালি এটিকে সমান্তরাল করার চেষ্টা করেছি এবং প্রতিবার খারাপভাবে ব্যর্থ হয়েছি। এমনকি কোনও প্রোগ্রামের সাথে বলা হয় যে কোনও কিছুর সমান্তরাল করা সম্ভব হয় কিনা তা বলা খুব শক্ত, যদিও এটি আসলে সমান্তরাল করার চেয়ে অনেক সহজ হবে। মনে রাখবেন আমরা ট্যুরিং-সম্পূর্ণ প্রোগ্রামিং ভাষা নিয়ে কথা বলছি।
জুলহিস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.