View Full Version : گفتگو: Z Script Engine
Hr.Ziggurat
سه شنبه 18 مرداد 1390, 10:30 صبح
قبل از همه چیز عذرمیخوام اگه جای این مطلب اینجا نبود.این پروژه یه Script Engine واسه ی موتور بازیه که الان دارم روش کار میکنم. ایشالا اگه بتونم کاملش کنم چیز خیلی تمیزی در میاد. این پروژه رو با VC++ دارم مینویسم. یکی از هدفام اینه که خیلی سریع باشه و کد نویسی به این زبون خیلی راحت باشه. زبون این موتور کد با استخون بندییه c هستش ولی سعی کردم از اون ساده تر باشه و اسم این زبونو گذاشتم Z!
واسه ی سریع بودنش بعضی از تابع ها رو با اسمبلی نوشتم و میخوام این کارو ادامه بدم. تا این جای کار به این ویژگی ها واسه ی موتورم رسیدم ، اگه نظر خاصی واسه ی هر بخش دارید ، دمتون گرم ، کمک کنید:
تا اینجای کار موتور کد دونوع متغییر رو میشناسه ، یکی به نام string که برای رشته هاست و یکی number که برای ذخیره سازی اعداد به کار میره. با خودم فکر کردم و به این نتیجه رسیدم که واسه ی اعداد به جای چند نوع متغییر (مثل char و short و int و...) ، فقط یک نوع وجود داشته باشه ، کد نویسی راحت تره. با توجه به اینکه number معادل double تو c هستش (یه متغییر 8 بایتی) خیلی کامله و همچنین قرار نیست باهاش کد خیلی سنگینی نوشته بشه که خیلی ram اشغال بشه. اگه مخالفید ممنون میشم بگید.
البته قراره آینده چند نوع متغییر دیگه برای بردارهای 2بعدی و 3بعدی و ماتریسها تعریف بشه.
فعلا حلقه های تکرار while و for رو به صورت ساده و تودرتو میشناسه.البته با شرط های ساده(بدون && و || و !).
سعی کردم بیشتر تابع هایه پر کاربرد به صورت پیش تعریف شناخته شده باشند. به زودی امکان تعریف تابع جدید از طریق کد نویسی به همین زبون و همچنین ضمیمه کردن تابع به موتور قبل اجرای کد ایجاد میشه.
ممنون میشم اگه نظرتونو در موردش بگید.
73531 73532 73533
SeganX
چهارشنبه 19 مرداد 1390, 13:51 عصر
اگه میشه در مورد lexer و parser موتورت هم یه توضیحی بده و اینکه چطوری می شه توابع c رو از تو script صدا کرد؟ مرسی
Hr.Ziggurat
جمعه 21 مرداد 1390, 11:33 صبح
اگه میشه در مورد lexer و parser موتورت هم یه توضیحی بده و اینکه چطوری می شه توابع c رو از تو script صدا کرد؟ مرسی
دستورها به ترتیب اجرا میشند و بسته به نوع اون دستور ، متغییر هایی که نامشون توی اون دستور به کار رفته ، مقدارشون جایگزین نامشون میشه.
(مثلا برای "تغییر مقدار یک متغییر" که طرف چپ نام اون متغییره ، برای طرف راست این اتفاق میفته مثل ((i=sin(j*(4-3 ).این کارو تابع ای به نام VarablesValueReplace انجام میده.
برای بدست اوردن نتیجه ی یه رشته از عملوند ها و عملگرها و توابع کد، تابع ای به نام FunctionSurvey نوشتم که تو خروجیش هم نوع خروجی داده رو تعیین میکنه ، هم مقدار خروجی (که میتونه رشته یا عدد باشه). این تابع اولین کاری که میکنه بر اساس لیستی که مشخصات توابع کد ( نام ، نوع ، تعداد و نوع ورودی ها) توش ذخیره شده ، به دنبال این توابع می گرده و ورودیهاش رو جدا میکنه و بر اساس اون ورودی ها نتیجه رو حساب میکنه . (بر اساس اندیس لیستی که توش جستجو کرد ، میفهمه چه تابع ایه و مقدارش رو حساب میکنه. البته دارم رو این کار میکنم که از اشاره گر توابع استفاده کنم اینجوری برای هر تابع کد باید یه تابع تویه سورس برنامم بنویسم، این روش خیلی بهتره).بعد مقدار خروجی تابع رو جایگزین نام و ورودی های اون تابع میکنه.
(sin(90)+1 => 1+1) این کار تا جایی ادامه پیدا میکنه که دیگه هیچ تابع ای تویه این رشته وجود نداشته باشه.(برای حل توابع تودرتو sin(cos(sin(1)))l ) .حالا بر اساس نوع داده یکی از توابع StringCalculator (برای داده هایه از نوع رشته) یا NumberCalculator (برای داده هایه از نوع عدد) فراخوانی میشه. به این ترتیب مقدار خروجی بدست میاد.
73690
نحوه parser کردن یه رشته ی محاسباتی عددی:
برای بدست اوردن نتیجه ی یه رشته ی محاسباتی یه تابع به نام NumberCalculator نوشتم که یه رشته ورودیشه. تو این تابع اول روی رشته ی ورودی اندیس شروع و پایان پرانتزی که اولین و داخلی ترینه پیدا میشه. بعد این قسمت رشته ی ورودی جدا میشه. به این ترتیب این قسمت هیچ پرانتزی نداره و یه عبارت محاسباتیه سادهست.
حالا این قسمت رشته ی ورودی ، به یه تابع به نام Calculate فرستاده میشه و این تابع مقدار نتیجه رو به صورت رشته برمی گردونه. این نتیجه تویه رشته ی اصلی جایگزین اون قسمت پرانتز مورد بررسی میشه . بعد دوباره تابع NumberCalculator با این رشته ی جدید فراخوانی میشه. این کار تا اونجایی ادامه پیدا میکنه که دیگه پرانتزی تو رشته وجود داشته نباشه.
در نتیجه این رشته یه رشته ی محاسباتیه ساده و بدونه پرانتزه. در پایان دوباره این رشته به تابع Calculate فرستاده میشه و جواب پایانی بدست میاد.مثل:
73691
تابع Calculate از رشته ی ورودیش بر اساس اولویت های عملگرها یه درخت درست میکنه و با پیمایش اون جواب رو بدست میاره.
pswin.pooya
شنبه 22 مرداد 1390, 09:34 صبح
ظاهرا متوجه سوال سجاد نشدی. منظور سجاد این بود که برای lexer و paeser از نرم افزارهای آماده یا generatorها استفاده کردی یا خودت نوشتی و نوع پارسرت چیه؟
و اینکه اگر تابعی داخل کد اسکریپتت تعریف شده باشه برنامهC/C++ میتونه اون رو صدا کنی و اگر میتونه چه شکلی اون رو صدا میکنه؟
مفسر نوشتی یا اینکه ماشین مجازی ساختی و یا کامپایلر jit نوشتی؟
البته با توضیحاتی که بالا دادی بنظر میرسه که مفسر ساختی و یا اینکه کلا اصلا چیزی به اسم اسکنر و پارسر نداری
Hr.Ziggurat
شنبه 22 مرداد 1390, 14:23 عصر
Ok ، معذرت:لبخند:...
مفسر نوشتی یا اینکه ماشین مجازی ساختی و یا کامپایلر jit نوشتی؟این برنامه یه مفسره کده که با آنالیز خط به خط در هر بار اجرا ، دستورا رو اجرا میکنه.
اگر تابعی داخل کد اسکریپتت تعریف شده باشه برنامهC/C++ میتونه اون رو صدا کنی و اگر میتونه چه شکلی اون رو صدا میکنه؟//in the my program source
.
.
.
typedef double number;
.
.
.
number sin_d(number degree){
return sin((degree/180)*M_PI);
}
.
.
.
//Before running script
ZSE::AddFunction("number sin_d(number)",sin_d);
//-----------------------------
//in the script source
//now sin_d function is know for ZSE
print("do you know sin(90) is "+str(sin_d(90),2)+" !"); \\Script Output: do you know sin(90) is 1.00 !
اگه بازم درست متوجه نشدم ، بگید:اشتباه:
برای lexer و paeser از نرم افزارهای آماده یا generatorها استفاده کردی یا خودت نوشتی و نوع پارسرت چیه؟راستش من از الگوریتم های معمول برای اینکار مثل (LR ، LL و...) استفاده نکردم! من lexer و parser رو با روش خودم انجام میدم. و از سرعت اجرایه کد هم راضی ام.
بنظر میرسه که مفسر ساختی و یا اینکه کلا اصلا چیزی به اسم اسکنر و پارسر نداری
نه این طور نیست ، اسکنر و پارسر وجود دارند. اون توضیحاتو ، خیلی خلاصه و ساده و کلی نوشتم.
SeganX
یک شنبه 23 مرداد 1390, 16:56 عصر
کارت خیلی جالبه. می تونی سرعتش رو با اسکریپت های دیگه و خود "سی" مقایسه کنی و بگی مثلا چند درصد از سی کندتره. تست های استاندارد زیادی می تونی تو اینترنت پیدا کنی.
Hr.Ziggurat
پنج شنبه 27 مرداد 1390, 12:40 عصر
کارت خیلی جالبه. می تونی سرعتش رو با اسکریپت های دیگه و خود "سی" مقایسه کنی و بگی مثلا چند درصد از سی کندتره. تست های استاندارد زیادی می تونی تو اینترنت پیدا کنی.
ممنونم ، شما لطف داری.
راستش هنوز مونده تا کامل بشه.(چون چندتا keyword هنوز تعریف نشدند و بعضی از الگوریتم ها باید اصلاح بشند) هر وقت کامل شد حتما این کار رو میکنم. فقط اگه زحمتی نیست شما یه چندتا از این تست های استاندارد رو به معرفی کنید. من می خواستم از تابع QueryPerformanceCounter (http://support.microsoft.com/kb/172338) استفاده کنم . ولی فکر کنم درست نباشه.
m.soleimani
پنج شنبه 27 مرداد 1390, 13:26 عصر
تا اینجای کار موتور کد دونوع متغییر رو میشناسه ، یکی به نام string که برای رشته هاست و یکی number که برای ذخیره سازی اعداد به کار میره. با خودم فکر کردم و به این نتیجه رسیدم که واسه ی اعداد به جای چند نوع متغییر (مثل char و short و int و...) ، فقط یک نوع وجود داشته باشه ، کد نویسی راحت تره. با توجه به اینکه number معادل double تو c هستش (یه متغییر 8 بایتی) خیلی کامله و همچنین قرار نیست باهاش کد خیلی سنگینی نوشته بشه که خیلی ram اشغال بشه. اگه مخالفید ممنون میشم بگید.
یکی از دلایلی که طراحان زبانهای برنامه نویسی تعداد زیادی متغییر عددی ارائه میدن بحث هدر ندادن حافظه هست برای مثال شما نیاز داری که توی بازه 1 تا 100 یه عدد داشته باشی و روش محاسبات انجام بدی برای این کار متغییر از نوع char که 1byte حافظه اشغال میکنه و بازه
signed: -128 to 127 , unsigned: 0 to 255 رو داره برای شما کاراتر هست یا نوع double که 8bytes حافظه اشغال میکنه و بازه +/- 1.7e +/- 308 (~15 digits) رو داره به هر حال خوبه که تجربهی متفاوتی رو انتخاب کردید شاد و پیروز باشید./
Sina_Od
پنج شنبه 27 مرداد 1390, 14:33 عصر
سلام. خسته نباشید. اتفاقا یه مدت پیش منم یه زبان برنامه نویسی طراحی کردم که قواعدش خیلی ساده بود. ( حتّی ساده تر از VB ) و خوب هم قابل توسعه بود. حتی کد های معادل for و if و ... رو هم توش گنجوندم. ولی یه جورایی قیدشو زدم. خیلی وقت گیر بود.
سپول
شنبه 29 مرداد 1390, 18:02 عصر
تبریک، فقط راجع به خود موتور هم بیشتر توضیح بدید بهتره
SeganX
چهارشنبه 02 شهریور 1390, 18:19 عصر
سایتی که میشه توش تستهای خوبی برای اسکریپت پیدا کرد.
http://codeplea.com/game-scripting-languages
لینکش رو اکبر ( کوچول ) داشت که چون فعلا سربازه خیلی در دسترس نیست.
ببخشید که دیر شد
Hr.Ziggurat
پنج شنبه 03 شهریور 1390, 05:46 صبح
تبریک، فقط راجع به خود موتور هم بیشتر توضیح بدید بهتره ممنون ، فعلا دارم یه سری تغییرات تو کدش میدم،تموم که شد،حتما!
سایتی که میشه توش تستهای خوبی برای اسکریپت پیدا کرد.
http://codeplea.com/game-scripting-languages
لینکش رو اکبر ( کوچول ) داشت که چون فعلا سربازه خیلی در دسترس نیست.
ببخشید که دیر شد
دمت گرم ، خیلی دنبالش بود.
ماهان مقدم
پنج شنبه 10 شهریور 1390, 21:01 عصر
سلام آقا کارت خیلی عالیه من هم یه مدت همچین چیزی نوشته بودم البت توی vb.net ولی بخاطر اینکه نتونستم شرط های تو در تو رو در بیارم ولش کردم. شما شرط ها رو الآن کاری براش کردی ؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.