কনওয়ের গেম অফ লাইফে টেট্রিসের একটি কাজের গেম তৈরি করুন


994

এখানে একটি তাত্ত্বিক প্রশ্ন রয়েছে - এমন একটি যা কোনও ক্ষেত্রেই সহজ উত্তর বহন করে না, এমনকি তুচ্ছ প্রশ্নেরও নয়।

কনওয়ের গেম অফ লাইফে এমন মেটাপিক্সেলের মতো নির্মাণ রয়েছে যা গেম অফ লাইফকে অন্য কোনও গেম-অফ-লাইফ রুল সিস্টেমের অনুকরণ করতে দেয়। এছাড়াও, এটি জানা গেছে যে গেম অফ লাইফটি টুরিং-সম্পূর্ণ।

আপনার কাজটি হ'ল কনওয়ের গেম অফ লাইফের নিয়মগুলি ব্যবহার করে সেলুলার অটোমেটন তৈরি করা যা টেট্রিসের একটি গেম খেলার জন্য অনুমতি দেয়।

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

আপনার প্রোগ্রামটি নিম্নলিখিত বিষয়গুলিতে স্কোর করা হবে, যাতে (উচ্চতর মানদণ্ডের জন্য টাইব্রেকার হিসাবে কম মানদণ্ডের সাথে):

  • বাউন্ডিং বক্সের আকার - সবচেয়ে ছোট ক্ষেত্রের সাথে আয়তক্ষেত্রাকার বাক্স যা প্রদত্ত সমাধানটি সম্পূর্ণরূপে জয়যুক্ত করে।

  • ইনপুট-এ ছোট ছোট পরিবর্তনগুলি - সর্বাধিক কক্ষ (আপনার অটোমেটনের সবচেয়ে খারাপ অবস্থার জন্য) যা একটি বিঘ্নিত জয়ের জন্য ম্যানুয়ালি অ্যাডজাস্ট করা প্রয়োজন।

  • দ্রুততম সম্পাদন - সিমুলেশন জিততে একটি টিককে এগিয়ে নেওয়ার কয়েকটি সংখ্যক প্রজন্ম।

  • প্রাথমিক লাইভ সেল গণনা - ছোট গণনা জিতে।

  • প্রথম পোস্ট - আগের পোস্ট জয়।


95
"প্রদর্শিত উদাহরণস্বরূপ উদাহরণ" বলতে কী এমন কিছু বোঝায় যা কয়েক ঘন্টার মধ্যে চলমান বা মহাবিশ্বের উত্তাপের মৃত্যুর সময় না হওয়া পর্যন্ত এটি সঠিকভাবে প্রমাণিত হতে পারে?
পিটার টেলর

34
আমি নিশ্চিত যে এরকম কিছু সম্ভব এবং প্লেযোগ্য। এটি খুব সামান্য লোকেরই এমন প্রোগ্রাম করার পক্ষে দক্ষতা রয়েছে যা সম্ভবত বিশ্বের অন্যতম প্রধান "সমাবেশ ভাষা" is
জাস্টিন এল।

58
এই চ্যালেঞ্জ কাজ করা হচ্ছে! চ্যাট রুম | অগ্রগতি | ব্লগ
mbomb007

49
আজ সকালে 5:10 পর্যন্ত (9:10 ইউটিসি), পিপিসিজির ইতিহাসে এই প্রশ্নটি উত্তর না পেয়ে 100 টি ভোটে পৌঁছানোর প্রথম প্রশ্ন! সবাই ভালো করেছেন.
জো জেড।

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

উত্তর:


938

এটি কোয়েস্ট হিসাবে শুরু হয়েছিল তবে একটি ওডিসি হিসাবে শেষ হয়েছিল।

টেট্রিস প্রসেসরের অনুসন্ধান, 2,940,928 x 10,295,296

প্যাটার্ন ফাইলটি এর সমস্ত গৌরবতে এখানে পাওয়া যাবে , এখানে ব্রাউজারে দেখতে পাওয়া যায় ।

এই প্রকল্পটি বিগত 1 & 1/2 বছর ধরে অনেক ব্যবহারকারীর প্রচেষ্টার সমাপ্তি। যদিও দলটির গঠন সময়ের সাথে সাথে বিভিন্ন রকম হয়েছে, লেখার অংশীদারিগুলি নিম্নলিখিত:

আমরা 7H3_H4CK3R, কনর ও ব্রায়েন এবং আরও অনেক ব্যবহারকারী যারা এই চ্যালেঞ্জ সমাধানের জন্য প্রচেষ্টা চালিয়েছে তাদের ধন্যবাদ জানাতে চাই ।

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

দয়া করে দলের সমস্ত সদস্যের মধ্যে কোনও আপভেট বা অনুদান বিতরণ করুন।

সুচিপত্র

  1. সংক্ষিপ্ত বিবরণ
  2. মেটাপিক্সেল এবং ভারলিফ
  3. হার্ডওয়্যারের
  4. কিউএফটিএএসএম এবং কোগল
  5. সমাবেশ, অনুবাদ এবং ভবিষ্যত
  6. নতুন ভাষা এবং সংকলক

এছাড়াও আমাদের গিটহাব সংগঠনটি পরীক্ষা করার বিষয়টি বিবেচনা করুন যেখানে আমরা আমাদের সমাধানের অংশ হিসাবে আমাদের লেখা সমস্ত কোড রেখেছি। প্রশ্নগুলি আমাদের উন্নয়নের চ্যাটরুমে পরিচালিত হতে পারে ।


পর্ব 1: ওভারভিউ

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

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

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

ভাবমূর্তি

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

আমাদের কম্পিউটারটিও অ্যাসিক্রোনাস, যার অর্থ এই যে কম্পিউটারকে নিয়ন্ত্রণকারী কোনও গ্লোবাল ক্লক নেই। বরং কম্পিউটারের চারদিকে প্রবাহিত হওয়ার সাথে সাথে ডেটাটি ক্লক সিগন্যালের সাথে আসে, যার অর্থ আমাদের কেবল কম্পিউটারের গ্লোবাল টাইমিংয়ের পরিবর্তে নয় তবে লোকালগুলিতে ফোকাস করা দরকার।

আমাদের প্রসেসরের আর্কিটেকচারের একটি চিত্র এখানে দেওয়া হয়েছে:

ভাবমূর্তি

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

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

টেট্রিস চালাচ্ছেন

যারা কম্পিউটারের সাথে প্রায় তালগোল পাকানো ছাড়া Tetris খেলা করতে ইচ্ছুক, আপনি চালাতে পারেন Tetris সোর্স কোড উপর QFTASM অনুবাদক । পুরো গেমটি দেখতে র্যাম ডিসপ্লে অ্যাড্রেসগুলি 3-32 এ সেট করুন। সুবিধার্থে এখানে একটি পারমালিঙ্ক রয়েছে : কিউএফটিএএসএম-তে টেট্রিস

গেম বৈশিষ্ট্য:

  • সমস্ত 7 টিট্রোমিনোস
  • চলাচল, আবর্তন, নরম ফোটা
  • লাইন ক্লিয়ার এবং স্কোরিং
  • পূর্বরূপ অংশ
  • প্লেয়ার ইনপুটগুলি এলোমেলোভাবে ইনজেকশন দেয়

প্রদর্শন

আমাদের কম্পিউটার এটির স্মৃতিতে গ্রিড হিসাবে টেট্রিস বোর্ডকে উপস্থাপন করে। ঠিকানাগুলি 10-31 বোর্ডটি প্রদর্শন করে, ঠিকানাগুলি 5-8 টি পূর্বরূপ অংশটি প্রদর্শন করে এবং 3 নম্বরটিতে স্কোর থাকে।

ইনপুট

গেমের ইনপুটটি ম্যানুয়ালি র‍্যাম ঠিকানার বিষয়বস্তু সম্পাদনা করে সম্পাদিত হয় 1. কিউএফটিএএসএম ইন্টারপ্রেটার ব্যবহার করে, এর অর্থ হ'ল সরাসরি লেখার সম্পাদনা করা যায় 1. দোভাষীর পাতায় "সরাসরি রমে টু রাইট" অনুসন্ধান করুন। প্রতিটি পদক্ষেপে কেবলমাত্র একক বিস্তৃত র‍্যাম সম্পাদনা করা দরকার এবং ইনপুট ইভেন্টটি পড়ার পরে এই ইনপুট রেজিস্টারটি স্বয়ংক্রিয়ভাবে সাফ হয়ে যায়।

value     motion
   1      counterclockwise rotation
   2      left
   4      down (soft drop)
   8      right
  16      clockwise rotation

স্কোরিং সিস্টেম

আপনি একক পালনে একাধিক লাইন সাফ করার জন্য বোনাস পান।

1 row    =  1 point
2 rows   =  2 points
3 rows   =  4 points
4 rows   =  8 points

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

28
সবার আগে +1, কারণ এটি একটি অত্যন্ত বিস্ময়কর কৃতিত্ব especially বিশেষত যেহেতু আপনি কেবল টেটারিসের চেয়ে জীবনের গেমটিতে একটি কম্পিউটার তৈরি করেছেন)। দ্বিতীয়ত, কম্পিউটারটি কত দ্রুত এবং টেট্রিস গেমটি কত গতিযুক্ত? এটি কি দূরবর্তীভাবে বাজানো যায়? (আবার: এটি দুর্দান্ত)
সকরাটিক ফিনিক্স

18
এই ... এটি সম্পূর্ণ উন্মাদ। সমস্ত উত্তর এখনই +1।
স্কটনেট

28
উত্তরের উপরে ছোট পরিমাণে বিতরণ করতে ইচ্ছুক যে কোনও ব্যক্তির জন্য একটি সতর্কতা: আপনাকে প্রতিবার আপনার অনুদানের পরিমাণ দ্বিগুণ করতে হবে (যতক্ষণ না আপনি 500 টি আঘাত করেন), সুতরাং একক ব্যক্তি প্রতিটি উত্তরে একই পরিমাণ দিতে পারবেন না যদি না সেই পরিমাণ 500 রেপ হয়।
মার্টিন এন্ডার

23
এটি খুব সামান্য বোঝার সময় আমি কখনও স্ক্রোল করে ফেলেছি greatest
ইঞ্জিনিয়ার টোস্ট

678

পার্ট 2: ওটিসিএ মেটাপিক্সেল এবং ভারলাইফ

ওটিসিএ মেটাপিক্সেল

ওটিসিএ মেটাপিক্সেল
( উত্স )

OTCA Metapixel লাইফ Conway এর গেম একটি কনস্ট্রাক্ট কোনো জীবন্ত সেলুলার অটোমাটা সিমুলেট করতে ব্যবহার করা যেতে পারে। লাইফউইকি যেমন (উপরে লিঙ্কিত) বলেছেন,

ওটিসিএ মেটাপিক্সেল হ'ল একটি 2048 × 2048 পিরিয়ড 35328 ইউনিট সেল যা ব্রাইস ডিউ দ্বারা নির্মিত হয়েছিল ... এর অনেকগুলি সুবিধা রয়েছে ... লাইফের মতো সেলুলার অটোমেটনের অনুকরণ করার ক্ষমতা এবং জুম আউট হওয়ার পরে, চালু এবং বন্ধ করা সেলগুলি পার্থক্য করা সহজ ...

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

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

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

ওটিসিএ মেটাপিক্সেলের প্রতিটি দিকের আরও বিশদ চিত্রটি তার মূল ওয়েবসাইটে পাওয়া যাবে: এটি কীভাবে কাজ করে?

VarLife

আমি লাইফ-লাইনের নিয়মের একটি অনলাইন সিমুলেটর তৈরি করেছি যেখানে আপনি যে কোনও সেলকে জীবনের মতো নিয়ম অনুসারে আচরণ করতে পারবেন এবং এটিকে "জীবনের বিভিন্নতা" বলেছিলেন। আরও সংক্ষিপ্ত হওয়ার জন্য এই নামটি সংক্ষিপ্ত করে "ভারলিফ" করা হয়েছে। এটির একটি স্ক্রিনশট এখানে রয়েছে (এটির সাথে এখানে লিঙ্ক করুন: http://play.starmaninnovations.com/varLive/BeeHkfCpNR ):

ভারলিফ স্ক্রিনশট

উল্লেখযোগ্য বৈশিষ্ট্য:

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

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

বেসিক ভার্লাইফ সার্কিটরি

সব মিলিয়ে, ভার্লাইফ কম্পিউটারের জন্য কেবলমাত্র চার প্রকারের সেল দরকার! সমস্ত মৃত / জীবিত রাজ্যের গণনায় আটটি রাজ্য। তারা হ'ল:

  • বি / এস (কালো / সাদা), যা সমস্ত উপাদানগুলির মধ্যে বাফার হিসাবে কাজ করে যেহেতু বি / এস কোষগুলি জীবিত থাকতে পারে না।
  • বি 1 / এস (নীল / সায়ান), যা সিগন্যাল প্রচারের জন্য ব্যবহৃত প্রধান ঘর প্রকার।
  • বি 2 / এস (সবুজ / হলুদ), যা মূলত সিগন্যাল নিয়ন্ত্রণের জন্য ব্যবহৃত হয় তা নিশ্চিত করে এটি ব্যাকপ্রোপেট না করে doesn't
  • বি 12 / এস 1 (লাল / কমলা), যা কয়েকটি বিশেষ পরিস্থিতিতে যেমন সংকেতগুলি অতিক্রম এবং কিছুটা ডেটা সঞ্চয় করার জন্য ব্যবহৃত হয়।

ইতিমধ্যে এনকোডযুক্ত এই বিধিগুলি সহ ভারলিফটি খুলতে এই সংক্ষিপ্ত url ব্যবহার করুন: http://play.starmaninnovations.com/varLive/BeeHkfCpNR

পুতুল

বিভিন্ন বৈশিষ্ট্য সহ কয়েকটি ভিন্ন তারের ডিজাইন রয়েছে।

এটি ভারলিফের সবচেয়ে সহজ এবং সর্বাধিক প্রাথমিক ওয়্যার, সবুজ রঙের স্ট্রিপগুলির দ্বারা সজ্জিত নীল রঙের একটি স্ট্রিপ।

বেসিক তারের
সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/WcsGmjLiBF

এই তারের একমুখী এটি, এটি বিপরীত দিক দিয়ে ভ্রমণের চেষ্টা করে এমন কোনও সংকেতকে হত্যা করবে। এটি বেসিক তারের চেয়ে এককটি ঘর সংকীর্ণও।

একমুখী তারের
সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/ARWgUgPTEJ TE

ডায়াগোনাল তারগুলিও বিদ্যমান তবে সেগুলি মোটেও ব্যবহৃত হয় না।

তির্যক তার
সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/kJotsdSXIj

গেটস

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

এবং, এক্সওআর, বা লজিক গেটস
সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/EGTlKktmeI

"এএনটি গেট" সংক্ষেপে অ্যান্ড-নট গেটটি একটি গুরুত্বপূর্ণ উপাদান হিসাবে প্রমাণিত হয়েছিল। এটি এমন একটি গেট যা এ থেকে সিগন্যাল পাস করে কেবল এবং যদি বি থেকে কোনও সংকেত না পাওয়া যায় তবে, "এ এবং নট বি"।

এবং গেট
সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/RsZBiNqIUy

ঠিক একটি গেট না হলেও , একটি তারের ক্রসিং টাইল এখনও খুব গুরুত্বপূর্ণ এবং দরকারী।

তারের পারাপার
সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/OXMsPyaNTC

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

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

সার্কিটরি উপাদানগুলি অন্বেষণের প্রক্রিয়ায় আবিষ্কৃত / নির্মিত আরও গেটগুলি দেখতে, ফিনোটপিআই: বিল্ডিং ব্লকস: লজিক গেটস দ্বারা এই ব্লগ পোস্টটি দেখুন ।

বিলম্ব উপাদান

কম্পিউটারের হার্ডওয়্যার ডিজাইনের প্রক্রিয়াতে, কেজং নীচে দেখানো একাধিক বিলম্ব উপাদান তৈরি করেছে।

4-টিক বিলম্ব: সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/gebOMIXxdh
4 টিক দেরি

5-টিক বিলম্ব: সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/JItNjJvnUB
5 টিক দেরি

8-টিক বিলম্ব (তিনটি পৃথক এন্ট্রি পয়েন্ট): সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/nSTRaVEDvA
8 টিক দেরি

11-টিক বিলম্ব: সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/kfoADussXA
11 টিক দেরি

12-টিক বিলম্ব: সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/bkamAfUfud
12 টিক দেরি

14-টিক বিলম্ব: সংক্ষিপ্ত url: http://play.starmaninnovations.com/varLive/TkwzYIBWln
14 টিক দেরি

15 টিক বিলম্ব (সঙ্গে তুলনা করে যাচাই এই ): সংক্ষিপ্ত URL: http://play.starmaninnovations.com/varlife/jmgpehYlpT
15 টিক দেরি

ঠিক আছে, এটি ভার্লাইফের বেসিক সার্কিটরি উপাদানগুলির জন্য! কম্পিউটারের প্রধান সার্কিটরির জন্য কেজ্যাংয়ের হার্ডওয়্যার পোস্টটি দেখুন !


4
ভারলিফ এই প্রকল্পের অন্যতম চিত্তাকর্ষক অঙ্গ; এটি তুলনায় বহুমুখিতা এবং সরলতা, উদাহরণস্বরূপ, ওয়্যারওয়ার্ল্ড ফিনোমিনাল । ওটিসিএ মেটাপিক্সেল প্রয়োজনের তুলনায় অনেক বড় বলে মনে হচ্ছে, এটিকে গল্ফ করার কোনও প্রচেষ্টা আছে?
primo

@ প্রিমো: ডেভ গ্রিন তাতে খুব ভালো কাজ করছেন বলে মনে হচ্ছে। chat.stackexchange.com/transcript/message/40106098#40106098
এল'েন্ডিয়া স্টারম্যান

6
হ্যাঁ, এই উইকএন্ডে 512x512 হ্যাশলাইফ-বান্ধব মেটাসেল ( কনওএলাইফ / ফর্মস / ভিউটোপিক.এফপি?f=&p=51287# p51287 ) এর হৃদয়ে এই সপ্তাহান্তে একটি উন্নত পরিমাণে অগ্রগতি করেছে । আপনি যখন জুম বের হয়ে যাবেন তখন কোনও "পিক্সেল" অঞ্চল কক্ষের অবস্থার সংকেত দিতে চেয়েছিল তার উপর নির্ভর করে মেটাসেলটি কিছুটা ছোট করা যেতে পারে। এটি অবশ্যই যথাযথ 2 ^ N-আকারের টাইল বন্ধ হওয়া উচিত বলে মনে হচ্ছে, কারণ গলির হ্যাশলাইফ অ্যালগরিদম কম্পিউটারটিকে পুরোপুরি দ্রুত চালাতে সক্ষম হবে।
ডেভ গ্রিন 21

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

@ হিমডল যদিও এটি ভালভাবে কাজ করবে তবে টেট্রিস খেলার সময় এটি ভাল দেখাবে না।
মিল্কিওয়ে 90

649

পার্ট 3: হার্ডওয়্যার

লজিক গেটস এবং প্রসেসরের সাধারণ কাঠামো সম্পর্কে আমাদের জ্ঞান দিয়ে আমরা কম্পিউটারের সমস্ত উপাদানগুলির নকশা শুরু করতে পারি।

Demultiplexer

একটি ডেমাল্টিপ্লিক্সার, বা ডেমাক্স, রম, র‌্যাম এবং এএলইউর জন্য গুরুত্বপূর্ণ উপাদান। এটি কিছু প্রদত্ত নির্বাচক নির্বাচনের তথ্যের ভিত্তিতে অনেকগুলি আউটপুট সিগন্যালের একটিতে একটি ইনপুট সিগন্যালকে রুট করে। এটি 3 প্রধান অংশ নিয়ে গঠিত: সমান্তরাল রূপান্তরকারী থেকে একটি সিরিয়াল, একটি সিগন্যাল পরীক্ষক এবং একটি ঘড়ি সংকেত স্প্লিটার।

সিরিয়াল সিলেক্টর ডেটাটিকে "সমান্তরাল" রূপান্তর করে আমরা শুরু করি। এটি কৌশলগতভাবে ডেটা বিভক্তকরণ এবং বিলম্ব করার মাধ্যমে করা হয় যাতে বামতম 11x11 বর্গক্ষেত্রে ঘড়ির সংকেতকে ছেদ করে ডেটা, পরবর্তী বিট পরবর্তী 11x11 বর্গক্ষেত্রে ঘড়ির সংকেতকে ছেদ করে, এবং আরও কিছু করে। যদিও প্রতিটি বিট ডেটা প্রতি 11x11 স্কোয়ারে আউটপুট করা হবে, প্রতিটি বিট ডেটা কেবল একবার ক্লক সিগন্যালের সাথে ছেদ করবে।

সমান্তরাল রূপান্তরকারী থেকে সিরিয়াল

পরবর্তী, আমরা সমান্তরাল ডেটা কোনও প্রিসেট ঠিকানার সাথে মেলে কিনা তা পরীক্ষা করে দেখব। আমরা ঘড়ি এবং সমান্তরাল ডেটাতে AND এবং এএনটি গেটগুলি ব্যবহার করে এটি করি। তবে, আমাদের নিশ্চিত করতে হবে যে সমান্তরাল ডেটাও আউটপুট করা হয়েছে যাতে এটি আবার তুলনা করা যায়। এই যে দরজাগুলি আমি নিয়ে এসেছি:

সিগন্যাল চেকিং গেটস

শেষ পর্যন্ত, আমরা কেবল ক্লক সিগন্যালকে বিভক্ত করি, সংকেত চেকারগুলির একগুচ্ছ স্ট্যাক (প্রতিটি ঠিকানা / আউটপুটগুলির জন্য একটি) এবং আমাদের একটি মাল্টিপ্লেজার রয়েছে!

মাল্টিপ্লেক্সার

রম

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

রম বিট

এরপরে আমাদের কেবল সমান্তরাল সংকেতকে সিরিয়াল ডেটাতে রূপান্তর করতে হবে এবং রমটি সম্পূর্ণ।

সিরিয়াল রূপান্তরকারী সমান্তরাল

রম

বর্তমানে গলিতে একটি স্ক্রিপ্ট চালিয়ে রম তৈরি করা হয়েছে যা আপনার ক্লিপবোর্ড থেকে রমিতে অ্যাসেম্বলি কোডটি অনুবাদ করবে।

এসআরএল, এসএল, এসআরএ

এই তিনটি লজিক গেটগুলি বিট শিফটে ব্যবহৃত হয় এবং এগুলি আপনার সাধারণ আন্ডার, ওআর, এক্সওর ইত্যাদির চেয়ে জটিল these তথ্য। এই গেটগুলিতে দেওয়া দ্বিতীয় যুক্তি হ'ল কত বিট স্থানান্তরিত হবে।

এসএল এবং এসআরএল-এর জন্য আমাদের দরকার

  1. নিশ্চিত হয়ে নিন যে 12 টি উল্লেখযোগ্য বিট চালু নেই (অন্যথায় আউটপুট কেবল 0 হয়), এবং
  2. 4 টি কমপক্ষে উল্লেখযোগ্য বিটের ভিত্তিতে ডেটা সঠিক পরিমাণে বিলম্ব করুন।

এটি অ্যান্ড / এএনটি গেট এবং একটি মাল্টিপ্লেজারের একগুচ্ছ সাথে করণীয়।

SRL:

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

SRA

সেট-রিসেট (এসআর) ল্যাচ

প্রসেসরের কার্যকারিতার অনেক অংশ ডেটা সঞ্চয় করার দক্ষতার উপর নির্ভর করে। ২ টি লাল বি 12 / এস 1 কোষ ব্যবহার করে আমরা এটি করতে পারি। দুটি ঘর একে অপরকে চালিয়ে যেতে পারে এবং একসাথে বন্ধ থাকতে পারে। কিছু অতিরিক্ত সেট, রিসেট এবং সার্কিটরি পড়ার সাহায্যে আমরা একটি সাধারণ এসআর ল্যাচ তৈরি করতে পারি।

এসআর ল্যাচ

সিংক্রোনাইসার

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

সিংক্রোনাইসার

কাউন্টার পড়ুন

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

দুই বিট কাউন্টার

রিড কাউন্টার তৈরি করতে, আমাদের দুটি এএনটি গেট দিয়ে উপযুক্ত ঠিকানা মোডে কাউন্টারটি সেট করতে হবে এবং ঘড়ির সংকেতটি কোথায় পরিচালনা করতে হবে তা সিদ্ধান্ত নিতে কাউন্টারটির আউটপুট সিগন্যালটি ব্যবহার করতে হবে: এএলইউ বা র‌্যামের কাছে।

কাউন্টার পড়ুন

সারি পড়ুন

পঠন-কাতারে রেকর্ড করা দরকার যে পড়ার কাউন্টারটি কোনও র‌্যামকে একটি ইনপুট প্রেরণ করেছে, যাতে এটি র‌্যামের আউটপুটটিকে সঠিক স্থানে প্রেরণ করতে পারে। এটি করতে, আমরা কয়েকটি এসআর ল্যাচ ব্যবহার করি: প্রতিটি ইনপুটগুলির জন্য একটি ল্যাচ। কোনও পঠন কাউন্টার থেকে র‌্যামে যখন একটি সংকেত প্রেরণ করা হয়, তখন ক্লক সংকেতটি বিভক্ত হয়ে কাউন্টারটির এসআর ল্যাচ সেট করে। র‌্যামের আউটপুটটি এসআর ল্যাচ সহ অ্যান্ডেড হয় এবং র‌্যামের ক্লক সংকেতটি এসআর ল্যাচটিকে পুনরায় সেট করে।

সারি পড়ুন

ALU

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

ALU

র্যাম

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

প্রতিটি 22x22 মেটাপিক্সেল র‌্যাম ইউনিটের এই প্রাথমিক কাঠামোটি রয়েছে:

র‌্যাম ইউনিট

পুরো র‌্যামকে একসাথে রেখে আমরা এমন কিছু পাই যা দেখতে দেখতে এই রকম হয়:

র্যাম

একসাথে সব কিছু রাখা

এই উপাদান এবং সাধারণ কম্পিউটার আর্কিটেকচার বর্ণিত সব ব্যবহার সংক্ষিপ্ত বিবরণ , আমরা একটি কাজ কম্পিউটার গঠন করা যেতে পারে!

ডাউনলোডগুলি: - সমাপ্ত টেট্রিস কম্পিউটার - রম তৈরির স্ক্রিপ্ট, খালি কম্পিউটার এবং প্রাইম ফাইন্ডিং কম্পিউটার

কম্পিউটার


49
আমি কেবল বলতে চাই যে এই পোস্টের চিত্রগুলি যে কোনও কারণেই হোক না কেন, আমার মতে খুব সুন্দর। : পি +1
হাইপার নিউট্রিনো

7
এটি আমি এখনও অবাক করা সবচেয়ে আশ্চর্যজনক জিনিস .... আমি পারলে +20 করতাম
ফ্যান্টাসি

3
@tfbninja আপনি পারেন, এটিকে একটি অনুগ্রহ বলা হয় এবং আপনি 200 খ্যাতি দিতে পারেন।
ফ্যাবিয়ান রোলিং 13

10
এই প্রসেসরটি স্পেক্টর এবং মেল্টডাউন আক্রমণের জন্য কি দুর্বল? :)
ফেরিবিগ

5
@ ফেরিবিগের কোনও শাখার পূর্বাভাস নেই, তাই আমি সন্দেহ করি।
জেএডি

621

পার্ট 4: কিউএফটিএএসএম এবং কোগল

আর্কিটেকচার ওভারভিউ

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

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

ব্যবহারযোগ্যতা বাড়ানোর সময় আমাদের প্রসেসরটিকে সহজ রাখার জন্য, আমরা বেশ কয়েকটি গুরুত্বপূর্ণ ডিজাইনের সিদ্ধান্ত নিয়েছি:

  • কোনও রেজিস্টার নেই। র্যামের প্রতিটি ঠিকানাকে সমানভাবে চিকিত্সা করা হয় এবং কোনও ক্রিয়াকলাপের জন্য কোনও যুক্তি হিসাবে ব্যবহার করা যেতে পারে। এক অর্থে, এর অর্থ এই যে সমস্ত র‌্যাম রেজিস্টারের মতো আচরণ করা যেতে পারে। এর অর্থ এই যে কোনও বিশেষ লোড / স্টোর নির্দেশাবলী নেই।
  • অনুরূপ শিরাতে, মেমরি-ম্যাপিং। যা কিছু লেখা বা পঠন করা যায় সেগুলি একীভূত ঠিকানা স্কিম ভাগ করে। এর অর্থ হল প্রোগ্রামের কাউন্টার (পিসি) ঠিকানা 0 এবং নিয়মিত নির্দেশাবলী এবং নিয়ন্ত্রণ-প্রবাহ নির্দেশাবলীর মধ্যে একমাত্র পার্থক্য হ'ল নিয়ন্ত্রণ-প্রবাহ নির্দেশাবলী ঠিকানা 0 ব্যবহার করে।
  • ডেটা ট্রান্সমিশনে সিরিয়াল, স্টোরেজের সমান্তরালে। আমাদের কম্পিউটারের "ইলেকট্রন"-ভিত্তিক প্রকৃতির কারণে ডেটা সিরিয়াল লিটল-এন্ডিয়ান (সর্বনিম্ন-উল্লেখযোগ্য বিট প্রথমে) আকারে সঞ্চারিত হলে সংযোজন এবং বিয়োগফলগুলি কার্যকরভাবে কার্যকর করা যায়। তদুপরি, সিরিয়াল তথ্যগুলি জটিল ডেটা বাসগুলির প্রয়োজনীয়তা সরিয়ে দেয়, যা উভয়ই যথাযথভাবে প্রশস্ত এবং জটিল সময়ে যথাযথভাবে হয় (ডেটা একসাথে থাকার জন্য, বাসের সমস্ত "লেন" একই ভ্রমণ দেরি করতে হবে)।
  • হার্ভার্ড আর্কিটেকচার, যার অর্থ প্রোগ্রাম মেমোরি (আরওএম) এবং ডেটা মেমরি (র‌্যাম) এর মধ্যে একটি বিভাগ। যদিও এটি প্রসেসরের নমনীয়তা হ্রাস করে, এটি আকারের অপ্টিমাইজেশনে সহায়তা করে: প্রোগ্রামটির দৈর্ঘ্য আমাদের যে পরিমাণ র‌্যামের প্রয়োজন হবে তার চেয়ে অনেক বেশি, তাই আমরা প্রোগ্রামটি রমকে বিভক্ত করতে পারি এবং তারপরে রম সংক্ষেপণের উপর ফোকাস করতে পারি focus , যখন এটি কেবলমাত্র পঠনযোগ্য হয় তত বেশি সহজ।
  • 16-বিট ডেটা প্রস্থ। এটি স্ট্যান্ডার্ড টেট্রিস বোর্ডের (10 টি ব্লক) চেয়ে বৃহত্তর দুটিটির ক্ষুদ্রতম শক্তি। এটি আমাদের -32768 থেকে +32767 এর একটি ডেটা পরিসীমা এবং 65536 নির্দেশাবলীর সর্বাধিক প্রোগ্রামের দৈর্ঘ্য দেয়। (2 ^ 8 = 256 নির্দেশাবলী সর্বাধিক সহজ জিনিসগুলির জন্য যথেষ্ট যা আমরা খেলনা প্রসেসরটি করতে চাই, তবে টেট্রিস নয় not)
  • অ্যাসিঙ্ক্রোনাস ডিজাইন। কম্পিউটারের সময় নির্ধারণের সময় কেন্দ্রীয় ঘড়ি (বা সমতুল্য কয়েকটি ঘড়ি) রাখার পরিবর্তে সমস্ত ডেটা একটি "ক্লক সিগন্যাল" সহ থাকে যা কম্পিউটারের চারদিকে প্রবাহিত হওয়ার সাথে সাথে ডেটার সমান্তরালে ভ্রমণ করে। কিছু পাথ অন্যের চেয়ে সংক্ষিপ্ত হতে পারে এবং এটি কেন্দ্রীয়ভাবে ক্লকড ডিজাইনের ক্ষেত্রে অসুবিধা তৈরি করতে পারে, তবুও একটি অ্যাসিনক্রোনাস ডিজাইন সহজেই পরিবর্তনশীল-সময়ের ক্রিয়াকলাপ মোকাবেলা করতে পারে।
  • সমস্ত নির্দেশাবলী সমান আকারের। আমরা অনুভব করেছি যে একটি আর্কিটেকচার যেখানে প্রতিটি নির্দেশে 3 টি অপেরেন্ড (মান মান গন্তব্য) সহ 1 টি অপকোড থাকে সর্বাধিক নমনীয় বিকল্প। এটি বাইনারি ডেটা অপারেশনগুলির পাশাপাশি শর্তাধীন চলনগুলিকে অন্তর্ভুক্ত করে।
  • সাধারণ অ্যাড্রেসিং মোড সিস্টেম। অ্যারে বা পুনরাবৃত্তির মতো বিষয়গুলিকে সমর্থন করার জন্য বিভিন্ন ধরণের অ্যাড্রেসিং মোড থাকা খুব দরকারী। আমরা তুলনামূলক সহজ সিস্টেম সহ বেশ কয়েকটি গুরুত্বপূর্ণ সম্বোধন মোড বাস্তবায়ন করতে সক্ষম হয়েছি।

আমাদের স্থাপত্যের একটি চিত্র ওভারভিউ পোস্টে রয়েছে।

কার্যকারিতা এবং ALU অপারেশন

এখান থেকে, আমাদের প্রসেসরের কী কার্যকারিতা থাকা উচিত তা নির্ধারণের বিষয়টি ছিল। বাস্তবায়নের স্বাচ্ছন্দ্যের পাশাপাশি প্রতিটি কমান্ডের বহুমুখিতা সম্পর্কে বিশেষ মনোযোগ দেওয়া হয়েছিল।

শর্তাধীন পদক্ষেপ

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

আমরা দুটি ভিন্ন ধরণের শর্তসাপেক্ষ চলন বেছে নিয়েছি: "শূন্য না হলে সরানো" ( MNZ) এবং "শূন্যের চেয়ে কম হলে সরানো" ( MLZ)। কার্যকরীভাবে, MNZডেটাতে কোনও বিট 1 MLZআছে কিনা তা পরীক্ষা করার পরিমাণ , যখন সাইন বিট 1 হয় কিনা তা যাচাইয়ের পরিমাণ respectively এগুলি যথাক্রমে সমতা এবং তুলনার জন্য কার্যকর। কারণ আমরা যেমন "শূন্য যদি সরাতে" হিসাবে অন্যদের উপর এই দুটি বেছে নেওয়া হয়েছে ( MEZ) অথবা "যদি বেশি শূন্য সরাতে" ( MGZ) ছিল MEZএকটি খালি সংকেত থেকে একটি সত্য সংকেত তৈরি করতে হবে, যখন MGZএকটি আরো জটিল চেক করা হয়, প্রয়োজন কমপক্ষে অন্য একটি বিট 1 হতে সাইন বিট 0 হবে।

পাটীগণিত

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

আমরা নেতিবাচক সংখ্যার জন্য 2 এর পরিপূরক প্রতিনিধিত্ব ব্যবহার করতে বেছে নিয়েছি, কারণ এটি সংযোজন এবং বিয়োগ আরও বেশি ধারাবাহিক করে তোলে। এটি লক্ষণীয় যে ওয়্যারওয়ার্ল্ড কম্পিউটার 1 এর পরিপূরক ব্যবহার করেছে।

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

বিটওয়াইজ অপারেশনস

আমাদের প্রসেসরের রয়েছে AND, ORএবং XORনির্দেশাবলী যা আপনার প্রত্যাশা অনুযায়ী করবে। বদলে আছে NOTনির্দেশ, আমরা একটি "এবং নয়" (আছে বেছে নেওয়া হয়েছে ANT) নির্দেশনা। NOTনির্দেশের সাথে অসুবিধাটি আবার এটি হ'ল সিগন্যালের অভাব থেকে সিগন্যাল তৈরি করতে হবে, যা সেলুলার অটোম্যাটাতে কঠিন। ANTপ্রথম আর্গুমেন্ট বিট 1 এবং দ্বিতীয় আর্গুমেন্ট বিট 0 হলে নির্দেশটি কেবল 1 প্রদান করে Thus সুতরাং, (পাশাপাশি ) এর NOT xসমতুল্য । তদ্ব্যতীত, বহুমুখী এবং এটি মাস্কিংয়ের মূল সুবিধা রয়েছে: টেট্রিস প্রোগ্রামের ক্ষেত্রে আমরা এটি টেট্রোমিনোসগুলি মুছতে ব্যবহার করি।ANT -1 xXOR -1 xANT

বিট স্থানান্তর

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

আমাদের প্রসেসরের তিন বিট শিফট অপারেশন রয়েছে, "শিফট বাম" ( SL), "শিফট ডান লজিকাল" ( SRL) এবং "শিফট ডান পাটিগণিত" ( SRA)। প্রথম দুটি বিট শিফট ( SLএবং SRL) নতুন বিটগুলি সমস্ত শূন্যের সাথে পূরণ করে (যার অর্থ একটি নেগেটিভ সংখ্যা ডান স্থানান্তরিত হবে না negativeণাত্মক হবে না)। যদি শিফ্টের দ্বিতীয় তর্কটি 0 থেকে 15 এর সীমার বাইরে থাকে তবে ফলাফলটি সমস্ত শূন্য, যেমনটি আপনি আশা করতে পারেন। শেষ বিট শিফটের জন্য, SRAবিট শিফটটি ইনপুটটির চিহ্নটি সংরক্ষণ করে এবং তাই দুটি দ্বারা সত্যিকারের বিভাগ হিসাবে কাজ করে।

নির্দেশ পাইপলাইনিং

আর্কিটেকচারের কিছু কৌতুকপূর্ণ বিবরণ সম্পর্কে কথা বলার এখনই সময়। প্রতিটি সিপিইউ চক্র নিম্নলিখিত পাঁচটি পদক্ষেপ নিয়ে গঠিত:

1. রম থেকে বর্তমান নির্দেশ আনুন

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

ওপকোডটি 16 টি অনন্য অপকডকে সমর্থন করার জন্য 4 বিট, যার মধ্যে 11 টি নিয়োগ করা হয়েছে:

0000  MNZ    Move if Not Zero
0001  MLZ    Move if Less than Zero
0010  ADD    ADDition
0011  SUB    SUBtraction
0100  AND    bitwise AND
0101  OR     bitwise OR
0110  XOR    bitwise eXclusive OR
0111  ANT    bitwise And-NoT
1000  SL     Shift Left
1001  SRL    Shift Right Logical
1010  SRA    Shift Right Arithmetic
1011  unassigned
1100  unassigned
1101  unassigned
1110  unassigned
1111  unassigned

২. র্যামের পূর্ববর্তী নির্দেশনার ফলাফল (প্রয়োজনে) লিখুন

পূর্ববর্তী নির্দেশের শর্তের উপর নির্ভর করে (যেমন শর্তাধীন পদক্ষেপের জন্য প্রথম যুক্তির মান), একটি লেখা সম্পাদন করা হয়। লেখার ঠিকানা পূর্ববর্তী নির্দেশের তৃতীয় অপারেন্ড দ্বারা নির্ধারিত হয়।

এটি লক্ষ করা গুরুত্বপূর্ণ যে নির্দেশাবলী আনার পরে লেখাগুলি ঘটে। এটি একটি শাখার বিলম্ব স্লট তৈরির দিকে পরিচালিত করে যেখানে শাখার নির্দেশের সাথে সাথে নির্দেশটি (পিসিটিতে যে কোনও ক্রিয়াকলাপ লিখে থাকে) শাখার লক্ষ্যমাত্রায় প্রথম নির্দেশের পরিবর্তে কার্যকর করা হয়।

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

সংক্ষেপে, পরবর্তী নির্দেশের আউটপুট আনার পরে আগের নির্দেশিকার আউটপুটটি র‌্যামে লেখা হয়, শর্তসাপেক্ষে লাফ দেওয়ার পরে ফাঁকা নির্দেশনা থাকা দরকার, অন্যথায় পিসি লাফের জন্য সঠিকভাবে আপডেট করা হবে না।

৩. র্যাম থেকে বর্তমান নির্দেশের যুক্তিগুলির জন্য ডেটা পড়ুন

পূর্বে উল্লিখিত হিসাবে, তিনটি অপারেন্ডের প্রত্যেকটিতে একটি ডেটা শব্দ এবং একটি ঠিকানা মোড উভয়ই থাকে। ডেটা শব্দটি 16 বিট, র‌্যামের সমান প্রস্থ। ঠিকানা মোড 2 বিট।

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

আমরা হার্ড-কোডেড নম্বরগুলি অপারেন্ড হিসাবে ব্যবহার করার এবং ডেটা ঠিকানাগুলি অপারেশন হিসাবে ব্যবহার করার ধারণাগুলি একত্রিত করার চেষ্টা করেছি। এটি পাল্টা-ভিত্তিক ঠিকানার মোড তৈরি করার দিকে পরিচালিত করেছিল: কোনও অপারেন্ডের অ্যাড্রেসিং মোড কেবল এমন একটি সংখ্যা যা প্রতিনিধিত্ব করে যা কোনও র‌্যাম রিড লুপের চারপাশে কতবার ডেটা প্রেরণ করা উচিত। এটি তাত্ক্ষণিক, প্রত্যক্ষ, অপ্রত্যক্ষ এবং ডাবল-অপ্রত্যক্ষ ঠিকানা সম্বোধন করে।

00  Immediate:  A hard-coded value. (no RAM reads)
01  Direct:  Read data from this RAM address. (one RAM read)
10  Indirect:  Read data from the address given at this address. (two RAM reads)
11  Double-indirect: Read data from the address given at the address given by this address. (three RAM reads)

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

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

৪. ফলাফল গণনা করুন

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

ওপকোড এবং প্রথম অপারেন্ড অবস্থাটি গণনা করতে ব্যবহৃত হয়, যা মেমোরিতে ফলাফল লিখতে হবে কিনা তা নির্ধারণ করে। শর্তাধীন পদক্ষেপের ক্ষেত্রে, এর অর্থ হয় অপারেন্ডের কোনও বিট 1 (for MNZ) কিনা তা নির্ধারণ করা, বা সাইন বিট 1 (for MLZ) কিনা তা নির্ধারণ করা । যদি অপকোড শর্তসাপেক্ষ পদক্ষেপ না হয় তবে লেখার ক্ষেত্রে সর্বদা কার্য সম্পাদন করা হয় (শর্তটি সর্বদা সত্য)।

৫. প্রোগ্রামের কাউন্টার বাড়ানো

শেষ পর্যন্ত, প্রোগ্রামের কাউন্টারটি পড়া, বর্ধিত এবং লিখিত হয়।

নির্দেশিকা পাঠ এবং নির্দেশনা লেখার মধ্যে পিসি বর্ধনের অবস্থানের কারণে, এর অর্থ হ'ল যে নির্দেশ যা পিসিকে 1 দ্বারা বৃদ্ধি করে তা কোনও অপ-অপশন নয়। পিসি নিজেই অনুলিপি করে এমন একটি নির্দেশের ফলে পরবর্তী নির্দেশগুলি পরপর দু'বার সম্পাদিত হয়। তবে, সতর্কতা অবলম্বন করুন, একের পর এক বহু পিসি নির্দেশাবলী যদি আপনি নির্দেশের পাইপলাইনে মনোযোগ না দেন তবে অসীম লুপিং সহ জটিল প্রভাব ফেলতে পারে।

টেট্রিস অ্যাসেমব্লির জন্য অনুসন্ধান

আমরা আমাদের প্রসেসরের জন্য কিউএফটিএএসএম নামে একটি নতুন সমাবেশ ভাষা তৈরি করেছি। এই সমাবেশ ভাষাটি কম্পিউটারের রোমে মেশিন কোডের সাথে 1-থেকে-1 এর সাথে সম্পর্কিত।

যে কোনও কিউএফটিএএসএম প্রোগ্রামটি প্রতি লাইনে এক নির্দেশের সিরিজ হিসাবে লেখা হয় line প্রতিটি লাইন এভাবে বিন্যাস করা হয়:

[line numbering] [opcode] [arg1] [arg2] [arg3]; [optional comment]

অপকোড তালিকা

যেমনটি আগে আলোচনা করা হয়েছে, এখানে কম্পিউটার দ্বারা সমর্থিত এগারটি অপকড রয়েছে, যার প্রতিটিটিতে তিনটি অপারেট রয়েছে:

MNZ [test] [value] [dest]  – Move if Not Zero; sets [dest] to [value] if [test] is not zero.
MLZ [test] [value] [dest]  – Move if Less than Zero; sets [dest] to [value] if [test] is less than zero.
ADD [val1] [val2] [dest]   – ADDition; store [val1] + [val2] in [dest].
SUB [val1] [val2] [dest]   – SUBtraction; store [val1] - [val2] in [dest].
AND [val1] [val2] [dest]   – bitwise AND; store [val1] & [val2] in [dest].
OR [val1] [val2] [dest]    – bitwise OR; store [val1] | [val2] in [dest].
XOR [val1] [val2] [dest]   – bitwise XOR; store [val1] ^ [val2] in [dest].
ANT [val1] [val2] [dest]   – bitwise And-NoT; store [val1] & (![val2]) in [dest].
SL [val1] [val2] [dest]    – Shift Left; store [val1] << [val2] in [dest].
SRL [val1] [val2] [dest]   – Shift Right Logical; store [val1] >>> [val2] in [dest]. Doesn't preserve sign.
SRA [val1] [val2] [dest]   – Shift Right Arithmetic; store [val1] >> [val2] in [dest], while preserving sign.

সম্বোধন মোড

অপারেটরগুলির প্রত্যেকটিতে একটি ডেটা মান এবং একটি ঠিকানা সরানো থাকে contains -32768 থেকে 32767 সীমাতে দশমিক সংখ্যা দ্বারা ডেটা মান বর্ণিত হয় The

mode    name               prefix
0       immediate          (none)
1       direct             A
2       indirect           B
3       double-indirect    C 

উদাহরণ কোড

পাঁচ লাইনে ফিবোনাচি ক্রম:

0. MLZ -1 1 1;    initial value
1. MLZ -1 A2 3;   start loop, shift data
2. MLZ -1 A1 2;   shift data
3. MLZ -1 0 0;    end loop
4. ADD A2 A3 1;   branch delay slot, compute next term

এই কোডটি ফিবোনাচি সিক্যুয়েন্সটি গণনা করে, বর্তমান পদটি র‌্যামের ঠিকানা 1 সহ। এটি 28657 এর পরে দ্রুত উপচে পড়েছে।

ধূসর কোড:

0. MLZ -1 5 1;      initial value for RAM address to write to
1. SUB A1 5 2;      start loop, determine what binary number to covert to Gray code
2. SRL A2 1 3;      shift right by 1
3. XOR A2 A3 A1;    XOR and store Gray code in destination address
4. SUB B1 42 4;     take the Gray code and subtract 42 (101010)
5. MNZ A4 0 0;      if the result is not zero (Gray code != 101010) repeat loop
6. ADD A1 1 1;      branch delay slot, increment destination address

এই প্রোগ্রামটি গ্রে কোডটি গণনা করে এবং কোডটি 5 নম্বর থেকে শুরু করে স্যাকসেসিভ ঠিকানায় সংরক্ষণ করে This ফলাফল গ্রে গ্রে কোড হয়ে যাওয়ার পরে এটি বন্ধ হয়ে যায় 101010, যা ৫ address ঠিকানায় ইনপুট ৫০ এর জন্য ঘটে।

অনলাইন দোভাষী

El'endia Starman খুব দরকারী অনলাইন অনুবাদক সৃষ্টি করেছেন এখানে । আপনি কোডটি পদক্ষেপ নিতে পারবেন, ব্রেকপয়েন্টগুলি সেট করতে পারবেন, র‌্যামকে ম্যানুয়াল রাইটিং সম্পাদন করতে পারবেন এবং র‌্যামকে প্রদর্শন হিসাবে দৃশ্যমান করতে পারবেন।

Cogol

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

কোগোল সমাবেশ ভাষার ঠিক উপরে একটি স্তরে বিদ্যমান। সাধারণত, একটি কোগল প্রোগ্রামের বেশিরভাগ লাইন প্রতিটি সমাবেশের একক লাইনের সাথে মিলে যায় তবে ভাষার কয়েকটি গুরুত্বপূর্ণ বৈশিষ্ট্য রয়েছে:

  • বুনিয়াদি বৈশিষ্ট্যগুলির মধ্যে অ্যাসাইনমেন্ট এবং অপারেটরগুলির সাথে নামযুক্ত ভেরিয়েবলগুলি রয়েছে যাতে আরও পাঠযোগ্য সিনট্যাক্স থাকে synt উদাহরণস্বরূপ, ঠিকানার সাথে সংকলক ম্যাপিং ভেরিয়েবলগুলি সহ ADD A1 A2 3হয়ে যায় z = x + y;
  • লুপিং নির্মাণগুলি যেমন if(){}, while(){}এবং do{}while();তাই সংকলক শাখা পরিচালনা করে ing
  • এক-মাত্রিক অ্যারে (পয়েন্টার পাটিগণিত সহ), যা টেট্রিস বোর্ডের জন্য ব্যবহৃত হয়।
  • সাবরুটাইনস এবং একটি কল স্ট্যাক। কোডগুলির বৃহত অংশগুলির সদৃশতা রোধ এবং পুনরাবৃত্তি সমর্থন করার জন্য এগুলি কার্যকর।

সংকলক (যা আমি স্ক্র্যাচ থেকে লিখেছি) খুব বেসিক / নির্বোধ, তবে আমি সংক্ষিপ্ত সংকলিত প্রোগ্রামের দৈর্ঘ্য অর্জন করতে বেশ কয়েকটি ভাষা নির্মাতাকে হাত-অনুকূল করতে চেষ্টা করেছি।

বিভিন্ন ভাষার বৈশিষ্ট্যগুলি কীভাবে কাজ করে তার কয়েকটি সংক্ষিপ্ত বিবরণ এখানে দেওয়া হল:

Tokenization

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

পদান্বয়

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

গ্লোবাল মেমরি বরাদ্দ

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

IF-ELSE বিবৃতি

if-elseবিবৃতিগুলির জন্য সিনট্যাক্সটি স্ট্যান্ডার্ড সি ফর্ম:

other code
if (cond) {
  first body
} else {
  second body
}
other code

যখন কিউএফটিএএসএম তে রূপান্তরিত হয়, কোডটি এইভাবে সাজানো হয়:

other code
condition test
conditional jump
first body
unconditional jump
second body (conditional jump target)
other code (unconditional jump target)

যদি প্রথম বডি কার্যকর করা হয় তবে দ্বিতীয় বডিটি এড়িয়ে যায়। প্রথম বডিটি যদি এড়িয়ে যায় তবে দ্বিতীয় শরীরটি কার্যকর করা হয়।

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

যদি elseবিবৃতিটি বাদ দেওয়া হয় তবে নিঃশর্ত জাম্পটিও বাদ দেওয়া হয় এবং কিউএফটিএএসএম কোডটি দেখতে এমন দেখাচ্ছে:

other code
condition test
conditional jump
body
other code (conditional jump target)

WHILE বিবৃতি

whileবিবৃতিগুলির জন্য সিনট্যাক্সটিও স্ট্যান্ডার্ড সি ফর্ম:

other code
while (cond) {
  body
}
other code

যখন কিউএফটিএএসএম তে রূপান্তরিত হয়, কোডটি এইভাবে সাজানো হয়:

other code
unconditional jump
body (conditional jump target)
condition test (unconditional jump target)
conditional jump
other code

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

একটি MLZনির্দেশনা যেমন অসম্পূর্ণতা পরিচালনা করতে ব্যবহার করা হয় >বা যেমন <=ifবিবৃতি দেওয়ার সময় ভিন্ন , একটি MNZনির্দেশনা হ্যান্ডেল করার জন্য ব্যবহৃত হয় !=, যেহেতু এটি শরীরে লাফ দেয় যখন পার্থক্যটি শূন্য হয় না (এবং তাই যখন যুক্তি সমান হয় না)।

DO-WHILE বিবৃতি

whileএবং এর মধ্যে একমাত্র পার্থক্য do-whileহ'ল do-whileলুপের বডিটি প্রাথমিকভাবে এড়িয়ে যায় না তাই এটি সর্বদা কমপক্ষে একবার কার্যকর করা হয়। do-whileযখন আমি জানি লুপ কখনই পুরোপুরি ছেড়ে যায় না তখন আমি সাধারণত সমাবেশ কোডের কয়েকটি লাইন সংরক্ষণ করতে বিবৃতি ব্যবহার করি ।

অ্যারেগুলির

এক-মাত্রিক অ্যারেগুলি মেমরির সংলগ্ন ব্লক হিসাবে প্রয়োগ করা হয়। সমস্ত অ্যারে তাদের ঘোষণার ভিত্তিতে স্থির দৈর্ঘ্য। অ্যারেগুলি এভাবে ঘোষিত হয়:

my alpha[3];               # empty array
my beta[11] = {3,2,7,8};   # first four elements are pre-loaded with those values

অ্যারের জন্য, এটি একটি সম্ভাব্য র‌্যাম ম্যাপিং, এটি দেখায় কিভাবে অ্যারেটির জন্য 15-18 ঠিকানাগুলি সংরক্ষিত থাকে:

15: alpha
16: alpha[0]
17: alpha[1]
18: alpha[2]

লেবেলযুক্ত ঠিকানাটির alphaঅবস্থানের জন্য একটি পয়েন্টার দিয়ে ভরাট করা হয়েছে alpha[0], সুতরাং থাই কেস এড্রেসে 15 মান রয়েছে The alphaভেরিয়েবলটি কোগল কোডের অভ্যন্তরে ব্যবহার করা যেতে পারে, সম্ভবত আপনি যদি এই অ্যারেটিকে স্ট্যাক হিসাবে ব্যবহার করতে চান তবে সম্ভবত স্ট্যাক পয়েন্টার হিসাবে ।

একটি অ্যারের উপাদান অ্যাক্সেস স্ট্যান্ডার্ড array[index]স্বরলিপি দিয়ে সম্পন্ন করা হয়। যদি মানটি indexধ্রুবক হয়, তবে এই রেফারেন্সটি স্বয়ংক্রিয়ভাবে সেই উপাদানটির পরম ঠিকানা দিয়ে পূর্ণ হয়ে যায়। অন্যথায় এটি কাঙ্ক্ষিত পরম ঠিকানা খুঁজতে কিছু পয়েন্টার গাণিতিক (কেবল সংযোজন) সম্পাদন করে। বাসা অনুসারে সূচি তৈরি করাও সম্ভব alpha[beta[1]]

সাবরুটাইনস এবং কলিং

সাবরুটাইনগুলি কোডের ব্লক যা একাধিক প্রসঙ্গ থেকে কল করা যেতে পারে, কোডের নকল রোধ করে এবং পুনরাবৃত্ত প্রোগ্রামগুলি তৈরি করার অনুমতি দেয়। ফিবোনাচি নম্বর (মূলত সবচেয়ে ধীরতম অ্যালগরিদম) তৈরি করতে এখানে একটি পুনরাবৃত্ত সাববারোটিন সহ একটি প্রোগ্রাম রয়েছে:

# recursively calculate the 10th Fibonacci number
call display = fib(10).sum;
sub fib(cur,sum) {
  if (cur <= 2) {
    sum = 1;
    return;
  }
  cur--;
  call sum = fib(cur).sum;
  cur--;
  call sum += fib(cur).sum;
}

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

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

RAM map:
0: pc
1: display
2: scratch0
3: fib
4: scratch1
5: scratch2
6: scratch3
7: call

fib map:
0: return
1: previous_call
2: cur
3: sum

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

সাবড্রোটিন কল করার একাধিক উপায় রয়েছে, সমস্ত callকীওয়ার্ডটি ব্যবহার করে :

call fib(10);   # subroutine is executed, no return vaue is stored

call pointer = fib(10);   # execute subroutine and return a pointer
display = pointer.sum;    # access a local variable and assign it to a global variable

call display = fib(10).sum;   # immediately store a return value

call display += fib(10).sum;   # other types of assignment operators can also be used with a return value

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

পয়েন্টারগুলি সাব্রোটিনের একাধিক স্থানীয় ভেরিয়েবলগুলি অ্যাক্সেস করার একটি উপায়, যদিও এটি উল্লেখ করা গুরুত্বপূর্ণ যে পয়েন্টারটি কেবলমাত্র অস্থায়ী: পয়েন্টারটি যে ডেটাটিকে নির্দেশ করে সেটি অন্য ধ্বংস হয়ে যাবে যখন অন্য সাব্রোটিন কল করা হবে।

ডিবাগিং লেবেলগুলি

{...}একটি কোগল প্রোগ্রামের যে কোনও কোড ব্লকের আগে বহু-শব্দের বর্ণনামূলক লেবেল থাকতে পারে। এই লেবেলটি সংকলিত সমাবেশ কোডে একটি মন্তব্য হিসাবে সংযুক্ত করা হয়েছে এবং এটি ডিবাগিংয়ের জন্য খুব কার্যকর হতে পারে যেহেতু কোডটির নির্দিষ্ট অংশগুলি সনাক্ত করা সহজ করে তোলে।

শাখা বিলম্ব স্লট অপ্টিমাইজেশন

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

কোগলে টেট্রিস কোড লেখা

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


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

1
আপনি বলেছিলেন যে =কেবল নিজের পাশে দাঁড়াতে পারে তবে একটি আছে !=
ফ্যাবিয়ান রোলিং

@ ফ্যাবিয়ান এবং+=
অলিফান্ট

@ অলিফ্যান্ট হ্যাঁ আমার বর্ণনাটি যথাযথভাবে সঠিক ছিল না, এটি একটি চরিত্রগত-শ্রেণীর জিনিস, যেখানে নির্দিষ্ট শ্রেণির অক্ষর একে অপরের সাথে সংলগ্ন হতে পারে।
ফিনোটপিআই

606

পঞ্চম অংশ: সমাবেশ, অনুবাদ এবং ভবিষ্যত

সংকলক থেকে আমাদের সমাবেশ প্রোগ্রামের সাথে, এখন সময় এসেছে ভার্চ্যুয়াল কম্পিউটারের জন্য একটি রম একত্রিত করার, এবং সবকিছুকে একটি বৃহত্তর জিএল প্যাটার্নে অনুবাদ করার!

সমাবেশ

Programতিহ্যবাহী প্রোগ্রামিংয়ের মতো অ্যাসেম্বলি প্রোগ্রামটি সমবেত করা ঠিক একইভাবে করা হয়: প্রতিটি নির্দেশকে বাইনারি সমতলে অনুবাদ করা হয়, এবং সেগুলি পরে একটি বৃহত বাইনারি ব্লবকে সংযুক্ত করা হয় যা আমরা একটি এক্সিকিউটেবল বলি। আমাদের জন্য, কেবল পার্থক্যটি হল, বাইনারি ব্লবটি ভার্চলাইট সার্কিটগুলিতে অনুবাদ করা এবং কম্পিউটারের সাথে সংযুক্ত করা দরকার।

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

#0. MLZ -1 3 3;
#1. MLZ -1 7 6; preloadCallStack
#2. MLZ -1 2 1; beginDoWhile0_infinite_loop
#3. MLZ -1 1 4; beginDoWhile1_trials
#4. ADD A4 2 4;
#5. MLZ -1 A3 5; beginDoWhile2_repeated_subtraction
#6. SUB A5 A4 5;
#7. SUB 0 A5 2;
#8. MLZ A2 5 0;
#9. MLZ 0 0 0; endDoWhile2_repeated_subtraction
#10. MLZ A5 3 0;
#11. MNZ 0 0 0; endDoWhile1_trials
#12. SUB A4 A3 2;
#13. MNZ A2 15 0; beginIf3_prime_found
#14. MNZ 0 0 0;
#15. MLZ -1 A3 1; endIf3_prime_found
#16. ADD A3 2 3;
#17. MLZ -1 3 0;
#18. MLZ -1 1 4; endDoWhile0_infinite_loop

এটি নিম্নলিখিত বাইনারি উত্পাদন করে:

0000000000000001000000000000000000010011111111111111110001
0000000000000000000000000000000000110011111111111111110001
0000000000000000110000000000000000100100000000000000110010
0000000000000000010100000000000000110011111111111111110001
0000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000011110100000000000000100000
0000000000000000100100000000000000110100000000000001000011
0000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000110100000000000001010001
0000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000001010100000000000000100001
0000000000000000100100000000000001010000000000000000000011
0000000000000001010100000000000001000100000000000001010011
0000000000000001010100000000000000110011111111111111110001
0000000000000001000000000000000000100100000000000001000010
0000000000000001000000000000000000010011111111111111110001
0000000000000000010000000000000000100011111111111111110001
0000000000000001100000000000000001110011111111111111110001
0000000000000000110000000000000000110011111111111111110001

ভারিলাফ সার্কিটগুলিতে অনুবাদ করা হলে, এটি দেখতে এরকম দেখাচ্ছে:

রম

ক্লোজআপ রম

এরপরে আরওএম কম্পিউটারের সাথে সংযুক্ত হয়ে গেছে, যা ভারিফুলায় পুরোপুরি কার্যকরী প্রোগ্রাম গঠন করে। তবে আমরা এখনও শেষ করিনি ...

গেম অফ লাইফ-এ অনুবাদ

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

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

সুতরাং, আমাদের কম্পিউটারে (টেট্রিস রম সহ) একটি বাউন্ডিং বাক্স রয়েছে 1,436 x 5,082। সেই বাক্সের 7,297,752 টি কক্ষের মধ্যে 6,075,811 খালি জায়গা রয়েছে, যার প্রকৃত জনসংখ্যা 1,221,941 হয়। এই কক্ষগুলির প্রত্যেকটিরই ওটিসিএ মেটাপিক্সলে অনুবাদ করা দরকার, যার সীমানা বাক্স 2048x2048 এবং either৪,69৯১ (একটি ওএন মেটাপিক্সেলের জন্য) বা 23,920 (একটি অফ মেটাপিক্সেলের জন্য) রয়েছে। তার অর্থ, চূড়ান্ত পণ্যটির 29,228,828,720 এবং 79,048,585,231 এর মধ্যে জনসংখ্যার সাথে 2,940,928 x 10,407,936 (অতিরিক্ত মেটাপিক্সেলের সীমানার জন্য কয়েক হাজার অতিরিক্ত) একটি বাউন্ডিং বক্স থাকবে। লাইভ সেল প্রতি 1 বিট সহ, এটি পুরো কম্পিউটার এবং রমের প্রতিনিধিত্ব করার জন্য 27 থেকে 74 জিআইবি প্রয়োজন।

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

কে ঝাং এই কাজটি বন্ধ করে দিয়ে একটি আরও দক্ষ মেটাফায়ার স্ক্রিপ্ট তৈরি করেছে যা ম্যাক্রোসেল ফাইল ফর্ম্যাটটি ব্যবহার করে, এটি বড় নিদর্শনগুলির জন্য আরএলইয়ের চেয়ে বেশি দক্ষ লোড হয়। এই স্ক্রিপ্টটি বেশ দ্রুত গতিতে চলেছে (মূল মেটাফায়ার স্ক্রিপ্টের জন্য একাধিক ঘন্টার তুলনায় কয়েক সেকেন্ড), বিশাল আকারের আউটপুট তৈরি করে (১২১ কেবি বনাম ১.7 গিগাবাইট), এবং পুরো কম্পিউটারটি মেটাফাই করতে পারে এবং কোনও রম বিশাল পরিমাণ ব্যবহার না করেই ঝাঁপিয়ে পড়ে fell স্মৃতি। এটি ম্যাক্রোসিল ফাইলগুলি যে গাছগুলিকে নিদর্শনগুলি বর্ণনা করে তা এনকোড করে ফেলেছে সেটার সুবিধা গ্রহণ করে। একটি কাস্টম টেমপ্লেট ফাইল ব্যবহার করে, মেটাপিক্সেলগুলি গাছটিতে প্রাক-লোড হয় এবং প্রতিবেশী সনাক্তকরণের জন্য কিছু গণনা এবং সংশোধন করার পরে, ভারিচ প্যাটার্নটি কেবল যুক্ত করা যায়।

গেম অফ লাইফের পুরো কম্পিউটার এবং রম এর প্যাটার্ন ফাইলটি এখানে পাওয়া যাবে


প্রকল্পের ভবিষ্যত

এখন যেহেতু আমরা টেট্রিস তৈরি করেছি, আমরা শেষ করেছি, তাই না? কাছেও নয়। এই প্রকল্পের জন্য আমাদের আরও কয়েকটি লক্ষ্য রয়েছে যার দিকে আমরা কাজ করছি:

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

2
কেবলমাত্র ভবিষ্যতের উপ-বিভাগের দিকে তাকানো, একটি আপেক্ষিক লাফানো কেবল একটি নয় ADD PC offset PC? যদি আমার ভুল হয় ভুল হয়, এসেম্বলি প্রোগ্রামিং আমার ফোর ছিল না।
এমব্রেডলি

3
@ টিম্মম্ম হ্যাঁ, তবে খুব ধীরে। (আপনাকেও হ্যাশলাইফ ব্যবহার করতে হবে)।
একটি স্প্যাগেটো

75
আপনি পরবর্তী প্রোগ্রামটির জন্য যা লিখবেন তা কনওয়ের গেম অফ লাইফ হওয়া উচিত।
ACK_stoverflow

13
@ACK_stoverflow এটি কোন এক পর্যায়ে সম্পন্ন হতে চলেছে।
মেগো

13
আপনার কি এটির ভিডিও চলছে?
পাইরুলেজ

583

অংশ 6: কিউএফটিএএসএম-র আরও নতুন সংকলক

যদিও কোগল একটি প্রাথমিক টেট্রিস বাস্তবায়নের জন্য যথেষ্ট, তবে এটি সহজেই পঠনযোগ্য পর্যায়ে সাধারণ উদ্দেশ্যে প্রোগ্রামিংয়ের জন্য খুব সহজ এবং খুব নিম্ন-স্তরের। আমরা ২০১ 2016 সালের সেপ্টেম্বরে একটি নতুন ভাষায় কাজ শুরু করেছি bu বাগগুলি বাস্তব জীবনের পাশাপাশি বুঝতে অসুবিধার কারণে ভাষার অগ্রগতি ধীর ছিল।

আমরা পাইথনের অনুরূপ সিনট্যাক্স সহ একটি নিম্ন স্তরের ভাষা তৈরি করেছি, যার মধ্যে একটি সাধারণ টাইপ সিস্টেম, সাবরুটাইনগুলি পুনরাবৃত্তি সমর্থন করে এবং ইনলাইন অপারেটরগুলি অন্তর্ভুক্ত। পাঠ্য থেকে কিউএফটিএএসএম-র সংকলকটি 4 টি ধাপের সাথে তৈরি করা হয়েছিল: টোকেনিসার, ব্যাকরণ গাছ, একটি উচ্চ স্তরের সংকলক এবং একটি নিম্ন স্তরের সংকলক।

টোকেনাইজার

পাইথনটি টোকনিজার লাইব্রেরিতে বিল্ট ইন ব্যবহার করে বিকাশ শুরু করা হয়েছিল, অর্থাত এই পদক্ষেপটি বেশ সহজ ছিল। স্ট্রিপিং মন্তব্য (তবে #includeগুলি নয় ) সহ কেবলমাত্র ডিফল্ট আউটপুটটিতে কয়েকটি পরিবর্তন প্রয়োজন ।

ব্যাকরণ গাছ

ব্যাকরণ গাছ কোনও উত্স কোড পরিবর্তন না করে সহজেই প্রসারিত হতে তৈরি হয়েছিল।

গাছের কাঠামোটি একটি এক্সএমএল ফাইলে সংরক্ষণ করা হয় যার মধ্যে নোডগুলির কাঠামো রয়েছে যা গাছটি তৈরি করতে পারে এবং কীভাবে তারা অন্যান্য নোড এবং টোকেন দিয়ে তৈরি হয় made

ব্যাকরণটি পুনরাবৃত্ত নোডগুলির পাশাপাশি alচ্ছিকগুলিও সমর্থন করে। টোকেনগুলি কীভাবে পড়তে হবে তা বর্ণনা করতে মেটা ট্যাগ প্রবর্তন করে এটি অর্জন করা হয়েছিল।

টোকেনগুলি যেটি তৈরি হয় তার পরে ব্যাকরণের নিয়মগুলির মাধ্যমে পার্স হয়ে যায় যাতে আউটপুট ব্যাকরণের উপাদানগুলির যেমন গাছ subএবং generic_variablesএর ফলে অন্যান্য ব্যাকরণের উপাদান এবং টোকেন থাকে।

উচ্চ স্তরের কোডে সংকলন

ভাষার প্রতিটি বৈশিষ্ট্যকে উচ্চ স্তরের নির্মাণে সংকলন করতে সক্ষম হওয়া প্রয়োজন। এর মধ্যে রয়েছে assign(a, 12) এবং call_subroutine(is_prime, call_variable=12, return_variable=temp_var)। উপাদানগুলিকে অন্তর্ভুক্ত করার মতো বৈশিষ্ট্যগুলি এই বিভাগে সম্পাদন করা হয়। এগুলিকে operatorএস হিসাবে সংজ্ঞায়িত করা হয় এবং এটি বিশেষ যে এগুলি প্রতিবার কোনও অপারেটর যেমন +বা %ব্যবহৃত হয় in এ কারণে, তারা নিয়মিত কোডের চেয়ে বেশি সীমাবদ্ধ - তারা তাদের নিজস্ব অপারেটর বা কোনও অপারেটর ব্যবহার করতে পারে না যা সংজ্ঞায়িত হওয়াতে নির্ভর করে।

ইনলাইনিং প্রক্রিয়া চলাকালীন, অভ্যন্তরীণ ভেরিয়েবলগুলি কল করার সাথে প্রতিস্থাপন করা হয়। এটি কার্যকরভাবে পরিণত হয়

operator(int a + int b) -> int c
    return __ADD__(a, b)
int i = 3+3

মধ্যে

int i = __ADD__(3, 3)

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

স্ক্র্যাচ ভেরিয়েবল এবং জটিল অপারেশন

গাণিতিক ক্রিয়াকলাপ যেমন a += (b + c) * 4অতিরিক্ত মেমরি কোষ ব্যবহার না করে গণনা করা যায় না। বিভিন্ন স্তরের ক্রিয়াকলাপ পৃথক করে উচ্চ স্তরের সংকলক এটি নিয়ে কাজ করে:

scratch_1 = b + c
scratch_1 = scratch_1 * 4
a = a + scratch_1

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

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

র‌্যাম স্ট্রাকচার

Program counter
Subroutine locals
Operator locals (reused throughout)
Scratch variables
Result variable
Stack pointer
Stack
...

নিম্ন স্তরের সংকলন

শুধুমাত্র কিছু নিম্ন স্তরের কম্পাইলার আছে সঙ্গে মোকাবেলা করতে sub, call_sub, return, assign, ifএবং while। এটি কর্মের একটি অনেক হ্রাস তালিকা যা আরও সহজেই কিউএফটিএএসএম নির্দেশিকায় অনুবাদ করা যায়।

sub

এটি একটি নামযুক্ত সাবরুটিনের শুরু এবং শেষ সন্ধান করে। নিম্ন স্তরের সংকলক লেবেল যুক্ত করে এবং mainসাবরুটিনের ক্ষেত্রে একটি প্রস্থান নির্দেশ যুক্ত করে (রমের শেষের দিকে ঝাঁপ দাও)।

if এবং while

উভয় whileএবং ifনিম্ন স্তরের দোভাষী খুব সহজ: তারা তাদের অবস্থার দিকে পয়েন্টার পান এবং তাদের উপর নির্ভর করে লাফ দেন। whileলুপগুলি যেহেতু সংকলিত হয় তাতে কিছুটা আলাদা

...
condition
jump to check
code
condition
if condtion: jump to code
...

call_sub এবং return

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

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

যখন কোনও returnবিবৃতি সম্মুখীন হয়, তখন স্ট্যাকের শীর্ষটি পপআপ হয়ে যায় এবং প্রোগ্রামের কাউন্টারটি সেই মানতে সেট করা থাকে। কলিং সাবরুটিনের স্থানীয়দের জন্য মানগুলি স্ট্যাকের বাইরে এবং তাদের পূর্ববর্তী অবস্থানে রয়েছে।

assign

ভেরিয়েবল অ্যাসাইনমেন্টগুলি সংকলনের সহজতম জিনিস: তারা একটি পরিবর্তনশীল এবং একটি মান নেয় এবং একক লাইনে সংকলন করে: MLZ -1 VALUE VARIABLE

লাফের লক্ষ্য নির্ধারণ করা

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

ধাপে ধাপে সংকলন উদাহরণ

এখন যেহেতু আমরা সব ধাপ পেরিয়ে গিয়েছি, আসুন ধাপে ধাপে একটি আসল প্রোগ্রামের জন্য একটি প্রকৃত সংকলন প্রক্রিয়াটি অনুসরণ করি।

#include stdint

sub main
    int a = 8
    int b = 12
    int c = a * b

ঠিক আছে, যথেষ্ট সহজ। এটা তোলে প্রোগ্রাম শেষে যে সুস্পষ্ট হওয়া উচিত, , a = 8, ।b = 12 c = 96প্রথমত, এর প্রাসঙ্গিক অংশগুলি অন্তর্ভুক্ত করতে দিন stdint.txt:

operator (int a + int b) -> int
    return __ADD__(a, b)

operator (int a - int b) -> int
    return __SUB__(a, b)

operator (int a < int b) -> bool
    bool rtn = 0
    rtn = __MLZ__(a-b, 1)
    return rtn

unsafe operator (int a * int b) -> int
    int rtn = 0
    for (int i = 0; i < b; i+=1)
        rtn += a
    return rtn

sub main
    int a = 8
    int b = 12
    int c = a * b

ঠিক আছে, কিছুটা জটিল টোকেনাইজারের দিকে সরানো যাক এবং কী বেরিয়ে আসে তা দেখুন। এই পর্যায়ে, আমাদের কাছে কোনও বিন্যাসের বিন্যাস ছাড়াই টোকেনের একটি রৈখিক প্রবাহ থাকবে

NAME NAME operator
LPAR OP (
NAME NAME int
NAME NAME a
PLUS OP +
NAME NAME int
NAME NAME b
RPAR OP )
OP OP ->
NAME NAME int
NEWLINE NEWLINE
INDENT INDENT     
NAME NAME return
NAME NAME __ADD__
LPAR OP (
NAME NAME a
COMMA OP ,
NAME NAME b
RPAR OP )
...

এখন সমস্ত টোকেন ব্যাকরণ পার্সারের মাধ্যমে দেওয়া হবে এবং প্রতিটি বিভাগের নাম সহ একটি গাছ আউটপুট দেয়। কোড দ্বারা পড়া হিসাবে এটি উচ্চ স্তরের কাঠামো দেখায়।

GrammarTree file
 'stmts': [GrammarTree stmts_0
  '_block_name': 'inline'
  'inline': GrammarTree inline
   '_block_name': 'two_op'
   'type_var': GrammarTree type_var
    '_block_name': 'type'
    'type': 'int'
    'name': 'a'
    '_global': False

   'operator': GrammarTree operator
    '_block_name': '+'

   'type_var_2': GrammarTree type_var
    '_block_name': 'type'
    'type': 'int'
    'name': 'b'
    '_global': False
   'rtn_type': 'int'
   'stmts': GrammarTree stmts
    ...

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

('sub', 'start', 'main')
('assign', int main_a, 8)
('assign', int main_b, 12)
('assign', int op(*:rtn), 0)
('assign', int op(*:i), 0)
('assign', global bool scratch_2, 0)
('call_sub', '__SUB__', [int op(*:i), int main_b], global int scratch_3)
('call_sub', '__MLZ__', [global int scratch_3, 1], global bool scratch_2)
('while', 'start', 1, 'for')
('call_sub', '__ADD__', [int op(*:rtn), int main_a], int op(*:rtn))
('call_sub', '__ADD__', [int op(*:i), 1], int op(*:i))
('assign', global bool scratch_2, 0)
('call_sub', '__SUB__', [int op(*:i), int main_b], global int scratch_3)
('call_sub', '__MLZ__', [global int scratch_3, 1], global bool scratch_2)
('while', 'end', 1, global bool scratch_2)
('assign', int main_c, int op(*:rtn))
('sub', 'end', 'main')

এরপরে, নিম্ন স্তরের সংকলককে এই উচ্চ স্তরের প্রতিনিধিত্বকে কিউএফটিএএসএম কোডে রূপান্তর করতে হবে। ভেরিয়েবলগুলি র‍্যামে অবস্থানগুলি যেমন নির্ধারিত হয়:

int program_counter
int op(*:i)
int main_a
int op(*:rtn)
int main_c
int main_b
global int scratch_1
global bool scratch_2
global int scratch_3
global int scratch_4
global int <result>
global int <stack>

সহজ নির্দেশাবলী তারপর সংকলিত হয়। শেষ অবধি, নির্দেশ সংখ্যা যুক্ত করা হয়, ফলস্বরূপ কার্যকর কার্যকর QFTASM কোড।

0. MLZ 0 0 0;
1. MLZ -1 12 11;
2. MLZ -1 8 2;
3. MLZ -1 12 5;
4. MLZ -1 0 3;
5. MLZ -1 0 1;
6. MLZ -1 0 7;
7. SUB A1 A5 8;
8. MLZ A8 1 7;
9. MLZ -1 15 0;
10. MLZ 0 0 0;
11. ADD A3 A2 3;
12. ADD A1 1 1;
13. MLZ -1 0 7;
14. SUB A1 A5 8;
15. MLZ A8 1 7;
16. MNZ A7 10 0;
17. MLZ 0 0 0;
18. MLZ -1 A3 4;
19. MLZ -1 -2 0;
20. MLZ 0 0 0;

সিনট্যাক্স

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

চলক এবং প্রকার

যখন ভেরিয়েবলগুলি প্রথমবার সংজ্ঞায়িত করা হয়, তখন তাদের সাথে কোনও প্রকার যুক্ত থাকতে হবে। বর্তমানে সংজ্ঞায়িত ধরনের হয় intএবং boolসংজ্ঞায়িত অ্যারে জন্য সিনট্যাক্স কিন্তু কম্পাইলার সঙ্গে।

গ্রন্থাগার ও অপারেটর

নামে পরিচিত একটি লাইব্রেরি stdint.txtপাওয়া যায় যা বেসিক অপারেটরগুলির সংজ্ঞা দেয়। যদি এটি অন্তর্ভুক্ত না করা হয়, এমনকি সাধারণ অপারেটরগুলি সংজ্ঞায়িত করা হবে না। আমরা এই লাইব্রেরিটি সাথে ব্যবহার করতে পারি #include stdintstdintঅপারেটরগুলি যেমন +, >>এবং এমনকি *এবং %উভয়ই সরাসরি কিউএফটিএএসএম অপকোডগুলি সংজ্ঞায়িত করে।

ভাষা কিউএফটিএএসএম অপকোডকে সরাসরি ডেকে আনার অনুমতি দেয় __OPCODENAME__

সংযোজন stdintহিসাবে সংজ্ঞায়িত করা হয়

operator (int a + int b) -> int
    return __ADD__(a, b)

যা +অপারেটরকে দুটি intএস প্রদান করার সময় সংজ্ঞা দেয় ।


1
আমি জিজ্ঞেস করতে পারি, কেন এটা জীবনের Conway এর খেলা একটি wireworld মত সিএ তৈরি এবং বরং পুনঃব্যবহারের চেয়ে সার্কিটের ব্যবহার করে একটি নতুন প্রসেসর তৈরি করতে সিদ্ধান্ত নেওয়া হয় / একটি সার্বজনীন কম্পিউটার cgol বিদ্যমান যেমন রেট্রোফিট এই এক ?
eaglgenes101

4
@ eaglgenes101 শুরুর জন্য, আমি মনে করি না যে আমাদের বেশিরভাগই অন্যান্য ব্যবহারযোগ্য ইউনিভার্সাল কম্পিউটারের অস্তিত্ব সম্পর্কে সচেতন ছিল were একাধিক মিশ্র নিয়মযুক্ত একটি ওয়্যারওয়ার্ল্ড-জাতীয় সিএর ধারণাটি মেটাসেলগুলি নিয়ে খেলা করার ফলে আসে (আমি বিশ্বাস করি - এই ধারণাটি নিয়ে আসেন তিনিই ছিলেন)। সেখান থেকে এটি আমরা যা তৈরি করেছিলাম তা একটি যৌক্তিক অগ্রগতি ছিল।
মেগো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.