PDA

View Full Version : گفتگو: تجربه در اختراع چرخ : ساخت کامپایلر



IamOverlord
یک شنبه 30 مرداد 1390, 15:55 عصر
سلام دوستان عزیز،
می خواستم نظرتون رو در مورد ساخت یه کامپایلر، حداقل از جنبه ی تفریحی و در جهت تجربه و یادگیری خودمون، بدونم. من قبلا توی این زمینه یه فعالیت هایی کردم.
لطفا در مورد مثلا هدف ساختش یا ویژگی هاش و ... نظر بدید.
با تشکّر!

setroyd
یک شنبه 30 مرداد 1390, 18:27 عصر
خوبه اگه شروع کنیم من تا اخرش هستم تا کامل بشه .

IamOverlord
یک شنبه 30 مرداد 1390, 18:46 عصر
خوب اول باید از ساده شروع کنیم.
مثلا خوبه فعلا برای پروژه ی اول واسه این که کارمون زود تر تموم شه و بی نتیجه نمونه یه کامپایلر برای نوشتن برنامه های Console بنویسیم؟

setroyd
یک شنبه 30 مرداد 1390, 19:07 عصر
ok
شروع کنیم دوست عزیز من زمینه ای تو این ندارم و از compilder یه غول برای خودم ساختم ولی اگه شروع کنیم چون علاقه دارم زود راه میفتم حالا اگه فک میکنی میتونم کمکی کنم من هستم و اگه فک میکنی وقت تلف بکنم که پیشو نگیرم دوستانه بگو نارحت نمیشم ؟

quiet_programmer
یک شنبه 30 مرداد 1390, 19:14 عصر
با سلام.

من قبلا برای درس «طراحی و پیاده سازی زبانهای برنامه نویسی» یه کامپایلر پاسکالک(پاسکال کوچیک) نوشتم. البته نه بصورت کامل که همه دستورات رو داشته باشه ولی از ساختارهای کنترلی if، forو while و از انواع داده ای نوع داده ای integer و عبارات محاسباتی چهار عمل اصلی با رعایت اولویت ها رو پیاده سازی کردم. به این ترتیب که یک سورس پاسکالک میگیره و هم کد میانی و هم کد اسمبلی رو تولید میکنه. من با زبان ++C پیاده سازیش کردم و میدونم که تو زبانهای دیگه هم چه جوری میشه پیاده سازیش کرد.

در کل برای تولید کامپایلر شما به دو صورت میتونین عمل کنین:
1. روش دستی
2. روش اتوماتیک

برای پیاده سازی به روش دستی شما باید با نظریه زبانها و ماشینها آشنایی داشته باشی.(عبارات منظم، گرامر،DFA و ...)
برای پیاده سازی به روش اتوماتیک هم باید بایستی با نظریه زبانها و ماشین آشنایی جزئی داشته باشی. این رو هم بگم که تو روش اتوماتیک این شکلی نیست که اصلا کد نویسی نداشته باشیم. داریم ولی کمه. فقط تولید کد میانی و کد مقصد
حالا در صورت نیاز من اینا رو بعدا توضیح میدم.

موفق باشید/

IamOverlord
یک شنبه 30 مرداد 1390, 19:27 عصر
همه می تونن همکاری کنن.
ببینیند من می گم روش کارش به طور کلی این طوری باشه :
1. تبدیل کد ما به کد اسمبلی
2. لینک کردن و اسمبل کردن که به عهده ی Linker و Assembler هست
برای این منظور می تونیم از Assembler معروف FASM (flatassembler.net) که Open Source هست استفاده کنیم.

