逆ポーランド記法の基本
逆ポーランド記法とは、スタックマシンという動作原理を持つコンピューターのための命令の手順を表したものです。
このコンピューターの基本的な処理手順には、レジスタマシンとスタックマシンの2種類があります。以下に主だった違いを説明します。
計算における違い
どちらの方法も計算結果はもちろん変わりません。レジスタマシンは処理対象とするデータにそれぞれラベルをつけて管理し、ラベル同士の計算の指令で結果を得ます。
例えば、以下のようにA, B, Cという3つのラベルを用いて足し算が行われます。
A = 10
B = 20
C = A + B
数学の問題で未知数にx, y, zを設定して方程式を解いたように、プログラム上にも変数という概念が用いられます。現代のプログラミング言語の大半を占める方法論です。
対して、スタックマシンはデータにラベルをつけることはありません。データを一つの鎖につなげた状態で管理し、新しいデータが来るたびに鎖が伸びます。
指示の出し方は、例として
10 20 +
のようにデータと処理命令が並んでおり、先述の鎖は以下のように変化します。
- はじめは空 [ ]
- 10 を連結 [ 10 ]
- 20 を連結 [ 10 20 ]
- +は2つの末端データを加算して、結果を連結 [ 30 ]
ご覧のように、スタックマシンの問題として、簡単とは言え内部状態を想像しながら書かなければならない点がデメリットとして挙げられます。
処理の呼び出しにおける違い
データを表示、印刷、転送するなどの「呼び出し」は、まるで日本語と英語で主語と述語の順番が異なるのと似たような概念になります。
たとえば、BASIC系の文字表示(レジスタ系)
PRINT \"RESULT=\" & C
C言語の文字表示(レジスタ系)
printf(\"RESULT = %d\", c);
RADIREC WSで使われるやり方(スタック系)
\"RESULT = \" /c concat print
お分かりのように、命令が後ろに配置されます。これはスタックマシンの特徴です。
現実はハイブリッド
一見するとデメリットの目立つスタックマシンですが、実はどのオペレーティングシステムや処理系においても内部的にはスタックマシンとして設計、処理されています。スタックを使わないと処理できない問題があるためです。
- 高級印刷機で採用されるPostScript
- Adobe FLASH
- .NET Framework
- Java / Darvik 仮想マシン
他にもいわゆる処理系でスタックを使わないものはほぼありません。問題はそれをユーザーに見せるか否かで意見が分かれているにすぎません。