سلام دوستان،
برای ساخت یک زبان برنامه نویسی جدید و در اصل یک Compiler کسی هست که با هم همکاری کنیم؟
Printable View
سلام دوستان،
برای ساخت یک زبان برنامه نویسی جدید و در اصل یک Compiler کسی هست که با هم همکاری کنیم؟
اگه یک کاربر بیسواد میخوایی من حاضرم دوسته عزیز من این ایده تو رو داشتم ولی هدفم یک مترجم برای برنامه سی پلاس پلاس بود این پروژه ام کاری نمی کرد فقط کارش این بود که دستور زبانه منو به سی پلاس پلاس تغییر بده و دستور زبانم هم سی شارپ بود تقریبا
منم هستم
فقط یه کم بیشتر توضیح بده
اینکه از پایه زبان رو بسازید احتیاج به مطالعه بسیار زیاد داره و همچنین انگیزه.
حواستون باشه چیز با ارزشی به نام زمان وجود داره ، سوال اصلی اینجاست آیا واقعا ما به زبان جدید نیاز داریم.یا به عبارت دیگر چه نیازی هست که باید براش زبان برنامه نویسی درست کنیم.
اما نوشتن یک مفسر بسیار راحتر از نوشتن یک کامپایلر خواهد بود ، مثلا مفسری که یک قالب ساده که بسیار شبیه محاوره هست رو به کد سی پلاس پلاس تبدیل کنه و بعد از اون از طریق خود سی پلاس پلاس کامپایل کندش.
به هر حال در کنار شما خواهم بود چون مطالب جالبی رو یاد خواهیم گرفت.
هدف این بود که VB6 زنده بشه،
شی گرایی به طور کامل اضافه بشه و ...
البته منظورم تغییر VB6 نیست. منظورم اینه که از پایه این کارو انجام بدیم و کد هامون رو به کد Assembly تبدیل کنیم.
در مورد دانش این کار هم نگران نباشید.
قبلا به طور عملی، تجربه ی این کارارو داشتم... فقط این کار وقت و حوصله نیاز داره، که به نظرم گروهی باشه بهتره.
به نظر من اگه واقعآ قصد چنین کاری رو دارید باید به شکل اصولی پیش برید.یعنی اولآ کامپایلر باید به دو قسمت جلوبندی و عقب بندی تقسیم بشه. دومآ در جلوبندی باید فازهای تحلیلگر لغوی , تحلیلگر نحوی و معنایی رو به شکل استاندارد پیاده سازی کنید ( مثل همه کاپایلر ها). اگه توضیحات بیشتری خواستید در خدمتم.
برای ایجاد تحلیل گر، چه کار کنیم؟
خودمون بنویسیم؟ یا از نرم افزار استفاده کنیم؟
و اگه از نرم افزار، چه نرم افزاری؟
برای تحلیلگر لغوی میتونید از flex و برای تحلیلگر نحوی از bison یا yacc استفاده کنید. کار این ابزارها به این شکل هست که شما مشخصات لغوی یا نحوی زبانتون رو با یک زبان مخصوص این ابزارها تعریف میکنید و این ابزارها تحلیلگر رو به زبان c یا پاسکال (معمولا) براتون ایجاد میکنند. اما اگه از من بپرسید میگم تحلیلگرها رو خودتون بنویسید چون انعطاف پذیریش خیلی میره بالا.
من نمیدونم اطلاعاتتون در مورد کامپایلر چقدره اگه خواستید میتونم از ابتدا براتون توضیح بدم.
خیلی ممنون از پاسختون. :قلب:
فکر نمی کنم از اوّل لازم باشه... اطلاعات تا حدی دارم که راحت صحبت کنیم.
به نظر من هم خودمون بنویسیم بهتره...
اما در مورد این که خودمون بنویسیم، با چه زبانی؟ با چه Method ای؟ ...
اکه سرعت براتون مهم نباشه فاز جلو بندی رو میتونید با هر زبانی پیاده سازی کنید ولی احتمالا تو فاز عقب بندی (به خاطر تولید کد ) نمیتونید روی هر زبانی حساب باز کنید.
اگه شما با فازها و زیر فازهای کامپایلر و کاربردشون آشنا نیستید میتونم براتون توضیح بدم. من اطلاعاتم بیشتر در فاز جلوبندی هست. یعنی تا جایی که بتونید یه
مفسر بنویسید.وقتی حرف از کاپایلر میشه معمولا شما باید بتونید برای سیستم عامل مورد نظر یه برنامه اجرایی تولید کنید.که من اطلاعات زیادی در این مورد ندارم. ولی در مفسر شما
فقط فاز جلوبندی و زیر شاخه های اونو دارید.و در آخر کد میانی تولید شده رو مستقیم اجرا میکنید.
در کل فکر میکنم c یا ++c برای ایجاد کامپایلر مناسب باشه. ولی مفسر رو میتونید از هر زبانی استفاده کنید.البته باید به سرعت اجرا دقت کنید.
سرعت برام مهم نیست.
در مورد تولید کد اجرایی، کدمون رو به کد Assembly تبدیل می کنیم و با Flat Assembler فایل اجرایی می گیریم. ضمنا FASM رو برای این گفتم که هم Open Source هست، هم این که باهاش برنامه های Windows و DOS بلدم بنویسم.
به غیر از مرحله تولید کد اجرایی و Assemble کردن و LINK کردن، در مورد مراحل قبلیش یه توضیح مختصر بدی که می خوایم چی کار کنیم ممنون می شم.
امیدوارم ازم ناراحت نشی , اصلآ قصدم نصیحت نیست.میخوام یکم منطقی باشی... ساخت کامپایلر و یه زبان جدید کار با ارزشیه. کسانی که موفق به انجام این کار شدن از علم بالایی برخوردار بودند.
حداقل کاری که باید انجام بدی اینه که یه کتاب در مورد اصول طراحی کامپایلر و همچنین نظریه زبانها و ماشینها بخونی. فکر میکنم این در مقابل کاری میخوای انجام بدی بهای کمی باشه.
خب سعی میکنم در مورد کامپایلر یه توضیح مختصر و مفید بدم که شاید کسانی که هیچی در موردش نمیدونن هم چیزی عایدشون بشه.
مراحل کامپایل: در کل کامپایلر به دو فاز جلوبندی و عقب بندی تقسیم میشه. هر کدوم از این فازها هم به فازهای کوچکتر تقسیم میشن.
مراحل جلو بندی:
۱-تحلیلگر لغوی: این تحلیلگر کارش اینه که تک تک لغات برنامه زبان مبدآ رو بررسی میکنه و نوعشون رو مشخص میکنه(شناسه,کلمه کلیدی,عملگر و...) و همچنین چک میکنه که آیا این لغت جزء زبان هست یا نه و اگر نباشه خطای لغوی رخ داده.(مثلا در اکثر زبانها نام متغییرها نمیتونن با عدد شروع بشن.) برای ایجاد تحلیلگر لغوی باید DFA های مربوط به انواع لغات زبانتون رو به شکل تابع پیاده سازی کنید و هر لغت برنامه ورودی رو با همشون چک کنید تا نوعش مشخص بشه.DFA و زبانهای باقاعده رو نمیشه اینجا توضیح داد ولی فقط بگم از مباحث اصلی نظریه زبانهاست.در آخر باید لغات به همراه نوعشون برای فاز بعدی یعنی تحلیلگر نحوی فرستاده بشه.
۲-تحلیلگر نحوی: به زبان ساده درستی ترتیب لغات در کنار هم رو بررسی میکنه. برای مثال در زبان پاسکال یک برنامه باید به این شکل شروع شود:
نام برنامه program
تعریف متغیرها
و باقی برنامه....
حالا اگر برنامه را به این شکل بنویسیم:
program نام برنامه
تعریف متغیرها
و باقی برنامه....
یا حتی:
تعریف متغیرها
نام برنامه program
و باقی برنامه....
در این حالات خطای نحوی رخ داده.در واقع کار تحلیلگر نحوی اینه که بعد از بررسی ترتیب لغات از ساختار برنامه یه درخت به نام درخت تجزیه به عنوان خروجی ایجاد کنه و برای فاز دیگه بفرسته.برای پیاده سازی
تحلیلگر نحوی باید از گرامرهای مستقل از متن استفاده کنید.که اونم توضیحش مفصل و در نظریه زبانها و ماشینها در موردش صحبت شده.
و اینجاست که میفهمیم چرا علمی به نام علوم کامپیوتر پایه گذازی شد!!!!
۳-تحلیلگر معنایی
۴-تولید کننده کد میانی
این دوتا فاز و همچنین عقب بندی بمونه برای بعد.:لبخندساده:
نه ناراحت نمی شم،
اتفاقا از رو کتاب می رم جلو
ولی این قدر تئوریه که بعضی جاهاش گنگ می شه...
الان دقیقا کجاهاش برات گنگه؟
یه درخت تجزیه رو به چه صورت باید ذخیره کنیم که بهمون کمک کنه؟
والا دانش اندک و ناقص من میگه که این بیشتر به زبان برنامه نویسی مورد استفاده مربوط میشه.
حالا تو در مراحل قبلی یعنی تحلیلگر لغوی که مشکلی نداری. اگه ابهامی هست بگو. چون من تصمیم دارم یک تحلیلگر لغوی ساده بنویسم.البته اگه بتونم.:قهقهه:
نه با تحلیلگر لغوی مشکل خاصی ندارم. بعدشم ما می خوایم طعم این کارو بچشیم، کار تجاری که نمی خوایم بکنیم. امتحانش ضرر نداره.
ببین واسه شروع یه کار ساده می گم.
خط به خط برنامه رو جدا می کنیم تو یه آرایه.
بعد هر خط رو بر اساس فواصل بین کلمات و عبارات جدا می کنیم.
فقط توجه می کنیم که این کارو برای عبارات داخل کوتیشن انجام ندیم.
... ؟ :متفکر:
... این کار برای ساختار های چند خطی یا تو در تو جواب نمی ده یا خیلی سخته.
چون ما داریم هر خط رو به تنهایی بر رسی می کنیم.
البته می شه یه کاری کرد.
این که بیایم تعیین کنیم الان تو چه ساختاری هستیم، ساختار For، ساختار While، ...
اما اگه به پایان ساختار فعلی رسیدیم، باید بفهمه ساختار فعلی، خودش جزو کدوم ساختار بوده، یعنی ساختار قبلی چی بوده.
چون ممکنه برنامه نویس چند تا For تو در تو داشته باشه یا ...
پس می شه یه متغیر رشته ای در نظر گرفت که وقتی وارد ساختار جدید می شیم، مشخصه ی اون ساختار بهش اضافه می شه و وقتی می آیم بیرون از ساختار، آخرین ساختار ثبت شده از متغیر حذف می شه.
نظر شما چیه؟ :متفکر:
ببخشید ولی فکر میکنم جدا کردن لغات جزء تحلیلگر لغویه و جدا کردن کدها به شکل خط به خط یا ';' یا تگ و .... کار تحلیلگر نحویه و با این کار با هم تداخل پیدا میکنند.
پیشنهاد من اینه که اول از تحلیلگر لغوی شروع کنیم.برای شروع هم من دارم یک تحلیلگر ساده مینویسم که لغات رو از هم جدا میکنه و شناسه ها و اعداد ثابت رو تشخیص میده.
البته با وی بی مینویسم ولی بعدآ در صورت لزوم میتونم با c هم بنویسم.
عیب نداره. چون پردازش رشته می کنیم، فعلا با VB6 راحت تریم.
راستی یه برنامه ای هم گذاشتم ببین، با همین VB6 نوشته شده:
ببین زبان های جورواجور با Syntax های عجیب و غریب و بعضا جالب خیلی هست. اما من به نظرم به جای این که یه Syntax کاملا جدید درست کنیم، همین Syntax زبان BASIC رو استفاده کنیم.
چون می خوایم باهاش Win32 Application نوشته بشه، به نظرم رو VB Classic تمرکز کنیم بهتر باشه. اما با ایده های جدید خودمون و یه سری تغییرات جالب.
به نظرم خیلی عالی می شه اگه VB6 رو احیا کنیم.
نظرت چیه؟
به این لینک نیگا بنداز، می تونی ایده بگیری : groups.engin.umd.umich.edu/CIS/course.des/cis400/index.html
باشه.
برای چه محیطی منظورت هست؟
البته بیهوده هم نیست، چون الان VB6 دیگه از دور خارج شده، قرار هم نیست کار تکراری کنیم و عین VB6 رو بسازیم.
ولی خوب نظر شما چیه؟
منظورم از محیط جدید محیطهایی هست که مثلا زبان vb به اون اندازه در اونها توسعه پیدا نکرده.مثل لینوکس, اندروید و .... البته منظورم
ساخت برنامه اجرایی از کد هست نه ساخت کامپایلر برای اون محیطها. اما در کل ساخت یک زبان جدید رو جالبتر میدونم.
راستی تونستم یک تحلیلگر لغوی ساده طراحی کنم.این تحلیلگر اعداد و شناسه ها رو تشخیص میده و لغات دیگر رو خطا میگیره :لبخند:
ضمیمه 81051
ای ول، خیلی کارت درسته! :قلب:
آخه می دونی، من که فعلا از محیط های دیگه اطلاع کافی ندارم...
می تونیم از Windows شروع کنیم و به اونا هم برسیم...
یه فکری به نظرم رسید:
الان برای شروع بیا یه کار خیلی سریع تر و ساده تر کنیم،
فقط برای محیط Console برنامه بنویسه...
ضمنا برنامه های Console در Windows دو نوع هستند.
یه سری با وقفه ها نوشته شدن و در سیستم عامل های دیگه هم می تونن کار کنن،
و یه سری با توابع API نوشته شدن و فقط در Windows کار می کنند.
این نوع دوم رو بعدا می شه گسترش داد به برنامه های غیر Console ای که حالت گرافیکی Windows رو دارن.
حالا به نظر خودت چه زبانی رو برای Windows بنویسیم که هم بیهوده نباشه، هم جذابیت داشته باشه؟
شاید دیگه بهم بگی عجب کلیدی هستی تو... ولی باز به نظر من یک زبان جدید میتونه جالبتر باشه.میتونیم با هم فکر کنیم و ساختارهای جالبی رو بسازیم. فکر نمیکنم اونقدر سخت باشه.
راستش وقتی خودم رو جای کسی که با زبان ما (vb توسعه داده شده) برخورد میکنه میگذارم یه خورده نسبت بهش بی تفاوتم.خصوصآ با وجود چارچوب دات نت.ولی باز مشورت شرط عقل است.
در ضمن به نظر من محیط کنسول یا گرافیکی هر دو خوبن و برام فرقی نمیکنه.
باشه.
اتفاقا از کارهای تازه و خیس خوشم می آد! :لبخند: :قلب:
اولا که این مشخص بشه : برای Windows برنامه می نویسه دیگه؟ منظورم اینه که تحت چارچوب Console و DOS نباشه دیگه؟
موافقم.
با استفاده از وقفه (Interrupt) ها یا با استفاده از توابع API؟
من با دومی موافقم.
من هم دقیقا حس شما رو دارم، لازم نیست گیر سه پیچ بدیم در عوض از کار لذت می بریم...
اتفاقا Interrupt ها ساده ترند.
ولی برای روش دوم یعنی استفاده از توابع API این مرجع MSDN هست که توابع API و Structure ها و Event های مربوطه رو توضیح داده.
در مورد Interrupt ها هم این جا رو ببینید : www.ctyme.com/intr/int.htm
می خواستم یه لینک به این جا رم بدم، ولی مثل این که امشب یه خبرایی هست!!! : www.sopastrike.com
خب پس بهتر کم کم به فکر ساختار زبان باشیم.
بالاخره از یه جایی باید شروع کرد دیگه، ایده های کوچیک و بزرگ....
مثلا طرف بنویسه :
f(x) = x ^ 2
و کارش اینه که این مدل کدها رو :
f(35)
تبدیل به این مدل کد ها می کنه:
35 ^ 2
یعنی طرف به سادگی و به طور صریح Function تعریف می کنه (جدا از اون Function هایی که مثل زیربرنامه ها هستند و اجرا می شن)
حتی می تونه یه همچین توابعی هم داشته باشه:
Zarb3Ta(a,b,c) = a * b *c
برای توابع بازگشتی این کارو می تونه بکنه :
phibonacci(n)
{
n = 1 : 1
n = 2 : 1
n > 2 : phibonacci(n-1) + phibonacci(n-2)
}
این کار جنبه ی ریاضی و قشنگ تری به کد می ده...:متفکر:
مثلا تابع قدر مطلق رو این طوری می تونه تعریف کنه :
Absolute(x)
{
n => 0 : x
n < 0 : -x
}
ایده هات عالی بود.:تشویق: ولی بهتره اول به مسائل اساسی تر فکر کنیم.مثل چگونگی شروع و پایان برنامه-تعریف متغییرها-چگونگی استفاده از عملگرها و...
برنامه ها sub main داشته باشن یا نه؟
کلمات کلیدی function و sub رو تعریف کنیم؟ یا مثل زبان C نوع خروجی رو پشت اسم زیربرنامه بنویسیم؟
بدون تعریف متغیر ها می شه ازشون استفاده کرد؟
در مورد عملگر ها به نظرم توان رو به عنوان عملگر در نظر بگیریم، نه مثل زبان C به صورت یه تابعی مثل ()pow
+
-
*
/
^
\
mod ...؟
انتساب ها:
= یا =: ؟
=+
=-
=*
=/
=\ ...؟
=^ ...؟
ایده های من
دستورات با \ یا - از هم جدا بشن.
جایگزینی و انتساب:
a:b
ولی برای تست تساوی در دستورات شرطی از = استفاده بشه.
+
-
*
/
اما برای توان و باقیمانده از یک کلمه کلیدی استفاده بشه.
یک تابع main داشته باشیم
از < و > برای بلاک بندی توابع استفاده کنیم.
فعلآ همین. اگه نظری داری بگو.
خوب با main موافقم، چون می شه از طریق خط فرمان به برنامه آرگومان ارسال کرد.
2 تا چیز در زبان C هست که گاهی اذیت می کنند: ; {}
راحت تره که برای پایان دستوارت از ; استفاده نکنیم. اما اگه خواستیم چند تا دستور رو تو یه خط بنویسیم ; بذاریم. چون مفهوم مرتبطی داره. وقتی یه جمله ای می نویسیم که با جمله ی بعدی مرتبطه از ; استفاده می کنیم، در برنامه نویسی هم خطوط برنامه با هم مرتبط هستند پس فکر کنم بهتر باشه از ; استفاده کنیم برای نوشتن چند خط کد در یک خط.
برای تست تساوی موافقم از = استفاده کنیم نه مثلا ==.
چون اول ها که برنامه نویسی یاد گرفته بودم، 2 معنی متفاوت = در شرط ها و انتساب ها برام نا آشنا بود.
یه ویرایش کوچولو می کنم ببینم موافقی:
=: برای تساوی (گذاشتن ':' از لحاظ مفهومی واقعا مناسبه)
به جای mod (مثل BASIC)، % (مثل C) بذاریم بهتر نیست؟
برای توان چی؟
از ^ که در BASIC هست استفاده کنیم
یا تابع بسازیم : ()pow
یا ... ؟
< و > برای بلاک بندی توابع ریاضی یا اجرایی؟
جدا کردن دستورات بر اساس خط به خط و بدون علامت هماهنگ کننده ( ; یا \ یا هر چیزی ) رو میشه تا حدودی حل کرد. ولی به هر حال نمیشه از بلاک بندی گذشت. چون اکثر زبانهای معروف
حتی ویژوال بیسیک هم به نحوی این کار رو انجام میدن (sub .... end sub). ایدت در مورد استفاده از علامت ; فقط برای جدا کردن دستورات در یک خط هم جالبه اما بهتره از یه علامت دیگه
استفاده کنیم که شبیه زبانهای دیگه نشه. مثل \ یا |
از =: استفاده کنیم. چون : مفهموم توضیح در مورد یه چیزی رو می ده (یه ایده در این مورد همین الان به ذهنم رسید)، و = مشخص می کنه که توضیح ما در مورد برابر شدن هست.
این ساختار رو نگاه کن:
a := b 'yani a = b
a :- b 'yani a = a - b
a :+ b 'yani a = a + b
a :* b 'yani a = a * b
a :/ b 'yani a = a / b
' ...
' shabihe += va -= ...
از : خالی می تونیم برای تعریف متغیر و ... استفاده کنیم.
نگران تشابه با زبان های دیگه هم نباش، این قدر ایده هست که اصلا طرف یادش نمی آد این شبیه کدوم زبانه!
با Block ها مخالف نیستم، دوست دارم برای راحتی در یک خط بلاک رو شروع به تعریف کنه و در یک خط پایان بده تعریفو. شبیه BASIC.
این چطوره؟
<main:
a:=c+j
k:=f-t
>
<sampleFunction:
m:=6+4
>
سلام دوست عزیز، ببخشید یه مدت نتونستم بیام.
در مورد sampleFunction اگه می شه یه توضیحی بدید. مثلا آرگومان های ارسالی، تعیین نوع خروجی، ... .
قسمت main و Function شبیه هم نوشته می شن، خوبه یک پارچه تر می شه.
اما تفاوت این دو و ویژگی هاشون چه طور مشخص می شه؟
این Syntax رو ببین، ویرایش کن، دوباره بذار:
این ساختار خوب بود . اما فکر میکنم به دلیل اهمیت ساختار زبان بهتر باشه مرحله به مرحله پیش بریم. یعنی هر دفعه روی یک ساختار (تعریف توابع , حلقه , تعریف متغییر و ...) تمرکز کنیم و وقتی در مورد اون ساختار به توافق رسیدیم , به ساختار بعدی بپردازیم.
به خاطر اهمیت ساختار توابع و مخصوصآ تابع اصلی برنامه بهتره با اون شروع کنیم.
Function Multiply(x : Integer, y : Integer) : Integer
Multiply = x * y
End Function
من با این ساختار تا حدودی موافقم ولی به نظرتون یکم شبیه پاسکال ( پارامترهای ورودی) و vb ( عبارت end function) نشده؟ اگه یکم تغییرش بدیم بهتر میشه.
در ضمن برای تابع اصلی برنامه هم میتونیم از همین ساختار استفاده کنیم.
بله ولی سعی کردم هم راحت نوشته بشه، هم راحت خونده بشه، و ...
ضمنا می شه پیچیده تر و بهترش کرد؛ طی این مراحل خود به خود زبانمون بی شباهت به زبان خاضی می شه.
اول در مورد تعریف متغیر بگید، اون : ها رو برای آرگومان های تابع واسه این گذاشتم که فرض کردم تعریف متغیر این طوری هست:
i : Integer
text1 : String
v : Vector