mohamadkazemi
جمعه 05 تیر 1394, 03:46 صبح
توضیح : منبع آموزشی ، مطالب درسی دانشگاه استنفرد . در ضمن آموزش ، جاهایی که به الگوریتم ها رسیدیم روش های پیاده سازی توضیح داده خواهد شد. آموزش از پایه شروع خواهد شد و به مراحل بالاتر ختم میشود.
*نظراتتون میتونه خیلی مفید و موثر باشه.
قسمت اول :
در ابتدای آموزش چیزی که ممکنه ذهن شما رو درگیر بکنه اینکه اصولا چرا ما نیاز به یادگیری اصول طراحی کامپایلر و ساخت کامپایلرها داریم ؟ فرض کنید شما میخواید یه نرم افزار حسابداری بنویسید ، برای نوشتن چنین برنامه ای شما نمیتونید به زبان ماشین برنامه نویسی کنید ، چون شما وقتی به زبان ماشین برنامه مینویسید تمام چیزها رو خودتون باید پیاده سازی کنید ، اگه قرار باشه نرم افزار یه مقدار بزرگ بشه دیگه این امکان وجود نداره تمام چیزهارو خود برنامه نویس بنویسه ، به علاوه اینکه دستورات و ثبات های زبان ماشین بسیار محدود هستند . پس شما برای ساخت برنامه های پیچیده تر ، نیاز به زبان های سطح بالاتر پیدا میکنید و به تبع اون کامپایلری نیاز خواهد بود تا کد شما رو تبدیل به زبان ماشین کنه . به علاوه شما با قوانین ساخت یک زبان آشنا خواهید شد و متوجه میشید که زبان های برنامه نویسی چطور کار میکنند.
حالا که اهمیت طراحی کامپایلر رو فهمیدیم ببینیم مراحل طراحی کامپایلر چی هست :
1.فرض کنید برنامه نویس یک برنامه نوشته ، در مرحله اول برنامه ی نوشته شده از لحاظ لغوی بررسی میشه که به تحلیل لغوی برنامه معروف هست (Lexical analysis) . در این مرحله کامپایلر فارغ از اینکه برنامه مفهوم خاصی دارد یا خیر ، تک تک کلمات نوشته شده توسط برنامه نویس رو چک میکند ، که آیا این کلمه جزء زبان برنامه نویسی ( مانند جاوا ، سی پلاس پلاس و.. ) هست یا خیر ، اصولا کلمات زبان برنامه نویسی توی 4 تا دسته قرار میگیرند : 1. متغیرها .2. کلمات رزرو شده .3. اعداد . 4. علامت ها و عملگر ها .
توی این مرحله کامپایلر کلمه به کلمه برنامه ی نوشته شده رو چک میکنه ، ابتدا چک میکنه آیا این کلمه ، کلمه ی رزرو شده ی زبان هست یا خیر ، اگر نبود چک میکند متغییر هست یا خیر و به همین صورت سپس اعداد و علامت ها . اگر تمام کلمات جزء یکی از این 4 دسته قرار گرفتند برنامه از نظر لغوی خطایی ندارد ، اما اگر حتی یکی از کلمات توی این 4 دسته نباشند ، کامپایلر اعلام خواهد کرد که برنامه از نظر لغوی دارای ایراد هست ، یعنی کلمه ای توسط برنامه نویس نوشته شده که جزء زبان نیست .
مثال : فرض کنید کد زیر داخل کامپایلر سی پلاس پلاس نوشته شده است ، کامپایلر کلمه به کلمه چک میکنه ، در ابتدا کلمه while چک میشه و این کلمه داخل دسته ی کلمات رزرو شده قرار میگیره ، بعد } و این کلمه داخل علامات ، سپس z و این کلمه داخل دسته متغییر ها و به همین صورت تاآخر ، ولی کلمه ی y! داخل هیچ دسته ای قرار نمیگیره چون نه کلمه ی کلیدی هست ، نه از قوانین نامگذاری متغییرها تبعیت کرده و نه جزو اعداد و علامات هست ، پس کامپایلر گزارش خطا میدهد .
while (z){
x = !y
}
2.مرحله ی تحلیل نحوی (syntax analysis)، بعد از مرحله lexical مشخص میشه که هر کلمه از چه نوعی هست ، در مرحله ی بعدی ورودی کامپایلر همین lex ها هستند که ساخته شده ، در این مرحله کامپایلر تشخیص میده که آیا نحوه ی قرار گرفتن این اجزا در کنار هم صحیح هست یا خیر. برای مثال اول باید if نوشته شود و بعد else ، در این مرحله کامپایلر به معنای جملات اهمیت نمیده ، فقط چک خواهد کرد که آیا اجزای زبان درست در کنار هم قرار گرفته اند یا خیر ، مثلا سمت چپ = فقط یک متغیر قرار گرفته باشد ، اما اینکه آیا این انتساب از لحاظ معنایی صحیح هست یا خیر را درک نمیکند .
3. تحلیل معنایی (semantic analysis) ، در این مرحله کامپایلر به سراغ تحلیل معنایی برنامه نوشته شده میره ، مثلا مقایسه ی عدد با رشته معنایی نداره ، یا مثلا برای انتساب باید نوع یکی باشد ، یا برای فراخوانی توابع باید نوع آرگومان ارسالی با آرگومان تعریف شده یکی باشد . بعد از این مرحله کد نوشته شده از لحاظ لغوی و نحوی و معنایی خطایی ندارد .
4.کامپایلر کدنوشته شده رو به صورت مستقیم به کدماشین تبدیل نمیکنه ، بلکه کدنوشته شده رو به کدی به اسم IR یا کد واسط تبدیل میکنه . در مرحله ی 4ام این کد توسط کامپایلر تولید میشود و سپس بهینه میشه .
5. تولید کد ماشین ، چون دستورات ماشین های مختلف باهم تفاوت دارد در این مرحله بسته به نوع سیستم عامل و cpu ، کد واسط به کد ماشین تبدیل میشود .
قسمت دوم : LEXICAL ANALYSIS
ضمیمه : اسلاید های مربوطه ، دانشگاه استنفرد (http://cld.persiangig.com/dl/MHFEe/12uFms50t2/Slides00.pdf)
*نظراتتون میتونه خیلی مفید و موثر باشه.
قسمت اول :
در ابتدای آموزش چیزی که ممکنه ذهن شما رو درگیر بکنه اینکه اصولا چرا ما نیاز به یادگیری اصول طراحی کامپایلر و ساخت کامپایلرها داریم ؟ فرض کنید شما میخواید یه نرم افزار حسابداری بنویسید ، برای نوشتن چنین برنامه ای شما نمیتونید به زبان ماشین برنامه نویسی کنید ، چون شما وقتی به زبان ماشین برنامه مینویسید تمام چیزها رو خودتون باید پیاده سازی کنید ، اگه قرار باشه نرم افزار یه مقدار بزرگ بشه دیگه این امکان وجود نداره تمام چیزهارو خود برنامه نویس بنویسه ، به علاوه اینکه دستورات و ثبات های زبان ماشین بسیار محدود هستند . پس شما برای ساخت برنامه های پیچیده تر ، نیاز به زبان های سطح بالاتر پیدا میکنید و به تبع اون کامپایلری نیاز خواهد بود تا کد شما رو تبدیل به زبان ماشین کنه . به علاوه شما با قوانین ساخت یک زبان آشنا خواهید شد و متوجه میشید که زبان های برنامه نویسی چطور کار میکنند.
حالا که اهمیت طراحی کامپایلر رو فهمیدیم ببینیم مراحل طراحی کامپایلر چی هست :
1.فرض کنید برنامه نویس یک برنامه نوشته ، در مرحله اول برنامه ی نوشته شده از لحاظ لغوی بررسی میشه که به تحلیل لغوی برنامه معروف هست (Lexical analysis) . در این مرحله کامپایلر فارغ از اینکه برنامه مفهوم خاصی دارد یا خیر ، تک تک کلمات نوشته شده توسط برنامه نویس رو چک میکند ، که آیا این کلمه جزء زبان برنامه نویسی ( مانند جاوا ، سی پلاس پلاس و.. ) هست یا خیر ، اصولا کلمات زبان برنامه نویسی توی 4 تا دسته قرار میگیرند : 1. متغیرها .2. کلمات رزرو شده .3. اعداد . 4. علامت ها و عملگر ها .
توی این مرحله کامپایلر کلمه به کلمه برنامه ی نوشته شده رو چک میکنه ، ابتدا چک میکنه آیا این کلمه ، کلمه ی رزرو شده ی زبان هست یا خیر ، اگر نبود چک میکند متغییر هست یا خیر و به همین صورت سپس اعداد و علامت ها . اگر تمام کلمات جزء یکی از این 4 دسته قرار گرفتند برنامه از نظر لغوی خطایی ندارد ، اما اگر حتی یکی از کلمات توی این 4 دسته نباشند ، کامپایلر اعلام خواهد کرد که برنامه از نظر لغوی دارای ایراد هست ، یعنی کلمه ای توسط برنامه نویس نوشته شده که جزء زبان نیست .
مثال : فرض کنید کد زیر داخل کامپایلر سی پلاس پلاس نوشته شده است ، کامپایلر کلمه به کلمه چک میکنه ، در ابتدا کلمه while چک میشه و این کلمه داخل دسته ی کلمات رزرو شده قرار میگیره ، بعد } و این کلمه داخل علامات ، سپس z و این کلمه داخل دسته متغییر ها و به همین صورت تاآخر ، ولی کلمه ی y! داخل هیچ دسته ای قرار نمیگیره چون نه کلمه ی کلیدی هست ، نه از قوانین نامگذاری متغییرها تبعیت کرده و نه جزو اعداد و علامات هست ، پس کامپایلر گزارش خطا میدهد .
while (z){
x = !y
}
2.مرحله ی تحلیل نحوی (syntax analysis)، بعد از مرحله lexical مشخص میشه که هر کلمه از چه نوعی هست ، در مرحله ی بعدی ورودی کامپایلر همین lex ها هستند که ساخته شده ، در این مرحله کامپایلر تشخیص میده که آیا نحوه ی قرار گرفتن این اجزا در کنار هم صحیح هست یا خیر. برای مثال اول باید if نوشته شود و بعد else ، در این مرحله کامپایلر به معنای جملات اهمیت نمیده ، فقط چک خواهد کرد که آیا اجزای زبان درست در کنار هم قرار گرفته اند یا خیر ، مثلا سمت چپ = فقط یک متغیر قرار گرفته باشد ، اما اینکه آیا این انتساب از لحاظ معنایی صحیح هست یا خیر را درک نمیکند .
3. تحلیل معنایی (semantic analysis) ، در این مرحله کامپایلر به سراغ تحلیل معنایی برنامه نوشته شده میره ، مثلا مقایسه ی عدد با رشته معنایی نداره ، یا مثلا برای انتساب باید نوع یکی باشد ، یا برای فراخوانی توابع باید نوع آرگومان ارسالی با آرگومان تعریف شده یکی باشد . بعد از این مرحله کد نوشته شده از لحاظ لغوی و نحوی و معنایی خطایی ندارد .
4.کامپایلر کدنوشته شده رو به صورت مستقیم به کدماشین تبدیل نمیکنه ، بلکه کدنوشته شده رو به کدی به اسم IR یا کد واسط تبدیل میکنه . در مرحله ی 4ام این کد توسط کامپایلر تولید میشود و سپس بهینه میشه .
5. تولید کد ماشین ، چون دستورات ماشین های مختلف باهم تفاوت دارد در این مرحله بسته به نوع سیستم عامل و cpu ، کد واسط به کد ماشین تبدیل میشود .
قسمت دوم : LEXICAL ANALYSIS
ضمیمه : اسلاید های مربوطه ، دانشگاه استنفرد (http://cld.persiangig.com/dl/MHFEe/12uFms50t2/Slides00.pdf)