以下に本発明に関する代表的な実施形態を示す。この例は、汎用のプログラミング環境を機器制御に応用したものである。機器制御実行環境と汎用環境の相違は、機器制御のためのAPIを持つか否かにあり、この実施例では、APIは後述の「作り付けのタイル」として定義されているかどうかに対応し、したがってこの例示は、本発明の実行環境を機器制御への応用に限定するものではない。
図1は本実施例共通の概要図であり、実施例のデータ処理装置が、組み込まれている機器を制御する構成の図である。一例として、組み込み機器がエアコンの場合で考えると、101がエアコン機器全体、102がエアコン機器本体、103が起動停止スイッチ、104が内蔵の時計、105が103や104を106によって制御させるためのインターフェース、106がこれらの機器を制御するプログラム実行エンジン、107がユーザーとの入出力を行うタッチパネルとみることができる。汎用のプログラミング環境についてはこの構成図から、102,103,104,105を取り除いて考えればよい。
(第一の実施形態)
図20は第一の実施形態における図1のプログラム実行エンジン106の内部を表した例である。図20の2001が、図1の106に対応する。プログラム実行エンジン2001には、UI操作処理部2002があり、タッチパネル107上の操作、タップ、ダブルタップなどに反応して、実行するべき動作を定義済みタイル保持部2005と実行解釈部2003に対して指示を行う。
2003はプログラムの解釈実行部であり、UI操作処理部2002からプログラムの実行が指示された時に動作を開始し、プログラムに該当する定義済みタイルを保持する定義済みタイル保持部2005から実行するべき内容を取り出して、実行環境保持部2004と、作業領域2006に各種情報を書き込み/読み出しを繰り返して実行を行い、実行完了時にその旨をUI操作処理部2002に報告する。また、解釈実行部2003は、図1の106のインターフェースに対する処理の呼び出しを行い、機器の状況の読み込みと、操作を行う。
2004は、実行環境保持部であり、実行時の各種情報を保持する部分である。これらの情報には実行待ちのタイルの待ち合わせ場所、実行待ちのタイルに到達しているデータの情報などが含まれる。
2005は、定義済みタイルの保存部である。ここは、ユーザーによって作成と編集がなされる、「定義済みタイル」を格納している部分である。「定義済みタイル」は複数個のタイルを配置することにより構成されたデータフローグラフに対して名前を付けたものである。この2005の部分は、2003の解釈実行部からの要求に応じて、特定の名前の定義済みタイルの指定の位置にあるタイルの情報を提供する。また、UI処理操作部2002からの指示により、新規定義済みタイルの作成、削除、内容の変更を行う。
作業領域2006は、データフローグラフ内を流通する各種データの置き場所であり、文字列や構造体などの複合オブジェクトの実体が格納されている。
図2はこの第一の実施例におけるユーザー画面への表示例である。この画面ではすでに実行を開始すれば、表示領域201に”HELLO WORLD”という文字列が表示されて実行が終了するようにプログラムされている状態が表示されている。このシステム例では、システムを起動した直後に、そのままシステムに対して実行指示を与えるようなユーザーを想定して、すでにこのようなプログラムがセットされている状態を初期状態として与えている。図2の詳細な説明は後述する。ここでは、基本的な構成要素についてのみ説明する。
211,212,213には、それぞれ実行命令とオペランドと呼ばれる実行オプション、入力データの入ってくる方向、出力データの排出方向を指示する図が描かれている。この矩形を以降「タイル」と呼ぶ。タイルに関する詳細は、図3で説明する。タイルについては、この実施例では、矩形となっているが、隣接できる閉領域であればどのような形でも良く、各タイルが同形である必要もない。
208はタイルが縦横に隣接して配置されている領域で、「定義済みタイル」の配置状況を表示編集する領域である。この領域を以降「盤面」と呼ぶ。盤面には識別のための「名前」が付けられている。208の盤面には「MainLine」という名前が付けられており、表示領域兼プルダウンメニュー207にその名前が表示されている。
図2の詳細な説明を行う。最初にこのMainLine盤面で表現されている「プログラム」を簡単に説明する。211は、命令識別子CONSTという命令を実行する。この命令はタイルの上方から入力データを受け取り、その入力データがどのようなものあっても、内容を無視して、オプションとして指定されている”HELLO WORLD”という文字列を出力データとして、このタイルの下方に隣接しているタイルに渡す。212は、識別子PRTという命令を実行する。この命令は上方に隣接しているタイルからのデータを入力としてその内容を201の表示領域に印字する。さらに、入力データをそのまま下方に隣接するタイルに渡す。213は、識別子ENDという命令を実行する。この命令は入力として上方に隣接しているタイルからのデータを受け取り、それを捨ててしまい、何も出力しない。このプログラムでは、213の実行によりデータが捨てられ、プログラム系全体を流通するデータがなくなることで系の実行が終了する。このプログラム中の矢印は、制御の流れではなく、データの流通経路を示しており、図式はデータフローグラフになっている。
202は「RUN」とラベル付けされているプッシュボタンであり、押下するとセットされているプログラムの実行が開始される。このボタンを押下すると208で図示されている盤面の上辺中心のタイル211の上から、実行のきっかけとなるダミーデータトークンNILが投下され、以降必要なデータが到着して実行可能になったタイルの実行が続く。最初に投下されるトークンは系全体の実行のきっかけになるものであり、この第一の実施形態ではNILでなくても0でも1でもよい。
203は「NEW TILE」とラベル付けされているプッシュボタンであり、押下すると新規に名前識別子を付けた新規の定義済みタイルが作成できるようになる。詳細は後述する。定義済みタイルにつけられた名前識別子は、タイル中の命令識別子として利用可能であり、新たな定義済みタイルを作成することで、そのアルゴリズムをサブルーチンとして盤面中で使用できる。例えば、図7のように整数の階乗を計算するように編集された定義済みタイル「n!」は図6のように盤面のタイル中でCONSTやEND等と同等に使用することができる。
207は表示領域兼プルダウンメニューであり、選択候補としてMainLineとその時点までに作成されているすべての定義済みタイルの名前識別子が選択候補としてリストされる。ユーザーはこのメニューから識別子を選択すると、208の表示が選択された識別子の盤面の内容に切り替わり編集が可能になる。207は、表示の切り替えと現在208に表示されている盤面の名前の表示を兼ねる。
この実施例では、盤面は、3×3、5×5、7×7など縦横とも奇数個のタイルになっている。これは、名前付き盤面の入出力方向である上下右左の位置を各辺の中心のタイルとするために奇数になっているが、各辺の入出力位置の指定が別法で可能であるならば奇数でなくてもよい。また、各タイルが隣接関係を保持できるのであれば、縦横が同じタイル数である必要もなく、タイルの形状も矩形でなくてもよい。例えば六角形のタイルであれば、一つのタイルに隣接するタイルの数が矩形の場合には4個であるところ6個にすることも考えられる。
「IN:」とラベル付けされた表示領域209は、表示されている盤面が実行できる条件を表示する領域である。各タイルは、一つ以上のデータ入力を受けるが、どの方向からいくつデータが到着したら実行できるかを設定することができる。209はその表示領域である。この例では、T : Top すなわち上からデータが到着した時点でMainLineという盤面の実行を開始する可能であることを表している。一方各タイルは0個以上の出力があり、どの方向が出力になるのかを「OUT:」とラベル付けされた210の領域に表示する。この例では、MainLineは外部に対して出力をしないので、210の欄は空白になっている。
図3は、各タイルの表示の詳細が示されている。図3(a)の301は、211で図示されたCONST命令タイルを再掲したものである。302は、矢印でない直線であり、外部からの入力がこの方向から、すなわち上から、入ってくることを表している。303は入力データに対する識別子である。これは入力が複数あるような命令タイルのうち、入力を区別しないと結果が変わるような命令、例えば引き算や割り算のような命令を想定して付与されるものである。本実施例では、識別子に数字を用いているが、順序が付けられる識別子であればアルファベットなどでもよい。
304は命令の識別子表示である。ここでは定数を出力するCONST命令が書かれている。そのほか、プログラムの実行系があらかじめ用意している命令を設定することはもちろん、プログラマによって作成された定義済みタイルの識別子名称を設定することもできる。305は304の実行命令に対するオプションの表示である。CONSTは、命令だけでは、どのような定数を出力するかが決定しないので、定数をオプションとして指定する。オプションを必要としない命令もある。
306の外向きの矢印は、この方向、この例では下に隣接したタイルに対して、出力があることを表示している。入力と同様に出力にも識別子が付与され307のように矢印に沿って表示されている。
図3(b)の308は複数の入力と出力を持つ命令タイル、SWITCH命令タイルである。SWITCHは、二つの入力と二つの出力を持つ命令であり、入力1がNILであれば、入力0として入ってきたデータを出力1へ出力し、そうでなければ入力0を出力0に排出する。このSWITCH命令では、データは、出力0か出力1のいずれかに排出され、両方からデータが排出されることはない。SWITCH命令は、データNILを論理値の偽とみなして出力を切り替える条件分岐に該当するものである。308では、入力0が上に隣接したタイルから、入力1が左から進入し、出力0として下に、出力1として右に隣接したタイルにて渡される。310は、この方向、すなわち左からの入力が入力1であることを表示し、311は、右への出力が出力1であることを表示している。
308では、入力0、入力1、 出力0、出力 1をそれぞれ上、左、下、右と設定された表示になっているが、本実施例では、各命令タイルの入力方向と出力方向は自由に選択設定できる。方向が自由に設定できることから、混乱を避けるために入出力に識別子を付与する必要がある。
図4は、図2で表示されていたMainLine盤面の部分を抽出して変形したものである。END命令タイルの位置が図2と異なっているが、アルゴリズムの表現としては同等である。ここで、407は、現在の盤面の表示がMainLineであることを表示しており、408は、図2の209を簡略図示したものであり、このMainLine盤面が実行を開始できる条件「T」が表示されている。T単独の場合、上からデータが進入すれば、盤面の実行可能になる。この例では、図2の202のRUNボタンを押すと、この盤面の401からデータトークンNILが進入する。
投入されたデータNILは、タイル402が入力0として受け取る。タイル402は、このデータ受信により実行可能となり、即座に命令CONSTがオプション”HELLO WORLD”付きで実行される。実行の結果402の出力0として文字列”HELLO WORLD”のデータトークンが下に隣接するタイル403に渡される。タイル403は、上からのデータを入力0として受け取るように設定されており、受け取った結果、タイル403の命令404のPRTが実行可能となり、402の次に実行される。404の実行の結果、入力された文字列”HELLO WORLD”トークンは、表示領域201に表示され、そののちそのまま出力0として右隣りのタイル405に渡される。タイル405は、命令406としてENDが設定されている。タイル405は左隣のタイル403から、文字列”HELLO WORLD”のトークンを入力0として受け取る。ENDは入力0にデータが到着した時点で実行可能となるため、タイル405は403の次に実行される。このENDの実行の結果、入力された文字列データ”HELLO WORLD”のトークンは放棄される。この結果この系のいずれのタイルも実行可能ではないため、実行機構は処理を終了する。
図4の408及び図2の209に表示される実行開始条件の式は本第一の実施形態では次のような形式になっている。実行開始条件は、複数の入力がすべて到着する、複数の入力の内いずれかが到着する、あるいはこれらの組み合わせで表現され、前記の場合は入力の方向記号同士を演算子*で結び、後者の場合は演算子+でつなぐ。優先度は、*の方が+より強い。また丸括弧()も一般的に数式と同様に使えるものとする。
入力の方向記号としては、T、L、R、Bの各文字が使用でき、それぞれ上、左、右、下を表す。数式上、この記号の左からの出現順が、入力の識別子を指定することになる。例えば「T*L」という入力条件式は、上からと左からの両方にデータが到着したときに実行可能となることを表し、さらに、方向文字の出現順に対応してTが入力0、Lが入力1に対応することも表している。方向記号のいずれかが単独で指定された場合、その方向からのデータが到着した時点で直ちに指定された盤面は実行可能となる。複雑な例としての式「(T*R)+B」は、記号の出現順に入力0が上、入力1が右、入力2が下から入ってくることを表し、さらに、入力2が到着した時点で、ほかの入力の如何にかかわらず実行可能となる。また、入力2にデータが到着しなくても、入力0と入力1にデータが到着した時点で実行可能となる条件を表現した式となる。
このような条件式の例をいくつか挙げる。まず「L 」は入力0が左から入力され、入力0が到着した時点で実行可能となる条件式である。また「R*L」入力0が右から、入力1が左から入力され、入力0と入力1が両方到着するまで実行しない条件式である。さらに「T+L」は入力0が上から、入力1が左から入力され、どちらかが到着すれば実行可能となる条件式である。そして「(T*R)+B」は入力0が上から、入力1が右から、入力2が下から入力され、入力2が到着するか。入力0と入力1が揃うかのどちらかが満たされると実行を開始する条件式である。
これらの式の解釈は、一般的な数式の字句解析のアルゴリズムで解釈可能である。またこの条件式の解釈処理を簡便にするために、式の記法を後置記法(逆ポーランド記法)とすることもできる。このような後置記法の場合、条件式「(T*R)+B」は「TR*B+」となる。
このような定義済みタイルの図表現は、定義済みタイルの識別子をキーとして、前記入力条件式、210に表示される出力方向文字列と盤面サイズ情報、および、空白でない各タイルの座標情報と各入力の進入方向、命令識別子、オプション文字列と各出力方向を含む構造体を値とする表に中間形式として2005の定義済みタイル保持部に格納される。
図5は、このプログラム言語の106の実行エンジンの中の図20の2003である解釈実行部の動作を表すフローチャートである。解釈系は、起動すると、最初に501にあるように実行に必要な各種記憶領域を完全にリセットする。これらの記憶領域には、実行可能なタイルが複数ある場合の待ち合いのための領域、実行可能ではないが一部のデータが到着しているタイルの待合のための領域、配列やリスト、構造体などの複合データ構造のためのヒープ領域などが含まれる。これらの領域は、図20の実行環境保持部2004、作業領域2006に対応する。
次に解釈系は、502にあるようにプログラムされた定義済みタイルの保持部である図20の2005から、「MainLine」という名前を持つチャートを呼び出し、この盤面チャートに対して上から起動のきっかけを与えるデータトークンNILを投入する。
解釈系は、次の504において、盤面のタイルの内、実行可能になっているタイルを検索し、そのうちの一つを実行する。検索にあたっては、図20の実行環境保持部2004を参照する。実行可能であるタイルが複数あった場合には、ランダムに選択して実行してもよいし、時系列順に実行可能になってからの経過時間が最も長いものを選択して実行するようにしてもよい。
ステップ504におけるタイルの実行の結果、0個以上の出力が生成される。ステップ505では、これらの出力を隣接するタイルの入力として分配する処理がなされる。出力が0個の場合には、ステップ505では何も処理は行われない。出力が1ないし3個の場合には、それぞれの出力を各方向に隣接するタイルの入力として渡す処理が出力の数だけ行われる。
ステップ505の処理の結果としていくつかの隣接タイルにデータトークンが渡されることがあり、その結果実行可能となるタイルがいくつかできることもある。それらのタイルも候補に含めてステップ503に戻り、実行可能なタイルがあるかどうかを判定し、あるならばステップ504で一つ実行する。この繰り返しを実行可能なタイルがなくなるまで行い、実行可能なタイルがなくなれば、解釈系は停止する。実行対象となっているプログラムのタイル定義の内容によっては、データが無限に回り続けるようなものもあり得るが、それに対して、割り込みによる中止や、繰り返しの中で、実行したタイルの数を計数しておき、あらかじめ規定した量を実行したら停止する、あるいは、ユーザーに続行を確認する機構を追加することも容易に可能である。
図6と図7では、さらに複雑なプログラムチャートが例示されている。この例では、ユーザーから入力された自然数値に対する階乗を計算して表示領域201に表示して停止するプログラムが実現されている。図6は、メインラインチャートであり、601にこの盤面チャートの名前が「MainLine」であること、602に、このチャートの実行可能条件が、上からのデータ到着であることが表示されている。
解釈系の初期化処理によって上からNILが投下されると最初にタイル603が実行可能になる。このタイルの命令はINPUTとなっている。INPUT命令は、ダイアログと仮想キーボードなどの手段により、ユーザーに一つの入力を要求し、そのデータを出力0に出すものである。この時、入力0に入ってきたデータはその参照が放棄される。入力されたデータは、タイル604に上から渡され、入力0として受け取る。
タイル604の命令には「n!」が指定されている。「n!」は図7で表示される定義済みタイルに対してつけられた名前識別子である。タイル604では、入力0の整数を図7の定義盤面に対して投入し、その結果を出力0として下に隣接するタイルに入力として渡すことを指示している。その結果は下に隣接したPRTのタイルに渡され、その後の実行は、図2の例と同様に推移する。
図7は階乗を計算する定義済みタイル「n!」の実装盤面チャートを表している。701では、このチャートにつけられている名前が「n!」であることが表示されている。703では、このチャートの実行開始条件が上からのデータ到着であって、入力0として受け取ったデータを上から進入させることを表示している。702ではこのチャートの実行結果として出力が下から一つ出て、それを出力0に対応させることが表示されている。これら名前、入力条件、出力設定などは、新規タイル定義を作成するためのボタン203を押下したときに表示される図11のダイアログ1101で設定することができる。
図7の盤面チャートでは、階乗を再帰的に計算するアルゴリズムがデータフローチャートで定義されている。「自然数nの階乗」は、「n=1ならばn!=1」そして「n>1ならば、n!=n×(n-1)!」と計算でき、図7ではその計算ステップが表示されている。
703の条件によって上から進入してくる入力0の自然数は、タイル704に入力0として受理される。
704には、命令の表示がない。これは、COPY3という命令の簡便な表示である。タイルに命令の表示がなく、入力が一つで出力が3つあるタイルは、COPY3命令のタイルであると識別可能である。ただし、命令識別子COPY3は表示が省略されているだけである。COPY3は入力0のデータをさらに二つ複製し、都合3個の出力を一つずつ出力0,出力1,出力2に渡す命令である。704では、入力0の自然数を複製して左に隣接するタイル706、右に隣接するタイル705、下に隣接するタイル708に供給する。
タイル705にも命令名がない。ただし、タイル704と異なり、入力が一つと同じではあるが、出力が一つしかない。これは、PASSという命令の簡便な表示である。タイルに命令の表示が省略されており、入力と出力がそれぞれ一つしかないタイルはPASS命令のタイルであると判別される。PASS命令は、入力0として受け取ったデータに何ら加工を施すことなく、そのまま出力0として隣接するタイルに渡す命令である。705のタイルは、704から受けたデータを707に受け渡している。
タイル706は、CONSTタイルで、オプションに自然数1が指定されている。このタイルは、704からのデータ入力を受けて、自然数1を、その下に隣接するPASS命令にわたす。この結果、706の出力0は、PASS命令のタイルを介して708に供給される。
タイル708は、GTという比較操作を行う命令のタイルである。GT命令は、入力を二つとり、データが二つとも到着したら実行可能となる。実行動作は、入力0と入力1を比較し、入力0>入力1ならば論理値真を表すデータTを、そうでなければ論理値偽を表すデータNILを出力0に出す。708の入力0は、この盤面に渡された数、入力1は、自然数1となり、これらタイル704、706、708の組み合わせで、この盤面に上から供給された自然数が1より大きいかどうかの比較を行っている。
タイル707は、SWITCH命令という条件分岐操作を行う命令のタイルである。SWITCH命令は前述の通り入力を二つとり、データが二つとも到着したら実行可能となる。実行動作は、入力1がNIL以外のデータの時に、入力0のデータを出力0に流し、入力1がNILの場合には、入力0のデータを出力1に流すものである。
707のSWITCH命令は、入力0としてこの盤面に供給された自然数が、入力1としてタイル708の比較動作の結果を受ける。比較結果が真、すなわち1より大きければ、入力0はタイル709へ供給され、1以下であれば、入力0は出力1として右隣のPASS命令タイルを通り、タイル715へ供給される。このSWICHにより、データフローグラフは、タイル709を起点とするn×(n-1)!を計算するグラフとタイル715を起点とする1を結果として出力するグラフに分岐する。
タイル709は、命令文字列の表示がなく、入力が一つで出力が二つある。このようなタイルはCOPY2命令タイルとして判別される。COPY2命令は、入力0にデータが来た時点で実行可能となる。実行動作は、入力0のデータを複製し、出力0と出力1に一つずつ流すものである。COPY2タイルの簡便な表示では、入力と出力の矢印線のみ表示され、命令文字列の表示は省略される。
タイル709は、前記比較分岐グラフの結果として入力データが1より大きいときに実行される。実行された時には、入力0のデータは複製され、タイル710とタイル712へデータを引き渡す。
タイル710は、入力データの内容から1を減じる「n-1」命令タイルである。この命令は、入力0にデータが到達したときに実行可能となる。実行動作は、入力0のデータから1を減じた値を出力0として流すものである。タイル710は、タイル709から供給されたデータから1を引いた値を出力0としてタイル711に渡している。
タイル711は、定義済み名前付き盤面「n!」の実行を指示するタイルである。「n!」はこの盤面で定義されており、この呼び出しは再帰的である。タイル711はタイル710によって1減じられた数字に対して「n!」を自分自身の定義をもとに計算し、その結果を出力0として、右に隣接するタイル712に渡す。
このような再帰的な盤面チャートの呼び出しは、呼び出しのタイミングでチャートそのものを複製して別体のグラフで実行する方式や、グラフを複製せず、呼び出し履歴を階層的に記憶するスタックなどの構造を利用して実現する方式で実現できる。
タイル712は、二つのデータの算術積を計算する命令「A*B」を実行するタイルである。「A*B」は入力0と入力1の両方にデータが到着したときに実行可能となる。実行動作は、入力0と入力1の掛け算を実行してその結果を出力0に流すものである。タイル712は、タイル709から渡された数字nとタイル711から渡されてくるn-1の階乗の計算結果の積を計算し、結果を出力0として下に隣接するタイル714に渡す。
タイル714は、命令文字列の表示が省略されており、入力が二つ、出力が一つある。このようなタイルは、MRG2命令タイルの簡便な表示として判別できる。MRG2命令は、入力を二つ取り、どちらかの入力にデータが到着ときに、実行可能となる。実行動作は、入力されてきた入力0または入力1のデータを何ら加工することなく出力0に流すものであり、二つのデータフローのパスを一つに合流させる用途を持っている。
タイル714は、入力1としてタイル712の演算結果、すなわちn×(n-1)!の結果と、入力0としてタイル715からの定数1を受け取り、どちらかにデータが到着すれば、そのデータを出力0として左に隣接するタイル713に供給する。タイル714は二つのデータフローグラフ、タイル709を起点とするグラフとタイル715と複数のPASS命令タイルからなるグラフからのデータの合流点になっており、これら二つのグラフへのデータは、タイル707のSWITCHで切り分けられているため、どちらか一方のグラフにしかデータは供給されないような盤面チャートの構造になっている。
このn!の定義では、出力0が702で表示されているように下から出ていくことになっている。ただし、本実施例では、各方向からの入出力は、各辺に隣接したタイルの内の中央のタイルからのみ行うように限定されている。すなわち5×5の定義盤面では、上からの入出力は上辺中央のタイル、図7では、タイル704のみ行うことができる。同様に左方向の入出力は左辺中央のタイル。右方向のタイルは右辺中央のタイル、下方向は下辺中央のタイル、図7ではタイル713で行うように限定されている。本実施例では、各辺のタイル数は奇数に限定しているので、各辺には中央のタイルが必ず存在する。入出力の位置については、このような各辺の中央に限定せず、タイルに色などの区別のできる印をつけて判別するような方式でもよい。
上記の規則設定のため、タイル714の出力0は、直接下辺に接触せず、タイル713を介して下辺に接している。この結果この部分のグラフは屈曲している。
本実施例では、このようなデータフローグラフの構成で、階乗計算のロジックが表現され、図5の処理の流れを実現した解釈系によって、実行することができる。
図8は、図7の定義による「n!」を呼び出すためのメインライングラフである図6を変形させたものである。この図6と比較してグラフが屈曲しているが、表現されているグラフのロジックは図6のグラフと全く同等である。
チャート中央のタイル805は、名前付き盤名定義タイル「n!」を実行させるタイルである。このタイル805は、右に隣接するタイルの出力0である801を右からの入力0として受け取る。また、出力0は左方向に流され、左に隣接するタイルの右からの入力0である804で受け取られる。本実施例の解釈系では、このような隣接するタイル間のデータの受け渡しに関する処理を装備している。
図9は、この受け渡しに関する解釈実行部2003の処理のフローチャートである。この「出力渡し」処理は、タイルの実行により出力が生じた際に実行されるもので、図5のステップ505の処理に該当する。この手続きは出力が複数ある場合には、各出力に対して一回ずつ実行される。
この処理は発生した出力の方向によってステップ901から下にある条件検査により四つの手続きに分岐される。出力が左方向である場合には、手続き「左隣へ渡す」、右方向への出力の場合には、「右隣へ渡す」、下方への出力の時には「下隣へ渡す」上への出力時には「上隣へ渡す」が実行される。
図10は、図9のステップ902で呼び出される「左隣へ渡す」の処理のフローチャートである。ステップ1001でこの手続きで参照している渡されるデータを取り出す。ステップ1002では、左隣のタイル右方向の入力の識別子を取り出す。図8のチャートでは、右方向への出力801で渡されるデータがD、左隣のタイル805の入力の識別子0がPに該当する。ステップ1003では、渡す対象のデータDを左隣のタイルの入力Pとして代入する。その結果左隣のタイルにデータが到着するので、その機会に左隣のタイルの実行可能性についての左隣のタイルの命令の実行可能条件式でチェックを行うのがステップ1004である。その結果実行可能であると判定された時には、左隣のタイルは、実行可能であると分類され、次のタイルの実行ステップ図5の504での実行候補となる。
そのほかの方向へのデータ渡しの処理は、図10の処理中記述の「左と右」を「右と左」、「上と下」、「下と上」の関係で読み替えることで実現することができる。
次に第一の実施形態において、これらデータフローグラフの作成と編集がタッチパネルのような位置指定手段と、タップとダブルタップのような二つの指示手段と仮想キーボードで行えることを示す。
図11は、新規に名前付き盤面タイルを作成する際の入力画面である。図2のボタン203は、押下すると新規の名前付き盤面の作成処理を行う。この際に必要な諸情報の入力のために、ダイアログ1101がモーダルダイアログとして表示される。この段階では、盤面の名前、盤面のサイズ、実行可能判定式、出力数と方向の設定を行い、盤面の作成編集は、1101での設定後、盤面表示208上での画面のタップあるいはダブルタップで行う。
1102は、テキスト入力項目であり、ここに盤面の名前を仮想キーボードなどで入力する。1103は、この名前付き盤面のサイズを指定するプルダウンメニューとなっており、3、5、7などの奇数が選択できる。本実施例では、盤面は縦横同じサイズと規定しているため、入力する数値は一つとなっているが、そのほかの場合には適切な数の適切な値の入力を促すことになる。1104は、この名前付き盤面の実行可能条件式であり、前述した形式の条件式を仮想キーボードなどで入力する。この項目については、入力を支援するような補助ダイアログのようなUI機構があってもよい。この例では、実行開始条件式は、入力が二つあり、入力0は上から、入力1は左から入ってくることとし、入力0と入力1の両方のデータが揃ったときに実行可能になると設定されている。1105は出力の数と方向の設定を行うテキスト入力項目であり、この例では、出力が二つあり出力0が下方向へ、出力1が右方向へ出ていくことが設定されている。この項目についても入力支援ダイアログの導入で文字入力量をさらに低減させることもできる。
1101のダイアログにあるOKボタンは、設定内容を確定として登録しダイアログを閉じる。Cancelボタンを押下すると、新規名前付き盤面作成操作そのものを中止する。
OKボタンの押下によって、新規名前付き盤面が作成されると盤面のすべてのタイルが空白で初期化された盤面が作成され、207にその盤面名が表示されるとともに、208に現在のその盤面の内容、初期状態としてすべてのタイルが空白のものが表示される。盤面の作成編集は208の各タイルをタップやダブルタップなどの指示をすることで行う。
図12は、各タイルをダブルタップしたときの表示内容である。1201はモーダル表示されるダイアログであり、タイルの編集操作を容易にするために、図2の208で表示される領域とほぼ同じ大きさで表示される。1202は、ダブルタップされたタイルと同じ内容がダイアログいっぱいに拡大表示される。1202に対してはシングルタップによる内容の編集が可能である。1201のOKボタンは押下すると、上記編集の結果をダブルタップされたタイルに反映させて、ダイアログを閉じる。Cancelボタンは、編集の結果を放棄し、ダブルタップされたタイルの内容は不変のままダイアログを閉じる。
図13は、208の各タイルをダブルタップしたとき、あるいは拡大表示された1202の領域の中央付近をシングルタップしたときにモーダル表示されるダイアログである。ここでは、タイルの中心に表示されている、命令とオプションを編集することができる。1302は、プルダウンメニューであり、それには、システムで用意されている命令と現在編集中のものも含めたすべての名前付き定義済みタイルの名前識別子が一覧表示され、ユーザーはその中から一つを選択する。1303は、オプションを入力するテキスト入力項目であり、内容を仮想キーボードで入力することもでき、また、いくつかの定数NIL、0、1などはプルダウンメニューからの選択により設定することもできる。
ダイアログ1301にあるOKボタンは、押下すると、編集内容を該当するタイルに反映させて1301を閉じる。Cancelボタンは、編集内容を放棄して1301を閉じる。
図14は1302をタップしたときにポップアップするメニューの例である。
1401のメニューには、システムで定義済みの命令と作成済みの名前付きの盤面名のすべてが選択可能なように表示される。作成済み盤面には、現在208に表示されている編集中の盤面の名前も含まれる。この例では、現在設定されている命令についてハイライト表示されている。これらの表示の順番については、名前の辞書式順や使用頻度の高い順に並べるなども考えられる。1402は「--EMPTY--」という項目で、これを選択すると該当するタイルが空白に設定され、リセットされる。
図21は、システムで定義済みの命令の一例である。これらの中には、シンボルや数値、文字列を操作する命令のほか、複合データ構造として二進木リストを取り扱うための命令であるFRIST、REST、CONS、EQ、ATOM?なども含まれている。命令EQでは、入力が数値同士の場合の比較機能を含めてもよい。
さらに図21のシステム定義済み命令の中には、電源の状態を読み取るON?、電源の投入と切断を指示するPOWER、現在の時間を取得するNOW、タイマーに時間を設定するSTTMRなどの命令も含まれている。これは、制御対象のエアコン機器102に対する制御命令に対応する。この例にくわえて、エアコンの温度設定を読み取る、あるいは設定するなどの命令も追加してもよい。
図2の盤面表示208の各タイルの上、あるいはタイルの拡大表示図12の1202をシングルタップしたときの動作は、第一の実施形態及び後述の第二の実施形態では、タップされた場所によって編集対象を区別している。図15はタップの場所に関する領域の説明である。1501はタイル全体の正方形領域であり、その内部は9個の領域に分割されている。このうち、中央の領域1502を「ゾーン1」と呼ぶこととし、以下上辺沿いの領域を「ゾーン2」、左辺沿いを「ゾーン3」、右辺沿いを「ゾーン4」、下辺沿いを「ゾーン5」と呼ぶことにする。この例では四隅の領域には名称はなくこの領域をシングルタップしても何も処理しないものとする。例示では、ゾーン1が大きめに設定されているが、各ゾーンの大きさを均等にしてもよく、これらの領域の大きさの設定は、利用者の操作性をもとに決定される。
上記において、「1202の領域の中央付近をシングルタップ」という記述は、拡大表示領域1202のゾーン1をシングルタップすることに該当する。
第一の実施形態と第二の実施形態では、ゾーン1のシングルタップは命令とオプションの編集を行う。また、ゾーン2をシングルタップすると上方向の入出力の設定を行う。同様に、ゾーン3は左方向、ゾーン4は右方向、ゾーン5は下方向の入出力の編集を行う。
各ゾーンをシングルタップしたときには、専用のダイアログを表示させ、入力0、入力1、入力2、入力3、出力0、出力1、出力2のいずれか一つを選択設定させるようにしてもよいが、例示する両実施形態ではより操作性に優れた手段を例示する。
第一の実施形態と後述の第二の実施形態では、各ゾーンがシングルタップされた時の動作として、すでにそのゾーンに対応する方向に入出力が設定されていた場合には設定を削除し、設定されていない場合には、図16のように設定された優先度順に未設定の入出力を設定するという規則で設定動作を行う。
例えば、入力二個、出力二個の命令に対するシングルタップ動作例は図22のようになる。初期状態として、2入力2出力の命令であるSWITCH命令だけが設定されている2201の状態にあるとする。次に最初にゾーン2をタップすると、2002のように上方向に入力0が設定される。次にゾーン4をタップすると、2203のように未設定の右方向に入力1が設定される。次にゾーン3をタップすると、2204のように未設定の左方向に出力0が設定される。さらに、ここでゾーン4を再度タップすると、2205のように、右方向の入力1の設定が削除され、右方向は未設定になる。次に、ゾーン5をタップすると、2206未設定の下方向に、まだ選択されていない有効な方向の内、図16に照らして最も優先度の高い、入力1、すなわち直前のタップ操作で設定先のなくなっていた入力位置が、まだアサインされていない出力1に優先して設定される。というような動作である。もちろんこの後、ゾーン4をタップすると、2207のように唯一残っているアサインされていない出力1が右方向に設定されるという動作を行う。
図17はこのようなシングルタップの動作についてのUI操作処理部2002の処理のフローチャートである。処理は最初にタップされた領域の判別ステップ1701から始まり、タップされた領域がゾーン1かそうでないかによって処理を切り替える。ゾーン1がタップされた場合にはステップ1702でダイアログ1301をモーダルで表示して命令とオプションの設定編集を行う。それ以外の領域がタップされた場合にはステップ1703の「方向編集」手続きにより、各方向の入出力設定が行われる。
図18は、表示領域がダブルタップされた時の動作についてUI操作処理部2002のフローチャートである。ダブルタップは、タップされた領域に限らず以下の動作を行う。前述のように、タイル表示領域をダブルタップすると拡大ダイアログ1201が表示されるが、その中の拡大タイル表示1202でもダブルタップされることもありうる。その場合には、重ねて拡大ダイアログを表示する必要はないので、何もせずに終了する。ステップ1801はそのための判断ステップで、タップされた表示領域が1202であった場合には、何もせずに終了する。タップされた領域が208の表示の内の一つのタイルであった場合には、ステップ1802で、タップされたタイルの拡大編集ダイアログ1201を表示させ、ユーザーに編集操作をさせたのち、OKボタンによって閉じられるときには、編集内容をタイルに反映させて終了する。
図19は、図17のステップ1703の「方向編集」の処理を示すフローチャートである。ここでは、ゾーン1以外の領域がシングルタップされた時の処理を行う。最初にステップ1901でタップされた領域がゾーン2,3,4,5のいずれでもない四隅の領域ではないことを確認している。もし、四隅の領域であるならば、何もせずに終了する。ゾーン2,3,4,5のいずれかであった場合は、さらにステップ1902で、そのゾーンに対応する方向に入出力が設定されているかどうかを判定する。もしすでに入出力が設定されている場合には、ステップ1903で設定されている入出力を解除する。解除された入出力はステップ1904での再割り当て候補に含まれるように処理される。タップされたゾーンに、入出力の設定がない場合には、ステップ1904で設定処理が行われる。ステップ1904では、まだ設定されたことのない入出力や解除されたことのある入出力の内、図16の優先度に照らして最も優先度の高い入出力を設定する。
ここまでのユーザー操作は、表示に対するタップとダブルタップ、ポインティングディバイスの場合には、クリックとダブルクリック、そして名前付き盤面の名前の文字入力とオプション文字列の入力のみである。文字入力は単語や数字の入力がほとんどであり、仮想キーボードで簡単に入力できる長さである。
以上のような図式表現のプログラミング言語とユーザーインターフェースを提供することにより、物理キーボードを必要としない表示とポインティングディバイス、あるいはタッチパネルのみでのプログラミング環境が実現される。本質的には、画面上の位置を指定する手段と、二つの区別された指示ができる入出力装置であればよく、例えば、ゲームコントローラの十字キーとA、Bボタンでもよい。
(第二の実施形態)
第二の実施形態は、前述の第一の実施形態を変形して、解釈実行系にイベント駆動とオブジェクト指向パラダイムを導入した実施形態である。
図23は、第二の実施形態における図1のプログラム実行エンジン106の内部を表した例である。図23の2302が、図1の107への接続に対応し、207制御機器インターフェース105への接続に対応する。本実施形態において106に対応するプログラム実行エンジン2301は、API仲介部2305を窓口として、タッチパネル107上でのタップ、ダブルタップなどの操作、制御機器からの電源状態の変化などに反応して、API仲介部2305から対応オブジェクトを取りして、実行解釈部2303が、評価メソッドを実行する。
2303はプログラムの解釈実行部であり、タッチパネル107上での操作イベントや図1の103の電源状態と104の内蔵時計で発生したイベントに対応するコールバックを持つオブジェクトを、API仲介部2305が保持する後述の図34の3401の登録表から取り出し、評価メソッドの実行動作を開始し、実行環境保持部2304と、作業領域2306に各種情報を書き込み/読み出しを繰り返して実行を行い、実行完了時にその旨を2305のAPI仲介部を通じてUIタッチパネル図1の107に表示する。また、解釈実行部2303は、2305の仲介部を通して図1の106のインターフェースからのイベント対応と、操作処理の呼び出しを行う。本実施例では、制御機器内からのイベント発生源として103の電源、104の内蔵時計が例示されているが、エアコンにおける検知温度の変化などの、対象機器固有の内部状況の変化などもイベント発生源として考えられる。
2304は、実行環境保持部であり、実行時の各種情報を保持する部分である。これらの情報には実行待ちのタイルの待ち合わせ場所、実行待ちのタイルに到達しているデータの情報などデータフローグラフを実行するにあたって必要な一時作業データが含まれる。
2305は、API仲介部であり、二つの機能から成る。一つはUIおよび制御機器からの反応処理対象となるイベントの識別子をキーとし、命令メッセージ識別子と、命令メッセージ識別子を送る対象となるオブジェクトへの参照を値とする表とその管理機能であり、もう一つは、解釈実行部2303から、外部機器及びUIタッチパネル図1の107に対する操作を仲介する機能である。
第二の実施形態の作業領域2306は、データフローグラフ内を流通する各種データの置き場所であり、識別子、数値、文字列や辞書、配列、二進木リスト構造体などのオブジェクトの実体が格納されている。本実施形態は、システムを構成する要素群もデータフローグラフを流通するデータトークンとなっていることを特徴としており、以降ではグリッドと称するデータフローグラフや、グリッド内の各タイル、メソッド識別子とグリッドの対の集まりで構成されるクラス定義、クラス識別子とクラス定義の対の集まりから成るクラス定義表などが、すべて作業領域2306に含まれる。
図24はこの実施例におけるユーザー画面への表示例である。この画面ではすでにプログラムが実行され、表示領域2401に”HELLO WORLD”という文字列が表示されて実行が終了している状態が表示されている。図24で表示されている各ボタンの動作とプログラムの詳細な説明は後述する。ここでは、基本的な構成要素についてのみ説明する。
2411,2412,2413には、それぞれ実行命令識別子とオペランドと呼ばれる実行オプション、入力データの入ってくる方向、出力データの排出方向を指示する図が描かれている。この矩形を以降「タイル」と呼ぶ。タイルに関する詳細は、図25で説明する。タイルについては、この実施形態でも、矩形となっている。
2408はタイルが縦横に隣接して配置されている領域で、第二の実施形態では、以降「グリッド」と呼ぶ。前記グリッドオブジェクトは、この領域の内容を保持するオブジェクトである。グリッドには識別のためのメソッド識別子が付けられている。2408のグリッドには「MainLine」という識別子が付けられており、表示領域兼プルダウンメニュー2407にその名前が表示されている。また、このグリッドと「Mainline」の対応は、「App」という識別子と対応しているクラス定義データトークンオブジェクト内に登録されており、そのクラス定義識別子名「App」が表示領域兼プルダウンメニュー2414に表示されている。図示の状態は、「AppクラスのMainlineメソッドの定義グリッド(データフローグラフ)の現状、言い換えれば編集状況の表示状態でもある。また、グリッド中の各タイルの位置を表す識別子として、列については左からA,B,C,…,Gとインデックスが付けられ、行については、上から1,2,3,…,7とインデックスが付けられる。識別子は列行の順に”A1”, “B2”などと表示される。例えば、2413のタイルの位置は”D3”である。2405は、グリッド表示上タイルの列のインデックスを表示している目盛り行であり、2406は、行のインデックスを表示している目盛り列である。
このMainLine盤面で表現されている「プログラム」を簡単に説明する。タイル2411は、CONSTというメソッドを入力0のオブジェクトに実行させる指示が図示記述されている。CONSTに対応する既定動作は、その実行対象である入力0のオブジェクトがどのようなクラスのデータトークンあっても、内容を無視して、オプションとして指定されていて、冒頭の4文字「”HELL」とのみ短縮表示されている”HELLO WORLD”という文字列データトークンを出力データとして、このタイルの下方に隣接しているタイルに渡す指示である。この動作定義は、入力0のデータトークンオブジェクトのクラス定義、あるいはスーパークラスの定義表の内容を元に決定される。第二の実施形態では、後述するように、既定のクラス階層の上位レベルのクラス定義で上記動作が定義および対応付けられている。タイル2412は、PRTというメソッドを入力0のオブジェクトに実行させる指示が図示記述されている。PRTメソッドに対する既定動作は、上方に隣接しているタイルからのデータ入力0のオブジェクトをPRTメソッドの実行対象としてとしてその内容を2401の表示領域に印字する。さらに、入力データをそのまま下方に隣接するタイルに渡す。タイル2413は、ENDメソッドの実行指示が記述されている。ENDメソッドの既定動作はメソッドの実行対象である入力0として上方に隣接しているタイルからのデータ自身を捨ててしまい、何も出力しない。このグリッドプログラムでは、タイル2413の実行によりデータが捨てられ、プログラム系全体を流通するデータがなくなることで系の実行が終了する。このプログラム中の矢印は、制御の流れではなく、データの流通経路を示しており、図式はデータフローグラフになっている。また、図式中の各タイルは、データフローグラフの実行節に対応している。
図24の2402は”RUN”とラベル付けされているプッシュボタンであり、押下するとセットされているプログラムの実行が開始される。このボタンを押下すると、2414で表示指定されているAppクラスのインスタンスが一つ作成され、それに対して、2407で表示されているMainlineメソッドを、入力0として作成されたAppクラスのインタンス自身を指定して、後述する実行評価メソッドを呼び出す。その結果2408で図示されているプログラムグラフの上辺中心のタイル2411の上に、実行のきっかけとなる入力0として実行評価メソッドの引数の入力0として渡されたAppクラスのインスタンストークンが投下され、以降必要なデータが到着して実行可能になったタイルの実行が続く。
2404は”NEW CLASS”とラベル付けされているプッシュボタンであり、押下すると新規に名前を付けたクラス定義を登録することができる。詳細は後述する。2403は”NEW METHOD”とラベル付けされているプッシュボタンであり、押下すると現在2414で選択表示されているクラス定義に新規に名前を付けた新規のグリッドが作成できるようになる。詳細は後述する。グリッドに対応付けられた名前は、タイル中の「メソッド名」として利用可能であり、新たな名前付きのグリッドを作成することで、そのグリッドが表現するアルゴリズムをサブルーチンメソッドとしてほかのグリッドや再帰的に自身のグリッド中で使用できる。
2414は表示領域兼プルダウンメニューであり、選択候補として、前記クラス定義表に登録されているすべてのクラス識別子が選択候補としてリストされる。ユーザーはこのメニューからクラス名を選択すると、2407にそのクラスが持っているメソッドの中から一つを選択できるようになる。
2407は表示領域兼プルダウンメニューであり、選択候補として2414で表示選択されているクラスが持っているすべてのメソッド識別子が選択候補としてリストされる。ユーザーはこのメニューからメソッド名を選択すると、2408の表示が選択された名前のグリッドの内容に切り替わり編集が可能になる。2407は、表示の切り替えと現在2408に表示されている盤面の名前の表示を兼ねる。
この実施形態では、第一の実施形態と同じく、グリッドは3×3、5×5、7×7など縦横とも奇数個のタイルになっている。
2409は、表示されているグリッドの入力データの方向を表示する領域である。グリッドは、一つ以上のデータ入力を受けるが、どの方向をデータ到着の方向とするかを設定することができる。2409はその表示領域である。この例では、T : Top すなわち上からデータが到着した時点でMainlineというメソッドの実行を開始する可能であることを表している。一方各タイルは0個以上の出力があり、どの方向が出力になるのかを2410の領域に表示する。この例では、Mainlineは外に対して出力をしないので、2410の欄は空白になっている。2415は「ALL」か「ANY」の二者択一のプルダウンメニューであり、グリッドの実行開始条件を表示している。すなわち、この値が「ALL」の場合には複数の入力がある場合すべてのデータが到着するまで実行しない、「ANY」の場合にはどこかに一つでもデータが到着すれば直ちに実行開始する種類のグリッドであることが表示されている。
図25は、各タイルの表示の詳細が2つ例示されている。図25(a)の2501は、2411で図示されたCONSTメソッドタイルを再掲したものである。2502は、矢印でない直線であり、外部からの入力がこの方向から、すなわち上から、入ってくることを表している。2503は入力データに対する識別子である。これは入力が複数あるような命令タイルのうち、入力を区別しないと結果が変わるような命令、例えば引き算や割り算のような命令を想定して付与されるものである。
2504はメソッドの識別子表示である。ここでは既定動作で定数を出力するCONSTメソッドが表示されている。そのほか、プログラムの実行系があらかじめ用意しているメソッド名を設定することはもちろん、すでに登録されている名前付きグリッドの名称を設定することもできる。さらに、後刻定義することを前提として、未定義の任意の識別子を指定することも可能である。2505は2504のメソッドに対するオプションの表示である。既定のCONSTメソッドは、メソッド識別子だけでは、どのような定数を出力するかが決定しないので、定数をオプションとして指定する。オプションを必要としないメソッドもある。
2506の外向きの矢印は、この方向、この例では下に隣接したタイルに対して、出力があることを表示している。入力と同様に出力にも識別子が付与され2507のように矢印に沿って表示されている。
図25(b)の2508は既定動作で複数の入力と出力を持つメソッドSWITCH実行指示タイルである。SWITCHメソッドは、既定動作では二つの入力と二つの出力を持つ命令であり、入力1が特別な識別子NILであれば、入力0として入ってきたデータを出力1へ出力し、そうでなければ入力0を出力0に排出する。この既定動作では、データは、出力0か出力1のいずれかに排出され、両方からデータが排出されることはなく、データNILを論理値の偽とみなして出力を切り替える条件分岐に該当するものである。2508では、入力0が上に隣接したタイルから、入力1が左から進入し、出力0として下に、出力1として右に隣接したタイルにて渡される。2510は、この方向、すなわち左からの入力が入力1であることを表示し、2511は、右への出力が出力1であることを表示している。
2508では、入力0、入力1、 出力0、出力 1をそれぞれ上、左、下、右と設定された表示になっているが、本実施例では、各命令タイルの入力方向と出力方向は自由に選択設定できる。これら入出力の方向が自由に設定できることから、混乱を避けるために入出力に識別子を付与する必要がある。
図26は、図24で表示されていたMainlineグリッドの部分を抽出して変形したものである。END命令タイルの位置が図24と異なっているが、アルゴリズムの表現としては同等である。ここで、2609は、現在の表示対象クラスがAppであること、2607は、現在のメソッドの表示がMainlineであることを表示しており、2608は、このMainlineグリッドが実行を開始できる条件「T」が表示されている。T単独の場合、上からデータが進入すれば、盤面の実行可能になる。この例では、図24の2402のRUNボタンを押すと、この盤面の2601の位置からデータAppのインスタンストークンが進入する。
投入されたデータAppのインスタンストークンは、タイル2602が入力0として受け取る。タイル2602は、入力0のメソッドCONSTの実行条件検査により、入力0のメソッドCONSTが即座にオプション”HELLO WORLD”付きで実行される。実行の結果2602の出力0として文字列”HELLO WORLD”のトークンが下に隣接するタイル2603に渡される。タイル2603は、上からのデータを入力0として受け取るように設定されており、受け取ったのち、入力0の文字列オブジェクトに対するメソッドPRTの実行条件検査が行われ、タイル2603のメソッドPRTが実行可能と判断され、2602の次に実行される。2603の実行の結果、入力された文字列”HELLO WORLD”のトークンは、図24の表示領域2401に表示され、そののちそのまま出力0として右隣りのタイル2605に渡される。タイル2605は、メソッド識別子2606としてENDが設定されている。タイル2605は左隣のタイル2603から、文字列”HELLO WORLD”を入力0として受け取る。文字列オブジェクトのENDメソッドは入力0にデータが到着した時点で実行可能となるため、タイル2605は2603の次に実行される。このENDの実行の結果、入力された文字列データ”HELLO WORLD”のトークンは参照が放棄される。この結果この系のいずれのタイルも実行可能ではないため、実行機構は処理を終了する。
2608の入力の方向記号としては、T、L、R、Bの各文字が使用でき、それぞれ上、左、右、下を表す。この記号の左からの出現順が、入力の識別子を指定することになる。例えば2608の「TL」という入力表示で2610の値が「ALL」である例示の場合は、上からと左からの両方にデータが到着したときに実行可能となることを表し、さらに、Tが入力0、Lが入力1に対応することも表している。もし、同じ入力表示で、2610の値が「ANY」の場合には、どちらかが入力として到着したときに実行可能となり、到着した方向が上からならば入力0, 左からならば入力1に対応付けられる。方向記号が一つだけ単独で指定された場合、その方向からのデータが到着した時点で実行条件チェックボックス2610の値にかかわらず、直ちにグリッドは実行可能となる。
図27(a)は、このプログラム言語の図1の106の実行エンジンの中の図23の2303である解釈実行部の動作を表すフローチャートである。解釈系は、起動すると、最初に2701にあるようにAppクラスのインスタンスを一つ生成する。次に解釈系はステップ2702にある通り、図27(b)の2704で図示される3x3のグリッドオブジェクトを生成する。全体の実行処理は、2704のグリッドオブジェクトに対して、入力0として2701で作られたAppのインスタンスを引数トークンとして、グリッドオブジェクトのメソッドである後述の実行評価手続きEvalを適用することに還元する。
図28は、グリッドオブジェクトクラスのEval手続きの既定の処理フローチャートである。この手続きで使用される作業用構造体については、図29に示す。図29に図示されている各種作業用構造体は、図23の2304の実行環境保持部に格納される。グリッドクラスの実行評価においては、作業用の領域としてコンテキストという構造体が利用される。コンテキスト構造体は、グリッドオブジェクト自身への参照、実行待ちタイルの待ち合わせキュー2901、途中で出力されたグリッドの出力トークンの待ち合わせ場所2902やそのほかのデータが保持される。
グリッドのEval手続きは、まずステップ2801でコンテキスト構造体を作成し、グリッドへの参照に自分自身を登録し、待ち合わせキューをクリアするなどの初期化処理を行う。次にステップ2802でEval手続きの引数として渡された入力トークンを所定のタイルに渡す。この時ステップ2803で、渡された到着済みデータ群2903と、データを渡されたタイル2905と、タイルの位置情報2904を保持する待ち合わせ子構造体を作成し、待ち合わせキューに登録する。
次に、グリッドのEvalは、待ち合わせキューから待ち合わせ子を一つずつ取り出し、この待ち合わせ子が実行可能であるかどうかを検査する。いずれか一つが実行可能であれば、その待ち合わせ子をキューから取り出し、ステップ2805に進む。キューが空、もしくは、どのエントリも実行可能でない場合は、ステップ2808へ進む。待ち合わせ子が実行可能であるかどうかは、待ち合わせ子に到着している入力0トークンのクラス定義に対して、タイルのメソッド名をキーとして検索を実施し、得られたメソッドの定義の実行可能条件情報を参照することで確認することができる。場合によっては、入力トークン0が未到着のケースも考えられるが、その時には、そのほかの到着済みのいずれかの入力トークンの定義に対して、メソッド名の検索を実施することでチェックすることで検査は実現できる。いずれの場合も、メソッドが、該当トークンに対して定義されていない場合や、見つかったメソッド定義の実行条件に書かれている「ALL」または「ANY」の条件値によって実行ができない場合には、取り出した待ち合わせ子は、キューに戻される。本実施例では、到着した入力0のトークンか、入力0が未到着の場合にはいずれかの到着済みトークンを対象に、指定のメソッドが実行可能かどうかを判定する。
ステップ2805では、キューから取り出された待ち合わせ子から、入力トークン群とメソッド名を取り出し、ステップ2804での実行可能検査に使用した入力トークンに対して、メソッド名と、入力トークン群を引数として実行評価メソッドEval()を実行する。この結果として0個以上の出力トークンが返り値として渡される。
ステップ2806では、2805の戻り値として得られた処理結果の各トークンを所定の方向の隣接タイルに渡す処理を行う。この時、隣接タイルの待ち合わせ子がすでにキュー内に存在する場合には、その待ち合わせ子の到着済みトークン置き場に追加する。この検索は、図29(b)の待ち合わせ子の情報をもとに行うことができる。もし、キューに隣接タイルの待ち合わせ子がない場合には、新規に待ち合わせ子を作成し、そこの最初の到着トークンとして到着トークン置き場に追加して、作成した待ち合わせ子をキューに追加する。
処理タイルがグリッドの端にあり、隣接するタイルが存在しないケースの処理2807では、その端がグリッドの定義の出力方向位置である場合に限り、コンテキストの出力待ちトークン置き場2902に留置される。それ以外の場所で端から出たトークンは廃棄されるかエラー発生のケースとしてシステムに報告されるかのいずれかの処置がなされることになる。
ステップ2804で待ち合わせキューから実行可能なエントリが見いだせない場合には、ステップ2808で、この手続きの戻り準備処理が行われる。戻り値は、コンテキストの出力待ちトークン置き場2902に留置されていたトークン群であり、出力番号に対応した位置で戻される。手続きの終了時にコンテキスト構造体は廃棄されるが、このとき待ち合わせキューにエントリが残っている場合には、残留トークンを検知したとシステムに報告する処理があってもよい。
図30は、図28の2804の実行可能エントリの探索処理フローチャートである。この探索処理では、結果として、実行可能な待ち合わせ子エントリを出力するか、実行可能なエントリがない場合には存在しなかったことを表すNULLを出力する。
3001は、キューが空の場合も含めて未調査のエントリがキューにあるかどうかを検査する。もしキューが空か、すべてのエントリが調査済みであれば、ステップ3009に進み、NULLを出力して終了する。そうでなければ、3002で未調査のエントリを一つ抽出する。
取り出したエントリには、図29の2903に到着済みトークンが登録されているので、まず、入力0が到着しているかを確認する。もし到着していれば、以下のメソッドの検索対象は、入力0とする。もし、入力0が未到着の場合には、到着済みトークンのうち入力番号の最も小さい入力を対象とする。この規則では、検索対象として、入力0を最優先候補としている。また、入力0が到着していない場合にも検索対象を選定するのは、指定のメソッドの実行開始条件が「ANY」である場合を考慮したものである。本実施形態では、いずれかの入力トークンに、メソッド識別子というメッセージを送る形式のオブジェクト指向を実現している。このため、いずれかの到着トークンを選定して、それにメソッドの適用を試みる形式で実行条件の抽出を行う。3004あるいは3005は、この対象トークンの選定規則の一部を構成している。
3004または3005の処理によって選定された対象トークンに対して、指定されているメソッド名2906に対応するメソッド定義が存在するかどうかをステップ3006で判定する。この判定にあたっては、上位クラスへの検索も含まれ、処理詳細を図31に示している。この判定結果として、メソッド定義の検索に失敗した場合は、実行可能ではないと判定し、調査している待ち合わせ子を調査済みに分類し、ステップ3001に戻る。メソッド定義が見つかった場合には、3007で到着済みのトークンの数とメソッド定義が要求している入力の数と一致するか、およびメソッド定義の中の値「ALL」か「ANY」か、などの判定により実行可能かどうかを判定する。もし、実行可能ではないと判定された場合には、調査している待ち合わせ子を調査済みに分類し、ステップ3001に戻る。実行可能と判定されたときには、ステップ3008に進み、この待ち合わせ子を出力とし、処理を終了する。この一連の検索判定処理中の上記904以降の処理規則の中で、入力0が未到着の場合、一つだけでなく。そのほかのすべての到着済みトークンに対して、メッセージの検索と実行条件の検査を行う規則でもよい。本実施形態ではデータフローグラフの作成者と共有されている所定の規則で検索対象のトークンを抽出し、それに対してメソッド定義を検索、実行可能性の判定を行う。
図31は、図30のステップ3006の指定メソッド定義の検索処理のフローチャートである。この処理の入力は、メソッド名と検索対象入力トークンであり、出力は検索されたメソッド定義オブジェクトか、見つからなかったことを示すNULLである。本実施例では、クラス定義は、上位スーパークラスのクラス定義トークンへの参照を持つ。スーパークラスのクラス定義も属性辞書を持ち、メソッドの名前と定義の表を持つ。
メソッドの検索は、まずステップ3101で、入力トークンのインスタンスメンバーが登録されている属性辞書に対して行われる。クラス定義よりインスタンスメンバーの定義が優先することにより、各インスタンスがメソッドを上書き定義できる。もし、属性辞書中にメソッド名と同名のエントリがあれば、その値を結果としてステップ3106で出力して処理は終了する。また、インスタンス属性辞書に定義がない場合には、ステップ3102でクラス定義を検索する。この検索でもクラス定義の持っている属性辞書を先に検索し、属性上に見つからなければクラス定義の既定のメソッド辞書を検索する。もし、クラス定義中のこれらの辞書中に該当エントリがあれば値をステップ3107で出力して終了する。
クラス定義中にも該当エントリがない場合には、クラス定義のスーパークラスのクラス定義を抽出し、次の検索対象にして、ステップ3101に戻ってループを形成する。もし、ここでスーパークラスの定義なかった時には、最終結論としてメソッドの検索結果としてステップ3105でNULLを出力して終了する。ここで、スーパークラスが複数ある場合には、ステップ3101以降のループを、ステップ3103でスーパークラスの優先度順の自分自身に対する再帰呼び出しに変更することで多重継承を実現することができる。また、ステップ3101以降のループを省略し、3101のNoの先を3105に接続すれば、継承なしのルールを実現できる。
図32は、本実施例におけるデータトークンオブジェクトの構造と、クラス定義オブジェクトの構造の図示である。これらのオブジェクトは、図23の2306作業領域に格納される。データトークンオブジェクトは、トークンのタイプを決定するクラス定義オブジェクトへの参照と、インスタンス変数の集まりに該当するインスタンス毎に異なる固有の情報を保持する属性辞書への参照から成る。本発明では、クラス定義も流通データトークンであり、したがってスーパークラスの定義も同様に、属性辞書をもつ。
図33は、本実施例におけるクラスの継承階層の例図示である。本実施形態では、クラス階層構造の最上位クラスであり、データフローグラフ内のデータ流通トークンの型である抽象クラスTokenが、メソッドの一つとして、コンテキストへの参照、メソッド名、オプション文字列、入力トークン群を入力パラメータとし、実行結果ステータスと出力トークン群を結果として返す実行評価手続きEvalを持つ。これにより、すべてのトークンは処理系の評価実行対象になりうる。
次に、本実施形態におけるイベント駆動機構の例を説明する。API仲介部図23の2305は、図34の3401のような発生イベントの識別子をキーとして、メソッド名と登録オブジェクトの二つを値とするテーブルを持つ。このテーブル一例を3402に示す。これは、UIが掲示する”ADD”、”SUB”、”MUL”、”DIV”の四つのボタンと値Aと値Bの入力項目のある図35の3501のようなダイアログに対するボタン押下イベントの登録表を表している。それぞれのボタンの押下イベント毎にエントリがあり、例えばADDボタンが押下されたときには、登録オブジェクトに対して、メソッドOnADDを実行するように指示することを表している。この時、OnADDの入力0は実施例の仕様により登録オブジェクト自身となり、入力1には、表示されたダイアログの項目名と値の組が入っている辞書トークン図35の3502が供給されるものとする。この例では、入力1の存在について明示されていないが、これは、実施例のシステムの仕様として暗黙に規定されているものとしてもよく、1301に追加エントリとして情報が明示されていてもよい。3402の例としては、四つのボタンに対する登録オブジェクトはすべて共通のトークン3403を参照しており、3403は、参照されている各エントリのすべてのメソッド名”OnADD”、”OnSUB”、”OnMUL”、”OnDIV”のエントリが属性辞書に入っている。もちろん登録表の各エントリは、対応するメソッド名に対する値が検索結果として抽出できるトークンであれば別々のものでもよい。
ADDボタン押下時のAPI仲介部2305におけるイベント発生時の手続きの呼び出しは、2402の実行ボタン押下時の図27の流れ図と同様であり、コンテキスト構造体を作成し、入力0に登録オブジェクトを入力1にトークン3502を投入してOnADDメソッドをコールするグリッドを作成し、そのグリッドオブジェクトの実行評価手続きEvalを実行することで実現できる。この動作は、図6のフローチャートの601のインスタンス作成を登録オブジェクトの取り出し、 2702のグリッド作成を上記グリッドの作成に置き換え、2703をこの作成したグリッドに実行に置き換えたものと同等である。
第二の実施形態では、以下で、図34の3402、3403、3404のイベント登録の状態で、3501のダイアログが表示されている状態から、各ボタンが押下されたときに、3503のようなメッセージダイアログを表示するようなアプリケーションを例示する。3504は、ADDボタンが押下されたときのメッセージが例示されており、ADDボタンに対する反応であることを表示する”OnADD”とA+Bの値である”122”が表示されている。このメッセージは、3501の設定値通りのA=45でB=77の時には、SUBボタンの時には、”OnSUB : -32”、MULボタンの時には、”OnMUL : 3465”、DIVボタンの時には、”OnDIV : 0.544”に変わるというアプリケーションであり、各数値は、ダイアログのA、Bの入力値によって各種演算結果に変わるものである
図36の3601は、3403として登録される辞書のサブクラスであるDialogHandlerクラスのクラス定義の中のOnADDメソッドの定義を示している。3602の入力指定”LT”が示すように、入力0の自分自身は左の入り口であるタイルA4の左から入り、入力1のダイアログ情報の辞書トークン3502は上の入り口であるタイルD1の上から入る。タイルD1からの入力は、タイルD1とE1において参照が3つ作られる。一つの参照は、C2のGETIメソッドで、オプションに書かれているキー”A”の値が出力0からタイルD2の入力0に供給され、もう一の参照はタイルE2でキー”B”の値が抽出され、タイルD2の入力1に供給される。タイルD2は、入力0のオブジェクトトークンに対する”A+B”メソッドの実行指示であり、数値オブジェクトのA+Bメソッドは、自分自身に、入力1の数値を加算した結果を出力0に出す。同様に数値オブジェクトの減算、掛け算、割り算のメソッドとして”A-B”, “A*B”, “A/B”が用意されている。
残りのタイルF1からの参照は、F3とG4に到達する。F3、G4ともにオプションを出力に出す、CONSTメソッドである。CONSTメソッドはクラスTに定義されており、そのサブクラスであるほとんどのオブジェクトが反応できる。結果は、F3は、出力に文字列”OnADD”をG4は出力に文字列” : “を出力する。
タイルE4は、メソッドに”A+B”が指示されているが、入力0は文字列”OnADD”である。例示のシステムでは文字列クラスで独自に”A+B”メソッドが定義されており、入力0である自分自身に、入力1のトークンの文字列化したものを連接する動作が定義されている。E4では、入力1は文字列なのでそのまま連接され”OnADD : “という文字列がタイルD4の入力0に供給される。D4も文字列に対するA+Bであるが入力1がD2の出力である数値であることがE4と異なる。ただし、数値オブジェクトは、例示のシステムでは、その値を10進数の表現文字列に変換することが可能であるので、D4から、”OnAdd : 122”という文字列トークンが生成される。
D4の出力を受け取るタイルD5は、ALRTというメソッドが指示されている。ALRTは、入力0のオブジェクトの文字列表現を3503のようなモーダルなポップアップダイアログに表示し、ユーザーがダイアログを閉じるのを待って、出力に入力0の値を渡すものである。ALRTもクラスTで定義されているので、そのサブクラスであるほとんどのクラスのオブジェクトが実行可能と設定されている。
ポップアップダイアログが閉じるとD6のENDが実行されるが、前述の通り、ENDは入力を放棄するだけであり、D1からの一連のデータフローは、ここで終了する。また、ここまでで、予定の動作は完了しているため、3601の左から入ってきた入力0は使用せずに放棄してもよく、この関係で、タイルA4で入力0を即座に放棄している。この2つのENDの結果、グリッド3601内には、実行可能なタイルがなくなり、イベントハンドラOnADDは終了し、API仲介部2305が発行したグリッドに対するEvalも終了して
イベント反応処理そのものが完了する。
以上のようなグリッドをOnSUB、OnMULL、OnDIVとして個別に登録すればアプリケーションは完成するが、それぞれは、3601の中のタイルD2である3603のメソッド名と、タイルF3である3604のオプションの値が違うだけであり、別個に手入力でプログラミングするのとは別法で、OnADDのグリッド定義を元に、その定義をコピーして、上記の違いの部分のみ書き換えて登録することも考えられる。この例示の以降では、この別法の書き換え定義登録のプログラムを例示する。
図37は、その書き換えを主導するメソッドDialogHandlerクラスのInitメソッドの定義である。このメソッドは、DialogHnadlerを表3401に登録する前に登録メソッドから呼び出される。そのタイミングは、DialogHandlerクラスのコンストラクタからでもよい。Initは、入力0に自分自身を受け取り、OnSUB, OnMUL, OnDIVのメソッドを定義して、これらが追加された自分自身のインスタンスを出力0から出す。このメソッドは5x5のグリッドで表現されているため、列はEまで、行は5までになっている。
メソッド Initでは、図38で示すようなDialogHandlerに定義されるメソッドAddOnが呼び出される。AddOnは、入力0にDialogHandler、入力1にタイルD2を置き換えるメソッド文字列、入力2にF3のオプション文字列とメソッド名のもとになる”OnXXX”のXXXの部分の文字列を取り、対応する”On~”メソッドを登録した状態のDialonHandlerオブジェクトを出力する。Initグリッド中では、タイルC2でOnSUBをC3でOnMULをC4でOnDIVを登録しており、各タイルの入力はとなっているB列のCONSTでは、”SUB”、”MUL”、”DIV”が、置き換え演算メソッドを供給するD列では、それぞれ”A-B”、”A*B”、”A/B”が供給されている。このアプリケーションの拡張例として、1401のボタンが増えて、剰余のボタンMOD(対応演算”A%B”)や、最大公約数ボタンGCDが追加されてもInitを拡張すればよいことになる。本実施例には、最大公約数を計算する直接のメソッドを持っているクラスはないが、数値クラスにメソッドGCDをユーザー定義し、その値としてユークリッドの互除法を計算するタイルを当てればよい。D列ろで供給する命令は、システム定義のメソッドである必要はない。
図38は、OnADDグリッドをコピーして編集し、DialogHandlerに追加するメソッドAddOnである。この定義では、入力方向が”LTR”になっており、入力位置は左A4から、入力1のメソッド名は上D1から、入力2の演算命令メソッド文字列は右のG4から入ってくる。入力0はそのオブジェクトから、A3のGETIメソッドによりOnADDに対応するグリッドが取り出されたあと、この辞書クラスのサブクラスであるグリッドオブジェクトの「浅いコピー」を作成するDUPメソッドがタイルA2で実行される。入力1の文字列は、E1-F2の領域のタイル群で、”On~”の文字列が作られ、C2とD4とE5のJCTを介してD6に供給される。また、入力2の演算メソッド文字列は、E5のJCTを介してD5に供給される。
メソッドJCTは、2入力/2出力のクラスTに図41のように定義されているメソッドで、入力0を出力0に、入力1を出力1にそれぞれ渡すものである。このメソッドは、図17のタイルE5のように入出力0と1を設定すると、グリッド上にデータフローの交差を作ることができる。このE5のJCTタイルにより、入力0の”On~”の文字列は、入力1のパスをまたいで、E4からE6に、G4からの演算メソッド名の文字列は、パスをまたいでF5からD5にそれぞれ到達する。
図38のタイルD4のRepLBLは、グリッドクラスに図39のように定義登録されているメソッドであり、自身のグリッドのタイルF3のオプションを入力1から入ってくる”On~”の文字列に置き換えて、その結果のグリッドを出力1から出すものである。同様に、タイルD5のRepOPも、グリッドクラスに図40のように定義登録されているメソッドで、入力0のグリッドのD2のメソッド命令を入力1の文字列に置き換えるものである。この2つメソッドがD4,D5で連続適用されることでD6の入力2には、置き換えが完成したグリッドが入ってくる。
図38のタイルD6のPUTは辞書クラスにシステム定義されているもので、PUTIと同じように、入力0の辞書に値を書き込み、書き込まれた辞書を出力0に出す動作を行うが、PUTIと異なり、キーが外部から入力1として渡され、書き込む値が入力2から供給されるものである。この結果、D6では、DialogHandlerのインスタンスに、”On~”をキーとして書き換え編集済みのグリッドを書き込んで出力をD7に渡しており、D7から、このAddOnメソッドの最終結果として出力される。
図39は、グリッドクラスに定義されているRepLBLメソッドの定義である。このメソッドの入力方向は”LT”となっており、入力0のグリッドが左のA4から、入力1である文字列”On~”の材料となる”SUB”のような文字列は上のD1からこのメソッドに入力される。まず、A4から入ったグリッドからは、A3のGETで、位置F3のタイルが取り出され、A2で複製される。このRepLBLは、複製したタイルオブジェクトのオプションの文字列を入力1で置き換え、入力0から入ってきたオリジナルのグリッドのF3に書き戻そうというものである。このタイルオプションの設定値が入っているキーOPTIONの値をD2のPUTで書き換え、そのタイルをC5のPUTで、F3に上書き書き戻して、D7からRepLBLの結果として出力している。この図39のRepLBLの定義では、A3のGETをGETIに、D2とC5のPUTをPUTIに変更することも可能で、それにより、グラフを簡略にすることも可能である。
図39のタイルD2では、A2で複製したグリッドの属性のうち、キーOPTIONに登録されているオプションの内容を、タイルD1経由でRepLBLの入力1として渡された値に書き換えるPUTメソッドが実行される。
図40は、グリッドクラスに定義されているRepOPメソッドの定義である。動作は、RepLBLと類似しており、左A3から進入しているグリッドから、位置D2のタイルを抽出し、コピーを作ったうえで、タイルの属性辞書中のOPNAMEエントリに書かれているメソッド名の値を入力1の文字列で置き換え、書き換えたタイルを元のグリッドのD2に上書き書き戻すものである。D2タイルの取り出しをタイルA2で、タイルのコピーをA1で、タイルのメソッド名の書き換えをC1で、グリッドへの上書き書き戻しをタイルC3のPUTIで行っている。前述のPUTIとGETIの採用による定義の簡略化については、こちらでは行われており、その結果として定義のサイズが5x5とコンパクトになっている。
以上のようなイベント駆動の仕様を取り入れた図式表現のプログラミング言語を提供することにより、機器制御や操作介入してくる人間や外部システムに対する応答処理を直截的に記述することができる。また、オブジェクト指向の言語仕様と、ほとんどのシステム要素を流通データトークンとして取り扱う仕様の導入により、図形式で上記のような制限された編集環境のプログラミングにおいても、プログラムによるプログラムの修正や新規作成のような記述能力の向上が実現される。
本発明は、タッチパネルのみでのプログラミングを可能にする。これにより、タッチパネルにする物理機構的変更で、表示装置を搭載しているあらゆる機器を元々の外形をほとんど変えずにプログラマブルにすることができる。特に、通常キーボードを持たない、スマートフォンやタブレット端末あるいはスマートスピーカーでのプログラミング手段として利用することができる。これにより、これらの機器にインストールされている複数のアプリケーションを制御し、組み合わせることで新たなアプリケーションの作成を容易にすることができる。さらに、入力装置が前記位置指定と二種類の指示機能のみを有すればよいので、手に障害がある人が容易にプログラミングできるような環境としても使用することができる。
また、プログラミングそのものにパズル的な要素がもともと含まれていることから、スマートフォンやタブレット端末上でのパズルゲームとしての応用も考えられる。
さらに、キーボードが既定の環境で存在しないようなデバイス上でもオブジェクト指向的プログラミングの実践および学習を可能ならしめる効果も期待できる。