একটি সি বাস্তবায়নের সর্বাধিক গণনা শক্তি


28

আমরা যদি বইটি (বা যদি আপনি পছন্দ করেন তবে ভাষার স্পেসিফিকেশনের অন্য কোনও সংস্করণ) দিয়ে যাই , একটি সি বাস্তবায়নের কতটা গণনার শক্তি থাকতে পারে?

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

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

আমার প্রাথমিক প্রতিক্রিয়াটি হ'ল একটি সি বাস্তবায়ন সীমাবদ্ধ অটোমেটোন ছাড়া আর কিছুই নয়, কারণ এটি ঠিক করার যোগ্য মেমোরির পরিমাণের সীমাবদ্ধতা রয়েছে (আপনি sizeof(char*) * CHAR_BITস্টোরেজের বিটগুলির চেয়ে বেশি সম্বোধন করতে পারবেন না , কারণ সংরক্ষণ করার সময় স্বতন্ত্র মেমরি ঠিকানার আলাদা বিট প্যাটার্ন থাকতে হবে) একটি বাইট পয়েন্টারে)।

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

এটা কি সঠিক? আপনি কি আরও কার্যকর সি প্রয়োগ করতে পারেন? একটি টুরিং-সম্পূর্ণ সি বাস্তবায়ন কি বিদ্যমান?


4
@ ডেভ: গিলস যেমন ব্যাখ্যা করেছেন, মনে হয় আপনার মনে সীমাহীন স্মৃতি থাকতে পারে তবে সরাসরি এটিকে সম্বোধনের কোনও উপায় নেই।
Jukka Suomela

2
আপনার ব্যাখ্যা থেকে শোনাচ্ছে কোনো সি বাস্তবায়ন শুধুমাত্র দ্বারা গৃহীত ভাষায় গ্রহণ করতে প্রোগ্রাম করা যেতে পারে মত নির্ণায়ক এমনকি প্রসঙ্গ-মুক্ত ভাষাগুলির থেকে দুর্বল pushdown অটোমাটা। এই পর্যবেক্ষণটি আমার মতে কিছুটা আগ্রহী নয়, কারণ প্রশ্নটি asyptotic এর অপব্যবহার।
ওয়ারেন শুডি

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

7
যাইহোক, "বিনোদনমূলক" ট্যাগটি যুক্ত করা (বা আমরা মজাদার ধাঁধার জন্য যা কিছু ব্যবহার করছি) যুক্ত করা ভাল ধারণা হতে পারে যাতে লোকেরা এটিকে খুব বেশি গুরুত্বের সাথে না নেয়। এটি অবশ্যই জিজ্ঞাসা করার জন্য "ভুল প্রশ্ন", তবে তবুও আমি এটি মজাদার এবং আকর্ষণীয় বলে মনে করি। :)
Jukka Suomela

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

উত্তর:


8

প্রশ্নটিতে উল্লিখিত হিসাবে, স্ট্যান্ডার্ড সি এর প্রয়োজন আছে যে UCHAR_MAX এর একটি মান বিদ্যমান যাতে প্রতিটি ধরণের পরিবর্তনশীল unsigned charসর্বদা 0 এবং UCHAR_MAX এর মধ্যে অন্তর্ভুক্ত থাকে। এটি আরও প্রয়োজন যে প্রতিটি গতিশীলভাবে বরাদ্দকৃত অবজেক্টকে বাইটের ক্রম দ্বারা উপস্থাপিত করা উচিত যা টাইপটির পয়েন্টারের মাধ্যমে সনাক্তকরণযোগ্য unsigned char*এবং সেখানে ধ্রুবকযুক্ত sizeof(unsigned char*)ধরণের প্রতিটি পয়েন্টার ধরণের sizeof(unsigned char *)মানগুলির ক্রম অনুসারে চিহ্নিতকরণযোগ্য হতে পারে unsigned char। বস্তু আছে যেগুলো একই সঙ্গে পরিবর্তনশীল বরাদ্দ করা যেতে পারে সংখ্যা এইভাবে কঠোরভাবে সীমাবদ্ধ । 10 the than এর বেশি সমর্থন করার জন্য কোনও তাত্ত্বিক সংকলককে এই ধ্রুবকগুলির মান নির্ধারণ থেকে আটকাতে পারে না 10 10 10UCHAR_MAXsizeof(unsigned char)101010 অবজেক্টস, তবে তাত্ত্বিক দৃষ্টিকোণ থেকে যে কোনও বাউন্ডের অস্তিত্ব, তা যত বড়ই হোক না কেন, অর্থ কিছু অসীম নয়।

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

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


