زنجیره استفاده-تعریف کیست؟ توضیح بده.
زنجیره استفاده-تعریف یک ساختمان داده است که متشکل از استفاده یک متغیر و همه‌ی تعریف‌هایی از آن متغیر است که می‌تواند به آن استفاده بدون مداخله تعریف دیگری برسد. به طور کلی زنجیره استفاده-تعریف به معنی انتساب چند مقدار به یک متغیر است.همتای زنجیره استفاده-تعریف ، زنجیره‌ی تعریف-استفاده است که تشکیل شده‌است از یک تعریف یک متغیر و همه‌ی استفاده‌های آن که قابل دسترسی از آن استفاده بدون مداخله تعریف دیگری است.هر دوی زنجیره‌ی استفاده-تعریف و زنجیره‌ی تعریف-استفاده از یک فرم آنالیز ایستای برنامه به نام آنالیز جریان داده تشکیل شده‌اند. دانستن زنجیره‌های استفاده-تعریف و تعریف-استفاده برای یک برنامه یا زیربرنامه یک پیش‌نیاز برای چند بهینه‌سازی کامپایلر از جمله درهم کردن ثابت و حذف عبارت‌های مشترک است.هدف.درست کردن زنجیره‌ی استفاده-تعریف یا تعریف-استفاده یک گام برای تحلیل متغیر زنده است، که باعث می‌شود نمایش منطقی همه‌ی متغیرها شناخته‌شود و در کد ردیابی شود.تکه کد زیر را در نظر بگیرید:codice_1که همانطور که در کد مشخص است متغیر x سه بار مقداردهی شده‌است.(در نقاط A, B, C) با این که در نقطه‌ای که با "1" مشخص شده‌است زنجیره‌ی استفاده-تعریف برای x باید مشخص کند که مقدار حاضر این متغیر باید از خط B بیاید (و مقدار x در خط B باید از خط A بیاید) اما در نقطه‌ای که با "2" مشخص شده‌است زنجیره‌ی استفاده-تعریف برای x نشان می‌دهد که مقدار حال حاضر این متغیر از C آمده‌است. به دلیل این که مقدار متغیر x در بلاک 2 به هیچ تعریفی از بلاک 1(یا قبل‌تر از آن) بستگی ندارد x ممکن است در آن‌جا متغیری دیگر باشد. در عمل می‌توان گفت یک متغیر دیگر است که ما آن را x2 می‌نامیم.codice_2فرایند تقسیم x به دو متغیر جدا را تقسیم دامنه‌ی زنده می‌نامند. همچنین فرم تخصیص ایستای منفرد را نیز ببینید.برپایی.لیست گزاره‌ها ترتیب مشخصی از گزاره‌ها ارائه می‌دهد.برای یک متغیر مانند "v" تعریف اولیه آن با "V" شناخته می‌شود و برای اختصار تعریف اولیه به شکل s(0) معرفی می‌شود. و البته به طور کلی تعریف اولیه یک متغیر می‌تواند خارج از محدوده انجام شود.(مثال: متغیرهای گلوبال)تعریف یک متغیر.وقتی متغیر "v" در سمت چپ گزاره، مانند s(j) قرار دارد. آن‌گاه s(j) تعریف "v" خواهد شد. هر متغیر "v" حداقل یک تعریف از تعریف اولیه "V"(یا شروع برنامه) دارد.استفاده یک متغیر.اگر متغیر "v" در سمت راست گزاره s(j) باشد. آنگاه یک گزاره s(i) با i&lt;j و min(i-j) وجود دارد که تعریف "v" است و در s(j) استفاده دارد.(یا به اختصار، وقتی متغیر "v" در سمت راست گزاره s(j) قرار دارد آنگاه "v" در گزاره s(j) استفاده دارد.اجرا.فرض کنید لیست مرتب گزاره‌های برنامه را s(j) نام گذاری کنیم و اکنون در حال مشاهده گزاره j ام هستیم: * @param(a, b) The values used to calculate the divisor. * @return The greatest common divisor of a and b.int gcd(int a, int b) { int c = a; int d = b; if (c == 0) return d; while (d != 0) { if (c&gt; d) c = c - d; else d = d - c; return c; &lt;/code&gt;برای یافتن تمام زنجیره‌های تعریف-استفاده مربوط به متغیر d، مراحل زیر انجام دهید:این مراحل را به این شکل تکرار کنید: هر گزاره که در آن خواندن صورت گرفته را با هر گزاره‌ای که در آن نوشتن صورت گرفته ترکیب کنید. (با در نظر گرفتن تغییر مقدار متغیر)نتیجه باید به شکل مقابل باشد:codice_3باید در صورت تغییر مقدار متغیر، اقدام‌های لازم را انجام دهید. برای مثال، از خط ۷ الی ۱۳ در برنامه نوشته شده، متغیر d دوباره تعریف نشده و مقدار آن نیز عوض نشده‌است. در خط ۱۴، این متغیر دوباره مقداردهی شده‌است و ممکن است مقدار جدیدی پیدا بکند. به همین دلیل شما باید این گزاره را با همه گزاره‌های خواندن از d که ممکن است پس از این گزاره اجرا شوند ترکیب کنید و به زنجیره اضافه کنید. در مثال ما، فقط خطوط ۱۰ به بعد امکان اجرا پس از خط ۱۴ را دارند و برای مثال خط ۷ هیچگاه دوباره اجرا نخواهد شد. برای فهم بهتر می‌توانید دو متغیر متفاوت به نام‌های d1 , d2 را تصور کنید و زنجیره آن‌ها را به این شکل محاسبه کنید:codice_4در نتیجه می‌توانید چیزی شبیه برنامه زیر داشته باشید. متغیر d1 می‌تواند با متغیر b جابجا شود.codice_5روش به دست آوردن زنجیره استفاده-تعریف. a) همه تعریف‌های زنده‌ای که در گزاره s(i) استفاده شده‌اند را پیدا کنید. b) ارتباطات بین استفاده ها و تعریف ها را ایجاد کنید. c) گزاره s(i) را به عنوان گزاره تعریف قرار دهید. d) همه تعاریف قبلی را بکشید.با این الگوریتم دو چیز به دست می‌آیند: