Odwrotny polski wpis: algorytm, metody i przykłady

Odwrotna płyta polska kiedyś stanowiła podstawę świata programisty komputerowego. Dziś nie jest tak znana. Dlatego humorystyczna ilustracja, obrazująca "odwrotność" polskiej kiełbasy poza bułeczkami, wciąż może być niezrozumiała dla niektórych znanych programistów. Nie jest to dobre wytłumaczenie żartu, ale w tym przypadku będzie w pełni uzasadnione.

Infix Record

Wszyscy programiści i większość studentów zna korzystanie z operatorów. Na przykład w wyrażeniu x +, aby dodać wartości zmiennych x i y, używany jest symbol dodawania. Mniej wiadomo, że znak zapożyczony z matematyki, zwany notacją infiksacyjną, jest w rzeczywistości poważnym problemem dla maszyn. Taki operator przyjmuje jako dane wejściowe dwie wartości, zapisane po lewej i po prawej stronie. W programowaniu użycie symboli ze znakami operacyjnymi jest opcjonalne. Na przykład, suma x + y może być zapisana jako funkcję draw (x, y), które ostatecznie przekształca ynfyksnuyu kompilator zapisie. Jednak każdy wie, matematyka zbyt dobre, aby nie używać wyrażeń arytmetycznych, które tworzą coś w rodzaju mini-mowy wewnętrznej prawie każdego języka programowania.


kompilatory formuły

Pierwszy naprawdę udany języka programowania Fortran stało się tak głównie dlatego, że wyrażenie arytmetyczne (tj formuła) okazało (Broadcast) w kodzie, stąd jego nazwa - formuła tłumaczenie. Wcześniej musieli na przykład nagrywaćw postaci funkcji tworzą (a, mnożenie (b, c)). W Kobolu problem implementacji automatycznej transformacji formuł uznano za bardzo trudny, ponieważ programiści musieli pisać takie rzeczy jak Add A To B. Mutliply By C.


Co jest nie tak z infiks?

Problem polega na tym, że operatorzy mają takie właściwości, jak priorytet i łączność. Z tego powodu definicja funkcji infiksowej staje się zadaniem nietrywialnym. Na przykład priorytet mnożenia jest wyższy niż dodawanie lub odejmowanie, co oznacza, że ​​wyrażenie 2 + 3 * 4 nie jest równe sumie 2 i 3 pomnożonej przez 4, tak jak gdyby operatory były wykonywane od lewej do prawej. W rzeczywistości powinieneś pomnożyć 3 na 4 i dodać 2. Ten przykład pokazuje, że obliczanie wyrażeń w postaci infiksów często wymaga zmiany kolejności operatorów i ich operandów. Ponadto musisz użyć nawiasów, aby uwaga była wyraźniejsza. Na przykład (2 + 3) * (4 + 5) nie można zapisać bez nawiasów, ponieważ 2 + 3 * 4 + 5 oznacza, że ​​należy pomnożyć 3 przez 4 i dodać 2 i 5.
Kolejność, w jakiej konieczne jest obliczanie operatorów, wymaga długiego zapamiętywania. Z tego względu uczniowie, początkujący, uczą się arytmetycznie, często uzyskują nieprawidłowe wyniki, nawet jeśli faktyczne operacje są wykonywane prawidłowo. Konieczne jest poznanie procedury operatorów na pamięć. Najpierw należy wykonać akcje w nawiasach, następnie mnożenie i dzielenie, a na końcu dodawanie i odejmowanie. Istnieją jednak inne sposoby pisania wyrażeń matematycznych, ponieważ notacja infiksowa jest tylko jednym z możliwych "małych języków", które można dodać do większego.

Przedrostek i przyrostekNotacja