এই ধরনের একটি মেশিনের সাহায্যে, আকার (চর) কী ফিরে আসবে?
TLW

1
@ টিএলডাব্লু: অন্য যে কোনও মেশিনের মতো: ১. CHAR_BITS এবং CHAR_MAX ম্যাক্রোগুলি কিছুটা সমস্যাযুক্ত হবে, যদিও; স্ট্যান্ডার্ড এমন ধরণের ধারণাগুলির জন্য অনুমতি দেয় না যার কোনও সীমা নেই।
সুপারক্যাট

ওফস, আমি CHAR_BITS বোঝাতে চাইছিলাম, যেমন আপনি বলেছেন, দুঃখিত।
TLW

7

সি 11 এর (alচ্ছিক) থ্রেডিং লাইব্রেরির সাহায্যে সীমাহীন পুনরাবৃত্তির গভীরতা প্রদত্ত একটি টুরিংয়ের সম্পূর্ণ বাস্তবায়ন সম্ভব।

একটি নতুন থ্রেড তৈরি করা একটি দ্বিতীয় স্ট্যাক দেয়; ট্যুরিং সম্পূর্ণতার জন্য দুটি স্ট্যাক যথেষ্ট। একটি স্ট্যাক প্রতিনিধিত্ব করে যা মাথার বামদিকে রয়েছে, অন্যটি স্ট্যাকটি যা ডানদিকে রয়েছে।


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

3

আমি মনে করি এটি টিউরিং সম্পূর্ণ : আমরা একটি প্রোগ্রাম লিখতে পারি যা এই ট্রিকটি ব্যবহার করে কোনও ইউটিএম অনুকরণ করে (আমি তাড়াতাড়ি কোডটি হাতে হাতে লিখেছিলাম যাতে সম্ভবত কিছু বাক্য গঠন ত্রুটি আছে ... তবে আমি আশা করি যে যুক্তিতে কোনও (প্রধান) ত্রুটি নেই :-)

  • এমন একটি কাঠামো সংজ্ঞায়িত করুন যা টেপ উপস্থাপনের জন্য ডাবল লিঙ্কযুক্ত তালিকা হিসাবে ব্যবহার করা যেতে পারে
    typdef কাঠামো {
      সেল_টি * পূর্ব; // বাম দিকে সেল
      সেল_টি * স্যাক; // ডানদিকে ঘর
      ইন্ট ভাল; // সেল মান
    } সেল_টি 

headএকটি একটি পয়েন্টার হতে হবে cell_tকাঠামো

  • একটি স্ট্রাকচার সংজ্ঞায়িত করুন যা বর্তমান অবস্থা এবং একটি পতাকা সংরক্ষণ করতে ব্যবহৃত হতে পারে
    টাইপডেফ স্ট্রাক্ট
      int state;
      int পতাকা;
    } তথ্য_টি 
  • তারপরে একক লুপ ফাংশনটি সংজ্ঞায়িত করুন যা একটি ইউনিভার্সাল টিএম অনুকরণ করে যখন মাথা ডাবল লিঙ্কযুক্ত তালিকার সীমানার মধ্যে থাকে; যখন মাথাটি একটি সীমানা মারবে তখন তথ্য_আর কাঠামোর পতাকাটি সেট করে (HIT_LEFT, HIT_RIGHT) এবং ফিরে আসুন:
