کدهای سه آدرسی
کدهای سه آدرسی
در علوم کامپیوتر، کدهای سه آدرسی (اغلب به اختصار 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 حلقه مربعهای اعداد ۹–۰ را ذخیره میکند. |
کدهای سه آدرسی ممکن است پرشهای شرطی و بدون شرط و روشهای دسترسی به حافظه داشته باشد. همچنین ممکن است از روش فراخوانی توابع که ممکن است آنها را به پرش کاهش دهد. به این ترتیب، کدهای سه آدرسی ممکن است در تجزیه و تحلیل و کنترل جریان مفید باشند. |
...
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: |
منابع
[ویرایش]ویکیپدیای انگلیسی[۱]