-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
ایده های من
دستورات با \ یا - از هم جدا بشن.
جایگزینی و انتساب:
a:b
ولی برای تست تساوی در دستورات شرطی از = استفاده بشه.
+
-
*
/
اما برای توان و باقیمانده از یک کلمه کلیدی استفاده بشه.
یک تابع main داشته باشیم
از < و > برای بلاک بندی توابع استفاده کنیم.
فعلآ همین. اگه نظری داری بگو.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
خوب با main موافقم، چون می شه از طریق خط فرمان به برنامه آرگومان ارسال کرد.
2 تا چیز در زبان C هست که گاهی اذیت می کنند: ; {}
راحت تره که برای پایان دستوارت از ; استفاده نکنیم. اما اگه خواستیم چند تا دستور رو تو یه خط بنویسیم ; بذاریم. چون مفهوم مرتبطی داره. وقتی یه جمله ای می نویسیم که با جمله ی بعدی مرتبطه از ; استفاده می کنیم، در برنامه نویسی هم خطوط برنامه با هم مرتبط هستند پس فکر کنم بهتر باشه از ; استفاده کنیم برای نوشتن چند خط کد در یک خط.
برای تست تساوی موافقم از = استفاده کنیم نه مثلا ==.
چون اول ها که برنامه نویسی یاد گرفته بودم، 2 معنی متفاوت = در شرط ها و انتساب ها برام نا آشنا بود.
یه ویرایش کوچولو می کنم ببینم موافقی:
=: برای تساوی (گذاشتن ':' از لحاظ مفهومی واقعا مناسبه)
به جای mod (مثل BASIC)، % (مثل C) بذاریم بهتر نیست؟
برای توان چی؟
از ^ که در BASIC هست استفاده کنیم
یا تابع بسازیم : ()pow
یا ... ؟
< و > برای بلاک بندی توابع ریاضی یا اجرایی؟
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
جدا کردن دستورات بر اساس خط به خط و بدون علامت هماهنگ کننده ( ; یا \ یا هر چیزی ) رو میشه تا حدودی حل کرد. ولی به هر حال نمیشه از بلاک بندی گذشت. چون اکثر زبانهای معروف
حتی ویژوال بیسیک هم به نحوی این کار رو انجام میدن (sub .... end sub). ایدت در مورد استفاده از علامت ; فقط برای جدا کردن دستورات در یک خط هم جالبه اما بهتره از یه علامت دیگه
استفاده کنیم که شبیه زبانهای دیگه نشه. مثل \ یا |
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
البته منظورم از بلاک بندی , بلاک بندی تمام توابع هست (مثل {} در C)
برای توان هم بهتره تابع بسازیم و از تابع به عنوان کلمه کلیدی استفاده کنیم.
نقل قول:
نوشته شده توسط
IamOverlord
یه ویرایش کوچولو می کنم ببینم موافقی:
=: برای تساوی (گذاشتن ':' از لحاظ مفهومی واقعا مناسبه)
متوجه نشدم بالاخره برای انتساب از ':' استفاده کنیم یا از =:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
از =: استفاده کنیم. چون : مفهموم توضیح در مورد یه چیزی رو می ده (یه ایده در این مورد همین الان به ذهنم رسید)، و = مشخص می کنه که توضیح ما در مورد برابر شدن هست.
این ساختار رو نگاه کن:
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.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
این چطوره؟
<main:
a:=c+j
k:=f-t
>
<sampleFunction:
m:=6+4
>
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
سلام دوست عزیز، ببخشید یه مدت نتونستم بیام.
در مورد sampleFunction اگه می شه یه توضیحی بدید. مثلا آرگومان های ارسالی، تعیین نوع خروجی، ... .
قسمت main و Function شبیه هم نوشته می شن، خوبه یک پارچه تر می شه.
اما تفاوت این دو و ویژگی هاشون چه طور مشخص می شه؟
-
1 ضمیمه
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
این Syntax رو ببین، ویرایش کن، دوباره بذار:
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
نقل قول:
نوشته شده توسط
IamOverlord
این Syntax رو ببین، ویرایش کن، دوباره بذار:
این ساختار خوب بود . اما فکر میکنم به دلیل اهمیت ساختار زبان بهتر باشه مرحله به مرحله پیش بریم. یعنی هر دفعه روی یک ساختار (تعریف توابع , حلقه , تعریف متغییر و ...) تمرکز کنیم و وقتی در مورد اون ساختار به توافق رسیدیم , به ساختار بعدی بپردازیم.
به خاطر اهمیت ساختار توابع و مخصوصآ تابع اصلی برنامه بهتره با اون شروع کنیم.
Function Multiply(x : Integer, y : Integer) : Integer
Multiply = x * y
End Function
من با این ساختار تا حدودی موافقم ولی به نظرتون یکم شبیه پاسکال ( پارامترهای ورودی) و vb ( عبارت end function) نشده؟ اگه یکم تغییرش بدیم بهتر میشه.
در ضمن برای تابع اصلی برنامه هم میتونیم از همین ساختار استفاده کنیم.
-
نقل قول: ساخت Compiler و یک زبان برنامه نویسی جدید
بله ولی سعی کردم هم راحت نوشته بشه، هم راحت خونده بشه، و ...
ضمنا می شه پیچیده تر و بهترش کرد؛ طی این مراحل خود به خود زبانمون بی شباهت به زبان خاضی می شه.
اول در مورد تعریف متغیر بگید، اون : ها رو برای آرگومان های تابع واسه این گذاشتم که فرض کردم تعریف متغیر این طوری هست:
i : Integer
text1 : String
v : Vector
-
نقل قول: ساخت 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 برای ورودی خروجی استفاده کنیم . نظر من اینه که استفاده کلی از چنین ساختاری منطقی تر به نظر میرسه.