অকার্যকর সিমুলেট_আউটএম (সেল_টি * হেড, ইনফো_টি * তথ্য) {
  (সত্য) {
    মাথা-> ভাল = UTM_nextsymbol [তথ্য-> রাষ্ট্র, মাথা-> ভাল]; // প্রতীক লিখুন
    তথ্য-> রাষ্ট্র = UTM_nextstate [তথ্য-> রাষ্ট্র, মাথা-> ভাল]; // পরবর্তী রাষ্ট্র
    যদি (তথ্য-> রাষ্ট্র == HALT_STATE) {// প্রিন্ট গ্রহণ করে এবং প্রোগ্রামটি প্রস্থান করে
       পুতচর ((তথ্য-> রাষ্ট্র == ACCEPT_STATE)? '1': '0');
       প্রস্থান (0);
    }
    int মুভ = ইউটিএম_নেক্সটমোভ [তথ্য-> রাষ্ট্র, মাথা-> ভাল];
    যদি (সরানো == MOVE_LEFT) {
      মাথা = মাথা-> পূর্ব; // বামে যাও
      যদি (প্রধান == NULL) {তথ্য-> পতাকা = HIT_LEFT; আসতে; }
    } অন্য {
      মাথা = মাথা-> সুসক; // ডানে যাও
      যদি (প্রধান == NULL) {তথ্য-> পতাকা = HIT_RIGHT; আসতে; }
    }
  } // এখনও সীমানায় ... চালিয়ে যান
}
  • তারপরে একটি পুনরাবৃত্ত ফাংশন সংজ্ঞায়িত করুন যা প্রথমে সিমুলেশন ইউটিএম রুটিনকে কল করে এবং তারপরে টেপটি প্রসারিত করার সময় পুনরাবৃত্তভাবে নিজেকে কল করে; যখন টেপটি শীর্ষে প্রসারিত করতে হবে (HIT_RIGHT) কোনও সমস্যা নেই, যখন এটি নীচে সরানো দরকার (HIT_LEFT) কেবলমাত্র ডাবল লিঙ্কযুক্ত তালিকা ব্যবহার করে ঘরের মানগুলি স্থানান্তর করুন:
অকার্যকর স্ট্যাকার (সেল_টি * শীর্ষ, সেল_টি * নীচে, সেল_টি * হেড, ইনফো_ট * তথ্য) {
  simulate_UTM (মাথা, তথ্য);
  সেল_টি নিউসেল; // নতুন ঘর
  newcell.pred = শীর্ষ; // নতুন কক্ষে ডাবল লিঙ্কযুক্ত তালিকা আপডেট করুন update
  newcell.succ = NULL;
  শীর্ষ-> সুসক = & নিউসেল;
  newcell.val = EMPTY_SYMBOL;

  স্যুইচ (তথ্য-> আঘাত) {
    কেস HIT_RIGHT:
      স্ট্যাকার (& নিউসেল, নীচে, নিউসেল, তথ্য);
      বিরতি;
    কেস HIT_BOTTOM:
      সেল_টি * টিএমপি = নিউসেল;
      (tmp-> pred! = NULL) {// মানগুলি শিফট করুন
        tmp-> ভাল = tmp-> পূর্ব-> ভাল;
        tmp = tmp-> pred;
      }
      tmp-> ভাল = EMPTY_SYMBOL;
      স্ট্যাকার (& নিউসেল, নীচে, নীচে, তথ্য);
      বিরতি;
  }
}
  • প্রাথমিক টেপটি একটি সাধারণ পুনরাবৃত্ত ফাংশন দিয়ে পূর্ণ হতে পারে যা ডাবল লিঙ্কযুক্ত তালিকা তৈরি করে এবং তারপরে stackerইনপুট টেপের শেষ চিহ্নটি পড়লে ফাংশনটি কল করে (রিডচার ব্যবহার করে)
অকার্যকর init_tape (সেল_টি * শীর্ষ, সেল_টি * নীচে, তথ্য_আর * তথ্য) {
  সেল_টি নিউসেল;
  int সি = রিডচার ();
  যদি (সি == END_OF_INPUT) স্ট্যাকার (& উপরে, নীচে, নীচে, তথ্য); // আর ​​কোনও প্রতীক নেই, শুরু করুন
  newcell.pred = শীর্ষ;
  if (top! = NULL) top.succ = & newसेल; অন্য তল = & newसेल;
  init_tape (& newसेल, নীচে, তথ্য);
}

সম্পাদনা: এ সম্পর্কে কিছুটা চিন্তা করার পরে, পয়েন্টারগুলির সাথে সমস্যা আছে ...

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


3
প্রতিটি সময় stackerবলা হয়, এটি একটি নতুন অবজেক্ট তৈরি করে newcell। এই অবজেক্টের একটি ঠিকানা রয়েছে যা অন্য কোনও বস্তুর ঠিকানা থেকে পৃথক। সুতরাং পুনরাবৃত্তির গভীরতার সীমাবদ্ধ সর্বাধিক রয়েছে stacker( যেখানে পয়েন্টার প্রতি বিটের সংখ্যা এবং )। প্রোগ্রামটি "স্ট্যাক" শেষ হয়ে গেলে অপরিজ্ঞাত আচরণের অনুরোধ করবে। আপনি যদি পুনরাবৃত্তির গভীরতা সীমাবদ্ধ করেন, আপনি একটি সসীম অটোমেটন পাবেন, তাই না? এন এস =2n/sns=sizeof(cell_t)
গিলস 21

