کامپایلری یا مفسری ؟ مسئله این است !

تصویری بدیهی از جهان باینری !از وقتی که بشر ، زبان باینری ( 0 و 1 ) رو به زبان‌های برنامه‌نویسی کنونی تبدیل کرده ، تا به امروز ، ملاک‌های بسیار زیادی برای طبقه‌بندی زبان‌های برنامه‌نویسی بوجود اومده.یکی از ملاک‌ها ، مفسری یا کامپایلری بودن زبان برنامه‌نویسیه.امّا این‌ها به چه مفهومی هستن ؟ و به چه درد می‌خورن و اساس کارشون چیه ؟قبل از اینکه بخوایم بریم سراغ مفسری‌ها ( interpreters ) و کامپایلری‌ها ( compilers ) ، باید چند اصل پایه رو بدونیم.ما یک مفهومی داریم به اسم : سطح ( level ).اون وقت ، دقیقاً سطح چیه ؟ سطح ، در واقع نمایانگر میزان نزدیک بودن یه زبان برنامه‌نویسی به زبان انسانه !حالا بیاین ببینیم این تعریف دقیقاً یعنی چی ؟سطح شناسی !بذارین با یه مثال بسیار ساده ، این به اصطلاح سطح ، رو توضیح بدم.مثال : من از شما می‌خوام که صفر رو به من نشون بدید !اگه یه انسان باشید ، می‌تونید صفر رو به زبان انسان نشون بدید : صفر ، 0 ، Zero و ...ولی یه کامپیوتر ، فقط می‌تونه صفر رو به این صورت نشون بده : 0000در واقع 0000 به زبان باینری ! در این زبان ، 0000 ارزشی داره برابر با 0.ولی یه انسان سالم هیچ‌وقت نمیگه 0000 ! ( صفر،صفر،صفر،صفر ؟! )و این چنینه که زبان کامپیوتر و انسان از زمین تا آسمون با هم ، تفاوت داره !حالا ... اگه برنامه‌نویسی تا حدودی ( حتّی تا حد خیلی کمی ! ) بلد باشید ، حرف من رو متوجه میشید ! :ما در زبان‌های برنامه‌نویسی ، عدد صفر رو به چه صورت نشون میدیم ؟ معلومه ! : 0 !عجیب نیست ؟! ما داریم در زبان‌های برنامه‌نویسی که خودشون از زبان کامپیوتر ساخته شدن ، به زبون آدمیزاد ، حرف می‌زنیم !حتّی اگه بخوایم می‌تونیم این لغت Zero رو تعریف کنیم :Zero = 0بدین ترتیب ، Zero هم میشه نمادی از 0 !ولی ما چطور داریم در زبان‌های برنامه‌نویسی ، این طوری حرف می‌زنیم ؟جوابش برمیگرده به همون بحث سطح !ما 3 نوع سطح اصلی داریم :1. سطح بالا - high level2. سطح متوسط - middle level3. سطح پایین - low levelسهم زبان‌های برنامه‌نویسی از سطح بالایی !اگه کد های ما ، به زبون آدمیزاد نزدیکتر باشه ، میگیم اون زبان برنامه‌نویسی ، سطح بالاست ! ( یا به اصطلاح جوون ها ، گَنگ‌ش بالاست ! )امّا اگه به زبان سخت و جان‌فرسای کامپیوتری ، نزدیکتر باشه ، میگیم که سطح پایینه.سطح متوسط هم بدین معناست که زبان ما ، سطحی بین زبان انسان و کامپیوتر داره.تا کنون فهمیدیم سطح چیه و چطور ارزیابی و طبقه‌بندی میشه.ولی چطور میشه در یک زبان برنامه‌نویسی به زبان انسان حرف زد ؟!و اینکه سطح چه ربطی به مفهوم کامپایلری و مفسری داره ؟!با ما باشید !کامپایلر ها ، ترجمه‌گرانی موقر ! به این حکایت پربار ، توجه کنید ! :روزی چوپان از گوسفند پرسید : چرا ترجیح می‌دهی من تو را نکشم و تمام طول عمرت را نگران مرگ بدست گرگ باشی ؟گوسفند گفت : بَـــــــــــــــــــــــــــع !گوسفند مذکور !!!مسئله‌ی تبدیل زبان انسان به کامپیوتر ، مثل همین حکایته که یه چوپان با گوسفندش ، بحث کنه !حالا تصوّر کنید ! :یک شخص روسی زبان ، می‌خواد با یک ایرانی پارسی زبان ملاقات کنه. وقتی فرد روس ، صحبت می‌کنه ، فرد ایرانی ، متوجه زبان روسی نمیشه ! پس باید بره زبان روسی رو به طور کامل و حرفه‌ای ، یاد بگیره ؛ ولی این کار خیلی طول میکشه. پس فرد ایرانی میره یه مترجم استخدام می‌کنه. و فرد مترجم ، زبان روسی رو برای فرد ایرانی ترجمه می‌کنه و فرد ایرانی ، متوجه میشه ! در اینجا زبان روسی ، در واقع همون زبان سطح بالای انسان و زبان ایرانی ، زبان سطح پایین کامپیوتره ؛ و در این بین مترجم ، میشه همین کامپایلر قضیه !کامپایلر ، در جهان واقعی هم به معنای مترجمه. و زبان کامپایلری یعنی زبان ترجمه شده.و این در واقع ، کل کار کامپایلر ، به زبان ساده‌ست ! کامپایلر ، کد های سطح بالا رو به کد های سطح پایین ترجمه می‌کنه تا کامپیوتر بتونه اون مفاهیم رو بهتر درک کنه ! مثال :وقتی ما عدد 0 رو در یک زبان برنامه‌نویسی کامپایلری وارد کنیم ، این 0 ، وارد کامپایلر میشه ، کامپایلر هم اون رو به 0000 ، ترجمه می‌کنه ؛ و به همین منوال ، بقیه‌ی مراحل !الگوریتم کار یک کامپایلر !فرصتی برای یادگیری اعداد 1 تا 10 ، به زبان کامپیوتر ! :0 = 00001 = 00012 = 00103 = 00114 = 01005 = 01016 = 01107 = 01118 = 10009 = 100110 = 0001 0000پس ، یاد گرفتیم که کار کامپایلر چگونه‌ست و به چه صورته. زبان‌های برنامه‌نویسی کامپایلری ، به مراتب ، سریع تر از زبان‌های مفسری هستن. زبان‌هایی مثل سی‌شارپ ( #C ) ، جاوا ( Java ) ، کاتلین ( Kotlin ) ، سی‌پلاس‌پلاس ( ++C ) ، سی ( C ) ، گولنگ ( Golang ) ، پاسکال ( Pascal ) ، ویژوآل بیسیک ( VB ) و ... ، کامپایلری هستن. حالا اساس کار کامپایلر در این زبان‌ها چیه ؟ما برای اجرا کردن کدهامون باید از run استفاده کنیم ؛ این کلید run ، در اکثر برنامه‌های کد نویسی موجوده ! ولی این کلید ، فقط در صورتی کار می‌کنه که کامپایلر اون زبان برنامه‌نویسی رو داشته باشیم ! برای نمونه ، ما برای اجرا کردن کدهای سی‌شارپ نیاز به کامپایلر سی‌شارپ داریم که این کامپایلر رو می‌تونیم از نرم‌افزار ویژوآل استودیو نصب کنیم ! اسم این کامپایلر NET. هست که برای کامپایل کردن کدهای سی‌شارپ ، ویژوآل بیسیک و ... به کار میره.زبان‌های کامپایلری ، بر اساس الگوی زبان ماشین و زبان اسمبلی ( Assembly ) ساخته شدن ! ( زبان اسمبلی ، جزء اوّلین و ابتدایی‌ترین زبان‌های کامپایلری تاریخ به حساب میاد. )و این است قدرت کامپایلر ها ! دقت داشته باشید که کامپیوتر بعد از کامپایل کدها میگه : "اوه ، حالا می‌فهمم !" ؛ این دقیقاً به همین ترجمه‌گری کامپایلر مربوط میشه !مفسری‌ها ، نخبگانی مجرب !بعد از مترجم‌ها ، نوبت تفسیر کننده هاست !یه داستان جالب : برخی از ادیان اصلی ، کتاب‌های آسمانی دارن. مثل همین قرآن خودمون. قرآن ، زبانش عربیه. پس مسلماً ما فارسی زبان‌ها بدون ترجمه متوجه عربی نمیشیم ؛ بنابراین ، یه فرد میاد و قرآن رو ترجمه می‌کنه ؛ بعد ما می‌تونیم تا مقدار لازم ، مسئله رو درک کنیم ؛ ترجمه نماد کامپایله ؛ ولی حالا مفسر کجاست ؟! جایی که قرآن در کتاب‌هایی دیگه تفسیر میشه و مفاهیم درونی‌ش به مفاهیم کوچیک‌تری ، خرد میشه ، و ما می‌تونیم ، قرآن رو بفهمیم ؛ این تفسیر دقیقاً کار مفسره !مفسر ، کدهای ما رو قطعه قطعه می‌کنه و هر کدوم رو سعی می‌کنه به طور جدا بفهمه ! به زبانی ساده‌تر ، مفسر ، کدها رو به زبان کامپیوتر ، ترجمه نمی‌کنه ؛ اون کدها رو پس از تفسیر و تفهیم ، بلافاصله اجرا می‌کنه !تفاوت عملکرد مفسر و کامپایلر !و این دقیقاً یکی از تفاوت‌های بین مفسر و کامپایلره. کامپایلرها فقط ترجمه می‌کنن ؛ ولی مفسرها می‌فهمن ؛ به همین دلیله که زبان‌های برنامه‌نویسی مفسری ، نسبت به کامپایلری ، کند تر هستن !ولی آیا کند بودن زبان‌های مفسری مثل پایتون و جاوا اسکریپت ، واقعاً چیز بدیه ؟ ما خیلی نمی‌تونیم این مسئله رو ، یه عیب واقعاً دردناک تلقی کنیم ! البته نامردی نکنیم و مفسرها رو اینقدر بد نشون ندیم !یه خرده هم از خوبی‌های مفسری‌ها هم بگیم دیگه ! نه ؟!کامپایلر ، کد رو یه از اوّل تا آخر ور دل خودش اجرا می‌کنه ، اگه مشکلی بود ، اِرور میده ، اگه نه که ، کد رو به زبان ماشین ترجمه می‌کنه. ولیکن ، مفسری ، کد ها رو خط به خط (شبیه به الگوی برنامه‌نویسی رویه‌ای !) ، اجرا می‌کنه. بدین ترتیب هر وقت به یه کد اشتباه رسید ، اِرور میده ؛ در غیر این صورت ... اِروری نمیده ! کامپایلر ، دانش‌آموزیه که درس رو فقط می‌خونه و حفظ می‌کنه ؛ مفسر ، دانش‌آموزیه که درس رو درک می‌کنه !زبان‌های مفسری ، نسبت به زبان‌های کامپایلری ، سطح بالاتری دارن. زبان‌های مثل پایتون ( python ) ، جاوا اسکریپت ( Java script ) ، روبی ( Ruby ) ، پی‌ایچ‌پی ( php ) و ... مفسری هستن.سخن پایانیتصویری متشکل از مهم‌ترین زبان‌های برنامه‌نویسی !در این متن ، سعی شد که این مفهوم کامپایلری و مفسری که بعضاً باهاش مشکل دارن رو به زبانی ساده توضیح بدیم ؛ در پایان ، بگم که ما تازه داریم یاد می‌گیریم ؛ و در مسیر زندگی‌مون ( نه تنها برنامه‌نویسی‌مون ! ) ، باید مثل کامپایلرها دقیق و منظم باشیم و مثل مفسرها فکر کنیم و مفهومی عمل کنیم. ما نه تنها این بحث رو تموم نکردیم ... بلکه تازه شروع کردیم !موفق باشید !- محمّد نادری‌پیکر -