PDA

View Full Version : طراحی مفسر



idea novin
سه شنبه 04 بهمن 1390, 11:30 صبح
سلام وقتتون بخیر
میخواسم راهنمایی بگیرم واسه نحوه طراحی مفسر ربان های برنامه نویسی با سی...اگه کمکم کنید ممنون میشم

soorena
سه شنبه 04 بهمن 1390, 14:10 عصر
جسارت نشه شما اول از چیز‌های ساده تر شروع بکن بعد ایشالا به اینجا هم میرسی‌.شما اول باید تمام ساختمان داده هارو بشناسید بعد از اون باید روش‌های پارسینگ رو بری یاد بگیری بعد روش‌های مختلف دست بندی... خلاصه کار سادیی نیست به نظرم.

idea novin
سه شنبه 04 بهمن 1390, 14:53 عصر
حق با شماست اما من نیاز فوری دارم بهش هرچی باید بلد باشم بگید تا بخونمش...

maktoom
سه شنبه 04 بهمن 1390, 21:36 عصر
سلام
حداقل چیزهایی که باید مسلط باشید منابع طراحی کامپایلر ها است.
و بعد از اون یه تیم حرفه ای از برنامه نویسان.
شما واقعا می خواید کامپایلر بنویسید یا یه برنامه ای که تقلیدی از یکی از پارسرها باشه؟

idea novin
سه شنبه 04 بهمن 1390, 22:31 عصر
نه یه مفسر ساده...که با کمک ارایه و فایل و هدرها نوشته میشه

