View Full Version : سوال: انتخاب کتابخانه اسکریپت
khorzu
پنج شنبه 01 مهر 1389, 06:44 صبح
سلام
در مورد انتخاب کتابخانه اسکریپت از دوستان راهنمایی می خواستم . البته یه مدت هست که با Lua کار می کنم ولی می خوام بدونم از نظر ارائه شی گرایی (که Lua چنین نیست) و سرعت اجرا و محاسبات عددی گزینه بهتری هم وجود داره یا نه .
pswin.pooya
پنج شنبه 01 مهر 1389, 07:54 صبح
اگر از luabind در کنار lua استفاده بکنبن میتونید از کلاسها داخل Lua استفاده کنید.
khorzu
پنج شنبه 01 مهر 1389, 09:44 صبح
ممنون.
اما به سری سوالات اساسی در مورد Lua واسه من پیش اومده که در ادامه استفاده از اون منو مردد کرده ؛ مثلا اینکه همه اعداد رو با بی مسئولیتی در ابعاد double دخیره و پردازش می کنه و یا اینکه برنامه ای برای دسترسی مستقیم به داده ها و توابع سی نداره + سینتکس غیر معمولش.
در برابر اون Angel Script (http://www.angelcode.com/angelscript/features.asp) وجود داره که به نظر میاد واسه همه این نقاط ضعف حرف داره ... اما چون تیم توسعه کوچیکی داره و هنوز زیاد به کار گرقته نشده جرئت نمی کنم همه کد هامو از نو تغییر بدم ...
همچنین Python هم که می تونه خیلی به سادگی کار کمک کنه هر چند در مورد بهینگی خیلی خوش نام نیست .
یا مثلا همچین (http://www.codeproject.com/KB/cpp/gecko1.aspx) چیزیی .
pswin.pooya
پنج شنبه 01 مهر 1389, 16:10 عصر
شما به هر شکلی که بخوایین میتونین از طریق C/C++ با Lua ارتباط داشته باشین میتونید توابع اون رو از داخل کد C صدا بکنبد و یا برعکس همچنین میتونید مقدار یه متغییر رو بخونید و یا ست کنید. Lua یک سینتکس ساده داره که که توسط برنامه نویسهای C/C++ قابل درک نیست و بعضا باعث دردسر میشه من خودمم یه مقدار با سینتکش مشکل دارم. اما سینتکس اون خوره برنامه نویسهای VB و پاسکال هست.
من داخل این پست مطالبی رو برای کار با Lua گذاشتم:
http://pooyagp.blogspot.com/2010/09/compiling-luabind-with-microsoft-visual.html
منم تعریف AngleScript رو زیاد شنیدم اما باهاش کار نکردم. اگر بدونم تمام نیازهای من رو برآورده میکنه فورا سوئیچ میکنم
khorzu
جمعه 02 مهر 1389, 09:00 صبح
میتونید توابع اون رو از داخل کد C صدا بکنبد و یا برعکس همچنین میتونید مقدار یه متغییر رو بخونید و یا ست کنید. اما این کارو مستقیم انجام نمی ده ، برای داده ها که باید اونها رو توی پشته کپی کنیم و برای صدا زدن توابع هم از پشته داخلی برای ارسال مقادیر استفاده می شه.
اما توی Angel Script مثلا اگه توی سی داشته باشیم :
// Print the script string to the standard output stream
void print(string &msg)
{
printf("%s", msg.c_str());
}
...
// Register the function that we want the scripts to call
result = engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(print), asCALL_CDECL); assert( r >= 0 );
توی اسکریپت می تونیم داشته باشیم :
void main()
{
print("Hello world\n");
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
در مورد Cyrus Script (http://kge3d.org/tag/cyrus-script) - سریعترین موتور اسکریپت دنیا - اینکه توی کار چه نتیجه ای داده هم اطلاعی دارید .
It dose not use virtual machine to run the script programs.
و اینکه چطور کار می کنه .
pswin.pooya
جمعه 02 مهر 1389, 11:13 صبح
اما این کارو مستقیم انجام نمی ده ، برای داده ها که باید اونها رو توی پشته کپی کنیم و برای صدا زدن توابع هم از پشته داخلی برای ارسال مقادیر استفاده می شه.
خود C++ هم اینکار رو میکنه اگر آرماگونها کمتر از 6 تا باشه اونها رو داخل ریجیسترها و اگر بیشتر باشه اونها رو داخل پشته کپی میکنه و بعد تابع رو صدا میکنه.
AngleSCriipt هم مشکلات خودش رو داره. اول از همه طبق تست دوستان از Lua و امثال اون کندتر هست و مورد دیگه ای که داره اینه که از وراثت پشتیبانی نمی کنه یعنی شما نمی تونی از یه کلاس ثبت شده به ارث ببری که واقعا کدینگ رو محدود میکنه اما رابطه مستقیم اون واقعا عالی هست.
در مورد Cyrus Script (http://kge3d.org/tag/cyrus-script) - سریعترین موتور اسکریپت دنیا - اینکه توی کار چه نتیجه ای داده هم اطلاعی دارید .
این زبان اسکریپت داخلی شرکت سورنا پردازش آریا هست که به همت علی اکبر محمدی (کوچول) و دوستانش طراحی شده. گرامر این زبان مثل C/C++ هست و طبق تست هایی که داشتن از همه زبانهای اسکریپت مطرح دنیا سریعتر کار میکنه. این زبان فعلا چندان کامل نیست و تا اونجا که من میدونم از مواردی مثل شی گرایی پشتیبانی نمیکنه. و خود شرکت هم فعلا هیچ تمایلی به ارائه اون برای عموم نداره.
کم کم داره اعصابم خورد میشه من دنبال یه زبان اسکریپت کامل با گرامر C++ هستم که موراد زیر رو داشته باشه. اگر زبانی رو سراغ دارید معرفی کنید:
1. فراخوانی توابع از داخل C++
2. فراخوانی توابع C++
3. ارث بری از کلاسهای ثبت شده داخل اسکریپت و برگردوندن اشاره گر آنها
4. قابلیت کار با اشاره گرها
5. سریع هم باشه.
اگر angelscript از ارث بری پشتیبانی می کرد فوقالعاده میشد. یعنی واقعا کامل می شد.
kochol
دوشنبه 05 مهر 1389, 13:15 عصر
1. فراخوانی توابع از داخل C++
2. فراخوانی توابع C++
3. ارث بری از کلاسهای ثبت شده داخل اسکریپت و برگردوندن اشاره گر آنها
4. قابلیت کار با اشاره گرها
5. سریع هم باشه.
مورد 3 رو که فکر نکنم هیچ اسکریپتی بتونه انجام بده.
مورد 4 رو اسکریپت من انجام می ده
کار با اسکریپت من یه جورایی شبیه به angle script هست
الان شروع کردم به وصل کردن این اسکریپت به ادیتور بازی 12 رخ تا حالا که مشکل خاصی نیست
pswin.pooya
دوشنبه 05 مهر 1389, 15:11 عصر
مورد 3 رو که فکر نکنم هیچ اسکریپتی بتونه انجام بده.
سلام
Lua میتونه این کار رو به راحتی و با کمک luabind انجام بده. خود من این مورد رو تست زدم.
kochol
دوشنبه 05 مهر 1389, 19:01 عصر
دقیقا چی کار کردی
pswin.pooya
سه شنبه 06 مهر 1389, 13:51 عصر
دقیقا چی کار کردی
ارث بری از کلاس ثبت شده.
khorzu
چهارشنبه 07 مهر 1389, 09:38 صبح
خود C++ هم اینکار رو میکنه اگر آرماگونها کمتر از 6 تا باشه اونها رو داخل ریجیسترها و اگر بیشتر باشه اونها رو داخل پشته کپی میکنه و بعد تابع رو صدا میکنه.اما به نظرم وقتی از Lua تابع سی جار زده می شه از پشته سیستم استفاده نمی شه . از پشته Lua استفاده می شه و توی پشته Lua علاوه بر داده نوع اون هم ذخیره می شه (meta date). این یعنی حجم بیشتر و سرعت کمتر + اینکه امکان ارسال مقادیر از با اشاره گر هم وجود نداره (مثلا می شد برای ارسال یک دابل 64 بیتی یک اشاره گر 32 بیتی رو توی پشته کپی کرد).
@Kochol - the Great
سلام
1- دلیل اصلی که از بکار بردن موتور آماده اسکریپت منصرف شدید و تصمیم به کدنویسی موتور اختصاصی کردید چی بود . کورش در مقایسه با Lua از نظر سرعت چه نتیجه ای داده.
2- بین Lua و Angel کدوم رو انتخاب می کنید و چرا.
~~~~~~~~~~~~~~~~~
می شه نظر دوستان راجع به V8 رو هم بدونم.
http://en.wikipedia.org/wiki/V8_%28JavaScript_engine%29
http://www.garry.tv/?p=661
http://www.codeproject.com/KB/library/Using_V8_Javascript_VM.aspx
http://code.google.com/apis/v8/embed.html
این یکی اساسا مورد قابل اعتنایی هست ؛ اولا که گوگل پشتشه و چون توی رقابت مرورگر ها سرعت اجرای جاوا اسکریپت به عنوان یک مولفه مهم در نظر گرفته می شه امید زیادی به توسعه و افزایش سرعت در آینده هست هرچند که همین الان هم واقعا موجود عجیبیست (پیروزی بر Lua (http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=lua&lang2=v8))ثانیا خود جاوا اسکریپت که گزینه بسیار مناسبی برای برنامه نویسی کاربر نهاییست از نظر سادگی و شبیه سیست.
kochol
سه شنبه 13 مهر 1389, 16:12 عصر
سلام
1. دلیل اصلی که از استفاده از موتورهای آماده منصرف شدم به خاطر
1. سرعت پایین آنها بود
2. وصل کردن برنامه سی++ به اونها سخت بود معمولا
3. ایده ای که تو ذهنم بود رو می خواستم پیاده سازی کنم و تست کنم ببینم که عملی هست یا نه
در حال حاضر کوروش اسکریپت نزدیک به 378 کیلو بایت کد داره.
اولین تستی که گرفتم وقتی بود که حلقه for رو برای اسکریپت نوشتم و برنامه ای که برای تست نوشتم به این صورت بود که با یکسری string کار می کرد مثلا یه عدد رو می چسبوند ته string و تو کنسول چاپ می کرد و همون رو عینا تو سی++ نوشتم که پشت سر هم اجرا می شدند و زمان محاسبه هر کدوم رو می نوشتم
اولین تستی که کردم باورم نمی شد که اسکریپت من تنها 5% کندتر از سی++ بوده به دوستم گفتم تو بیا ببین که من اشتباه زمان ها رو حساب نکردم اونم نگاه کرد و گفت که نه همه چی درسته
بعدا که کامل تر شد سرعتش هم کمتر شد و بین 10 تا 15% رسید
ولی نکته قابل توجه اینجاست که وقتی یه کدی میزنی که فقط محاسبات عددی داره مثل این کد.
for (int i = 0; i < 10000000; i++)
{
a *= i;
}
اختلاف سرعت نزدیک به 38 برابر می شه یعنی اسکریپت من تو این تست 38 برابر کندتر از سی++ بود و 6 برابر سریعتر از angle script بود دلیلش هم احتمالا به این خاطر هست که cpu سیستم های کش داره یا یه چیزهای دیگه اگر وسط همین کد یه تابع رو صدا بزنی دوباره اختلاف به همون 10 تا 15% می رسه
2. من انجل اسکریپت رو انتخاب می کنم چون بیشترین کاری که من از اسکریپت لازم دارم صدا کردن تابع های native هست که انجل اسکریپت بسیار بهتر و سریعتر این کار رو انجام میده
http://codeplea.com/game-scripting-languages
kochol
چهارشنبه 14 مهر 1389, 13:26 عصر
اسکریپت من تابع نداره ولی به جاش یه سری تابع استفاده کردم که می تونی متغییرهای داخل اسکریپت دیگر رو ست و گت کنی و اون اسکریپت رو صدا بزنی
scriptTest1.set("N", 55);
scriptTest1.Run();
string s;
string w = "second script";
w.Print();
int i = scriptTest1.get("i");
i++;
s.IntToStr(scriptTest1.get("i"));
s.Print();
s.IntToStr(i);
s.Print();
سپول
جمعه 16 مهر 1389, 15:36 عصر
سلام
اسکریپتی که شما درست کردید از کتابخانه Lexer خاصی مثل flex یا Bison استفاده می کنه ؟
برای Parser اش چی ؟
ممنون
اسکریپت من تابع نداره ولی به جاش یه سری تابع استفاده کردم که می تونی متغییرهای داخل اسکریپت دیگر رو ست و گت کنی و اون اسکریپت رو صدا بزنی
scriptTest1.set("N", 55);
scriptTest1.Run();
string s;
string w = "second script";
w.Print();
int i = scriptTest1.get("i");
i++;
s.IntToStr(scriptTest1.get("i"));
s.Print();
s.IntToStr(i);
s.Print();
khorzu
شنبه 17 مهر 1389, 12:53 عصر
ممنون.
از توي سي چي صدا زده مي شه ؟ يعني به ازاي هر تابع يك رشته اسكريپت؟
kochol
شنبه 17 مهر 1389, 12:54 عصر
سلام
Lexer ام flex است
Parser ام هم Bison است
سپول
یک شنبه 18 مهر 1389, 01:23 صبح
سلام
Lexer ام flex است
Parser ام هم Bison است
مرسی، امیدوارم تست های کاملتر و جدی تری از سرعت ، binding و features انجام بدی و نتیجه رو تو سایتت بزنی
راستی سایتت انگار ویروس گرفته
برای کسایی هم که می خوان خودشون اسکریپت اینجین بنویسن اینجا واسه شروع خوبه که از سایت قدیمی flipcode به جا مونده:
http://www.flipcode.com/archives/Implementing_A_Scripting_Engine-Part_1_Overview.shtml
kochol
یک شنبه 18 مهر 1389, 11:45 صبح
بعد ... از توي سي چي صدا زده مي شه ؟ يعني به ازاي هر تابع يك رشته اسكريپت؟
نه فقط برای گرفتن اسم های متتغیر یه اسکریپت دیگه باید استرینگ بدی این کدی که من گذاشتم یه خورده کثیف هست برای همین اینقدر توش استرینگ تعریف شده.
هر کدی که اینجا هست رو می تونی عینا تو سی ++ هم اجرا کنی
kochol
یک شنبه 18 مهر 1389, 11:59 صبح
مرسی، امیدوارم تست های کاملتر و جدی تری از سرعت ، binding و features انجام بدی و نتیجه رو تو سایتت بزنی
راستی سایتت انگار ویروس گرفته
برای کسایی هم که می خوان خودشون اسکریپت اینجین بنویسن اینجا واسه شروع خوبه که از سایت قدیمی flipcode به جا مونده:
http://www.flipcode.com/archives/Implementing_A_Scripting_Engine-Part_1_Overview.shtml
سلام
مرسی
حتما تست های بیشتری برای سرعت می زنم ولی بایندینگ اسکریپتم حرف نداره و واقعا راحته و در مورد قابلیت هم که باید بگم که قعلا همین قدر کافیه که تابع صدا بزنه ولی هنوز یه تابع نمی تونه خودشو صدا بزنه
البته اسکریپت دستور Sleep داره که بدونه اینکه thread رو بخوابونه خودش به مقدار گفته شده می خوابه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.