بهترین استادان ، آنهایی نیستند که فنی تدریس میکنند ؛ کسانی هستند که ساده ، درس میدهند !
کامپایلری یا مفسری ؟ مسئله این است !
از وقتی که بشر ، زبان باینری ( 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 ) و ... مفسری هستن.
سخن پایانی
در این متن ، سعی شد که این مفهوم کامپایلری و مفسری که بعضاً باهاش مشکل دارن رو به زبانی ساده توضیح بدیم ؛ در پایان ، بگم که ما تازه داریم یاد میگیریم ؛ و در مسیر زندگیمون ( نه تنها برنامهنویسیمون ! ) ، باید مثل کامپایلرها دقیق و منظم باشیم و مثل مفسرها فکر کنیم و مفهومی عمل کنیم. ما نه تنها این بحث رو تموم نکردیم ... بلکه تازه شروع کردیم !
موفق باشید !
- محمّد نادریپیکر -
مطلبی دیگر از این انتشارات
نسبیت عام به زبان پروفسور برایان گرین !
مطلبی دیگر از این انتشارات
آموزش سخن گفتن به زبان کامپیوتر ، برای افراد بیدانش !
بر اساس علایق شما
آدمهای درست،زمانِ اشتباه!