Dwa z najbardziej znanych wariantów alternatywnych to zapis operatora przed lub po operandach. Są one znane jako zapisy przedrostkowe i przyrostowe. Logika Jana Łukasiewicza wymyśliła pierwszą z nich w latach dwudziestych. Mieszkał w Polsce, więc płyta nazywa się polska. Odmiana Postfiks otrzymała nazwę odwróconej notacji polskiej (OPN). Jedyna różnica pomiędzy tymi dwoma metodami jest kierunek powinieneś przeczytać rekord (od lewej do prawej lub od prawej do lewej), więc niektóre szczegółowo rozważyć tylko jeden z nich. W OPN operator jest rejestrowany po operandach. A więc wyrażenie AB + jest przykładem odwróconego polskiego wpisu dla A + B.

Nieograniczona operandów

Zapis natychmiastowe zaletą jest to, że operator podsumowuje n adycheskym i zapisu ynfyksnaya faktycznie działa tylko z dwóch argumentów, czyli z natury rzeczy jest odpowiedni tylko do operacji binarnych. Na przykład ABC @ jest odwrotnością Polskiej wyrażeniu tryadycheskoho znacznik, który jest wartością maksymalną z A, B i C. W tym przypadku, operator 3 argumentu lewo o siebie i spełnia funkcję połączenia @ (A, B, C). Jeśli spróbujesz napisać znak "@" jako infiks, taki jak A @ BC lub coś podobnego, stanie się jasne, że po prostu nie działa.

Priorytet określa porządek

Odwrotny polski rekord ma jeszcze jedną zaletę, że priorytet operatorów może być reprezentowany przez kolejność ich występowania. W tym przypadku nawiasy nigdy nie będą potrzebne, chociaż można je włączyć jako oznaki operacjikonwersja z notacją infiksów. Na przykład AB + C * jest unikalnym odpowiednikiem (A + B) * C, ponieważ mnożenie nie może być obliczone, dopóki nie zostanie dodany drugi operand dla operacji mnożenia. Oznacza to, że jeśli AB + C * jest obliczane przez jednego operatora na raz, to A B + C * - & gt; (A B +) * C - & gt; (A + B) * C.

Algorytm obliczeń

