ফাংশনাল প্রোগ্রামিং এবং বৈজ্ঞানিক কম্পিউটিং


42

যদি এটি একটি অস্পষ্ট প্রশ্ন হয় তবে আমি ক্ষমা চাইছি তবে এখানে যায়:

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

কাজের সাইককম্প ডোমেনে কার্যকরী প্রোগ্রামিংয়ের উপকারিতা এবং বিধিগুলি কী কী?


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

উত্তর:


34

আমি কেবলমাত্র সামান্য কিছু কার্যকরী প্রোগ্রামিং করেছি, সুতরাং লবণের দানা দিয়ে এই উত্তরটি নিন।

পেশাদাররা:

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

কনস:

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

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

আপনার কি ক্রিয়ামূলক প্রোগ্রামিংয়ে আগ্রহী হওয়া উচিত?

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

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


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

4
আমি যুক্ত করতে চাই যে শুধুমাত্র যুক্ত: কন :: মেমরি খরচ । পার্শ্ব প্রতিক্রিয়া দূর করতে প্রচুর অনুলিপি করতে হবে।
ম্যাথু এমমেট

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

@ সেব, মনে হচ্ছে আপনি লিস্প-এর মতো কার্যকরী ভাষার বৈশিষ্ট্য বর্ণনা করছেন যা হাস্কেলের মতো কার্যকরী ভাষাগুলিতে প্রায় প্রয়োগ হয় না।
মার্ক এস।

1
@ ম্যাথিউএমেট দ্বারা মন্তব্যের পক্ষে বড় আপ উচ্চতর পারফরম্যান্স গণনার জন্য অনুলিপি করা খুব ব্যয়বহুল হতে পারে।
চার্লস

10

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

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

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


8

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

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

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

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

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


8

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

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


6
এবং সি ++ হ'ল এই স্থানটিতে ফোর্টরানকে বাস্তবে প্রতিস্থাপনের কেবলমাত্র অর্ধেক পথ। আমরা ফোর্ত্রানে সব সময় নতুন কোড এবং বুট করার মতো প্রচুর উত্তরাধিকার দেখতে পাই!
বিল বার্থ

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

1
আপনার ফোর্টরানকে একবার চেষ্টা করা উচিত ওল্ফগ্যাং, এটি দুর্দান্ত ভাষা, শিখতে / লিখতে সহজ এবং গতি আপনাকে হতাশ করবে না।
Ondřej Čertík

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

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

7

দ্রুত সংক্ষিপ্তসার এটি

  1. সংখ্যার কম্পিউটিং তার বেশিরভাগ স্পিডআপগুলি অর্জন করতে এবং বরাদ্দ হ্রাস করতে পরিবর্তনীয়তা / পার্শ্ব-প্রতিক্রিয়াগুলি ব্যবহার করে (অনেকগুলি কার্যকরী প্রোগ্রামিং স্ট্রাকচারগুলিতে অপরিবর্তনীয় ডেটা থাকে)
  2. অলস মূল্যায়ন সংখ্যাসূচক কোডগুলির সাথে ব্যবহার করা মোটামুটি হতে পারে।
  3. হয় আপনি এমন একটি প্যাকেজ তৈরি করছেন যেখানে কর্মক্ষেত্রের জন্য সর্বনিম্ন স্তরে নেমে আসবে (সি / ফোর্টরান বা এখন জুলিয়া) (এর মধ্যে আপনি এসেমব্লার কোডটি প্রয়োজনীয় হিসাবে সম্পাদনা করতেও পারেন), অথবা আপনি এমন একটি স্ক্রিপ্ট লিখছেন যা এই দ্রুত গ্রন্থাগারগুলি ব্যবহার করে সুতরাং আপনি বেশিরভাগ বিকাশের সময় সম্পর্কে যত্নবান হন (এবং তাই আপনি জুলিয়া / ম্যাটল্যাব / পাইথন / আর চয়ন করেন)। ক্রিয়ামূলক ভাষাগুলি একটি অদ্ভুত মাঝারি মাঠে বসে থাকে যা অন্যান্য শাখায় সহায়ক তবে এখানে তেমন সহায়ক নয়।
  4. ডিফারেনশিয়াল সমীকরণ, অপ্টিমাইজেশান, সংখ্যাসূচক রৈখিক বীজগণিত, ইত্যাদি জন্য সংখ্যাসূচক আলগোরিদিম অধিকাংশই লেখা হয় / উন্নত / অভিসৃতি পরিপ্রেক্ষিতে প্রমাণিত, অর্থাত্ আপনি পড়তা আছে এবং আপনি পেতে চান । এই অ্যালগরিদমগুলি বাস্তবায়নের প্রাকৃতিক স্টাইলটি একটি লুপ। (কিছু মাল্টিগ্রিড অ্যালগরিদমের মতো পুনরাবৃত্তভাবে কিছু অ্যালগরিদম লেখা রয়েছে তবে এগুলি আরও বিরল)x n + 1xnxn+1

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


+1, তবে পয়েন্ট 3-এ একটি সংযোজন: আমি মনে করি যে উচ্চ স্তরের ভাষাগুলিতে ফাংশনাল বৈশিষ্ট্যগুলি বেশ কার্যকর এবং অন্যান্য উত্তরে উল্লিখিত কার্যকরী ভাষার অনেকগুলি সুবিধা (যেমন সহজ সমান্তরালকরণ) এই দৃশ্যে প্রযোজ্য।
Szabolcs

3

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


1

