Delphi Prismには、必要とする機能に合わせて2つのエディション「Professional Edition」「Enterprise Edition」をご用意しております。
Professional Edition
Delphi Prism Professional Editionは、データベースへのローカルアクセス機能を含む、汎用的な機能を必要とする開発者向けの.NET開発ソリューションです。Professional Editionには、IDEの全機能、Delphi Prism言語、dbExpress for ADO.NETを使用したInterBase/Blackfish SQLへのローカルアクセス機能が含まれます。さらにProfessional Editionは、InterBase/Blackfish SQLに対応したデータベースに依存しないASP.NETプロバイダモデル実装も搭載しています。
Professional Editionは、独立系ソフトウェアベンダ(ISV)、データベースへのリモートアクセスを必要としない開発者、汎用的なWindowsアプリケーションやユーティリティを作成される開発者に適した製品です。
Enterprise Edition
Delphi Prism Enterprise Editionは、dbExpressを使用してInterBase/Blackfish SQLにリモートアクセスする必要がある開発者向けの製品です。さらにEnterprise Editionでは、Delphi 2009(RAD Studio 2009)のDataSnapで構築された多層型サーバーに接続するクライアントを開発することも可能です。
Delphi Prismは、CodeGear RAD Studio 2009 の Professional Edition、Enterprise Edition、および Architect Edition の一部としても提供されます。
マルチプラットフォームのCLRをサポート
Delphi Prismの主要な機能のひとつとして、Mono for LinuxやMono for the Macを含むあらゆるCLRをサポートしていることが挙げられます。Delphi Prismのコンパイラは、Mac OS XおよびLinux向けのMono上で動作可能なマネージドコードアプリケーションです。さらにコンパイラは、Intermediate Language(IL)に完全に準拠したアセンブリを生成しますので、生成されたアセンブリはCommon Language Runtime(CLR)が動作するあらゆるOSで実行可能です。
Delphi Prismは、Windows/Mac OS X/Linux向けのMonoプロジェクトに対応したプロジェクトテンプレートを搭載しています。

図1 - 「新しいプロジェクト」ダイアログにMonoアプリケーション開発用のテンプレートを表示
Delphi PrismのアプリケーションをMonoプラットフォーム上で実行する方法についてもっと詳しく知りたい場合は、CodeGear Developer Networkの記事「Using Mono and Delphi Prism」を参照してください。
Delphi Prismには「Mono for Windows 2.0.1」が含まれており、必要に応じてインストールできます。
多種多様なデータベースへのアクセス
Delphi Prismは、ADO.NETでの開発に対応した強力なフレームワーク「dbExpress 4」を搭載しています。これにより.NET開発者は、バックエンドの特定のデータベースに縛られることなく、1つのフレームワークで複数のデータベースにアクセスすることができます。現時点で提供されるdbExpressのバージョンにはInterBaseおよびBlackfish SQLをサポートしていますが、将来、より多くのデータベースサポートを追加する予定です。

