انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

اوبونتو ۲۴٫۰۴ با پشتیبانی بلند مدّت (۱۲ سال) منتشر شد 🎉

نویسنده موضوع: مقداردهی مستقیم به متغیر یا گذاشتن شرط؟  (دفعات بازدید: 413 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین sajadspeed

  • Hero Member
  • *
  • ارسال: 949
  • جنسیت : پسر
سلام دوستان از اونجایی که مباحث طراحی کامپایلر رو به شکل عجله‌ای مطالعه کردم و اصلا نمی‌دونم جواب سوالم توی این حوزه هست یا نه ولی با این حال می‌پرسم، ممنون می‌شم اگه کسی توضیح بده.
ببینید فرض کنید یه تابعی داریم که توی زمان‌های مشخصی صدا زده می‌شه. برای راحت‌تر کردن مفهوم مثلا می‌گیم یه تابع به نام Update داریم که توی موتور بازی‌سازی‌مون توی هر فریم صدا زده می‌شه. حالا مثلا می‌خوایم چک کنیم که آیا توی هر فریم فلان اتفاق افتاده یا نه:
FolanEvent()این تابع یه خروجی bool داره و می‌خوایم چک کنیم اگه true بود یه متغیر رو مقدار دهی کنه. حالا به دو شکل می‌شه این رو نوشت، حالا با در نظر گرفتن false بودن eventHappened و صرف نظر از تغییر دوباره مقدار بعد از یک بار true شدن؛ روش اول:
void Update()
{
if(FolanEvent())
eventHappened = true
}
روش دوم:
void Update()
{
eventHappened = FolanEvent();
}

الان سوال اصلی اینجاست که آیا در شیوه دوم شعور کامپایلر یا مفسر می‌رسه که وقتی مقدار eventHappened با خروجی FolanEvent یکیه و دیگه عملیات اضافه‌تری انجام نده؟
می‌دونم شاید سوال وابسته به زبان باشه ولی فکر کنم عمومی‌تره و شاید استاندارد خاصی داره؛ برای همین زبان خاصی مد نظرم نیست. ولی اگه این فاکتور مهمیه مثلا توی پایتون یا ++C بررسی بشه. البته اصل سوال برای #C است و منم ناچارن دارم استفاده می‌کنم ولی خوب احتمال زیاد اکثرا مثل خود من خوششون نمیاد از این زبان و چهارچوب.

آفلاین Aminavy-r

  • Newbie
  • *
  • ارسال: 23
  • جنسیت : پسر
بعید می دونم مفسر بهینه سازی انجام بده ولی توی کامپایلر ها معمولا داریمش. سی شارپ رو نمی دونم ولی توی سی پلاس پلاس می تونی خروجی اسمبلی رو بررسی کنی ببینی چکار کرده.
باز بعید می دونم که توی حالت دوم شعورش  :D برسه چون باید بررسی کنه که مقدار متغیر true یا false هست ولی چون این توی runtime هست خب کامپایلر نمی تونه کار خاصی انجام بده (مثلا اگه بخواد بررسی کنه، که می دونی بدتر میشه)

و از همه عجیب تر کامپایلر با سی شارپ؟!!

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19532
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
اون بررسی شرط که عملیات بیش‌تری انجام می‌ده نسبت به حالت دوم.
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین Aminavy-r

  • Newbie
  • *
  • ارسال: 23
  • جنسیت : پسر
برای بررسی شرط هر دوتاشون تابع رو فراخوانی می کنن ولی توی حالت دوم هر بار متغیر مقداردهی میشه. به هر حال بررسی کن ببین چکار میکنه
برای من که امتحان کردم کامپایلر کد تقریبا مشابهی رو تولید کرد (حالت اول رو دو قسمت کرد)



راستی، موضوع چیه؟ اگه موتور بازی هست، چرا به اینجا رسیده؟ فکر می کنم که اصلا نباید همچین شرایطی ایجاد بشه (چرا عجله داری event رو بگیری؟) اگه نمی خوای چند بار تابع رو فراخوانی کنی همه کارایی که می خوای بکنی رو یه جا کن بعد با یه شرط اجراشون کن. الکی حافظه و زمان رو حروم نکن  ;)
« آخرین ویرایش: 19 دی 1402، 08:44 ب‌ظ توسط xeon »

آفلاین sajadspeed

  • Hero Member
  • *
  • ارسال: 949
  • جنسیت : پسر