@ গিলস: আপনি ঠিক বলেছেন (আমার সম্পাদনা দেখুন); আপনি যদি পুনরাবৃত্তির গভীরতা সীমাবদ্ধ করেন তবে আপনি একটি সসীম অটোমেটন পান
মার্জিও ডি বায়াসি

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

0

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

সম্পাদনা : আপনি যদি কেবল মেষটি ব্যবহার করতে পারেন, যা সীমাবদ্ধ, এই নির্মাণটি আর কাজ করে না, তাই নীচে দেখুন।

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

আমি এমনকি অনুমান করতে পারি যে আপনি যে ভাষার স্বীকৃতি দিতে পারবেন তা সীমাবদ্ধ (এমনকি ভাষাগুলি নিজেরাই অসীম হতে পারে, যেমন a*ঠিক আছে, তবে b^kকেবলমাত্র একটি সীমাবদ্ধ সংখ্যার জন্য কাজ করে k)।

সম্পাদনা : এটি সত্য নয়, আপনি অতিরিক্ত ফাংশনে বর্তমান অবস্থাটি এনকোড করতে পারেন, তাই আপনি সমস্ত নিয়মিত ভাষাগুলি সত্যই স্বীকৃত করতে পারেন ।

আপনি সম্ভবত একই কারণে সমস্ত প্রকার -2 ভাষা পেতে পারেন তবে আপনি নিশ্চিত নন যে আপনি কল-স্ট্যাকের উপর , রাষ্ট্র এবং স্ট্যাক-কনসেন্ট উভয়ই রাখতে পারবেন কিনা । তবে একটি সাধারণ নোটে, আপনি কার্যকরভাবে র‌্যামটি সম্পর্কে ভুলে যেতে পারেন, যেমন আপনি সর্বদা অটোমেটনের আকারটি স্কেল করতে পারেন যাতে আপনার বর্ণমালাটি রামের ধারণক্ষমতা ছাড়িয়ে যায়। সুতরাং আপনি যদি কেবল একটি স্ট্যাক দিয়ে একটি টিএম অনুকরণ করতে পারেন, টাইপ -2 টাইপ -0 সমান হবে, তাই না?


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

স্ট্যাক-পয়েন্টার ব্যবহার বাদ দিতে আমি আমার উত্তরটি পরিবর্তন করেছি।
বিটমাস্ক

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

0

আমি এটি সম্পর্কে একবার ভেবেছি, এবং প্রত্যাশিত শব্দার্থতত্ত্ব ব্যবহার করে একটি প্রসঙ্গ-মুক্ত ভাষা প্রয়োগের চেষ্টা করার সিদ্ধান্ত নিয়েছি; বাস্তবায়নের মূল অংশটি হ'ল নিম্নলিখিত কার্য:

void *it;

void read_triple(void *back)
{
  if(read_a()) read_triple(&back);
  else reject();
  for(it = back; it != NULL; it = *it)
     if(!read_b()) reject();
  if(read_c()) return;
  else reject();
}

{anbncn}

কমপক্ষে, আমি মনে করি এটি কাজ করে। এটি হতে পারে যে যদিও আমি কিছু মৌলিক ভুল করছি।

একটি নির্দিষ্ট সংস্করণ:

void *it;

void read_triple(void *back)
{
  if(read_a()) read_triple(&back);
  else for(it = back; it != NULL; it = * (void **) it)
     if(!read_b()) reject();
  if(read_c()) return;
  else reject();
}

ঠিক আছে, একটি মৌলিক ভুল নয়, তবে it = *itএটি দ্বারা প্রতিস্থাপন করা উচিত it = * (void **) it, অন্যথায় *itটাইপের মতো void
বেন স্ট্যান্ডেভেন

আমি যদি কল স্ট্যাক ভ্রমণ করে সি এর সাথে সংজ্ঞায়িত আচরণ হিসাবে দেখি তবে আমি খুব অবাক হব
রাদু গ্রেগোর

ওহ, এটি কাজ করবে না, কারণ প্রথম 'বি' পড়ার কারণে_এ () ব্যর্থ হয় এবং তাই প্রত্যাখাতকে ট্রিগার করে।
বেন স্ট্যান্ডিভেন

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

2
2CHAR_BITsizeof(char*)

0

@ সুপারক্যাট এর উত্তরের লাইনে:

সি-এর অসম্পূর্ণতার দাবির চারপাশে কেন্দ্রীভূত বলে মনে হয় যে স্বতন্ত্র বস্তুর স্বতন্ত্র ঠিকানা থাকা উচিত এবং ঠিকানাগুলির সেটটি সীমাবদ্ধ বলে ধরে নেওয়া হয়। যেমন @ সুপের্যাট লিখেছেন

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

