سلام
موضوع جالبیه!
اول خیلی سطحی صفحه اول و صفحه آخر این تاپیک رو خوندم و خواستم یه نظر دیگه اینجا بنویسم... گفتم بذار کامل بخونمش. فکر نمی کردم اینقدر به این موضوع ساده نگاه کرده باشید.
ببینید یه نمونه خیلی ساده برای درخت تجزیه. ما می خوایم یه قانون بذاریم برای انواع عملیات ضرب و جمع و پرانتز:
E ----> E+E|E*E|(E)|Id
خوب ظاهرا ما یه قانون داریم باهاش می تونیم یه گرامر بسازیم و از روی اون یه درخت پارسر داشته باشیم. اما خیلی زود به این مشکلات بر می خوریم:
اولا برای یک عبارت ممکنه دو تا درخت تجزیه ایجاد کرد. مثلا عبارت id*id+id رو به دو شکل میشه ایجاد کرد و این به تنهایی اثبات کننده گنگ بودن این گرامره. برای گرامر گنگ نمیشه به همین شکل کاری کرد.
ضمن اینکه ما در اینجا چپگردی داریم. چپ گردی به معنای ایجاد تداخل در شروط داخل توابع پیاده سازیه قوانینه.
خب ما باید اول رفع گنگی بکنیم:
E ----> E+T|T
T----> T*F|F
F----> (E)|id
خب ما با تغییراتی که دایدم تونستیم رفع گنگی بکنیم. اما هنوز رفع چپگردی نکردیم. باید هرجا چپگردی ضمنی هم هست کشف کنیم و گرامر رو عوض کنیم تا بتونیم از ین مرحله سر سلامت رد کنیم.
E---->TE’
E’---->+TE’|ε
T---->FT’
T’---->*FT’|ε
F---->(E)|id
تمام اینکارا رو کردیم تا بتونیم قوانین ضرب و جمع و پرانتز خیلی ساده رو بتونیم بدون تداخل یا چپگردی یا گنگی داشته باشم تا بتونیم با مثلا سی یا هرچیه دیگه پیاده سازی کنیم.
درخت تجزیه بسته به نوع گرامری که انتخاب می کنید(پایین به بالا یا بالا به پایین) قابل بدست آوردنه. در پارس ورودی هر گرامر با استفاده از جدول مربوط به هر نوع گرامر میشه درخت تجزیه رو رسم کرد.
مثال بالا فقط یک مثال بود. ما همین مشکل رو در if و else های متوالی داریم. اونجا هم باید به همین شیوه برخورد کرد.
قدرتمند ترین گرامری که من می شناسم گرامر clr(0) هستش. برای رسیدن به این گرامر باید از پایه درست عمل بشه.
شما یکسری توانایی های خوبی دارید. من هم قبول دارم. اما اینها هیچ ربطی به کاری که براش آستین بالا زدید نداره.
شما API رو خوب بلدید کار با زبان VB رو هم خوب بلدید یا هر ابزار دیگه رو... خوب اینا چه ارتباطی با مفاهیم ایجاد یک کامپایلر داره.
پیشنهاد من اینه: بطور عمقی... خیلی بیشتر از چیزایی که برای نمره احتمالا بالایی که در این درس آوردید... مطلب بخونید. با اساتیدتون بطور تنگاتنگ ارتباط برقرار کنید. مطمئن باشید می تونید اگر دانشجو هستید بعنوان پروژه پایانی روش سرمایه گذاری کنید یا حداقل یه مقاله ای چیزی باهاش بدید. یه کاری که ارزش داشته باشه و انگیزه هم به اندازه کافی ایجاد کنه. اگر هم دانشجو نیستید یه تجربه بسیار عالیه. البته رایگان هم نخواهد بود.(انرژی و زمان)
گذشته از این مفاهیم شما رو دعوت می کنم به بررسی زبان هایی مثل RUBY. زبانی کاملا متفاوت با چیزایی که تابحال دیدید(البته اگه اینو ندیده باشید.)
اصلا در چه حیطه ای می خواید زبان ایجاد کنید. در حیطه ی هوش مصنوعی. در حیطه شی گرایی در حیطه ارتباط با سرور یا... . شما بنظر دارید چیزایی که دیدید رو اینبار اونجور که می خواید تغییر می دید. خوب؟ بهبودش کجاست؟ چه معنای جدیدی رو قراره بهش اضافه کنید؟ چه ایده خلاقانه ای براش درنظر گرفتید؟ و از همه مهمتر در کجا قصد دارید ازش استفاده کنید. چه حیطه ای؟
کار، کار پر بار و خوش محصولیه. اما اگر اصولی از ابتدا پیش برید به نتیجه می رسید. مطالب و سر فصل های منابع اصلی اصول طراحی زبانهای برنامه نویسی و مفاهیم طراحی کامپایلر ها می تونه واقعا مفید باشه. مثه یه نقشه راه. اما بسیار بیشتر از اینکه تابحال کار کردید باید عمیق بشید.
قدری دانش Exploid هم یاد بگیرید تا در طراحی کدهاتون بتونید مشکلاتی که بعضی زبانها دارن رو به حداقل برسونید.
شاید برای شروع کمی زیاد اوج گرفتید. فعلا زمان یادگرفتنه. اصلا تابحال فکر کرده بودید چرا یه زبان نیاز به قوانین و گرامر داره. ماشیا آتاماتا به چه درد می خوره. NFAو DFA چه ربطی به زبانهای برنامه نویسی دارن. چرا آقای نوام چامسکی که یک زبان دان و فیلسوف هست و بعنوان پدر زبانشناسی مدرنه همچنین درمورد روانشناسی تالیفاتی داره... چرا این آدم نظریه هایی در مورد زبانشناسی اونم در حیطه زبانهای کامپیوتری داده؟
وقتی داشتم در مورد انواع زبان برنامه نویسی موازی تحقیق می کردم این اسم رو مدام می دیدم Per Brinch Hansen
این شخص آدم جالبیه و در آزمایشگاهش زبانهای زیادی رو تولید و گسترش داده. (پاسکال یکیشه...)
بنظرم مطالعه در مورد روش کار این آدم و کارهایی که کرده می تونه مفید باشه.
شرطها و حلقه ها وامثال اینها واقعا مسائل و مفاهیمی هستن که باید پایه ای تر بهشون فکر کنید. اینکه چطور پیاده سازی بشن مسئله شما نیست. مسئله شما اینه که چطور قراره مفاهیمش رو پیاده کنید. فقط خود همین if و else های متوالی رو کمی بیشتر درموردش فکر کنید. شما یه برنامه می نویسید کلی باگ و ارور و وارنینگ داره حالا چطور از همون روش می خواید استفاده کنید برای طراحی یک کامپایلر که خودش باید اینا رو تشخیص بده؟
حالا اینا به کنار. کاربر یه گرامر غلط وارد می کنه. چطور می خواید درستش رو بهش بگید؟ یعنی در ارور یا وارنینگ چه گزارش خطایی باید ثبت بشه؟ چه عبارتی پیشنهاد بشه؟ اصلا چه سیاساتی باید اعمال بشه؟ حذف از ورودی تا درست شدن گرامر یا کامپایل کردن بقیه کد و درنهایت دادن یک گزارش کلی...
تابحال به این فکر کردید کامپایلر زبانی مثلا مثل جاوا رو با چی نوشتن؟ و اگه با هرچی نوشتن پس باید کامپایلر اون زبان هم داخل کامپایلر جاوا تعبیه شده باشه؟(منظورم اینجا اسمبلی نیست)
قصدم ازطرح این مطالب و سوالات به معنای سنگ اندازی یا دادن حس ناامیدی نیست. بلکه جدا با این شوری که در این حدود 120 تا پستی که خوندم دیدم گفتن این مطالب لازمه.
اگه دانشگاه هستید با 3 تا استاد حتما صحبت کنید. استاد درس PL و استاد درس نظریه زبانها و ماشینها و استاد درس اصول طراحی کامپایلرها. اگه کسی رو می شناسید که توی هر 3 تای اینا دستی داره قدرش رو بدونید.
براتون آرزوی موفقیت می کنم.