رایانه مرد کوچک
رایانه مرد کوچک ، یک مدل سفارشی از رایانه است، که توسط دکتر استوارت مادنیک در سال ۱۹۶۵ میلادی ساخته شد. این رایانه در حالت کلی برای آموزش دانشجویان مورد استفاده قرار می‌گیرد، زیرا یک رایانه با معماری ون نیومن ساده – که شامل تمامی ویژگی‌های اساسی رایانه‌های مدرن است - را مدل می‌کند. این نوع رایانه قابلیت برنامه‌ریزی شدن در زبان ماشین (دهدهی به جای دودویی) یا زبان اسمبلی را دارد.
این مدل بر اساس مفهوم حبس کردن یک مرد کوچک در یک اتاق پستی دربسته تعریف شده‌است (مشابه با یک رایانه در این طرح). در یک سوی انتهایی اتاق ۱۰۰ جعبهٔ نامه (حافظه) وجود دارد که از ۰ تا ۹۹ شماره‌گذاری شده‌اند، که هر کدام می‌تواند شامل یک دستورالعمل یا دادهٔ ۳ رقمی باشد (از رنج ۰۰۰ تا ۹۹۹). به‌علاوه دو جعبهٔ نامه در سمت دیگر انتهایی اتاق قرار دارد که با برچسب‌های INBOX و OUTBOX برچسب‌گذاری شده‌اند و برای ارسال و دریافت داده‌ها استفاده می‌شوند. در مرکز اتاق یک محوطهٔ کاری وجود دارد که شامل ۱) دو دستورالعمل سادهٔ محاسباتی است (جمع و تفریق) که آن را به نام انباره و ۲) یک شمارش‌گر قابل بازنشاندن که با نام «شمارش‌گر برنامه» می‌شناسیم. این شمارش‌گر برنامه آدرس دستورالعمل بعدی که مرد کوچک آن را انجام خواهد داد، نگاه می‌دارد. افزایش یک واحدی شمارشگر برنامه در حالت عادی بعد از اجرای هر دستورالعمل، به مرد کوچک اجازه می‌دهد تا در طی یک برنامه به‌طور متوالی فعالیت داشته باشد. دستورالعمل‌های انشعاب اجازهٔ قراردادن تکرار (حلقه) و ساختارهای برنامه ایی شرطی را در یک برنامه می‌دهند. قرار دادن شمارشگر برنامه بر روی یک آدرس غیر متوالی در صورت رخداد یک شرط خاص (نوعاً در اینجا وقتی مقدار داخل انباره صفر یا مثبت شود).
هر جعبهٔ نامه (نشان دهندهٔ یک مکان حافظهٔ منحصر به فرد) شامل هردوی دستورالعمل‌ها و داده هاست. در نتیجه بایستی مراقب بود تا زمانی‌که یک آدرس حافظه شامل داده است، شمارشگر برنامه را از افزایش بازداریم (مرد کوچک تلاش می‌کند تا آن را برای یک دستورالعمل متوقف نکند). این مزیت نی تواند با نوشتن دستورالعمل‌ها در جعبهٔ نامه بدست آید که به معنی آن است که کد مورد وقفه قرار گرفته تا یک کدِ خوداصلاحگر ایجاد نماید. برای استفاده از رایانه مرد کوچک، کاربر داده‌ها را در جعبه‌های نامه بارگذاری می‌نماید و سپس برای شروع اجرا به مرد کوچک اطلاع می‌دهد؛ که با دستورالعمل ذخیره شده در خانهٔ صفر حافظه آغاز می‌شود. در یک حالت متفاوت، ریست کردن شمارشگر برنامه به صفر، باعث راه اندازی مجدد برنامه می‌شود.
مرد کوچک برای اجرای یک برنامه مراحل زیر را اعمال می‌کند:
در حالی که رایانه مرد کوچک منعکس‌کنندهٔ عملکرد واقعی پردازنده دودویی می‌باشد، سادگی اعداد اعشاری انتخاب شده برای به حداقل رساندن پیچیدگی برای دانش آموزانی که ممکن است در کار با دودویی/هگزادسیمال مشکل داشته باشند.
برخی از شبیه‌سازهای این نوع رایانه به‌طور مستقیم با استفاده از ۳ دستورالعمل عددی و برخی دیگر با استفاده از ۳-کد حفظی نامه و برچسب، برنامه‌ریزی شده‌اند. در هر صورت این مجموعه دستورالعمل به‌طور عامدانه برای ساده کردن درک، بسیار محدود است ("به‌طور معمول حدود ده دستورالعمل"). اگر این رایانه از کد حفظی و برچسب استفاده کند سپس هنگامی که برنامه اسمبل شده‌است، این‌ها به ۳ دستورالعمل عددی تبدیل می‌شوند.
جدول زیر یک نمونه مجموعه دستورالعمل عددی و کدهای حفظی معادل آن را نشان می‌دهد. این برنامه (دستورالعمل ۹۰۱ به دستورالعمل ۰۰۰) فقط با استفاده از کدهای عددی نوشته شده‌است. این برنامه دو عدد را به عنوان ورودی و خروجی متفاوت می‌گیرد. توجه کنید که اجرا در صندوق پستی ۰۰ شروع می‌شود و پس از آن در صندوق پستی ۰۷ اتمام می‌یابد. معایب برنامه‌نویسی رایانه مرد کوچک، استفاده از کدهای دستورالعملی عددی مورد بحث در زیر است.
زبان اسمبلی یک زبان برنامه‌نویسی سطح پایین است که به جای کدهای دستورالعمل عددی از حفظیات و برچسب‌ها استفاده می‌کند. اگرچه رایانه‌های مرد کوچک تنها از یک دستهٔ محدود از حفظیات استفاده می‌کنند، راحتی استفاده از یک حفظی برای هر دستورالعمل از زبان اسمبلی همان برنامه-که در زیر نشان داده شده-روشن می‌سازد. برنامه‌نویس نیازی به بخاطر سپردن یک مجموعه از کدهای عددی بینام ندارد و اکنون می‌تواند بوسیلهٔ یک مجموعه از کدهای بیشتر حفظی قابل یادآوری برنامه‌ریزی شود. اگر این حفظی یک دستورالعمل شامل یک آدرس حافظه باشد (یک دستور انشعاب یا بارگیری/ذخیره داده) سپس یک برچسب برای نامگذاری آدرس حافظه استفاده می‌شود.
بدون برچسب‌ها برنامه‌نویس نیازمند به محاسبهٔ دستی آدرس‌های صندوق پستی (حافظه) است. در مثال کد عددی، اگر یک دستورالعمل جدید قبل از دستورالعمل HLT پایانی، وارد شود، سپس این دستورالعمل HLT از آدرس ۰۷ به ۰۸ انتقال می‌یابد (برچسب‌گذاری آدرس از مکان ۰۰ شروع می‌شود). فرض کنید کاربر ۶۰۰ را به عنوان اولین ورودی وارد کند. دستورالعمل ۳۰۸ معنی می‌دهد که این مقدار در آدر ۰۸ ذخیره خواهد شد و دستورالعمل 000 (HLT) بازنویسی می‌شود؛ بنابراین ۶۰۰ معنی می‌دهد "انشعاب به صندوق پستی آدرس ۰۰" برنامه به جای توقف، در یک چرخهٔ بی پایان قرار خواهد گرفت.
برای کار روی این مشکل، اکثر زبان‌های اسمبلی (شامل رایانه مرد کوچک) شامل محفوظات و برچسبهاست. یک برچسب به‌طور ساده یک کلمه است که برای نام یک آدرس حافظه که یک دستورالعمل یا داده ذخیره شده‌اند، یا ارجاع به آدرس داخل دستورالعمل.
زمانیکه یک برنامه اسمبل می‌شود: در این مثال زبان اسمبلی که از حفظیات و برچسب‌ها استفاده می‌کند، اگر یک دستورالعمل قبل از دستورالعمل HLT پایانی وارد شود سپس مکان آدرس با FIRST برچسب‌گذاری شده اکنون به جای ۰۸ در مکان آدرس ۰۹ باید باشد و دستورالعمل STA FIRST زمانی‌که برنامه اسمبل می‌شود به جای 308 (STA 08) به 309 (STA 09) تبدیل می‌شود.
از این رو برچسب‌ها استفاده می‌شوند برای:
این برنامه یک ورودی از کاربر دریافت کرده و آن را تا صفر به‌طور کاهشی می‌شمارد. این برنامه یک ورودی از کاربر گرفته، آن را مربع کرده، و پاسخ را برمی‌گرداند و سپس تکرار می‌کند. وارد کردن صفر منجر به اتمام برنامه خواهد شد. (نکته: یک ورودی که خروجی را به بیش از ۹۹۹ نگاشت دهد، باعث بروز یک خطا به دلیل محدودیت تعداد ۳ رقم LMC می‌شود). "نکته: اگر بعد از دستور DAT داده‌ای نباشد آنگاه بطور پیش‌فرض عدد صفر در آدرس حافظه ذخیره می‌شود."
در مثال بالا، [BRZ ENDLOOP] وابسته به یک رفتار تعریف نشده‌است، از آنجایی که COUNT-VALUE می‌تواند منفی باشد، بعد از اینکه مقدار انباره undefined شد، نتیجه BRZ یا انشعاب می‌یابد یا هیچ (انباره می‌تواند صفر باشد، یا پوشیده شود). برای سازگاری کد با مشخصات، جایگزین کنید: بوسیلهٔ نسخهٔ پیش رو، که VALUE-COUNT جایگزین COUNT-VALUE شده اس، مطمئن می‌شویم که انباره هرگز پاریز نخواهد شد: مثال دیگر quine است، کد ماشین خودش را چاپ می‌کند (چاپ کردن منبع غیرممکن است زیرا حروف نمی‌توانند به خروجی روند): این کواین با استفاده از کد خوداصلاحگر کار می‌کند. مکان ۰ در هر تکرار اضافه می‌شود، آن خط کد را به خروجی برده، تا زمانی‌که خروجی کد ۱ شود، در این نقطه به مکان ONE پرش می‌کند. مکان ONE با یک ۰ شروع شده، بنابراین به عنوان یک دستور HALT/COB تفسیر می‌شود.