انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: sajadspeed در 19 دی 1402، 06:33 بظ
-
سلام دوستان از اونجایی که مباحث طراحی کامپایلر رو به شکل عجلهای مطالعه کردم و اصلا نمیدونم جواب سوالم توی این حوزه هست یا نه ولی با این حال میپرسم، ممنون میشم اگه کسی توضیح بده.
ببینید فرض کنید یه تابعی داریم که توی زمانهای مشخصی صدا زده میشه. برای راحتتر کردن مفهوم مثلا میگیم یه تابع به نام Update داریم که توی موتور بازیسازیمون توی هر فریم صدا زده میشه. حالا مثلا میخوایم چک کنیم که آیا توی هر فریم فلان اتفاق افتاده یا نه:
FolanEvent()
این تابع یه خروجی bool داره و میخوایم چک کنیم اگه true بود یه متغیر رو مقدار دهی کنه. حالا به دو شکل میشه این رو نوشت، حالا با در نظر گرفتن false بودن eventHappened و صرف نظر از تغییر دوباره مقدار بعد از یک بار true شدن؛ روش اول:
void Update()
{
if(FolanEvent())
eventHappened = true
}
روش دوم:
void Update()
{
eventHappened = FolanEvent();
}
الان سوال اصلی اینجاست که آیا در شیوه دوم شعور کامپایلر یا مفسر میرسه که وقتی مقدار eventHappened با خروجی FolanEvent یکیه و دیگه عملیات اضافهتری انجام نده؟
میدونم شاید سوال وابسته به زبان باشه ولی فکر کنم عمومیتره و شاید استاندارد خاصی داره؛ برای همین زبان خاصی مد نظرم نیست. ولی اگه این فاکتور مهمیه مثلا توی پایتون یا ++C بررسی بشه. البته اصل سوال برای #C است و منم ناچارن دارم استفاده میکنم ولی خوب احتمال زیاد اکثرا مثل خود من خوششون نمیاد از این زبان و چهارچوب.
-
بعید می دونم مفسر بهینه سازی انجام بده ولی توی کامپایلر ها معمولا داریمش. سی شارپ رو نمی دونم ولی توی سی پلاس پلاس می تونی خروجی اسمبلی رو بررسی کنی ببینی چکار کرده.
باز بعید می دونم که توی حالت دوم شعورش :D برسه چون باید بررسی کنه که مقدار متغیر true یا false هست ولی چون این توی runtime هست خب کامپایلر نمی تونه کار خاصی انجام بده (مثلا اگه بخواد بررسی کنه، که می دونی بدتر میشه)
و از همه عجیب تر کامپایلر با سی شارپ؟!!
-
اون بررسی شرط که عملیات بیشتری انجام میده نسبت به حالت دوم.
-
برای بررسی شرط هر دوتاشون تابع رو فراخوانی می کنن ولی توی حالت دوم هر بار متغیر مقداردهی میشه. به هر حال بررسی کن ببین چکار میکنه
برای من که امتحان کردم کامپایلر کد تقریبا مشابهی رو تولید کرد (حالت اول رو دو قسمت کرد)
راستی، موضوع چیه؟ اگه موتور بازی هست، چرا به اینجا رسیده؟ فکر می کنم که اصلا نباید همچین شرایطی ایجاد بشه (چرا عجله داری event رو بگیری؟) اگه نمی خوای چند بار تابع رو فراخوانی کنی همه کارایی که می خوای بکنی رو یه جا کن بعد با یه شرط اجراشون کن. الکی حافظه و زمان رو حروم نکن ;)
-
بعید می دونم مفسر بهینه سازی انجام بده ولی توی کامپایلر ها معمولا داریمش. سی شارپ رو نمی دونم ولی توی سی پلاس پلاس می تونی خروجی اسمبلی رو بررسی کنی ببینی چکار کرده.
باز بعید می دونم که توی حالت دوم شعورش :D برسه چون باید بررسی کنه که مقدار متغیر true یا false هست ولی چون این توی runtime هست خب کامپایلر نمی تونه کار خاصی انجام بده (مثلا اگه بخواد بررسی کنه، که می دونی بدتر میشه)
و از همه عجیب تر کامپایلر با سی شارپ؟!!
بله درسته، گفتم شاید خود کامپایلر یا مفسر چک بکنه که اگه مقداری که نسبت داده میشه به متغیر اگه تکراری باشه دیگه عملیات انتساب اجرا نشه.
و از همه عجیب تر کامپایلر با سی شارپ؟!!
چیش عجیبه؟
-
اون بررسی شرط که عملیات بیشتری انجام میده نسبت به حالت دوم.
بله درسته ولی گفتم شاید عملیات انتساب توی این تعداد اجرای بالا، مرتبه زمانی بیشتری نسبت به اون شرط داشته باشه. رم هم که بالاخره درگیر میشه. موضوغ اینجاست که اگه برای هر مقدار تکراری عملیات انتساب باز هم انجام بشه شاید کدی که توش شرط هست بهتر عمل کنه.
-
راستی، موضوع چیه؟ اگه موتور بازی هست، چرا به اینجا رسیده؟ فکر می کنم که اصلا نباید همچین شرایطی ایجاد بشه (چرا عجله داری event رو بگیری؟) اگه نمی خوای چند بار تابع رو فراخوانی کنی همه کارایی که می خوای بکنی رو یه جا کن بعد با یه شرط اجراشون کن. الکی حافظه و زمان رو حروم نکن ;)
نه سناریو واقعی نیست :) چند وقت پیشها سر یه پروژهای به این مشکل برخورد کرده بودم توی یونیتی، تقریبا شبیه این بود، ولی حسابی پیچیده بود تو هم، دقیقا من هم کلی با منظق ور رفتم که به یه شکل دیگه قضیه هندل بشه در آخر همچین کار مشابهی باید صورت میگرفت. الان دسترسی به کدهای پروژه را ندارم ولی اگه بیشتر یادم اومد حتما به اشتراک میذارم.
برای بررسی شرط هر دوتاشون تابع رو فراخوانی می کنن ولی توی حالت دوم هر بار متغیر مقداردهی میشه. به هر حال بررسی کن ببین چکار میکنه
برای من که امتحان کردم کامپایلر کد تقریبا مشابهی رو تولید کرد (حالت اول رو دو قسمت کرد)
متاسفانه زیاد دانش اسمبلی ندارم که بخوام بررسی کنم. الانم وقتش نیست که بخوام یه نگاهی بهش بندازم که یادآوری شه. ولی حتما در آینده بررسی میکنم. ممنون از شما که وقت گذاشتید. سپاس فراوان.
-
بله درسته ولی گفتم شاید عملیات انتساب توی این تعداد اجرای بالا، مرتبه زمانی بیشتری نسبت به اون شرط داشته باشه. رم هم که بالاخره درگیر میشه. موضوغ اینجاست که اگه برای هر مقدار تکراری عملیات انتساب باز هم انجام بشه شاید کدی که توش شرط هست بهتر عمل کنه.
بررسی شرط مصرفش بالاتر از مقداردهی متغیره
-
بله درسته ولی گفتم شاید عملیات انتساب توی این تعداد اجرای بالا، مرتبه زمانی بیشتری نسبت به اون شرط داشته باشه. رم هم که بالاخره درگیر میشه. موضوغ اینجاست که اگه برای هر مقدار تکراری عملیات انتساب باز هم انجام بشه شاید کدی که توش شرط هست بهتر عمل کنه.
بررسی شرط مصرفش بالاتر از مقداردهی متغیره
اوکی پس، سپاس فراوان.