আপনি মূলত যা সম্পর্কে জিজ্ঞাসা করছেন তা হ'ল গণনা শক্তি এবং সাধারণত কোন ভাষা (বা গণনার সিস্টেম) এর এক্সপ্রেরিভ শক্তি (বা কেবল এক্সপ্রেশনালিটি ) বলা হয় between
গণনা শক্তি
কম্পিউটেশানাল শক্তির কি সমস্যার ধরণের ভাষা গনা করতে বোঝায়। কম্পিউটেশনাল পাওয়ারের সর্বাধিক সুপরিচিত ক্লাসটি যা ইউনিভার্সাল ট্যুরিং মেশিনের সমান । গণনার অন্যান্য প্রচুর সিস্টেম রয়েছে যেমন র্যান্ডম অ্যাকসেস মেশিনস , λ-ক্যালকুলাস , এসকে কম্বিনেটর ক্যালকুলাস , rec-পুনরাবৃত্ত ফাংশন , WHILE
প্রোগ্রাম এবং আরও অনেকগুলি। এবং দেখা যাচ্ছে যে এগুলি সমস্ত একে অপরকে অনুকরণ করতে পারে, যার অর্থ তাদের সকলের একটি একই গণনার শক্তি রয়েছে।
এটি চার্চ-টিউরিং থিসিসকে উত্থান দেয় ( Al- ক্যালকুলাস এবং অ্যালান টুরিং যিনি ইউনিভার্সাল ট্যুরিং মেশিন তৈরি করেছিলেন এলোনজো চার্চের নামানুসারে )। চার্চ-টিউরিং-থিসিস দুটি দিকের সংযোগের একটি অনুমান যা:
- সাধারণ গণনা করতে সক্ষম সমস্ত কম্পিউটিং সিস্টেম সমান শক্তিশালী, এবং
- একটি অ্যালগরিদম অনুসরণকারী একজন মানুষ একটি টুরিং মেশিন (এবং এইভাবে অন্য কোনও সিস্টেমের) কে সঠিকভাবে গণনা করতে পারে।
দ্বিতীয়টি কম্পিউটার সায়েন্সের চেয়ে মনের দর্শনের ক্ষেত্রে বেশি গুরুত্বপূর্ণ।
তবে চার্চ-টিউরিং-থিসিস দুটি জিনিস বলে না , এটি আপনার প্রশ্নের সাথে খুব প্রাসঙ্গিক:
- বিভিন্ন সিমুলেশন কতটা দক্ষ এবং
- সমস্যার এনকোডিংটি কতটা সুবিধাজনক ।
(1) এর একটি সাধারণ উদাহরণ: একটি এলোমেলো অ্যাক্সেস মেশিনে, অ্যারের অনুলিপি করতে অ্যারের দৈর্ঘ্যের সমানুপাতিক সময় লাগে। একটি ট্যুরিং মেশিনে, তবে এটি অ্যারের দৈর্ঘ্যের বর্গক্ষেত্রের সমানুপাতিক সময় নেয় , কারণ টুরিং মেশিনটির এলোমেলো মেমরির অ্যাক্সেস নেই, এটি কেবল একবারে টেপের একটি ঘরে যেতে পারে can অতএব, এটা জুড়ে সরানো প্রয়োজন এন অ্যারের উপাদানের এন তাদের কপি করতে বার। সুতরাং, গণনার বিভিন্ন মডেলের বিভিন্ন কর্মক্ষমতা বৈশিষ্ট্য থাকতে পারে, এমনকি অ্যাসেম্পটোটিক ক্ষেত্রেও, যেখানে আমরা প্রয়োগের বিবরণ থেকে দূরে রেখে চেষ্টা করি।
(২) প্রচুর পরিমাণে উদাহরণ: λ-ক্যালকুলাস এবং পাইথন উভয়ই টুরিং-সম্পূর্ণ। তবে আপনি কি বরং পাইথন বা calc-ক্যালকুলাসে একটি প্রোগ্রাম লিখবেন?
আমি এখনও অবধি প্রায় তৃতীয় কুঁচকে গিয়েছি: এই সমস্ত মূল সিস্টেমগুলি কম্পিউটার বিজ্ঞানীদের দ্বারা নয়, লজিস্ট, দার্শনিক বা গণিতবিদদের দ্বারা ডিজাইন করা হয়েছিল ... কেবল কম্পিউটার এবং এইভাবে কম্পিউটার বিজ্ঞানের অস্তিত্ব ছিল না বলে। 1930 এরা সকলে ফিরে যান, এমনকি আগে কনরাড Zuse 'খুব গুলি প্রথম পরীক্ষায় (যা প্রোগ্রামযোগ্য এবং / অথবা টুরিং-সম্পূর্ণ যাহাই হউক না কেন ছিল না)। তারা কেবল "প্রাকৃতিক সংখ্যায় গণনাযোগ্য ফাংশন" সম্পর্কে কথা বলে।
এখন দেখা যাচ্ছে যে, প্রাকৃতিক সংখ্যায় ফাংশন হিসাবে আপনি অনেকগুলি প্রকাশ করতে পারেন - সর্বোপরি, আমাদের আধুনিক কম্পিউটারগুলি তার চেয়ে অনেক কম পরিমাণে পেয়ে যায় (মূলত 0 এবং 1 সংখ্যাটিতে 3-4 ফাংশন, এবং এটিই ), তবে, উদাহরণস্বরূপ, কোন অপারেটিং সিস্টেম গণনা করে?
আই / ও এর এই ধারণাটি, পার্শ্ব-প্রতিক্রিয়াগুলি, পরিবেশের সাথে যোগাযোগ করে, "প্রাকৃতিক সংখ্যার উপরে ক্রিয়াকলাপ" ধারণাটি ধারণ করে না। এবং এখনও, এটা গুরুত্বপূর্ণ ধরনের, কারণ, যেমন সাইমন Peyton জোনস একবার এটা করা "সমস্ত একটি বিশুদ্ধ ফাংশনটি কোন পার্শ্ব প্রতিক্রিয়া নেই, গরম আপনার CPU- র করা হয় সঙ্গে" , যা একটি শ্রোতা সদস্য বললেন "আসলে, যে হয় একটি পার্শ্ব প্রভাবও!
এডউইন ব্র্যাডি , ইদ্রিসের ডিজাইনার , (কেবলমাত্র অর্ধেক) কৌতুকপূর্ণভাবে ব্যবহার করেছেন (তিনি আবিষ্কার করেছেন কিনা তা আমি জানি না) "পার্থক্যটি প্রকাশ করার জন্য" টেট্রিস-সম্পূর্ণ "শব্দটি প্রাকৃতিক সংখ্যায় কোনও গণনীয় ফাংশন গণনা করতে পারে" এবং " পরিবেশের সাথে যোগাযোগ করে এমন তুচ্ছ প্রোগ্রাম লিখতে ব্যবহার করুন "। আরও বিদ্রূপজনকভাবে, তিনি ইদ্রিসে স্পেস ইনভাইডার্স ক্লোনটি প্রয়োগ করে এটি প্রকাশ করেছেন , তবে তিনি বলেছিলেন যে তিনি আত্মবিশ্বাসী যে টেট্রিস স্পেস আক্রমণকারীদের হ্রাস পেয়েছে।
আরেকটি বিষয় উল্লেখ করতে হবে যে কেবলমাত্র টিউরিং-সমতুল্যতা আসলেই "দরকারী" প্রোগ্রামগুলি লেখার বিষয়ে যথেষ্ট কথা নয় , এটি OTOH এমনকি প্রয়োজনীয়ও হতে পারে না । উদাহরণস্বরূপ এসকিউএল কেবল এএনএসআই এসকিউএল: 1999 এর সাথে টুরিং-সমতুল্য হয়ে উঠেছে , তবে এটি এর আগেও কার্যকর ছিল। আসলে, কিছু যুক্তিযুক্ত হতে পারে যে এটিকে টুরিং-সমতুল্য করে তোলার ফলে এর কার্যত কোনও যোগ হয়নি। অনেকগুলি ডোমেন-নির্দিষ্ট ভাষা রয়েছে যা টিউরিং-সমতুল্য নয়। ডেটা বর্ণনা ভাষার ভাষা সাধারণত হয় না (এবং হওয়া উচিত নয়)। মোট ভাষা স্পষ্টতই টিউরিং-সমতুল্য হতে পারে না, তবুও আপনি সেগুলিতে ইভেন্ট লুপ, ওয়েব সার্ভার বা অপারেটিং সিস্টেম লিখতে পারেন। এমন ভাষাও রয়েছে যা ট্যুরিং-সমতুল্য তবে যেখানে এটি আসলে একটি ভুল হিসাবে বিবেচিত হয়।
সুতরাং, সর্বোপরি, টিউরিং-সমতুল্যতা মারাত্মক আকর্ষণীয় নয়, যদি না আপনি স্ট্যাটিকালি প্রোগ্রামগুলি বিশ্লেষণ করতে চান।
expressiveness
ধরে নিই যে আমাদের গণনা সিস্টেমটি আমাদের সমস্যাটি সমাধান করার জন্য গণনার দিক থেকে যথেষ্ট শক্তিশালী, আমাদের পরবর্তী কাজটি কী, সেই সমস্যাটির সমাধান করার জন্য আমাদের অ্যালগরিদমটি সেই সিস্টেমের জন্য কিছু প্রথাগত স্বরলিপি হিসাবে প্রকাশ করা। অন্য কথায়: আমাদের কিছু কম্পিউটার ভাষায় একটি প্রোগ্রাম লিখতে হবে। সেখানেই ভাব প্রকাশের ধারণাটি আসে।
এটি আমাদের নির্দিষ্ট প্রোগ্রামিং ভাষায় আমাদের প্রোগ্রামটি লেখার জন্য কতটা "সহজ" বা "উপভোগযোগ্য" তা মূলত বোঝায়। যেমন আপনি দেখতে পাচ্ছেন, ধারণাটি বেশ অস্পষ্ট, বিষয়গত এবং প্রযুক্তিগতের চেয়ে মনস্তাত্ত্বিক।
তবে আরও সুনির্দিষ্ট সংজ্ঞা দেওয়ার চেষ্টা রয়েছে। সর্বাধিক বিখ্যাত একটি (এবং আমি জানি সবচেয়ে কঠোর এক) ম্যাথিয়াস ফেলেলিসেন তাঁর গবেষণাপত্রে প্রোগ্রামিং ল্যাঙ্গুয়েজগুলির এক্সপ্রেসিভ পাওয়ার সম্পর্কে (প্রথম দুটি পৃষ্ঠায় একটি মৃদু পরিচয় রয়েছে, বাকী কাগজটি আরও মিষ্টিজাতীয়)।
যখন অন্য ভাষা থেকে ভাষা থেকে একটি প্রোগ্রাম অনুবাদ, তবে আপনি যে পরিবর্তনগুলি করতে হবে কিছু স্থানীয়ভাবে অন্তর্ভুক্ত করা হয় (যেমন যেমন বাঁক হিসাবে: প্রধান স্বজ্ঞা এই হল FOR
মধ্যে লুপ WHILE
loops বা শর্তাধীন মধ্যে লুপ GOTO
গুলি), এবং কিছু বিশ্বব্যাপী কোন পরিবর্তন প্রয়োজন প্রোগ্রাম গঠন।
আপনি যখন কেবলমাত্র স্থানীয় রূপান্তর দ্বারা কোনও ভাষার একটি বৈশিষ্ট্যকে একটি ভিন্ন ভাষার আলাদা বৈশিষ্ট্যের সাথে প্রতিস্থাপন করতে পারেন, তখন বলা হয় যে এই বৈশিষ্ট্যগুলি এক্সপ্রেশনাল শক্তিতে কোনও প্রভাব ফেলবে না। একে সিনট্যাকটিক সুগার বলে ।
অন্যদিকে, যদি প্রোগ্রামটির বৈশ্বিক কাঠামোর পরিবর্তনের প্রয়োজন হয়, তবে আপনি যে ভাষায় অনুবাদ করছেন সেটি বৈশিষ্ট্যটি প্রকাশ করতে অক্ষম বলে। এবং আপনি যে ভাষা থেকে অনুবাদ করছেন তা আরও প্রকাশিত বলে মনে হয় (এই বৈশিষ্ট্যের প্রতি সম্মান সহ)।
দ্রষ্টব্য যে এটি প্রকাশের একটি উদ্দেশ্যমূলক পরিমাপযোগ্য সংজ্ঞা দেয়। এও লক্ষ করুন যে ধারণাটি বৈশিষ্ট্যের উপর নির্ভরশীল এবং এটি তুলনামূলক। সুতরাং, যদি ভাষা A এর প্রতিটি প্রোগ্রামকে কেবলমাত্র স্থানীয় পরিবর্তনের সাথে ভাষা B তে অনুবাদ করা যেতে পারে , এবং ভাষা B তে কমপক্ষে একটি প্রোগ্রাম রয়েছে যা কেবল স্থানীয় পরিবর্তনের সাথে A তে অনুবাদ করা যায় না , তবে ভাষা B ভাষার চেয়ে কঠোরভাবে আরও প্রকাশিত হয় একজন। তবে, সম্ভবত সম্ভাব্য পরিস্থিতিটি হ'ল উভয় ভাষায় প্রচুর প্রোগ্রামগুলি সামনে এবং পিছনে অনুবাদ করা যায় তবে উভয় ভাষায় কিছু প্রোগ্রাম রয়েছে যা অন্যটিতে অনুবাদ করা যায় না। এর অর্থ হ'ল উভয় ভাষাই অন্যের তুলনায় কঠোরভাবে ভাবপূর্ণ নয়, তাদের কেবল বিভিন্ন বৈশিষ্ট্য রয়েছে যা বিভিন্ন প্রোগ্রামকে বিভিন্ন উপায়ে প্রকাশ করতে দেয়।
এটি "আরও অভিব্যক্তিপূর্ণ" হওয়ার অর্থ কী, তার একটি আনুষ্ঠানিক সংজ্ঞা দেয় তবে এটি এখনও ঘটনার পিছনে মনোবিজ্ঞানীয় ধারণাগুলি ধারণ করে না। উদাহরণস্বরূপ, সিন্ট্যাকটিক চিনি, এই মডেল অনুসারে কোনও ভাষার অভিব্যক্তিগত শক্তি বৃদ্ধি করে না, কারণ এটি কেবল স্থানীয় পরিবর্তনগুলি ব্যবহার করে অনুবাদ করা যেতে পারে। যাইহোক, আমরা অভিজ্ঞতা থেকে জানি যে থাকার FOR
, WHILE
এবং IF
পাওয়া যায়, এমনকি যদি তারা শর্তসাপেক্ষ মাত্র অন্বিত চিনি আছে GOTO
আমাদের অভিপ্রায় প্রকাশ তোলে আরও সহজ ।
আসল বিষয়টি হ'ল বিভিন্ন ভাষায় বিভিন্ন বৈশিষ্ট্য রয়েছে যা সমস্যা সম্পর্কে চিন্তাভাবনার বিভিন্ন উপায়কে সহজ বা শক্ততর করে তোলে। এবং কিছু লোক তাদের অভিপ্রায়টি সহজভাবে প্রকাশ করার একটি উপায় এবং অন্যদের অন্যরকম উপায় খুঁজে পেতে পারে।
স্ট্যাকওভারফ্লোতে আমি রুবি ট্যাগে একটি উদাহরণ পেয়েছি: অনেক ব্যবহারকারী যারা রুবি ট্যাগ অনুসরণ করেন তারা দাবি করেন যে লুপগুলি পুনরাবৃত্তির চেয়ে বোঝা সহজ এবং পুনরাবৃত্তি কেবল উন্নত ফাংশনাল প্রোগ্রামারদের জন্য এবং লুপগুলি নতুনদের জন্য আরও স্বজ্ঞাত, তবে আমি একাধিক ক্ষেত্রে দেখেছি সম্পূর্ণ নতুন যারা সম্পূর্ণ স্বতঃস্ফূর্তভাবে কোড লিখেছেন:
def rock_paper_scissors
get_user_input
determine_outcome
print_winner
rock_paper_scissors # start from the top
end
যা সাধারণত বেশিরভাগ লোককে মন্তব্য করে যে "এটি কাজ করে না" এবং "তারা এটি ভুল করছে" এবং "সঠিক উপায়" হ'ল:
def rock_paper_scissors
loop do
get_user_input
determine_outcome
print_winner
end
end
সুতরাং, স্পষ্টতই, কিছু লোক রয়েছে যাদের জন্য লেল পুনরাবৃত্তি লুপ কনস্ট্রাক্টসের চেয়ে "লুপিং" ধারণাটি প্রকাশ করার আরও প্রাকৃতিক উপায়।
সারাংশ
দুটি ভাষা টিউরিং-সমতুল্য হ'ল একটি এবং ঠিক একটি জিনিস বলে যে: তারা ট্যুরিং মেশিনের মতো প্রাকৃতিক সংখ্যায় একই ফাংশনের সংকলন করতে পারে। এটাই.
তারা কত দ্রুত এই ফাংশনগুলি গণনা করে সে সম্পর্কে কিছুই বলে না। এই ফাংশনগুলি প্রকাশের স্বাচ্ছন্দ্য সম্পর্কে এটি কিছু বলে না। এবং এটি প্রাকৃতিক সংখ্যায় কম্পিউটিং ফাংশন ছাড়াও আর কী করতে পারে সে সম্পর্কে কিছুই বলে না (যেমন সি লাইব্রেরিতে লিঙ্ক করা, ব্যবহারকারীর কাছ থেকে ইনপুট পড়া, স্ক্রিনে আউটপুট লিখুন)।
এর অর্থ কি এই যে সমস্ত শ্রেণিকেন্দ্রিক ভাষা সম্পূর্ণরূপে হওয়া সত্ত্বেও, প্রতিটি প্রোগ্রামিং ভাষা একত্রে সমাধান করতে পারে এমন সমস্যাগুলির শ্রেণীর ভাষা পরিবর্তিত হয়?
হ্যাঁ.
- স্ক্রিনে প্রিন্ট করার মতো সমস্যা রয়েছে যা "টুরিং-সম্পূর্ণ" শব্দটি দ্বারা আবৃত নয় (যা কেবল প্রাকৃতিক সংখ্যায় কম্পিউটিং ফাংশন নিয়ে নিজেকে উদ্বেগিত করে)। দুটি ভাষা টুরিং-সম্পূর্ণ হতে পারে তবে একটি স্ক্রিনে মুদ্রণের অনুমতি দিতে পারে এবং অন্যটি তা নয়।
- এমনকি যদি উভয় ভাষা একই সমস্যা সমাধান করতে পারে, তবে এনকোডিংটি কতটা জটিল এবং এই এনকোডিংটি প্রকাশ করা কত সহজ is সে সম্পর্কে কিছুই বলে না। যেমন সি প্রতিটি সমস্যার সমাধান করতে পারে হাস্কেল, কেবল সি তে হ্যাস্কেল দোভাষী লিখে ... তবে সমস্যাটি সমাধানের জন্য আপনাকে প্রথমে হাস্কেল দোভাষী লিখতে হবে!