صفحه 1 از 2 12 آخرآخر
نمایش نتایج 1 تا 40 از 41

نام تاپیک: تجربه در اختراع چرخ : ساخت کامپایلر

  1. #1
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    Lightbulb تجربه در اختراع چرخ : ساخت کامپایلر

    سلام دوستان عزیز،
    می خواستم نظرتون رو در مورد ساخت یه کامپایلر، حداقل از جنبه ی تفریحی و در جهت تجربه و یادگیری خودمون، بدونم. من قبلا توی این زمینه یه فعالیت هایی کردم.
    لطفا در مورد مثلا هدف ساختش یا ویژگی هاش و ... نظر بدید.
    با تشکّر!

  2. #2
    کاربر دائمی آواتار setroyd
    تاریخ عضویت
    اسفند 1389
    محل زندگی
    تهران
    پست
    1,198

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    خوبه اگه شروع کنیم من تا اخرش هستم تا کامل بشه .

  3. #3
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    خوب اول باید از ساده شروع کنیم.
    مثلا خوبه فعلا برای پروژه ی اول واسه این که کارمون زود تر تموم شه و بی نتیجه نمونه یه کامپایلر برای نوشتن برنامه های Console بنویسیم؟

  4. #4
    کاربر دائمی آواتار setroyd
    تاریخ عضویت
    اسفند 1389
    محل زندگی
    تهران
    پست
    1,198

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    ok
    شروع کنیم دوست عزیز من زمینه ای تو این ندارم و از compilder یه غول برای خودم ساختم ولی اگه شروع کنیم چون علاقه دارم زود راه میفتم حالا اگه فک میکنی میتونم کمکی کنم من هستم و اگه فک میکنی وقت تلف بکنم که پیشو نگیرم دوستانه بگو نارحت نمیشم ؟

  5. #5
    کاربر دائمی آواتار quiet_programmer
    تاریخ عضویت
    دی 1389
    محل زندگی
    زنجان
    سن
    38
    پست
    289

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    با سلام.

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

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

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

    موفق باشید/

  6. #6
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    همه می تونن همکاری کنن.
    ببینیند من می گم روش کارش به طور کلی این طوری باشه :
    1. تبدیل کد ما به کد اسمبلی
    2. لینک کردن و اسمبل کردن که به عهده ی Linker و Assembler هست
    برای این منظور می تونیم از Assembler معروف FASM که Open Source هست استفاده کنیم.

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

  7. #7
    کاربر دائمی آواتار setroyd
    تاریخ عضویت
    اسفند 1389
    محل زندگی
    تهران
    پست
    1,198

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

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


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

  8. #8
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    من یه زمانی که دانش زیادی در زمینه ی ساخت کامپایلر نداشتم این کد ها رو نوشتم، کار یه هفته است و ناقص مونده و خیلی داغونه یه جورایی، فقط واسه این می ذارم که به قول شما رو هوا نمونه کار.

  9. #9
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    اینو برای 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"

  10. #10
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    و برای تولید کد Assembly این Module رو نوشتم :
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله IamOverlord : یک شنبه 30 مرداد 1390 در 21:03 عصر

  11. #11
    کاربر دائمی آواتار setroyd
    تاریخ عضویت
    اسفند 1389
    محل زندگی
    تهران
    پست
    1,198

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    سنگینه واقعا با چن روز شک دارم کدهارو خوب درک کنم !!

  12. #12
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    اون Module ای که گذاشتم، توش بعضی جا ها رو به فارسی توضیح دادم، شانس آوردم اون موقع یه توضیحی نوشتم!

  13. #13
    کاربر دائمی آواتار setroyd
    تاریخ عضویت
    اسفند 1389
    محل زندگی
    تهران
    پست
    1,198

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    ok سعی میکنم یجوری بفهمم

  14. #14
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    حالا فعلا نیازی نیست زیاد به اون کاری داشته باشیم.
    اول ببینیم اصلا پروژه ی اولمون چه جوری باشه. Syntax اش چی باشه، امکاناتش ... ؟

  15. #15

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    بنده هم هستم ؛

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

    موفق باشین

  16. #16
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

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

  17. #17
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    واسه این که تاپیک رو هوا نمونه یه چیزایی رو بگم :
    بعد از این که ویژگی های زبان برنامه نویسیمون مشخص شد، یه 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)


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

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

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

  18. #18
    کاربر دائمی آواتار setroyd
    تاریخ عضویت
    اسفند 1389
    محل زندگی
    تهران
    پست
    1,198

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

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

  19. #19
    کاربر دائمی آواتار quiet_programmer
    تاریخ عضویت
    دی 1389
    محل زندگی
    زنجان
    سن
    38
    پست
    289

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    با سلام.

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

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

  20. #20
    کاربر دائمی آواتار setroyd
    تاریخ عضویت
    اسفند 1389
    محل زندگی
    تهران
    پست
    1,198

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    اره فک کنم خوب باشه .

  21. #21
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

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

  22. #22
    کاربر دائمی آواتار quiet_programmer
    تاریخ عضویت
    دی 1389
    محل زندگی
    زنجان
    سن
    38
    پست
    289

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    با سلام.

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

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

    1. تحلیل واژه ای (Lexical Analysis)
    2. تحلیل نحوی (Syntax Analysis)
    3. تحلیل معنایی (Semantic Analysis)
    4. تولید کد میانی (Intermediate Code Generation)
    5. بهینه سازی کد میانی (Intermediate Code Optimization)
    6. تولید کد نهایی (Code Generation)
    7. بهینه سازی کد نهایی (Final Code Optimization)

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

    1. کلمات کلیدی
    2. عملگرها
    3. جدا کننده ها
    4. ثابت ها
    5. شناسه ها (به طور کلی به اسامی که کاربر انتخاب میکند،شناسه گویند)

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

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

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

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

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

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

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

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

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

    برای اینکه مطلب یکم قابل فهم بشه مثالی میارم:
    دستور زیر را در نظر بگیرید:
    p:=i+r*60

    فرض کنید که r،p،i از نوع real هستند.
    شکل زیر ترجمه این دستور و تاثیر هر مرحله از کامپایلر بر روی این دستور رو نشون میده:
    Name:  2.jpg