ضمنا یه مسئله ای هست، اونم این که برنامه های Console رو به چند صورت می شه پیاده سازی کرد، یه سری از برنامه های Console هستند که در OS های دیگه هم می تونن اجرا بشن ولی یه سری از برنامه های Console هستن که فقط در Windows اجرا می شن و مثل اون برنامه های 16bit قدیمی شبیه سازی نمی شن بلکه باز شدن پنجره ی Console و کار های دیگه یه سری دستورات API داره برا خودش.
نوع دوم جدید تره، اگه بریم سراغ نوع دوم به برنامه نویسی Windows نزدیک تریم. اما در نوع اول می تونیم خروجی elf. و ... داشته باشیم که فقط مختص Windows نیستن. برنامه های نوع دومی که می گم در DOS قدیمی اجرا نمی شن.
کلا نظر دوستان چیه؟

setroyd
یک شنبه 30 مرداد 1390, 19:52 عصر
بهرحال بگیت از کجا شروع کنیم که سریع تمومش کنیم مثل این پروره
طراحی و ساخت مرور گر وب با انجین ساخت خودمون (http://barnamenevis.org/showthread.php?285967-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%88-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%85%D8%B1%D9%88%D8%B1-%DA%AF%D8%B1-%D9%88%D8%A8-%D8%A8%D8%A7-%D8%A7%D9%86%D8%AC%DB%8C%D9%86-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%AE%D9%88%D8%AF%D9%85%D9%88%D9%86)


تو هوا نمونه
اقای quiet_programmer (http://barnamenevis.org/member.php?176670-quiet_programmer) شما توضیحات لازم رو بدید که اینجوری راحت بفهمیم چیکار باید بکنیم در اینجا نیازی نیست کسی چیزی بخواد هرکی هرچی یا هر نظری در این رابطه داره بدون پرسیدن بزاره مرسی .

IamOverlord
یک شنبه 30 مرداد 1390, 20:49 عصر
من یه زمانی که دانش زیادی در زمینه ی ساخت کامپایلر نداشتم این کد ها رو نوشتم، کار یه هفته است و ناقص مونده و خیلی داغونه یه جورایی، فقط واسه این می ذارم که به قول شما رو هوا نمونه کار.

IamOverlord
یک شنبه 30 مرداد 1390, 20:49 عصر
اینو برای Compile کد Assembly نوشتم که البته باید کنار برنامه TASM و TLINK وجود می داشت :

Public Sub Compile(TASM As String, TLINK As String, ASMCode As String, FileName As String)
On Error Resume Next
Open AppPath + FileName + ".asm" For Output As #1
Print #1, ASMCode
Close #1
Kill AppPath + FileName + ".exe"
Shell Chr(34) + TASM + Chr(34) + " " + FileName, vbHide
For i = 1 To 100000
DoEvents
Next i
Shell Chr(34) + TLINK + Chr(34) + " " + FileName, vbHide
End Sub

که این جوری استفاده می شد :

Compile AppPath + "TASM.exe", AppPath + "TLINK.exe", rtbAssemblyCode.Text, "PROGRAM"

IamOverlord
یک شنبه 30 مرداد 1390, 20:52 عصر
و برای تولید کد Assembly این Module رو نوشتم :

setroyd
یک شنبه 30 مرداد 1390, 21:03 عصر
سنگینه واقعا با چن روز شک دارم کدهارو خوب درک کنم !!

IamOverlord
یک شنبه 30 مرداد 1390, 21:07 عصر
اون Module ای که گذاشتم، توش بعضی جا ها رو به فارسی توضیح دادم، شانس آوردم اون موقع یه توضیحی نوشتم!

setroyd
یک شنبه 30 مرداد 1390, 21:58 عصر
ok سعی میکنم یجوری بفهمم

IamOverlord
دوشنبه 31 مرداد 1390, 00:07 صبح
حالا فعلا نیازی نیست زیاد به اون کاری داشته باشیم.
اول ببینیم اصلا پروژه ی اولمون چه جوری باشه. Syntax اش چی باشه، امکاناتش ... ؟

MahmoodGH
دوشنبه 31 مرداد 1390, 01:22 صبح
بنده هم هستم ؛

جناب IamOverlord (http://barnamenevis.org/member.php?72921-IamOverlord) بنده Module رو که گزاشتین رو بررسی کردم ، صادقانه بگم که بعضی قسمت هاش رو متوجه نشدم. البته احتمالا مشکل از اونجاست که کلا بنده مطالعه ای پیرامون کامپایل کردن نداشتم. خواهش می کنم توی یه سورس ساده این مطلب رو توضیح بدین.

موفق باشین

IamOverlord
دوشنبه 31 مرداد 1390, 03:01 صبح
سلام،
توی اون Module مهم ترین تابع GetAssemblyCode هست و از بقیه ی توابع کمک می گیره. سعی کردم که اسامی شون بگه که چی کار می کنن. ضمنا اون رو با علمی که الان دارم ننوشتم؛ از یه روش ساده استفاده کردم : یه حلقه ی For کلی گذاشتم که خط به خط کد ورودی رو می خونه. بعد که متغیر CurrentLine حاوی خط فعلی شد، از یه عالمه If می گذره و هر If چک می کنه که ساختار این خط مربوط به اون هست یا نه، مثلا ساختار شرطی داره، انتسابی داره، چیزی داره تعریف می شه یا ... . فقط باید توجه کنیم که هر خط به طور یکتا در یه شرط If کاراش انجام بشه. بقیه ی مسائل فرعی هستند، مثلا تبدیل نام متغیر های فارسی به انگلیسی و کد شروع و پایان روال. ضمنا از خطوط یه بار گذر انجام می شه؛ و در نهایت کد Assembly با Syntax توربو اسمبلر تولید می شه. خروجی تابع به درد Assemble کردن و سپس Link کردن می خوره، که اینا دیگه به عهده ی ما نیست و اگه این قسمتا رو دوباره خودمون بنویسیم واقعا چرخ گاری رو از اول خودمون اختراع کردیم!!! ضمنا این پروژه اصلا کامل نشد، به دلایلی که نا امید شدم، چون هدف اصلی فارسی بودنش بود که همین قضیه مشکلش بود! ضمنا کد تولیدی 16 بیتی هست ولی کامپایلر جدیدی که می سازیم این طوری نخواهد بود، یعنی Win32 Console Application تولید می کنه که قضیه اش فرق می کنه، از توابع API استفاده می شه و ... .

IamOverlord
دوشنبه 31 مرداد 1390, 03:21 صبح
واسه این که تاپیک رو هوا نمونه یه چیزایی رو بگم :
بعد از این که ویژگی های زبان برنامه نویسیمون مشخص شد، یه Function می نویسیم و یه پردازش رشته ی تمیز می کنیم؛ یعنی کد ورودی به زبان خودمون رو می گیریم تبدیل به کد Assembly می کنیم.

Function OurCodeToAssemblyCode(OurCode As String) As String
' ...
End Function

که توی این Function اصلی یه سری Sub-Function دیگه می نویسیم و در کل Functional و تمیز کار می کنیم. مزیت Functional نوشتن توی کار های گروهی به خوبی به چشم می آد.
دیگه از این جا به بعدش آب خوردنه : Assemble & Link (البته FASM.EXE هم Assemble می کنه هم Link و یه راس خروجی exe. می ده)
توی اون Function اصلی، کد زبانمون رو تبدیل به کد واسطه ی دلخواهمون می کنیم، حالا این کد واسطه رو تبدیل به کد Assembly می کنیم. این کار یه مزیتی داره اون هم اینه که اگه بعدا خواستیم Assembler مون رو تغییر بدیم، نیازی نیست دوباره کل پروژه رو انجام بدیم!!! فقط از قسمت کد واسطه به بعد بنویسیم.
جزییات دیگه هم هست که بعدا می گم.
فقط اول یه سری چیزا مشخص بشه.
Syntax اش چی باشه؟ دقیقا قراره چه کدی توش نوشته شه؟ ساختار کد؟ ایده هاتون؟
مثلا من یه ایده دارم :
طرف بتونه این طوری هم تابع تعریف کنه :


f(x) = x ^ 2
a(b) = b + f(b)

می تونیم ویژگی های خوب زبان های مختلف رو تا جایی که با هم در تضاد نباشن و امکان در کنار هم بودنشون باشه، در کنار هم قرار بدیم.

می خوام نظریات و یا تجربیات شما رو هم بدونم.

خوش بین باشید،
موفق باشیم!

setroyd
دوشنبه 31 مرداد 1390, 04:51 صبح
خوبه پس حتما شدنیه . چون دانش از این موضوع به اندازه ی کافی دوستان دارن .

quiet_programmer
دوشنبه 31 مرداد 1390, 16:44 عصر
با سلام.


اینو برای Compile کد Assembly نوشتم که البته باید کنار برنامه TASM و TLINK وجود می داشت :

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

من انشاالله از فردا نحوه نوشتن یه کامپایلر رو شروع میکنم و همچنین مرحله به مرحله کد میزارم.
فقط چیزی که لازمه دوباره تاکید کنم اینه که حتما باید یه آشنایی حداقلی از نظریه زبانها و ماشین ها داشته باشین.
بهتره اول یک سری مفاهیم اولیه رو توضیح بدم بعد.پس تا فردا.

setroyd
سه شنبه 01 شهریور 1390, 00:12 صبح
اره فک کنم خوب باشه .

IamOverlord
سه شنبه 01 شهریور 1390, 03:48 صبح
مثل این که از هر جا که شد باید دست به کار شیم تا تاپیک پیش بره.
سیستم پردازش زبان :
1. برنامه ی مبدا >> ((پیش پردازنده)) >> برنامه ی مبدا اصلاح شده >> ((کامپایلر)) >> برنامه ی اسمبلی مقصد
2. >> ((اسمبلر)) >> کد ماشین جابه جا پذیر >> ((پیوند دهنده)) >> کد ماشین مقصد

quiet_programmer
سه شنبه 01 شهریور 1390, 11:41 صبح
با سلام.

کامپایلر: برنامه ای است که یک برنامه نوشته شده در یک زبان به نام زبان مبدا(source Language) را به برنامه ای معادل به زبانی دیگر به نام زبان مقصد(Target Language) ترجمه میکند.

مراحل کامپایل در هفت مرحله صورت میگیرد:


تحلیل واژه ای (Lexical Analysis)
تحلیل نحوی (Syntax Analysis)
تحلیل معنایی (Semantic Analysis)
تولید کد میانی (Intermediate Code Generation)
بهینه سازی کد میانی (Intermediate Code Optimization)
تولید کد نهایی (Code Generation)
بهینه سازی کد نهایی (Final Code Optimization)

مرحله هفت برای تمامی کامپایلرها صورت نمیگیرد. پس میتوان از آن صرف نظر کرد.
حالا مرحله به مرحله با این مراحل آشنا میشیم.
در مرحله اول کامپایل، یعنی تحلیل واژه ای، برنامه نویسه به نویسه خوانده شده و به دنباله ای از نشانه ها (Tokens) تبدیل میشه. انواع مختلف نشانه ها عبارتند از:


کلمات کلیدی
عملگرها
جدا کننده ها
ثابت ها
شناسه ها (به طور کلی به اسامی که کاربر انتخاب میکند،شناسه گویند)

در مرحله دوم، برنامه از نظر خطاهای نحوی مورد برسی قرار میگیرد و با استفاده از نشانه های تولید شده در مرحله قبل یک درخت نحو (Syntax tree) و یا درخت پارس (Parse Tree) ایجاد میگردد.
در مرحله سوم، با استفاده از درخت تولید شده در مرحله قبل، برنامه از نظر خطاهای مفهومی احتمالی برسی میشود.
در مرحله تولید کد بینابینی، یک برنامه که معادل برنامه اصلی است به یک زبان بینابینی تبدیل می شود. با ایجاد کد بینابینی عملیات بعدی که کامپایلر باید انجام دهد،آسان می گردد. در انتخاب زبان بینابینی باید موارد زیر در نظر گرفته شود:


تولید و بیهنه سازی کد بینابینی باید ساده باشد.
ترجمه آن به برنامه مقصد نیز به راحتی صورت پذیرد.

در مرحله بهینه سازی، کوشش می شود تا کد بیناببینی تولید شده در مرحله قبل به نحوی بهبود داده شود. این کار سبب تولید کدی می شود که از لحاظ اجرایی سریعتر است و حافظه کمتری مصرف میکند.
در بخش تولید کد نهایی کد مورد نظر به زبان مقصد تولید تولید میشود. به عبارتی دیگر، هرکدام از کدهای بینابینی بهبودیافته به مجموعه ای از دستورات ماشین که کار مشابهی انجام میدهند، تبدیل میشود.
سرانجام در مرحله آخر کد نهایی تولید شده نیز بهینه سازی میشود.
ارطباط این هفت بخش در شکل زیر نشان داده شده است:
74241
در کنار هفت مرحله اصلی کامپایلر، دو بخش دیگر به نام خطا پرداز(Error Handler) و جدول علایم (Symbol Table) نیز وجود دارد.

خطا پرداز: هربار که خطایی در یکی از مراحل پیش بیاید، رویه ای به نام خطاپرداز فراخوانده میشود.
جدول نشانه ها: یکی از کارهای مهم و اساسی یک کامپایلر، ثبت شناسه های استفاده شده در برنامه ورودی و جمع آوری اطلاعات درباره مشخصات هر شناسه است. این مشخصات میتواند شامل:

اگر شناسه متغیر باشد:


آدرس حافظه تخصیص داده شده به شناسه
نوع آن
محلی از برنامه که این شناسه در آن تعریف شده است(بحث حوزه دسترسی)
...

در صورتی که شناسه مثلا نام رویه باشد:


اسم رویه
تعداد و نوع آرگومانها
روش ارسال آرگومان(مثلا ByValue یا ByRef)
نوع نتیجه که رویه برمیگرداند
و ...

در کامپایلر و در مرحله تحلیل لغوی کلیه شناسه های موجود در برنامه اصلی وارد جدول نشانه ها میشوند. در مرحله های دیگر کامپایل، اطلاعات مربوط به این شناسه ها به جدول اضافه خواهند شد و سپس از آنه در موارد مختلف استفاده خواهد شد.

برای اینکه مطلب یکم قابل فهم بشه مثالی میارم:
دستور زیر را در نظر بگیرید:
p:=i+r*60
فرض کنید که r،p،i از نوع real هستند.
شکل زیر ترجمه این دستور و تاثیر هر مرحله از کامپایلر بر روی این دستور رو نشون میده:
74242
از انجایی که کد نهایی تولید شده در این دستور خود بهینه است پس مرحله هفتم تاثیری بر روی کد نهایی ندارد.
فکر کنم بره امروز کافی باشه. فقط یه نکته: زیاد سخت نگیرین همه این مراحلی که اینجا ذکر شد همه دارای روشهایی برای پیاده سازی دارن. چیز ساده ایه به شرطی که نظریه زبان و ماشین رو بلد باشین. من هی توصیه میکنم بخاطر اینکه خیلی مهمه.
سوالی باشه من درخدمتم.
یاحق.
موفق باشین.

m2011kh
چهارشنبه 02 شهریور 1390, 16:00 عصر
من تجربه ای در این زمینه ندارم ولی کار رو دنبال میکنم و هر جا تونستم کمک میکنم ادامه بدین.

quiet_programmer
چهارشنبه 02 شهریور 1390, 18:11 عصر
با سلام.


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

زبان:
برای تعریف زبان از یک مجموعه غیر تهی از نشانه ها به نام الفا شروع میکنیم و از نشانه ها رشته میسازیم رشته یک دنباله متناهی از نشانه های الفباست. اگر الفبا:
∑={a,b}

باشد آنگاه:
abab
bbba
aaa

رشته هایی از الفبای ∑ هستند.
اتصال به معنای اتصال دو رشته به هم است. مثلا:
W=abcd
V=efgh
WV=abcdefgh
VW=efghabcd
طول یک رشته با:
|w|


نشان داده میشود. رشته تهی با ג نشان داده میشود و
|ג|=0

تکرار رشته W به تعداد N بار بصورت
Wn
نشان میدهیم.
W0=ג


اگر ∑ یک الفبا باشد آنگاه:
∑*

مجموعه تمامی رشته هایی است که با اتصال صفر یا بیشتر از حروف ∑ بدست می آید. مجموعه:
∑*

شامل ג نیز هست. اگر بخواهیم ג در آن نباشد از:
∑+


استفاده میکنیم و:
∑+=∑*-{ג}



اگرچه ∑ متناهی است اما:
∑+
∑*



هر دو همواره نامتناهی هستند.
حالا تعریف زبان: یک زبان زیر مجموعه ای از
∑*


است. یک رشته در زبان L یک جمله خوانده میشود.
مثال:
∑={a,b}
∑*={ג,a,b,ab,ba,bb,aa,aab,baab,…}



و مجموعه ی
{a,aa,aab}



یک زبان بر روی الفبای ∑ است و چون تعداد آن محدود است به آن یک زبان متناهی میگوئیم. مجموعه
L={anbn:n>=0}


یک زبان بر روی ∑ است و رشته های
aaaabbbb
aabb
ab
ג


در این زبان هستند ولی رشته ی
abb

نیست.

نکته: چون زبانها مجموعه هستند پس عملیات اجتماع و اشتراک و تفاضل دو زبان قابل تعریف است و متمم یک زبان نیز قابل تعریف است.
مجموعه جهانی:
∑*



فکر کنم کافی باشه. فقط یه تمرین میزارم اون رو انجام بدین. بحث بعدی ما گرامر هست. یادگیری گرامر بستگی به یادگیری زبان داره. پس این تمرین رو حتما انجام بدین.
حداقل 10 رشته ای که در زبان زیر وجود داره رو پیدا کنین.
L={a^n b^n a^m b^m :n>=0,m>=1}


یا حق.
موفق باشین.

quiet_programmer
پنج شنبه 03 شهریور 1390, 12:21 عصر
با سلام.

دوستان چرا ساکتن؟ قرار نبود که من نقش رادیو رو بازی کنم. سوالی، حرفی،حدیثی، چیزی باشه من در خدمتم. لطفا شما هم مشارکت کنید تا با امیدواری ادامه بدیم.

موفق باشین

king ag
پنج شنبه 03 شهریور 1390, 12:59 عصر
ماشالله انقدر روون و خوبه که همه فقط منتظر درس بعدی میمونن
واقعا ممنون
موفق باشید
منتظر آموزش های بعدی هستیم

IamOverlord
پنج شنبه 03 شهریور 1390, 19:14 عصر
این مباحث خیلی طولانیه! و بعضی جا هاش خیلی پیچیده! به نظرم یه سری اطلاعات اولیه که داده شد کافیه و بقیه اش رو اگه بچه ها دوست داشتن برن بخونن چون این ها اندازه ی یه کتاب بحث داره و فکر نکنم بشه توی کل تاپیک مبحث کامپایلر ها رو تدریس کرد.

IamOverlord
پنج شنبه 03 شهریور 1390, 19:16 عصر
یکی از بهترین کتاب ها در این زمینه Modern Compiler Design هست که تئوری ها رو در این زمینه بیان کرده و با نام 'اصول طراحی کامپایلر های نوین' به چاپ رسیده، مترجمش هم 'عین الله جعفرنژاد قمی' هست.

IamOverlord
پنج شنبه 03 شهریور 1390, 19:18 عصر
ببینید من می گم بقیه ی دوستان هم در تاپیک شرکت کنن و ایده هاشون رو در مورد چگونگی زبان برنامه نویسیمون بگن تا بعد بریم سراغ ساختش، هنوز مشخص نشده چی می خوایم بسازیم.

quiet_programmer
پنج شنبه 03 شهریور 1390, 19:52 عصر
با سلام.


هنوز مشخص نشده چی می خوایم بسازیم.چرا مشخص نیست. داریم کامپایلر درست میکنیم دیگه! ما داریم اصول طراحی کامپایلر رو یاد میگیریم و با استفاده از این اصول اینجا یه کامپایلر که حالا دوستان انتخاب میکنن که چی باشه پیاده سازی میکنیم.
احتمالا منظورمو نتونستم برسونم. اگه ما اصول پیاده سازی کامپایلر رو بدونیم فرقی نمیکنه که چه کامامپایلری قراره پیاده سازی بشه. اصلا دوستان اگه علاقه دارن میخواین یه کامپایلر من درآوردی طراحی کنیم ولی به نظر بنده یه زبانی رو انتخاب کنیم که گرامرش در دسترس باشه والا اگه کسی میتونه گرامر یه زبان من درآوردی بنویسه حرفی نیست.

quiet_programmer
پنج شنبه 03 شهریور 1390, 19:54 عصر
این مباحث خیلی طولانیه! و بعضی جا هاش خیلی پیچیده! به نظرم یه سری اطلاعات اولیه که داده شد کافیه و بقیه اش رو اگه بچه ها دوست داشتن برن بخونن چون این ها اندازه ی یه کتاب بحث داره و فکر نکنم بشه توی کل تاپیک مبحث کامپایلر ها رو تدریس کرد.

اگه بچه ها موافق باشن بره من فرقی نمیکنه. اگه میخواین من فردا نحوه تولید تحلیلگرلغوی رو شروع کنم.

یاحق.
وقت اذان به افق زنجانه. دوستان مارو هم دعا کنن.
یا حق.
موفق باشین.

IamOverlord
پنج شنبه 03 شهریور 1390, 22:25 عصر
خیلی ممنون از زحماتت دوست عزیز،
من هم کمک می کنم، بقیه ی دوستان هم شرکت کنن.

quiet_programmer
جمعه 04 شهریور 1390, 13:47 عصر
با سلام.

تحلیل واژه ای(Lexical Analysis)

نخستین مرحله کامپایل، تحلیل واژه ای است. به واحدی از کامپایلر که کار تحلیل واژه ای را انجام میدهد اسکنر میگویند. اسکنر بین رشته ورودی و تحلیلگر نحوی یا پارسر قرار دارد. وظیف اصلی اسکنر، این است که با خواندن کاراکترهای ورودی توکن ها را تشخیص داده و برای پارسر ارسال نماید.
به عنوان مثال در صورتی که رشته ورودی
A:=B+C;
باشد، توکنهای زیر توسط اسکنر تشخیص داده خواهند شد:
<id><Assign op><id><add op><id><semicolon>
اسکنر میتواند محلهای خالی و توضیحات موجود در برنامه اصلی را ضمن خواندن برنامه حذف کند.
به آخرین توکنی که اسکنر یافته است توکن جاری گفته میشود.

خوب بیبنین اگه مفهوم اسکنر رو یاد گرفتین و اینکه قراره چه کاری انجام بده روش پیاده سازی اون رو توضیح بدم.

توضیح مختصر: ما برای اینکه بتونیم یک برنامه نوشته شده رو کامپایل کنیم باید بتونیم سورس کد رو به شکلی بخونیم که منظور کاربر رو بدونیم. مثلا ما میدونیم که تمامی رشته های تو زبان پاسکال که با یک کاراکتر شروع میشن، اگه کلمه کلیدی نباشه حتما یه شناسه است.شناسه هم میتونه اسم متغیر،برچسب،نام رویه یا تابع و ... باشه. یا وقتی از رشته + استفاده میکنه باید تشخیص بدیم که این یه عملگر ریاضیه. این کار رو اسکنر برای ما انجام میده. در واقع میاد یک رشته طولانی رو به چندین رشته، با معنای از قبل مشخص شده، که به هرکدوم از اونا توکن میگیم، تفکیک میکنه. همون مثل مثال بالا.

البته حواستون باشه که اسکنر هیچ پردازشی از لحاظ درست یا غلط بودن سینتکس بر روی برنامه ی مبدا نداره و این کار پارسره. مثلا اگه عبارتی به این شکل داشته باشیم(مثلا دستور ایف در زبان سی):

fi(x==f(x))

اسکنر نمیتونه تشخیص بده که منظور برنامه نویس دستور ایف بوده واین عبارت رو به شکل زیر پارس میکنه:

<id><POpen><id><Compare OP><id><POpen><id><PClose><PClose>

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

quiet_programmer
یک شنبه 06 شهریور 1390, 01:10 صبح
با سلام.

دوستان اصلا حال نمیدین ها. حواستون باشه. بابا حرفی حدیثی توفی فحشی لعنتی یه چی بگین دیگه. یعنی هیچ سوالی نیست؟

بخدا تایپ کردنش کلی وقت میبره ها. اگه منصرف شدین اطلاع بدین. از دوستان عزیزمون جناب setroyd (http://barnamenevis.org/member.php?183390-setroyd)،MahmoodGH (http://barnamenevis.org/member.php?114407-MahmoodGH) خبری نیست؟

یاحق.
موفق باشین.
راستی یادتون باشه عنوان این تاپیک گفتگوست نه آموزش.اوکی؟

setroyd
یک شنبه 06 شهریور 1390, 14:11 عصر
دوست عزیز باور کن چون تا حالا تو این زمینه فعالیت نداشتم با اینکه توضیحات کامل و عالی شمارو خوندم بازم برام سنگینه !!! من فکر میکنم اگه برم اول از یک کتاب در این رابطه شروع کنم بهتر باشه .

m2011kh
یک شنبه 06 شهریور 1390, 15:37 عصر
منم با ایشون موافقم (setroyd (http://barnamenevis.member.php?183390-setroyd))

butterfly8528
یک شنبه 06 شهریور 1390, 16:50 عصر
سلام .
quiet_programmer عزیز شما کارتون رو ادامه بدید،دست کم یه مرجع مناسبی میشه واسه کسانی که بعدا به همچین مرجعی نیاز پیدا خواهند کرد .
موفق باشید :لبخندساده:.

setroyd
یک شنبه 06 شهریور 1390, 20:35 عصر
ولی بازم سعی میکنم با کمی دقت اگه بتونم درک کنم .

m2011kh
دوشنبه 07 شهریور 1390, 09:43 صبح
آموزشا چقدر مونده که خودمون رو برای ساخت کامپایلر آماده کنیم.

quiet_programmer
جمعه 11 شهریور 1390, 12:51 عصر
با سلام.

از بابت تاخیری که به وجود اومد از دوستان معذرت میخوام.
خودمونیم ها اگه من پست ندم تاپیک متروکه میشه ها:لبخند:

من ایشالا به یاری خدا فردا دوباره شروع میکنم. دیگه بسه مفاهیم اولیه. من فردا نحوه کد کردن رو میگم. اگه به مشکل خوردین نگین ها فلانی قدم به قدم جلو نیومد:چشمک:

تا فردا
یاحق
موفق باشید.

IamOverlord
یک شنبه 20 آذر 1390, 22:01 عصر
ما رو باد برد یه طرف دیگه!
دارم شروع می کنم به ساخت تحلیلگر و مسایل مربوط به درخت تجزیه (اگه کسی پایه است کمک کنه)