Notația poloneză inversă (RPN ) este o formă de scriere a expresiilor matematice și logice în care operanzii sunt localizați înaintea semnelor operației . De asemenea, denumită notație inversă fără paranteze , notație postfixă , simbolismul lui Lukasiewicz fără paranteze , notație inversă poloneză , POLIZ .
O mașină de stivă este un algoritm care efectuează calcule folosind notația poloneză inversă (vezi mai jos un exemplu de evaluare a expresiilor ).
Notația poloneză inversă (RPN) a fost dezvoltată de filozoful și teoreticianul computerului australian Charles Hamblin la mijlocul anilor 1950, pe baza notației poloneze , care a fost propusă în 1920 de matematicianul polonez Jan Lukasiewicz . Lucrarea lui Hamblin a fost prezentată la o conferință în iunie 1957 și publicată în 1957 și 1962 .
Primele computere care au suportat notația inversă poloneză au fost KDF9 de la English Electric Company , care a fost anunțată în 1960 și lansat (a apărut pentru vânzare) în 1963 , și americanul Burroughs B5000 , anunțat în 1961 , lansat în același 1963. designerii B5000, R. S. Barton , au scris mai târziu că a dezvoltat notația poloneză inversă independent de Hamblin în jurul anului 1958, în timp ce citea o carte despre logica simbolică și înainte de a se familiariza cu opera lui Hamblin.
Friden a adus descărcătorul de supratensiune la calculatoarele desktop cu EC-130 din iunie 1964. Și în 1968, inginerii Hewlett-Packard au dezvoltat calculatorul de birou 9100A cu suport pentru descărcător de supratensiune. Acest calculator a făcut ca notația poloneză inversă să fie populară printre oamenii de știință și ingineri, chiar dacă anunțul 9100A timpuriu nu menționa descărcătorul de supratensiune. În 1972 , calculatorul HP-35 SPD a devenit primul calculator științific de buzunar .
În 1971, a apărut limbajul de programare original Forth , a cărui mașină de limbaj are o structură cu două stive și în care toate calculele sunt efectuate pe stivă . În acest limbaj, OPN este o modalitate naturală de a scrie orice operațiuni de date, deși este posibil, dacă se dorește, să se implementeze notația obișnuită ( infixă ) a operațiilor aritmetice.
Descărcătorul a fost folosit în calculatorul de inginerie sovietic B3-19M (dezvoltat în comun cu RDG), lansat în 1976. Toate microcalculatoarele programabile produse în URSS până la sfârșitul anilor 1980 , cu excepția Elektronika MK-85 și Elektronika MK-90 , foloseau un descărcător - a fost mai ușor de implementat și a făcut posibil să se descurce în calculele de programare cu un dispozitiv mai mic. numărul de comenzi, în comparație cu notația algebrică obișnuită, iar cantitatea de memorie de program din aceste modele a fost întotdeauna o resursă critică. Descărcătorul este utilizat în calculatoarele programabile rusești moderne „ Elektronika MK-152 ” și „ Elektronika MK-161 ”, ceea ce asigură compatibilitatea acestora cu programele scrise pentru calculatoarele sovietice.
Pentru a da o definiție inductivă a notației postfixe [1] , să notăm expresii în notație infixă , , , expresiile lor echivalente în notație postfixă , , respectiv; este un operator binar arbitrar, atunci:
1. Dacă - o variabilă sau o constantă, adică .
2. Dacă este o expresie de forma , adică .
3. Dacă este o expresie de forma , adică .
O caracteristică distinctivă a notației poloneze inverse este că toate argumentele (sau operanzii ) sunt plasați înaintea semnului operației. În general, înregistrarea arată astfel:
De exemplu, luați în considerare evaluarea unei expresii 7 2 3 * −(expresia echivalentă în notație infixă: 7 − 2 * 3).
O extensie evidentă a notației poloneze inverse la operații unare, ternare și cu orice alt număr de operanzi: atunci când se utilizează semnele unor astfel de operații în evaluarea unei expresii, operația este aplicată numărului corespunzător de ultimii operanzi întâlniți.
Caracteristicile notației poloneze inverse sunt următoarele:
Automatizarea evaluării expresiilor în notație poloneză inversă se bazează pe utilizarea unei stive . Algoritmul de calcul pentru mașina de stivă este elementar:
Implementarea unei mașini de stivă, atât în software cât și în hardware, este extrem de simplă și poate fi foarte eficientă. Notația poloneză inversă este complet unificată - practic scrie operații unare, binare, ternare și orice alte operațiuni, precum și apeluri de funcții în același mod, ceea ce permite să nu complice proiectarea dispozitivelor de calcul în timp ce extinde setul de operațiuni acceptate. Acesta a fost motivul pentru utilizarea notației poloneze inverse în unele calculatoare științifice și programabile.
O expresie infixă într-un GRE poate fi scrisă astfel: 1 2 + 4 × 3 +
Calculul se face de la stânga la dreapta, intrarea este interpretată așa cum este indicat în tabelul de mai jos (este indicată starea stivei după operație, partea de sus a stivei este evidențiată cu roșu ):
Intrare | Operațiune | Grămadă |
---|---|---|
unu | pus pe stivă | unu |
2 | pus pe stivă | 1, 2 |
+ | plus | 3 |
patru | pus pe stivă | 3, 4 |
* | multiplicare | 12 |
3 | pus pe stivă | 12, 3 |
+ | plus | cincisprezece |
Rezultatul, 15, este în vârful stivei la sfârșitul calculului.
Tasta „Enter” (notată pe calculatoare ca „Enter” sau simbolul „↑”) acționează ca un separator de operanzi atunci când doi operanzi sunt imediat adiacenți unul celuilalt. Dacă operandul este urmat de semnul operației , atunci apăsarea acestuia nu este necesară, aceasta reduce numărul de acțiuni care trebuie efectuate pentru a obține rezultatul.
Edsger Dijkstra a inventat un algoritm pentru conversia expresiilor din notația infixă în IPV. Algoritmul a fost denumit „centre de triaj”, pentru asemănarea operațiunilor sale cu ceea ce se întâmplă la stațiile de triaj feroviar. Notația infixă este forma de notație matematică pe care o folosesc majoritatea oamenilor (de exemplu, 3 + 4sau 3 + 4 * (2 − 1)). La fel ca algoritmul de calcul SPV , algoritmul de triaj se bazează pe o stivă. Există două variabile de text implicate în conversie: șiruri de intrare și de ieșire. Procesul de conversie folosește o stivă care stochează operațiuni care nu au fost încă adăugate la șirul de ieșire. Programul de conversie citește șirul de intrare caracter cu caracter în secvență (un caracter nu este neapărat o literă), efectuează unele acțiuni la fiecare pas, în funcție de caracterul citit.
Intrare:3 + 4
Adăugați 3la linia de ieșire (dacă este citit un număr, acesta este adăugat imediat la linia de ieșire).
Împingeți +(sau identificatorul acestuia) pe stiva de operații.
Adăugați 4la linia de ieșire.
Am citit întreaga expresie, acum împingem toate operațiunile rămase pe stivă la linia de ieșire. În exemplul nostru, stiva conține doar +.
Linie de ieșire:3 4 +
În acest exemplu, apar câteva reguli: toate numerele sunt transferate pe linia de ieșire imediat după citire; când expresia este citită complet, toate operațiunile rămase pe stivă sunt împinse la linia de ieșire.
Algoritmul presupune că șirul sursă este corect (nu toate erorile sunt verificate), iar toate funcțiile de prefix/postfix sunt unare.
Consultați articolul principal pentru o modificare pentru funcțiile cu mai multe locuri cu un număr fix de argumente .
Pentru operațiuni precum -x care sunt atât binare, cât și unare, este necesară o modificare: atunci când se găsește o astfel de operație, sistemul se uită la caracterul anterior și determină dacă minusul este o operație binară sau o funcție unară. În consecință, stiva și NPV au nevoie de simboluri diferite pentru minusul binar și unar.
Dacă scrieți un interpret, atunci șirul de ieșire obținut după conversia expresiei originale în notație poloneză inversă poate fi stocat în locul expresiei originale pentru interpretare ulterioară. Notația poloneză inversă permite, de asemenea, computerului să simplifice expresiile.
Luați în considerare un algoritm care realizează precalcularea constantelor dintr-o expresie. O expresie este dată în OPN. Avem nevoie de o stivă pentru a stoca date mixte (numere și operatori).
Algoritmul este similar cu cel folosit pentru evaluarea expresiilor. Scanăm expresia de la stânga la dreapta.
Atâta timp cât există personaje de citit:
După ce întreaga expresie a fost examinată, ceea ce rămâne pe stivă este expresia optimizată (instrucțiunile expresiei sunt în ordine inversă pe stivă).
Această metodă, evident, nu include toate metodele posibile de optimizare.
Articolul „ Notația poloneză inversă: exemple de implementare ” conține exemple de implementare a notației poloneze inverse în diferite limbaje de programare.
Ca aplicație practică a acestei tehnici, putem cita organizarea configurațiilor bytecode ale soluțiilor de aplicație ale sistemului 1C:Enterprise . 1C nu oferă confirmare oficială , dar utilizatorii acestui sistem pe forumuri specializate oferă dovezi și algoritmi care permit decompilarea textelor sursă.
Limbaje de programare care folosesc OPN ca principal: