আমি নিশ্চিত নই তবে আমি মনে করি উত্তরটি হ'ল বরং, সূক্ষ্ম কারণে। আমি কয়েক বছর আগে তাত্ত্বিক কম্পিউটার বিজ্ঞানের বিষয়ে জিজ্ঞাসা করেছি এবং এমন উত্তর পাই যা আমি এখানে উপস্থাপন করব তার থেকে বেশি যায়।
বেশিরভাগ প্রোগ্রামিং ভাষায়, আপনি একটি টিউরিং মেশিন দ্বারা অনুকরণ করতে পারেন:
- সীমাবদ্ধ অটোমেটনকে এমন একটি প্রোগ্রামের সাথে অনুকরণ করে যা সীমাবদ্ধ পরিমাণে মেমরি ব্যবহার করে;
- সংস্থার লিঙ্কযুক্ত তালিকার এক জোড়া দিয়ে টেপকে সিমুলেট করা, বর্তমান অবস্থানের আগে এবং পরে টেপের সামগ্রীর প্রতিনিধিত্ব করে। পয়েন্টারটি সরানো মানে তালিকার একটির শিরোনামকে অন্য তালিকায় স্থানান্তরিত করা।
যদি টেপটি খুব দীর্ঘ হয়ে যায় তবে কম্পিউটারে চলমান একটি কংক্রিট বাস্তবায়ন স্মৃতিশক্তি থেকে সরে যাবে, তবে একটি আদর্শ বাস্তবায়ন টুরিং মেশিন প্রোগ্রামকে বিশ্বস্ততার সাথে কার্যকর করতে পারে। এটি কলম এবং কাগজ দিয়ে বা আরও মেমরির কম্পিউটার কেনার মাধ্যমে এবং কম্পিউটারে শব্দের চেয়ে আরও বেশি বিট যুক্ত আর্কিটেকচারকে লক্ষ্য করে এমন একটি সংকলক এবং যদি প্রোগ্রামটি কখনও স্মৃতি থেকে সরে যায় তবে এটি করা যেতে পারে।
এটি সি তে কাজ করে না কারণ একটি লিঙ্কযুক্ত তালিকা থাকা চিরকালের জন্য বাড়তে পারে এমনটি অসম্ভব: নোডের সংখ্যার সর্বদা কিছুটা সীমা থাকে।
কেন তা ব্যাখ্যা করার জন্য, আমাকে প্রথমে একটি সি বাস্তবায়ন কী তা ব্যাখ্যা করতে হবে। সি আসলে প্রোগ্রামিং ভাষার একটি পরিবার। আইএসও সি মান (আরো সঠিকভাবে, এই মান একটি নির্দিষ্ট সংস্করণ) সংজ্ঞায়িত বাক্য গঠন এবং শব্দার্থবিদ্যা ভাষায় প্রোগ্রামিং এর একটি পরিবার (আনুষ্ঠানিকতা মাত্রা যে ইংরেজি পারবেন সহ)। সি অনেক আছে অনির্ধারিত আচরণ এবং বাস্তবায়ন-সংজ্ঞায়িত আচরণ। সি এর একটি "বাস্তবায়ন" সমস্ত বাস্তবায়ন-সংজ্ঞায়িত আচরণকে কোডিং করে (কোড করার জন্য বিষয়গুলির তালিকা সি 99 এর পরিশিষ্ট জেতে রয়েছে)। সি এর প্রতিটি বাস্তবায়ন একটি পৃথক প্রোগ্রামিং ভাষা। নোট করুন যে "বাস্তবায়ন" শব্দের অর্থটি কিছুটা অদ্ভুত: এর প্রকৃত অর্থ একটি ভাষা বৈকল্পিক, একাধিক বিভিন্ন সংকলক প্রোগ্রাম থাকতে পারে যা একই ভাষার বৈকল্পিক প্রয়োগ করে।
সি প্রদত্ত প্রয়োগে, একটি বাইটের সম্ভাব্য মান রয়েছে। সমস্ত ডেটা বাইটের অ্যারে হিসাবে উপস্থাপন করতে পারে: একটি ধরণের সম্ভাব্য মানগুলির (টি) সর্বাধিক
2 CHAR_BIT × আকার থাকে । এই সংখ্যাটি সি এর বিভিন্ন বাস্তবায়নে পরিবর্তিত হয়, তবে সি প্রদত্ত প্রয়োগের জন্য এটি একটি ধ্রুবক।2CHAR_BITt
2CHAR_BIT×sizeof(t)
বিশেষত, পয়েন্টারগুলি কেবলমাত্র শূন্য *) মান নিতে পারে। এর অর্থ এখানে সীমাবদ্ধ সর্বোচ্চ সংখ্যক ঠিকানাযোগ্য বস্তু রয়েছে।2CHAR_BIT×sizeof(void*)
মান CHAR_BIT
এবং sizeof(void*)
, পর্যবেক্ষণযোগ্য হয় তাই আপনি যদি মেমরি রান আউট, আপনি শুধু যারা পরামিতি জন্য বৃহত্তর মান আপনার প্রোগ্রাম চলমান সারসংকলন করতে পারবে না। আপনি একটি ভিন্ন প্রোগ্রামিং ভাষার অধীনে প্রোগ্রামটি চালাবেন - একটি ভিন্ন সি বাস্তবায়ন।
যদি কোনও ভাষার প্রোগ্রামগুলিতে কেবল সীমিত সংখ্যক রাজ্য থাকতে পারে, তবে প্রোগ্রামিং ভাষা সীমাবদ্ধ অটোমেটার চেয়ে আর কোনও ভাবপূর্ণ নয়। সি এর খণ্ডন যা ঠিকানার যোগ্য সঞ্চয়স্থানে সীমাবদ্ধ রয়েছে কেবলমাত্র সর্বাধিক শূন্য *) প্রোগ্রামে অনুমতি দেয় যেখানে এন প্রোগ্রামটির বিমূর্ত সিনট্যাক্স গাছের আকার (নিয়ন্ত্রণ প্রবাহের অবস্থার প্রতিনিধিত্ব করে), সুতরাং এটি প্রোগ্রামটি অনেকগুলি রাজ্যের সাথে সীমাবদ্ধ অটোমেটনের দ্বারা অনুকরণ করা যায়। সি যদি আরও প্রকাশিত হয় তবে এটি অন্যান্য বৈশিষ্ট্যগুলির ব্যবহারের মাধ্যমে হওয়া উচিত।n×2CHAR_BIT×sizeof(void*)n
সি সরাসরি সর্বোচ্চ পুনরাবৃত্তির গভীরতা চাপায় না। একটি বাস্তবায়নের ক্ষেত্রে সর্বাধিক থাকার অনুমতি রয়েছে তবে এটিও না রাখার অনুমতি রয়েছে। তবে আমরা কীভাবে কোনও ফাংশন কল এবং এর পিতামাতার মধ্যে যোগাযোগ করব? যুক্তিগুলি যদি ঠিকানা হিসাবে চিহ্নিত হয় তবে তা ভাল নয়, কারণ এটি পরোক্ষভাবে পুনরাবৃত্তির গভীরতা সীমাবদ্ধ করবে: যদি আপনার কোনও ক্রিয়াকলাপ থাকে int f(int x) { … f(…) …}
তবে x
সক্রিয় ফ্রেমের সমস্ত উপস্থিতিগুলির f
নিজস্ব ঠিকানা থাকে এবং তাই নেস্টেড কলগুলির সংখ্যাটি নম্বর দ্বারা আবদ্ধ হয় সম্ভাব্য ঠিকানা x
।
এসি প্রোগ্রাম register
ভেরিয়েবলের আকারে অ-ঠিকানাযোগ্য সঞ্চয়স্থান ব্যবহার করতে পারে । "সাধারণ" বাস্তবায়নে কেবলমাত্র একটি ছোট, সীমাবদ্ধ সংখ্যক ভেরিয়েবল থাকতে পারে যার কোনও ঠিকানা নেই, তবে তাত্ত্বিকভাবে একটি বাস্তবায়ন সীমাহীন পরিমাণে register
সঞ্চয় করতে পারে । যেমন বাস্তবায়নে, আপনি যতক্ষণ না তার যুক্তি যতক্ষণ না ফাংশনে একটি সীমাহীন পরিমাণে পুনরাবৃত্ত কল করতে পারেন register
। তবে যেহেতু আর্গুমেন্টগুলি register
তাই আপনি তাদের কাছে একটি পয়েন্টার তৈরি করতে পারবেন না এবং সুতরাং আপনার তাদের ডেটাগুলি স্পষ্টভাবে অনুলিপি করতে হবে: আপনি কেবলমাত্র সীমাবদ্ধ পরিমাণে ডেটা দিয়ে যেতে পারেন, বিন্দুযুক্ত আকারের ডেটা কাঠামো নয়।
আনবাউন্ডেড পুনরাবৃত্তির গভীরতা এবং কোনও ফাংশন কেবল তার প্রত্যক্ষ কলার ( register
যুক্তি) থেকে ডেটা পেতে পারে এবং তার প্রত্যক্ষ কলার (ফাংশন রিটার্ন মান) -এর তথ্য ফিরিয়ে আনতে পারে এমন বিধিনিষেধের সাথে আপনি ডিটারমিনিস্টিক পুশডাউন অটোমেটার শক্তি পাবেন ।
আমি আর যেতে উপায় খুঁজে পাচ্ছি না।
(অবশ্যই আপনি ফাইলটি ইনপুট / আউটপুট ফাংশনগুলির মাধ্যমে টেপ সামগ্রীটি বাহ্যিকভাবে সঞ্চয় করতে পারেন But তবে আপনি সি সি টুরিং-সম্পূর্ণ কিনা তা জিজ্ঞাসা করবেন না, তবে সি প্লাস কোনও অসীম স্টোরেজ সিস্টেমটি টুরিং-সম্পূর্ণ কিনা) যা উত্তরটি বিরক্তিকর "হ্যাঁ" You আপনি স্টোরেজটিকে টিউরিং ওরাকল হিসাবে পরিচিত করতে পারেন - কল করুন fopen("oracle", "r+")
, fwrite
এটিতে প্রাথমিক টেপের সামগ্রী এবং fread
চূড়ান্ত টেপের সামগ্রীর পিছনে)