Stakalash mashinalarining ishlashdagi kamchiliklari
Xotiraga oid qo'shimcha ma'lumotnomalar
Sanoatdagi ayrimlar stakalash mashinalari registrlash mashinalariga qaraganda vaqtinchalik va mahalliy o'zgaruvchilar uchun ma'lumotni keshlash davrlarini ko'proq bajaradi, deb hisoblashadi.
Stek mashinalarida vaqtinchalik qiymatlar ko'pincha xotirada qoladi, ko'plab registrlarga ega mashinalarda bu vaqtinchalik qiymatlar odatda registrlarda qoladi. (Ammo, bu qiymatlar ko'pincha protsedura ta'rifi oxirida "faollashtirish ramkalariga", asosiy blokga yoki hech bo'lmaganda uzilishlar bilan ishlash paytida xotira buferiga to'kilishi kerak). To'kilgan qiymatlar ko'proq keshlash davrlarini qo'shadi . Ushbu to'kilmaslik effekti stekning yuqori qismidagi qiymatlarni buferlash uchun foydalaniladigan yashirin registrlar soniga, ichki protsedura chaqiruvlarining chastotasiga va xost uzilishlari bilan ishlash tezligiga bog'liq .
Ba'zi oddiy stack mashinalari yoki stack tarjimonlari stekdagi eng yuqori darajadagi apparat registrlaridan foydalanmaydi. Ushbu minimal qo'llanmalar har doim standart registr mashinalariga qaraganda sekinroq. Odatda ifoda kabi X + 1 , deydilar uchun LOAD X ; 1- yuk ; Qo'shish . Bu keraksiz bo'lgan xotira to'plamiga yashirin yozishni va o'qishni ta'minlaydi:
X-ni yuklang, xotirani bosing
1-ni yuklang, xotiraga suring
Pop , xotiradan 2 qadriyatlarni qo'shing va surish xotirasiga natija
ma'lumotlar keshiga jami 5 ta havola.
Keyingi qadam - bu bitta yuqori darajadagi stek registriga ega stak mashinasi yoki tarjimon. Keyin yuqoridagi kod buni amalga oshiradi:
X-ni bo'sh TOS registriga yuklang (agar u apparat mashinasi bo'lsa) yoki
TOS registrini xotiraga suring, TOS registriga X ni yuklang (agar tarjimon bo'lsa)
TOS registrini xotiraga suring, TOS registriga 1 ni yuklang
Chap operandni xotiradan tortib oling, TOS registriga qo'shing va u erda qoldiring
jami 5 ta ma'lumot keshiga havola, eng yomon holat. Odatda, tarjimonlar bo'sh joyni kuzatmaydilar, chunki bunga hojat yo'q - stek ko'rsatgichi ostidagi narsa bo'sh emas va TOS kesh registri har doim issiq. Biroq, odatdagi Java tarjimonlari stekning yuqori qismini buferlamaydi , chunki dastur va stek ma'lumotlarning qisqa va keng qiymatlari aralashmasiga ega.
Agar simli stek mashinasida xotira to'plamining eng yuqori so'zlarini keshlash uchun N registrlar mavjud bo'lsa, unda bu misolda barcha to'kilmasin va to'ldirilmasin va faqat bitta ma'lumotni keshlash davri bor, xuddi registrda yoki saqlash mashinasida bo'lgani kabi.
Optimallashtiruvchi kompilyatorlardan foydalanadigan mashinalar registrlarida ko'pincha eng ko'p ishlatiladigan mahalliy o'zgaruvchilar stek freymlaridagi xotira joylarida emas, registrlarda qoladi. Bu ushbu qiymatlarni o'qish va yozish uchun ma'lumotlar keshlash davrlarining ko'pini yo'q qiladi . O'zgaruvchan jonli tahlilni o'tkazish va shu bilan asosiy o'zgaruvchilarni uzoq vaqt davomida stakka saqlash uchun "stek rejalashtirish" ni ishlab chiqish bu muammoga yordam beradi.
Boshqa tomondan, ro'yxatga olish mashinalari ko'plab registrlarni ichki protsedura qo'ng'iroqlari orqali xotiraga o'tkazishlari kerak. Qaysi registrlar to'kilishi va qachon yig'ilishi to'g'risida qaror dinamik ravishda qo'ng'iroq chuqurligida emas, balki kompilyatsiya vaqtida qabul qilinadi. Bu rivojlangan stack mashinasini amalga oshirishga qaraganda ko'proq ma'lumot keshini tashishiga olib kelishi mumkin .
Do'stlaringiz bilan baham: |