unsigned char*N{0,1}sizeof(unsigned char*){0,1}sizeof(unsigned char)Nsizeof(unsigned char*)Nω

এই মুহুর্তে, একটি যাচাই করা উচিত যে সি স্ট্যান্ডার্ড সত্যই এটি অনুমতি দেয়।

sizeofZ


1
অবিচ্ছেদ্য ধরণের অনেকগুলি ক্রিয়াকলাপ এমন ফলাফল হিসাবে সংজ্ঞায়িত করা হয় যে "ফলাফলের ধরণের ক্ষেত্রে উপস্থাপনযোগ্য সর্বাধিক মানের তুলনায় মডুলো হ্রাস করা" is সর্বাধিক একটি স-সীমাবদ্ধ অর্ডিনাল হলে কীভাবে এটি কাজ করবে?
গিলস 16'3 2013

@ গিলিস এটি একটি আকর্ষণীয় বিষয়। এটি প্রকৃতপক্ষে পরিষ্কার নয় যে শব্দার্থকগুলি কী হবে uintptr_t p = (uintptr_t)sizeof(void*)(something ওমেগাকে এমন কোনও জিনিসে রাখে যা স্বাক্ষরবিহীন পূর্ণসংখ্যা রাখে)। আমি জানি না. ফলাফলটি 0 (বা অন্য কোনও সংখ্যা) হওয়ার সংজ্ঞা দিয়ে আমরা পালিয়ে যেতে পারি।
আলেক্সি বি

1
uintptr_tঅসীম হতে হবে। মনে মনে রাখবেন, এই প্রকারটি alচ্ছিক - তবে আপনার যদি স্বতন্ত্র পয়েন্টার মানগুলির অসীম সংখ্যা থাকে তবে তা sizeof(void*)অবশ্যই অসীম হতে হবে, তাই size_tঅবশ্যই অসীম হতে হবে। হ্রাস মডুলো সম্পর্কে আমার আপত্তি এতটা সুস্পষ্ট নয় - তবে এটি যদি কেবল একটি অতিরিক্ত প্রবাহিত হয় তবে তা কার্যকর হয় তবে আপনি যদি অসীম প্রকারের অনুমতি দেন তবে সেগুলি কখনই উপচে পড়বে না। তবে আঁকড়ে ধরার পক্ষে, প্রতিটি ধরণের একটি ন্যূনতম এবং সর্বাধিক মান থাকে, যা আমি যতদূর বলতে পারি যেগুলি UINT_MAX+1অবশ্যই প্রবাহিত হবে।
গিলস 16'30

এছাড়াও একটি ভাল পয়েন্ট। প্রকৃতপক্ষে, আমরা এক প্রকারের (পয়েন্টার এবং আকার_ টি) পাই যা তাদের উপর ভিত্তি করে construction, ℤ বা কিছু নির্মাণ করা উচিত (আকার_t এর জন্য যদি ℕ ∪ {ω} এর মতো কিছু হয়)। এখন, যদি এই ধরণের কিছুগুলির জন্য, মানটির সর্বাধিক মান (পিটিআর_ম্যাক্স বা এর মতো কিছু) নির্ধারণ করার জন্য একটি ম্যাক্রোর প্রয়োজন হয় তবে জিনিসগুলি লোমশ হয়ে উঠবে। তবে এখনও অবধি আমি কেবলমাত্র পয়েন্টারবিহীন প্রকারের জন্য এমআইএন / ম্যাক্স ম্যাক্রোগুলির প্রয়োজনে তহবিল করতে সক্ষম হয়েছি।
আলেক্সি বি।

তদন্ত করার আরেকটি সম্ভাবনা হ'ল উভয় size_tএবং পয়েন্টার ধরণের সংজ্ঞা দেওয়া } ∪ {ω}} এটি সর্বনিম্ন / সর্বাধিক সমস্যা থেকে মুক্তি পায়। ওভারফ্লো শব্দার্থবিজ্ঞানের সমস্যাটি এখনও রয়ে গেছে। শব্দার্থবিজ্ঞানের কী হওয়া উচিত তা uint x = (uint)ωআমার কাছে পরিষ্কার নয়। আবার, আমরা অলসভাবে 0 নিতে পারি, তবে এটি কিছুটা কুৎসিত দেখাচ্ছে।
আলেক্সি বি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.