maktoom
چهارشنبه 05 بهمن 1390, 22:14 عصر
بیاید ببینیم شما دارید درمورد چی صحبت می کنید.
یه کامپایلر باید اولا کاراکتر به کاراکتر از ورودی بخونه و نوع اون رو به همراهه خودش(یعنی توکن) رو مشخص کنه اضافات رو حذف کنه و بتونه متغیر رو از کلمات کلیدی زبان هم فرق بذاره.
مرحله بعدی باید باید از لحاظ نحوی تشخیص بده آیا عبارت وارد شده درسته یا نه ودر مرحله بعد آیا عبارت وارد شده معنای درستی داره یا نه.
بعد از این مراحل ابتدایی باید تولید کد میانی رو انجام بده که مثلا میتونه یه سری کدهای سه قسمتی شبیه اسمبلی باشه.
در مرحله بعد باید کد رو بهینه کنه. یعنی حلقه های زاید یا مقادیر استفاده نشده یا ... رو بتونه تشخیص بده و حذف کنه.
در نهایت هم باید بتونه کد نهایی رو استخراج کنه.
این برنامه ایه که به معنایه یه کامپایلره. لااقل مفاهیم ابتداییش ایناست.
در برخی از مراحل کار برای کامپایلرهای یک زبان خاص ثابته اما در برخی از مراحل بستگی داره از چه گرامری استفاده می کنید.
در یکی از تاپیکها بطور مفصل در مورد گرامر تقدم عملگر و نحوه پیاده سازیش صحبت شده.(یکی از روشهای موجود برای یکی از تحلیلگرها )
اینجا (http://barnamenevis.org/showthread.php?323223-پیاده‌سازی-جدول-روابط-تقدمی) و اینجا (http://barnamenevis.org/showthread.php?322923-آیا-می-توان-برای-برنامه-c-یا-c-کامپایلر-نوشت-؟-لطفا-کمک-کنید.) رو هم ببینید.

irpersian20
چهارشنبه 05 بهمن 1390, 23:59 عصر
جسارت نشه شما اول از چیز‌های ساده تر شروع بکن بعد ایشالا به اینجا هم میرسی‌.شما اول باید تمام ساختمان داده هارو بشناسید بعد از اون باید روش‌های پارسینگ رو بری یاد بگیری بعد روش‌های مختلف دست بندی... خلاصه کار سادیی نیست به نظرم.
جدا از این موضوع برای طراحی یک کامپایلر اصولا چه مباحثی رو باید خوب بلد بود و مسلط شد؟

IamOverlord
پنج شنبه 06 بهمن 1390, 00:17 صبح
ببینید اولا که شما باید به راحتی پردازش رشته کنی.
باید به زبان مقصدت مسلط باشی یا حداقل سر در بیاری چی به چیه.
لازم نیست زبان ماشین رو حفظ باشی! حتی اگه Assembly رو هم با Instruction ها و با نحوه ی برنامه نویسیش آشنا باشی کافیه.
بعدشم این که ساخت کامپایلر به صورت اصولی چند تا فاز مختلف داره که هم باید تئوری در موردشون بخونی، هم توصیه می کنم حتما یه سورس کدی در اون رابطه ببینی. این فاز ها Lexical Analysor، Parser و ... هستند که بهتره در رابطه شون تحقیق کنی. اتفاقا منابع فارسی خوب در این رابطه پیدا می شه. یه سورس کدی هم در این رابطه در این تاپیک (http://barnamenevis.org/showthread.php?296021-%D8%B3%D8%A7%D8%AE%D8%AA-Compiler-%D9%88-%DB%8C%DA%A9-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AC%D8%AF%DB%8C%D8%AF) هست اگه می خوای خیلی ساده روش کار رو متوجه بشی.
در کل کامپایلر نوشتن کار غول آسایی نیست. بلکه کامپایلر خوب نوشتن ... مسئله است!
موفق باشی!

soorena
پنج شنبه 06 بهمن 1390, 00:37 صبح
در کل کامپایلر نوشتن کار غول آسایی نیست. بلکه کامپایلر خوب نوشتن ... مسئله است!
سلام

البته سوالی که تو این تاپیک مطرح شده هیچ ربطی به کامپایلر نداره و فقط طراحی یک مفسر هستش که خیلی‌ ساده تر از این حرفاست و می‌شه حتا یک نسخهٔ ابتدائی از اون رو بدون هیچ اطلاعاتی‌ از کامپایلر‌ها نوشت.ولی‌ نوشتن کامپایلر اونم برای برنامه‌های تحت ویندوز کار بسیار سختی‌ هستش که واقعا با خوندن یک کتاب طراحی کامپایلر یا این چیزا نمی‌شه انجامش داد.

IamOverlord
پنج شنبه 06 بهمن 1390, 00:53 صبح
سلام،

البته سوالی که تو این تاپیک مطرح شده هیچ ربطی به کامپایلر نداره
خوب من در پاسخ به این پست گفتم:

جدا از این موضوع برای طراحی یک کامپایلر اصولا چه مباحثی رو باید خوب بلد بود و مسلط شد؟

ببینید اگه بخواید روی اصول کار کنید، کامپایلر نوشتن و مفسر نوشتن هیچ فرقی با هم ندارند، جز زبان مقصدشون. برای اولی Op-Code های Machine هست و برای دومی یه زبان سطح بالاتر.


ولی‌ نوشتن کامپایلر اونم برای برنامه‌های تحت ویندوز کار بسیار سختی‌ هستش که واقعا با خوندن یک کتاب طراحی کامپایلر یا این چیزا نمی‌شه انجامش داد.
اگه یه کتاب تئوری خوب و مناسب در زمینه ی طراحی کامپایلر بخونید (حتی اگه فارسی باشه) و Win32 Assembly رو هم بلد باشید، می تونید یه کامپایلر خوب رو به روشی اصولی، برای نوشتن برنامه های Windows پیاده سازی کنید. اما قضیه این جاست که چرا یه کسی باید توش کد بزنه و چه خدماتی رو ارائه می ده که ارزششو داشته باشه؟ دیگه بقیه ی کار همت خودتون و کارهای گروهی هست.

shahmohammadi
پنج شنبه 06 بهمن 1390, 10:45 صبح
با سلام.
در مورد نوشتن مفسر می تونید به کتاب سی جعفر نژاد قمی مراجعه کنید.
یک فصلش کلا به این موضوع اختصاص داده شده.

Dera22
شنبه 28 مرداد 1391, 04:17 صبح
با سلام.
در مورد نوشتن مفسر می تونید به کتاب سی جعفر نژاد قمی مراجعه کنید.
یک فصلش کلا به این موضوع اختصاص داده شده.

سلام

من این فصل از کتاب آقای قمی رو مطالعه کردم
ولی در مورد پیاده سازی ها کاملا توضیح نداده
مثلا الگوی کلی برای تبدیل دستور if (کلا مفسری که نوشته خیلی خوبه ولی کامل نیست)

مگه یکی از فرق های مفسر و کامپایلر این نیست که توی کامپایلر کل بلاک ها و برنامه یه جا خونده و ترجمه میشن ولی توی مفسر فکر کنم نیازی نباشه که مثلا برنامه بدونه بلاک شروع و پایان یه دستور مثلا if چیه؛ یعنی هر خط رو مجزا ترجمه کنه و بره به خط بعد (درسته؟)

من باید یه برنامه بنویسم که تقریبا با استفاده از قوانین یه مفسر دو تا زبان رو به همدیگه تبدیل کنه
راستش چند تا سوال دارم و اگه ممکنه لطفا تا جایی که میشه راهنمایی کنید

- میشه لطفا یه الگوی کلی (نه کد) رو از ترجمه دستور for توضیح بدید
مثلا دستور for یا if در C++‎ رو وقتی کاراکتر به کاراکتر خوند ، عبارات رو تشخیص داد . میشه یه الگوریتم یا الگوی بهینه جهت ترجمه اون معرفی کنید؟
مثلا من تو برنامه بگم اگه پرانتز باز یا بسته توی دستور for دید یعنی از اینجا شروع شده یا در اینجا تموم شده؟به همون نسبت برای بقیه جدا کننده ها(; >= > < و... ) ؟
مثلا
اگه داشته باشم

for(i=0;i<=10;i++) //Start
}
.
.
.
{

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

hadi0x7c7
دوشنبه 30 مرداد 1391, 01:16 صبح
تا میتونید از جعفر نژاد قمی دوری کنید !
البته Herbert Schildt هم دسته کمی از جعفر نژاد قمی نداره !

کتاب The Art of C++‎‎ یه مفسر واسه سی پلاس پلاس داره. فصل ۹.
Herbert Schildt