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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: اساس کار مفسر ها چیست؟  (دفعات بازدید: 6071 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین alireza.crs

  • Sr. Member
  • *
  • ارسال: 491
  • جنسیت : پسر
اساس کار مفسر ها چیست؟
« : 18 خرداد 1393، 12:21 ق‌ظ »
با عرض سلام و احترام.
یه سوالی برام پیش اومده .مفسر هایی مثل مفسر پایتون چطور گاهی الگوریتم های پیچیده و بسیار طولانی رو خط به خط تفسیر میکنن و مثلا تو یه خط ۱۰ تا عمل نوشتیم و اون تشخیص میده این عمل چیه چند تا عمل وجود داره اولویت هاشون چیه و .....
یا مثلا یه ماشین حساب پیشرفته که بهش یک عبارت جبری طولانی رو میدیم و اون فقط همین متن داده شده رو داره و
مهم نیست بلند باشه یا کوتاه زود اولویت بندی میکنه(با پرانتز ها و ..... )و محاسبه میکنه و جوابو میده
این مفسر ها و کامپایلر ها از چه الگوریتمی  استفاده میکنن که میفهمن درون هر خط چیه و چه چیزی خواسته و چند تا عمل وجود داره و یا خطایی وجود داره و ....
اگه بخوام یه چنین مفسری بنویسم باید چه مبحثی رو بخونم؟

آفلاین majidkamali1370

  • Hero Member
  • *
  • ارسال: 928
  • جنسیت : پسر
پاسخ : اساس کار مفسر ها چیست؟
« پاسخ #1 : 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
Ubuntu 14.04 LTS 64-bit - unity

آفلاین shervinkh

  • Full Member
  • *
  • ارسال: 197
  • جنسیت : پسر
  • An ENFP
    • سایت شخصی
پاسخ : اساس کار مفسر ها چیست؟
« پاسخ #2 : 18 خرداد 1393، 06:29 ق‌ظ »
نقل‌قول
اگه بخوام یه چنین مفسری بنویسم باید چه مبحثی رو بخونم؟

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



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

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 مثلا این ۲ بخش آخر از بین میره و بعد از بهینه سازی درخت، درخت اجرا میشه توسط برنامه.
Gentoo KDE x86_64
Notebook:Asus N53SN
www.shervin.org

آفلاین alireza.crs

  • Sr. Member
  • *
  • ارسال: 491
  • جنسیت : پسر
پاسخ : اساس کار مفسر ها چیست؟
« پاسخ #3 : 18 خرداد 1393، 10:53 ق‌ظ »
خیلی ممنون
جواب هاتون خیلی کامل بود

آفلاین ارباب!

  • Sr. Member
  • *
  • ارسال: 448
  • جنسیت : پسر
پاسخ : اساس کار مفسر ها چیست؟
« پاسخ #4 : 10 تیر 1393، 08:02 ب‌ظ »
سلام دوست عزیز!
من تو این زمینه فعالیت می کنم... اگه دنبال یه راه آسون برای شروع هستید می تونید از Whittle در Ruby استفاده کنید: https://github.com/d11wtq/whittle
Void Linux + XFCE

آفلاین QSBuntu

  • High Sr. Member
  • *
  • ارسال: 613
  • جنسیت : پسر
پاسخ : اساس کار مفسر ها چیست؟
« پاسخ #5 : 11 تیر 1393، 12:28 ق‌ظ »
همونجور که دوستان توضیح دادند مبحثی که مطرح کردی مربوط به کامپایلرها و روش کارشونه
به طور کلی دارای  هفت مرحله است (عکس1)
یه مقدار از روال اینه که اول میاد تو لکسیکال آنالیزر توکن ها رو شناسایی میکنه و بعدش پارس تری میسازه و از لحاظ نحوی و معنایی بررسی انجام میده و بعدش تبدیل به کد میانیش میکنه و بهینه سازی و کد جنریت میکنه و... (شکل 2و3)

( بیخیال ... خودمم نفهمیدم چی گفتم :) ... راه راحت:  اسلایدهاش رو میتونی ازاین لینکدانلود کنی و ببینی :) )

این هم لینک دانلود کتاب کامپایلر آیهو
« آخرین ویرایش: 15 تیر 1393، 01:07 ق‌ظ توسط 2020s1371 »
زندگی خواهم کرد... خواهم زیست ... و میجنگم حتی اگر........................

آفلاین !

  • High Sr. Member
  • *
  • ارسال: 586
  • جنسیت : پسر
  • Don't Panic!
    • مانیتورینگ سایت
پاسخ : اساس کار مفسر ها چیست؟
« پاسخ #6 : 14 تیر 1393، 01:51 ب‌ظ »
این کورس کامپایلر رو تو کورسرا ببین :

خیلی خوبه.
I just felt like running

Altern AI Directory --- GitHub

آفلاین alireza.crs

  • Sr. Member
  • *
  • ارسال: 491
  • جنسیت : پسر
پاسخ : اساس کار مفسر ها چیست؟
« پاسخ #7 : 14 تیر 1393، 07:51 ب‌ظ »
خیلی ممنون دوستان پاسخ ها و منابع معرفی شده رو در حدی که زبان انگلیسیم میکشید خوندم
اما ... با این تفاسیر تفاوت کامپایلر با مفسر چیه؟

آفلاین ava

  • High Hero Member
  • *
  • ارسال: 1330
پاسخ : اساس کار مفسر ها چیست؟
« پاسخ #8 : 14 تیر 1393، 08:30 ب‌ظ »
خیلی ممنون دوستان پاسخ ها و منابع معرفی شده رو در حدی که زبان انگلیسیم میکشید خوندم
اما ... با این تفاسیر تفاوت کامپایلر با مفسر چیه؟
کامپایلر برنامه رو تبدیل میکنه به زبان ماشین قابل اجرا و بهت یه پک میده
در حالی که مفسر همون لحظه کد رو اجرا میکنه و نتیجه رو نشون میده و بعدا مجدد اگه بخوای برنامه اجرا بشه بازم باید توسط مفسر اجرا کنی و یه برنامه به زبان ماشین نیست که بلافاصله اجرا بشه
اصولا برنامه ای که کامپایل شده رو میتونی روی ماشین های مختلف راحت جا بجا کنی و استفاده کنی در حالی که اگه از یک زبان تفسیری مثل پایتون استفاده بشه یا برنامه کامپایل نشده باشه هنوز باید روی اون ماشین که میخوای اجرا کنی مفسر یا کامپایلر رو نصب و برنامه رو اجرا کنی که کمی اذیت کننده هست
صدای پلیس : هاپ هاپ

آفلاین QSBuntu

  • High Sr. Member
  • *
  • ارسال: 613
  • جنسیت : پسر
پاسخ : اساس کار مفسر ها چیست؟
« پاسخ #9 : 15 تیر 1393، 01:21 ق‌ظ »
خیلی ممنون دوستان پاسخ ها و منابع معرفی شده رو در حدی که زبان انگلیسیم میکشید خوندم
اما ... با این تفاسیر تفاوت کامپایلر با مفسر چیه؟

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

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

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