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

تصویری بدیهی از جهان باینری !
تصویری بدیهی از جهان باینری !


از وقتی که بشر ، زبان باینری ( 0 و 1 ) رو به زبان‌های برنامه‌نویسی کنونی تبدیل کرده ، تا به امروز ، ملاک‌های بسیار زیادی برای طبقه‌بندی زبان‌های برنامه‌نویسی بوجود اومده.

یکی از ملاک‌ها ، مفسری یا کامپایلری بودن زبان برنامه‌نویسیه.


امّا این‌ها به چه مفهومی هستن ؟ و به چه درد می‌خورن و اساس کارشون چیه ؟


قبل از اینکه بخوایم بریم سراغ مفسری‌ها ( interpreters ) و کامپایلری‌ها ( compilers ) ، باید چند اصل پایه رو بدونیم.


ما یک مفهومی داریم به اسم : سطح ( level ).


اون وقت ، دقیقاً سطح چیه ؟ سطح ، در واقع نمایانگر میزان نزدیک بودن یه زبان برنامه‌نویسی به زبان انسانه !

حالا بیاین ببینیم این تعریف دقیقاً یعنی چی ؟


سطح شناسی !

بذارین با یه مثال بسیار ساده ، این به اصطلاح سطح ، رو توضیح بدم.


مثال : من از شما می‌خوام که صفر رو به من نشون بدید !

  • اگه یه انسان باشید ، می‌تونید صفر رو به زبان انسان نشون بدید : صفر ، 0 ، Zero و ...
  • ولی یه کامپیوتر ، فقط می‌تونه صفر رو به این صورت نشون بده : 0000


در واقع 0000 به زبان باینری ! در این زبان ، 0000 ارزشی داره برابر با 0.

ولی یه انسان سالم هیچ‌وقت نمیگه 0000 ! ( صفر،صفر،صفر،صفر ؟! )


و این چنینه که زبان کامپیوتر و انسان از زمین تا آسمون با هم ، تفاوت داره !


حالا ... اگه برنامه‌نویسی تا حدودی ( حتّی تا حد خیلی کمی ! ) بلد باشید ، حرف من رو متوجه میشید ! :

ما در زبان‌های برنامه‌نویسی ، عدد صفر رو به چه صورت نشون میدیم ؟ معلومه ! : 0 !


عجیب نیست ؟! ما داریم در زبان‌های برنامه‌نویسی که خودشون از زبان کامپیوتر ساخته شدن ، به زبون آدمیزاد ، حرف می‌زنیم !


حتّی اگه بخوایم می‌تونیم این لغت Zero رو تعریف کنیم :

Zero = 0

بدین ترتیب ، Zero هم میشه نمادی از 0 !


ولی ما چطور داریم در زبان‌های برنامه‌نویسی ، این طوری حرف می‌زنیم ؟


جوابش برمیگرده به همون بحث سطح !

ما 3 نوع سطح اصلی داریم :

  • 1. سطح بالا - high level
  • 2. سطح متوسط - middle level
  • 3. سطح پایین - low level
سهم زبان‌های برنامه‌نویسی از سطح بالایی !
سهم زبان‌های برنامه‌نویسی از سطح بالایی !


اگه کد های ما ، به زبون آدمیزاد نزدیکتر باشه ، میگیم اون زبان برنامه‌نویسی ، سطح بالاست ! ( یا به اصطلاح جوون ها ، گَنگ‌ش بالاست ! )

امّا اگه به زبان سخت و جان‌فرسای کامپیوتری ، نزدیکتر باشه ، میگیم که سطح پایینه.

سطح متوسط هم بدین معناست که زبان ما ، سطحی بین زبان انسان و کامپیوتر داره.


تا کنون فهمیدیم سطح چیه و چطور ارزیابی و طبقه‌بندی میشه.


ولی چطور میشه در یک زبان برنامه‌نویسی به زبان انسان حرف زد ؟!

و اینکه سطح چه ربطی به مفهوم کامپایلری و مفسری داره ؟!


با ما باشید !

کامپایلر ها ، ترجمه‌گرانی موقر !

به این حکایت پربار ، توجه کنید ! :

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

گوسفند گفت : بَـــــــــــــــــــــــــــع !