আর একটি কার্যকরী ভাষা এবং একটি পরিসংখ্যান (এবং এখন মেশিন লার্নিং) ভাষা এবং প্রকৃতপক্ষে পরিসংখ্যানের জন্য 1 নম্বর ভাষা। যদিও এটি কোনও এইচপিসির ভাষা নয়: এটি পদার্থবিজ্ঞানের সিমুলেশন ইত্যাদির মতো traditionalতিহ্যবাহী "সংখ্যা ক্রাঞ্চিং" এর জন্য ব্যবহৃত হয় না তবে মেশিন লার্নিংয়ের বিশাল পরিসংখ্যান সিমুলেশনগুলির (এমসিএমসি) জন্য এটি বিশাল ক্লাস্টারে (যেমন এমপিআইয়ের মাধ্যমে) চালানো যেতে পারে।

গণিতও একটি কার্যকরী ভাষা তবে এটির মূল ডোমেনটি সংখ্যামূলক কম্পিউটিংয়ের চেয়ে প্রতীকী কম্পিউটিং।

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

আমি স্কালাকে একটি কার্যকরী ভাষা বলব না বরং একটি অবজেক্ট-ফাংশনাল হাইব্রিড বলব। আপনি স্কালায় অনেকগুলি কার্যকরী ধারণা ব্যবহার করতে পারেন। স্পার্কের কারণে ক্লাউড কম্পিউটিংয়ের জন্য স্কালা গুরুত্বপূর্ণ ( https://spark.apache.org/ )।

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


1

পেশাদাররা প্রতিটি কার্যকরী ভাষায় নির্মিত "সরঞ্জামগুলি": ডেটা ফিল্টার করা এত সহজ, ডেটাগুলির মাধ্যমে পুনরাবৃত্তি করা এত সহজ এবং আপনার সমস্যার সুস্পষ্ট এবং সংক্ষিপ্ত সমাধান নিয়ে আসা এত সহজ is

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

আপনি যদি ক্রিয়ামূলক-বৈজ্ঞানিক-ভাষাগুলিতে আগ্রহী হন তবে আমি একটি https://ac1235.github.io তৈরি করেছি


1

এখানে কেন কার্যকরী প্রোগ্রামিং আমার আর্গুমেন্ট করতে পারেন , এবং উচিত গণনীয় বিজ্ঞানের জন্য ব্যবহার করা যেতে পারে। সুবিধাগুলি সুবিধামত, এবং কনসগুলি দ্রুত চলে যাচ্ছে। আমার মনে একটাই কন:

কন : সি / সি ++ / ফোর্টরানে ভাষা সহায়তার অভাব

কমপক্ষে সি ++ এ, এই কোণটি বিলুপ্ত হচ্ছে - যেহেতু সি ++ 14/17 কার্যকরী প্রোগ্রামিং সমর্থন করার জন্য শক্তিশালী সুবিধা যুক্ত করেছে। আপনার নিজের জন্য কিছু লাইব্রেরি / সমর্থন কোড লেখার প্রয়োজন হতে পারে তবে ভাষাটি আপনার বন্ধু হবে। উদাহরণস্বরূপ, এখানে একটি (সতর্কতা: প্লাগ) লাইব্রেরি রয়েছে যা সি ++: https://github.com/jzrake/ndarray-v2 এ অবিচ্ছেদ্য বহু-মাত্রিক অ্যারে করে ।

এছাড়াও, এখানে C ++ এ ফাংশনাল প্রোগ্রামিং সম্পর্কিত একটি ভাল বইয়ের লিঙ্ক রয়েছে , যদিও এটি বিজ্ঞানের প্রয়োগগুলিতে মনোনিবেশ করা হয়নি।

আমি যা বিশ্বাস করি তার সংক্ষিপ্ত বিবরণটি এখানে প্রো-এর রয়েছে:

পেশাদাররা :

  • শুদ্ধি
  • ক্ষমতা অভিব্যক্তি
  • কর্মক্ষমতা

নিরিখে শুদ্ধি , কার্যকরী প্রোগ্রাম প্রকাশ্যে হয় ভালভাবে যাকে জাহির : তারা সঠিকভাবে আপনার পদার্থবিদ্যা ভেরিয়েবল ন্যূনতম রাষ্ট্র, এবং ফাংশন নির্ধারণ করতে বাধ্য যে অগ্রগতি ঐ সময়ের মধ্যে রাষ্ট্র এগিয়ে:

int main()
{
    auto state = initial_condition();

    while (should_continue(state))
    {
        state = advance(state);
        side_effects(state);
    }
    return 0;
}

আংশিক ডিফারেনশিয়াল সমীকরণ (বা ওডিই) সমাধান করা কার্যকরী প্রোগ্রামিংয়ের জন্য উপযুক্ত; আপনি কেবলমাত্র advanceপরবর্তী সমাধানটি উত্পন্ন করার জন্য একটি খাঁটি ফাংশন ( ) প্রয়োগ করছেন ।

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

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

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

নীচে একটি নমুনা advanceফাংশন রয়েছে, ndarray-v2প্যাকেজটি ব্যবহার করে একটি সীমাবদ্ধ-ভলিউম কোড থেকে অভিযোজিত । to_sharedঅপারেটরদের দ্রষ্টব্য - এই সেই মূল্যায়নের পয়েন্টগুলি যা আমি আগেই নির্দেশ করেছিলাম।

auto advance(const solution_state_t& state)
{
    auto dt = determine_time_step_size(state);
    auto du = state.u
    | divide(state.vertices | volume_from_vertices)
    | nd::map(recover_primitive)
    | extrapolate_boundary_on_axis(0)
    | nd::to_shared()
    | compute_intercell_flux(0)
    | nd::to_shared()
    | nd::difference_on_axis(0)
    | nd::multiply(-dt * mara::make_area(1.0));

    return solution_state_t {
        state.time + dt,
        state.iteration + 1,
        state.vertices,
        state.u + du | nd::to_shared() };
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.