کدهای سه آدرسی

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

کدهای سه آدرسی

در علوم کامپیوتر، کدهای سه آدرسی (اغلب به اختصار TAC یا 3AC ) به عنوان کد میانی استفاده می شوند تا با کمک بهینه سازی کامپایلر اجرای کد را بهبود بخشند. هر دستور العمل TAC حداکثر سه عملوند دارد و به طور معمول ترکیبی از انتساب و یک عملگر باینری است .برای مثال : t1 := t2 + t3 .این نام برگرفته از استفاده از سه عملوند است ، ولی ممکن است حتی دستورالعمل با عملوند کمتر نیز وجود داشته باشد. از آنجا که کد سه آدرسی به عنوان یک زبان میانی در کامپایلر استفاده می شوند، عملوندها به احتمال زیاد آدرسهای حافظه ی پایه یا ثبات های پردازنده نیستند، اما آدرس های نمادین به آدرس واقعی در تخصیص ثبات ترجمه خواهند شد. از آنجایی که کدهای سه آدرسی توسط کامپایلرها تولید می شوند، غیر معمول نیست که عملوندها به صورت دنباله ای از شماره ها به ترتیب نام گذاری شوند.

پالایش کد سه آدرسه به فرم واگذاری ثابت است.

مثال[ویرایش]

در این مثال، یک محاسبه از چند محاسبه ی کوچکتر تشکیل شده است. در کد سه آدرسی، این امر می تواند به چند دستورالعمل جداگانه شکسته شود. این دستورالعمل ها آسان تر به زبان اسمبلی ترجمه می شوند. برای شناسایی اشتراکات زیر عبارات برای کوتاه کردن کدها مناسبتر هستند .
 [[Calculate one solution to the [[quadratic equation#
 (x = (-b + sqrt(b^2 - 4*a*c)) / (2*a)

t1 := b * b
t2 := 4 * a
t3 := t2 * c
t4 := t1 - t3
t5 := sqrt(t4)
t6 := 0 - b
t7 := t5 + t6
t8 := 2 * a
t9 := t7 / t8
x := t9

در این مثال شبه کد C حلقه مربع های اعداد 9-0 را ذخیره میکند.

کد های سه آدرسی ممکن است پرش های شرطی و بدون شرط و روش های دسترسی به حافظه داشته باشد. همچنین ممکن است از روش فراخوانی توابع که  ممکن است آنها را  به پرش کاهش دهد. به این ترتیب، کدهای سه آدرسی ممکن است در تجزیه و تحلیل و کنترل جریان مفید باشند.

...
for (i = 0; i <10; ++i) {
    b[i] = i*i; 
}
...
     t1 := 0                ; initialize i
L1:  if t1>= 10 goto L2    ; conditional jump
     t2 := t1 * t1          ; square of i
     t3 := t1 * 4           ; word-align address
     t4 := b + t3           ; address to store i*i
     *t4 := t2              ; store through pointer
     t1 := t1 + 1           ; increase i
     goto L1                ; repeat loop
L2:

منابع[ویرایش]

ویکی‌پدیای انگلیسی [۱]