گوسفند مذکور !!!
گوسفند مذکور !!!


مسئله‌ی تبدیل زبان انسان به کامپیوتر ، مثل همین حکایته که یه چوپان با گوسفندش ، بحث کنه !


حالا تصوّر کنید ! :

یک شخص روسی زبان ، می‌خواد با یک ایرانی پارسی زبان ملاقات کنه. وقتی فرد روس ، صحبت می‌کنه ، فرد ایرانی ، متوجه زبان روسی نمیشه ! پس باید بره زبان روسی رو به طور کامل و حرفه‌ای ، یاد بگیره ؛ ولی این کار خیلی طول میکشه. پس فرد ایرانی میره یه مترجم استخدام می‌کنه. و فرد مترجم ، زبان روسی رو برای فرد ایرانی ترجمه می‌کنه و فرد ایرانی ، متوجه میشه !



در اینجا زبان روسی ، در واقع همون زبان سطح بالای انسان و زبان ایرانی ، زبان سطح پایین کامپیوتره ؛ و در این بین مترجم ، میشه همین کامپایلر قضیه !


کامپایلر ، در جهان واقعی هم به معنای مترجمه. و زبان کامپایلری یعنی زبان ترجمه شده.


و این در واقع ، کل کار کامپایلر ، به زبان ساده‌ست ! کامپایلر ، کد های سطح بالا رو به کد های سطح پایین ترجمه می‌کنه تا کامپیوتر بتونه اون مفاهیم رو بهتر درک کنه ! مثال :

وقتی ما عدد 0 رو در یک زبان برنامه‌نویسی کامپایلری وارد کنیم ، این 0 ، وارد کامپایلر میشه ، کامپایلر هم اون رو به 0000 ، ترجمه می‌کنه ؛ و به همین منوال ، بقیه‌ی مراحل !

الگوریتم کار یک کامپایلر !
الگوریتم کار یک کامپایلر !


فرصتی برای یادگیری اعداد 1 تا 10 ، به زبان کامپیوتر ! :

  • 0 = 0000
  • 1 = 0001
  • 2 = 0010
  • 3 = 0011
  • 4 = 0100
  • 5 = 0101
  • 6 = 0110
  • 7 = 0111
  • 8 = 1000
  • 9 = 1001
  • 10 = 0001 0000


