ট্যুরিং মেশিনগুলি গণনার একটি সাধারণ মডেল, কীভাবে নিজেকে বোঝাতে পারি সে সম্পর্কে আমি এখনই ভাবছি। আমি সম্মত হই যে কয়েকটি স্ট্যান্ডার্ড পাঠ্যপুস্তক, যেমন সিপসারে চার্চ-টিউরিং থিসিসের স্ট্যান্ডার্ড চিকিত্সা খুব সম্পূর্ণ নয়। আমি কীভাবে ট্যুরিং মেশিন থেকে আরও স্বীকৃত প্রোগ্রামিং ভাষায় যেতে পারি তার একটি স্কেচ এখানে।
একটি ব্লক-কাঠামোবদ্ধ প্রোগ্রামিং সঙ্গে ভাষা বিবেচনা করুন if
এবং while
বিবৃতির সঙ্গে, অ রিকার্সিভ নামে সংজ্ঞায়িত কার্যকারিতা ও সাবরুটিনের, বুলিয়ান র্যান্ডম ভেরিয়েবল ও সাধারণ বুলিয়ান এক্সপ্রেশন, এবং একটি একক সীমাবদ্ধ বুলিয়ান অ্যারের সঙ্গে tape[n]
একটি পূর্ণসংখ্যা অ্যারের পয়েন্টার দিয়ে n
যে বৃদ্ধি করা যেতে পারে বা decremented, n++
বা n--
। পয়েন্টারটি n
প্রাথমিকভাবে শূন্য এবং অ্যারে tape
শুরুতে সমস্ত শূন্য হয়। সুতরাং, এই কম্পিউটারের ভাষা সি-মত বা পাইথন-জাতীয় হতে পারে তবে এটি এর ডেটা ধরণের ক্ষেত্রে খুব সীমিত। আসলে, এগুলি এতটাই সীমাবদ্ধ যে আমাদের কাছে n
বুলিয়ান এক্সপ্রেশনটিতে পয়েন্টারটি ব্যবহার করার উপায় নেই । ধরে নিচ্ছি যেtape
শুধুমাত্র ডানদিকে অসীম, আমরা যদি n
কখনও নেতিবাচক থাকে তবে আমরা একটি পয়েন্টার আন্ডারফ্লো "সিস্টেম ত্রুটি" ঘোষণা করতে পারি । এছাড়াও, আমাদের ভাষার exit
একটি বুলিয়ান উত্তর আউটপুট দেওয়ার জন্য একটি যুক্তি সহ একটি বিবৃতি রয়েছে।
তারপরে প্রথম বিষয়টি হল এই প্রোগ্রামিং ভাষাটি একটি টুরিং মেশিনের জন্য একটি ভাল স্পেসিফিকেশন ভাষা। আপনি সহজেই দেখতে পারেন যে টেপ অ্যারে ব্যতীত কোডটিতে কেবল চূড়ান্তভাবে অনেকগুলি সম্ভাব্য রাজ্য রয়েছে: এর ঘোষিত সমস্ত ভেরিয়েবলগুলির বর্তমান অবস্থা এবং কার্যকরকরণের বর্তমান লাইন এবং তার সাব্রোটিন স্ট্যাক। পরেরটিরটিতে কেবল সীমাবদ্ধ পরিমাণ রাষ্ট্র থাকে কারণ পুনরাবৃত্তির কার্যগুলি অনুমোদিত নয়। আপনি এমন একটি "সংকলক" কল্পনা করতে পারেন যা এই ধরণের কোড থেকে একটি "আসল" টুরিং মেশিন তৈরি করে তবে এর বিবরণটি গুরুত্বপূর্ণ নয়। মুল বক্তব্যটি হ'ল আমাদের কাছে বেশ ভাল সিনট্যাক্স সহ একটি প্রোগ্রামিং ভাষা রয়েছে তবে খুব আদিম ডেটা ধরণের।
নির্মাণের বাকী অংশটি লাইব্রেরির ফাংশন এবং পূর্ববর্তীকরণের পর্যায়ে একটি সীমাবদ্ধ তালিকা সহ এটি আরও বাসযোগ্য প্রোগ্রামিং ভাষায় রূপান্তর করা convert আমরা নিম্নলিখিত হিসাবে এগিয়ে যেতে পারেন:
প্রাক-কম্পাইলারের সাহায্যে, আমরা বুলিয়ান ডেটা প্রকারটিকে বৃহত্তর তবে সীমাবদ্ধ বর্ণমালায় যেমন ASCII তে প্রসারিত করতে পারি। আমরা ধরে নিতে পারি যে tape
এই বৃহত্তর বর্ণমালায় মান লাগে। টেপটির শুরুতে একটি চিহ্নিতকারীকে পয়েন্টার জলস্রোতা রোধ করতে এবং টেপটির শেষদিকে একটি স্থাবর মার্কার রেখে দিতে পারেন যাতে দুর্ঘটনাক্রমে টেপটিতে টিএমকে স্কেটিং থেকে অনন্তর দিকে আটকাতে পারে। আমরা প্রতীক এবং বুলিয়ান if
এবং while
বিবৃতিতে রূপান্তরগুলির মধ্যে নির্বিচারে বাইনারি অপারেশনগুলি প্রয়োগ করতে পারি । (আসলে if
এটি প্রয়োগ while
না করে যদি এটি না পাওয়া যায়))
টেপ এবং (ধনাত্মক) পূর্ণসংখ্যার গাণিতিকের এলোমেলো অ্যাক্সেস উভয়ই প্রয়োগ করতে আমরা একটি আনবাউন্ডেড পূর্ণসংখ্যার ডেটা টাইপ চাই। এই লক্ষ্যে, আমরা যে টেপটি রেখেছি তার সাথে কিছু ফিক্সড জন্য টেপ টিএম অনুকরণ করি। এই নির্মাণটি সিপসারে একটি উপপাদ্য হিসাবে দেওয়া হয়েছে। ধারণাটি হ'ল আমাদের কাছে থাকা নিম্ন-স্তরের টেপগুলিতে এমুলেটেড টেপগুলি আন্তঃলিখন করা উচিত, যেখানে চিহ্নিত অবস্থানের চিহ্নগুলি প্রধান অবস্থানগুলির প্রতিনিধিত্ব করে। যদি নিম্ন-স্তরের টেপ পয়েন্টারটি শূন্যে থাকে, তবে এটি অবস্থানের দিকে এগিয়ে যাওয়ার পরে এবং একবারে পদক্ষেপে ঝাঁপিয়ে সাবটপে সহায়তা করে ; প্রতিটি পড়া বা লেখার পরে, নিম্ন-স্তরের টেপ পয়েন্টারটি শূন্যে ফিরে আসে। পূর্ববর্তী পর্যায়ে যেমন প্রাক-কম্পাইলার হিসাবে এটি প্রয়োগ করা আরও সহজ।টটআমিআমিট
আমরা একটি টেপকে প্রতীক-মূল্যবান "মেমরি" এবং অন্যকে স্বাক্ষরবিহীন, পূর্ণসংখ্যা-মূল্যবান "রেজিস্টার" বা "ভেরিয়েবল" হিসাবে মনোনীত করি। সমাপ্তি চিহ্নিতকারীদের সাথে আমরা সংক্ষিপ্ত-এডিয়ান বাইনারিতে পূর্ণসংখ্যাগুলি সঞ্চয় করি। আমরা প্রথমে একটি রেজিস্টারের অনুলিপি এবং একটি রেজিস্টারের বাইনারি হ্রাস কার্যকর করি। মেমরি পয়েন্টার বৃদ্ধি এবং হ্রাস সঙ্গে এই মিশ্রণ, আমরা প্রতীক মেমরির এলোমেলো অ্যাক্সেস সন্ধান করতে পারেন। বাইনারি সংযোজন এবং পূর্ণসংখ্যার গুণক গণনা করতে আমরা ফাংশনগুলিও লিখতে পারি। বিটওয়াইজ অপারেশন সহ বাইনারি সংযোজন ফাংশন এবং বাম শিফট দিয়ে 2 দিয়ে গুণতে একটি ফাংশন লেখা শক্ত নয়। (বা এটি সত্যই ডান শিফট, যেহেতু এটি স্বল্প-এডিয়ান) these
সূত্রটি ব্যবহার করে আমরা এক-মাত্রিক প্রতীক অ্যারে symbol[n]
থেকে দ্বি-মাত্রিক প্রতীক অ্যারেতে মেমরি টেপটিকে পুনর্গঠিত করতে পারি । দ্বি-মাত্রিক, এলোমেলো অ্যাক্সেস, পূর্ণসংখ্যার মূল্যবান মেমরি পেতে, আমরা এখন মেমরির প্রতিটি সারিটি একটি সমাপ্তি চিহ্ন সহ বাইনারিটিতে স্বাক্ষরবিহীন পূর্ণসংখ্যাকে প্রকাশ করতে ব্যবহার করতে পারি । আমরা মেমরি থেকে একটি পূর্ণসংখ্যার রেজিস্ট্রারে পড়া এবং একটি রেজিস্টার থেকে মেমরিতে লেখার প্রয়োগ করতে পারি। অনেকগুলি বৈশিষ্ট্য এখন ফাংশন সহ প্রয়োগ করা যেতে পারে: স্বাক্ষরিত এবং ভাসমান পয়েন্ট গণিত, প্রতীক স্ট্রিং ইত্যাদি withsymbol[x,y]
n = (x+y)*(x+y) + y
memory[x]
কেবলমাত্র আরও একটি বেসিক সুবিধার জন্য কঠোরভাবে একটি পূর্বনির্ধারক প্রয়োজন, যথা পুনরাবৃত্ত ফাংশন। এটি এমন একটি প্রযুক্তি দিয়ে করা যেতে পারে যা ব্যাখ্যামূলক ভাষাগুলি কার্যকর করতে ব্যাপকভাবে ব্যবহৃত হয়। আমরা প্রত্যেকটি উচ্চ-স্তরের, পুনরাবৃত্তির জন্য একটি নাম স্ট্রিং নির্ধারণ করি এবং আমরা নিম্ন-স্তরের while
কোডটিকে একটি বৃহত লুপে সংগঠিত করি যা সাধারণ পরামিতিগুলির সাথে কল স্ট্যাক বজায় রাখে: কলিং পয়েন্ট, কল ফাংশন এবং যুক্তিগুলির তালিকা।
এই সময়ে, নির্মাণে উচ্চ-স্তরের প্রোগ্রামিং ভাষার যথেষ্ট বৈশিষ্ট্য রয়েছে যা আরও কার্যকারিতা সিএস তত্ত্বের চেয়ে প্রোগ্রামিং ভাষা এবং সংকলকগুলির বিষয় is এই উন্নত ভাষায় টুরিং-মেশিন সিমুলেটরটি লিখতে ইতোমধ্যে সহজ। ভাষার পক্ষে স্ব-সংকলক লেখার পক্ষে এটি ঠিক সহজ নয়, তবে অবশ্যই আদর্শ। অবশ্যই এই সি-জাতীয় বা পাইথন-জাতীয় ভাষার কোড থেকে বাইরের টিএম তৈরি করতে আপনার একটি বহিরাগত সংকলক প্রয়োজন তবে এটি যে কোনও কম্পিউটার ভাষায় করা যেতে পারে।
নোট করুন যে এই স্কেচড বাস্তবায়ন কেবল পুনরাবৃত্তির ফাংশন শ্রেণির জন্য লজিস্টিয়ানদের চার্চ-টিউরিং থিসিসকে সমর্থন করে না, তবে বিচ্ছিন্ন (অর্থাত্ বহুপদী) চার্চ-টিউরিং থিসিসটি যেমন নির্বিচারক গণনার ক্ষেত্রে প্রযোজ্য। অন্য কথায় এটির বহুপদী ওভারহেড রয়েছে। আসলে, যদি আমাদের কোনও র্যাম মেশিন বা (আমার ব্যক্তিগত পছন্দসই) একটি গাছের টেপ টিএম দেওয়া হয়, তবে এটি র্যামের মেমরির সাথে সিরিয়াল গণনার জন্য পলিওগারিদমিক ওভারহেডে হ্রাস করা যেতে পারে।