図2 - InterBaseおよびBlackfish™ SQLをサポートしたVisual Studioのサーバー エクスプローラ
データベースに依存しないASP.NET開発
Delphi PrismにはdbExpressベースのASP.NETプロバイダモデル実装も含まれます。これによりDelphi Prism開発者は、dbExpressを使用して汎用的にデータベースにアクセスできますし、ASP.NETのロール/プロファイル/メンバシップ用にdbExpressベースのデータベースを使用することもできます。
DataSnapによる多層システムのクライアント開発
Delphi PrismにはDataSnap向けのADO.NETドライバも含まれます。DataSnapとは、エンバカデロが開発したdbExpressベースの強力な多層システム開発用フレームワークです。Delphi 2009(RAD Studio 2009)を使うことで、開発者はあらゆるバックエンドデータベースへの「ゲートキーパー的なアクセス」を中間層で提供するサーバーアプリケーションを構築できます。このサーバーは、データベースへの直接接続およひデータへのアクセスのほか、サーバーメソッドを使用して汎用的なメソッド呼び出し機能を提供することもできます。
サーバーメソッドは、サーバーアプリケーション内のクラスによって提供される特殊なメソッドです。開発者は、dbExpressの型システムを利用することにより、サーバーメソッドを簡単にDataSnapクライアントに公開することができます。Delphi Prismは、DataSnapサーバーをADO.NETへインポートする機能を搭載しています。Datasetを返すサーバーメソッドはテーブルとしてアクセスされ、またサーバーメソッドはストアドプロシージャとしてもアクセスできます。これにより開発者は、Delphi for WindowsでストアドプロシージャをコーディングしてDelphi Prismからアクセスすることが簡単に行えます。
Delphi Prismのロードマップでは、将来、Delphi Prismを用いてDataSnapサーバーを構築できるようになることを予定しています。
Delphi Prism言語は、.NET 3.5 Frameworkに完全対応した強力な言語です。Delphi Prism言語は、LINQ、無名メソッド、デリゲート、ジェネリクスなどを含め、.NETが要求する全ての言語イディオムをサポートしています。Delphi PrismはObject Pascalを起源に持つため、Delphi開発者にとってとても馴染み易い文法を採用しています。Delphi for Win32で記述された既存のDelphiコードを移行することも容易です。
Delphi Prism言語は、.NET開発者が望む全てのモダンな言語機能のほか、追加の機能を搭載しています。Delphi Prismのパワーを示す言語機能のいくつかを以下で解説します:
ジェネリクス(Generics)
開発者はジェネリクスを使用すれば、特定の型を指定することなく、ある型を参照するコードを記述することが可能になります。パラメータ化された型とも呼ばれるジェネリクスは、特定の型に縛られずに処理を行える、汎用的で「ジェネリック」なクラスを記述することを可能にします。ジェネリクスの利用形態としてリストがあり、このリストクラスを記述する時点ではリストの中に格納されるアイテムの型を特定する必要はありません。
ジェネリッククラスのメンバがジェネリックな型を参照している場合、それらは実行時にJust-In-Timeコンパイラにより実際の型を参照するようになります。Microsoft .NET Frameworkには、List<T>型のようないくつかの汎用的なクラスが予め組み込まれています。List<T>型は、T型の参照を複数個格納できる動的なリスト構造で、Tにはあらゆる型を指定できます。例えば、Tlist<T>は開発者が望む全ての型に対する「型安全なリスト」となるでしょう。
ジェネリッククラスは以下のようになります:
type
MyList<T> = class
(System.Object
, System.Collections.Generics.IEnumerable<T>)
where T is
class
;
private
fData: array
of
T;
fCount: Integer;
public
...
このクラスを利用するには、型宣言においてジェネリックな型を定義する必要があります:
var
Data: MyList<String
>;
begin
Data := new MyList<String
>;
Data.Add('Test'
);
ジェネリクスには、パラメータ化された型として特定の型を含めることも可能です。制約を使用すれば、ジェネリックな型が特定の機能(特定のインターフェースを実装しているとか、クラスなのかレコードなのか、パラメータを持たないコンストラクタがある)を持つことを保証できます。
type
MyClass<T> = class
(System.Object
)
where T has constructor
, T is
record
;
method Test<Y>(Left: T; Right: Y);
where Y is
class
, Y is
IEnumerable;
end
;
クラスコントラクト(Class Contracts)
クラス不変条件(Class Invariants)
クラス不変条件とは、クラス宣言内に記述してある変数が特定の状態にあることを保証する条件式です。例えば、次のクラス宣言はSomeInteger変数が常に10より小さいことを要求しています。もしコード中でSomeInteger変数に10以上の値を代入した場合は、アサーション(表明)が発生します。
type
TClassWithInvariant = class
public
SomeInteger: Integer;
public
invariants
SomeInteger < 10;
public
procedure
SetSomeIntegerGreaterThanTen;
end
;
Require/Ensure
クラスの定義では、メソッド本体の前にrequire部、およびメソッド本体の最後にensure部を追加できます。これらの場所ではコードが通常実行された場合に満たさなければならない「事前条件」「事後条件」を定義できます。条件として、メソッド実行の最初と最後で判定されるBooleanを表す条件式を記述します。
クラスコントラクトは一般的に、メソッドが要求する「入力パラメータ」「戻り値」「オブジェクトの状態」の妥当性を検証するために使用されます。もしクラスコントラクトが「破られた」場合には、アサーション(表明)が発生します。
method MyObject.DivideBy(aValue: Integer);
require
aValue <> 0;
begin
MyValue := MyValue/aValue;
end
;
method MyObject.Add(aItem: ListItem);
require
assigned(aItem);
begin
InternalList.Add(aItem);
ensure
Count = old Count +1;
End
;
method MyObject.DoWork(aValue);
require
Assigned(fMyWorker);
fMyValue > 0;
aValue > 0;
begin
ensure
Assigned(fMyResult);
fMyResult.Value >= 5;
end
;
require/ensureの宣言にコロン(:)および文字列を追加することにより、出力されるメッセージをカスタマイズするこができます:
method MyObject.Add(aItem: ListItem);
require
assigned(aItem) : 'List Item for MyObject cannot be nil'
;
begin
InternalList.Add(aItem);
ensure
Count = old Count +1 : 'MyObject: Count logic error'
;
End
;
スコープ前置詞「old」は「ensure」部で使用し、ローカル変数およびパラメータの実行前の古い値を参照することができます。
コンパイラは、メソッド本体の実行に先だち、ローカル変数の値を保存するコードを追加します。「old」は文字列型およびValueTypeをサポートします。
メソッドコントラクトとクラス不変条件により、開発者は明示的・明確にコードの要件を宣言することができ、コードの品質を高め、設計通りに動作することを保証します。
LINQ
LINQ(Language Integrated Query)とは、イテレート可能なデータ構造に対してSQL文に似たクエリーを直接コード中で実行できるようにした、強力で新しい言語イディオムです。単純な例として、以下のコードは年齢に応じてCustomerを選択するものです:
method MainForm.button10_Click(sender: System.Object
; e: System.EventArgs);
var
YoungCustomers: sequence of
TCustomer;
begin
YoungCustomers := from Customer in
ListOfCustomers;
if
radioButton1.Checked then
begin
YoungCustomers := from Customer in
YoungCustomers where Customer.Age < 30;
end
else
begin
YoungCustomers := from Customer in
YoungCustomers where Customer.Age > 30;
end
;
if
checkBox2.Checked then
begin
YoungCustomers := from Customer in
YoungCustomers order by Customer.Age;
end
;
textBox4.Clear;
for
each Customer: TCustomer in
YoungCustomers do
begin
TextBox4.Text := TextBox4.Text + String
.Format('{0} {1} is {2} years old'
#13#10, Customer.FirstName, Customer.LastName, Customer.Age);
end
;
end
;
注目すべきは、新しいLINQ文を使用してCustomerのシーケンスから簡単にCustomerを選択して、YoungCustomersに代入している点です。
LINQは、Datesetやenumeratorをサポートするデータ構造に対して問い合せを行うことも可能です。
プロパティ通知(Property Notifications)
プロパティ通知とは、あるプロパティの値が変更された時に、プロパティに対して通知を行う言語機能です。プロパティにnotifyを指定すると、そのクラスは暗黙的にSystem.ComponentModel.INotifyPropertyChangedインターフェースおよびSystem.ComponentModel.INotifyPropertyChangingインターフェースを実装したことになり、プロパティが変更されたときにインターフェースで定義されたイベントが呼び出されるようになります。
デフォルトではクラスで定義されたプロパティ名が渡されますが、notifyは、イベントに渡されるプロパティ名を変更できる文字列パラメータをサポートしています。
プロパティ通知は次のように宣言します:
type
ValueClass = class
public
property
Value: Integer; notify;
property
Name: string
; notify 'ValueName'
;
end
;
プロパティ通知は次のように実装します:
var
v: ValueClass;
begin
v.PropertyChanged +=
method (sender: Object
; args: PropertyChangedEventArgs)
begin
MessageBox.Show(String
.Format('Property changed: {0}'
, args.PropertyName));
end
;
end
;
並列プログラミング
並列ループ (Parallel Loops)
.NET環境にMicrosoft PFX Frameworkがインストールされている場合には、並列ループは複数のコアやスレッドに割り当てられて実行されます。
for
parallel i: Integer := 0 to
10 do
...
for
parallel i: Integer := 1 to
49 step 7 do
...
フューチャー(Futures)
フューチャーとは、並列コンピューティングを活用してマルチコアやマルチCPUのシステムで効率良く動作するアプリケーションを開発するために設計された、新しい言語概念です。futureは強く型付けされた変数で、計算が完了しているかもしれない、もしくは完了してないかもしれない変数を表しますが、必要になる時点では利用可能であることが保証されています。
次の擬似コードの断片を考えてみてください。バイナリツリーの合計値を計算しています:
method ThreeNode.Sum: Int32;
begin
var
l: Int32 := Left.Sum;
var
r: Int32 := Right.Sum;
result r+l;
end
;
コードでは、まず左側の部分木の合計値を計算し、その後右側の合計値を計算します。最後に2つの値を足し合わせます。"l" および "r" の値の計算には比較的長い時間がかかるかもしれませんが、"l"の値はメソッドの最終行までは実際には必要とされません。これはfutureにはうってつけの場面です:
method ThreeNode.Sum: Int32;
begin
var
l: future Int32 := async Left.Sum;
var
r: Int32 := Right.Sum;
result r+l;
end
;
前述したようにその場で"l"の値を計算する代わりに、"l"を future Int32 と定義しました。これにより、この変数は実際にはLeft.Sumの値を保持しないと宣言したことになりますが、将来のある時点では値を保持していることが保証されます。コードの最初の行は、実際には一瞬にうちに実行されてしまい、その後前述した変更されていない"r"を計算する行がそのまま実行されます。
非同期メソッド
予約語 async で修飾されたメソッドは、別スレッドで実行されます。その実装はPFXフレームワークがインストールされているか否かで異なります。インストールされている場合は、非同期のブロックはPFXフレームワークによりタスクとして実行されますが、インストールされていない場合は、.NETのスレッドプールに追加されます。
asyncブロックを定義するには、ブロックの前に予約語asyncを追加します。以下はその例です:
async for
i := 0 to
10 do
begin
...
end
;
より一般的には、ブロックを以下のように修飾します:
async begin
...
end
;
非同期メソッドが値を返す場合には、その値はフューチャーになります。
その他の言語機能
Delphi Prismには、全ての言語構造(オブジェクト, 配列, レコード, セット, 列挙型, case文, forループ 等)の他、拡張メソッド、無名メソッド、デリゲート、属性、クラス参照、インターフェース、ラムダ式、演算子オーバーロードのような追加の言語機能が搭載されています。
Delphi Prism言語の完全な仕様は、次のオンラインWikiを参照してください。
Delphi Prismは、IDEとしてVisual Studio Shellに統合されます。これにより、Delphi Prism開発者はVisual Studio Shellの機能をフル活用できます。Delphi Prismがインストール済みのVisual Studioに統合された場合、Delphi PrismプロジェクトグループにはC#, VB.NETやその他の言語のコードを含めることが可能で、またそれらの言語のプロジェクトにDelphi Prismのコードを含めることも可能です。Delphi Prismは、Intellisense, Error Info, Code Snippets, Parameter Info, デバッグ機能などのVisual Studio IDEのパワーをフル活用することができます。Delphi Prismは、完全に統合可能な言語プラグインであり、.NET言語のエコシステムのれっきとした一員です。
デザイナ
Delphi Prism開発者は、Winforms, ASP.NET, WPFの開発にデザイン機能をフル活用できます。市販されているVisual Studioに統合される場合は、Silverlightのデザイン機能をインストールすることができます。
サードパーティ製コンポーネント
Delphi Prism開発者は、WinForms/ASP.NET/WPF/Silverlightに対応した様々なサードパーティ製コンポーネントをインストールして利用できます。Developer Express, Infragistics, TMS Softwareやその他の商用ベンダーのコンポーネントも全てDelphi Prismで利用可能です。他の.NET開発言語で記述されたオープンソースやフリーウェアのコンポーネントも利用可能です。つまり、Delphi Prism開発者はあらゆる.NETコンポーネントを利用できるのです。
Visual Studioのエコシステム
Delphi Prism開発者は、様々なVisual Studioのプラグインやアドオンツールをインストールして利用することができます。例えば、MSBuildのactionはDelphi Prismからも利用可能です。さらに、特定の言語機能を要求しないVisual Studioのプラグインであれば、それらも全てDelphi Prism開発者が利用できます。Delphi Prismは、.NET CodeDOM のフル実装も提供しています。NUnit, NHibernateのようなライブラリや、その他の.NETプロジェクトも全てDelphi Prism開発者が利用できます。

図3 - Delphi PrismはIntelliSenseをフルサポートしています
さらにDelphi Prismは、dbExpressデータベースフレームワークをサーバー エクスプローラに統合し、開発者がADO.NET用のdbExpressドライバにアクセスできるようになっています。Delphi Prismには、InterBaseおよびBlackfish SQL用のdbExpressドライバが搭載されていますが、今後のアップデートによりドライバが追加される予定です。
Connect with Us