Comments
Description
Transcript
XMLで記述されたスクリプト言語ScriptXML
日本ソフトウェア科学会第 25 回大会(2008 年度)論文集 1 XML で記述されたスクリプト言語 ScriptXML ScriptXML—A Script Language Written in XML 林 恒俊 † Tsunetoshi HAYASHI † 立命館大学情報理工学部メディア情報学科 Dept. of Media Information Science, Ritsumeikan University [email protected] 通常プログラミング言語はテキストデータないしは清書文書として記述される. 本発表ではテキストの代わ りに XML を用いてプログラムを記述するアイデアを提案する. さらに, XML による記述についてプログラ ミング言語の性質と比較して考察し具体的な記述例を提示する. さらに処理系のあり方について検討し, 解 釈プログラムの実装方法を提案する. 最後に既存のプログラミング言語記述と当発表のそれについて検討し, 将来の発展方向を考察する. はじめに 1 プロフラミング言語は非常に少数の例を除いてテ キストデータで記述されるか, あるいは Algol 系列言 語のように清書化テキストで記述される. これは記録 に必要な資源が少なくてすむことや高度の移植性を もたせることができる等の利点がある. しかし反面 • 処理系に必ず字句処理や構文解析が含まれる 可能である. 任意の原プログラムについてコード生 成を行ったり, 解釈実行するためには, この木構造が 主要な情報源である. 言語処理系の字句処理や構文 解析はテキストによるプログラム記述から木構造を 抽出するための手段にすぎない. したがって原プログラムをあらかじめ木構造で記 述し, その木構造からコード生成や解釈実行に必要な 情報を参照する手段を準備できれば言語処理系の前 • Web ページのように構文が異なる複数の記述 処理に関する無駄を省くことが可能である. 階層構造データを汎用的に表現し交換する既存の (HTML, CSS, JavaScript) が含まれる場合, 併 代表的な手段の例には次のようなものが考えられる . 存させるために手間がかかる 等の欠点がある. これらの欠点を克服するためには, • プログラムの構造を直接表現可能 • 他の記述と同一の構文 という性質を持った表現手段を採用すればよい. ScriptXML はこの原則に基づいて構成されたプロ グラミング言語である. 2 ScriptXML 2.1 基本原理 一般にプログラミング言語の構文は文脈自由文法 • ASN.1 (Abstract Syntax Notation One) aka X409[2] • XML (eXtensible Markup Language)[1] 両者ともに汎用木構造を記述するためには十分な機 能があり, 原プログラムを表現することが可能である. 実用上現存する複数の Web ページブラウザは XML 構文解析能力と木構造参照ライブラリを備えたアプ リケーションでありこれを利用しないことは考えら れないので本発表では XML を原プログラム記述手 段に採用した. このようにして定義された言語はプロダクション に基づいた手法により定義されている. 具体的には に利用するよりも, むしろ簡易な処理を実装するスク BNF 乃至は拡張 BNF が実際的に利用される. 一部 リプト記述向き利用に適している. の言語のように定義が構文図の場合でも適切に変換 したがってこの言語を以下では ScriptXML と呼ぶ. すれば文脈自由文法で記述することができる. さらに Web ブラウザ自身が単独のアプリケーショ 文脈自由文法で定義された言語は一般に入れ子あ ンとして構築されるよりもブラウザ機能を実現する, るいは階層構造を示し, 木構造により表現することが 例えば Webkit[4] のようなフレームワーク上に作成 日本ソフトウェア科学会第 25 回大会(2008 年度)論文集 2 されるようになっている. このようなフレームワー タ グ 説明 クを利用すればスクリプト処理系を独立したアプリ <node>· · ·</node> 木構造体 <op>· · ·</op> <left>· · ·</left> <right>· · ·</right> 演算子 ケーションとすることも可能である. また既存の OS でも XML は内部情報記述に広く 利用されていて OS の支援も手厚い. 2.2 動機 林による HyperPage[3] の報告には HyperCard に かわる文書創成プログラムについて述べられている. HyperPage は文書を目的指向な枠組みに基づいて構 築し, 必要ならスクリプトをメソッドとして定義する ように設計されている. そして文書の内容は XML で 記述される. スクリプト言語を設計している段階で通常のテキ ストによる言語記述と XML による文書記述が非常 に相性が悪いことが観察された. 例えば, XML 文書 右枝 記述は簡潔そのものであるが決して理解し易くは ない. むしろプログラムの構造を反映するために十分な タグの種類を採用することが望ましい. タグはつぎ のようなプログラム構造の階層にしたがって用意さ れる. • モジュール, ファイル • 関数, クラス • 制御構造 中にインラインで JavaScript コードを挿入する場合 • 文 次のような型式で記述しなければならない. • 式 <script type="text/javascript" 左枝 • 変数 language="javascript"> // <![CDATA[ // here goes any JavaScript code ログラムの記述には必ず利用しなければならない訳 // ではない. 今回の報告のバージョンではタグの属性 ]]> </script> 具体的なタグについて次節で述べる. XML のタグには属性を含めることができるが, プ は利用していない. これは注釈とタグが入れ子の記述で誤りではないが あまり明瞭明晰ではない. 3.2 言語仕様 そこでスクリプト言語そのものを XML の枠組み タグを定義するためには言語の仕様を確定しなけ で記述すればこの問題を解消することが可能である ればならない. この報告では少なくとも JavaScript ことに気がついたので, 考察を加えて今回報告するこ の記述の記述能力と同等の機能を備えた言語を想定 とにしたものである. 将来には ScriptXML が Web ページの標準スクリ プト言語として認められることを期待している. 設計方針 3 3.1 プログラム木と XML 原プログラムの内部構造は解析木よりもむしろ プログラム木あるいは抽象プログラム (abstract した. ただし, もともと JavaScript は演算子の種類 にとりとめがないため整理を行った. 言語はおおよそ次のような仕様を基本にしている. モジュール, ファイル プログラム単位を定義する. プログラムの格納を要求する単位にもなって いる. 関数, クラス 関数あるいはクラスを定義する. program)[5] として記述される. 実際には演算子を 変数と宣言 変数は原始型と参照型があり, 原始型は 整数, 実数, 文字である. 参照型は関数, 構造 伴った 2 分木により実装されることが多い. XML で 体 , 配列がある. 宣言文では初期値を定義しても この 2 分木上の木構造を忠実に再現すればプログラ よい. ム木の実装は可能である. 基本的に次のようなタグ があれば充分である. 制御構造 文列, 条件文, 繰返し文, 多分岐選択 日本ソフトウェア科学会第 25 回大会(2008 年度)論文集 実行文 代入文, 復帰終了文, 中断文, 割込み文 式と演算子 代入, 4 則演算, 要素選択, 関数呼出し 3.3 タグ定義 具体的なタグの定義について付録に纏めているの 3 に見える. ScriptXML プログラムを可視的に表示し た上, GUI を経由して DOM ライブラリで木構造を 直接触れるようにすればよい. ScriptXML の 処 理 系 の 開 発 と 並 行 し て 可 視 型 ScriptXML 編集プログラムも開発を進める予定で ある. でそれを参照してほしい. まとめと今後の課題 5 実装方針 4 4.1 ScriptXML 処理系の実現 5.1 現在の状況 本発表では XML で記述されたスクリプト言語 ScriptXML は XML で記述されているため, 実装 ScriptXML の基本項目について説明した. 現在 ScriptXML のアイデアを発想してからまだ間 とくに XML を解析し木構造表示に変換する, 字句処 がないため, 様々な事項を実際上十分に検討するには 理や構文解析は実装しなくてもすむはずである. [6] 至っていない. アイデアの実現可能性のすら深くは に様々な XML 支援ツールを利用することができる. によれば XMLHttpRequest を利用して XML を格納 検討していないが, 十分実現性があるものと考えて 可能なようである. いる. 格納された XML データは JavaScript のスクリプ 本発表の定義にも不充分な点や誤りが存在すると トから XML Document として参照される. 木構造 考えられる. 今後は ScriptXML についてさらにアイ として表現された XML Document について, 走査 デアを深化させるとともに実装についてなんとか実 を行ったり変更を加えたりすることができる DOM 現を試みる予定である. 数年後には選りすぐれた内 (Document Object Model) ライブラリが備えられて 容で報告したく思っている. いる. このライブラリを使ってインタープリタを実 装することが考えられる. インタープリタ処理内容は木構造から RPN 中間 言語を出力する処理と基本的に異ならない. 中間言 語を出力する代わりに仮想的に実行するとよい. これらの点を考慮した結果, 当面 ScriptXML は ブラウザを利用して実装を試みる予定である. 充分 な機能が実現できれば, HyperPage のようなアプリ ケーションに利用することも視野に入れて将来は Web ページフレームワークに組込むことを検討する. 4.2 エディタ SriptXML の問題点はテキストベースのプログラミ ング言語に比べて可読性が悪そうな点である. XML で記述されたテキストは原理的に読みこなすことは 5.2 形式的定義と DTD 現在の時点では ScriptXML は非形式的定義しか存 在しない. XML を取扱うためにも重要だと考えられ るのでできるだけ早急に形式的定義を完成する予定 である. 参考文献 [1] W3C, Extensible Markup Language (XML) 1.1 (Second Edition), 2006. [2] ITU-T Recommendation, X680–X683, Abstract Syntax Notation One (ASN.1), 2002. [3] 林 恒俊, オブジェクト指向に基づくドキュメント創成 プログラム—基本概念, JSSST-21, 2004. [4] http://webkit.org/ できなくはないが, 決して見通しのよい作業ではな [5] P. Wegener, The Vienna Definition Language, Computing Surveys 4(1), 1971. い. 高度に入れ子になったタグの対応を理解するこ [6] D. Flanagan, JavaScript, O’Reilly, 2006. とはかなり努力が必要そうに見える. しかし ScriptXML は元々木構造になっているため, わざわざ XML の記述を読む必要はない. 木構造のま ま直接とり使えば問題は解決する. 木構造を表示し 編集するプログラムを構築実装することはインター プリタの構築から見てもそれほど難しくはないよう 付録 SciptXML タグ定義 この仕様を満たすタグは概ね次のように構成され る. なおこの構成は予備版である. 日本ソフトウェア科学会第 25 回大会(2008 年度)論文集 モジュールとファイル モジュールは次のタグで表 示される. <scriptxml> · · · </scriptxml> これに関数定義と変数宣言タグが埋込まれる. 関数定義 4 • <do> タグ <cond>と<block>がそれぞれ 1 個づ つ埋込まれる. <cond>が前方なら while do 文, 後 方なら do while 文に解釈される. • <case> タグ <expression>, <const>と<block> 対の繰返し, <otherwise>と<block>対が 1 個埋込ま 関数はタグ<function>と</function>の れる. <otherwise>は空要素タグと見なされる. 間に次のタグをこの順に埋込むことにより定義される. <name> · · · </name> <params> · · · </params> <vars> · · · </vars> <block> · · · </block> <name> <params> 関数名を文字列で指定する <vars> <block> 局所変数宣言で選択項目である 引数宣言で選択項目である 関数の本体で, 制御文や実行文が 実行文 タグ<block>と</block>の間に埋込まれた 次のタグで表示される実行文によって実質的作業内 容が定義される. <assign> · · · </assign> <break> · · · </break> <return> · · · </return> <on> · · · </on> <assign> 個とり, 代入操作を表示する 埋込まれる <break> 変数宣言 変数はタグ<vars>と</vars>の間に次の 宣言記述タグを繰返し埋込むことにより定義される. <name> · · · </name> <primitive> · · · </primitive> <target>と<expression>対を 1 空要素タグで最内側の繰返しを終 了する <return> 埋込まれた<expression>を返し て復帰する <on> イベント名と<block>を埋込み, イベント発生時に<block>を実行 <complex> · · · </complex> <const> · · · </const> するように宣言を表示する <name> <primitive> 変数名を文字列で指定する 式と演算子 原始型型名を文字列で指定する ドの式, 変数や定数を埋込み, 値を計算する式を定義 <complex> 参照型で再帰的に宣言記述を埋込 する. <expression>を入れ子に埋込んでもよい. む <const> 選択項目で初期値を指定する <primitive> と <complex> は排 他的に使われる <op> · · · </op> <name> · · · </name> <const> · · · </const> <op> 制御構造 関数の本体はタグ<block>と</block>の 間に埋込まれた制御文タグによって実行が定義される. <if> · · · </if> <do> · · · </do> <case> · · · </case> <expression>タグに演算子とオペラン 演算子をデータに表示し, 1 個必 要である <name> <const> 変数参照を表示する 定数を表示する 演算子は 4 則演算, 比較演算, 論理値演算, 論理演算, 要素参照, 添字演算, 関数呼出し等が必要と思われ • <if> タグ <cond>, <then>, <else>が埋込まれ る. ほとんどの演算子は 2 項乃至は単項演算子なの <cond>の内容は<expression>と同様であり, で, <op>以外の要素は 1 個か 2 個であるが, 関数呼出 <then>と<else>の内容は<block>と同様である. な しでは引数として必要な数の要素を表示する. お<else>は選択項目である. 代入文の<target>も内容は<expressiono>とほぼ 同じになる. る.