-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ببین 2 راه برای روال اصلی هست:
1. نوشته نشه. یعنی به محض این که کد رو می نویسی در روال اصلی فرض می شه.
2. نوشته بشه. که باید به صورت زیربرنامه در زبانمون تعریف بشه.
مزیت روش 1 سادگی هست.
مزیت روش 2 تمیزی کد و استفاده از آرگومان های ورودی به تابع اصلی در برنامه هست.
البته برای استفاده از آرگومان های ورودی در روش 1، راه هست : بیایم یه دستور برای این کار در نظر بگیریم که در میان کد های روال اصلی، بیاد مقدار ورودی به روال رو از پشته دریافت کنه، یا هر نوع دستور دیگه ای...
----------------------------
اگر روش 2 رو انتخاب کردیم:
روال اصلی، SUB در نظر گرفته بشه یا FUNCTION یا اصلا مثل زبان C تعریف بشه یا ...؟
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
اول در مورد تعریف متغیر بگید، اون : ها رو برای آرگومان های تابع واسه این گذاشتم که فرض کردم تعریف متغیر این طوری هست:
i : Integer
text1 : String
v : Vector
متوجه منظورتون شدم ولی میگم این نوع آرگومان دهی یکم شبیه پاسکال نشده. اگه به نظرتون این شباهت
ایرادی نداره منم مشکلی ندارم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
اگه اشکالی نداره با این ادامه بدیم، دوباره بر می گردیم عقب؟ :متفکر:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
اگه اشکالی نداره با این ادامه بدیم، دوباره بر می گردیم عقب؟ :متفکر:
موافقم.
پس ساختار توابع شد:
Function Multiply(x : Integer, y : Integer) : Integer
Multiply = x * y
End Function
و تابع اصلی :
Function main() : Integer
Multiply = x * y
End Function
حالا میرسیم به تعریف متغیرها.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
می گم موافقی انواع متغیر هامون و کنترل نوعمون رو یه مقدارشو از زبان Ada الهام بگیریم؟ یا حتی زبان های دیگه.
زبان C که چیزی نداره!
اما در BASIC یه چیزی هست : String که پیاده سازیشو نمی دونم فعلا. البته پیاده سازی Char و آرایه ای از اون رو مثل زبان C می دونم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
مطالعه وبررسي زبانAda از 3 نقطه نظر:
1- Data : داده هاي Ada شکل توسعه يافته اي از انواع پاسکال هستند اما قدرت تعريف نوع جديد درآنها بيشتر است .
انواع داده هاي اوليه : شامل صحيح ، حقيقي، کاراکتري،بولي،رشتهايو اشاره گر
انواع ساختمان داده : بردارها ، آرايه ها و فايلها
انواع دادهاي کاربر ساز: رکورد ، زير نوع و ...
2- عملیات پایه ای (Primitive Operation :/ * mod rem + - abs not & = /= ، > ، >= ، < ،<= in - not in- And -Or- Xor- And then- Or Else)
3- Sequence Control: ترتيب انجام عمليات:
- در داخل عبارات جبري:عمليات با تقدم از چپ به راست انجام ميشود . Ada دراي عمليات مدار کوتاه (And then,OR Else) است به طوري که اگر ارزيابي اولين عملوند براي تعيين مقدار عبارت کافي باشد فقط اولين عملوند را ارزيابي ميکند – استثنا پرانتز است
- بين دستورات : ترتيب اجرا بدين ترتيب است که از آدرس پايين تر به آدرس بيشتر اجرا ميشود – استثنا ها – if case loop
- بين برنامه اصلي و فرعي استثنائ اين مورد پردازش موازي است.
www.atlasshabakeh.com/?m=articles&op=show&id=1315290760
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
فعلا که با پیاده سازی کاری نداریم.فعلا می خوایم ساختار نحوی تعریف متغییر و نام انواع مختلف داده ای رو در زبانمون مشخص کنیم.
bin: برای مقادیر باینری
oct: برای مفادیر مبنای هشت
dec: برای مقادیر دهدهی
hex: مبنای شانزده
integer: اعداد صحیح
sinteger: اعداد صحیح کوچک
binteger: اعداد صحیح خیلی بزرگ
float: اعداد ممیز شناور
bfloat: اعداد ممیز شناور بزرگ
chr: برای نوع کاراکتری
str: برای نوع رشته
برای تعریف متغیر از ساختار زیر استفاده کنیم:
variable i:integer
که از کلمه کلیدی variable استفاده میکنه
پیشنهاد من اینه که در اول برنامه یک قسمتی رو در نظر بگیریم که با یک کلمه کلیدی شروع بشه و در اون قسمت متغییرها و انواع جدید و انواع شمارشی و ...(البته اونهایی که قراره به شکل عمومی تعریف بشن) تعریف بشه. مثل:
define:
variable i:integer
variable b:str
end define
نظرت چیه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
عالی بود :تشویق:
فقط یه پیشنهاد اساسی: برنامه نویس متغیر ها رو در هر جا از برنامه که خواست تعریف کنه (البته در جاهای مجاز:لبخند:!) >>> جنبه ی راحتی داره.
حتی بعدا خودمون می تونیم متغیر های تعریف شده رو جمع آوری کنیم و بیاریم اول تعریف کنیم و ...
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
عالی بود :تشویق:
فقط یه پیشنهاد اساسی: برنامه نویس متغیر ها رو در هر جا از برنامه که خواست تعریف کنه (البته در جاهای مجاز:لبخند:!) >>> جنبه ی راحتی داره.
اون که صد در صد . من منظورم متغییرهای سراسری بود.
اما برای کتابخانه ها من یه نظر خوب دارم.هر کتابخانه با پسوند lib ذخیره بشه و به شکل زیر استفاده بشه:
"use "math.lib
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
یه پارامتر جدید می شه برای تعریف متغیر ها در نظر گرفت:
Variable x : Integer(2)
2 ای که داخل پرانتر هست تعداد بایت رو مشخص می کنه، و Integer هم که نوع ذخیره سازی در اون 2 بایت رو.
این طوری زبان انعطاف پذیر تره.
اما یه مسئله ای : آیا قابل پیاده سازی هست؟ مثلا 100 بایت متغیر (!) چه طوری می خواد تو 100 بایت دیگه ریخته بشه؟ در حالت عادی در زبان Assembly این کارو می کنیم:
MOV AX,Variable1
MOV Variable2,AX
که می آد اول Variable1 رو می ریزه تو AX بعد Variable2. ضمنا در این جا چون AX یه ثبات 16 بیتی هست، Variable1 و Variable2 هم همین طور اند. حالا مسئله این جاست ما Register های 100 بایتی نداریم! پس فکر می کنم این ایده ی جدید کارش یه کم وحشتناک باشه، فعلا این ایده رو بذاریم برای بعد...!
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
اون که صد در صد . من منظورم متغییرهای سراسری بود.
اما برای کتابخانه ها من یه نظر خوب دارم.هر کتابخانه با پسوند lib ذخیره بشه و به شکل زیر استفاده بشه:
"use "math.lib
موافقم.
ولی اگه خواستیم بعدا API تعریف کنیم، چی؟
این 2 تا رو با هم بررسی کنیم؟
چون این 2 تا خیلی به هم مربوط هستند.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
تعریف API باید ارتباط نزدیکی با تعریف توابع ها و زیربرنامه هامون داشته باشه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
پس فکر می کنم این ایده ی جدید کارش یه کم وحشتناک باشه، فعلا این ایده رو بذاریم برای بعد...!
موافقم.راستش وقتی هنوز آخر جملت رو نخونده بودم میخواستم برات بنویسم که یکم پیاده سازیش سخته. که دیگه خودت گفتی :قهقهه:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نمیدونم سرور این سایت فقط برای من اینقدر کند شده یا کلآ اینجوریه. اعصاب برام نذاشت.:عصبانی:
-
1 ضمیمه
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
سلام دوست عزیز،
ببخشید یه مدت نتونستم بیام.
تو این مدت سورس کد Libry رو خوندم، فهمیدم طرف چه جوری نوشته.
من هم به نظرم از توابعی که نوشته، استفاده کنیم.
این رو دانلود کن:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
یه مقداری کدش زیاده و حس خوندنش نیست. در ضمن فکر میکنم این توابع بیشتر به درد الگو گرفتن در عقب بندی میخوره. و من میخوام تمام تمرکز روی جلوبندی و تحلیلگرها باشه.
-
1 ضمیمه
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
خوب در مورد Syntax آخرین تغییرات رو رو این بده:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
قلب کد اون Libry Compiler، یه روال هست به نام CodeBlock که نکته ی جالبی که در کدش دیدم این بود که اول آخرین فاز کامپایلر رو فراخوانی می کرد، بعد آخرین فاز یه گذری به فاز های قبلی می زد و فاز های قبلی هم همین طور، نه این که بیاد از فاز اول تا آخر رو جدا و پشت سر هم اجرا کنه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
دوست عزیز , آسیاب به نوبت.آخه ساختار نحوی یه زبان جدید چیزی نیست که بشه تمامش رو یکجا مشخص کرد. من فکر میکنم همون روند که داشتیم طی میکردیم خوب بود.
یعنی تک تک , ساختارها رو مشخص کنیم و در آخر هم جمعبندی کنیم.
نقل قول:
نوشته شده توسط
IamOverlord
قلب کد اون Libry Compiler، یه روال هست به نام CodeBlock که نکته ی جالبی که در کدش دیدم این بود که اول آخرین فاز کامپایلر رو فراخوانی می کرد، بعد آخرین فاز یه گذری به فاز های قبلی می زد و فاز های قبلی هم همین طور، نه این که بیاد از فاز اول تا آخر رو جدا و پشت سر هم اجرا کنه.
اما در این مورد باید عرض کنم که تمام کامپایلرها به نوعی به این شکل عمل میکنند. یعنی مثلا تحلیلگر نحوی که در مرحله دوم قرار داره زودتر اجرا میشه و تحلیلگر لغوی که در مرحله اول قرار داره رو فراخوانی کرده و ازش درخواست لغت جدید میکنه. این طبیعیه و ربطی به ترتیب و جداسازی مراحل نداره.
من ساختارهایی که روش تا اینجا اتفاق نظر داشتیم رو جمع آوری میکنم و قرار میدم تا ساختارهای دیگه رو هم به ترتیب بهش اضافه کنیم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
اما در این مورد باید عرض کنم که تمام کامپایلرها به نوعی به این شکل عمل میکنند. یعنی مثلا تحلیلگر نحوی که در مرحله دوم قرار داره زودتر اجرا میشه و تحلیلگر لغوی که در مرحله اول قرار داره رو فراخوانی کرده و ازش درخواست لغت جدید میکنه. این طبیعیه و ربطی به ترتیب و جداسازی مراحل نداره.
خوب راستش من اینو تازه فهمیدم! تصوری در این رابطه نداشتم...
نقل قول:
دوست عزیز , آسیاب به نوبت.آخه ساختار نحوی یه زبان جدید چیزی نیست که بشه تمامش رو یکجا مشخص کرد. من فکر میکنم همون روند که داشتیم طی میکردیم خوب بود.
یعنی تک تک , ساختارها رو مشخص کنیم و در آخر هم جمعبندی کنیم.
عیب نداره می تونیم همون روند رو طی کنیم... الان در مورد اعلان متغیر ها و این جور مسائل باید صحبت کنیم دیگه؟
-
1 ضمیمه
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
اینم از ساختارهایی که قبلا در موردش بحث شد و تقریبآ به یک توافقی رسیدیم. البته اگه ایرادی میبینید
لطفآ بیان کنید.
ضمیمه 81466
با توجه به این که برنامه های کامپایل شده مبتنی بر کنسول هستند, فکر میکنم اولویت با دستورات ورودی خروجی زبان
یعنی ساختار دستوری خواندن و نوشتن از کنسول باشه.پس بهتره اول اونو مشخص کنیم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
خوب به نظرم بهتره دستورات ورودی و خروجی Console جزو دستورات پیش فرض زبان نباشند. یعنی درون ساخت نباشند. بلکه در کتاب خانه ای تعریف شوند از دستورات پایه ای تر.
دستورات پایه ای تر همون دستورات Assembly باشند، یعنی طرف به صورت Inline کد Assembly بنویسه.
پس به نظرم قبلش در این مورد صحبت کنیم که چه طور کد های Assembly اش رو بنویسه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
دستت درد نکنه دوست عزیز، تقریبا موافقم:
define:
variable a:bin
variable b:oct
variable c:dec
variable d:hex
variable e:integer
variable f:sinteger
variable g:binteger
variable h:float
variable i:bfloat
variable j:char
variable k:str
end define
1. به نظرم بهتر باشه متغیر ها هر جا که طرف خواست به طور پراکنده تعریف بشن. موافقی؟
2. در مورد مختصر نویسی :
مثل پاسکال از var استفاده بشه به جای variable، یا این که اگر هم مختصر نویسی نمی کنیم نوع متغیر ها رو هم مختصر نویسی نکنیم. مثلا این طوری:
variable a : binary
variable b : octal
variable c : decimal
variable d : hexadecimal
variable e : integer
variable f : sinteger
variable g : binteger
variable h : float
variable i : bfloat
variable j : character
variable k : string
3. ضمنا روش ذخیره سازی اعداد hexadecimal، decimal یا ... که با هم فرقی نداره. پس بهت نیست اینا همشون یه نوع باشن، اما کاربر موقع مقدار دهی متغیر ها به شکل دلخواه مقدار دهی کنه؟ ضمنا برای نمایششون هم در مبناهای مختلف می شه توابع و زیربرنامه هایی در نظر گرفت.
یعنی مثلا طرف بنویسه :
variable e : integer
و موقع مقداردهی بتونه از هر کدوم اینا که دلش خواست استفاده کنه:
i = 344
i = 123456789ABCDEFh
i = 0x11011001
یا حالا هر جور دیگه ای که به نظرت می آد...
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
با استفاده از دستورات اسمبلی موافقم. ولی در نهایت که باید یک دستور ساده برای ورودی خروجی داشته باشیم.چه به شکل مستقیم یا به شکل کتابخانه ای.
پیشنهاد من برای دستورات inline :
instraction:
mov ax,bx
sti
mov ss,ax
end instruction
-
1 ضمیمه
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
برای کار با Console فکر می کنم این توابع API کافی باشه:
Private Declare Function AllocConsole Lib "kernel32" () As Long
Private Declare Function FreeConsole Lib "kernel32" () As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
Private Declare Function WriteConsole Lib "kernel32" Alias "WriteConsoleA" (ByVal hConsoleOutput As Long, lpBuffer As Any, ByVal nNumberOfCharsToWrite As Long, lpNumberOfCharsWritten As Long, lpReserved As Any) As Long
Private Declare Function ReadConsole Lib "kernel32" Alias "ReadConsoleA" (ByVal hConsoleInput As Long, ByVal lpBuffer As String, ByVal nNumberOfCharsToRead As Long, lpNumberOfCharsRead As Long, lpReserved As Any) As Long
Private Declare Function SetConsoleTextAttribute Lib "kernel32" (ByVal hConsoleOutput As Long, ByVal wAttributes As Long) As Long
Private Declare Function SetConsoleTitle Lib "kernel32" Alias "SetConsoleTitleA" (ByVal lpConsoleTitle As String) As Long
Private Declare Function GetConsoleTitle Lib "kernel32" Alias "GetConsoleTitleA" (ByVal lpConsoleTitle As String, ByVal nSize As Long) As Long
Private Declare Function GetConsoleWindow Lib "kernel32" () As Long
Private Declare Function GetConsoleCursorInfo Lib "kernel32" (ByVal hConsoleOutput As Long, lpConsoleCursorInfo As CONSOLE_CURSOR_INFO) As Long
Private Declare Function SetConsoleCursorInfo Lib "kernel32" (ByVal hConsoleOutput As Long, lpConsoleCursorInfo As CONSOLE_CURSOR_INFO) As Long
Private Declare Function GetConsoleMode Lib "kernel32" (ByVal hConsoleHandle As Long, lpMode As Long) As Long
Private Declare Function SetConsoleMode Lib "kernel32" (ByVal hConsoleHandle As Long, ByVal dwMode As Long) As Long
Private Declare Function WriteConsoleOutputCharacter Lib "kernel32" Alias "WriteConsoleOutputCharacterA" (ByVal hConsoleOutput As Long, ByVal lpCharacter As String, ByVal nLength As Long, ByVal dwWriteCoord As Long, lpNumberOfCharsWritten As Long) As Long
Private Declare Function GetConsoleScreenBufferInfo Lib "kernel32" (ByVal hConsoleOutput As Long, lpConsoleScreenBufferInfo As CONSOLE_SCREEN_BUFFER_INFO) As Long
Private Declare Function SetConsoleCursorPosition Lib "kernel32" (ByVal hConsoleOutput As Long, ByVal dwCursorPosition As Long) As Long
Private Declare Function FillConsoleOutputCharacter Lib "kernel32" Alias "FillConsoleOutputCharacterA" (ByVal hConsoleOutput As Long, ByVal cCharacter As Byte, ByVal nLength As Long, dwWriteCoord As Long, lpNumberOfCharsWritten As Long) As Long
Private Declare Function SetConsoleCtrlHandler Lib "kernel32" (ByVal HandlerRoutine As Long, ByVal Add As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
نمونه ی کارشون اینه:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
با استفاده از دستورات اسمبلی موافقم. ولی در نهایت که باید یک دستور ساده برای ورودی خروجی داشته باشیم.چه به شکل مستقیم یا به شکل کتابخانه ای.
پیشنهاد من برای دستورات inline :
instraction:
mov ax,bx
sti
mov ss,ax
end instruction
یه فکری می گم بیایم شبیه Pure BASIC دستورات Assembly رو بدون تعریف Block و سه سوته قابل استفاده کنیم؟ یعنی کاملا مستقیم و بدون استفاده از Instruction.
در مورد دستورات ورودی و خروجی هم 2 حالت داره:
1. می تونه توابع API که گفتم رو تعریف کنه و یا از کتابخانه هایی که این توابع توشون تعریف شده استفاده کنه.
2. اگه توانایی استفاده از Interrupt ها رو توسط دستورات Assembly داره، می تونه این کارو بکنه یا از کتاب خانه هایی که از قبل از این دستورات در زیربرنامه ها و توابعشون استفاده کردن، استفاده کنه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
1. به نظرم بهتر باشه متغیر ها هر جا که طرف خواست به طور پراکنده تعریف بشن. موافقی؟
قبلا گفتم که کاربر میتونه در هر تابعی متغیر تعریف کنه و این ساختار define که در ابتدای برنامه هست فقط برای تعریف متغیرها و ساختارهایی هست که به شکل سراسری به کار برده میشن.
نقل قول:
نوشته شده توسط
IamOverlord
2. در مورد مختصر نویسی :
مثل پاسکال از var استفاده بشه به جای variable، یا این که اگر هم مختصر نویسی نمی کنیم نوع متغیر ها رو هم مختصر نویسی نکنیم.
خودم هم var رو بهتر میدونم ولی همونطور که گفتید خیلی شبیه پاسکال میشد. درمورد کامل نوشتن انواع هم ربطی نمی بینم و فقط اوضاع رو بدتر میکنه.
به غیر از var و variable کلمه دیگه ای به ذهنتون نمیرسه که هم کوتاه باشه هم مناسب؟:متفکر:
درباره مورد سوم هم باید بگم که میتونیم فعلا از این انواع صرف نظر کنیم و اونا رو یک نوع در نظر بگیریم تا شاید بعدآ بهشون فکر کنیم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
مثلا فرض کن توانایی استفاده از توابع API رو داره؛ می تونه یه Library تعریف کنه و مثلا اینا رو توش بنویسه:
Import Function "WriteConsoleA" From "KERNEL32.DLL" As WriteConsole (ByVal hConsoleOutput : Long, lpBuffer : Any, ByVal nNumberOfCharsToWrite : Long, lpNumberOfCharsWritten : Long, lpReserved : Any) : Boolean
Function WriteString(sWhat : String) : Long
WriteConsole hConsoleOut, ...
End Function
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
شاید بخواد یه سری از متغیر ها Global تعریف بشن و از بیرون هم قابل دسترسی باشن، یا یه سری Private تعریف بشن و فقط از داخل (نه داخل یه روال خاص، داخل همه ی روال ها) قابل فراخوانی باشن. نظر شما چیه که این کارو کنیم:
Public MainProgramTitle : String = "First Project"
Private WebsiteAddress : String = "www.barnamenevis.org"
Function Main() : Integer
End Function
این ساختار تعاریف رو بررسی کنید:
' Variable Declaration:
MainProgramTitle : String = "First Project"
Private WebsiteAddress : String = "www.barnamenevis.org"
' Object Declaration:
Object Apple : Fruit
Public Object Orange : Fruit
' Win API Declaration
Import Function “DeleteDC” From “GDI32.DLL” As DelDC (ByVal hdc : Long) : Long
هم کوتاهه هم همه چیو می تونه مشخص کنه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
راستش یه خورده از حرفات در مورد api گیج شدم ولی فقط اینو بگم که اگه منظورت متکی بودن به api ویندوزه باید بگم اصلا کار منطقی ای نیست.
ببین مثلا زبان سی رو در نظر بگیر. به نظر من یکی از کاملترین کامپایلرهای این زبان gcc هست که اصولا برای لینوکس توسعه داده شده.
یکی از راههای متداول کار با ورودی خروجی به این شکل هست که ما اول میایم یه فایل سرایند <stdio.h> رو در برنامه معرفی میکنیم و
در برنامه میتونیم از دستورات printf و scanf برای ورودی خروجی استفاده کنیم . نظر من اینه که استفاده کلی از چنین ساختاری منطقی تر به نظر میرسه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نه ما متکی به API ویندوز نیستیم، یا به Interrupt خاص یا هر چیز دیگه ای.
هر سیستمی API ها و Interrupt های خاص خودشو داره. ما یه تابع می نویسیم برای سیستم های مختلف که اگه Windows بود از فلان چیز استفاده کنه، اگه Linux بود از یه چیز دیگه... .
یعنی این که نهایتا از چه چیزی استفاده شه به عهده ی کامپایلر هست بر اساس درخواست کاربر.
حتی زبان ++C هم همین کارو می کنه.
یعنی تو یه کد می نویسی و از توابع یکسانی استفاده می کنی، در صورتی که خروجی ها بر اساس کامپایلر ها در محیط های مختلف متفاوت هست.
اگه می خوایم مثل ++C کار کنیم، پس باید یه روشی بذاریم که برنامه نویس اون روال، به کامپایلر بگه اگه برای این سیستم کامپایل می کنی این کد رو بزن، برای اون سیستم اون یکی کد رو بزن... مثل # در ++C که فقط با کامپایلر صحبت می کنه. مثلا فرض کن این طوری:
#if system = DOS
{
...
int 21h
}
elseif system = Windows
{
...
WriteConsole ...
}
else
{
...
}
که این if ها در زمان اجرا، اجرا نمی شن و در زمان Compile پردازششون به عهده ی Pre-Processor هست.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ببین من فکر میکنم که فعلآ نباید بحث استفاده از توابع API مربوط به OS رو به میان میاوردی. ما باید یک ساختاری درست کنیم که برنامه نویس بتونه
با ورودی خروجی (که شامل فایل هم میشه) کار کنه و لزومی نداره که کاربر در برنامه از توابع os استفاده کنه. به نظر من بهترین کار اینه که ما
مثل سی تعریف توابع یا حتی فقط مشخصات توابع ورودی خروجی رو در یک فایل سرایند یا کتابخانه ذخیره کنیم و کاربر بتونه با به کار بردن این فایل
از توابع ورودی خروجی استفاده کنه و این که در نهایت اجرای دستورات ورودی خروجی به چه شکل باشه بستگی به کامپایلر ما و کد ماشینی که در عقب بندی تولید میشه داره
و لزومی نداره کاربر از اون مطلع باشه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
در ضمن به نظر من بهتر بود اول یه زبان پایه رو با دستورات اصلی بنا میزاشتیم و اگر تونستیم اون رو به اتمام برسونیم
یعنی تحلیلگر نحوی و معنایی و دیگر مراحل کامپایلر رو که میتونه خیلی دشوار باشه رو پیاده کنیم, اونوقت میتونستیم به فکر
توسعه زبان باشیم (تعریف نوع , استفاده از API , سرایند, کتابخانه,شی گرایی , برنامه نویسی گرافیکی ووووو......). چون اکثر زبانها هم یک چنین مسیری رو طی کردند.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
ببین من فکر میکنم که فعلآ نباید بحث استفاده از توابع API مربوط به OS رو به میان میاوردی. ما باید یک ساختاری درست کنیم که برنامه نویس بتونه
با ورودی خروجی (که شامل فایل هم میشه) کار کنه و لزومی نداره که کاربر در برنامه از توابع os استفاده کنه. به نظر من بهترین کار اینه که ما
مثل سی تعریف توابع یا حتی فقط مشخصات توابع ورودی خروجی رو در یک فایل سرایند یا کتابخانه ذخیره کنیم و کاربر بتونه با به کار بردن این فایل
از توابع ورودی خروجی استفاده کنه و این که در نهایت اجرای دستورات ورودی خروجی به چه شکل باشه بستگی به کامپایلر ما و کد ماشینی که در عقب بندی تولید میشه داره
و لزومی نداره کاربر از اون مطلع باشه.
خوب شما فرض کن ما بحث توابع و ...، رو از برنامه نویس بپوشونیم. حالا قراره این چیزا رو داخل یه فایل سرآیند قرار بدیم. اون فایل هم توابع و روال هایی داره که با زبان برنامه نویسی خودمون ساخته شدن. اون ها باید با چی ساخته می شدن؟ یعنی پایه ای ترین دستورات برای ساخت دستورات سطح بالاتر (کار با فایل و ورودی و خروجی متن و ...) چیان؟ مسلما دستورات Assembly هستن. زبان C رو هم اگه بدون فایل های سرآیندش در نظر بگیری، باز هم قابل استفادس، چون خود فایل های سرآیندش در نهایت با دستورات پایه ای تری نوشته شدن، که شما می تونی اونا رو داخل برنامه ی خودتم بنویسی. منم می گم این کارو کنیم. یعنی در ابتدا هیچ دستور خاصی برای زبان قرار ندیم (برعکس BASIC)، بلکه این قابلیت رو به برنامه نویس (کسی که فایل های سرآیند رو می نویسه یا هر کس دیگه ای) بدیم که این دستورات (نوشتن و خواندن و ...) رو بنویسه، با دستورات پایه ای تر زبان (مثل زبان C).
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
به نظر من ملزومات یک زبان برنامه نویسی تحت کنسول اینها هستند:
۱- ساختار تعریف متغیر
۲- ساختار تعریف توابع
۳- ساختار نحوی عملگرها و دستورات محاسباتی
۴- ساختارهای شرطی
۵- ساختار حلقه و تکرار
و البته دستورات ورودی خروجی
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
amin32
در ضمن به نظر من بهتر بود اول یه زبان پایه رو با دستورات اصلی بنا میزاشتیم و اگر تونستیم اون رو به اتمام برسونیم
یعنی تحلیلگر نحوی و معنایی و دیگر مراحل کامپایلر رو که میتونه خیلی دشوار باشه رو پیاده کنیم, اونوقت میتونستیم به فکر
توسعه زبان باشیم (تعریف نوع , استفاده از API , سرایند, کتابخانه,شی گرایی , برنامه نویسی گرافیکی ووووو......). چون اکثر زبانها هم یک چنین مسیری رو طی کردند.
قبول دارم که زبان ها اول اصلشون ساخته شده بعد توسعه پیدا کردن و مثلا فایل های سرآیند براشون نوشته شده. ولی این ساده تره که ما هیچ دستوری رو ننویسیم به طور پیش فرض، بلکه کاربر (مثلا موقع توسعه) خودش بیاد اون دستورات جورواجور رو تولید کنه. فقط کافیه مثل زبان C اجازه بدیم که کد Assembly بزنه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
و البته دستورات ورودی خروجی
به جای این گزینه می شد گفت دستورات پایه.
با دستورات پایه ای Assembly می شه دستورات ورودی و خروجی رو پیاده سازی کرد.
دیگه این بستگی به سلیقه ی ما داره که دستورات پایه ای مون چیا باشن...
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
قبول دارم که زبان ها اول اصلشون ساخته شده بعد توسعه پیدا کردن و مثلا فایل های سرآیند براشون نوشته شده. ولی این ساده تره که ما هیچ دستوری رو ننویسیم به طور پیش فرض، بلکه کاربر (مثلا موقع توسعه) خودش بیاد اون دستورات جورواجور رو تولید کنه. فقط کافیه مثل زبان C اجازه بدیم که کد Assembly بزنه.
من که هر چقدر توی فایلهای سرایند پر استفاده زبان سی گشتم دستور اسمبلی ندیدم و بیشتر تعریف مشخصات توابع. البته مطمعن نیستم.
ولی فکر میکنم بیشتر دستورات اسمبلی در مواقعی به کار میاد که نشه از دستورات زبان استفاده کرد. مثل وقتی که بحث ساخت کرنل به میان میاد. باید بیشتر تحقیق کرد.
وای برم که بازی تیمم شروع شد. انشاالله که این دفعه رو میبریم....:تشویق:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
در پوشه ی Include خوب بگردی پیدا می کنی.
البته چون اکثرشون به هم دیگه پاس می دن (کدوم تیم؟ :لبخند:) کم تر دستورات Assembly می بینی. ولی برای نمونه، آخر این header file رو نگاه کن:
// --aclcls.h------------------------------------------------------------------
//
// Interface to library: aclcls.
//
// Copyright 1986 - 1998 Microsoft Corporation. All rights reserved.
//
// ----------------------------------------------------------------------------
#if !defined(_ACLCLS_H_)
#define _ACLCLS_H_
// $$--IExchangeFolderACLs-----------------------------------------------------
//
// Definition of interface for folder ACLs class CFolderACLs.
//
// ----------------------------------------------------------------------------
#undef INTERFACE
#define INTERFACE IExchangeFolderACLs
// Manifest for cursor position indicating we are at the end of the ACLs table.
#define ACL_PAST_END ((LONG) -1)
// Special ACL positions. The special ACL's at these position may not be
// deleted, and there are also special rules (coming from Exchange) with
// regard to how rights will be modified. Also, other ACL's may not be inserted
// at these positions.
#define ACL_POS_DEFAULT ((LONG) 0)
#define ACL_POS_CREATOR ((LONG) 1)
DECLARE_INTERFACE_(IExchangeFolderACLs, IUnknown)
{
#ifndef NO_BASEINTERFACE_FUNCS
/* IUnknown methods */
STDMETHOD(QueryInterface)(
THIS_
REFIID riid,
LPVOID FAR * ppvObj
) PURE;
STDMETHOD_(ULONG, AddRef)(
THIS
) PURE;
STDMETHOD_(ULONG, Release)(
THIS
) PURE;
#endif
/* IExchangeFolderACLs methods */
STDMETHOD(HrDelete)(
THIS
) PURE;
STDMETHOD(HrGet)(
THIS_
LPLONG lplRights,
LPSTR FAR * lppszDisplayName,
ULONG FAR * lpcbentryid,
LPENTRYID FAR * lppentryid
) PURE;
STDMETHOD(HrInsert)(
THIS_
LONG lRights,
LPSTR lpszDisplayName,
ULONG cbentryid,
LPENTRYID lpentryid,
LPLONG lplRights
) PURE;
STDMETHOD(HrModify)(
THIS_
LONG lRights,
LPLONG lplRights
) PURE;
STDMETHOD(HrSeek)(
THIS_
LONG lPos
) PURE;
STDMETHOD(HrTell)(
THIS_
LPLONG lplPos
) PURE;
};
// $$--LPFOLDERACLS------------------------------------------------------------
//
// Pointer to IExchangeFolderACLs interface.
//
// ----------------------------------------------------------------------------
typedef IExchangeFolderACLs FAR * LPFOLDERACLS;
//
// Helper functions defined in module ACLCLS.
//
// $--HrFolderACLsOpen---------------------------------------------------------
//
// DESCRIPTION: Get a pointer to an object which implements the
// IExchangeFolderACLs interface defined in aclcls.h.
//
// INPUT:
//
// [lpSession] -- Pointer to MAPI session.
// [lpMDB] -- Pointer to message store containing folder.
// [cbentryid] -- Number of bytes in folder's entry identifier.
// [lpentryid] -- Folder's entry identifier.
//
// OUTPUT:
//
// [lppFolderACLs] -- Pointer to object which supports interface.
// NULL if none.
//
// RETURNS: NOERROR if successful;
// E_INVALIDARG if bad input;
// E_OUTOFMEMORY if not enough memory;
// E_NOINTERFACE if acl table does not exist on folder;
// E_FAIL otherwise.
//
//-----------------------------------------------------------------------------
STDAPI
HrFolderACLsOpen( // RETURNS: HRESULT
IN LPMAPISESSION lpSession, // MAPI session pointer
IN LPMDB lpMDB, // MAPI MDB store ptr
IN ULONG cbentryid, // # bytes in entry ID
IN LPENTRYID lpentryid, // entry ID ptr
OUT LPFOLDERACLS FAR * lppFolderACLs // IExchangeFolderACLs ptr ptr
);
#endif
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
۱- ساختار تعریف متغیر
۲- ساختار تعریف توابع
۳- ساختار نحوی عملگرها و دستورات محاسباتی
۴- ساختارهای شرطی
۵- ساختار حلقه و تکرار
1 و 2 رو تا یه حدودایی مشخص کردیم.
در مورد 3،
مثلا اینو ببین:
f : Boolean
a : Integer = 13
b : Integer = 33
f = (a = b)? ' = true
f = Not (a > b)? ' = not false =true
f = (a < b and b = a)? ' = false
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
فکر کنم دیگه باختیم...:گریه::گریه::گریه:
نقل قول:
نوشته شده توسط
IamOverlord
1 و 2 رو تا یه حدودایی مشخص کردیم.
در مورد 3،
مثلا اینو ببین:
f : Boolean
a : Integer = 13
b : Integer = 33
f = (a = b)? ' = true
f = Not (a > b)? ' = not false =true
f = (a < b and b = a)? ' = false
خب در مورد عملگرها و دستورات هم قبلآ تا حدودی صحبت شد.
اما در مورد دستورات شرطی نظرم اینه:
if (i>10):
i=i+1
end if
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
بیش تر Symbol ها هستن که تو ++C دست و پا گیرن، به نظرم ساختار if زبان BASIC یکی از بهترین ساختار ها هست. (ببخشید این قدر مخالفت می کنما ولی... دیگه دیگه...)
' Simple If Structure
If Statement Then Beep()
' Complete If Structure
If Statement1 Then
ElseIf Statement2 Then
ElseIf Statement3 Then
Else
End If
حالا می تونیم اینو کامل ترش کنیم البته اگه بشه.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نه پشیمون شدم! به خاطر یکپارچگی با ?(...) ، بهتره از If (...) Then استفاده کنیم نه If ... Then.
نقل قول:
نوشته شده توسط
amin32
فکر کنم دیگه باختیم...:گریه::گریه::گریه:
من فکر کردم پروژه رو می گی...! :لبخند:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
بیش تر Symbol ها هستن که تو ++C دست و پا گیرن، به نظرم ساختار if زبان BASIC یکی از بهترین ساختار ها هست. (ببخشید این قدر مخالفت می کنما ولی... دیگه دیگه...)
' Simple If Structure
If Statement Then Beep()
' Complete If Structure
If Statement1 Then
ElseIf Statement2 Then
ElseIf Statement3 Then
Else
End If
حالا می تونیم اینو کامل ترش کنیم البته اگه بشه.
این یکم زیادی شبیه خود بیسیک نشده؟ اگه دقت کنی پیشنهاد منم تقریبآ همین بود با این تفاوت که بجای then از ':' استفاده کنیم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
من تا جایی که دیدم زبان های دیگه ای هم هستن که ساختارشون مثل اینه (این قدر ساختار توپیه!)؛
مثلا این جا رو حتما ببین برای Ada هست.
این جا هم برای Fortran هست.
تازه، می ریم جلو زبان ساخته می شه انشاا... ، بعد بر می گردیم دوباره یه تغییرات جزئی روی Syntax می دیم و اگه ایده ی جدید و بهتری داشتیم پیاده می کنیم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
من تا جایی که دیدم زبان های دیگه ای هم هستن که ساختارشون مثل اینه (این قدر ساختار توپیه!)؛
مثلا
این جا رو حتما ببین برای Ada هست.
این جا هم برای Fortran هست.
تازه، می ریم جلو زبان ساخته می شه انشاا... ، بعد بر می گردیم دوباره یه تغییرات جزئی روی Syntax می دیم و اگه ایده ی جدید و بهتری داشتیم پیاده می کنیم.
من فقط نظرم این بود که به جای then از یه لغت یا علامت دیگه استفاده بشه. ولی اشکالی نداره اگه اینطوری می خوای با همین پیش میریم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ساختار های غیر از if چی؟
اگه بشه یه جوری همشون رو یکپارچه و منظم کرد خیلی خوب می شه... :متفکر:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
به خودم امیدوار شدم.فکر میکردم فقط من اینقدر بیخوابم.:قهقهه:
خب تا منظورت از یکپارچگی چی باشه؟
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ساختار Select Case چه طور باشه؟ :متفکر:
' halqeye bi nahayat:
Do
Loop
' sakhtare while
While (...) Do
Loop
' sakhtare until
Until (...) Do
Loop
' sakhtare for e sade
For i : 1 To 10 Do
Loop
' sakhtare for ba step
For i : 10 To 1 Step -1 Do
Loop
' sakhtare select
Select ...
Case ...
Case ...
Case Else
End Select
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
منظورم از یکپارچگی همون ساختار Do Loop پست بالا هست. اگه دقت کنی ساختار های For، While و Until کامل شده ی Do Loop هستند.
یه سوالی: می تونیم در زبانمون یه مفهومی به نام مجموعه تعریف کنیم و For رو به اون ربط بدیم؟ (برای یکپارچگی بیشتر! :لبخند::قهقهه:)