W OPC operator wygląda tak samo, jak funkcja, która przyjmuje jako dwa argumenty wartości zapisane po lewej stronie. Ponadto jest to naturalna notacja do stosowania w językach programowania, ponieważ przebieg jej obliczeń odpowiada operacjom stosu, a potrzeba analizowania nie istnieje. Na przykład w OPC wyrażenie 5 + 6 * 7 będzie wyglądało jak 567 *, + i można je obliczyć po prostu poprzez skanowanie od lewej do prawej i zapisywanie wartości do stosu. Za każdym razem, gdy zostanie znaleziona transakcja, wybierane są dwa górne elementy pamięci maszyny, operator jest używany, a wynik jest zwracany do pamięci. Po osiągnięciu końca wyrażenia wynik obliczeń pojawi się u góry stosu. Na przykład:
  • S = () 567 *, + postaw 5 na stosie.
  • S =
    6 7 *, + umieścić 6 w stosie.
  • S = (5 6) 7 *, + postaw 7 na stosie.
  • S = (567) *, + wybierz 2 wartości ze stosu, zastosuj * i umieść wynik w stosie.
  • S = (5 6 * 7) = (542) + wybierz 2 wartości ze stosu, zastosuj + i umieść wynik na stosie.
  • S = (5 + 42) = (47) Obliczenia są zakończone, wynik znajduje się na górze stosu.
  • Ten algorytm odwrotnego polerowania można sprawdzić wiele razy, ale za każdym razem będzie działać, niezależnie od tego, ilewyrażenie arytmetyczne jest złożone. OPN i stosy są ze sobą ściśle powiązane. Poniższy przykład ilustruje wykorzystanie pamięci do obliczenia wartości odwróconej notacji polskiej. Mniej oczywiste jest, że można użyć stosu, przekształcając standardowe wyrażenia w postaci infiksów w TNF.

    Przykłady języków programowania

    W języku Pascal odwrotny zapis polski jest wykonywany w przybliżeniu (pokazana część programu). Odczyt numerów i operatorów w pętli nazywa się procedurą, która określa, czy token jest liczbą, czy znakiem operacji. W pierwszym przypadku wartość jest zapisywana na stosie, a w drugiej powyżej dwóch górnych numerów stosu jest wykonywana odpowiednia akcja, a wynik jest zapisywany. toktype: = num; przeczytaj (c); jeśli w ['+', '-', '*', '/'], wtedy zaczynają się, jeśli eoln, a następnie cn: = "else else (cn); jeśli cn = "", to case from of "+": toktype: = add; '-': toktype: = sub; "*": toktype: = me; '/': toktype: = div end else start if c = '-', a następnie sgn: = -1 else error: = z & lt; & gt; "+"; c: = cn koniec; jeśli (nie błąd) i (toktype = num), to getnumber; if toktype & lt; & gt; num then begin: = ro; x: = ro; jeśli nie ma błędu, to case, toktype of add: z: = x + y; sub: z: = x-y; me: z: = x * y; div: z: = x /y koniec push (z); C-realizacja odwrotnego rekordu polskiego (podana jest część programu): for (s = strtok (s, w); s; s = strtok (0 w)) {a = strtod (s & amp; e); jeśli (e) s push (a); #define rpnop (x) printf ("% c:", * s), b = (pop), a = (pop), push (x) else jeśli (* s == '+') rpnop (a + b ); w przeciwnym razie (* s == '-') rpnop (a - b); w przeciwnym razie (* s == '*') rpnop (a * b); w przeciwnym razie (* s == '/') rpnop (a /b); #undef rpnop}

    Realizacja sprzętu

    W czasach, kiedy technologia komputerowa była bardzo droga, dobrym pomysłem było zmuszenie ludzi do korzystania z OPN. W latach sześćdziesiątych, podobnie jak dziś, można było kupić kalkulatory działające na odwrótPolska płyta. Aby dodać 2 i 3, należy wprowadzić 2, a następnie 3 i kliknąć przycisk plus. Na pierwszy rzut oka wprowadzenie operandów do operatora wydawało się trudne i trudne do zapamiętania, ale po pewnym czasie niektórzy byli uzależnieni od tego sposobu myślenia i nie mogli zrozumieć, dlaczego inni nalegają na głupie nagranie, które jest tak złożone i tak ograniczone. Burroughs zbudował nawet komputer typu mainframe, który nie posiadał żadnej innej pamięci RAM oprócz stosu. Jedyne, co zrobił samochód - wykorzystywał algorytmy i metody odwrotnego polskiego zapisu do centralnego stosu. Wszystkie jej operacje zostały uznane za operatorów OPN, których działania zostały rozszerzone do n wyższych wartości. Na przykład komenda Powrót zajęła adres z góry stosu itp. Architektura takiej maszyny była prosta, ale nie wystarczająco szybka, aby konkurować z bardziej ogólnymi architekturami. Wielu jednak nadal żałuje, że takie proste i eleganckie podejście do informatyki, w którym każdy program był wyrazem NPN, nie znalazło kontynuacji. Kiedyś kalkulatory z odwrotną polską płytą cieszyły się popularnością, a niektóre wciąż dają im przewagę. Ponadto opracowano języki zorientowane na stosy, takie jak Forth. Dziś jest mało używany, ale nadal powoduje nostalgię ze strony byłych użytkowników.

    Jaki jest sens żartowania na temat odwróconej polskiej kiełbasy?

    Jeśli wziąć pod uwagę operatora kiełbasy, to w notacji infiksowej powinna ona znajdować się wewnątrz bochenka, tak jak u zwykłych hot-dogów. W odwrotnej polskiej wersji jest po prawejdwie połówki, jest gotowy do przejścia między nimi po obliczeniu. Teraz zaczyna się najtrudniejsza część - musztarda. Jest już na kiełbasie, która jest już liczona jako operator jednoargumentowy. Uważa się, że musztarda powinna być pokazana jako nieuprawna, a zatem powinna zostać przeniesiona na prawo od kiełbasy, ale być może wymaga to zbyt dużego stosu.

    Powiązane publikacje