بعید می دونم مفسر بهینه سازی انجام بده ولی توی کامپایلر ها معمولا داریمش. سی شارپ رو نمی دونم ولی توی سی پلاس پلاس می تونی خروجی اسمبلی رو بررسی کنی ببینی چکار کرده.
باز بعید می دونم که توی حالت دوم شعورش  :D برسه چون باید بررسی کنه که مقدار متغیر true یا false هست ولی چون این توی runtime هست خب کامپایلر نمی تونه کار خاصی انجام بده (مثلا اگه بخواد بررسی کنه، که می دونی بدتر میشه)

و از همه عجیب تر کامپایلر با سی شارپ؟!!
بله درسته، گفتم شاید خود کامپایلر یا مفسر چک بکنه که اگه مقداری که نسبت داده می‌شه به متغیر اگه تکراری باشه دیگه عملیات انتساب اجرا نشه.

نقل‌قول
و از همه عجیب تر کامپایلر با سی شارپ؟!!
چیش عجیبه؟

آفلاین sajadspeed

  • Hero Member
  • *
  • ارسال: 949
  • جنسیت : پسر
اون بررسی شرط که عملیات بیش‌تری انجام می‌ده نسبت به حالت دوم.
بله درسته ولی گفتم شاید عملیات انتساب توی این تعداد اجرای بالا، مرتبه زمانی بیشتری نسبت به اون شرط داشته باشه. رم هم که بالاخره درگیر می‌شه. موضوغ اینجاست که اگه برای هر مقدار تکراری عملیات انتساب باز هم انجام بشه شاید کدی که توش شرط هست بهتر عمل کنه.

آفلاین sajadspeed

  • Hero Member
  • *
  • ارسال: 949
  • جنسیت : پسر
راستی، موضوع چیه؟ اگه موتور بازی هست، چرا به اینجا رسیده؟ فکر می کنم که اصلا نباید همچین شرایطی ایجاد بشه (چرا عجله داری event رو بگیری؟) اگه نمی خوای چند بار تابع رو فراخوانی کنی همه کارایی که می خوای بکنی رو یه جا کن بعد با یه شرط اجراشون کن. الکی حافظه و زمان رو حروم نکن  ;)
نه سناریو واقعی نیست :) چند وقت پیش‌ها سر یه پروژه‌ای به این مشکل برخورد کرده بودم توی یونیتی، تقریبا شبیه این بود، ولی حسابی پیچیده بود تو هم، دقیقا من هم کلی با منظق ور رفتم که به یه شکل دیگه قضیه هندل بشه در آخر همچین کار مشابهی باید صورت می‌گرفت. الان دسترسی به کدهای پروژه را ندارم ولی اگه بیشتر یادم اومد حتما به اشتراک می‌ذارم.

نقل‌قول
برای بررسی شرط هر دوتاشون تابع رو فراخوانی می کنن ولی توی حالت دوم هر بار متغیر مقداردهی میشه. به هر حال بررسی کن ببین چکار میکنه
برای من که امتحان کردم کامپایلر کد تقریبا مشابهی رو تولید کرد (حالت اول رو دو قسمت کرد)
متاسفانه زیاد دانش اسمبلی ندارم که بخوام بررسی کنم. الانم وقتش نیست که بخوام یه نگاهی بهش بندازم که یادآوری شه. ولی حتما در آینده بررسی می‌کنم. ممنون از شما که وقت گذاشتید. سپاس فراوان.

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19532
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
بله درسته ولی گفتم شاید عملیات انتساب توی این تعداد اجرای بالا، مرتبه زمانی بیشتری نسبت به اون شرط داشته باشه. رم هم که بالاخره درگیر می‌شه. موضوغ اینجاست که اگه برای هر مقدار تکراری عملیات انتساب باز هم انجام بشه شاید کدی که توش شرط هست بهتر عمل کنه.
بررسی شرط مصرفش بالاتر از مقداردهی متغیره
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین sajadspeed

  • Hero Member
  • *
  • ارسال: 949
  • جنسیت : پسر
بله درسته ولی گفتم شاید عملیات انتساب توی این تعداد اجرای بالا، مرتبه زمانی بیشتری نسبت به اون شرط داشته باشه. رم هم که بالاخره درگیر می‌شه. موضوغ اینجاست که اگه برای هر مقدار تکراری عملیات انتساب باز هم انجام بشه شاید کدی که توش شرط هست بهتر عمل کنه.
بررسی شرط مصرفش بالاتر از مقداردهی متغیره
اوکی پس، سپاس فراوان.