Bootstrapping یا «خودراه اندازی» یا «خود محوری» یا «خود میزبانی» یکی از جالب ترین تکنیک های دنیای برنامه نویسی هستش. Bootstrapping مبحثی هست که بیشتر در طراحی کامپایلر ها مورد بحث قرار میگیره و به تکنیکی اطلاق میشه که یه زبان برنامه نویسی با استفاده از اون میتونه کامپایلر خودش رو با کدهای خودش بنویسه! مثلا کامپایلر زبان برنامه نویسی C رو با خود زبان C بنویسیم. یا کامپایلر Pascal رو با خود Pascal بنویسیم.

اولین چیزی که برای این کار لازمه اینه که زبان ما اونقدر کارایی و کیفیت داشته باشه که بتونه برای خودش کامپایلر بنویسه. حالا خوبی نوشتن کاپایلر با این ایده چی میتونه باشه؟ مثلما یکی از خوبی هاش اینه که با زبان های سطح پایین مثل اسمبلی درگیر نمیشیم و سعی داریم کامپایلر رو با زبانی که برای خودمون راحت تره بنویسیم. از طرفی توسعه و طراحی کامپایلر با کیفیت و سرعت بیشتری جلو میره.

امروزه خیلی از کامپایلر ها با زبان خودشون توسعه پیدا میکنن. کامپایلر پروژه گنو برای زبان برنامه نویسی C با خود زبان برنامه نویسی C نوشته میشه. یا کامپایلر Free Pascal با خود Pascal نوشته میشه.

حالا اگه قرار باشه کامپایلر C رو با خود C بنویسیم, نیاز داریم کدهایی که مینویسیم رو به طریقی کامپایل کنیم. اما اول باید یک کامپایلر C داشته باشیم که بخوایم سورس کد ها رو باهاش کامپایل کنیم. و از طرفی هم اول باید سورس کدهای نوشته شده با زبان C رو داشته باشیم که بتونیم باهاش یه کامپایلر بسازیم. حالا سوال اینه که اگه کامپایلر نباشه چجوری کدها رو کامپایل کنیم و اگه کدی نباشه چجوری کامپایلر بسازیم؟

جواب به این صورت هستش که همیشه برای اولین بار مجوریم یک کامپایلر رو با زبان های سطح پایین تر و یا با کمک کامپایلری که قبلا وجود داشته بسازیم. برای مثال،،*ما میدونیم که کامپایلر Pascal برای اولین بار با زبان برنامه نویسی Fortran نوشته شد. روند کار به این شیوه بوده:
از قبل کامپایلری برای Fortran وجود داشته.
کدها با Fortran نوشته شد و با کامپایلری که در این زبان در اختیار بوده به کد زبان ماشین ترجمه شد.
نتیجه کامپایلری میشه که دیگه در زبان Fortran وجود نداره و تبدیل شده به کدهای زبان ماشین. پس ما الآن یه کامپایلر به زبان ماشین داریم.
کامپایلر زبانِ ماشینِ ما میتونه کدهای Pascal رو به ماشین ترجمه کنه.
پس کامپایلر رو از ابتدا با خود زبان Pascal دوباره نویسی میکنیم و تبدیلش میکنیم به کد زبان ماشین.
حالا کامپایلری در اختیار داریم که از تبدیل کدهای زبان Pascal به زبان ماشین به وجود اومده، نه از تبدیل Fortran به ماشین.
در آخر میتونیم کاملا Fortran رو نادیده بگیریم و از این به بعد کامپایلر رو با خود Pascal توسعه بدیم.

ممکنه کسی بگه که به هر حال خود Fortran در ابتدای کار به طریقی در دسترس قرار داشته. اگه بخوایم اصولی تر فکر کنیم همیشه در ابتدای کار کامپایلری وجود داشته که با زبان ماشین یا اسمبلی نوشته شده و این امر اجتناب ناپذیره. ولی سختیه کار فقط برای همون یه باره و به محض اینکه یه کامپایلر رو با اسمبلی نوشتیم، دیگه به کدهاش نیازی نداریم چون در مراحل بعدی میتونیم از خود زبان برای توسعه خودش استفاده کنیم.

ممکنه برای اینکه کار راحت تر بشه فقط نقاط حساسِ کامپایلر رو در سطح پایین بسازیم و بقیه قسمت ها رو وقتی کامپایلر اولیه رو کامل کردیم, با خود زبانی که کامپایلر رو برای اون میسازیم تکمیل کنیم.

برای مثال فرض میکنیم که اولین بار C با زبان اسمبلی نوشته شد. وقتی در استاندارد C99 که در سال 1999 به وجود اومد گفته شد که C باید از کامنت های ++C که همون // باشن هم پشتیبانی کنه, مسلما تا قبل از این چنین قابلیتی در C وجود نداشته. یعنی کامپایلری که با اسمبلی نوشته بودیم از این قابلیت پشتیبانی نمیکرد. اما حالا ما میتوینم به جای اینکه کدهای اسمبلی رو دستکاری کنیم, از خود C برای اضافه کردن قابلیتی که در ابتدای کار وجود نداشته استفاده کنیم. به زبان ساده تر اینکه هسته ی اصلی زبان رو در سطح پایین تر بسازیم و بقیه شاخ و برگ های اضافی رو سطوح بالاتر تکمیل کنیم.

نمونه ی دیگه می تونه پیاده سازی PyPy از زبان برنامه نویسی پایتون باشه. خود پایتون در اصل با C نوشته شده. اما یه عده ایی تصمیم گرفتن که پایتون رو با کدهای خود پایتون پیاده سازی کنن.