C400

148. setjmp と longjmp

RPG/COBOL の技術者にも知っておいてもらいたい技術の話を
紹介しよう。
setjmp(= Set Jump)longjmp(=Long Jump) とはご存知だろうか?

setjmp とはブログラムの実行スタックを記憶しておいて
longjmp で記憶しておいたスタックに戻って復元する機能である。
_

RPG で GOTO命令と言うのに少し似ているが
setjmp では動的にスタックを保存しておいて
そこに復元・復帰するという点でダイナミックな
スタック変更という点でGOTO とは基本的に異なる動きである。

■ ツリー・メニューで setjmp & longjmp

このような動的にプログラムのスタックの変更が何に必要かと
いうとこの技術は AutoWeb のツリー・メニューの処理に使われている。
_

ツリー・メニューではあるツリーの一部から別のツリーの一部を
クリックするといきなりジャンプ移動することができる。
これは普通の5250アプリケーションではあり得ない動作である。
しかもユーザーはさらにツリー・ビューのどの位置から
移動するのかは不明である。
初めはひとつひとつ内部で上部ツリーへ遡るようにと
試したのだがユーザーによってはメニューにはF12=全画面が
定義されていないユーザーもいる。
ユーザー個別の対応をしていたのではキリがない。
あるユーザーは元の画面に戻るのはF12キーであるが
別のメニューではオプション=90を入力するというように
本当に統一されていない。
 
そこですべてのユーザーでジャンプ移動させるためには
一度初期の位置にジャンプ移動(longjmp)で戻ってから
ツリーを降りていくという動作にすることによって
すべてのユーザーでも安定して動作するようになった。

以前はAutoWebのツリー・メニューは希望者だけの
設定として推薦していたが最近ではAutoWebを導入する
お客さまではツリー・メニューを積極的に採用する
お客さまが増えてきている。
_

たまにユーザーの画面を見せてもらう機会があるが
かなりのツリー・メニューとして使い込んでいるユーザーが
増えてきているようで喜ばしいことである。
ツリー・メニューにするとAutoWeb/2.0の様々な機能を
使うことができるようになる。

■ Python でF12=前画面

_

Python のために開発中のAS400エンジンには
RPGで使われている入出力命令がすべて組み込まれている。
さらにこのAS400エンジンではお決まりの処理は
Pythonに代ってAS400エンジンが多くを代行してくれるように
構成されている。
例えばF3=終了のキーを押せばプログラムを終了させると
決まっているのであるからいちいちF3=終了の処理を
記述する必要はない。
考えてみれば新規のRPGプログラムでは
ほとんどのプログラマーが毎度、

           IF  *IN03 = *ON
           RETURN
           ENDIF

のような処理を記述しているはずである。
開発中のAS400エンジンでは F3=終了 の処理を
Pythonで記述する必要はない。
AS400エンジンが代わりに行ってくれるからである。

このようなAS400エンジンの仕組みのうちF12=前画面の
処理を行うのがやはり setjmp & longjmp である。
初期画面への戻りを実現するのに longjmp が
使われている。
従ってPythonの処理では機能キーの記述の処理は
ほとんど少なくて済んでいる。

setjmp & longjmp は本来はUNIXの機能であるが
IBM はUNIX互換の機能もかなりサポートしている。
setjmp & longjmpはそのうちのひとつであり
これによって従来では不可能であった処理を
実現できている。
_