شماره گذاری ارزش کیست؟ توضیح بده.
شماره گذاری ارزش یک تکنیک برای تعیین زمان محاسبه دو محاسبه در یک برنامه و حذف یکی از آنها با معنی شناسی حفظ بهینه سازی است.شماره گذاری جهانی ارزش.شماره گذاری ارزش جهانی (GVN) یک است که بر اساس است. بعضی اوقات به از بین بردن که کمک نمی‌کند ، کمک می کند. با این حال ، در همان زمان ، CSE ممکن است کدی را حذف کند که GVN آن را ندارد ، بنابراین هر دو اغلب در کامپایلرهای مدرن یافت می شوند. با شماره گذاری محلی ارزش متمایز است به این دلیل که نقشه های شماره ارزش در مرزهای بلوک اصلی نیز نگهداری می شوند و از الگوریتم های مختلفی برای محاسبه نگاشت ها استفاده می شود.شماره گذاری ارزش جهانی با اختصاص یک مقدار به متغیرها و عبارات کار می کند. همان مقدار ارزش به آن متغیرها و عبارات اختصاص داده شده معادل اختصاص داده می شود. به عنوان مثال ، در کد زیر:w := 3x := 3y := x + 4z := w + 4یک روال خوب GVN عدد یکسانی را به w و x و همان عدد مقدار را به y و z اختصاص می دهد. به عنوان مثال ، نقشه پایین یک نقشه برداری با ارزش بهینه برای این بلوک تشکیل می دهد. با استفاده از این اطلاعات ، قطعه کد قبلی ممکن است با خیال راحت به کد زیر تبدیل شود:w := 3x := wy := w + 4z := yبسته به کد زیر این قطعه ، ممکن است تکالیف x و z را حذف کند.دلیل این که GVN گاهی اوقات قوی تر از CSE است از این واقعیت ناشی می شود که CSE با اصطلاحات واژگان یکسان منطبق است در حالی که GVN سعی در تعیین یک هم ارزی اساسی دارد. به عنوان مثال ، در کد:a := c × d e := c f := e × dبدون انتشار نسخه ، CSE اعتبار مورد نظر به f را از بین نمی‌برد ، اما حتی یک الگوریتم GVN ضعیف نیز باید این افزونگی را کشف و از بین ببرد.فرم SSA برای انجام GVN لازم است به طوری که نگاشت اشتباه {نام ارزش → نام متغیر} ایجاد نمی‌شوند.شماره گذاری محلی.شماره گذاری محلی (LVN) یک است که هدف آن پیدا کردن چندین نمونه از عبارات معادل (یعنی عباراتی که همان نتیجه را دارند) را پیدا کرده و آنها را با اولین بار جایگزین می کند. LVN یک بهینه سازی محلی است ، به این معنی که برخلاف ، در یک زمان واحد در یک عمل می کند.شماره گذاری با ارزش محلی با اختصاص یک شماره منحصر به فرد به هر عملیات و به یاد آوردن این انجمن ها کار می کند. دستورالعمل های بعدی مورد بررسی قرار گرفته و در صورتی که دستورالعمل یکسان قبلاً ثبت شده باشد جایگزین نتیجه دستورالعمل قبلی می شود. مثلاً:a ← 4 a is tagged as #1 b ← 5 b is tagged as #2 c ← a + b c (#1 + #2) is tagged as #3 d ← 5 d is tagged as #2, the same as b e ← a + d e, being '#1 + #2' is tagged as #3با اختصاص شماره به دستورالعمل های مقایسه نسخه های تکراری به مقایسه عدد صحیحی ساده تبدیل می شود. در این مثال خاص "c" و "e" به همان تعداد (شماره 3) اختصاص داده می شوند ، بنابراین به کامپایلر سیگنال می دهند که هر گونه ارجاع به e ممکن است به سادگی با c جایگزین شود.مشکلات و الحاقات.یک اجرای ساده ممکن است سعی کند با استفاده مستقیم از نامهای متغیر به جای اعداد ، بهینه سازی را انجام دهد. با این حال ، این رویکرد زمانی کار نمی‌کند که مقادیر متغیرها تغییر کنند. را در نظر بگیرید:a ← 1 a is tagged as #1b ← 2 b is tagged as #2c ← a + b c is tagged as #3b ← 3d ← a + b d is incorrectly tagged as #3در این سناریو "d" نادرست عدد 3 را اختصاص می دهد زیرا آرگومان ها با "c" مطابقت دارند. با این حال ، این نادرست است زیرا "b" مقدار را از 2 به 3 تغییر داده و نتیجه واقعی را متفاوت می کند.یک پیاده سازی ساده همچنین ممکن است قادر به گرفتن همه عبارات معادل آن نباشد ، حتی در مواردی که فقط با ترتیب عملگرهای خود متفاوت باشند. در مثال زیر "a" و "b" می توانند به همین تعداد اختصاص داده شوند:a ← 1 + 2b ← 2 + 1این مسئله به راحتی یا با اختصاص یک عدد به هر دو مورد قابل حل است (یعنی "a + b" و "b + a" هر دو با یک شماره ثبت می شوند) یا با مرتب کردن عملوندها قبل از بررسی معادل ها.بهینه سازهای شماره گذاری محلی نیز ممکن است از هویت ریاضی آگاه باشند. با فرض "a" یک عدد صحیح است که به همه عبارات زیر می توان مقدار یکسان داد:b ← a + 0c ← a * 1d ← min(a, MAX_INT)e ← max(a, a)f ← a &amp; 0xFF..FF (assuming '&amp;' denotes the bitwise operation)