ক্রিয়ামূলক প্রোগ্রামিং ভাষাগুলিতে কি সময় সংশোধন করার আরও বেশি সুযোগ রয়েছে?


10

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

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

এটা সত্যি?

উত্তর:


16

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

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

অতিরিক্তভাবে, যে কোনও কিছু কম্পিউটারের প্রয়োজন হয় না তা প্রোগ্রামের বাইরে সম্পূর্ণরূপে অনুকূলিত করা যায়।


1
+1: পার্শ্ব-প্রতিক্রিয়া মুক্ত প্রোগ্রামিং অত্যন্ত অনুকূল, খুব অনুকূল।
এস। লট

@ ম্যাথেপিক: আসলে সমান্তরালকরণ (হাস্কেলের মধ্যে) সংকলন-সময় এবং রান-টাইম উভয় ক্ষেত্রেই ঘটে। আপনার নির্দিষ্ট করা থ্রেডের উপর নির্ভর করে সংকলন-সময় সিদ্ধান্ত নিয়েছে যে এটি একটি শারড (থ্রেড বীজ) তৈরি করার উপযুক্ত কিনা এবং রান-টাইম প্রক্রিয়াগুলি শারডগুলি যতটা পারে। আপনি যদি কেবল একটি একক থ্রেড নির্দিষ্ট করেন তবে শার্পগুলি তৈরি হয়ে যায় তবে সেগুলি একের পর এক প্রক্রিয়া করা হয়।
ম্যাথিউ এম।

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

@ ম্যাথিউউ ভাল পয়েন্ট
বিকল্প

1
@ ম্যাসে এমনকি আইও মনাদ খাঁটি। এটি ঠিক যে আইও মোনাড "চালানোর" ফলাফল নয়।
বিকল্প

7

যে নীতিগতভাবে তাদের অপরিহার্য অংশগুলির তুলনায় কার্যকরী ভাষার জন্য আরও বেশি সংকলন সময় অনুকূলকরণের সম্ভাবনা রয়েছে সম্ভবত সম্ভবত এটি সত্য is

আরও মজার বিষয় হ'ল, যদি সেগুলি প্রকৃতপক্ষে বর্তমান সংকলকগুলিতে প্রয়োগ করা হয় এবং এই অপ্টিমাইজেশানগুলি বাস্তবে কতটা প্রাসঙ্গিক হয় (অর্থাত্ কোনও প্রাক্কলনের পরিবেশে আইডিয়োম্যাটিক 'রিয়েল লাইফ (টিএম)' কোডের একটি চূড়ান্ত কার্য সম্পাদন), প্রিরিওর পূর্বাভাসযোগ্য সংকলক সেটিংস সহ।

উদাহরণস্বরূপ কুখ্যাত কম্পিউটার ল্যাঙ্গুয়েজ বেঞ্চমার্কস গেমের জন্য হাস্কেল জমা দেওয়া (এটি খারাপ যেমন হতে পারে - তবে এই মুহূর্তে এটির মতো নয় - উল্লেখযোগ্যভাবে আরও ভাল কিছু এখানে রয়েছে) এই ধারণাটি দেয় যে একটি উল্লেখযোগ্য পরিমাণ সময় ব্যয় করা হয়েছে ম্যানুয়াল অপ্টিমাইজেশান, যা "সম্ভাব্য সংকলক অপটিমাইজেশন কারণে কারণে" দাবির মুখোমুখি হয়েছিলinsert some property about FP languages here এটি দেখতে আপাতদৃষ্টিতে প্রাসঙ্গিক বাস্তবতার তুলনায় (বর্তমানে কমপক্ষে) তাত্ত্বিক সম্ভাবনার চেয়ে বেশি দেখা যায়।

আমি এই বিষয়টিতে ভুল প্রমাণিত হলেও খুশি হব।


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

2
আমি নিশ্চিত যে হাস্কেলের হাত ঘূর্ণিত অপ্টিমাইজেশনের জন্য বৈধ কারণ রয়েছে তবে তারা "সোজাসাপ্টা" ক্রিয়াকলাপের কারণে প্রয়োজনীয় ধারণাটি দেয় যে কোডটি অনুকূলকরণের বৃহত্তর সুযোগগুলি (বর্তমানে) কেবলমাত্র তত্ত্বের ক্ষেত্রে প্রাসঙ্গিক।
আলেকজান্ডার বাটিস্টি

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

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

>> এটি খারাপ হতে পারে << - আপনি জানেন যে এটি খারাপ কিনা? এমনকি এটি "খারাপ" পরামর্শ দেওয়ার অর্থ কী? দয়া করে নির্দিষ্ট করুন
igouy

2

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

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

এখন, দুটি সতর্কতা রয়েছে:

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

তবে সাধারণ প্রশ্নের উত্তর দেওয়ার জন্য, হ্যাঁ, একটি কার্যকরী দৃষ্টান্ত সংকলকটিকে অপরিহার্য করে তুলতে প্রচুর স্বাধীনতা দেয় যে এটি একটি অত্যাবশ্যক সেটিংসে নেই।


হাস্কেলের সমস্ত কিছুই কার্যকরী, কেবলমাত্র mainএটিই নিজেকে রাষ্ট্র ব্যবহার করে এমন একটি রাষ্ট্রের পরিবর্তে একটি রাষ্ট্র রূপান্তর ফাংশন।
বিকল্প

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

@ জিমওয়াইজ রেফারেন্সিয়াল স্বচ্ছতা খুব বড় পার্থক্য।
বিকল্প

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

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