Page 51 - 4761
P. 51

Обчислення виразу, записаного у формі тріад, відбувається послідовно: операція,
                  задана  тріадою,  виконується  над  операндами,  а  якщо  в  якості  одного  з  операндів  (або
                  обох) виступає посилання на другу тріаду, то береться результат обчислення тої тетради.

                            Приклад 4.2. Вираз A:=B*C+D-B*10, запишемо у вигляді тетрад.
                         1.     *(B, C)
                         2.     +(C^1, D)
                         3.     *(B, 10)
                         4.     –(^2, ^3)
                         5.     :=(A,^4), де ^ – посилання тріади на результат другої
                         Це  машино-незалежна  форма  ВПП.  Вимагає  менше  пам’яті  для  свого
                  представлення  і  відображають  взаємозв’язок  операцій  між  собою.  Вони  ближчі  до
                  двоадресних машинних команд.

                         Зворотній  польський  запис.  В  цьому  запису  знаки  операцій  записуються
                  безпосередньо  за  операндами.  Порівняно  зі  звичайним  записом  операцій  в  польському
                  записі операнди розміщуються в тому ж порядку, а знаки операцій – строго в порядку їх
                  виконання. Той факт, що в цій формі запису всі операції виконуються в тому порядку, в
                  якому  вони  записані,  робить  її  дуже  зручною  для  обчислення  виразів  на  комп’ютері.
                  Польський запис не потребує враховувати пріоритет операцій, в ній не використовуються
                  дужки, і в цьому його основна перевага.
                         Він дуже ефективний, коли для обчислення використовується стек.
                         Головний  недолік  зворотного  польського  запису  виходить  з  методу  обчислення
                  виразів в ньому: оскільки використовується стек, то для роботи з ним завжди доступна
                  тільки верхівка стеку, а це викликає додаткові труднощі при оптимізації виразів в формі
                  зворотного польського запису. Практично вони не піддаються оптимізації.
                         Але  там,  де  оптимізація  виразів  не  потрібна  або  не  має  великого  значення,
                  зворотній  польський  запис  є  дуже  зручним  методом  внутрішнього  представлення
                  програми.
                         Зворотній  польський  запис  був  запропонований  спершу  для  обчислення
                  арифметичних виразів. Але цим його застосування не обмежується. В компіляторі можна
                  породжувати код в формі зворотного польського запису для обчислення практично любих
                  виразів. Для цього достатньо ввести знаки для, які передбачають обчислення  відповідних
                  операцій.  В  тому  числі  можна  ввести  операції  умовного  та  безумовного  переходу,  які
                  передбачають  зміну    послідовності  ходу  обчислень  і  переміщення  вперед  або  назад  на
                  деяку кількість кроків в залежності від результату на верхівці стеку.
                         Польський  зворотній  запис  широко  використовується  для  обчислення  виразів  в
                  інтерпретаторах,  де  оптимізація  обчислень  або  відсутня  зовсім  або  не  має  суттєвого
                  значення.
                         Обчислення  виразів  в  зворотному  польському  записі  іде  елементарно  просто  за
                  допомогою стеку. Для цього вираз переглядається а порядку зліва направо і елементи, які
                  зустрічаються в ньому, обробляються за наступними правилами:
                         1.     Якщо зустрічається операнд то він поміщується в стек (попадає у верхівку
                  стеку).
                         2.     Якщо  зустрічається  знак  упорної  операції  (операції,  яка  потребує  одного
                  операнда),  то  операнд  вибирається  з  верхівки  стеку,  операція  виконується  і  результат
                  поміщається в стек (попадає у верхівку стеку).
                         3.     Якщо зустрічається знак бінарної операції, то два операнда вибираються з
                  верхівки стеку, операція виконується і результат поміщається в стек (верхівку стеку).
                         Обчислення виразу закінчується, коли досягається кінець запису виразу. Результат
                  обчислення при цьому завжди знаходиться у верхівці стеку.



                                                                49
   46   47   48   49   50   51   52   53   54   55   56