انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: alireza.crs در 18 خرداد 1393، 12:21 ق‌ظ

عنوان: اساس کار مفسر ها چیست؟
ارسال شده توسط: alireza.crs در 18 خرداد 1393، 12:21 ق‌ظ
با عرض سلام و احترام.
یه سوالی برام پیش اومده .مفسر هایی مثل مفسر پایتون چطور گاهی الگوریتم های پیچیده و بسیار طولانی رو خط به خط تفسیر میکنن و مثلا تو یه خط ۱۰ تا عمل نوشتیم و اون تشخیص میده این عمل چیه چند تا عمل وجود داره اولویت هاشون چیه و .....
یا مثلا یه ماشین حساب پیشرفته که بهش یک عبارت جبری طولانی رو میدیم و اون فقط همین متن داده شده رو داره و
مهم نیست بلند باشه یا کوتاه زود اولویت بندی میکنه(با پرانتز ها و ..... )و محاسبه میکنه و جوابو میده
این مفسر ها و کامپایلر ها از چه الگوریتمی  استفاده میکنن که میفهمن درون هر خط چیه و چه چیزی خواسته و چند تا عمل وجود داره و یا خطایی وجود داره و ....
اگه بخوام یه چنین مفسری بنویسم باید چه مبحثی رو بخونم؟
عنوان: پاسخ : اساس کار مفسر ها چیست؟
ارسال شده توسط: majidkamali1370 در 18 خرداد 1393، 12:46 ق‌ظ
سلام.
به صورت ساده بخوام بگم، کامپایلرها (یا همون ماشین حساب که مثال زدید) اینجوری عمل میکنن:
مثلا من یه عبارت به صورت زیر نوشتم:
2 + 5کامپایلر اونو تبدیل به این میکنه:
2 5 +اسم این کار یادم نیست ولی در واقع این کارو انجام میده که با استفاده از پشته (Stack)، عبارت رو ساده سازی کنه.
مثلا اینو:
5 + 7 * 3به این تبدیل میکنه:
5 7 3 * +
این چجوری کار میکنه؟
توی مثال اولی که اسونتر هست:
میاد عدد ۲ و ۵ رو میخونه و اپراتور رو هم میخونه. چون اپراتور از نوع دوتایی هست (نیاز به دوتا عدد داره)، اون اپراتور رو روی اون دوتا عدد اعمال میکنه. یعنی ۲ رو با ۵ جمع میکنه.
توی مثال دوم:
اعداد رو اینقدر میخونه تا برسه به اولین اپراتور، باز چون ضرب اپراتور دوتایی هست، اول ۷ و ۳ رو توی هم ضرب میکنه. مرحله بعدی، به این تبدیل میشه:
5 21 +که شد مثل عبارت بالا :)

حالا فرض کن این وسط یه تابع یا همچین چیزی داشته باشیم. فرقی نمیکنه. اول میره و مقدار اون تابع رو حساب میکنه و بعد عبارت رو حساب میکنه. مثلا:
5 * sin(1.57079)میشه:
5 * 1میشه:
5 1 *که میشه ۵ :)

امیدوارم درست گفته باشم ;D
عنوان: پاسخ : اساس کار مفسر ها چیست؟
ارسال شده توسط: shervinkh در 18 خرداد 1393، 06:29 ق‌ظ
نقل‌قول
اگه بخوام یه چنین مفسری بنویسم باید چه مبحثی رو بخونم؟

