Computer, Software
De Reverse polnesche Rekord: Algorithmus, Methoden a Beispiller
De Reverse polnesche Rekord war eemol d'Basis vun der Welt vum Computerprogrammierer. Haut ass et net sou gutt bekannt. Duerfir kann e Comic-Illustratioun, déi "poland" Polkeschkäse ausserhalb vum Buedem duerstellt, ëmmer nach muncheg kompetent Programméierer misferstinn. Et ass net ganz gutt fir den Witz z'erkläeren, mä an dësem Fall ass et ganz gerechtfäerdegt.
Infix-Säit
All Programméierer an déi meescht Studenten si mat der Benotzung vun de Betreiber vertraut. Zum Beispill am Expression x + y gëtt d'Zousatzbetraff benotzt fir d'Wäerter vun de Variablen x a y ze summen. Manner gutt bekannt ass datt dës Ausgrenzung vun der Mathematiker Bezeechnung, sougenannter Infix Notation, ass e grousst Problem fir Maschinnen. Dëse Betreiber fënnt als Input zwee Wäerter, déi lénks a riets ofgeschriwwe sinn. An der Programmatioun ass et net néideg fir en Notaire mat Operatiounsschilder ze benotzen. Zum Beispill kann x + y als Funktioun geschriwwe ginn fir (x, y) ze ginn, op déi de Compiler lues a lues d'Infix Notation ëmsetzt. All Mënsch weess datt Mathematik ze gutt fir d'Arithmetesch Ausdréck ze benotzen, déi eng quasi intern Mini-Sprooch an bal all Programméierungsseg bilden.
Iwwersetzer vun Formelen
Déi éischt wierklech erfollegräich Fortran Programméierungssprooch ass sou grondsätzlech, well d'arithmetesch Ausdrock (d.h. d'Formelen) an et ëmgewandelt gouf (iwwersat) an de Code, also säi Numm - FORMula TRANslation. Virun ze musse geschriwwe ginn, zum Beispill, an der Form vun Funktiounen (a, multiplizéieren (b, c)). Bei Kobol gouf d'Problem vun der automatescher Ënformungsformuléierung als ganz schwiereg ugesinn, well d'Programméierer d'Saachen unzepassen wéi Add A to B Mutliply By C.
Wat ass falsch mam Infix?
De Problem ass datt d'Betreiber Eegeschafte wéi Prioritéit an Associativitéit hunn. Dofir ass d'Definitioun vun der Funktioun vum Infixe eng onontologesch Aufgab. Zum Beispill ass d'Vernetzung Prioritéit méi héich wéi d'Addition oder d'Subtraktioun, an dat heescht datt den Ausdruck 2 + 3 * 4 net d'selwecht ass wéi d'Summe vu 2 an 3 mat 4 multiplizéiert, wéi wär et de Fall wann d'Operatoren vu lénks op riets gemaach. Tatsächlech, multiplizéieren 3 ëm 4 a addéieren 2. Dëst Beispill illustréiert datt d'Auswertung vun engem Infix Expression oft Verännerung vun der Operatioun a vun hiren Operanden ännert. Zousätzlech musse mir Klammeren benotzen fir d'Notation méi kloer ze maachen. Zum Beispill, (2 + 3) * (4 + 5) kann net ouni Klammern geschriwwe ginn, well 2 + 3 * 4 + 5 heescht datt Dir 3 duerch 4 multiplizéiert ass a 2 a 5 addéieren.
D'Reiefolg an deem d'Betreiber berechent ginn, erfuerdert eng laang Memorisatioun. Wéinst dës Studenten, déi ufänken d'Arithmetik ze léieren, kréien oft falsch Resultater, och wann d'Operatiounen richteg funktionnéieren. Et ass néideg fir d'Akzeptatioun vun den Akten vu Betreiber vum Herzen ze léieren. Als éischt, d'Aktiounen an Klammern, dann d'Multiplikatioun an d'Division, an endlech Additioun a Subtraktioun muss ugewannt ginn. Mee et ginn aner Weeër fir mathematesch Ausdréck ze schreiwen, well Infix-Notation just eng vun de méiglechen "kleng Sproochen" ass, déi zu méi kënne hinzeweisen.
Präfix an Postfix Notation
Déi zwee populär Alternativen sinn d'Opzeechnung vun engem Operateur virun oder no hir Operanden. Si ginn bekannt als Préfix an Postfix Notatiounen. Logiker Jan Lukasevich erfonnt d'éischt vun hinnen an den 1920er Joren. Hien huet zu Polen geliewt, also ass de Rekord polnesch genannt. D'Postfix-Versioun respektiv d'Wuertversécherung (OPN) genannt. Deen eenzegen Ënnerscheed tëscht den zwou Methoden ass an der Richtung wou d'Eruewerung gelies sollt (lénks oder riets nach lénks), also ass et genuch fir een eenzegen Detail ze berücksichtegen. Am OPN gëtt de Betreiber hannert hiren Operanden geschriwwen. Dofir ass den Ausdrock AB + e Beispill vun engem Reverse polnesche Rekord fir A + B.
Onbegrenzte Zuel vu Operen
De direkten Virdeel vun der Notation ass datt et vum n-adic-Operator generaliséiert gëtt an d'Infix-Notation funktionéiert eigentlech mat nëmmen zwee Operanden, dat heescht et ass aus senger Natur nëmmen e binär Operatioun. Zum Beispill ass ABC @ en inverse Polnisch Ausdrock benotzt mat dem triadesche Schëld, deen den maximalen Wäert vun A, B an C. fënnt. An dësem Fall fiert de Operateur op déi 3 Opernee lénks u sech an entsprécht dem Ruff vun der Funktion @ (A, B, C). Wann Dir probéiert de @ Symbol als Infix ze schreiwen, zum Beispill A @ BC oder eppes wéi dat, da gëtt et kloer, datt dëst einfach net funktionnéiert.
Prioritéit gëtt vun der Uerdnung
En inversesche polnesche Rekord huet ee méi Virdeel, datt d'Prioritéit vun de Betreiber duerch d'Uerdnung vun hirem Erscheinungsbild vertruede sinn. Parentheses ginn ni gebraucht, obwuel si als Transaktiounssymbole bezeechent ginn, fir den Umbau mat enger Infix Notation z'erliichteren. Zum Beispill ass AB + C * e gläicht Äerwert (A + B) * C, well d'Multiplizéierung net berechne kann bis d'Additioun fäerdeg ass, wat den zweeten Operand fir d'Operatioun vu Multiplikatioun gitt. Dat ass, wann AB + C * fir eng Operatioun zu enger Zäit berechent gëtt, da kréie mir AB + C * -> (AB +) * C -> (A + B) * C.
De Rechnungsalgorithmus
An OPN, funktionnéiert de Bedreiwer wéi eng Funktioun, déi als Argumenter zwee Wierder geschriwwe steet. Zousätzlech ass dat eng natierlech Notzung fir d'Benotzung an der Programmiersprache, well de Kurs vu senge Rechnungen entsprécht Stack Operatiounen an d'Notzung fir d'Analyse gëtt eliminéiert. Zum Beispill, am ARS gëtt den Ausdrock 5 + 6 * 7 wéi 5, 6, 7 *, + a gesäit aus a kann einfach berechtegt vu scannt vu lénks op riets a schreift Wäerter am Stack. All Kéier wann de Betribszeichen opgefouert gëtt, ginn déi 2 ieweschte Elementer aus dem Maschinn Gedrénks ausgewielt, gëtt de Betreiber ugewandt an d'Resultat ass erëm an d'Erënnerung zréckgezunn. Wann d'Enn vum Ausdrock erreecht gëtt, gëtt d'Resultat vun der Berechnung am Top vun der Stack.
Zum Beispill:
- S = () 5, 6, 7, *, + 5 am Stack setzen.
- S = (5) 6, 7, *, + 6 fir de Stack.
- S = (5, 6) 7, *, + 7 op der Stack.
- S = (5, 6, 7) *, + wielt 2 Wäerter aus dem Stack, luedt * a léisst de Resultat op de Stack setzen.
- S = (5, 6 * 7) = (5, 42) + wielt 2 Wäerter aus dem Stack, luedt + a léisst de Resultat op de Stack setzen.
- S = (5 + 42) = (47) d'Berechnung fält komplett, d'Resultat ass am Top vun der Stack.
Dëse Algorithmus vum reversepolesche Rekord kann e puer Mol kontrolléiert ginn, awer all Kéier wann et geschafft gëtt, egal wéi komplex den arithmetesche Ausdrock ass.
D'Réckgrécklung an d'Stécker si mateneen verbonnen. Dëst Beispill ass bewisen, wéi e Gedächtnis benotzt ka mat dem Wäert an der inverspolitescher Notzung ze berechnen. Et ass manner kloer datt Dir de Stack benotzt, andeems Dir Standard-Infix-Ausdréck fir d'Verzeechnung ëmsetzt.
Beispiller an der Programmiersprache
Am Pascal gëtt de Réckverse polnesche Rekord annäherend sou wéi (de Deel vum Programm gegeben).
Fir Zuelen an Operatoren an enger Loop ze liwweren, gëtt eng Prozedur genannt, déi bestëmmt, ob de Token eng Zuel oder e Operatiounsschëld ass. Am éischte Fall gëtt de Wäert op de Stack geschriwen, an am zweeten Fall entsprécht déi korrespondéiert Aktioun op déi zweet Nummer vun der Stack an d'Resultat ass gespuert.
Toktype: = num;
Liest (c);
Wann Dir mat [[+ +, '-', '*', / /] beginn
Wann eoln dann cn: = '' soss liest (cn);
Wann cn = '' dann
Fall mat
'+': Toktype: = add; '-': toktype: = sub;
'*': Toktype: = mul; '/': Toktype: = div
Enn
Else fänken un
Wann c = '-' dann sgn: = -1 Aner Feeler: = c <> '+';
Mat: = cn
Enn
Enn;
Wann (net Feeler) an (toktype = num) dann nummeréieren;
Wann Toktyp <> num da fänkt un
Y: = po; X: = po;
Wann net falsch dann
Case toktype vun
Add: z: = x + y; Sub: z: = x -y; Mul: z: = x * y; Div: z: = x / y
Enn
Push (z);
C-Implementatioun vum Réckpolitesche Rekord (Deel vum Programm gëtt):
Fir s '= strtok (s, w); s; s = strtok (0, w)) {
A = Strtod (s, & e);
Wann (e> s) dréckt (a);
#define rpnop (x) printf ("% s:", * s), b = pop (), a = pop (), push (x)
Else wann (* s == '+') rpnop (a + b);
Else wann (* s == '-') rpnop (a - b);
Else wann (* s == '*') rpnop (a * b);
Else wann (* s == '/') rpnop (a / b);
# Sinnf rpnop
}}
Hardware - Implementatiounen
Awer dës Deeg, wou d'Computertechnologie ganz deier war, war et eng gutt Iddi fir d'Leit ze benotze fir OPN ze benotzen. An de 60er Joren, wéi haut, war et méiglech, Taschenlëschten ze kafen, déi an der Reverse Polnescher Aufgab funktionnéieren. Fir 2 a 3 ze addéieren, gitt 2, dann 3 a dréckt d'Plus Taste. Op den éischte Bléck sinn d'Input vun de Operne'en zum Betreiber komplizéiert an schwéier ze erënneren, mee no enger Zäit gouf süchteg op dës Manéier gedréckt a konnt net verstanen firwat anerer op engem ongewollt Infix-Record besteet, dee sou komplizéiert an esou limitéiert ass.
D'Burroughs hunn souguer e Mainframe gebaut, deen net aner RAM huet, ausser den Stack. Déi eenzeg Saach, déi d'Maschinn gemaach huet, ass Algorithmen a Methoden vum richtege polnesche Schreifweis op den zentrale Stack. All seng Operatiounen hu sech als OPN Operatoren uginn, deenen hir Akt op n méi héich Wäerter verlängert gouf. Zum Beispill huet de Réckbefehl eng Adress vun der Spëtzt vum Stack ugeholl. D'Architektur vun esou enger Maschinn war einfach, awer net séier genuch fir mat méi genereller Architektur ze konkurréieren. Vill awer bedauere nach ëmmer datt esou e einfache an elegante Approche zur Berechnung, wou all Programm en Ausdrock vu OPN war, huet seng Fortsetzung net fonnt.
Eenzelne Rechnen mat Reverse polnesche Recording waren populär, a verschidde si et ëmmer nach léiwer. Ausserdeem goufen Stack-orientéiert Sproochen wéi Forth entwéckelt. Heute ass et wéineg net benotzt, mee verursacht ëmmer Nostalgie vu senger fréierer Benotzer.
Also wat ass de Punkt vun der Witz op der Polnescher Sauce?
Wann Dir den Zoossoperateur berücksichtegt, dann bei Infix-Notation da sollt et an der Roll sinn, wéi am normalen Hot Dog. Am ëmgekéierte polnesche Rekord ass et op der rietser Säit vun den zwou Hallefmëschten, déi bereet sinn tëschent dës no der Rechnung. Elo fänkt der schwieregste Deel - Senf. Et ass schon op der Wipp, dat heescht et ass schonn als ennerierlecht Operator berechent. Et ass eng Meenung, datt de Senf och als onefinéiert agefouert ginn an dofir soll de Recht op d'Wurst bewegt ginn ... Mee vläicht ass et zevill Stack ze huelen ...
Similar articles
Trending Now