【文献】
Microsoft,AsmL:The Abstract State Machine Language,2006年9月2日,pp.31−45,URL,http://www.codeplex.com/Download?ProjectName=AsmLDownloadID=34455
(58)【調査した分野】(Int.Cl.,DB名)
請求項1に記載のシステムであって、前記プログラミング構文が、前記型リファインメント構文で特定した少なくとも2つの型の共通集合の仕様を含むことを特徴とするシステム。
請求項1に記載のシステムであって、前記プログラミング構文が、前記型リファインメント構文で特定した少なくとも2つの型の和集合の仕様を含むことを特徴とするシステム。
請求項1に記載のシステムであって、前記プログラミング構文が、前記型リファインメント構文で特定した少なくとも2つの型の和集合および少なくとも2つの型の共通集合の仕様を含むことを特徴とするシステム。
【発明を実施するための形態】
【0012】
概説
「背景技術」で記述したように、とりわけ従来の型システムは、作成したプログラムの表現力に制限を与え、得られたストレージ構造ならびにアルゴリズム的処理の効率に制限を与える、ある種の煩雑さならびに柔軟性の欠如を有する。従来のシステムの上記弱点は、大規模データストレージおよび処理システムに関連するような規模の大きい状態で遂行するときに特に実感される。
【0013】
Dはマイクロソフトにより設計されたプログラミング言語であり、データ集約型プログラムを作成するのに非常に適している。Dの型付け(typing)システムは、複数の異なる型のプログラムの和集合および/または
共通集合を表す能力を含むがそれに限定されない言語表現の相乗効果を可能にする固有の機能の組み合わせを支援する。事例として、一実施形態において、型システムはリファインメント型および型メンバシップの式の組み合わせを支援する。型システムは、またメンバとして有効な全ての値を包括するトップ型を含む。
【0014】
Dプログラミング言語は、宣言型プログラミングモデルおよび言語に対し上記の型システムに関して、本明細書で説明する様々な実施形態のコンテキストとして提供される。しかし、本明細書で記述する様々な実施形態は、プログラミング構文および他の定義付け特性に関して、Dと同一または類似の能力を有する任意の宣言型プログラミング言語に適用できる。
【0015】
この点に関して、命令型プログラミング言語に対応するものとしてよく見なされる宣言型プログラミング言語でソースコードを作成することがしばしば望ましい。命令型プログラミング言語とは異なり、宣言型プログラミング言語は、所与の技術またはプラットフォームに対してユーザのニーズに合う方法を指定しなければならないこともなく、ユーザが自分のデータから希望するデータ全てを書くことができる。このように、Dは例示的疑似コードや概念説明に適したソースではあるが、Dプログラミング言語で叙述される実施形態だけではなく、本明細書では1つ以上の実施形態で説明する型システムを含む任意の宣言型言語を考える。
【0016】
この点に関して、その詳細を下記に示すが、Dプログラミング言語は、コンパクトで、人が理解できる表現であることに適した宣言型プログラミング言語であり、フラッシュストレージ、リレーショナルデータベース、RAM、外付けドライブ、ネットワークドライブ、等に関わらず、基礎となるストレージ機構とは独立して、データ集約型アプリケーションを作成、変更するのに効率の良い構文を有利に含んでいる。また「D」は、ときには「M」プログラミング言語と称されるが、一貫性のため本明細書ではMを使用しない。
【0017】
Dは、宣言ソースコードを書くのに効率的でコンパクトな構文規則を含んでおり、それには言語の使用、例えばデータ集約型アプリケーションに対して強力な権限を与える能力を有する型システムが含まれる。より具体的には、本明細書で記述するように本型システムにより、表現に富んだ型システムを使用して、データ集約型アプリケーションを静的に検証できる。この点に関して、一実施形態において、「トップ」型(Dでは「Any」と表記)とリファインメント型(ここで、型は任意のブール式により条件付け可能)、およびリファインメント式の言語で型判別式の算入の組み合わせである。
【0018】
データスクリプト言語の型システム
データスクリプト言語の型システムに対して本実施形態に関する追加の詳細が以下に記述されるが、最初に一部のコンテキストが、Dコンパイル連鎖に基づいてDプログラムを表現および使用できる種々の方法に関して、
図1に説明される。たとえば、ソースコード100は、開発者または機械により直接作成可能である。ソースコード100は、次にたとえばソースコード100を解析するためのD構文解析ツール120、D構文木形成のためのD構文木コンポーネント130を含めてDコンパイラ110によってコンパイルされ、それらはその後解析されDグラフ構造140に変形できる。
【0019】
Dグラフ構造140は、直接開発者により、またアプリケーションにより生成され、簡単な方法で表現することが可能である。Dグラフ構造140は、構文木130までほどき、さらにソースコード100に引き返すことができ、またDグラフ構造140は、SQLデータベースクエリ、企業データ管理(EDM=enterprise data management)、表計算アプリケーション、グラフィックアプリケーション、すなわちデータが格納および解析できる場所のような、様々なドメイン特定使用150に従うデータ集約型アプリケーションに関連してオブジェクトコードにコンパイルまたは準コンパイル化できる。
【0020】
Dプログラミング言語のような型付け言語は、言語の変数が見込まれる値の範囲に境界が設定されるという考え方をする。その範囲の境界上限を型と呼んでいる。型システムは、変数の型、および一般的には、プログラムの式全体の型を追跡する型付け言語のコンポーネントである。「D」で指定およびチェック可能な型は従来のシステムでは不可能であり、そのような型を、以下により詳細に記述する。
【0021】
様々な非限定の実施形態で述べるように、本発明は簡単ではあるが機能の豊富な型言語が可能になるリファインメント言語のリファインメント型および型判別式を組み合わせたデータスクリプト言語の型システムを提供する。一実施形態において、リファインメント言語のリファインメント型および型判別式との組み合わせで、さらなる表現力のある型言語を生成するトップ型が支援される。この表現に富む型システムを使用すると、データ集約型アプリケーションを静的に検証できる。
【0022】
図2のブロック図で示すように、一実施形態において、Dプログラミング言語のような宣言型プログラミング言語は、プログラムの一部を形成する様々なプログラミング構文200を含む。システム、アプリケーション、サービスは、そのような構文200を特定し、データストア(複数可)260に対してDプログラムとしてそれら構文を実行し、データ集約結果を達成できる。一つの非限定な態様において、プログラミング構文200の基礎であるプログラミングモデルの型システム250は、リファインメント型210とリファインメント型210の式内の型メンバシップ評価220の組み合わせの支援を含む。この点に関して、リファインメント型およびリファインメント型の式内にある型メンバシップ評価の支援の組み合わせは、従来のシステムでは支援されない。
【0023】
図3のブロック図で示すように、型システム250の能力に加えて、型システム350は、また有効値全てを包括するトップ型330を含むことが可能である。言い換えると、そのトップ型は、トップ型を有するプログラミングモデルで見られるあらゆる型の内で最も制約の少ない型である。
図4のブロック図で示すように、他の能力に加えて、型システム450は、型としての値420、また値としての型410の支援を随意的にさらに含むことができる。
【0024】
「D」の型は、コレクション型、T
*(と表記)(型Tの値のコレクションを意味する)、およびエンティティまたは記録型、{11:T1,...ln:Tn}(と表記)(型T1,...Tnに個々に対応するフィールドl1,...lnを有するエンティティを意味する)と共に、Integer(整数)、Text(テキスト)、Logical(論理)のような基本型を含む。
【0025】
データスクリプト言語に対する上記型システムの一実装において、型システムは「トップ」型(Anyと表記)を支援する。全ての有効D値はこの「制約最小限」型の値である。さらに、valueが識別子、Tが型、eがブール値の式である{value:T|e}と表記可能であるリファインメント型が支援されており、例えばリファインメント型に対する「D」構文は単純に「T where e」である。そのような型の値は、ブール式eが真である、型Tの有効「D」値である。
【0026】
例えば、値42が型{x:Integer|x>41}のメンバであるのは、値42の型は整数(Integer)であり、42は実際に41より大なので判別x>41を満足するからである。さらなる例として、値43もまたこの型のメンバであるが、しかし値40はメンバではない。さらに、型システムはリファインメントでブール値の式を支援する。ブール式の書式は、「and」、「or」、「not」、「implies」を支援し、さらに、型システムは、型「e in T」と表記される型メンバシップ判別、または型判別式を含む。型判別式の運用上の動きは、式eを評価すること、および得られる値が型Tの値の集合にあるかを決定することである。
【0027】
この点に関して、型システムの上記特徴を組み合わせると、型定義に対して幾つかの強力で、洗練された式をもたらす。例えば、
図5は、第1の非限定な利点を説明している。その利点とは、制約
ベースのまたは構造の型付けにより、その両方が定義される第1の型500および第2の型510の
共通集合である、単一でコンパクトな式で型520を定義できることである。型Sおよび型Tの
共通集合の型は次のように表すことができる。
{x:Any|xinT&&xinS}
【0028】
図6は、別の非限定な利点を説明している。すなわち、制約
ベースのまたは構造の型付けにより、その両方が定義される第1の型600および第2の型610の和集合である、単一でコンパクトな式で型620を定義できることである。型Sおよび型Tの和集合の型は、次のように表すことができる。
{x:Any|xinT||xinS}
【0029】
トップ型またはトップレベル型を有する型システムの別の非制限な利点は、
図7で示されるように、空(empty)型もまた表現できることである。トップ型「Any」を否定することにより、ヌル型720は、無効型の集合と表現できる。Dでは、ヌル型は次のように表現できる。
{x:Any|false}
【0030】
理解を深めるため、型システムは判定のコレクションを用いて数学的に記述できる。判定は次の形をとる。
【0034】
はあるアサーションであり、その自由変数はΓで宣言される。コンテキストΓは、書式φ,x1:T1,...,xn:Tn.(空コンテキストφは、時には省略される)形式の個別の変数およびそれらの型の順序付けリストである。
【0035】
型システムの一次判定形式は、式eがコンテキストΓで型Tを有するとアサートする型付け判定であり、例えばeの自由変数がΓで定義される。これは、次のように記述される。
Γ├e:T
【0036】
アサーションe:T、すなわち式eが型Tを有することのアサーションは1つの関係である。言い換えると、所与の式は多くの型を持っていると言える。式eは、Γ├e:Tなる型Tが存在すると、コンテキストΓで上手く型付けができると言える。(正式な)型システムは、型規則の集合を与えることにより特定可能である。この型規則は、有効であると推定する他の判定を基本に、ある判定の有効性を定義するものである。
【0037】
他の判定形式は、型Sが別の型Tの下位の型(subtype)であることをアサートする下位の型付け(subtyping)判定であり、以下に記す。
Γ├S<:T
【0038】
「D」プログラミング言語の型システムは、上記判定を定義する型規則の集合を与えることにより正式に指定できる。例えば、型判定式が適正に型付けを行ったかの決定は、次の型規則により定義される。
【0040】
言い換えると、Tの式eは、式がある型Sであると、コンテキストΓで適正に型付けられる(および型が論理的(Logical)である)。
【0041】
別な規則により下位型付けが導入される。
【0043】
この規則は、式eがコンテキストΓで型Sであり、およびさらにSがTの下位の型である場合、式eは、また型Tでもあることを述べている。
【0044】
式が型Anyかを決定する規則は、以下のようである。
【0046】
式がリファインメント型かを決定する規則は、以下のようである。
【0048】
言い換えると、式e1がコンテキストΓで型Tであり、式e2がコンテキスト(Γ,x:T)で型Logicalであり、およびxに代入したe1を有するブール式e2が論理的に真であると決定できる場合(この事実の決定にある補助ルーチンcheck_is_true(チェックが真)を仮定する)、式e1は、型{x:T|e2}である。有効な判定の誘導の例は以下のようである。
【0050】
リファインメント式が満足される補助チェック(check_is_true)は、代替的に型システムにより実行されない可能性があるが、実行時にチェックされるよう式中に挿入可能である。
【0051】
従って、上記のように型システムを実装することにより、また上記規則および判定に準拠して、表現に富んだ型が、静的に検証できるプログラムの一部として特定可能である。
【0052】
図8は、型リファインメントおよび型メンバシップを支援する型システムを備えた宣言型プログラミングモデルに従って、宣言コードを定義するプロセスを説明するフロー図である。800では、宣言型プログラミング言語のプログラミング構文(複数可)の仕様が、コンピューティングシステム、デバイス、アプリケーションまたはサービスによって受信される。810では、ここで、リファインメント型構文を特定するプログラミング構文の受信を含むことができる。このリファインメント型構文は、1つ以上の型をブール式が真である値を特定することにより定義するものである。820で示されるように、ここで、型リファインメント構文内で、式評価の1つ以上の結果として得られる値が指示された型のメンバであるかどうかを決定する型メンバシップ判別構文の仕様の受信を含むこともできる。830では、コードの機械可読表現が、プログラミング構文(複数可)の仕様に基づいて生成できる。好都合にも、型システムにより、種々の型の
共通集合演算および/または和集合演算ができるが、この可能性は限定されるものではない。
【0053】
図9は、データストア(複数可)950に通信可能に接続されたデータ処理システム920を含むシステムのブロック図であり、宣言コードでデータの集約的処理を実行するためのものである。この点に関して、システム920は、制約
ベースの型リファインメントおよび型メンバシップを支援する型システム910を実装する宣言コードモジュールを含む。宣言コード930は、基礎的型システム910を支援する宣言型プログラミングモデル900により特定されるが、この基礎的型システム910は、全ての型を表現する非限定トップレベル型に関する型を構築することにより型を定義する型システムのリファインメント型を支援する。その上、リファインメント型は、指示された型のメンバシップに対する式の評価判別をする型判別構文を含むことができる。さらに、型チェックコンポーネント940は、プログラミング構文の型付けの有効性を定義する少なくとも1つの規則を基本として、エラーを判定するため、宣言コードの型を評価する。また、記述したように、本明細書の何れの実施形態も、プログラミング言語のコンテキストにあり、型は値を有することができ、値は型を有することができる。
【0054】
図10は、コンピューティングデバイスの少なくとも1つのプロセッサよって、宣言コードを実行するためのプロセスを説明するフロー図である。1000では、宣言型プログラムが受信されるが、宣言型プログラムは、宣言型プログラムのプログラミング構文内で、リファインメントによる型付け、型メンバシップの評価、および宣言型プログラムの全ての有効値がメンバであるトップ型を支援する型付けシステムに従って特定される。1010では、宣言型プログラムを、値を有する型および型を有する値を支援する型付けシステムに従い、随意的に指定できる。1020では、宣言型プログラムで表現される型は、型付け規則の集合および型付けシステムに関連付けした判定に従って、型チェックされる。1030では、宣言型プログラムの実行、ストレージ、または変更が実施できる。
【0055】
例示的な宣言型プログラミング言語
疑問を回避するため、Dプログラミング言語のような宣言型プログラミング言語に関して、本細目で提供した追加のコンテキストは、完全には網羅したものではなく、また限定を行ったものでもないと考えられるべきである。以下に述べる疑似コードについてのほんの一部の特別な例は、実例および解説のみを目的としており、様々な詳細で上記したデータスクリプト言語の型システムの実施形態を限定すると考えるべきではない。
【0056】
図11では、Dプログラミング言語を基本とするモデルのような、宣言モデルの例示的プロセス連鎖が提供される。説明のように、プロセス連鎖1100は、コンパイラ1120、パッケージコンポーネント1130、同期コンポーネント1140、および複数のレポジトリ1150、1152、...、1154の結合を含むことができる。上記実施形態内では、コンパイラ1120へ入力されたソースコード1110は、Dプログラミング言語のような宣言型プログラミング言語で作成された宣言型実行モデルを表す。Dプログラミング言語で、たとえば、ソースコード1110により具現化した実行モデルは、制約
ベースの型付けまたは構造的型付けに有利に従い、および/またはコード開発を簡略化するため、順序に依存しない、または順序無しの実行モデルを有利に具現化する。
【0057】
コンパイラ1120は、ソースコード1110を処理し、各ソースコードに対して、後処理の定義を生成できる。他のシステムは、コンパイルを命令フォーマットに至るまで実行するが、ソースコードの宣言フォーマットは、変形の間維持される。パッケージコンポーネント1130は、Dプログラミング言語のケースにおいて、D_Imageファイルのように、特別なレポジトリ1150、1152、...、1154にインストール可能なイメージファイルとして、後処理の定義をパッケージ化する。イメージファイルは、必須メタデータおよび宣言ソースモデルと共に複数の変形されたアーティファクトを格納するためのそれらの拡張可能ストレージの定義を含む。例えば、パッケージコンポーネント1130は、特別なメタデータプロパティを設定でき、イメージファイルのコンテンツの部分としてのコンパイラ出力アーティファクトと共に、宣言ソース定義を格納できる。
【0058】
Dプログラミング言語で、パッケージコンポーネント1130が使用するパッケージフォーマットは、ECMA(欧州電子計算機工業会) OPC(Open Package Convention)標準に準拠する。当業者であれば、この標準は、圧縮、グループ化、署名、等のような特徴を本質的に提示していることを容易に理解するであろう。この標準は、またパブリック・プログラミング・モデル(API)を定義し、それにより、イメージファイルが標準プログラミングツールを介して操作可能となる。例えば、.NET Frameworkにおいて、APIは、「System.IO.Packaging」の名前空間内で定義される。
【0059】
同期コンポーネント1140は、イメージファイルを管理するのに使用可能なツールである。例えば、同期コンポーネント1140は、イメージファイルを入力として扱い、そのファイルを参照イメージファイルの集合とリンクできる。その操作の間に、またはその後に、パッケージ化されたアーティファクトを引き出して、それらを処理し、さらに同一のイメージファイルにさらにアーティファクトを加えることにより、イメージファイル上で動作する(リライタ、オプチマイザ、等のような)種々の支援ツールが可能である。これらのツールは、また、イメージファイルの幾つかのメタデータを巧みに操作して、例えば、整合性および安全性の確証のため、イメージファイルにデジタルに署名することなどの、イメージファイル状態を変更できる。
【0060】
次に、展開ユーティリティは、イメージファイルを展開し、またインストールツールは、イメージファイルをリポジトリ1150、1152、...、1154内の動作実行環境にインストールする。イメージファイルが展開されると、イメージファイルは、エクスポート、検出(discovery)、サービス、バージョニング(versioning)、アンインストール、およびさらに多くの機能を含む様々な後展開のタスクを被る可能性がある。Dプログラミング言語を使用すると、パッケージフォーマットは、これら全ての運用の支援を提供し、一方さらに安全性、拡張性、可変サイズ能力、および性能のような企業レベルの産業要件を満たす。一実施形態において、リポジトリ1150は、リレーショナルデータベース管理システム(RDBMS=relational database management system)のコレクションが可能であるが、何かしらのストレージを搭載してもよい。
【0061】
一実施形態において、本明細書で記述する方法は、制約
ベースの型システムを有するプログラミング言語で運用可能である。そのような制約
ベースのシステムは、従来の名目上の型システムでは、簡単には利用できない機能性を提供する。
図12、
図13において、名目上の型付け実行システムが、本発明の実施形態に従って制約
ベースの型付け実行システムと比較される。説明のように、名目上のシステム1200は、どの値に対しても特別の型を割り当てるが、それに対して、制約
ベースのシステム1210の値は、任意の無数の型に適合できる。
【0062】
名目上の型付け実行モデルおよびDプログラミング言語のような、本明細書で記述した宣言型プログラミング言語による制約
ベースの型付けモデルとの対比を説明するために、各モデルの型宣言に対する例示的コードが以下で比較される。
【0063】
最初に、名目上の型付け実行モデルに関して、次の例示的C#コードの例を説明する。すなわち、
class A
{
public string Bar;
public int Foo;
}
class B
{
public string Bar;
public int Foo;
}
【0064】
この宣言に対して、型と値には堅固な関係が存在し、AとBの値は、それらのフィールドの値BarとFooが一致していても、比較できないと考えられる。
【0065】
対照的に、制約
ベースのモデルに関して、次の例示的Dコード(下記により詳細に記述)は、オブジェクトが幾つかの型に適合できる方法について説明している。すなわち、
type A {Bar:Text;Foo:Integer;}
type B {Bar:Text;Foo:Integer;}
【0066】
この宣言に対して、型と値の関係は、型Aに適合する全ての値はBに適合し、その逆も同様であるように、非常に柔軟性に富んでいる。さらに、制約
ベースのモデルの型は、互いのトップにレイヤとして置くことができ、例えば、様々なRDBMにわたり、プログラミングに役立つ柔軟性を提供する。実際に、制約
ベースのモデルの型は、初期では全領域(universe)全ての値を含んでいるため、特定の値は、値が型宣言でコード化される制限を侵さない全ての型と適合可能である。このように、宣言type T:Text where value<128によって定義された型と適合可能である値の集合は、「Integer(整数)」という制約または「value<128」という制約を侵さない「全領域全ての値」を含む。
【0067】
このように、一実施形態において、ソースコードのプログラミング言語は、上記のように、Dプログラミング言語で実装されるような、制約
ベースの型システムを含む純粋な宣言型言語である。
【0068】
他の実施形態において、本明細書で記述する方法は、また順序に依存しないまたは順序無しの実行モデルを有するプログラミング言語で運用することも可能である。上記の制約
ベースの実行モデルと同様に、そのような順序に依存しない実行モデルは、例えば、様々なRDBMSにわたって、プログラミングするのに役立つことができる柔軟性を提供する。
【0069】
図14、
図15において、説明の目的のために、順序付け実行モデルに従ったデータストレージ抽象化が、順序に依存しない実行モデルによるデータストレージ抽象化と比較される。例えば、
図14のデータストレージ抽象化1400は、順序付け実行モデルに従って作成されたリストFooを表し、それに対して、
図15のデータ抽象化1410は、順序に依存しない実行モデルにより作成された同様なリストFooを表す。
【0070】
説明されているように、データストレージ抽象化1400および1410の各々は、3つのBar値の集合(すなわち、「1」、「2」、および「3」)を含む。しかし、データストレージ抽象化1400は、これらBar値が、特定の順序で入力またはリスト化されるよう要求し、それに対して、データストレージ抽象化1410は、そのような要求は全くしない。代わりに、データストレージ抽象化1410は、各Bar値にIDを単に割り振るが、ここにおいて、これらBar値が入力/リスト化された順序は、対象リポジトリにとって認識されない。事例として、データストレージ抽象化1410は、このように下記の順序に依存しないコードから生じることができる。
f:Foo
*={Bar=“1”};
f:Foo
*={Bar=“2”};
f:Foo
*={Bar=“3”};
【0071】
しかし、データストレージ抽象化1410は、また下記のコードからも生じることができる。
f:Foo
*={Bar=“3”};
f:Foo
*={Bar=“1”};
f:Foo
*={Bar=“2”};
【0072】
さらに、上記2つのコードの各々は、機能的に下記のコードに等価である。
f:Foo
*={{Bar=“2”},{Bar=“3”},{Bar=“1”}};
【0073】
上記の制約
ベースの型付けおよび順序無しの実行モデルに互換性がある例示の宣言型言語は、Dプログラミング言語であり、時には本明細書で便宜上「D」と称し、本発明の譲受人により開発された。しかし、Dに加えて、他の類似の宣言型プログラミング言語が使用可能であること、および本発明のユーティリティは、如何なる単一のプログラミング言語に対しても限定されないことは理解すべきであり、上記方向付けしたグラフ構造の1つ以上の如何なる実施形態も該当するものである。この点について、Dに関するある追加的コンテキストが、以下に提供される。
【0074】
述べてきたように、Dはデータを扱うための宣言型言語である。Dはユーザに、作成可能であり可読である両方を備えた使い勝手が良いテキスト構文規則を用いて、ユーザデータ構築およびユーザデータ問い合わせのユーザが望む方法をユーザに決定させる。1つの非限定態様において、Dプログラムは、コンパイルユニットとして公知の1つ以上のソースファイルを含み、このソースファイルは、順序付けされた一連のユニコード文字(Unicode character)である。ソースファイルは、一般的に、ファイルシステムのファイルに1対1に対応しているが、この対応は必須ではない。移植性を最大限にするため、ファイルシステムのファイルをUTF−8エンコードで符号化することが推奨される。
【0075】
概念的に述べると、Dプログラムは、4つのステップを使用してコンパイルする。すなわち、1)字句解析(字句解析は前処理指令を評価、実行する)、これはユニコード入力文字のストリームをトークンのストリームに変換するもの、2)構文規則解析、これはトークンのストリームを抽象的構文木に変換するもの、3)セマンティック解析、これは、全ての符号を抽象的構文木に分解し、型は構造をチェックし、セマンティックグラフを生成するもの、および、4)コード生成、これは、ある対象とする実行時間(例えば、SQL、イメージを作成)に対してセマンティックグラフから実行可能命令を発生するものである。さらに、ツールはイメージとリンクができ、それらを実行時間にロードできる。
【0076】
宣言型言語のように、Dはデータが格納されるまたはアクセスされる方法を強制しないし、また命令する特定実装技術(XAMLのようなドメイン固有言語と対照的に)もまた強制しない。むしろ、Dは、ユーザデータから、ユーザが所与の技術またはプラットフォームに対して満足できる方法を指定する必要なく、欲しいデータをユーザが書き込みできるようにされていた。このことは、Dが、D構文を所与の環境で表現および実行する方法を制御するために、機能性に富んだ宣言的または命令的支援を実装が行うことを決して禁じていないことを意味し、それ故に、開発性に富んだ柔軟性を可能にしている。
【0077】
Dは3つの基本概念、値、型、およびエクステントの上に構築されている。これら3つの概念は、次のように定義できる。1)値はD言語の規則に準ずるデータである、2)型は値の集合を表現する、3)エクステントは値に対して動的なストレージを提供する。
【0078】
一般的に、Dはデータの型付けを、データのストレージ/エクステントから切り離す。また、所与の型を使用して、演算の結果を記述するのと同様に複数のエクステントからのデータを記述できる。これにより、ユーザは、最初に型を書き始めることができ、その後対応する値の場所の決定または値の計算ができる。
【0079】
値を置く場所の決定を主題とすると、D言語は、実装が宣言されたエクステントをRDBMSのような外部ストアにマッピングする方法を指定しない。しかし、Dはそのような実装を可能にするように作成されていたのであり、またリレーショナルモデルと互換性がある。
【0080】
データ管理に関しては、Dは、エクステントのコンテンツの変更に対する構文を有しない関数型言語であるが、しかし、Dは、エクステントのコンテンツが、外部(Dに対して)刺激を介して、変更可能であることは見込んでおり、また、Dは随意的に、データを更新するための宣言構文を提供するよう修正できる。
【0081】
検証または割当ての目的上、値を分類する方法を書きだすことはしばしば望ましい。Dにおいて、値は、型を使用して分類され、そこではD型は受領可能または規則に準拠した値のコレクションを表現する。さらに、D型は特定のコンテキスト(例えば、オペランド、ストレージの場所)にどの値が出現するのか制約するのに使用される。
【0082】
留意すべき若干の例外はあるが、Dは型をコレクションとして使用することを可能にする。例えば、オペレータ「in」を使用して、値が所与の型に適合しているか判別できる。例えば、
1 in Number
“Hello,world” in Text
【0083】
埋め込み型の名称は、D言語で直接利用可能であることに留意されたい。しかし、また型に対する新規の名称は、型宣言を使用し導入することもできる。例えば、下記の型宣言は、「Text」単純型に対して、同義語として型の名前「My Text」を取り込む。
type [My Text]:Text;
【0084】
次に、利用可能なこの型の名前について、次のコードが書かれる。
“Hello,world”in[My Text]
【0085】
既存型にカスタム名を導入することは有用である一方、この型宣言は、基礎型に述語(predicate)を適用するのにさらに有用である。例えば、
type SmallText:Text where value.Count<7;
【0086】
この例において、可能な「Text」値の全領域は、値が7未満の文字数を包括するものに強制されている。従って、次の命令文(statement)が、この型定義に対して真であることが言える。
“Terse”in SmallText
!(“Verbose”in SmallText)
【0087】
型宣言は、次の式からなる。
type TinyText:SmallText where value.Count<6;
【0088】
しかし、この例において、この宣言は次の式と等価である。
type TinyText:Text where value.Count<6;
【0089】
型の名前が存在し、それによりD宣言または式がそれに言及できることに留意されたい。名前は幾つでも、同一の型(例えば、Text where value.Count<7)に割当てることができ、所与の値が名前の全てに適合するか、名前に全く適合しないかのどちらかである。例えば、次の例が考えられる、
type A:Number where value<100;
type B:Number where value<100:
【0090】
これら2つの型定義が与えられると、次の両式
l in A
l in B
が、真となるであろう。次の第3の型が導入されると、
type C:Number where value>0;
以下が記述できる。
1 in C
【0091】
Dの一般的原理は、所与の値が任意の数の型に適合できることである。このことは、値が起動時に特定の型に固定され、型が定義されたとき指定された有限集合である下位の型のメンバである多くのオブジェクトベースのシステムが稼働する方式からの逸脱である。
【0092】
議論を生む別の型に関連する運用は、型帰属オペレータ(type ascription operator)(:)である。型帰属オペレータは、所与の値が特定の型に適合していることをアサートする。
【0093】
一般的には、式中に値が見られるとき、Dは、適用されているオペレータ/関数に対して、宣言された結果の型に基づいてその値の予想される型にある考えを有する。例えば、論理およびオペレータ(&&)の結果が、型「Logical」に適合するよう宣言される。
【0094】
追加的制約を所与の値に適用することは、典型的には、異なる要求項目を有する別のコンテキストの値を使用するために、ときには有用(または、要求されることも)である。例えば、以下の型定義を考えてみる。
type SuperPositive:Number where value>5;
【0095】
オペランドとして型「SuperPositive」の値を受け入れるよう宣言される「CalcIt」と名付けた関数があると仮定して、Dではこのような式を可能にすることが望ましい。すなわち、
CalcIt(20)
CalcIt(42+99)
および、このような式を禁じる、すなわち、
CalcIt(−1)
CalcIt(4)
【0096】
事実、Dはこれら4つの例に対して、必要とされることを正確に行う。なぜなら、これら式が定数上の組み込みオペレータの表現であり、オペランドを表すためである。式の有効性を決定するために必要とされる情報の全ては、式に対してDソーステキストが出会った瞬間に、無駄なくすぐに利用可能となる。
【0097】
しかし、式がデータおよび/またはユーザ定義の関数の動的なソースを作成する場合、所与の型に適合するであろうことをアサートするのに型帰属オペレータを使用する。
【0098】
どのように型帰属オペレータが値を扱うのか理解するため、第2の関数「GetVowelCount」が、型「Text」のオペランドを受け入れ、オペランドの母音の数を指示する型「Number」の値を返すよう、宣言することを仮定する。
【0099】
「GetVowelCount」の宣言に基づいたとき、その結果が5より大になるかは未知なので、その点で、次の式は適法なD式ではない。
CalcIt(GetVowelCount(someTextVariable))
【0100】
この式が適法ではないのは、「GetVowelCount」の宣言した結果の型(Number)が、「CalcIt」(SuperPositive)の宣言したオペランド型に適合しない値を含んでいるためである。この式は、誤って書かれてあると推定できる。
【0101】
しかし、この式は、型帰属オペレータを使用して、次の(適法な)式に書き直すことが可能である。すなわち、
CalcIt((GetVowelCount(someTextVariable) : SuperPositive))
【0102】
この式により、Dには、型「SuperPositive」に適合する値が取得されるであろうことを知るための「GetVowelCount」関数について十分に理解があることが通知される。簡潔に述べると、プログラマは、Dがしていることを彼/彼女が知っていることをDに通知している。
【0103】
しかし、プログラマが知らない場合、例えば、プログラマが「GetVowelCount」関数がどのように作動しているか判断ミスをした場合、特別な評価が、結果として負の数字となる可能性がある。「CalcIt」関数は、「SuperPositive」に適合する値を受け入れるためにのみ宣言されたため、システムは、そこを通過した全ての値は5より大であることを確信するであろう。この制約が侵害されないことを確実にするため、システムは、評価されるとき、不合格の可能性を有する動的な制約判定の投入が可能である。この不合格は、Dソーステキストが最初に処理されるとき(CalcIt(−1)と同様に)に起きるのではなく、不合格は式が実際に評価されるときに起きる。
【0104】
この点に関して、典型的には、Dの実装は、Dドキュメントの最初の式が評価される前に、如何なる制約違反も連絡するよう試行する。これは静的エンフォースメントと称せられ、また実装は構文規則エラーに酷似していることを明示する。しかし、幾つかの制約は、生のデータに対してのみ強制できるので、したがって動的エンフォースメントを必要とする。
【0105】
この点で、Dによって、ユーザがユーザの意図することを書き込み易くなり、「上手くいくようにする(make it work)」ためDの実装に負担が掛かる。随意に、広範囲な環境に特定のDドキュメントを使用可能にするため、D実装の全機能は、動的な制約違反の実行および運用の負担を低減するために、正確さに対して動的エンフォースメントに依存するDドキュメントを拒否するように設定することが可能である。
【0106】
さらなる背景の観点から、Dである型コンストラクタ(constructor)は、コレクション型を特定するように定義できる。コレクション型コンストラクタは、コレクションが含む型および要素の数を制限する。全てのコレクション型は、基本型(intrinsic type)「Collection」上の制約項であり、例えば、全てのコレクション値は次の式に準ずる。
{}in Collection
{1,false}in Collection
!(“Hello”in Collection)
【0107】
最後の例として、コレクション型は単純型に重複しないことを実際に示す。コレクション型および単純型の両方に適合する値はない。
【0108】
コレクション型コンストラクタは、要素の型および受入れ可能な要素数の両方を特定する。要素数は、典型的には3つのオペレータの1つを用いて特定する。
T
* 0以上のT
T+ 1以上のT
T#m..n mとnとの間のT
【0109】
コレクション型コンストラクタは、制約として、Kleeneオペレータの使用または基本型Collection上の非簡略記述(longhand)のどちらかでできる。すなわち、次の型宣言は同一のコレクション値の集合を表す。
type SomeNumbers:Number+;
type TwoToFourNumbers:Number#2..4;
type ThreeNumbers:Number#3;
type FourOrMoreNumbers:Number#4..;
【0110】
これらの型は、これら非簡略記述定義型として、同一の値の集合を表す。
type SomeNumbers:Collection where value.Count>=1
&&item in Number;
type TwoToNumbers:Collection where value.Count>=2
&&value.Count<=4
&&item in Number;
type ThreeNumbers:Collection where value.Count==3
&&item in Number;
type FourOrMoreNumbers:Collection where value.Count>=4
&&item in Number;
【0111】
型宣言に使用される形式とは無関係に、次の式が記載できる。
!({ }in TwoToFourNumbers)
!({“One”,“Two”,“Three”}in TwoToFourNumbers)
{1,2,3}in TwoToFourNumbers
{1,2,3}in ThreeNumbers
{1,2,3,4,5}in FourOrMoreNumbers
【0112】
コレクション型コンストラクタは「where」オペレータを伴って構成され、次の型チェックの結果を得ることを可能にする。
{1,2}in (Number where value<3)*where value.Count%2==0
括弧内「where」オペレータはコレクションの要素に適用され、括弧外の「where」オペレータはコレクション自体に適用されることに留意されたい。
【0113】
所与のコンテキストで有効であるコレクションの種類を指定するのにコレクション型コンストラクタを使用できるのと同様に、エンティティ型を使用してエンティティに対して同じことができる。
【0114】
この点に関して、エンティティ型は、エンティティ値の集合の予測されるメンバを宣言する。エンティティ型のメンバは、フィールドまたは計算値のどちらかで宣言可能である。フィールドの値が格納され、計算値の値が算出される。Entity型は、Entity型上の制約項であり、D標準ライブラリで定義される。
【0115】
次の宣言は、単純エンティティ型である。
type MyEntity:Language.Entity;
【0116】
「MyEntity」型はどのフィールドも宣言しない。Dにおいて、エンティティ型は、型に適合するエンティティ値が、名前が型で宣言されないフィールドを含む点で、オープンである。このように、次の型判別、
{X=100,Y=200} in MyEntity
は、「MyEntity」型が、XとYとに名前を付けられたフィールドについては何も言及していないので真として評価する。
【0117】
エンティティ型は、1つ以上のフィールド宣言を含むことができる。最低限、フィールド宣言は予想フィールドの名前を記述する、例えば、
type Point{X;Y;}
【0118】
この型定義は、少なくともXおよびYと名付けられたフィールドを、それらフィールドの値に関係なく含むエンティティの集合を記述し、その型定義は次の型判別が真(true)であることを意味する。
{X=100,Y=200}in Point
{X=100,Y=200,Z=300}in Point //予想以上のフィールドに対して−OK
!({X=100}in Point) //フィールドが十分ではない−OKではない
{X=true, Y=“Hello,world”}in Point
【0119】
最後の例として、「Point」型がXおよびYフィールドの値を制約しないことを実際に示す、すなわち、任意の値が可能となる。数値に対してXおよびYの値を制約する新規の型が次のように説明される。
type NumericPoint{
X:Number;
Y:Number where value>0
}
【0120】
型帰属構文規則を使用し、XおよびYフィールドの値が型「Number」に適合すべきことをアサートできることに留意されたい。適切にこれを踏まえ、次の式は真である。すなわち、
{X=100,Y=200}in NumericPoint
{X=100,Y=200,Z=300}in NumericPoint
!({X=true,Y=“Hello,world”}in NumericPoint)
!({X=0,Y=0}in NumericPoint)
【0121】
単純型の議論でわかったように、D宣言および式は型を参照できるように型の名前が存在する。そのことが、NumericPointおよびPointの定義が独立しているとしても、次の両型判別の成立する理由である。
{X=100,Y=200}in NumericPoint
{X=100,Y=200}in Point
【0122】
Dのフィールドは値を保持するストレージのユニットと称される。Dにより、エンティティ初期化子の一部として、開発者はフィールドの値を初期化できる。しかし、Dは、一旦初期化されると、フィールドの値を変更するための如何なるメカニズムも、特定しない。Dにおいて、フィールドの値に対する任意の変更が、Dのスコープ(適用範囲)外で生ずる場合を仮定する。
【0123】
フィールド宣言は、フィールドに対して、デフォルト値があることを示すことができる。デフォルト値を有するフィールド宣言は、対応するフィールドが特定されるよう適合エンティティに要求しない(上記フィールド宣言は、オプショナルフィールドと呼ばれることがある)。例えば、次の型定義に関しては、
type Point3d{
X:Number;
Y:Number;
Z=−1:Number; //負のデフォルト値
}
Zフィールドはデフォルト値を有しているので、次の型判別が成立する。
{X=100,Y=200}in Point3d
【0124】
さらに、型帰属オペレータが値に次のように適用される場合、
({X=100,Y=200}:Point3d)
Zフィールドは、次のようにアクセス可能である。
({X=100,Y=200}:Point3d).Z
この場合、この式は値−1となる。
【0125】
別の非限定態様において、フィールド宣言が対応するデフォルト値をもたない場合、適合するエンティティは、そのフィールドに対して、値を特定する必要がある。デフォルト値は、典型的には「Point3d」のZフィールドに対して示す明示的構文規則を使用して書かれる。フィールドの型が、ヌルである可能性のある、またはゼロから多数であるコレクションの何れかの場合、オプショナルに対してヌルの宣言フィールドおよびコレクションに対して{}の宣言フィールドのための暗黙的デフォルト値がある。
【0126】
例えば、次の型を考えてみる。
type PointND{
X:Number;
Y:Number;
Z:Number?; //Zはオプショナル
BeyondZ:Number
*; //BeyondZもオプショナルである。
}
【0127】
次に、再度、次の型判別が成立する。
{X=100,Y=200}in PointND
および、「PointND」はその値に対して帰属することにより、これらのデフォルトを生成する。
({X=100,Y=200}:PointND).Z==null
({X=100,Y=200}:PointND).BeyondZ=={}
【0128】
モデル・オプショナル・フィールドに対して、ゼロから1コレクションまたはヌル可能型の使用と、明示的デフォルト値の使用との選択は、一般的には1つのスタイルに帰着する。
【0129】
計算値は、式と称し、その値は格納よりむしろ計算される。そのような計算値を宣言する型の例は、すなわち、
type PointPlus{
X:Number;
Y:Number;
//計算値
IsHigh():Logical{Y>0;}
}
セミコロンで終わるフィールド宣言とは異なり、計算値宣言は、波括弧により囲まれる式で終了することに留意されたい。
【0130】
フィールド宣言のように、計算値宣言は、この例のように型帰属を省略できる。
type PointPlus{
X:Number;
Y:Number;
//型帰属なしの計算値
InMagicQuadrant(){IsHigh && X>0;}
IsHigh():Logical{Y>0;}
}
【0131】
別の非限定態様において、計算値に対して明示的に帰属する値がないとき、Dは、自動的に基礎式の宣言された結果の型を基本に、型を推論できる。この例において、式で使用される論理およびオペレータは、「Logical(論理)」を返すように宣言されていたため、「InMagicQuadrant」計算値が、また「Logical」値を生成すると考える。
【0132】
上記で定義され、使用された2つの計算値は、エンティティの値自体ではない、それらの結果を計算するための任意な追加情報を要求しなかった。計算値は、式中の計算値を使用するとき、実際の値を特定する必要がある名前を付けたパラメータのリストを随意に宣言できる。下記の式は、パラメータを要求する計算値の例である。
type PointPlus{
X:Number;
Y:Number;
//パラメータを要求する計算値
WithinBounds(radius:Number):Logical{
X*X+Y*Y<=radius*radius;
}
InMagicQuadrant(){IsHigh && X>0;}
IsHigh():Logical{Y>0;}
}
【0133】
式中この計算値を使用するため、次のように2つのパラメータに値を与える。
({X=100,Y=200}:PointPlus).WithinBounds(50)
【0134】
「WithinBounds」の値を計算すると、Dは記号ラジウス(radius)に値50を結び付け、それにより「WithinBounds」計算値が偽となる。
【0135】
フィールドに対する計算値およびデフォルト値の両値は、型に適合する値の一部でなく、型定義の一部であることに、Dに関連して留意されたい。例えば、これら3つの型定義を考えると、
type Point{
X:Number;
Y:Number;
}
type RichPoint{
X:Number;
Y:Number;
Z=−1:Number;
IsHigh():Logical{X<Y;}
}
type WeirdPoint{
X:Number;
Y:Number;
Z=42:Number;
IsHigh():Logical{false;}
}
【0136】
RichPointおよびWeirdPointのみ、2つの要求されたフィールド(XおよびY)を有するので、以下の式が記述できる。
【0137】
{X=1,Y=2}in RichPoint
{X=1,Y=2}in WeirdPoint
【0138】
しかし、「IsHigh」計算値は、これら2つの型内の1つがエンティティ値に帰属するときにのみ利用可能である。すなわち、
({X=1,Y=2}:RichPoint).IsHigh==true
({X=1,Y=2}:WeirdPoint) .IsHigh==false
【0139】
計算値は、完全に型の一部であり、値ではないため、帰属が連鎖されるとき、次の式のようになり、
(({X=1,Y=2}:RichPoint):WeirdPoint).IsHigh==false
次に、最外部の帰属が呼び出される関数を決定する。
【0140】
同様の原理が、デフォルト値がどのように動作するかに対して働いている。デフォルト値は、エンティティ値ではなく、型の一部であることに再度留意されたい。従って、次の式が書かれると、
({X=1,Y=2}:RichPoint).Z==−1
基礎エンティティ値は、まだ、2つのフィールド値(XおよびYに対して、夫々1および2)を含むだけである。この点に関して、デフォルト値は計算値と異なっており、帰属が連鎖している。例えば、次の式を考えてみる。
(({X=1,Y=2}:RichPoint):WeirdPoint).Z==−1
「RichPoint」帰属を最初に適用するので、結果として得たエンティティは、−1の値を有するZと名付けられたフィールドを持つが、その値に割当てられたストレージはなく、すなわち、値に関する型の解釈の1部である。従って、「WeirdPoint」帰属が適用されるとき、Zと名付けられたフィールドを有する一番目の帰属の結果に適用され、結果として、Zに対して値を特定するために値を使用する。このように、「WeirdPoint」が特定したデフォルト値は必要とはされない。
【0141】
全ての型と同様に、制約は、「where」オペレータを使用して、エンティティ型に適用可能である。次のD型定義を考えてみると、
type HighPoint{
X:Number;
Y:Number;
}where X<Y;
【0142】
この例において、型「HighPoint」に適合する全ての値は、Y値未満のX値を有することを保証される。そのことは、次の式を意味する。
{X=100,Y=200}in HighPoint
!({X=300,Y=200}in HighPoint)
両式は真である。
【0143】
さらに、次の型定義に関して、
type Point{
X:Number;
Y:Number;
}
type Visual{
Opacity:Number;
}
type VisualPoint{
DotSize:Number;
}where value in Point && value in Visual;
第3の型、「VisualPoint」は、少なくとも数値フィールドX、Y、Opacity、およびDotsizeを有するエンティティ値の集合を指定する。
【0144】
一般的に、メンバ宣言を、組立て可能な小さな項目に分解することが望まれるため、Dは、また分解を支援する明示的構文規則を提供する。事例として、「VisualPoint」型定義は、その構文規則を使用して書き直すことができる。
type VisualPoint:Point,Visual{
DotSize:Number;
}
【0145】
明確に言えば、これは制約式を使用した上記非簡略記述(long−hand)定義に対する簡略記述(shorthand)である。さらに、この簡略記述定義および非簡略記述定義の両方とも、より長い非簡略記述(longer−hand)定義とも等価となる。
type VisualPoint={
X:Number;
Y:Number;
Opacity:Number;
DotSize:Number;
}
【0146】
再度、型の名称は型を参照するための単なる手段である。値自体は、値を記述するのに使用される型名の記録を全く有していない。
【0147】
Dは、また簡単なクエリの作成をより簡潔にする数個の機能で、LINQクエリの取り扱い能力を拡張できる。キーワードである、「where」および「select」は、バイナリ中置オペレータ(infix operator)として利用できる。また、インデクサ(indexer)は、強力に型付けしたコレクションに自動的に追加される。これら機能により、一般のクエリを下記に説明するように、よりコンパクトに作成できる。
【0148】
中置オペレータの例として、次のクエリは「People」の定義されたコレクションから30歳未満の人を抽出する。
from p in People
where p.Age=30
select p
【0149】
同等のクエリを書くことができる。すなわち、
People where value.Age=30
【0150】
「where」オペレータは、左側でコレクションを取り、右側ではブール式を取る。「where」オペレータは、コレクションの各メンバが拘束されるブール式のスコープにキーワード識別子の値を挿入する。結果として得られるコレクションは、式が真であるメンバを含む。従って、次式
Collection where Expression
は、以下の式と等価である。
from value in Collection
where Expression
select value
【0151】
Dコンパイラは、インデクサ・メンバを、強力に型付けした要素と共にコレクションに追加する。コレクション「People」に対して、事例として、コンパイラは、インデクサを「First(Text)」、「Last(Text)」、および「Age(Number)」に対して追加できる。
【0152】
従って、以下の文の、
Collection.Field(Expression)
は、以下の式と等価である。
from value in Collection
where Field==Expression
select value
【0153】
「Select」は、また中置きオペレータとして使用可能である。次の簡単なクエリに関して、
from p in People
select p.First+p.Last
式「select」は、コレクションの各メンバ上で算出され、その結果を返す。
【0154】
中置き「select」を使用し、クエリを下記のように等価に書くことができる。
【0155】
People select value.First+value.Last
【0156】
「select」オペレータは、左側でコレクションをとり、右側で任意の式をとる。「where」について、「select」は、コレクションの各要素にわたり、キーワード識別子値を導入する。「select」オペレータは、コレクションの各要素にわたり式をマッピングし、その結果を返す。他の例に対して、以下の文の、
Collection select Expression
は、以下の式と等価である。
from value in Collection
select Expression
【0157】
「select」オペレータの通常の使用は、単一のフィールドを抽出することである。
People select value.First
コンパイラは、アクセサ(accessors)をコレクションに追加し、それにより単一フィールドは、「People.First」および「People.Last」として直接抽出できる。
【0158】
正式なDドキュメントを書くために、ソーステキスト全てがモジュール定義のコンテキストに現れる。モジュールは、定義される任意な型の名前に対し、トップレベルの名前空間を定義する。モジュールは、また計算値と同様に実際の値を格納するであろうエクステント(extent)を定義するためにスコープ(適用範囲)を定義する。
【0159】
以下の式は、モジュール定義の簡単な例である。
module Geometry{
//型を宣言
type Point{
X:Integer;Y:Integer;
}
//幾つかのエクステントを宣言
Point:Point
*;
Origin:Point;
//計算値を宣言
TotalPointCount{Points.Count+1;}
}
【0160】
この例において、モジュールは、「Geometry.Point」と名付けられた1つの型を定義する。この型は、ポイント値はどのようなものかを記述するが、これら値が格納できる場所を全く定義しない。
【0161】
この例は、また2つのモジュールスコープ化フィールド(PointおよびOrigin)を含む。モジュールスコープ化フィールド宣言は、エンティティ型で使用するこれらに構文規則で一致する。しかし、エンティティ型で宣言されたフィールドは、一旦エクステントが決定されていると、簡単にストレージの可能性を示すが、これと対照的に、モジュールスコープ化で宣言されるフィールドは、モジュールをロードし、解釈するために、実装によりマッピングする必要がある実際のストレージを示す。
【0162】
さらに、モジュールは、参照される宣言を含むモジュールを指示するインポート指令を用いて、他のモジュールの宣言を参照できる。他のモジュールにより参照されるべき宣言に対し、その宣言は明示的にエクスポート指令を用いてエクスポートできる。
【0163】
例えば、次のモジュールを考えてみる。
module MyModule{
import HerModule; //HerTypeを宣言
export MyType1;
export MyExtent1;
type MyType1:Logical
*;
type MyType2:HerType;
MyExtent1:Number
*;
MyExtent2:HerType;
}
他のモジュールは単に「MyType1」および「MyExtent1」だけを見えることに留意されたい。それにより、「HerModule」の次の定義が正式なものになる。
module HerModule{
import MyModule; //MyType1およびMyExtent1を宣言
export HerType;
type HerType:Text where value.Count<100;
type Private:Number where!(value in MyExtent1);
SomeStorage:MyType1;
}
この例で示すように、モジュールは、循環依存性(circular dependency)を有している。
【0164】
D言語の型は、2つの主要区分に分かれる。それは、基本型および派生型(derived type)である。基本型はD言語構文を使用して定義できない型であるが、他はD言語仕様で完全に定義される。基本型は、その仕様の一部である上位型(super−type)として、多くても1つの基本型を指定することしかできない。値は、確かに1つの基本型の事例であり、1つの基本型およびその上位型全ての仕様に適合する。
【0165】
派生型は、言語で提供される型コンストラクタを使用して、定義がDソーステキストで構築される型である。派生型は、別の型上の制約として定義され、明示的な下位型付け関係を生成する。値は、派生型の制約を満たすことにより、簡単に幾つでも派生型に適合する。値および派生型間では先験的な係属性(a priori affiliation)はなく、むしろ派生型の制約に適合する所与の値が、その型として自由に解釈できる。
【0166】
Dは型定義において広範囲の選択を提供する。コレクションを返す任意の式が、型として宣言可能である。エンティティおよびコレクションに対する型述語(predicate)は、式であり、この書式に適合する。型宣言は、明示的にそのメンバを列挙できるか、または他の型から構成される。
【0167】
別の異なる点は、Dのような構造的に型付けされた言語および名目上の型付け言語との間にある。Dの型は、値の集合に対する仕様である。2つの型は、全く同一の値コレクションが、型の名前と関係なく、両型に適合する場合、同一である。型には使用するための名前を付ける必要はない。型の式は、型参照が要求されるどの場所においても可能である。Dにある型は、コレクションを返す簡単な式である。
【0168】
型Aに適合するどの値もまた型Bに適合するなら、AはBの下位型である(そうすると、BはAの上位型である)。下位型付けは、推移的なものであり、すなわち、AがBの下位型であり、BがCの下位型である場合、AはCの下位型である(そうすると、CはAの上位型である)。下位型付けは、再帰的である、すなわち、AはAの(実質のない(vacuous))下位型である(そしてAはAの上位型である)。
【0169】
型は、型述語を満足させる全値のコレクションと見なされる。この理由として、コレクションのどの運用も、型に適用でき、また型は他のどのコレクション値のような式でも操作できる。
【0170】
Dは、値が成立するための2つの主なる手段を提供する、すなわち、計算値および格納値(別称、フィールド)である。計算値および格納値は、モジュールおよびエンティティ宣言両方を伴って生じることが可能で、コンテナによりスコープ化される。計算値は、典型的には、Dソーステキストの一部として定義される式を評価することから導かれる。対照的に、フィールドは、値を格納し、フィールドのコンテンツは、経時とともに変化する。
【0171】
例示的ネットワークおよび分散環境
当業者には、本明細書で記述するデータスクリプト言語の型システムに対して、様々な実施形態が、任意のコンピュータまたは他のクライアントもしくはサーバデバイスと接続して実装可能であり、コンピュータネットワーク、または分散型コンピューティング環境の一部として配置可能であり、また任意の種類のデータストアに接続可能であることは理解されよう。この点に関して、本明細書で記述した様々な実施形態は、任意のコンピュータシステムまたは任意の数のメモリもしくは記憶装置を有する環境で、ならびに任意な数のアプリケーションおよび任意な数の記憶装置にわたって生ずるプロセスを実装可能である。これは、サーバコンピュータおよびネットワーク環境で配置されるクライアントコンピュータを有する環境、または、リモートもしくはローカルストレージを有する分散型コンピューティング環境を含むが、これに限定されない。
【0172】
分散型コンピューティングは、コンピュータリソースの共有ならびにコンピューティングデバイスおよびシステム内の通信交換によるサービスを提供する。これらリソースおよびサービスは、ファイル等の対象物に対して、情報交換、キャッシュストレージ、およびディスクストレージを含む。これらリソースおよびサービスは、また、負荷分散、リソースの拡張、処理の特殊化、等のための複数の処理装置にわたる処理能力の共有も含む。分散型コンピューティングは、ネットワークの接続性を利用して、クライアントが企業全体に利益をもたらすようクライアントの集結能力を押し上げることができる。この点に関して、多様なデバイスが、本主題が開示する様々な実施形態の何れも1つ以上の態様を実行するように協働可能であるアプリケーション、オブジェクトまたはリソースを有することができる。
【0173】
図16は、例示的ネットワーク型または分散型コンピューティング環境の概略図を提供するものである。分散型コンピューティング環境は、コンピューティングオブジェクト1610、1612等、およびコンピューティングオブジェクトまたはデバイス1620、1622、1624、1626、1628、等から構成され、アプリケーション1630、1632、1634、1636、1638により表されるようなプログラム、方法、データストア、プログラム可能論理、等を含むことができる。オブジェクト1610、1612等およびコンピューティングオブジェクトまたはデバイス1620、1622、1624、1626、1628等は、PDA, 音声/映像デバイス、携帯電話、MP3プレーヤ、パーソナルコンピュータ、ラップトップのような様々なデバイスから構成できることを理解されたい。
【0174】
各オブジェクト1610、1612等、およびコンピューティングオブジェクトまたはデバイス、1620、1622、1624、1626、1628等は、1つ以上の他のオブジェクト1610、1612等およびコンピューティングオブジェクトまたはデバイス1620、1622、1624、1626、1628等に、直接的または間接的のいずれかで、通信ネットワーク1640経由で通信できる。
図16の単一の要素として説明してあるが、ネットワーク1640は、
図16のシステムにサービスを提供する他のコンピューティングオブジェクトおよびコンピューティングデバイスから構成でき、および/または複数の相互接続のネットワーク(図示なし)を表現可能である。各オブジェクト1610、1612等、または1620、1622、1624、1626、1628等は、本主題の開示である様々な実施形態に従い提供されたデータスクリプト言語のための型システムと通信、処理、またはその実装に適切な、API、もしくは他のオブジェクト、ソフトウェア、ファームウェアおよび/もしくはハードウェアを使用可能なアプリケーション1630、1632、1634、1636、1638のようなアプリケーションを含むこともできる。
【0175】
分散型コンピューティング環境を支援する多様なシステム、コンポーネント、およびネットワーク構成がある。例えば、コンピューティングシステムは、ローカルネットワークまたは広域分散型ネットワークにより、有線または無線システムにより、相互に接続できる。任意のネットワークインフラストラクチャが、様々な実施形態で記述されたように、データスクリプト言語のための型システムに対し、インシデントを起こす例示的通信に対して使用できるが、現在、多くのネットワークが、広域分散型コンピューティングに対してインフラストラクチャを提供し、また多くの様々なネットワークを包括するインターネットに連結している。
【0176】
このように、クライアント/サーバ、ピアツーピア、またはハイブリットアーキテクチャのようなネットワークトポロジおよびネットワークインフラストラクチャのホストは、有効に利用可能である。「クライアント」は、クラスまたはグループのメンバであり、このクラスまたはグループは、クライアントと関連しない別のクラスまたはグループのサービスを利用する。クライアントは、プロセスと表現でき、すなわち、別のプログラムまたはプロセスにより提供されるサービスを要求する、概ね命令またはタスクの集合である。クライアントプロセスは、他のプログラムまたはサービス自体に関する如何なる作業詳細を「知る」必要なしに要求サービスを有効に利用する。
【0177】
クライアント/サーバ・アーキテクチャ、特にネットワークシステムにおいて、クライアントは、通常、別のコンピュータ、例えばサーバが提供する共有ネットワークリソースにアクセスするコンピュータである。
図16の説明において、非限定の例として、コンピュータ1620、1622、1624、1626、1628等は、クライアントとして想定可能であり、およびコンピュータ1610、1612、等はサーバとして想定可能であり、サーバ1610、1612等は、クライアントコンピュータ1620、1622、1624、1626、1628等からのデータ受信、データの格納、データの処理、クライアントコンピュータ1620、1622、1624、1626、1628等へのデータの送信のような、データサービスを提供するが、どのコンピュータも、その環境により、クライアント、サーバ、またはその両方として考えられる。これらコンピューティングデバイスのどれもが、1つ以上の実施形態に対して本明細書で記述したように、データスクリプト言語の型システムに関係付けられる処理データ、符号化データ、クエリデータ、または要求サービスもしくはタスクであり得る。
【0178】
サーバは、典型的にはインターネットまたは無線ネットワークインフラストラクチャのようなリモートまたはローカルネットワークを通してアクセス可能な、リモートコンピュータシステムである。クライアントプロセスが、第1のコンピュータシステムにおいて動作可能で、サーバプロセスが第2のコンピュータシステムにおいて動作可能であり、通信媒体を介して相互に通信を行うことで、それ故に、分散機能性を提供し、および複数のクライアントがサーバの情報収集能力を利用できる。データスクリプト言語の型システムに準じて効果的に利用される任意のソフトウェアオブジェクトは、スタンドアローン、または複数のコンピューティングデバイスもしくはオブジェクトにわたる分散が可能である。
【0179】
通信ネットワーク/バス1640がインターネットであるネットワーク環境において、例えば、サーバ1610、1612等は、クライアント1620、1622、1624、1626、1628等が、HTTPのような数々の周知の任意のプロトコルを介して通信するWebサーバが可能である。サーバ1610、1612等は、分散型コンピューティング環境の特性であるクライアント1620、1622、1624、1626、1628、等としても機能する。
【0180】
例示的コンピューティングデバイス
上述したように、本明細書で記述した技術は、任意のデバイスに有利に適用可能であるが、データ集約型アプリケーションに接続するどのような種類のデータにも適応する型を、簡単にかつ柔軟性をもって定義することが望まれる。従って、ハンドヘルド、携帯用、その他のコンピューティングデバイスならびに全種類のコンピューティングオブジェクトが、様々な実施形態に関連して使用すると想定される、すなわち、デバイスがいかなるところでも、迅速かつ効果的に、大量のデータを走査または処理することを意図されていることを理解されたい。従って、
図17の下方に説明される下記の汎用リモートコンピュータは、単なるコンピューティングデバイスの一例である。
【0181】
必須条件ではないが、実施形態を、オペレーティングシステムを介して、デバイスもしくはオブジェクトに対してサービスを開発者が使用するために、部分的に実装可能であり、および/または本明細書で記述した様々な実施形態の1つ以上の機能的態様を実行するために稼働するアプリケーションソフトウェア内に含むことができる。ソフトウェアは、プログラムモジュールのようなコンピュータ実行命令の一般的コンテキストで記述でき、クライアントワークステーション、サーバまたは他のデバイス等の1つ以上のコンピュータによって実行される。コンピュータシステムは、データ通信のために使用できる多様な設定およびプロトコルを有し、それ故、特別な設定またはプロトコルが限定的であると考慮されるべきでないことを、当業者は理解するであろう。
【0182】
このように、
図17は、本明細書に記述した本実施形態の1つ以上の態様を実装可能な、適切なコンピューティングシステム環境1700の例を示している。また、上記を明確にするためであるが、コンピューティングシステム環境1700は、適切なコンピューティング環境の単なる一例であり、使用または機能性の範囲に関してなんら制限を示唆するよう意図していない。コンピューティング環境1700は、例示的オペレーティング環境1700で示した1つのコンポーネントまたはコンポーネントの組合せに依存するとも要求されるとも解釈すべきではない。
【0183】
図17を参照して、1つ以上の実施形態を実装するための例示的リモートデバイスは、汎用コンピューティングデバイスを、コンピュータ1710の形式で含む。コンピュータ1710のコンポーネントは、処理装置1720、システムメモリ1730、およびシステムメモリを含む様々なシステムコンポーネントを処理装置1720に連結するシステムバス1722を含むことができるが、限定ではない。
【0184】
コンピュータ1710は、典型的には、多様なコンピュータ可読媒体を含み、コンピュータ1710がアクセス可能な任意の有効な媒体であることができる。システムメモリ1730は、ROM(read only memory)および/またはRAM(random access memory)のような揮発性および/または不揮発性メモリの形式で、コンピュータ記憶媒体を含むことができる。限定ではなく、例として、メモリ1730は、またオペレーティングシステム、アプリケーションプログラム、他のプログラムモジュール、およびプログラムデータを含むことができる。
【0185】
ユーザは、入力デバイス1740により、コマンドおよび情報をコンピュータ1710に入力できる。モニターまたは他の形式の表示デバイスは、出力インターフェース1750のような、インターフェ−スを介してシステムバス1722に接続される。モニターに加えて、コンピュータは、出力インターフェース1750を介して接続できる、スピーカ
およびプリンタ等の他の周辺出力デバイスを含むこともできる。
【0186】
コンピュータ1710は、リモートコンピュータ1770のような1つ以上の他のリモートコンピュータへの論理接続を用いて、ネットワーク型または分散型環境で稼働できる。リモートコンピュータ1770は、パーソナルコンピュータ、サーバ、ルータ、ネットワークPC、ピアデバイス、もしくは他の通常のネットワークノード、または任意の他のリモートメディア消費もしくは伝達デバイスが可能であり、コンピュータ1710に関して上述した幾つかの要素または全ての要素を含むことができる。
図17で示した論理接続は、LAN(local area network=ローカルエリアネットワーク)またはWAN(wide area network=広域ネットワーク)のようなネットワーク1772を含むが、他のネットワーク/バスを含むことも可能である。上記ネットワーク環境は、家庭、オフィス、企業規模コンピュータネットワーク、イントラネット、およびインターネットで一般的である。
【0187】
上記のように、例示的実施形態を様々なコンピューティングデバイスおよびネットワークアーキテクチャと関連して述べてきたが、基本概念は、データ集約型アプリケーションに関連する任意の種類のデータ収納のため簡単かつ柔軟に型を定義することが望ましい、任意のネットワークシステムおよびコンピューティングデバイスまたはシステムに適用することができる。
【0188】
また、同一または類似の機能性を実装する多数の方式があり、例えば、適宜なAPI、ツールキット、ドライバコード、オペレーティングシステム、制御、スタンドアローン、またはダウンロード可能ソフトウェアオブジェクト等、であり、これにより、アプリケーションおよびサービスが効率のよい符号化および問合せ技術を使用できるようになる。このように、本明細書の実施形態は、API(または他のソフトウェアオブジェクト)の見地から、また同様に、データスクリプト言語に対する型システムを提供もしくは有効にするソフトウェアやハードウェアオブジェクトの見地から検討される。このように、本明細書の様々な実施形態が、ソフトウェアによるのと同様、全てハードウェア、部分的にハードウェア、および部分的にソフトウェアの態様を有する。
【0189】
本明細書で使用される単語「例示的(exemplary)」は、例、事例、または説明として供する意味で使用されている。疑問を回避するために、本明細書で開示される主題は上記例によって限定されない。さらに、「例示的」のように、本明細書で記述した如何なる態様または設計は、他の態様または設計より好適または利点があるようには、必ずしも解釈されないし、また当業者に周知である等価な例示的構造および技術を排除することを意味してもいない。さらに、疑問を回避するために、用語「含む(include)」、「有する(has)」、「包含する(contain)」および他の類似の語句が「発明を実施するための形態」または「特許請求の範囲」のどちらかで使用される範囲に対して、上記用語は、任意な追加要素または他の要素を排除することなく、開放移行として用語「備える(comprising)」に類似な様式で包含されることを意図する。
【0190】
言及してきたように、本明細書で記述した様々な技術は、ハードウェアもしくはソフトウェアに、または適宜、その両方の組合せに関連して実装可能である。本明細書で使用したように、用語「コンポーネント(component)」、「システム(system)」、等は、同様に、コンピュータ関連のエンティティ、ハードウェア、ハードウェアとソフトウェアの組合せ、ソフトウェア、または実行中のソフトウェア何れかを指すことを意図している。例えば、コンポーネントは、プロセッサ上で動作するプロセス、プロセッサ、オブジェクト、実行可能ファイル、実行スレッド、プログラム、および/またはコンピュータが可能であるが、これに限定されない。説明として、コンピュータ上で動作するアプリケーションおよびコンピュータはコンポーネントが可能である。1つ以上のコンポーネントが、プロセスおよび/または実行スレッドに内在でき、またコンポーネントが、1台のコンピュータ上にローカライズされても、かつ/または複数のコンピュータ間で分散されてもよい。
【0191】
前記のシステムが、数々のコンポーネント間の相互通信に関して記述されてきた。上記システムおよびコンポーネントは、これらコンポーネントもしくは特定の下位コンポーネント、幾つかの特定コンポーネントもしくは下位コンポーネント、および/または追加コンポーネント、ならびに前述の様々な順列および組合せを含むことが可能であることを理解されたい。下位コンポーネントは、また、親コンポーネント(階層的に)内に含まれるより、むしろ他のコンポーネントに通信可能に連結するコンポーネントとして実装できる。追加的に、1つ以上のコンポーネントが集約した機能性を提供する単一のコンポーネントに組合わさるか、または数個の異なる下位コンポーネントに分割されてもよい、しかも1つ以上の、管理層のような中間層の何れかが、統合された機能性を提供するために、上記下位コンポーネントに通信可能に連結されるように提供できることにも留意すべきである。また、本明細書で記述した任意のコンポーネントは、本明細書で具体的には記述されていない1つ以上の他のコンポーネントと相互に通信可能であるが、一般的に当業者には周知である。
【0192】
上記の例示的システムを考慮して、記述した主題に従い実装できる方法論は、様々な図のフローチャートを参考することによって、一層理解されるであろう。簡潔な説明として、当該方法論は、一連のブロック図として示し、説明されるが、本特許請求主題は、幾つかのブロックは、本明細書で描き記述したものとは異なった順序および/または他のブロックと同時に生じる可能性があるように、ブロックの並びの順序によって限定されないことが理解されるべきである。順次的でないかまたは分岐されるフローを、フローチャートを介して説明しているが、同一または類似の効果を達成する様々な他の分岐、フロー経路、ブロックの順序を実装できることを理解されたい。さらに、説明された全てのブロックが、下文で記述する方法論を実装するよう要求される訳ではない。
【0193】
本明細書で記述した様々な実施形態に加え、他の類似の実施形態を使用できる、すなわち本主題から逸脱することなしに、対応する実施形態(複数可)の同一または等価な機能を実行するために、修正および加筆を記述の実施形態(複数可)にできることを理解されたい。さらに、複数の処理チップまたは複数のデバイスが本明細書で記述される1つ以上の機能の実行を共有でき、同様に、ストレージが複数のデバイスにわたって成立できる。従って、本発明は、いかなる単一の実施形態にも限定を加えるものではなく、むしろ添付の特許請求に従う精神および範囲は、幅広く解釈されるべきである。