در این زمینه می تونید به این کتاب مراجعه کنید:
Compilers:Principles,Techniques,and Tools
گویا در جوامع دانشگاهی این کتاب به نام Dragon Book هم شناخته میشه  :) من خودمم برای علاقه مندی به مبحث خوندم اینارو. البته خیلی مفصله و همه چیزو توضیح داده برای نوشتن کامپایلر. می تونید هر قسمت شو که علاقه داشتید بخونید. همونطور که دوست بالایی گفتن مثلا در تبدیل عبارات محاسباتی بر اساس اولویت با استفاده از یک سری ابزار و عبارات منظم (Regular Expression) یک درخت (Parse Tree) می سازه و براساس اون کد رو می سازه. حالا به جای عملگر های + و × و اینا می تونن تابع هایی که توسط کاربر یا سیستم عامل یا زبان برنامه نویسی تعریف شدن باشن. این برنامه پردازش یک رشته محاسباتی از جمع و ضرب و تفریق و پرانتز اینا رو خودتون هم می تونید با هر زبان برنامه نویسی بدون Regular Experesion و یا با استفاده از تابع هایی که به هم باز می گردند یا با استفاده از دو Stack برای عدد ها و عملگر ها بنویسید.

(https://www.relisoft.com/book/lang/poly/images/Image38.gif)

ٔدر کل چندین مرحله کلی داره کامپایل کردن (خلاصه):

Lexical Analysis که در این مرحله فایل ورودی برنامه به کلمات قابل فهم برای کامپیوتر تبدیل میشه مثلا این:
fn("salam");میشه ۵ تا عبارت:
fn که یا کلمه کلیدی هست یا نام یک تابع
علامت پرانتز باز
اشاره گر به یک رشته (در این مرحله یک resource ساخته میشه و رشته رو نگه میداره و این کلمه حاوی اشاره گر به اون resource هست)
علامت پرانتز بسته
علامت ;

(فکر کنم کلمه درستش Lexeme بود که من کلمه ترجمه کردم)
این مرحله توسط یک برنامه Lexer و به کمک  Regular Experession ها انجام میگیره.

مرحله بعدی Parsing هست که از کلمه ها درخت میسازه (مثلا یعنی از کلمه ها به جمله ها می رسیم) مثل شکل بالا;این مرحله هم باRegular Experession و Context-Free Grammer ها که گرامر یک  زبان رو توضیح میدن و شبیه همون Regular Experesion ها هستن و یک برنامه parser انجام میشه.

بعد هم Semantic Analysis که معنی جمله هارو بررسی می کنه و می فهمه و خطا ها هم پیدا می کنه مثلا در C++ اگه در یک متغیر String بخواهیم عدد بریزیم خطای Semantic پیش میاد.

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

حالا در بحث Interpreter مثلا این ۲ بخش آخر از بین میره و بعد از بهینه سازی درخت، درخت اجرا میشه توسط برنامه.
عنوان: پاسخ : اساس کار مفسر ها چیست؟
ارسال شده توسط: alireza.crs در 18 خرداد 1393، 10:53 ق‌ظ
خیلی ممنون
جواب هاتون خیلی کامل بود
عنوان: پاسخ : اساس کار مفسر ها چیست؟
ارسال شده توسط: ارباب! در 10 تیر 1393، 08:02 ب‌ظ
سلام دوست عزیز!
من تو این زمینه فعالیت می کنم... اگه دنبال یه راه آسون برای شروع هستید می تونید از Whittle در Ruby استفاده کنید: https://github.com/d11wtq/whittle (https://github.com/d11wtq/whittle)
عنوان: پاسخ : اساس کار مفسر ها چیست؟
ارسال شده توسط: QSBuntu در 11 تیر 1393، 12:28 ق‌ظ
همونجور که دوستان توضیح دادند مبحثی که مطرح کردی مربوط به کامپایلرها و روش کارشونه
به طور کلی دارای  هفت مرحله است (عکس1)
یه مقدار از روال اینه که اول میاد تو لکسیکال آنالیزر توکن ها رو شناسایی میکنه و بعدش پارس تری میسازه و از لحاظ نحوی و معنایی بررسی انجام میده و بعدش تبدیل به کد میانیش میکنه و بهینه سازی و کد جنریت میکنه و... (شکل 2و3)

( بیخیال ... خودمم نفهمیدم چی گفتم :) ... راه راحت:  اسلایدهاش رو میتونی ازاین لینک (http://bayanbox.ir/id/3795061029520673907?download)دانلود کنی و ببینی :) )

این هم لینک دانلود کتاب کامپایلر آیهو (http://sei.pku.edu.cn/~yaoguo/ACT11/DragonBook-2v2.pdf)
عنوان: پاسخ : اساس کار مفسر ها چیست؟
ارسال شده توسط: ! در 14 تیر 1393، 01:51 ب‌ظ
این کورس کامپایلر رو تو کورسرا ببین :
https://www.coursera.org/course/compilers

خیلی خوبه.
عنوان: پاسخ : اساس کار مفسر ها چیست؟
ارسال شده توسط: alireza.crs در 14 تیر 1393، 07:51 ب‌ظ
خیلی ممنون دوستان پاسخ ها و منابع معرفی شده رو در حدی که زبان انگلیسیم میکشید خوندم
اما ... با این تفاسیر تفاوت کامپایلر با مفسر چیه؟
عنوان: پاسخ : اساس کار مفسر ها چیست؟
ارسال شده توسط: ava در 14 تیر 1393، 08:30 ب‌ظ
خیلی ممنون دوستان پاسخ ها و منابع معرفی شده رو در حدی که زبان انگلیسیم میکشید خوندم
اما ... با این تفاسیر تفاوت کامپایلر با مفسر چیه؟
کامپایلر برنامه رو تبدیل میکنه به زبان ماشین قابل اجرا و بهت یه پک میده
در حالی که مفسر همون لحظه کد رو اجرا میکنه و نتیجه رو نشون میده و بعدا مجدد اگه بخوای برنامه اجرا بشه بازم باید توسط مفسر اجرا کنی و یه برنامه به زبان ماشین نیست که بلافاصله اجرا بشه
اصولا برنامه ای که کامپایل شده رو میتونی روی ماشین های مختلف راحت جا بجا کنی و استفاده کنی در حالی که اگه از یک زبان تفسیری مثل پایتون استفاده بشه یا برنامه کامپایل نشده باشه هنوز باید روی اون ماشین که میخوای اجرا کنی مفسر یا کامپایلر رو نصب و برنامه رو اجرا کنی که کمی اذیت کننده هست
عنوان: پاسخ : اساس کار مفسر ها چیست؟
ارسال شده توسط: QSBuntu در 15 تیر 1393، 01:21 ق‌ظ
خیلی ممنون دوستان پاسخ ها و منابع معرفی شده رو در حدی که زبان انگلیسیم میکشید خوندم
اما ... با این تفاسیر تفاوت کامپایلر با مفسر چیه؟

فکر کنم از اسلایدایی که لینکش رو بت دادم اسلاید اول صفحه ۳ تا ۵ رو بخونی جواب سوالت رو بگیری (برای راحتی عکس هاش رو ضمیمه میکنم )

ترجیح میدم بجای توضیح دادن من اون اسلاید رو بخونی بیشتر چیز گیرت میاد
فقط این رو بعد از خوندن این چند صفحه بخون تا با این مثال بهتر مطلب رو بگیری:

حلقه ای مثله حلقه ی for توی کامپایلر یکبار ترجمه میشه و تبدیل به زبان ماشین (تارگت پروگرم) میشه و بعدا که ورودی به این تارگت داده میشه بر اساس اون حلقه تکرار میشه و خروجی تولید میشه
ولی توی مفسر ورودی با برنامه گرفته میشه و برای هر بار اجرای حلقه یکبار ترجمه انجام میشه
مثال راحت تر این حلقه رو در نظر بگیر for(int a=1;a<=10;a++)این حلقه توی کامپایلر یک بار نیاز به ترجمه داره ولی توی مفسر ده بار ترجمه صورت میگیره و برای همین سرعت مفسر کمتره!
مثلا یه دلیل تفاوت جاوا و سی++ هم همینه