بی شک این پست همه جوره خودش را مدیون آلن تورینگ است او پدر علوم کامپیوتر است و دنیای کامپیوتر امروز مدیون این ریاضی دان است و تئوری های او پایه ای شد بر تمام کامپیوتر های امروزی!


ماشین تورینگ

ماشین تورینگ یک ماشین محاسبه گر است شامل یک نوار از خانه های حافظه و یک اشاره گر و تعدادی تابع و یک سری جزییات بیشتر که می توانید اینجا را ببینید که با استفاده از توابع از حالتی به حالت دیگر رفته و می توانیم اطلاعات را در نوار حافظه تغییر بدهیم و در خانه های حافظه جابه جا شویم و به حالات نهایی دست یابیم.


لم چرچ-تورینگ

طبق این لم که یکی از مهم ترین قضیه های قرن 20 ام می باشد ماشین تورینگ قادر است هر تابع روی مجموعه اعداد طبیعی را محاسبه کند.

که البته با برقراری تناظر های یک به یک بین مجموعه های اعداد صحیح ، گویا و حتی زیر مجموعه هایی متناهی از مجموعه های ناشمارا به مجموعه اعداد طبیعی، توابعی روی سایر مجموعه ها را هم محاسبه کند.


 Brainfuck

این زبان برنامه نویسی یک ابتکار جالب از اربان مولر بود که در سال ۱۹۹۳ به وجود آمد و دقیقا ساختار یک ماشین تورینگ را دارد و برای نوشتن برنامه با این زبان برنامه نویسی باید تقریبا یک ماشین تورینگ را طراحی کنید تا الگوریتمتان را به اجرا در آورد این زبان برنامه نویسی تنها ۸ کاراکتر دارد اما از لحاظ توانایی هیچ چیزی کمتر از سایر زبان های برنامه نویسی دنیا ندارد البته همانطور که از اسمش پیداست برنامه نوشتن با این زبان کار آسانی نیست و کد کردن الگوریتم ها حسابی برنامه نویس را به چالش می کشد. :D


چگونه با brainfuck برنامه بنویسیم؟

این زبان شامل یک نوار ذخیره سازی و یک اشاره گر می باشد که روی خانه های این نوار حرکت می کند و در هر خانه از این نوار یک عدد صحیح ذخیره می شود و در ابتدای کار اشاره گر در یک خانه با محتوای صفر قرار دارد و تمام خانه های محتوایشان صفر می باشد.


۸ کاراکتر این زبان دستوراتی برای کامپایلر به صورت زیر هستند:

  • "," از کاربر یک کاراکتر را ورودی می گیرد و کد اسکی معادل آن را در خانه ای که اشاره گر در آن قرار دارد ذخیره می کند.
  • "." کاراکتری که معادل با کد اسکی خانه ای که اشاره گر در نوار در حال اشاره کردن به آن است را در خروجی چاپ می کند.
  • "+" خانه ای که اشاره گر به آن اشاره می کند را یک واحد افزایش می دهد.
  • "-" خانه ای که اشاره گر به آن اشاره می کند را یک واحد کاهش می دهد.
  • "<" اشاره گر را در نوار یک خانه به سمت راست جا به جا می کند.
  • ">" اشاره گر را در نوار یک خانه به سمت چپ جا به جا می کند.
  • "]" شروع یک حلقه می باشد.
  • "[" با مشاهده این دستور دو حالت اتفاق می افتد اگر خانه ای که اشاره گر به آن اشاره می کند مقدارش صفر باشد کامپایلر به سراغ دستور بعدی می رود در غیر این صورت کامپایلر به دستور "]" متناظر با "[" بازمی گردد و اجرای دستورات را از سر می گیرد.
هر کاراکتر دیگری را کامپایلر در نظر نمی گیرد

چند کد ساده با این زبان

++++++++[>++++++++<-]>
+++++++++++.------.+++++++++++++.--.-..
ابتدا ۸ مرتبه هر مرتبه ۸ بار به خانه دوم مقدار اضافه می شود تا به عدد ۶۴ برسد سپس با افزودن ۱۱ تا به آن به عدد ۵۵ میرسیم که کد اسکی K می باشد و آن را چاپ می کند سپس به اضافه و کم کردن همان خانه بقیه کاراکتر ها را هم چاپ می کند و در نهایت کلمه KERPOO را چاپ می کند :)


++++++++[>++++[>++>+++>+++>+<<<<-]>
+>+>->>+[<]<-]>>.>---.
+++++++..+++.>>.<-.<.
+++.------.--------.>>+.

Hello world را چاپ می کند.


,>,<[>[>+>+<<-]>>[-<<+>>]<<<-]>>
دو عدد یک رقمی را ورودی می گیرد و حاصل ضربشان را حساب می کند.


یک کامپیایلر آنلاین برای این زبان :

از کد زدن باهاش لذت ببرین :)
پ.ن: به نظرم بسیار زیباست که زبان به این سادگی با تنها ۸ دستور می تونه به اندازه تمام زبان های برنامه نویسی دنیا قدرتمند باشه در واقع عظمت کار تورینگ و زیبایی ریاضیات رو به تصویر میکشه :)