Views: 164
Size:  29.7 کیلوبایت
    از انجایی که کد نهایی تولید شده در این دستور خود بهینه است پس مرحله هفتم تاثیری بر روی کد نهایی ندارد.
    فکر کنم بره امروز کافی باشه. فقط یه نکته: زیاد سخت نگیرین همه این مراحلی که اینجا ذکر شد همه دارای روشهایی برای پیاده سازی دارن. چیز ساده ایه به شرطی که نظریه زبان و ماشین رو بلد باشین. من هی توصیه میکنم بخاطر اینکه خیلی مهمه.
    سوالی باشه من درخدمتم.
    یاحق.
    موفق باشین.

  23. #23
    کاربر دائمی آواتار m2011kh
    تاریخ عضویت
    فروردین 1390
    محل زندگی
    (Zweifall (Nordrhein-Westfalen
    پست
    647

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    من تجربه ای در این زمینه ندارم ولی کار رو دنبال میکنم و هر جا تونستم کمک میکنم ادامه بدین.

  24. #24
    کاربر دائمی آواتار quiet_programmer
    تاریخ عضویت
    دی 1389
    محل زندگی
    زنجان
    سن
    38
    پست
    289

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    با سلام.

    قبلا هم اشاره کرده بودم که نظری زبان و ماشین تو طراحی کامپایلر مهمه. پس چندتا مفهوم رو یاد بگیریم.
    زبان:
    برای تعریف زبان از یک مجموعه غیر تهی از نشانه ها به نام الفا شروع میکنیم و از نشانه ها رشته میسازیم رشته یک دنباله متناهی از نشانه های الفباست. اگر الفبا:
    ∑={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 : چهارشنبه 02 شهریور 1390 در 20:06 عصر

  25. #25
    کاربر دائمی آواتار quiet_programmer
    تاریخ عضویت
    دی 1389
    محل زندگی
    زنجان
    سن
    38
    پست
    289

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    با سلام.

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

    موفق باشین

  26. #26

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    ماشالله انقدر روون و خوبه که همه فقط منتظر درس بعدی میمونن
    واقعا ممنون
    موفق باشید
    منتظر آموزش های بعدی هستیم

  27. #27
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

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

  28. #28
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

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

  29. #29
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    ببینید من می گم بقیه ی دوستان هم در تاپیک شرکت کنن و ایده هاشون رو در مورد چگونگی زبان برنامه نویسیمون بگن تا بعد بریم سراغ ساختش، هنوز مشخص نشده چی می خوایم بسازیم.

  30. #30
    کاربر دائمی آواتار quiet_programmer
    تاریخ عضویت
    دی 1389
    محل زندگی
    زنجان
    سن
    38
    پست
    289

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    با سلام.

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

  31. #31
    کاربر دائمی آواتار quiet_programmer
    تاریخ عضویت
    دی 1389
    محل زندگی
    زنجان
    سن
    38
    پست
    289

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

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

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

  32. #32
    کاربر دائمی
    تاریخ عضویت
    مرداد 1387
    محل زندگی
    35°41′46″N 51°25′23″E
    سن
    28
    پست
    1,545

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    خیلی ممنون از زحماتت دوست عزیز،
    من هم کمک می کنم، بقیه ی دوستان هم شرکت کنن.

  33. #33
    کاربر دائمی آواتار quiet_programmer
    تاریخ عضویت
    دی 1389
    محل زندگی
    زنجان
    سن
    38
    پست
    289

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    با سلام.

    تحلیل واژه ای(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>

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

  34. #34
    کاربر دائمی آواتار quiet_programmer
    تاریخ عضویت
    دی 1389
    محل زندگی
    زنجان
    سن
    38
    پست
    289

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    با سلام.

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

    بخدا تایپ کردنش کلی وقت میبره ها. اگه منصرف شدین اطلاع بدین. از دوستان عزیزمون جناب setroyd،MahmoodGH خبری نیست؟

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

  35. #35
    کاربر دائمی آواتار setroyd
    تاریخ عضویت
    اسفند 1389
    محل زندگی
    تهران
    پست
    1,198

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    دوست عزیز باور کن چون تا حالا تو این زمینه فعالیت نداشتم با اینکه توضیحات کامل و عالی شمارو خوندم بازم برام سنگینه !!! من فکر میکنم اگه برم اول از یک کتاب در این رابطه شروع کنم بهتر باشه .

  36. #36
    کاربر دائمی آواتار m2011kh
    تاریخ عضویت
    فروردین 1390
    محل زندگی
    (Zweifall (Nordrhein-Westfalen
    پست
    647

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    منم با ایشون موافقم (setroyd)

  37. #37
    کاربر دائمی آواتار butterfly8528
    تاریخ عضویت
    شهریور 1387
    محل زندگی
    CLR
    پست
    896

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    سلام .
    quiet_programmer عزیز شما کارتون رو ادامه بدید،دست کم یه مرجع مناسبی میشه واسه کسانی که بعدا به همچین مرجعی نیاز پیدا خواهند کرد .
    موفق باشید .

  38. #38
    کاربر دائمی آواتار setroyd
    تاریخ عضویت
    اسفند 1389
    محل زندگی
    تهران
    پست
    1,198

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    ولی بازم سعی میکنم با کمی دقت اگه بتونم درک کنم .

  39. #39
    کاربر دائمی آواتار m2011kh
    تاریخ عضویت
    فروردین 1390
    محل زندگی
    (Zweifall (Nordrhein-Westfalen
    پست
    647

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    آموزشا چقدر مونده که خودمون رو برای ساخت کامپایلر آماده کنیم.

  40. #40
    کاربر دائمی آواتار quiet_programmer
    تاریخ عضویت
    دی 1389
    محل زندگی
    زنجان
    سن
    38
    پست
    289

    نقل قول: تجربه در اختراع چرخ : ساخت کامپایلر

    با سلام.

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

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

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

صفحه 1 از 2 12 آخرآخر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •