"rpnproc" - RPN procesor




Pár slov úvodem

V programátorské praxi čas od času vyvstane požadavek na změnu postupu v numerickém výpočtu podle alternativního použití programu, který takové výpočty provádí. Možností, jak se s takovým zadáním vypořádat, je několik:

Už první letmý pohled na předcházející řádky dává tušit, že (záměrně) vynechaná varianta typu "Zdrojáky přece změním a znova přeložím, né? Tak v čem je problém, vole???" je mimo rámec uvažování autora tohoto textu.

Další (už vyjmenované) možnosti nabízejí výrazně elegantnější metody. První dvě jsou si svým způsobem hodně podobné: je vcelku lhostejno, je-li část programu (před jeho spuštěním) v jiném nebo stejném souboru na disku. Charakteristickou vlastností obou způsobů je fakt, že kód (program) musí být předem přeložen překladačem programovacího jazyka. Jakákoliv změna zamýšlená "v poli" bez možnosti použití vývojových prostředků (assembler, linker, ...) je vyloučena.


Proč interpret?

Poslední z nabízených možností je právě ta, která zmíněnou flexibilitu nabízí. Je třeba změnit chování zařízení tak, že hodnotu vyčtenou z HW je třeba před odesláním jinému programu nebo dalším zpracováním vynásobit čtyřmi a maskovat číslem 0x01FF místo dosavadního pouhého násobení dvěmi? Žádný problém. Stačí použít jakýkoliv textový editor a před spuštěním inkriminovaného programu příslušné řádky souboru s početním postupem upravit nebo doplnit!

Nic však není zadarmo. Za tuto prudkou eleganci je třeba smířit se se zaplacením daně ve formě vyšších nároků na výpočetní výkon použitého počítače. Dá rozum, že strojový kód generovaný překladačem jazyka "C" bude vždy výrazně rychlejší než sebedokonalejší interpretace nějakého pseudokódu. Je však na zodpovědnosti programátora používajícího interpret, zda-li ho "dá do cesty" nicotnému množství dat zpracovávaných jednou za stovky milisekund, nebo toku třeba obrazových dat z kamery s vyšším rozlišením. Nikdo nemusí být specialistou na interpretery, aby jasně neviděl potenciální neúspěch (nebo alespoň velké potíže) v případě druhé ze jmenovaných možností.

V duelu "spotřeba strojového času" vs. "operabilita" budiž na obranu RPN procesoru uvedeno následující: Navzdory tomu, že vstupem definujícím program je text, interpretovaný kód je binární. Zejména v případě číselných konstant v programu se to jeví jako výrazné ulehčení pro CPU. Bylo by opravdu hloupé každé číslo převádět z textové formy do binární, obzvláště v případě mnohonásobných iterací...


Proč RPN?

Odpověď je částečně naznačena již v předchozím odstavci. Implementace RPN (pro neznalé - je detailní popis buď zde nebo tady) je nepoměrně méně náročná (z hlediska zátěže CPU) než tradiční algebraický systém. Žádné rozebírání priorit operátorů, žádné nevyřízené operace díky závorkám. Nic takového. Zde stačí pouhé zadání jednoho nebo dvou operandů (podle typu operace) a provedení příslušné operace. Jednodušší a jednoznačnější systém zpracování číselných dat opravdu nemůže být.


Provedení interpreteru aneb jak se to používá

Pokud má být nějaký produkt snadno použitelný, musí splňovat alespoň jedno z následujících kritérií:

Zde popisovaný RPN procesor ve formě knihovního modulu pro různé OS oba požadavky splňuje vrchovatě. Osvojit si systém RPN je pro technika, který se s ním nikdy nesetkal, otázkou nejvýše jednoho odpoledne. Pro ostatní to může být příjemný zážitek, plný nostalgických vzpomínek na úžasné kalkulátory firmy Hewlett-Packard z konce sedmdesátých let dvacátého století.

RPN procesor obsahuje sadu instrukcí, která se svým významem, mnemonikou a sdružením do syntaktických celků nápadně podobá instrukcím známým z kalkulátorů HP. Zejména se jedná o typy:

Srovnání možností knihovny "rpnproc" se skvosty mezi staršími kalkulátory přímo vybízí ke zveřejnění parametrů interpreteru. Zde jsou:


Název parametru, problematika Hodnota parametru, vysvětlení, popis, ...
RPN stack 4 úrovně
Maximální počet proměnných (variable) 1000 (rozlišených hodnotou 000* až 999*)
Maximální počet návěští (label) 1000 (rozlišených hodnotou 000* až 999*)
Registr pro nepřímou adresaci kterýkoliv z daného rozsahu
Objekty pro nepřímou adresaci proměnné, návěští
Aritmetika s proměnnými + − × ÷ pro STO i RCL
Větvení programu Podmínky (2 × 6 instrukcí: x>y, x<=0, ...), skoky (GTO, XEQ, RTN)
Počet úrovní podprogramu 32 (viz instrukce XEQ a RTN)
Realizace programové smyčky Instrukce ISG, DSE
Maximální délka programu neomezená: "co dá paměť počítače!"

*) Čísla proměnných jsou ve výpisu zobrazena na 3 místa, zleva doplněna nulami. Jedná se vždy o hodnotu dekadickou.





Popisy jednotlivých částí

Souvislého vyprávění už bylo dost, na řadě jsou tabulky a strohé popisy:





Download

Pro případné zájemce o použití je zde i tato rubrika. Stáhnout knihovnu je možné v několika verzích pro různé platformy a překladače. Header (soubor rpnproc.h) je pochopitelně pro všechny stejný.

Soubor test.c (ke stažení zde) obsahuje kompletní zdrojový kód jednoduchého programu, který ukazuje použití knihovny. K jeho sestavení (pro QNX a Linux) postačí příkaz:

gcc -O3 -fomit-frame-pointer -Wall -Wno-parentheses -lrpnproc -o rpnproc test.c
Výsledek sestavení lze jednoduše vyzkoušet, zde jsou příklady.