-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
باز خدا رو شکر شما چهار تا نمره ی دانشگاهی دارید، من که هنوز...!:گیج:
ببخشید دوستان،
اگه به نظرتون کم کاری از من هست، به خاطر این که نمی خوام نظر چرت و پرت بدم،
اصلا اول اول هدفم این بود که یه برنامه بنویسم که توش به جای چیزایی که می نویسم چند خط کد Assembly بذاره که آدم این قدر از کدهای تکراری عذاب نکشه،
بعد ... داستان به ساخت کامپایلر رسید،
خوب گفتم چه بهتره که اصولی باشه و از کسایی که علمشو دارن کمک بگیرم بعد اون قسمت تولید کدهای Assembly رو بنویسم،
هنوز هم سر حرفم هستم و در قسمت آخر هر کمکی از دستم بر می آد می کنم.
قبول دارم که این قسمت ها پیچیده تره، طبیعیه که یه کم کند پیش رفته، باز حداقل بحث پیش بره و به نتیجه برسه بهتره.
اگه حاصل این 20 30 صفحه ی تاپیک یه زبان با 2 تا دستور باشه، بهتر از اینه که هیچی نباشه،
نمی دونم چه طلسمیه که پروژهای Open Source این فروم ها همه یه بلایی سرشون می آد!
نباید بذاریم این جا هم مثل بقیه ... .
دوباره بحث رو ادامه بدیم، از صحبت تند (البته بدون توهین و تمسخر و...) نترسیم یا نارخت نشیم، چون بحث علمیه و بحث و مشاجره در علم سازنده است. بی رو دربایستی بحث رو ادامه می دیم...
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
خب ساخت تحلیلگر لغوی یک الگوریتم تقریبآ مشخص داره. ( پیاده سازی DFA ) ولی مشکل از اینجا به بعد شروع میشه. یعنی اینکه برای تحلیلگر نحوی و تجزیه کننده اون از چه الگوریتمی استفاده کنیم. متآسفانه یا خوشبختانه الگوریتم های زیادی برای این تحلیلگر وجود داره. تآسف به این خاطره که تصمیم گیری در مورد اینکه کدوم الگوریتم استفاده بشه یکم مشکله. معایب و مزایای هر الگوریتم و نحوه پیاده سازیشون با هم متفاوته. در نتیجه تصمیم گیری در این مورد یکمی سخته. اگه از لحاظ سادگی طراحی باشه من پیشنهادم تجزیه کننده پیشگوی بازگشتیه. ولی اگه از لحاظ عملکرد بخوایم بررسی کنیم الگوریتمهای زیادی رو میشه نام برد مثل (LALR(1 و (CLR(0 و .... یکم باید در این مورد با احتیاط تصمیم گرفت. باز هم از دوستان خواهش میکنم که در پروژه بیشتر همکاری کنن.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
باز خدا رو شکر شما چهار تا نمره ی دانشگاهی دارید، من که هنوز...!:گیج:
ببخشید دوستان،
اگه به نظرتون کم کاری از من هست، به خاطر این که نمی خوام نظر چرت و پرت بدم،
اصلا اول اول هدفم این بود که یه برنامه بنویسم که توش به جای چیزایی که می نویسم چند خط کد Assembly بذاره که آدم این قدر از کدهای تکراری عذاب نکشه،
بعد ... داستان به ساخت کامپایلر رسید،
خوب گفتم چه بهتره که اصولی باشه و از کسایی که علمشو دارن کمک بگیرم بعد اون قسمت تولید کدهای Assembly رو بنویسم،
هنوز هم سر حرفم هستم و در قسمت آخر هر کمکی از دستم بر می آد می کنم.
قبول دارم که این قسمت ها پیچیده تره، طبیعیه که یه کم کند پیش رفته، باز حداقل بحث پیش بره و به نتیجه برسه بهتره.
اگه حاصل این 20 30 صفحه ی تاپیک یه زبان با 2 تا دستور باشه، بهتر از اینه که هیچی نباشه،
نمی دونم چه طلسمیه که پروژهای Open Source این فروم ها همه یه بلایی سرشون می آد!
نباید بذاریم این جا هم مثل بقیه ... .
دوباره بحث رو ادامه بدیم، از صحبت تند (البته بدون توهین و تمسخر و...) نترسیم یا نارخت نشیم، چون بحث علمیه و بحث و مشاجره در علم سازنده است. بی رو دربایستی بحث رو ادامه می دیم...
الان شما درباره کد میانی ( کد سه آدرسه بهتره) تحقیق کن. چون باید برنامه نوشته شده به زبان ما به این کد میانی تبدیل بشه. بعد از اینکه با این کد آشنا شدی, روی تبدیل اون به کد اسمبلی کار کن. منم فعلا دارم روی طراحی گرامر BNF زبان کار میکنم.
در ضمن بهتره یه اسم برای این زبان انتخاب کنیم که مجبور نشیم هی بگیم زبانمون زبانمون.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
سلام دوستان، به خاطر وقفه ی طولانی معذرت می خوام.
چرا از کد 3 آدرسه استفاده کنیم؟
اگه می شه یه مثال از اون چیزی که مد نظرتون هست بزنید.
فکر نمی کنم تبدیلش به کد Assembly کار سختی باشه...:متفکر:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
یک بار کل مراحل کامپایلر رو نام میبرم.
جلوبندی:
۱- تحلیلگر لغوی
۲-تحلیلگر نحوی
۳-تحلیلگر معنایی
۴-تولید کننده کد میانی
عقب بندی:
۱-بهینه سازی کد میانی
۲-تولید کننده کد ( اسمبلی )
البته در آخر کد اسمبلی رو باید به اسمبلر بفرستیم.
خوب. همونطور که میبینید در مرحله چهارم جلوبندی, ما تولید کننده کد میانی رو داریم. این رول اصلی در اکثر زبانهای برنامه نویسی هست که کد زبان مبدا رو به یک کد به زبان میانی تبدیل میکنند و بعد اون به اسمبلی تبدیل میشه.
البته ما میتونیم کد میانی خاص خودمون رو داشته باشیم. ولی کد سه آدرسه هم بد نیست و خیلی سادست. نمونه ای از کدهای سه آدرسه:
(temp:=IntToReal(12
temp2:=id3*temp1
temp3:=id2+temp2
id1:=temp3
البته نیاز به تحقیق بیشتر هست. در ضمن IntToReal برای تبدیل نوع صحیح به اعشاریه.
الان یک مساله ای که فکر منو به خودش مشغول کرده , در مورد اسمبلر هست. آیا میشه از این اسمبلر به این شکل به صورت رایگان استفاده کرد؟ آیا شما مشکلی در مورد ارتباط کامپایلر با اسمبلر ندارید؟
مساله بعد در مورد دستورات هست. الان ما غیر از انتساب , هیچ دستور دیگه ای در زبان نداریم! این هم که بیایم دستورات پایه رو به صورت کتابخانه و با کد اسمبلی بنویسیم, جالبه اما آیا واقعآ استاندارد هست؟
البته اضافه کنم دستورات حلقه و شرطی رو هم داریم .
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
اگه بخوایم از FASM استفاده کنیم Open Source هست. مثل NASM. اما به دلایلی بیش تر FASM رو قبول دارم. ضمنا نیاز به Linker جدا نداریم، خودش Link هم می کنه. برای Linux و Windows و ... هیچ مشکلی نداریم. هم IDE داره و هم برنامه ی Console که با ارسال پارامتر به برنامه ی Console اش می تونیم بگیم، کارامون رو بکنه. از این لحاظ مشکلی نیست.
اگه دیده باشید Pure Basic هم از FASM استفاده می کنه.
اگه بخوایم کد Assembly خالص بدیم به FASM فقط یه FASM.EXE کافیه، اما اگه بخوایم یه سری macro تعریف کنیم (این برامون بهتره تا تعریف زیربرنامه)، باید یه سری (حتی یک) فایل inc. هم داشته باشیم. این کار انعطاف پذیریش بیش تره به نظرم. اگه خواستیم یه تغییری در دستورات پایه ای مون بدیم، فقط کافیه macro ها رو فایل های inc ویرایش کنیم، نه کد Compiler رو!
ضمنا اگه پشیمون شدیم، macro ها رو می تونیم حذف کنیم و خودمون در مرحله ی قبل تر کد macro ها رو تولید کنیم که البته الکی خودمونو اذیت می کنیم.
استاندارد هم هست، چون کد Assembly نهایی در این کار هیچ فرقی با بدون macro اش نداره، چون macro ها برخلاف زیربرنامه ها فقط جایگزین خطوط برنامه می شن.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ضمنا یه نظری دارم، اگه کد میانی مون شبیه Instruction های Assembly باشه بهتره (هم راحت تر).
چون نیاز به حداقل پردازش ممکن برای رسوندن کد به Assembler داره؛ یا حتی هیچ پردازشی اگه
کد های سه آدرسیمون رو macro در نظر بگیریم!
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
منظورمو در مورد دستورات پایه نگرفتی! میگم اینکه ما هیچ دستوری مثلا برای ورودی خروجی نداریم و دستورات در کتابخانه ها به شکل اسمبلی هستند یکم با معنای کامپایلر در تناقضه. ببین من فکر میکنم اینکه بعضی از زبانها از دستورات اسمبلی به شکل inline استفاده میکنند یک قابلیت جنبی باشه. نه اینکه کل زبانمون وابسته به این دستورات باشند. من فکر نمیکنم هیچ زبانی وابسته به دستورات inline باشه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
همه ی زبان ها به دستورات پایه وابسته هستن اما بعضی ها Assembly رو پایه انتخاب می کنن، بعضی ها یه دستورات سطح بالاتری رو.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ببین مثلا شما فرض کن ما برای
Variable1 = Variable2
باید این کد رو تولید کنیم :
MOV AX,variable2
MOV Variable1,AX
خوب می آیم مثلا این رو تعریف می کنیم به عنوان ماکرو:
macro ThreeAddress_MOVE Operand1,CPURegister,Operand2
{
MOV CPURegister,Operand2
MOV Operand1,CPURegister
}
بعد مثلا این طوری کد 3 آدرسی تولید می کنیم:
ThreeAddress_MOVE variable1,AX,variable2
منظورم این طوری بود.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ببخش ولی تا من مثال دقیق نبینم , قانع نمیشم. تو کتابخانه های gcc هرچی گشتم یک چنین چیزی ندیدم. میتونی مثال واضح از یک زبان و کامپایلر معروف بیاری.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
ببین مثلا شما فرض کن ما برای
Variable1 = Variable2
باید این کد رو تولید کنیم :
MOV AX,variable2
MOV Variable1,AX
خوب می آیم مثلا این رو تعریف می کنیم به عنوان ماکرو:
macro ThreeAddress_MOVE Operand1,CPURegister,Operand2
{
MOV CPURegister,Operand2
MOV Operand1,CPURegister
}
بعد مثلا این طوری کد 3 آدرسی تولید می کنیم:
ThreeAddress_MOVE variable1,AX,variable2
منظورم این طوری بود.
این رو بگم که اگه منظورت از کد سه آدرسه همون کد زبان میانی ما هست , اشتباهه و باید از همون فرمهایی که گذاشتم تبعیت کنه. بازم میگم نیاز به تحقیق داره.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
خوب اگه شما می خواید دستورات پایه مون سطح بالا باشه، قبول، تجربه اش ضرر نداره.
در مورد کد سه آدرسه من هر چه قدر فکر می کنم مزیت روش قبلی رو نسبت به این حالت نمی فهمم:
Instruction FirstOperand , SecondOperand , ThirdOperand
:متفکر:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
خوب اگه شما می خواید دستورات پایه مون سطح بالا باشه، قبول، تجربه اش ضرر نداره.
در مورد کد سه آدرسه من هر چه قدر فکر می کنم مزیت روش قبلی رو نسبت به این حالت نمی فهمم:
Instruction FirstOperand , SecondOperand , ThirdOperand
:متفکر:
بله این هم میتونه نوعی زبان میانی باشه ولی چون گفتید کد سه آدرسه هست , خواستم تذکر بدم که کد سه آدرسه نیست.
الان به نظرم اگه بخوایم دستورات پایه رو به زبان سطح بالا تعریف کنیم فکر میکنم اولویت با ورودی خروجی باشه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
با اینکه خودم مایلم کار اصولی پیش بره ولی احساس میکنم این کد میانی یکم کارو طولانی میکنه. نظرتون چیه؟ کد مبدآ رو مستقیمآ به اسمبلی تبدیل نکنیم؟؟؟!!!!:متفکر:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
خوب انواع ورودی و خروجی ها چی هستن؟
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
با اینکه خودم مایلم کار اصولی پیش بره ولی احساس میکنم این کد میانی یکم کارو طولانی میکنه. نظرتون چیه؟ کد مبدآ رو مستقیمآ به اسمبلی تبدیل نکنیم؟؟؟!!!!:متفکر:
نمی گم کد مبدا (اصلاح شد) مستقیما به کد Assembly تبدیل بشه، می گم فقط مشابه باشه با اون کد. این طوری راحت تره، غیر اصولی هم نیست، هر کی هر شکل کد میانی ای که می خواد می تونه داشته باشه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
فکر میکنم اول باید به فکر ورودی خروجی ( خواندن و نوشتن ) در کنسول باشیم و بعد هم کار با فایل!
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
نمی گم کد میانی مستقیما به کد Assembly
این نظر خود من بود. پس شما نظرت اینه که اول به کد میانی تبدیل بشه بعد به اسمبلی دیگه. درسته ؟
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
نمی گم کد میانی مستقیما به کد Assembly تبدیل بشه، می گم فقط مشابه باشه با اون کد. این طوری راحت تره، غیر اصولی هم نیست، هر کی هر شکل کد میانی ای که می خواد می تونه داشته باشه.
فکر میکنم یک اشتباهی شد. من پیشنهاد نکردم کد میانی مستقیم به اسمبلی تبدیل بشه چون باید مستقیم باشه. پیشنهاد من این بود که مرحله کد میانی حذف بشه و کد مبدآ مستقیمآ به اسمبلی تبدیل بشه. این فقط یه پیشنهاده. نظرت چیه؟
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
فکر میکنم اول باید به فکر ورودی خروجی ( خواندن و نوشتن ) در کنسول باشیم و بعد هم کار با فایل!
نظرتون چیه در مورد این که دستورات ورودی و خروجی ساختار فراخوانی شون شبیه بقیه ی زیربرنامه ها باشه؟!
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
فکر میکنم اول باید به فکر ورودی خروجی ( خواندن و نوشتن ) در کنسول باشیم و بعد هم کار با فایل!
نظرتون چیه در مورد این که دستورات ورودی و خروجی ساختار فراخوانی شون شبیه بقیه ی زیربرنامه ها باشه؟!
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
فکر میکنم یک اشتباهی شد. من پیشنهاد نکردم کد میانی مستقیم به اسمبلی تبدیل بشه چون باید مستقیم باشه. پیشنهاد من این بود که مرحله کد میانی حذف بشه و کد مبدآ مستقیمآ به اسمبلی تبدیل بشه. این فقط یه پیشنهاده. نظرت چیه؟
آه...! ببخشید.
پست اصلاح شد. منظورم کد مبدا بود.
من هم موافقم با این که کد مبدا یا مستقیم به کد Assembly تبدیل بشه یا خیلی مشابه کد های Assembly مون باشه همون طوری که مثال زدم با macro.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
نظرتون چیه در مورد این که دستورات ورودی و خروجی ساختار فراخوانی شون شبیه بقیه ی زیربرنامه ها باشه؟!
ببین مثلآ توی زبان c یا basic فکر نمیکنم که شبیه هم باشن. بهتره ما هم به همین رویه عمل کنیم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ولی بهتره خواندن و نوشتن در کنسول با خواندن و نوشتن در فایل به نوعی یک پارچه باشن.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
برای کار با فایل موافقم،
اما در مورد خوندن و نوشتن به نظرم مثل تابع و زیربرنامه باشن بهتره.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
اصلا مثل C هر دو روش...!:لبخند:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
Console.WriteLine ' minevise mire khatte payin
Console.Write ' faghat minevise
Console.ReadLine ' mikhoone ta yaroo enter ro bezane
Console.ReadCharacter ' faghat ye character mikhoone
...
این Console قبلشو چی کار کنیم...؟
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
اصلا مثل C هر دو روش...!:لبخند:
الان که دارم خوب فکر میکنم , اصلآ امکان اینکه خواندن و نوشتن در کنسول رو به شکل تابع در بیاریم نیست چون باز مجبوریم از دستورات اسمبلی در تعریف تابع استفاده کنیم. ولی در مورد فراخوانیش به شکل توابع مشکلی نیست.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
Console.WriteLine ' minevise mire khatte payin
Console.Write ' faghat minevise
Console.ReadLine ' mikhoone ta yaroo enter ro bezane
Console.ReadCharacter ' faghat ye character mikhoone
...
این Console قبلشو چی کار کنیم...؟
بهتر نیست از دستورات به تنهایی استفاده بشه؟ (بدون console) . چون این در مفاهیم فعلی زبانمو نیست. به خاطر همین نقطه و console مجبوریم مفاهیم جدیدی رو در زبانمو حمایت کنیم ( شی گرایی!)
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
یا:
use 'iostream'
use 'ScreenClass'
object obj01 : ScreenInterface ' An object from ScreenClass
obj01.WriteLine ...
obj01.ReadLine ...
' Note : ScreenClass written with iostream routines.
' bara in ke ghablesh console byad:
object Console : ScreenInterface
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
الان که دارم خوب فکر میکنم , اصلآ امکان اینکه خواندن و نوشتن در کنسول رو به شکل تابع در بیاریم نیست چون باز مجبوریم از دستورات اسمبلی در تعریف تابع استفاده کنیم. ولی در مورد فراخوانیش به شکل توابع مشکلی نیست.
منظورتون رو متوجه نشدم. پیاده سازی توابع زیربرنامه ها در Assembly که مشکلی نداره...
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
یا:
use 'iostream'
use 'ScreenClass'
object obj01 : ScreenInterface ' An object from ScreenClass
obj01.WriteLine ...
obj01.ReadLine ...
' Note : ScreenClass written with iostream routines.
' bara in ke ghablesh console byad:
object Console : ScreenInterface
وای این که دیگه پیچیده تر شد. بازم میگم چهار تا دستور ساده باشه خیلی بهتره.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
بهتر نیست از دستورات به تنهایی استفاده بشه؟ (بدون console) . چون این در مفاهیم فعلی زبانمو نیست. به خاطر همین نقطه و console مجبوریم مفاهیم جدیدی رو در زبانمو حمایت کنیم ( شی گرایی!)
!OK
پس اول غیر شئ گراشو می نویسیم مثل C، بعد می شینیم مثل جناب Stroustrup مفاهیم شئ گرایی رو اضافه می کنیم... :لبخند:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
وای این که دیگه پیچیده تر شد. بازم میگم چهار تا دستور ساده باشه خیلی بهتره.
اون چهار تا دستور ساده تو iostream قایم شده بودن!
ولی باشه به هر حال فعلا غیر شئ گراشو می نویسیم بعد ... .
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
منظورتون رو متوجه نشدم. پیاده سازی توابع زیربرنامه ها در Assembly که مشکلی نداره...
چون شما گفتید مثل C از هر دو روش, فکر کردم شاید میخواید برای خواندن و نوشتن باز از توابع کتابخانه ای استفاده کنید. بیخیال....
فعلا تکلیف همین دستورات سطح بالا رو مشخص کنیم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
چون شما گفتید مثل C از هر دو روش, فکر کردم شاید میخواید برای خواندن و نوشتن باز از توابع کتابخانه ای استفاده کنید. بیخیال....
فعلا تکلیف همین دستورات سطح بالا رو مشخص کنیم.
OK
ولی منظورم scanf من و cin شما بود!
چون scanf خیلی شبیه با زیربرنامه ها و توابعه و cout هم که نه!
اصلا زیاد مهم نیست، چون اگه یه چیزی مثل cout پیاده سازی کنیم که شبیه زیربرنامه ها نباشه، خیلی راحت می شه زیربرنامش هم نوشت دیگه...!
خوب حالا نظر شما برای ورودی و خروجی چیه؟
این که ورودی و خروجی Console و File ها شبیه هم باشن جالب بود اما چه طوری؟
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
OK
خوب حالا نظر شما برای ورودی و خروجی چیه؟
این که ورودی و خروجی Console و File ها شبیه هم باشن جالب بود اما چه طوری؟
مثلآ در vb دستور print هم میتونه در نوشتن روی فرم به کار بره هم در نوشتن در فایل.