پس ، یاد گرفتیم که کار کامپایلر چگونه‌ست و به چه صورته. زبان‌های برنامه‌نویسی کامپایلری ، به مراتب ، سریع تر از زبان‌های مفسری هستن. زبان‌هایی مثل سی‌شارپ ( #C ) ، جاوا ( Java ) ، کاتلین ( Kotlin ) ، سی‌پلاس‌پلاس ( ++C ) ، سی ( C ) ، گولنگ ( Golang ) ، پاسکال ( Pascal ) ، ویژوآل بیسیک ( VB ) و ... ، کامپایلری هستن.


حالا اساس کار کامپایلر در این زبان‌ها چیه ؟

ما برای اجرا کردن کدهامون باید از run استفاده کنیم ؛ این کلید run ، در اکثر برنامه‌های کد نویسی موجوده ! ولی این کلید ، فقط در صورتی کار می‌کنه که کامپایلر اون زبان برنامه‌نویسی رو داشته باشیم ! برای نمونه ، ما برای اجرا کردن کدهای سی‌شارپ نیاز به کامپایلر سی‌شارپ داریم که این کامپایلر رو می‌تونیم از نرم‌افزار ویژوآل استودیو نصب کنیم ! اسم این کامپایلر NET. هست که برای کامپایل کردن کدهای سی‌شارپ ، ویژوآل بیسیک و ... به کار میره.


زبان‌های کامپایلری ، بر اساس الگوی زبان ماشین و زبان اسمبلی ( Assembly ) ساخته شدن ! ( زبان اسمبلی ، جزء اوّلین و ابتدایی‌ترین زبان‌های کامپایلری تاریخ به حساب میاد. )


و این است قدرت کامپایلر ها !

دقت داشته باشید که کامپیوتر بعد از کامپایل کدها میگه :
دقت داشته باشید که کامپیوتر بعد از کامپایل کدها میگه : "اوه ، حالا می‌فهمم !" ؛ این دقیقاً به همین ترجمه‌گری کامپایلر مربوط میشه !


مفسری‌ها ، نخبگانی مجرب !

بعد از مترجم‌ها ، نوبت تفسیر کننده هاست !


یه داستان جالب :

برخی از ادیان اصلی ، کتاب‌های آسمانی دارن. مثل همین قرآن خودمون. قرآن ، زبانش عربیه. پس مسلماً ما فارسی زبان‌ها بدون ترجمه متوجه عربی نمیشیم ؛ بنابراین ، یه فرد میاد و قرآن رو ترجمه می‌کنه ؛ بعد ما می‌تونیم تا مقدار لازم ، مسئله رو درک کنیم ؛ ترجمه نماد کامپایله ؛ ولی حالا مفسر کجاست ؟! جایی که قرآن در کتاب‌هایی دیگه تفسیر میشه و مفاهیم درونی‌ش به مفاهیم کوچیک‌تری ، خرد میشه ، و ما می‌تونیم ، قرآن رو بفهمیم ؛ این تفسیر دقیقاً کار مفسره !


مفسر ، کدهای ما رو قطعه قطعه می‌کنه و هر کدوم رو سعی می‌کنه به طور جدا بفهمه ! به زبانی ساده‌تر ، مفسر ، کدها رو به زبان کامپیوتر ، ترجمه نمی‌کنه ؛ اون کدها رو پس از تفسیر و تفهیم ، بلافاصله اجرا می‌کنه !


تفاوت عملکرد مفسر و کامپایلر !
تفاوت عملکرد مفسر و کامپایلر !


و این دقیقاً یکی از تفاوت‌های بین مفسر و کامپایلره.

کامپایلرها فقط ترجمه می‌کنن ؛ ولی مفسرها می‌فهمن ؛ به همین دلیله که زبان‌های برنامه‌نویسی مفسری ، نسبت به کامپایلری ، کند تر هستن !


ولی آیا کند بودن زبان‌های مفسری مثل پایتون و جاوا اسکریپت ، واقعاً چیز بدیه ؟


ما خیلی نمی‌تونیم این مسئله رو ، یه عیب واقعاً دردناک تلقی کنیم ! البته نامردی نکنیم و مفسرها رو اینقدر بد نشون ندیم !


یه خرده هم از خوبی‌های مفسری‌ها هم بگیم دیگه ! نه ؟!


کامپایلر ، کد رو یه از اوّل تا آخر ور دل خودش اجرا می‌کنه ، اگه مشکلی بود ، اِرور میده ، اگه نه که ، کد رو به زبان ماشین ترجمه می‌کنه.

ولیکن ، مفسری ، کد ها رو خط به خط (شبیه به الگوی برنامه‌نویسی رویه‌ای !) ، اجرا می‌کنه. بدین ترتیب هر وقت به یه کد اشتباه رسید ، اِرور میده ؛ در غیر این صورت ... اِروری نمیده !


کامپایلر ، دانش‌آموزیه که درس رو فقط می‌خونه و حفظ می‌کنه ؛ مفسر ، دانش‌آموزیه که درس رو درک می‌کنه !


زبان‌های مفسری ، نسبت به زبان‌های کامپایلری ، سطح بالاتری دارن. زبان‌های مثل پایتون ( python ) ، جاوا اسکریپت ( Java script ) ، روبی ( Ruby ) ، پی‌ایچ‌پی ( php ) و ... مفسری هستن.


سخن پایانی

تصویری متشکل از مهم‌ترین زبان‌های برنامه‌نویسی !
تصویری متشکل از مهم‌ترین زبان‌های برنامه‌نویسی !

در این متن ، سعی شد که این مفهوم کامپایلری و مفسری که بعضاً باهاش مشکل دارن رو به زبانی ساده توضیح بدیم ؛ در پایان ، بگم که ما تازه داریم یاد می‌گیریم ؛ و در مسیر زندگی‌مون ( نه تنها برنامه‌نویسی‌مون ! ) ، باید مثل کامپایلرها دقیق و منظم باشیم و مثل مفسرها فکر کنیم و مفهومی عمل کنیم. ما نه تنها این بحث رو تموم نکردیم ... بلکه تازه شروع کردیم !


موفق باشید !

- محمّد نادری‌پیکر -