Specriptは、
なお、Specriptは、独立行政法人 情報処理推進機構(IPA) 未踏ソフトウェア創造事業の支援を受けて開発されました。
Specriptは、会計、在庫管理、受発注管理などに代表される企業システムを構築するときの、 ビジネスロジック記述用途に特化した言語です。ビジネスロジックの仕様を宣言的 ("What"指向)に記述できるDSL(Domain Specific Language)です。
Specriptは、実装用のプログラミング言語というより、いわばビジネスロジックの 詳細仕様記述と言うべきレベルの記述性の高さをもった言語です。 業務アプリケーション向けの形式的仕様記述を目指した言語であると言っても構いません。
*
現状の業務アプリケーション開発の現場では、次のような事態がよく発生しています。 それは・・・Javaなどで実装される場合、「仕様書」なるドキュメントが別途必要と なりますが、多くの現場でドキュメントは作成後にはほとんど保守されず、現状の仕様を 把握するのには役に立たなくなっていたりします。最新の仕様は担当者の頭の中にのみ 存在することとなります。そして、その担当者が異動等でいなくなると、結局、現状仕様は ソースコードから読み取らざるを得ないこととなります。しかし、Javaソースコードから 仕様を完全に読み取るにはやはり困難さがあります。この問題に起因するトラブルが 頻発している現場も現実に存在します。
そこで、我々開発チームは、実行されるソースコード自体に仕様記述と言えるほどの記述の 抽象度、記述性の高さがあれば、別途「仕様書」が無くともソースコードさえあれば、 確かに現在稼働中である仕様を確実に、かつ容易に、把握することができるのでは ないか、と考えました。
業務アプリケーション分野に形式的仕様記述を導入することで、保守局面における 品質問題を根本解決することができるものと考えました。
*
Specriptはオブジェクト指向を目指した言語ではありません。我々開発チームは、一般に 業務アプリケーションでは、(‘実装’のレベルではオブジェクトモデルが適している面も あるにしても、)‘仕様記述’のレベルでは、無理にオブジェクトモデルに統合して取り扱う 必要は無いと理解しました。業務機能・業務処理手順はデータモデルからは分離、独立させて、 素直にそのままデータ処理のI/P/O(入力/処理/出力)を書き下していく方が、 新規設計局面においても、そして何よりも保守局面のために、よほど実際的な設計様式では ないかと認識しています。
*
Specriptでは、その業務処理手順はfunctionという言語要素で表すこととなります。 functionの本体は、命令の列−手続き−ではなく、一つの‘式’として表現されます。
functionの入力および出力となるデータは、specという言語要素で表されます。 specとは、JavaのclassやC言語のstructのようなもので、取り扱うデータモデルを 定義するものとなります。しかし単にデータのタイプを表すだけではなく、そのデータの 取り扱いに関する業務ルール、即ち、データの値内容に関するルール、さらに言い換えると、 取り得る値の範囲や書式、データ項目間の関係性についての制約、を、constraint function (制約関数)という評価式で表し、その評価式をデータの定義であるspecの一部として 宣言的に定義することができます。データの項目定義とその取り扱いルール定義を、 specとして一つに取り纏めておくことができます。
functionが呼び出されるとき、その入力として引き渡されたデータが、その functionの入力(=引数)に指定されているspecの制約関数を満たすかどうか 評価されます。満たしたときのみ、functionの処理本体が実行されます。引き渡された データが引数のspecの制約関数を満たさなかったときはSpecViolationException (制約違反)が発生し処理は中断、functionの処理本体が実行されることがありません。
以上のように、functionで表される業務処理手順本体と、specの制約関数に よって表される業務データの取り扱いルールとが明確に分離されつつ、両者が協調的に 振る舞う機構が実現されています。
Specriptにはまた、propertyという言語要素があります。propertyを用いて、 少量で更新のかからない、コードマスターや処理振り分けパターンを表すための対応表の ようなデータを、実際に表形式に近い文法でSpecriptのソースコード上に記述して おくことができます。functionでは、このpropertyを参照するような 処理本体を定義することができます。
*
Specript実行環境はJavaで実装されており、JVM環境下でJavaプログラムと協調して 動作するよう設計、構築されています。コンパイルされたSpecriptコードは、Javaで 実装されたSpecript実行環境によってインタープリットされます。
SpecriptコードからJavaコードをジェネレートする訳ではなく、Specriptコードを 直接実行する方式です。
Specriptは、プレゼンテーション−ビジネスロジック−データアクセスの3層モデルにおいて、 中間層であるビジネスロジック層を担うことを目的にしています。Java Webアプリケーションにて Specriptを使用する場合、一般に下記のようなアーキテクチャを採ることとなります。
JSP/Servlet、JSF、Struts、その他のWebアプリケーションフレームワークを 使用してプレゼンテーション層を構築してください。Specriptはビジネスロジック記述に 特化しており、プレゼンテーション層を担うことはできません。
このJavaで実装されたプレゼンテーション層からSpecriptで記述されたビジネスロジックを 呼び出すこととなります。
SpecriptにはJava APIとして、SpecriptRuntimeというJavaクラスが 用意されています。SpecriptRuntimeクラスはSpecriptコードの実行環境を 表すクラスです。
Strutsの場合なら、Actionクラスが(通常はServletContextに保持させた) SpecriptRuntimeのインスタンスに、Specriptで記述されたビジネスロジックの 実行を要求することとなります。具体的には、実行したいSpecriptのfunctionの 名前を指定して、呼び出します。
業務アプリケーションの中核となるビジネスロジックはSpecriptで記述します。 Specriptの詳細仕様記述と言えるほどの記述性の高さが、ビジネスロジック仕様を ソースコードから直接的に読解することを容易にするでしょう。
Specriptコードは外部のデータ資源(※多くはRDB)へのアクセスを行うために、 Javaコードの支援を受ける必要があります。DataSource/JDBC、その他のライブラリを 使用して、Specriptのためのデータアクセス層を構築してください。
Specriptコードからは、これらJavaで実装されたコードはextern functionという 言語要素として取り扱われます。
なお、提供しているSpecriptのパッケージには、シンプルだが十分実用的な DataSource/JDBCベースのデータアクセスライブラリが同梱されています。
3層モデルにて、中間層のビジネスロジック層を担う・・・
Specript実行環境は、そのコアはSchemeで実装されています。Specript実行環境全体は Javaで実装され、JVM上で稼動します。コンパイルされたSpecriptコード (その実体はS式!)は、このJava+Schemeで実装されたSpecript実行環境上で インタプリトされ、実行されます。 Specript実行環境は、Javaコード側からはSpecriptRuntimeという クラスとして取り扱われます。(前段、「アプリケーションのアーキテクチャ」を もう一度参照してみてください。) |
Specript実行環境は内部にSchemeインタプリタを包含しています。 このJava製Schemeインタプリタの実装として下記パッケージを使用しています。
SISC - Second Interpreter of Scheme Code (http://sisc.sourceforge.net/)
我々はSISCとその開発者、Scott G. Miller氏に謝意を表明します。
Specriptのコンパイラや実行環境の実装は、オープンソースソフトウエアとして公開します。
現時点(2008年6月)で具体的なライセンス体系は未定ですが、いずれにしても、企業内で フリーに導入していただくことを妨げないことを第一の要件に据える方針です。
Specriptの概要を理解するために、下記文書も参照してみてください。
※リンク先ページの「業務アプリケーション開発用途向けWhat記述指向言語の開発」を参照
(c)2007-2008, Specript Development Team | Last Updated: 2008-06-01 |