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