ラムダ式
本開示は、ラムダ式と、命令型のおよび/またはオブジェクト指向のコンピュータプログラミング言語でのそのような式の使用とに関する。ラムダ式は、コード指定のより簡潔で機能的な形を提供するためにメソッドと共に(例えば、引数、割当...)使用することができる。さらに、ラムダ式は、とりわけ、型推論および型チェックならびにオーバーロード解決に加わることができる。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ラムダ式と、命令型のおよび/またはオブジェクト指向のコンピュータプログラミング言語でのそのような式の使用とに関する。
【背景技術】
【0002】
プログラミング言語は、プログラマによる指定ならびに効率的実行を容易にするために進歩し続ける。コンピュータ言語の初期には、低水準マシンコードが優勢であった。マシンコードを用いる場合に、コンピュータプログラムまたはコンピュータプログラムを構成する命令は、機械語またはアセンブリ言語で記述され、ハードウェア(例えば、マイクロプロセッサ)によって実行された。これらの言語は、コンピューティングハードウェアを制御する効率的な手段をもたらしたが、プログラマが洗練されたロジックを理解し、開発するのは非常に難しかった。その後、抽象化の様々なレイヤを提供する言語が導入された。したがって、プログラマは、より高水準のソース言語を用いてより高いレベルでプログラムを記述することができ、このより高水準のソース言語は、その後、コンパイラまたはインタープリタを介して、ハードウェアによって理解される、より低水準の機械語に変換することができた。プログラミングにおけるさらなる進歩は、より高度なプログラミングロジックを以前よりはるかにすばやく指定できるようにする、抽象化の追加のレイヤをもたらした。しかし、これらの進歩は、処理コストなしでは得られない。
【0003】
コンパイラおよび/またはインタープリタは、高水準ロジックを実行可能マシンコードに変換するという重荷を背負う。一般に、コンパイラおよび/またはインタープリタは、ソースプログラミング言語(例えば、C、C#、Visual Basic、Java(登録商標)...)で指定されたプログラムを受け取り、これによって与えられるロジックをハードウェアデバイスによって実行可能な機械語に変換するコンポーネントである。しかし、この変換が逐語的に行われる必要はない。実際に、従来のコンパイラおよび/またはインタープリタは、ソースコードを分析し、非常に効率的なコードを生成する。例えば、プログラマは、人間が理解するには直観的で簡単であるが、しばしばコンピュータが実行するには非効率である、動作の論理フローを示すコードを記述する。コンパイラおよび/またはインタープリタは、非効率性を識別でき、所期の結果を達成しながら、不必要な動作を除去することおよび/または命令の実行を再配置することによって、ハードウェアレベルでプログラム性能を改善することができる。この形で、プログラマは、堅牢で効率的なソフトウェアプログラムを作成することができる。
【発明の開示】
【発明が解決しようとする課題】
【0004】
ラムダ式は、従来の形よりも簡潔な、値またはデータを指定する形を提供する。ラムダ式は、型推論に加わることもできる。さらに、ラムダ式は、オーバーロード解決を容易にすることができる。
【課題を解決するための手段】
【0005】
以下に、請求される主題のいくつかの態様の基本的理解をもたらすために、単純化された要約を提示する。この要約は、広範囲の概要ではない。主要な/クリティカルな要素を識別すること、または請求される主題の範囲を区切ることは、意図されていない。この要約の唯一の目的は、後で提示されるより詳細な説明の前置きとして、単純化された形でいくつかの概念を提示することである。
【0006】
短く説明すると、提供される主題は、ラムダ式と、命令型のおよび/またはオブジェクト指向のコンピュータプログラミング言語でのそのような式の使用とに関する。ラムダ式は、従来の形よりも簡潔な、値またはデータを指定する形を提供する。例えば、ラムダ式は、匿名メソッドを指定する、より簡潔で機能的な形を提供することができる。
【0007】
ラムダ式は、型推論に加わることもできる。ラムダ式自体は、型を有する必要がない。そうではなく、ラムダ式は、とりわけ、パラメータ型および戻り型を有することができる。ラムダ式の指定に関連する冗漫さを減らすために、これらの型を明示的に述べる必要はない。コンテキストに基づいてこれらの型を推論するシステムおよび方法を提供する。
【0008】
さらに、ラムダ式は、オーバーロード解決を容易にすることができる。例えば、メソッドがオーバーロードされる場合に、ラムダ式は、特定のメソッドの選択を容易にすることができる。例えば、ラムダ式が、オーバーロードされるメソッドへの引数として使用される場合に、その式の戻り型を、特定のメソッドを選択する際の要因として利用することができる。
【0009】
前述の目的および関連する目的の達成に向かって、請求される主題のある種の例示的態様を、以下の説明および添付図面に関して本明細書で説明する。これらの態様は、この主題を実践できる様々な形を示し、そのすべてが請求される主題の範囲に含まれることが意図されている。他の利益および新規の特徴は、図面と共に考慮される場合に、以下の詳細な説明から明白になる可能性がある。
【発明を実施するための最良の形態】
【0010】
本発明の様々な態様を、添付図面を参照して説明するが、添付図面では、類似する符号が、複数の図面を通じて類似するまたは対応する要素を指す。しかし、図面およびそれに関連する詳細な説明が、請求される主題を特定の開示される形態に限定することは、意図されていないことを理解されたい。そうではなく、その意図は、請求される主題の趣旨および範囲に含まれるすべての修正形態、同等物、および代替形態を含むことである。
【0011】
本明細書で使用される用語「コンポーネント」、「システム」、および類似物は、ハードウェア、ハードウェアおよびソフトウェアの組合せ、ソフトウェア、または実行中のソフトウェアのいずれであれ、コンピュータ関連エンティティを指すことが意図されている。例えば、コンポーネントは、プロセッサ上で動作しているプロセス、プロセッサ、オブジェクト、実行可能ファイル、実行のスレッド、プログラム、および/またはコンピュータとすることができるが、これらに限定はされない。限定ではなく例として、コンピュータで動作しているアプリケーションとそのコンピュータとの両方を、コンポーネントとすることができる。1つまたは複数のコンポーネントが、1つのプロセスおよび/または実行のスレッドの中に存在することができ、1つのコンポーネントを、1つのコンピュータに局所化し、かつ/または複数のコンピュータの間で分散させることができる。
【0012】
単語「例示的」は、本明細書では、例、実例、または例示として働くことを意味するのに使用される。本明細書で「例示的」として説明されるすべての態様または設計は、必ずしも、他の態様または設計より好ましいまたは有利とは解釈されない。
【0013】
さらに、開示される主題は、本明細書で詳細に説明される諸態様を実施するためにコンピュータまたはプロセッサベースのデバイスを制御するためにソフトウェア、ファームウェア、ハードウェア、またはその任意の組合せを作るのに標準プログラミングおよび/またはエンジニアリング技法を使用することによってシステム、方法、装置、または製造品として実施することができる。本明細書で使用される用語「製造品」(またはその代わりに「コンピュータプログラム製品」)は、任意のコンピュータ可読デバイス、搬送波、または媒体からアクセス可能なコンピュータプログラムを含むことが意図されている。例えば、コンピュータ可読媒体は、磁気ストレージデバイス(例えば、ハードディスク、フロッピー(登録商標)ディスク、磁気ストリップ...)、光ディスク(例えば、コンパクトディスク(CD)、デジタル多用途ディスク(DVD)...)、スマートカード、およびフラッシュメモリデバイス(例えば、カード、スティック)を含むことができるが、これらに限定はされない。さらに、電子メールの送信および受信またはインターネットもしくはローカルエリアネットワーク(LAN)などのネットワークへのアクセスに使用されるものなどの搬送波を使用して、コンピュータ可読電子データを搬送できることを了解されたい。もちろん、請求される主題の範囲または趣旨から逸脱せずに、この構成に対して多数の変更を行うことができることを、当業者は認めるであろう。
【0014】
まず図1に移ると、ラムダ式(lambda expression)の実行に関する実行システム100が示されている。システム100は、レシーバコンポーネント110および評価コンポーネント120を含む。レシーバコンポーネント110は、ラムダ式を入手し、その式を評価コンポーネント120に送る。評価コンポーネント120は、式を入手し、特定の型の値を計算し、返す。
【0015】
ラムダ式とは、とりわけ、値およびデータを簡潔に指定し、または取り込む機構である。1つの実例で、ラムダ式を使用して、匿名メソッドを指定し、または置換することができる。匿名メソッドは、例えば、デリゲートに関連するプログラムコードを「インラインで」表現し、または記述することを可能にする。例えば、C#でIEnumerable<customer>csと表されるカスタマのコレクションにまたがって照会することが望まれると仮定する。35歳より若いカスタマを返すクエリは、次のように指定することができる。
【0016】
【表1】
【0017】
その代わりに、例えば次のように、匿名メソッドを指定して、そのような式の指定を単純にすることができる。
【0018】
【表2】
【0019】
これは、少なくとも新しいクラスを指定する必要がないので、前の例より簡潔である。新しいクラスを指定するのではなく、delegateキーワードによって識別される匿名メソッドは、引数としてインライン化される。しかし、匿名メソッドの指定は、それでも非常に冗漫である。したがって、ラムダ式を、匿名メソッドの代わりに使用することができる。前のサンプルに従って、ラムダ式を利用して、はるかに簡潔に、機能的に情報を指定することができる。具体的に言うと、このラムダ式は、次に対応するものとすることができる。
【0020】
【表3】
【0021】
ここでは、パラメータ「c」ならびに式「c.age<35」が識別される。これは、少なくとも不必要な構文および明示的な型宣言(例えば、Customer)が除去されるので、前の表現よりはるかに冗漫でない。
【0022】
ラムダ式は、垂直のバーに囲まれたパラメータリストおよびそれに続く式または式本体として指定することができる。例えば、ラムダ式を、次の擬似BNF(バッカス−ナウア記法)で指定されるように構造化することができる。
【0023】
【表1】
【0024】
ラムダ式は、一般形式|パラメータ|式を有することができる。しかし、追加の指定の形も企図されている。例えば、ラムダ式を、形式パラメータ=>式、(パラメータ)=>式、ならびにデリミタおよび/またはシンボルの他の組合せもしくは置換で宣言することができる。構文を、ラムダ式が空のパラメータリストを有する場合に異なるものとすることもできる。垂直のバーが、式からパラメータを区切り、空のパラメータリストがある場合に、結果のトークンは、隣接する2つのバー文字(例えば、‖または||)になるはずである。これは、一部のプログラミング言語で条件「OR」を表すのに利用される隣接するバーに関して曖昧さを生じる可能性がある。したがって、隣接するバーとそれに続く等号文字(例えば、||=)などであるがこれに限定はされない代替の表現を使用することができる。しかし、隣接するバー文字をオーバーロードし、空のパラメータリストならびに条件「OR」を表すのに利用することができることを了解されたい。
【0025】
形式「|パラメータ|式」のラムダ式は、形式「delegate(パラメータ){return 式;}」の匿名メソッドに対応することができる。したがって、ラムダ式は、より冗漫な匿名メソッドを置換することができる。それでも、ラムダ式と匿名メソッドとの間には相違がある。とりわけ、ラムダ式は、パラメータ型を省略し、推論する(下で詳細に説明する)ことを可能にするが、匿名メソッドは、パラメータ型を明示的に述べることを必要とする。さらに、匿名メソッドの本体は、ステートメントブロックとして記述されるが、ラムダ式の本体は、式またはステートメントブロックのいずれかとすることができる。
【0026】
図1に戻ると、レシーバコンポーネント110は、上で説明したラムダ式またはその表現を受け取り、取り出し、または他の形で入手する。次に、そのラムダ式を評価コンポーネント120に送ることができる。評価コンポーネント120は、ラムダ式に関連する値を計算し、その値を返す。限定ではなく例として、システム100を、プログラム実行システムに関連付けることができる。ラムダ式は、プログラムステートメントの一部とすることができ、あるいは、引数および返される値などの他のコンストラクトを、関連するステートメントの処理においてさらに利用することができる。さらに、レシーバコンポーネント110および評価コンポーネント120は、ネストされたおよび/または階層的なラムダ式の評価を可能にするために協力することができる。例えば、
【0027】
【表2】
【0028】
このステートメントは、カスタマの名前および年齢が選択され(「Select(|c|new{name=c.name,age=c.age}))、そのコレクションから、年齢が35歳未満のカスタマ(cs)が識別される(cs.where(|c|c.age<35))ことを表す。
【0029】
図2に、ラムダ式のプログラミングシステムまたはプログラミング環境200を示す。システム200は、開発コンポーネント210、コンパイラコンポーネント220、および実行可能プログラム230を含む。開発コンポーネント210は、プログラマなどのユーザから入力を受け取る。この入力には、少なくとも1つのラムダ式を含む複数のプログラムステートメントまたはコンストラクトを含めることができる。例えば、あるステートメントに、引数としてのラムダ式または関数もしくは型に割り当てられるラムダ式を含めることができる。式は、式本体からパラメータを分離するのに隣接するバー(例えば、|c|c.age<35)または二重矢印(例えば、c=>c.age)を利用することを含むがこれに限定されない複数の形式のうちのいずれか1つで表すことができる。開発コンポーネント210は、コードエディタ(例えば、テキストまたはグラフィカル)、統合開発環境(IDE)、または類似物に対応するものとすることができる。コンパイラコンポーネント220(下でさらに詳細に説明する)は、開発コンポーネント210からプログラムソースコードを受け取り、コンピュータ実行可能プログラム230を生成することができ、あるいはその代わりに、例えばジャストインタイム(JIT)コンパイラによるなど、ランタイムにさらにコンパイルできるある中間フォーマット(例えば、IL(中間言語))を生成することができる。コンパイラコンポーネント220を、IDEの一部とすることもできる。
【0030】
図3に、型変換システム300を示す。ラムダ式は、特殊な変換ルールを有する値として分類することができる。ラムダ式は、型を有しないが、delegate型などの互換の型に(例えば、暗黙のうちに)変換することができる。システム300は、互換性コンポーネント310および変換コンポーネント320を含む。両方のコンポーネントを、図2のコンパイラコンポーネント220などのコンパイラの中に配置することができる。互換性コンポーネント310は、例えばラムダ式およびdelegate型関数からなる、ラムダ式割当を受け取る。その後、互換性コンポーネントは、あるルールまたは条件312に関して割当型を分析して、その割当型がラムダ式と互換であるかどうかを判定することができる。条件312が満足されない場合には、割り当てられる型は互換ではなく、エラーまたは例外を互換性コンポーネント310によって生成することができる。そうではなく、条件312が満足され、型がラムダ式と互換である場合には、式を、変換コンポーネント320によってこの型に変換することができる。
【0031】
限定ではなく例として、delegate型Dは、様々な条件312が満足される時に、ラムダ式Lと互換であるものとすることができる。例えば、Dを、非void戻り型を有しなければならず、refパラメータまたはoutパラメータを有してはならないものとすることができる。それに加えてまたはその代わりに、DおよびLを、同一の個数のパラメータを有しなければならないものとすることができ、Lが明示的に型付けされたパラメータリストを有する場合には、Dの各パラメータの型は、Lの対応するパラメータの型と同一でなければならない。それに加えてまたはその代わりに、Lのパラメータが、Dの対応するパラメータの型を与えられる時に、Lの式本体を、Dの戻り型に暗黙のうちに変換可能な有効な式とすることができる。例えば、型Aの引数をとり、型Rの値を返す関数を表すジェネリックdelegate型Function<A,R>を仮定する。
【0032】
【表3】
【0033】
さらに、次の割当を仮定する。
【0034】
【表4】
【0035】
ラムダ式|x|x+1を、変換コンポーネント320によってdelegate型Func<int,int>に成功して変換することができる。というのは、xが型intを与えられるときに、x+1が、型intに暗黙のうちに変換可能な有効な式であるからである。この割当は、より冗漫な匿名メソッド
【0036】
【表5】
【0037】
と同等である。ラムダ式が、xの型を推論することを許容するが、必要とはしないのに対して、匿名メソッドが、型を明示的に述べることを必要とすることに留意されたい。
【0038】
図4に移ると、ラムダ式に関する推論を可能にする型推論システム400が示されている。型推論システム400は、コンパイラコンポーネント220(図2)などのコンパイラの一部とすることができる。型推論システム400は、コンテキストコンポーネント410および推論コンポーネント420を含む。コンテキストコンポーネント410は、ラムダ式を受け取るか識別した時に、例えば特定のラムダ式がそこから入手されたプログラムから、そのラムダ式に関連するコンテキスト情報を受け取り、取り出し、または他の形で入手する。そのようなコンテキスト情報は、ステートメント、式、クラス、型、および類似物を含む、ラムダ式に関連する任意の情報とすることができる。このコンテキスト情報は、例えばデータパケットの伝送を介して、推論コンポーネント420によってコンテキストコンポーネント410から入手される。さらに、ラムダ式を推論コンポーネント420に供給して、それに関連する型の型推論を容易にすることができる。推論コンポーネント420は、その後、コンテキスト情報を使用して、ラムダ式パラメータ、式本体、および/または戻り型の型などの型を推論することができる。もちろん、型推論を、推論された型が他の要素の型を推論するのを助けるようにするために伝搬させることができる。したがって、推論コンポーネント420は、追加の推論を行うのに使用できる推論のセット430を生成し、維持することができる。
【0039】
ラムダ式自体は、構造的型(structural type)など、それに関連する型を有しないことを了解されたい。そうではなく、パラメータおよび式本体または戻り値が、関連する型を有する。構造的型の推論が、オブジェクト指向言語について非自明であることが認められている。次の例示的なラムダ式およびオブジェクトを定義するクラスを検討されたい。
【0040】
【表6】
【0041】
このラムダ式とカスタマおよびワインというオブジェクトクラスとを単純に分析することによって、パラメータ(x)および戻り式値(x.age)の型を判定することは、できない。パラメータは、型customerを有することができ、これは、ageについて型integerを返す。その代わりに、このパラメータを、ageについて型stringを返す型wineを有するものとすることができる。
【0042】
しかし、型をコンテキストから推論することができる。次の宣言を検討されたい。
【0043】
【表7】
【0044】
AをとりRを返すdelegate型が指定されている。次に、ラムダ式が、デリゲート関数に割り当てられる。そのような追加のコンテキスト情報から、型を推論することができる。関数へのラムダ式の割当に基づいて、推論コンポーネント420は、引数SがCustomerでなければならないと判定することができる。次に、推論コンポーネント420は、パラメータxが型Customerを有すると推論することができる。これから、x.ageを、Customerクラスまたはオブジェクト定義から型integerを有すると判定することができる。その後、型推論を、例えば検証コンポーネント422を介して、戻り型を比較することによって検証することができる。ここで、デリゲート関数Funcは、型Boolean(bool)を返し、ラムダ式は、ageが35未満であるかどうかの判定を介して型Booleanを返す。したがって、推論コンポーネントは、コンテキストに基づいてラムダ式に関連する型を成功して推論することができた。実際には、デリゲート関数へのラムダ式の割当が、コンテキストおよび型情報をラムダ式にプッシュダウンすることを可能にした。
【0045】
ラムダ式を伴う型推論の明瞭さおよび理解を容易にするために、もう1つの例示的シナリオを説明する。C#の次のクラス定義を検討されたい。
【0046】
【表8】
【0047】
System.Query名前空間が、例えばusing節を用いてインポートされたと仮定すると、型stringのNameプロパティを有するクラスCustomerを与えられれば、Selectメソッドを使用して、カスタマのリストから名前を選択することができる。例えば、
【0048】
【表9】
【0049】
Selectのエクステンションメソッド呼び出しを、この呼び出しを静的メソッド呼び出しに書き直すことによって処理することができる。
【0050】
【表10】
【0051】
型推論を利用して、引数の型を推論することができる。コンテキスト情報は、customers引数がsourceパラメータに関連することを明らかにし、したがって、TがCustomerであると推論することができる。その後、cに型Customerを与えることができ、式c.Nameは、selectorパラメータの戻り型に関連し、Sがstringであると推論される。したがって、この呼び出しは、
【0052】
【表11】
【0053】
と同等であり、その結果は、型IEnumerable<string>を有する。
【0054】
次の例では、ラムダ型推論が、どのようにして型情報がジェネリックメソッド呼び出しの引数の間で「流れる」ことを可能にするかを示す。次のメソッドとその呼び出しを仮定する。
【0055】
【表12】
【0056】
この呼び出しに関する型推論は、まず、valueパラメータに関連する引数「1:15:30」から進行する。したがって、Xは、この引数に基づいてstringであると推論することができる。次に、最初のラムダ式のパラメータsに、推論された型stringが与えられる。式TimeSpan.Parse(s)は、f1(Y)の戻り型に関連し、したがって、System.TimeSpanであると推論することができる。最後に、第2のラムダ式のパラメータtに、推論された型System.TimeSpanが与えられ、式t.TotalSecondsは、f2の戻り型に関連し、Zを、System.TimeSpanクラス(図示せず)に基づいて型doubleを有すると推論することが可能になる。したがって、この呼び出しの結果は、型doubleを有する。
【0057】
図5に移ると、ラムダ式の型チェックをサポートする型チェックシステム500が示されている。図4のシステム400に似て、システム500は、コンパイラの一部を形成することができる。型チェックシステム500は、コンテキストコンポーネント410、推論コンポーネント420、ならびに型チェックコンポーネント510を含む。コンテキストコンポーネント410は、例えばラムダ式を含むプログラムから、ラムダ式を入手するか識別し、ラムダ式に関連するコンテキスト情報を取り出す。そのようなコンテキスト情報は、ラムダ式に直接にまたは間接に関連する任意のステートメント、式、クラス、型、および類似物とすることができる。推論コンポーネント420は、コンテキスト情報ならびにチェックされるラムダ式を受け取る。推論コンポーネント420は、コンテキストコンポーネント410によって供給されるコンテキスト情報ならびに推論のセット430内の他の推論を利用して、例えばラムダ式パラメータ、式、その要素、および/または戻り型の型を推論することができる。型を、冗漫さを減らすためにラムダ式から省略することができるが、そのような型を明示的に宣言することもできる。そのようなシナリオでは、型チェックコンポーネント510は、期待される型または推論された型と明示的な型とを比較して、それらが一致するかどうかを判定することができる。より具体的には、型チェックコンポーネント510は、推論された型を推論コンポーネント420から受け取ることができる。さらに、明示的な型を、型チェックコンポーネント510に供給されるか推論された型と共に渡されるラムダ式から入手することができる。型チェックコンポーネント510は、その明示的な型と推論された型とを比較することができる。型が一致する場合には、アクションを行う必要はない。その代わりに、型が一致しない場合には、型コンポーネントは、この事実を示すエラーまたは例外を生成することができる。
【0058】
図6に、オーバーロード解決システム600を示す。システム600には、コンテキストコンポーネント410、推論コンポーネント420、および選択コンポーネント610を含めることができる。例えば引数内のラムダ式が、ある種の情況でオーバーロード解決に影響する可能性がある。コンテキストコンポーネント410は、ラムダ式に関連するコンテキスト情報を受け取り、取り出し、または他の形で入手する。そのようなコンテキスト情報を、推論コンポーネント420に送ることができる。推論コンポーネント420は、コンテキスト情報ならびに1つまたは複数の過去の推論430(推論のセット)を利用して、例えばラムダ式に関連する型を推論することができる。次に、これらの推論された型を、選択コンポーネント610に渡すことができる。選択コンポーネント610は、この情報を使用して、メソッドまたはそのようなメソッドがオーバーロードされる場合にdelegate型を判定するか選択することができる。ラムダ型を、その後、例えば特定のdelegate型に変換することができる。
【0059】
様々なプロシージャまたはプロトコルを選択コンポーネント610によって使用して、オーバーロードされるメソッドまたはdelegate型を選択することができる。例えば、ラムダ式Lを与えられれば、delegate型D1およびdelegate型D2が同一のパラメータリストを有し、Lの戻り型からD1の戻り型への暗黙の変換がLの戻り型からD2の戻り型への暗黙の変換よりよい変換である場合に、D1へのLの暗黙の変換は、D2へのLの暗黙の変換よりよい変換である。これらの条件が真でない場合には、どちらの変換もよりよい変換ではない。もちろん、逆も真である。次の例を検討されたい。
【0060】
【表13】
【0061】
ItemList<T>クラスは、2つのSumメソッドを有する。各メソッドは、selector引数をとり、このselector引数は、合計される値をリストアイテムから抽出する。抽出された値は、integerまたはdoubleのいずれかとすることができ、結果の合計は、同様にintegerまたはdoubleのいずれかである。Sumメソッドを使用して、例えば次のように、注文の詳細行のリストから合計を計算することができる。
【0062】
【表14】
【0063】
orderDetails.Sumの第1の呼び出しでは、両方のSumメソッドが適用可能である。というのは、ラムダ式|d|d.UnitCountが、Function<Detail,int>とFunction<Detail,double>との両方と互換であるからである。しかし、選択コンポーネント610を介するオーバーロード解決は、第1のSumメソッドを選択する。というのは、Function<Detail,int>への変換が、Function<Detail,double>への変換よりよいからである。具体的に言うと、UnitCountは型integerを有する。
【0064】
orderDetails.Sumの第2の呼び出しでは、第2のSumメソッドだけが適用可能である。というのは、ラムダ式|d|d.UnitPrice * d.UnitCountが、型doubleの値を作るからである。したがって、選択コンポーネント610は、その呼び出しについては第2のSumメソッドを選択する。
【0065】
前述のシステムは、複数のコンポーネントの間の相互作用に関して説明された。そのようなシステムおよびコンポーネントに、上で指定されたコンポーネントまたはサブコンポーネント、指定されたコンポーネントまたはサブコンポーネントのうちのいくつか、および/または追加のコンポーネントを含めることができることを了解されたい。例えば、あるシステムに、コンテキストコンポーネント410、推論コンポーネント420、型チェッカコンポーネント510、選択コンポーネント610、またはこれらの組合せを含めることができる。サブコンポーネントを、親コンポーネント内に含まれるのではなく、他のコンポーネントに通信的に結合されたコンポーネントとして実施することもできる。さらに、1つまたは複数のコンポーネントを、集約機能性を提供する単一のコンポーネントに組み合わせ、あるいは複数のサブコンポーネントに分割することができることに留意されたい。これらのコンポーネントは、本明細書で具体的には説明されないが当業者に既知の1つまたは複数の他のコンポーネントと相互作用することもできる。
【0066】
さらに、了解されるとおり、上の開示されたシステムおよび下の方法の様々な部分は、人工知能ベース、知識ベース、またはルールベースのコンポーネント、サブコンポーネント、プロセス、手段、方法、または機構(例えば、サポートベクトルマシン、ニューラルネットワーク、エキスパートシステム、Bayesian belief network、ファジイ論理、data fusion engine、クラシファイヤ...)を含むかこれらからなるものとすることができる。そのようなコンポーネントは、なかんずく、それによって実行されるある種の機構またはプロセスを自動化して、このシステムおよび方法の諸部分をより適応式であると同時に効率的かつインテリジェントにすることができる。例えば、推論コンポーネント420は、人工知能、機械学習、または類似する機構を利用して、型の推論を容易にすることができる。それに加えてまたはその代わりに、選択コンポーネント610が、そのようなインテリジェント機構を使用して、オーバーロード解決を容易にすることができる。
【0067】
上で説明した例示的システムに鑑みて、開示される主題に従って実施できる方法は、図7〜12の流れ図を参照してよりよく理解される。説明を単純にするために、これらの方法は、一連のブロックとして図示され、説明されるが、一部のブロックが、図示され本明細書で説明される順序と異なる順序でおよび/または他のブロックと同時に発生し得るので、請求される主題が、ブロックの順序によって限定されないことを理解し、了解されたい。さらに、図示されたブロックの一部が、下で説明する方法の実施に必要でない場合がある。
【0068】
さらに、下および本明細書全体を通じて開示される方法が、そのような方法をコンピュータにトランスポートし、転送するのを容易にするために製造品に格納されることができることをさらに了解されたい。本明細書で使用される用語製造品は、任意のコンピュータ可読デバイス、搬送波、または媒体からアクセス可能なコンピュータプログラムを含むことが意図されている。
【0069】
図7に移ると、ラムダ式実行の方法700が示されている。符号710で、ラムダ式を受け取り、取り出し、または識別する。ラムダ式は、0個以上のパラメータと、式または式本体とを含むことができる。パラメータは、複数の形で式から区切ることができる。例えば、ラムダ式パラメータを、2つの垂直バーもしくは括弧の中に含めることができ、あるいは、二重矢印または類似物を利用して式本体から分離することができる。例えば、ラムダ式は、「|x|x+1」、「(x,y)x+1」、または「x=>x+1」という形をとることができる。さらに、パラメータなしのラムダ式を、例えば条件or「‖」と明瞭に区別するために「‖=」を利用することによって、異なる形で指定することができる。720で、ラムダ式の値を計算し、または評価する。そのような値は、integer、Boolean、およびstringを含むがこれらに限定されない任意の型を有するものとすることができる。730で、計算された値を返す。例えば、ラムダ式が引数として指定される場合に、計算された値を、呼出し側のステートメントまたはメソッドに返すことができる。その代わりに、ラムダ式がデリゲートなどの関数に割り当てられる場合に、計算された値をその関数に返すことができる。
【0070】
図8に、ラムダ式に関連するプログラミング方法800の流れ図を示す。符号810で、ラムダ式を指定する。例えば、ラムダ式は、コードエディタおよび/または統合開発環境を用いて、手動で、自動的に、または半自動的に指定することができる。ラムダ式には、上で説明したように0個以上のパラメータならびに式または式本体を含めることができる。ラムダ式は、式からパラメータを区切るのに1つまたは複数のシンボルを利用する任意の複数の形で指定することができる。例えば、ラムダ式を「|c|c.age」、「c=>c.age」、または「(c)c.age」と表すことができる。さらに、ラムダ式を、とりわけ、コンピュータ実行可能プログラム内で引数としてまたは関数に割り当てられるものとして指定することができる。符号820で、ラムダ式を含むプログラムをコンパイルのためにコンパイラに供給する。ソースコードから、コンパイラは、機械実行可能コードまたは例えばジャストインタイム(JIT)コンパイラによってランタイムにさらにコンパイルできるある中間コードを作ることができる。830で、コンパイラによって生成されたコードを、コンピュータによって実行する。
【0071】
図9に、ラムダ式変換の方法900を示す。匿名メソッド表現に似て、ラムダ式は、特殊な変換ルールを伴う値として分類することができる。値は、型を有しないが、delegate型などの他の互換の型に変換することができる。符号910で、ラムダ式を受け取り、取り出し、または他の形で入手しあるいは識別する。受け取られたラムダ式は、この例では、特定の型に割り当てられる。例えば、
【0072】
【表15】
【0073】
ここで、このラムダ式は、delegate型関数に割り当てられる。920で、ラムダ式が、それが割り当てられる型と互換またはその型に変換可能であるかどうかに関する判定を行う。割り当てられる型に基づいて、検証される必要がある複数の条件が存在し得る。例えば、あるdelegate型Dがラムダ式Lと互換であるかどうかを判定するためには、次の条件すなわち、(1)Dが、非voidの戻り型を有し、refパラメータまたはoutパラメータを有しないこと、(2)DおよびLが、同一個数のパラメータを有し、Lが明示的に型付けされたパラメータリストを有する場合には、Dの各パラメータの型が、Lの対応するパラメータの型と同一でなければならないこと、および(3)各パラメータLが、Dの対応するパラメータの型を与えられるときには、Lの式本体が、Dの戻り型に暗黙のうちに変換可能な有効な式であることを検証することができる。互換性条件が、920で満足されない場合には、930で、ラムダ式を非互換の型に変換する試みを示すエラーまたは例外を生成する。条件が920で満足される場合には、変換が許可され、940で、ラムダ式を変換する。上の例では、ラムダ式は、delegate型Func<int,int>に成功して変換される。というのは、xが、型intを与えられ、x+1が、型intに暗黙のうちに変換可能な有効な式であるからである。この割当は、匿名メソッドを使用する次のより冗漫な形式と同等である。
【0074】
【表16】
【0075】
図10は、ラムダ式に関する型推論方法1000である。符号1010で、プログラム内のラムダ式を識別する。1020で、ラムダ式に直接にまたは間接に関連するコンテキスト情報を入手する。そのようなコンテキスト情報に、とりわけ、クラス、オブジェクト、関数、メソッド、および型を含めることができる。例えば、ラムダ式が関数に割り当てられる場合には、その関数がコンテキスト情報を提供する。ラムダ式がメソッド引数である場合には、そのメソッドがコンテキスト情報を提供する。符号1030で、ラムダ式に関連する型を推論する。例えば、ラムダ式パラメータを、得られたコンテキスト情報に基づいて推論することができる。ラムダ式本体要素および/または戻り型は、以前の推論およびコンテキスト情報に基づいて判定することができる。例えば、ジェネリックメソッドに引数として渡されるラムダ式を検討されたい。型推論を、まず、各引数と独立に行うことができる。この初期フェーズでは、ラムダ式である引数からは何も推論されない。しかし、初期フェーズの後に、追加の推論を、反復プロセスを使用してラムダ式から行うことができる。具体的に言うと、メソッドの戻り型と共に、初期フェーズからのコンテキスト情報を利用して、型推論を容易にすることができる。そのようなプロセスは、さらなる推論を行えなくなるまで繰り返すことができる。
【0076】
図11に、ラムダ式が型推論プロセスにどのように加わることができるかをさらに了解するために、例示的な型推論方法1100を示す。方法1100は、メソッド引数としてのラムダ式の使用に関する。方法1100を変更して、ラムダ式割当およびラムダ式の他の使用を扱うこともできることを了解されたい。符号1110で、メソッドおよび必要な場合に非ラムダ式引数について型を推論する。1120で、ラムダ式をメソッド引数として識別する。その後、1130で、パラメータ型および式要素型などのラムダ式型を推論する。この推論は、例えば関連するメソッド、呼出し側メソッド、および/またはそのメソッドの他の引数に関連するものを含む、推論の現在のセットに基づくものとすることができる。1140で、チェックを行って、メソッドパラメータ戻り型が、ラムダ式の戻り型と同一であるかどうかを判定する。そうでない場合には、誤ったコード指定または推論があった可能性が高い。したがって、1150でエラーを生成することができ、この方法は終了する。戻り型が同一である場合には、この方法は、1160に進行することができ、1160では、それからの推論がまだ行われていないラムダ式がまだあるかどうかに関する判定を行う。まだある場合には、それらのラムダ式を1120で識別し、この方法は、そこから進行する。ラムダ式がもうない場合には、この方法は終了する。
【0077】
例として、次のコードスニッペット内の次のSelectエクステンションメソッドを検討されたい。
【0078】
【表17】
【0079】
このSelectメソッドを使用して、次のコードを介してカスタマのリストを選択することができる。
【0080】
【表18】
【0081】
Selectのこのエクステンションメソッド呼び出しは、この呼び出しを次などの静的メソッド呼び出しに書き直す(例えば、コンパイラによって)ことによって処理することができる。
【0082】
【表19】
【0083】
上のコードスニッペットの型引数は、明示的に指定されていないので、これらを推論することができる。非ラムダ式引数「customers」があるので、この型をまず推論することができる。ここで、「customers」は、sourceパラメータに関連し、型Tを有する。この特定の呼び出しから、Tを、型Customerを有すると推論することができる。ラムダ式パラメータcおよび式本体c.Nameは、Selectメソッドのselectorパラメータに関連する。ラムダ式パラメータcは、型Tに対応し、これは、既に型Customerを有することが推論されており、したがって、cは型Customerを有する。式本体c.Nameは、パラメータSに対応し、これは、型stringを有すると推論することができる。Customer型から、クラスc.Nameがstringなどの特定の型を有することを見つけることができる。したがって、ラムダ式本体とメソッドパラメータ戻り型との両方が、型stringを有する。したがって、型推論が、成功して完了している。この呼び出しは、次の明示的に型指定されたメソッド呼び出しと同等である。
【0084】
【表20】
【0085】
この例は、型情報をどのように判定できるか、および型情報が呼出し側メソッドならびにその非ラムダ式引数からラムダ式にどのように流れるかを示すものである。
【0086】
図12に移ると、オーバーロード解決の方法1200を示す流れ図が示されている。より具体的には、方法1200は、例えば、オーバーロードされるメソッドの解決にラムダ式をどのように用いることができるかを示す。符号1210で、ラムダ式を、例えばメソッド引数として識別する。1220で、例えば推論のセットに基づく推論によって、ラムダ式の戻り型を判定する。最後に、1230で、ラムダ式の戻り型に基づいて、特定のオーバーロードされるメソッドを選択する。例えば、次のように異なる結果を返す2つのSum関数を含むクラスを検討されたい。
【0087】
【表21】
【0088】
ここでは、Sumがオーバーロードされる。ここで、次のコードが指定されると仮定する。
【0089】
【表22】
【0090】
どのSumを呼び出すかを決定し、オーバーロードを解決するためには、ラムダ式の戻り型を判定しなければならない。ここで、psが、型List<Product>を有することが示されている。これから、pが型Productを有すると推論することができる。次に、Productのクラス定義に基づいて、p.Priceの型を判定することができる。この例について、この定義から、p.Priceが型doubleを有することが明らかになると仮定する。ここで、指定されたコードが、Productをとり、doubleを返すことがわかる。したがって、このコードは、型Func<Product,double>を有する。この知識から、第2のSumを選択することができる。Productクラス定義から、p.Priceが型integerを有することが明らかにされる場合には、このコードは、型Func<Product,int>を有する。このシナリオでは、型integerはdoubleに変換可能であるが、第1のSum関数がよりよい一致なので、第1のSum関数が選択されるはずである。この例から了解されるとおり、ラムダ式戻り型に基づいて、正しいメソッドまたは関数を選択することができるので、関数のうちの一方をまず選択する必要はない(例えば、構造的型指定を用いて行われるように)。
【0091】
図13は、実装コード(例えば、実行可能ファイル、中間言語...)を作るのに利用できるコンパイラ環境1300を示す概略ブロック図である。コンパイラ環境1300は、コンパイラ220を含み、コンパイラ220は、フロントエンドコンポーネント1320、コンバータコンポーネント1330、バックエンドコンポーネント1340、エラーチェッカコンポーネント1350、シンボルテーブル1360、解析ツリー1370、および状態1380を含む。コンパイラ220は、入力としてソースコードを受け入れ、出力として実装コードを作る。入力には、本明細書で説明する区切られたプログラム式または修飾された識別子を含めることができるが、これらに限定はされない。このコンパイラ環境のコンポーネントおよびモジュールの間の関係は、データのメインフローを示す。他のコンポーネントおよび関係は、図を明瞭にし、単純にするために図示されていない。実施態様に応じて、コンポーネントを追加し、省略し、複数のモジュールに分割し、他のモジュールと組み合わせ、かつ/またはモジュールの他の構成とすることができる。
【0092】
コンパイラ220は、要素のシーケンスの処理に関連するソースコードを有するファイルを入力として受け入れる。ソースコードには、ラムダ式ならびに関連する関数、メソッド、および/または他のプログラムコンストラクトを含めることができる。コンパイラ220は、コンストラクトを分析し、コードを生成するか注入するために、1つまたは複数のコンポーネントと共にソースコードを処理することができる。
【0093】
フロントエンドコンポーネント1320は、ソースコードを読み取り、ソースコードに対する字句解析を実行する。本質的に、フロントエンドコンポーネント1320は、ソースコード内の文字(例えば英数字)のシーケンスを読み取り、これらを、とりわけ定数、識別子、演算子シンボル、キーワード、および句読点を示す構文要素またはトークンに変換する。
【0094】
コンバータコンポーネント1330は、トークンを中間表現に解析する。例えば、コンバータコンポーネント1330は、構文をチェックし、トークンを式または他の構文構造にグループ化し、この式または他の構文構造は、ステートメントツリーに合体される。概念的に、これらのツリーは、解析ツリー1370を形成する。さらに、適当に、コンバータコンポーネント1330は、エントリをシンボルテーブル1360に置くことができ、このシンボルテーブルは、関連する特性と共に、ソースコード内で使用されるシンボル名および型情報をリストする。
【0095】
状態1380を使用して、受け取られたまたは取り出されたソースコードの処理および解析ツリー1370の形成におけるコンパイラ220の進行を追跡することができる。例えば、異なる状態値は、コンパイラ220が、クラス定義または関数の始めに位置する、クラスメンバを宣言し終えたばかりである、あるいは1つの式を完了したことを示す。コンパイラが進行する時に、コンパイラは、状態1380を継続的に更新する。コンパイラ220は、状態1380を外部エンティティに部分的にまたは完全に公開することができ、この外部エンティティは、コンパイラ220に入力を供給することができる。
【0096】
ソースコード内のコンストラクトまたは他のシグナルに基づいて(または、他の形で機会が認識される場合に)、コンバータコンポーネント1330または別のコンポーネントは、効率的で正しい実行を容易にするために、対応するコードを注入することができる。コンバータコンポーネント1330または他のコンポーネントにコーディングされたルールは、所望の機能性を実施するために行わなければならないことを示し、コードを注入すべき位置または他の動作を実行しなければならない位置を識別する。注入されるコードは、通常、1つまたは複数の位置に追加されるステートメント、メタデータ、または他の要素を含むが、このことばは、既存ソースコードの変更、削除、または他の形での修正をも含むことができる。注入されるコードは、1つまたは複数のテンプレートとして、またはある他の形で格納することができる。さらに、シンボルテーブル操作および解析ツリー変換を行うことができることを了解されたい。
【0097】
シンボルテーブル1360および解析ツリー1370に基づいて、バックエンドコンポーネント1340は、中間表現を出力コードに変換することができる。バックエンドコンポーネント1340は、中間表現を、ターゲットプロセッサ内でまたはこれによって実行可能な命令、変数のメモリ割当などに変換する。出力コードは、実プロセッサによって実行可能とすることができるが、本発明は、仮想プロセッサによって実行可能な出力コードをも企図している。
【0098】
さらに、フロントエンドコンポーネント1320およびバックエンドコンポーネント1340は、コード最適化など、追加の機能を実行することができ、説明される動作を単一のフェーズまたは複数のフェーズとして実行することができる。コンパイラ220のコンポーネントの様々な他の態様は、性質において普通であり、同等の機能を実行するコンポーネントに置換することができる。さらに、ソースコードの処理中の様々なステージで、エラーチェッカコンポーネント1350は、語彙構造のエラー、構文エラー、およびセマンティックエラーなどのエラーについてチェックすることができる。エラーの検出時に、チェッカコンポーネント1350は、コンパイルを停止し、エラーを示すメッセージを生成することができる。
【0099】
開示される主題の様々な態様のコンテキストを提供するために、図14および15ならびに次の議論は、開示される主題の様々な態様を実施できる適切な環境の短い全般的な説明を提供することを意図されたものである。この主題を、1つのコンピュータおよび/または複数のコンピュータで動作するコンピュータプログラムのコンピュータ実行可能命令の全般的な文脈で上で説明したが、当業者は、本発明を他のプログラムモジュールと組み合わせて実施することもできることを認めるであろう。一般に、プログラムモジュールは、特定のタスクを実行し、かつ/または特定の抽象データ型を実装するルーチン、プログラム、コンポーネント、データ構造などを含む。さらに、当業者は、本発明の方法を、シングルプロセッサコンピュータシステムまたはマルチプロセッサコンピュータシステム、ミニコンピューティングデバイス、メインフレームコンピュータ、ならびにパーソナルコンピュータ、ハンドヘルドコンピューティングデバイス(例えば、携帯情報端末(PDA)、電話機、腕時計...)、マイクロプロセッサベースのまたはプログラマブルなコンシューマエレクトロニクスまたは産業用エレクトロニクス、および類似物を含む、他のコンピュータシステム構成を用いて実践できることを了解するであろう。示された態様は、通信ネットワークを介してリンクされたリモート処理デバイスによってタスクが実行される分散コンピューティング環境でも実践することができる。しかし、本発明の態様の、すべてではないにせよ一部を、独立型コンピュータで実践することができる。分散コンピューティング環境では、プログラムモジュールを、ローカルとリモートとの両方のメモリストレージデバイスに置くことができる。
【0100】
図14を参照すると、本明細書で開示される様々な態様を実施する例示的環境1410に、コンピュータ1412(例えば、デスクトップ機、ラップトップ機、サーバ、ハンドヘルド機、プログラマブルなコンシューマエレクトロニクスまたは産業用エレクトロニクス...)が含まれる。コンピュータ1412は、処理ユニット1414、システムメモリ1416、およびシステムバス1418を含む。システムバス1418は、システムメモリ1416を含むがこれに限定されないシステムコンポーネントを処理ユニット1414に結合する。処理ユニット1414は、様々な使用可能なマイクロプロセッサのいずれかとすることができる。デュアルマイクロプロセッサおよび他のマルチプロセッサアーキテクチャも、処理ユニット1414として使用することができる。
【0101】
システムバス1418は、メモリバスもしくはメモリコントローラ、周辺バスもしくは外部バス、ならびに/または11ビットバス、Industrial Standard Architecture(ISA)、マイクロチャネルアーキテクチャ(MCA)、Extended ISA(EISA)、Intelligent Drive Electronics(IDE)、VESA Local Bus(VLB)、Peripheral Component Interconnect(PCI)、Universal Serial Bus(USB)、Advanced Graphics Port(AGP)、Personal Computer Memory Card International Associationバス(PCMCIA)、およびSmall Computer Systems Interface(SCSI)を含むがこれに限定されない様々な使用可能なバスアーキテクチャのいずれかを使用するローカルバスを含む複数のタイプのバス構造のいずれかとすることができる。
【0102】
システムメモリ1416は、揮発性メモリ1420および不揮発性メモリ1422を含む。スタートアップ中などにコンピュータ1412内の要素の間で情報を転送する基本ルーチンを含む基本入出力システム(BIOS)が、不揮発性メモリ1422に格納される。限定ではなく例として、不揮発性メモリ1422は、読取専用メモリ(ROM)、プログラマブルROM(PROM)、電気的プログラム可能ROM(EPROM)、電気的消去可能ROM(EEPROM)、またはフラッシュメモリを含むことができる。揮発性メモリ1420は、外部キャッシュメモリとして働くランダムアクセスメモリ(RAM)を含む。限定ではなく例として、RAMは、シンクロナスRAM(SRAM)、ダイナミックRAM(DRAM)、シンクロナスDRAM(SDRAM)、ダブルデータレートSDRAM(DDR SDRAM)、エンハンストSDRAM(ESDRAM)、Synchlink DRAM(SLDRAM)、およびdirect Rambus RAM(DRRAM)などの多数の形で入手可能である。
【0103】
コンピュータ1412は、リムーバブル/ノンリムーバブルの揮発性/不揮発性コンピュータ記憶媒体をも含む。図14に、例えば、ディスクストレージ1424を示す。ディスクストレージ1424は、磁気ディスクドライブ、フロッピー(登録商標)ディスクドライブ、テープドライブ、Jazドライブ、Zipドライブ、LS−100ドライブ、フラッシュメモリカード、またはメモリスティックなどのデバイスを含むが、これらに限定はされない。さらに、ディスクストレージ1424に、コンパクトディスクROMデバイス(CD−ROM)、CD recordableドライブ(CD−Rドライブ)、CD rewritableドライブ(CD−RWドライブ)、またはデジタル多用途ディスクROMドライブ(DVD−ROM)などの光学ディスクドライブを含むがこれに限定されない記憶媒体を、他の記憶媒体と別々にまたはこれらと組み合わせて含めることができる。システムバス1418へのディスクストレージデバイス1424の接続を容易にするために、インターフェース1426などのリムーバブルまたはノンリムーバブルのインターフェースが、通常は使用される。
【0104】
図14に、ユーザと、適切なオペレーティング環境1410で説明した基本的なコンピュータリソースとの間の媒介として働くソフトウェアが記載されていることを了解されたい。そのようなソフトウェアに、オペレーティングシステム1428が含まれる。オペレーティングシステム1428は、ディスクストレージ1424に格納することができるが、コンピュータシステム1412を制御し、そのリソースを割り当てるように働く。システムアプリケーション1430は、プログラムモジュール1432を介するオペレーティングシステム1428によるリソースの管理およびシステムメモリ1416内またはディスクストレージ1424上のいずれかに格納されたプログラムデータ1434を利用する。本発明を、様々なオペレーティングシステムまたはオペレーティングシステムの組合せを用いて実施できることを了解されたい。
【0105】
ユーザは、入力デバイス1436を介してコンピュータ1412にコマンドまたは情報を入力する。入力デバイス1436は、マウスなどのポインティングデバイス、トラックボール、スタイラス、タッチパッド、キーボード、マイクロホン、ジョイスティック、ゲームパッド、衛星パラボラアンテナ、スキャナ、TVチューナカード、デジタルカメラ、デジタルビデオカメラ、ウェブカメラ、および類似物を含むが、これらに限定はされない。これらおよび他の入力デバイスは、インターフェースポート1438を介し、システムバス1418を介して処理ユニット1414に接続される。インターフェースポート1438は、例えば、シリアルポート、パラレルポート、ゲームポート、およびuniversal serial bus(USB)を含む。出力デバイス1440は、入力デバイス1436と同一タイプのポートのいくつかを使用する。したがって、例えば、USBポートを使用して、コンピュータ1412に入力を提供し、コンピュータ1412から出力デバイス1440に情報を出力することができる。出力アダプタ1442が、ディスプレイ(例えば、フラットパネルおよびCRT)、スピーカ、およびプリンタなど、出力デバイス1440の中でも特殊なアダプタを必要とするいくつかの出力デバイス1440があることを示すために提供される。出力アダプタ1442には、限定ではなく例として、出力デバイス1440とシステムバス1418との間の接続の手段を提供する、ビデオカードおよびサウンドカードが含まれる。リモートコンピュータ1444など、他のデバイスおよび/またはデバイスのシステムが、入力機能と出力機能との両方を提供することに留意されたい。
【0106】
コンピュータ1412は、リモートコンピュータ1444などの1つまたは複数のリモートコンピュータへの論理接続を使用して、ネットワーク化された環境で動作することができる。リモートコンピュータ1444は、パーソナルコンピュータ、サーバ、ルータ、ネットワークPC、ワークステーション、マイクロプロセッサベースの機器、ピアデバイス、または他の一般的なネットワークノードおよび類似物とすることができ、リモートコンピュータ1444は、通常は、コンピュータ1412に関して説明した要素の多数またはすべてを含む。図を簡単にするために、メモリストレージデバイス1446だけが、リモートコンピュータ1444と共に図示されている。リモートコンピュータ1444は、論理的にネットワークインターフェース1448を介してコンピュータ1412に接続され、次に、物理的に通信接続1450を介して接続される。ネットワークインターフェース1448は、ローカルエリアネットワーク(LAN)および広域ネットワーク(WAN)などの通信ネットワークを含む。LANテクノロジは、Fiber Distributed Data Interface(FDDI)、Copper Distributed Data Interface(CDDI)、イーサネット(登録商標)/IEEE802.3、トークンリング/IEEE 802.5、および類似物を含む。WANテクノロジは、ポイントツーポイントリンク、サービス総合デジタル網(ISDN)およびその変形形態などの回路交換網、パケット交換網、およびデジタル加入者回線(DSL)を含むが、これに限定はされない。
【0107】
通信接続1450は、ネットワークインターフェース1448をバス1418に接続するのに使用されるハードウェア/ソフトウェアを指す。通信接続1450は、図を明瞭にするためにコンピュータ1412の内部に図示されているが、コンピュータ1412の外部とすることもできる。ネットワークインターフェース1448への接続に必要なハードウェア/ソフトウェアは、例示のみとして、通常の電話等級モデム、ケーブルモデム、電力線モデム、およびDSLモデムを含むモデム、ISDNアダプタ、ならびにイーサネット(登録商標)カードまたはイーサネット(登録商標)コンポーネントなどの、内蔵テクノロジおよび外付けテクノロジを含む。
【0108】
図15は、本発明が相互作用できるサンプルのコンピューティング環境1500の概略ブロック図である。システム1500は、1つまたは複数のクライアント1510を含む。クライアント1510は、ハードウェアおよび/またはソフトウェア(例えば、スレッド、プロセス、コンピューティングデバイス)とすることができる。システム1500は、1つまたは複数のサーバ1530をも含む。したがって、システム1500は、他のモデルの中でも、2ティアクライアントサーバモデルまたはマルチティアモデル(例えば、クライアント、ミドルティアサーバ、データサーバ)に対応することができる。サーバ1530も、ハードウェアおよび/またはソフトウェア(例えば、スレッド、プロセス、コンピューティングデバイス)とすることができる。サーバ1530は、例えば、本発明を使用することによって、変換を実行するスレッドを収容することができる。クライアント1510とサーバ1530との間の可能な通信の1つを、複数のコンピュータプロセスの間で伝送されるように適合されたデータパケットの形とすることができる。システム1500は、クライアント1510とサーバ1530との間の通信を容易にするのに使用することができる通信フレームワーク1550を含む。クライアント1510は、クライアント1510にローカルな情報を格納するのに使用できる1つまたは複数のクライアントデータストア1560に動作可能に接続される。同様に、サーバ1530は、サーバ1530にローカルな情報を格納するのに使用することができる1つまたは複数のサーバデータストア1540に動作可能に接続される。
【0109】
上で説明したものは、請求される主題の諸態様の例を含む。もちろん、請求される主題の説明においてコンポーネントまたは方法のすべての考えられる組合せを説明することは不可能であるが、当業者は、開示された主題の多数のさらなる組合せおよび置換が可能であることを認めるであろう。したがって、開示された主題は、添付の特許請求の範囲の趣旨および範囲に含まれるすべてのそのような代替形態、修正形態、および変形形態を含むことが意図されている。さらに、用語「含む(includes)」、「有する(has)」、または「有する(having)」が詳細な説明または特許請求の範囲のいずれかで使用される範囲で、これらの用語は、用語「含む(comprising)」が特許請求の範囲で前後を接続する単語として使用される時に「含む(comprising)」が解釈される形に類似する形で包含的であることを意図されている。
【図面の簡単な説明】
【0110】
【図1】ラムダ式の実行システムを示すブロック図である。
【図2】ラムダ式をサポートするプログラミングシステムを示すブロック図である。
【図3】型変換システムを示すブロック図である。
【図4】ラムダ式に関連する型を推論する型推論システムを示すブロック図である。
【図5】ラムダ式を型チェックする型チェックシステムを示すブロック図である。
【図6】オーバーロード解決システムを示すブロック図である。
【図7】ラムダ式実行方法を示す流れ図である。
【図8】プログラミング方法を示す流れ図である。
【図9】ラムダ式変換方法を示す流れ図である。
【図10】ラムダ式に関連する型推論方法を示す流れ図である。
【図11】例示的な型推論方法を示す流れ図である。
【図12】オーバーロード解決方法を示す流れ図である。
【図13】コンパイル環境を示す概略ブロック図である。
【図14】適切なオペレーティング環境を示す概略ブロック図である。
【図15】サンプルのコンピューティング環境を示す概略ブロック図である。
【技術分野】
【0001】
本発明は、ラムダ式と、命令型のおよび/またはオブジェクト指向のコンピュータプログラミング言語でのそのような式の使用とに関する。
【背景技術】
【0002】
プログラミング言語は、プログラマによる指定ならびに効率的実行を容易にするために進歩し続ける。コンピュータ言語の初期には、低水準マシンコードが優勢であった。マシンコードを用いる場合に、コンピュータプログラムまたはコンピュータプログラムを構成する命令は、機械語またはアセンブリ言語で記述され、ハードウェア(例えば、マイクロプロセッサ)によって実行された。これらの言語は、コンピューティングハードウェアを制御する効率的な手段をもたらしたが、プログラマが洗練されたロジックを理解し、開発するのは非常に難しかった。その後、抽象化の様々なレイヤを提供する言語が導入された。したがって、プログラマは、より高水準のソース言語を用いてより高いレベルでプログラムを記述することができ、このより高水準のソース言語は、その後、コンパイラまたはインタープリタを介して、ハードウェアによって理解される、より低水準の機械語に変換することができた。プログラミングにおけるさらなる進歩は、より高度なプログラミングロジックを以前よりはるかにすばやく指定できるようにする、抽象化の追加のレイヤをもたらした。しかし、これらの進歩は、処理コストなしでは得られない。
【0003】
コンパイラおよび/またはインタープリタは、高水準ロジックを実行可能マシンコードに変換するという重荷を背負う。一般に、コンパイラおよび/またはインタープリタは、ソースプログラミング言語(例えば、C、C#、Visual Basic、Java(登録商標)...)で指定されたプログラムを受け取り、これによって与えられるロジックをハードウェアデバイスによって実行可能な機械語に変換するコンポーネントである。しかし、この変換が逐語的に行われる必要はない。実際に、従来のコンパイラおよび/またはインタープリタは、ソースコードを分析し、非常に効率的なコードを生成する。例えば、プログラマは、人間が理解するには直観的で簡単であるが、しばしばコンピュータが実行するには非効率である、動作の論理フローを示すコードを記述する。コンパイラおよび/またはインタープリタは、非効率性を識別でき、所期の結果を達成しながら、不必要な動作を除去することおよび/または命令の実行を再配置することによって、ハードウェアレベルでプログラム性能を改善することができる。この形で、プログラマは、堅牢で効率的なソフトウェアプログラムを作成することができる。
【発明の開示】
【発明が解決しようとする課題】
【0004】
ラムダ式は、従来の形よりも簡潔な、値またはデータを指定する形を提供する。ラムダ式は、型推論に加わることもできる。さらに、ラムダ式は、オーバーロード解決を容易にすることができる。
【課題を解決するための手段】
【0005】
以下に、請求される主題のいくつかの態様の基本的理解をもたらすために、単純化された要約を提示する。この要約は、広範囲の概要ではない。主要な/クリティカルな要素を識別すること、または請求される主題の範囲を区切ることは、意図されていない。この要約の唯一の目的は、後で提示されるより詳細な説明の前置きとして、単純化された形でいくつかの概念を提示することである。
【0006】
短く説明すると、提供される主題は、ラムダ式と、命令型のおよび/またはオブジェクト指向のコンピュータプログラミング言語でのそのような式の使用とに関する。ラムダ式は、従来の形よりも簡潔な、値またはデータを指定する形を提供する。例えば、ラムダ式は、匿名メソッドを指定する、より簡潔で機能的な形を提供することができる。
【0007】
ラムダ式は、型推論に加わることもできる。ラムダ式自体は、型を有する必要がない。そうではなく、ラムダ式は、とりわけ、パラメータ型および戻り型を有することができる。ラムダ式の指定に関連する冗漫さを減らすために、これらの型を明示的に述べる必要はない。コンテキストに基づいてこれらの型を推論するシステムおよび方法を提供する。
【0008】
さらに、ラムダ式は、オーバーロード解決を容易にすることができる。例えば、メソッドがオーバーロードされる場合に、ラムダ式は、特定のメソッドの選択を容易にすることができる。例えば、ラムダ式が、オーバーロードされるメソッドへの引数として使用される場合に、その式の戻り型を、特定のメソッドを選択する際の要因として利用することができる。
【0009】
前述の目的および関連する目的の達成に向かって、請求される主題のある種の例示的態様を、以下の説明および添付図面に関して本明細書で説明する。これらの態様は、この主題を実践できる様々な形を示し、そのすべてが請求される主題の範囲に含まれることが意図されている。他の利益および新規の特徴は、図面と共に考慮される場合に、以下の詳細な説明から明白になる可能性がある。
【発明を実施するための最良の形態】
【0010】
本発明の様々な態様を、添付図面を参照して説明するが、添付図面では、類似する符号が、複数の図面を通じて類似するまたは対応する要素を指す。しかし、図面およびそれに関連する詳細な説明が、請求される主題を特定の開示される形態に限定することは、意図されていないことを理解されたい。そうではなく、その意図は、請求される主題の趣旨および範囲に含まれるすべての修正形態、同等物、および代替形態を含むことである。
【0011】
本明細書で使用される用語「コンポーネント」、「システム」、および類似物は、ハードウェア、ハードウェアおよびソフトウェアの組合せ、ソフトウェア、または実行中のソフトウェアのいずれであれ、コンピュータ関連エンティティを指すことが意図されている。例えば、コンポーネントは、プロセッサ上で動作しているプロセス、プロセッサ、オブジェクト、実行可能ファイル、実行のスレッド、プログラム、および/またはコンピュータとすることができるが、これらに限定はされない。限定ではなく例として、コンピュータで動作しているアプリケーションとそのコンピュータとの両方を、コンポーネントとすることができる。1つまたは複数のコンポーネントが、1つのプロセスおよび/または実行のスレッドの中に存在することができ、1つのコンポーネントを、1つのコンピュータに局所化し、かつ/または複数のコンピュータの間で分散させることができる。
【0012】
単語「例示的」は、本明細書では、例、実例、または例示として働くことを意味するのに使用される。本明細書で「例示的」として説明されるすべての態様または設計は、必ずしも、他の態様または設計より好ましいまたは有利とは解釈されない。
【0013】
さらに、開示される主題は、本明細書で詳細に説明される諸態様を実施するためにコンピュータまたはプロセッサベースのデバイスを制御するためにソフトウェア、ファームウェア、ハードウェア、またはその任意の組合せを作るのに標準プログラミングおよび/またはエンジニアリング技法を使用することによってシステム、方法、装置、または製造品として実施することができる。本明細書で使用される用語「製造品」(またはその代わりに「コンピュータプログラム製品」)は、任意のコンピュータ可読デバイス、搬送波、または媒体からアクセス可能なコンピュータプログラムを含むことが意図されている。例えば、コンピュータ可読媒体は、磁気ストレージデバイス(例えば、ハードディスク、フロッピー(登録商標)ディスク、磁気ストリップ...)、光ディスク(例えば、コンパクトディスク(CD)、デジタル多用途ディスク(DVD)...)、スマートカード、およびフラッシュメモリデバイス(例えば、カード、スティック)を含むことができるが、これらに限定はされない。さらに、電子メールの送信および受信またはインターネットもしくはローカルエリアネットワーク(LAN)などのネットワークへのアクセスに使用されるものなどの搬送波を使用して、コンピュータ可読電子データを搬送できることを了解されたい。もちろん、請求される主題の範囲または趣旨から逸脱せずに、この構成に対して多数の変更を行うことができることを、当業者は認めるであろう。
【0014】
まず図1に移ると、ラムダ式(lambda expression)の実行に関する実行システム100が示されている。システム100は、レシーバコンポーネント110および評価コンポーネント120を含む。レシーバコンポーネント110は、ラムダ式を入手し、その式を評価コンポーネント120に送る。評価コンポーネント120は、式を入手し、特定の型の値を計算し、返す。
【0015】
ラムダ式とは、とりわけ、値およびデータを簡潔に指定し、または取り込む機構である。1つの実例で、ラムダ式を使用して、匿名メソッドを指定し、または置換することができる。匿名メソッドは、例えば、デリゲートに関連するプログラムコードを「インラインで」表現し、または記述することを可能にする。例えば、C#でIEnumerable<customer>csと表されるカスタマのコレクションにまたがって照会することが望まれると仮定する。35歳より若いカスタマを返すクエリは、次のように指定することができる。
【0016】
【表1】
【0017】
その代わりに、例えば次のように、匿名メソッドを指定して、そのような式の指定を単純にすることができる。
【0018】
【表2】
【0019】
これは、少なくとも新しいクラスを指定する必要がないので、前の例より簡潔である。新しいクラスを指定するのではなく、delegateキーワードによって識別される匿名メソッドは、引数としてインライン化される。しかし、匿名メソッドの指定は、それでも非常に冗漫である。したがって、ラムダ式を、匿名メソッドの代わりに使用することができる。前のサンプルに従って、ラムダ式を利用して、はるかに簡潔に、機能的に情報を指定することができる。具体的に言うと、このラムダ式は、次に対応するものとすることができる。
【0020】
【表3】
【0021】
ここでは、パラメータ「c」ならびに式「c.age<35」が識別される。これは、少なくとも不必要な構文および明示的な型宣言(例えば、Customer)が除去されるので、前の表現よりはるかに冗漫でない。
【0022】
ラムダ式は、垂直のバーに囲まれたパラメータリストおよびそれに続く式または式本体として指定することができる。例えば、ラムダ式を、次の擬似BNF(バッカス−ナウア記法)で指定されるように構造化することができる。
【0023】
【表1】
【0024】
ラムダ式は、一般形式|パラメータ|式を有することができる。しかし、追加の指定の形も企図されている。例えば、ラムダ式を、形式パラメータ=>式、(パラメータ)=>式、ならびにデリミタおよび/またはシンボルの他の組合せもしくは置換で宣言することができる。構文を、ラムダ式が空のパラメータリストを有する場合に異なるものとすることもできる。垂直のバーが、式からパラメータを区切り、空のパラメータリストがある場合に、結果のトークンは、隣接する2つのバー文字(例えば、‖または||)になるはずである。これは、一部のプログラミング言語で条件「OR」を表すのに利用される隣接するバーに関して曖昧さを生じる可能性がある。したがって、隣接するバーとそれに続く等号文字(例えば、||=)などであるがこれに限定はされない代替の表現を使用することができる。しかし、隣接するバー文字をオーバーロードし、空のパラメータリストならびに条件「OR」を表すのに利用することができることを了解されたい。
【0025】
形式「|パラメータ|式」のラムダ式は、形式「delegate(パラメータ){return 式;}」の匿名メソッドに対応することができる。したがって、ラムダ式は、より冗漫な匿名メソッドを置換することができる。それでも、ラムダ式と匿名メソッドとの間には相違がある。とりわけ、ラムダ式は、パラメータ型を省略し、推論する(下で詳細に説明する)ことを可能にするが、匿名メソッドは、パラメータ型を明示的に述べることを必要とする。さらに、匿名メソッドの本体は、ステートメントブロックとして記述されるが、ラムダ式の本体は、式またはステートメントブロックのいずれかとすることができる。
【0026】
図1に戻ると、レシーバコンポーネント110は、上で説明したラムダ式またはその表現を受け取り、取り出し、または他の形で入手する。次に、そのラムダ式を評価コンポーネント120に送ることができる。評価コンポーネント120は、ラムダ式に関連する値を計算し、その値を返す。限定ではなく例として、システム100を、プログラム実行システムに関連付けることができる。ラムダ式は、プログラムステートメントの一部とすることができ、あるいは、引数および返される値などの他のコンストラクトを、関連するステートメントの処理においてさらに利用することができる。さらに、レシーバコンポーネント110および評価コンポーネント120は、ネストされたおよび/または階層的なラムダ式の評価を可能にするために協力することができる。例えば、
【0027】
【表2】
【0028】
このステートメントは、カスタマの名前および年齢が選択され(「Select(|c|new{name=c.name,age=c.age}))、そのコレクションから、年齢が35歳未満のカスタマ(cs)が識別される(cs.where(|c|c.age<35))ことを表す。
【0029】
図2に、ラムダ式のプログラミングシステムまたはプログラミング環境200を示す。システム200は、開発コンポーネント210、コンパイラコンポーネント220、および実行可能プログラム230を含む。開発コンポーネント210は、プログラマなどのユーザから入力を受け取る。この入力には、少なくとも1つのラムダ式を含む複数のプログラムステートメントまたはコンストラクトを含めることができる。例えば、あるステートメントに、引数としてのラムダ式または関数もしくは型に割り当てられるラムダ式を含めることができる。式は、式本体からパラメータを分離するのに隣接するバー(例えば、|c|c.age<35)または二重矢印(例えば、c=>c.age)を利用することを含むがこれに限定されない複数の形式のうちのいずれか1つで表すことができる。開発コンポーネント210は、コードエディタ(例えば、テキストまたはグラフィカル)、統合開発環境(IDE)、または類似物に対応するものとすることができる。コンパイラコンポーネント220(下でさらに詳細に説明する)は、開発コンポーネント210からプログラムソースコードを受け取り、コンピュータ実行可能プログラム230を生成することができ、あるいはその代わりに、例えばジャストインタイム(JIT)コンパイラによるなど、ランタイムにさらにコンパイルできるある中間フォーマット(例えば、IL(中間言語))を生成することができる。コンパイラコンポーネント220を、IDEの一部とすることもできる。
【0030】
図3に、型変換システム300を示す。ラムダ式は、特殊な変換ルールを有する値として分類することができる。ラムダ式は、型を有しないが、delegate型などの互換の型に(例えば、暗黙のうちに)変換することができる。システム300は、互換性コンポーネント310および変換コンポーネント320を含む。両方のコンポーネントを、図2のコンパイラコンポーネント220などのコンパイラの中に配置することができる。互換性コンポーネント310は、例えばラムダ式およびdelegate型関数からなる、ラムダ式割当を受け取る。その後、互換性コンポーネントは、あるルールまたは条件312に関して割当型を分析して、その割当型がラムダ式と互換であるかどうかを判定することができる。条件312が満足されない場合には、割り当てられる型は互換ではなく、エラーまたは例外を互換性コンポーネント310によって生成することができる。そうではなく、条件312が満足され、型がラムダ式と互換である場合には、式を、変換コンポーネント320によってこの型に変換することができる。
【0031】
限定ではなく例として、delegate型Dは、様々な条件312が満足される時に、ラムダ式Lと互換であるものとすることができる。例えば、Dを、非void戻り型を有しなければならず、refパラメータまたはoutパラメータを有してはならないものとすることができる。それに加えてまたはその代わりに、DおよびLを、同一の個数のパラメータを有しなければならないものとすることができ、Lが明示的に型付けされたパラメータリストを有する場合には、Dの各パラメータの型は、Lの対応するパラメータの型と同一でなければならない。それに加えてまたはその代わりに、Lのパラメータが、Dの対応するパラメータの型を与えられる時に、Lの式本体を、Dの戻り型に暗黙のうちに変換可能な有効な式とすることができる。例えば、型Aの引数をとり、型Rの値を返す関数を表すジェネリックdelegate型Function<A,R>を仮定する。
【0032】
【表3】
【0033】
さらに、次の割当を仮定する。
【0034】
【表4】
【0035】
ラムダ式|x|x+1を、変換コンポーネント320によってdelegate型Func<int,int>に成功して変換することができる。というのは、xが型intを与えられるときに、x+1が、型intに暗黙のうちに変換可能な有効な式であるからである。この割当は、より冗漫な匿名メソッド
【0036】
【表5】
【0037】
と同等である。ラムダ式が、xの型を推論することを許容するが、必要とはしないのに対して、匿名メソッドが、型を明示的に述べることを必要とすることに留意されたい。
【0038】
図4に移ると、ラムダ式に関する推論を可能にする型推論システム400が示されている。型推論システム400は、コンパイラコンポーネント220(図2)などのコンパイラの一部とすることができる。型推論システム400は、コンテキストコンポーネント410および推論コンポーネント420を含む。コンテキストコンポーネント410は、ラムダ式を受け取るか識別した時に、例えば特定のラムダ式がそこから入手されたプログラムから、そのラムダ式に関連するコンテキスト情報を受け取り、取り出し、または他の形で入手する。そのようなコンテキスト情報は、ステートメント、式、クラス、型、および類似物を含む、ラムダ式に関連する任意の情報とすることができる。このコンテキスト情報は、例えばデータパケットの伝送を介して、推論コンポーネント420によってコンテキストコンポーネント410から入手される。さらに、ラムダ式を推論コンポーネント420に供給して、それに関連する型の型推論を容易にすることができる。推論コンポーネント420は、その後、コンテキスト情報を使用して、ラムダ式パラメータ、式本体、および/または戻り型の型などの型を推論することができる。もちろん、型推論を、推論された型が他の要素の型を推論するのを助けるようにするために伝搬させることができる。したがって、推論コンポーネント420は、追加の推論を行うのに使用できる推論のセット430を生成し、維持することができる。
【0039】
ラムダ式自体は、構造的型(structural type)など、それに関連する型を有しないことを了解されたい。そうではなく、パラメータおよび式本体または戻り値が、関連する型を有する。構造的型の推論が、オブジェクト指向言語について非自明であることが認められている。次の例示的なラムダ式およびオブジェクトを定義するクラスを検討されたい。
【0040】
【表6】
【0041】
このラムダ式とカスタマおよびワインというオブジェクトクラスとを単純に分析することによって、パラメータ(x)および戻り式値(x.age)の型を判定することは、できない。パラメータは、型customerを有することができ、これは、ageについて型integerを返す。その代わりに、このパラメータを、ageについて型stringを返す型wineを有するものとすることができる。
【0042】
しかし、型をコンテキストから推論することができる。次の宣言を検討されたい。
【0043】
【表7】
【0044】
AをとりRを返すdelegate型が指定されている。次に、ラムダ式が、デリゲート関数に割り当てられる。そのような追加のコンテキスト情報から、型を推論することができる。関数へのラムダ式の割当に基づいて、推論コンポーネント420は、引数SがCustomerでなければならないと判定することができる。次に、推論コンポーネント420は、パラメータxが型Customerを有すると推論することができる。これから、x.ageを、Customerクラスまたはオブジェクト定義から型integerを有すると判定することができる。その後、型推論を、例えば検証コンポーネント422を介して、戻り型を比較することによって検証することができる。ここで、デリゲート関数Funcは、型Boolean(bool)を返し、ラムダ式は、ageが35未満であるかどうかの判定を介して型Booleanを返す。したがって、推論コンポーネントは、コンテキストに基づいてラムダ式に関連する型を成功して推論することができた。実際には、デリゲート関数へのラムダ式の割当が、コンテキストおよび型情報をラムダ式にプッシュダウンすることを可能にした。
【0045】
ラムダ式を伴う型推論の明瞭さおよび理解を容易にするために、もう1つの例示的シナリオを説明する。C#の次のクラス定義を検討されたい。
【0046】
【表8】
【0047】
System.Query名前空間が、例えばusing節を用いてインポートされたと仮定すると、型stringのNameプロパティを有するクラスCustomerを与えられれば、Selectメソッドを使用して、カスタマのリストから名前を選択することができる。例えば、
【0048】
【表9】
【0049】
Selectのエクステンションメソッド呼び出しを、この呼び出しを静的メソッド呼び出しに書き直すことによって処理することができる。
【0050】
【表10】
【0051】
型推論を利用して、引数の型を推論することができる。コンテキスト情報は、customers引数がsourceパラメータに関連することを明らかにし、したがって、TがCustomerであると推論することができる。その後、cに型Customerを与えることができ、式c.Nameは、selectorパラメータの戻り型に関連し、Sがstringであると推論される。したがって、この呼び出しは、
【0052】
【表11】
【0053】
と同等であり、その結果は、型IEnumerable<string>を有する。
【0054】
次の例では、ラムダ型推論が、どのようにして型情報がジェネリックメソッド呼び出しの引数の間で「流れる」ことを可能にするかを示す。次のメソッドとその呼び出しを仮定する。
【0055】
【表12】
【0056】
この呼び出しに関する型推論は、まず、valueパラメータに関連する引数「1:15:30」から進行する。したがって、Xは、この引数に基づいてstringであると推論することができる。次に、最初のラムダ式のパラメータsに、推論された型stringが与えられる。式TimeSpan.Parse(s)は、f1(Y)の戻り型に関連し、したがって、System.TimeSpanであると推論することができる。最後に、第2のラムダ式のパラメータtに、推論された型System.TimeSpanが与えられ、式t.TotalSecondsは、f2の戻り型に関連し、Zを、System.TimeSpanクラス(図示せず)に基づいて型doubleを有すると推論することが可能になる。したがって、この呼び出しの結果は、型doubleを有する。
【0057】
図5に移ると、ラムダ式の型チェックをサポートする型チェックシステム500が示されている。図4のシステム400に似て、システム500は、コンパイラの一部を形成することができる。型チェックシステム500は、コンテキストコンポーネント410、推論コンポーネント420、ならびに型チェックコンポーネント510を含む。コンテキストコンポーネント410は、例えばラムダ式を含むプログラムから、ラムダ式を入手するか識別し、ラムダ式に関連するコンテキスト情報を取り出す。そのようなコンテキスト情報は、ラムダ式に直接にまたは間接に関連する任意のステートメント、式、クラス、型、および類似物とすることができる。推論コンポーネント420は、コンテキスト情報ならびにチェックされるラムダ式を受け取る。推論コンポーネント420は、コンテキストコンポーネント410によって供給されるコンテキスト情報ならびに推論のセット430内の他の推論を利用して、例えばラムダ式パラメータ、式、その要素、および/または戻り型の型を推論することができる。型を、冗漫さを減らすためにラムダ式から省略することができるが、そのような型を明示的に宣言することもできる。そのようなシナリオでは、型チェックコンポーネント510は、期待される型または推論された型と明示的な型とを比較して、それらが一致するかどうかを判定することができる。より具体的には、型チェックコンポーネント510は、推論された型を推論コンポーネント420から受け取ることができる。さらに、明示的な型を、型チェックコンポーネント510に供給されるか推論された型と共に渡されるラムダ式から入手することができる。型チェックコンポーネント510は、その明示的な型と推論された型とを比較することができる。型が一致する場合には、アクションを行う必要はない。その代わりに、型が一致しない場合には、型コンポーネントは、この事実を示すエラーまたは例外を生成することができる。
【0058】
図6に、オーバーロード解決システム600を示す。システム600には、コンテキストコンポーネント410、推論コンポーネント420、および選択コンポーネント610を含めることができる。例えば引数内のラムダ式が、ある種の情況でオーバーロード解決に影響する可能性がある。コンテキストコンポーネント410は、ラムダ式に関連するコンテキスト情報を受け取り、取り出し、または他の形で入手する。そのようなコンテキスト情報を、推論コンポーネント420に送ることができる。推論コンポーネント420は、コンテキスト情報ならびに1つまたは複数の過去の推論430(推論のセット)を利用して、例えばラムダ式に関連する型を推論することができる。次に、これらの推論された型を、選択コンポーネント610に渡すことができる。選択コンポーネント610は、この情報を使用して、メソッドまたはそのようなメソッドがオーバーロードされる場合にdelegate型を判定するか選択することができる。ラムダ型を、その後、例えば特定のdelegate型に変換することができる。
【0059】
様々なプロシージャまたはプロトコルを選択コンポーネント610によって使用して、オーバーロードされるメソッドまたはdelegate型を選択することができる。例えば、ラムダ式Lを与えられれば、delegate型D1およびdelegate型D2が同一のパラメータリストを有し、Lの戻り型からD1の戻り型への暗黙の変換がLの戻り型からD2の戻り型への暗黙の変換よりよい変換である場合に、D1へのLの暗黙の変換は、D2へのLの暗黙の変換よりよい変換である。これらの条件が真でない場合には、どちらの変換もよりよい変換ではない。もちろん、逆も真である。次の例を検討されたい。
【0060】
【表13】
【0061】
ItemList<T>クラスは、2つのSumメソッドを有する。各メソッドは、selector引数をとり、このselector引数は、合計される値をリストアイテムから抽出する。抽出された値は、integerまたはdoubleのいずれかとすることができ、結果の合計は、同様にintegerまたはdoubleのいずれかである。Sumメソッドを使用して、例えば次のように、注文の詳細行のリストから合計を計算することができる。
【0062】
【表14】
【0063】
orderDetails.Sumの第1の呼び出しでは、両方のSumメソッドが適用可能である。というのは、ラムダ式|d|d.UnitCountが、Function<Detail,int>とFunction<Detail,double>との両方と互換であるからである。しかし、選択コンポーネント610を介するオーバーロード解決は、第1のSumメソッドを選択する。というのは、Function<Detail,int>への変換が、Function<Detail,double>への変換よりよいからである。具体的に言うと、UnitCountは型integerを有する。
【0064】
orderDetails.Sumの第2の呼び出しでは、第2のSumメソッドだけが適用可能である。というのは、ラムダ式|d|d.UnitPrice * d.UnitCountが、型doubleの値を作るからである。したがって、選択コンポーネント610は、その呼び出しについては第2のSumメソッドを選択する。
【0065】
前述のシステムは、複数のコンポーネントの間の相互作用に関して説明された。そのようなシステムおよびコンポーネントに、上で指定されたコンポーネントまたはサブコンポーネント、指定されたコンポーネントまたはサブコンポーネントのうちのいくつか、および/または追加のコンポーネントを含めることができることを了解されたい。例えば、あるシステムに、コンテキストコンポーネント410、推論コンポーネント420、型チェッカコンポーネント510、選択コンポーネント610、またはこれらの組合せを含めることができる。サブコンポーネントを、親コンポーネント内に含まれるのではなく、他のコンポーネントに通信的に結合されたコンポーネントとして実施することもできる。さらに、1つまたは複数のコンポーネントを、集約機能性を提供する単一のコンポーネントに組み合わせ、あるいは複数のサブコンポーネントに分割することができることに留意されたい。これらのコンポーネントは、本明細書で具体的には説明されないが当業者に既知の1つまたは複数の他のコンポーネントと相互作用することもできる。
【0066】
さらに、了解されるとおり、上の開示されたシステムおよび下の方法の様々な部分は、人工知能ベース、知識ベース、またはルールベースのコンポーネント、サブコンポーネント、プロセス、手段、方法、または機構(例えば、サポートベクトルマシン、ニューラルネットワーク、エキスパートシステム、Bayesian belief network、ファジイ論理、data fusion engine、クラシファイヤ...)を含むかこれらからなるものとすることができる。そのようなコンポーネントは、なかんずく、それによって実行されるある種の機構またはプロセスを自動化して、このシステムおよび方法の諸部分をより適応式であると同時に効率的かつインテリジェントにすることができる。例えば、推論コンポーネント420は、人工知能、機械学習、または類似する機構を利用して、型の推論を容易にすることができる。それに加えてまたはその代わりに、選択コンポーネント610が、そのようなインテリジェント機構を使用して、オーバーロード解決を容易にすることができる。
【0067】
上で説明した例示的システムに鑑みて、開示される主題に従って実施できる方法は、図7〜12の流れ図を参照してよりよく理解される。説明を単純にするために、これらの方法は、一連のブロックとして図示され、説明されるが、一部のブロックが、図示され本明細書で説明される順序と異なる順序でおよび/または他のブロックと同時に発生し得るので、請求される主題が、ブロックの順序によって限定されないことを理解し、了解されたい。さらに、図示されたブロックの一部が、下で説明する方法の実施に必要でない場合がある。
【0068】
さらに、下および本明細書全体を通じて開示される方法が、そのような方法をコンピュータにトランスポートし、転送するのを容易にするために製造品に格納されることができることをさらに了解されたい。本明細書で使用される用語製造品は、任意のコンピュータ可読デバイス、搬送波、または媒体からアクセス可能なコンピュータプログラムを含むことが意図されている。
【0069】
図7に移ると、ラムダ式実行の方法700が示されている。符号710で、ラムダ式を受け取り、取り出し、または識別する。ラムダ式は、0個以上のパラメータと、式または式本体とを含むことができる。パラメータは、複数の形で式から区切ることができる。例えば、ラムダ式パラメータを、2つの垂直バーもしくは括弧の中に含めることができ、あるいは、二重矢印または類似物を利用して式本体から分離することができる。例えば、ラムダ式は、「|x|x+1」、「(x,y)x+1」、または「x=>x+1」という形をとることができる。さらに、パラメータなしのラムダ式を、例えば条件or「‖」と明瞭に区別するために「‖=」を利用することによって、異なる形で指定することができる。720で、ラムダ式の値を計算し、または評価する。そのような値は、integer、Boolean、およびstringを含むがこれらに限定されない任意の型を有するものとすることができる。730で、計算された値を返す。例えば、ラムダ式が引数として指定される場合に、計算された値を、呼出し側のステートメントまたはメソッドに返すことができる。その代わりに、ラムダ式がデリゲートなどの関数に割り当てられる場合に、計算された値をその関数に返すことができる。
【0070】
図8に、ラムダ式に関連するプログラミング方法800の流れ図を示す。符号810で、ラムダ式を指定する。例えば、ラムダ式は、コードエディタおよび/または統合開発環境を用いて、手動で、自動的に、または半自動的に指定することができる。ラムダ式には、上で説明したように0個以上のパラメータならびに式または式本体を含めることができる。ラムダ式は、式からパラメータを区切るのに1つまたは複数のシンボルを利用する任意の複数の形で指定することができる。例えば、ラムダ式を「|c|c.age」、「c=>c.age」、または「(c)c.age」と表すことができる。さらに、ラムダ式を、とりわけ、コンピュータ実行可能プログラム内で引数としてまたは関数に割り当てられるものとして指定することができる。符号820で、ラムダ式を含むプログラムをコンパイルのためにコンパイラに供給する。ソースコードから、コンパイラは、機械実行可能コードまたは例えばジャストインタイム(JIT)コンパイラによってランタイムにさらにコンパイルできるある中間コードを作ることができる。830で、コンパイラによって生成されたコードを、コンピュータによって実行する。
【0071】
図9に、ラムダ式変換の方法900を示す。匿名メソッド表現に似て、ラムダ式は、特殊な変換ルールを伴う値として分類することができる。値は、型を有しないが、delegate型などの他の互換の型に変換することができる。符号910で、ラムダ式を受け取り、取り出し、または他の形で入手しあるいは識別する。受け取られたラムダ式は、この例では、特定の型に割り当てられる。例えば、
【0072】
【表15】
【0073】
ここで、このラムダ式は、delegate型関数に割り当てられる。920で、ラムダ式が、それが割り当てられる型と互換またはその型に変換可能であるかどうかに関する判定を行う。割り当てられる型に基づいて、検証される必要がある複数の条件が存在し得る。例えば、あるdelegate型Dがラムダ式Lと互換であるかどうかを判定するためには、次の条件すなわち、(1)Dが、非voidの戻り型を有し、refパラメータまたはoutパラメータを有しないこと、(2)DおよびLが、同一個数のパラメータを有し、Lが明示的に型付けされたパラメータリストを有する場合には、Dの各パラメータの型が、Lの対応するパラメータの型と同一でなければならないこと、および(3)各パラメータLが、Dの対応するパラメータの型を与えられるときには、Lの式本体が、Dの戻り型に暗黙のうちに変換可能な有効な式であることを検証することができる。互換性条件が、920で満足されない場合には、930で、ラムダ式を非互換の型に変換する試みを示すエラーまたは例外を生成する。条件が920で満足される場合には、変換が許可され、940で、ラムダ式を変換する。上の例では、ラムダ式は、delegate型Func<int,int>に成功して変換される。というのは、xが、型intを与えられ、x+1が、型intに暗黙のうちに変換可能な有効な式であるからである。この割当は、匿名メソッドを使用する次のより冗漫な形式と同等である。
【0074】
【表16】
【0075】
図10は、ラムダ式に関する型推論方法1000である。符号1010で、プログラム内のラムダ式を識別する。1020で、ラムダ式に直接にまたは間接に関連するコンテキスト情報を入手する。そのようなコンテキスト情報に、とりわけ、クラス、オブジェクト、関数、メソッド、および型を含めることができる。例えば、ラムダ式が関数に割り当てられる場合には、その関数がコンテキスト情報を提供する。ラムダ式がメソッド引数である場合には、そのメソッドがコンテキスト情報を提供する。符号1030で、ラムダ式に関連する型を推論する。例えば、ラムダ式パラメータを、得られたコンテキスト情報に基づいて推論することができる。ラムダ式本体要素および/または戻り型は、以前の推論およびコンテキスト情報に基づいて判定することができる。例えば、ジェネリックメソッドに引数として渡されるラムダ式を検討されたい。型推論を、まず、各引数と独立に行うことができる。この初期フェーズでは、ラムダ式である引数からは何も推論されない。しかし、初期フェーズの後に、追加の推論を、反復プロセスを使用してラムダ式から行うことができる。具体的に言うと、メソッドの戻り型と共に、初期フェーズからのコンテキスト情報を利用して、型推論を容易にすることができる。そのようなプロセスは、さらなる推論を行えなくなるまで繰り返すことができる。
【0076】
図11に、ラムダ式が型推論プロセスにどのように加わることができるかをさらに了解するために、例示的な型推論方法1100を示す。方法1100は、メソッド引数としてのラムダ式の使用に関する。方法1100を変更して、ラムダ式割当およびラムダ式の他の使用を扱うこともできることを了解されたい。符号1110で、メソッドおよび必要な場合に非ラムダ式引数について型を推論する。1120で、ラムダ式をメソッド引数として識別する。その後、1130で、パラメータ型および式要素型などのラムダ式型を推論する。この推論は、例えば関連するメソッド、呼出し側メソッド、および/またはそのメソッドの他の引数に関連するものを含む、推論の現在のセットに基づくものとすることができる。1140で、チェックを行って、メソッドパラメータ戻り型が、ラムダ式の戻り型と同一であるかどうかを判定する。そうでない場合には、誤ったコード指定または推論があった可能性が高い。したがって、1150でエラーを生成することができ、この方法は終了する。戻り型が同一である場合には、この方法は、1160に進行することができ、1160では、それからの推論がまだ行われていないラムダ式がまだあるかどうかに関する判定を行う。まだある場合には、それらのラムダ式を1120で識別し、この方法は、そこから進行する。ラムダ式がもうない場合には、この方法は終了する。
【0077】
例として、次のコードスニッペット内の次のSelectエクステンションメソッドを検討されたい。
【0078】
【表17】
【0079】
このSelectメソッドを使用して、次のコードを介してカスタマのリストを選択することができる。
【0080】
【表18】
【0081】
Selectのこのエクステンションメソッド呼び出しは、この呼び出しを次などの静的メソッド呼び出しに書き直す(例えば、コンパイラによって)ことによって処理することができる。
【0082】
【表19】
【0083】
上のコードスニッペットの型引数は、明示的に指定されていないので、これらを推論することができる。非ラムダ式引数「customers」があるので、この型をまず推論することができる。ここで、「customers」は、sourceパラメータに関連し、型Tを有する。この特定の呼び出しから、Tを、型Customerを有すると推論することができる。ラムダ式パラメータcおよび式本体c.Nameは、Selectメソッドのselectorパラメータに関連する。ラムダ式パラメータcは、型Tに対応し、これは、既に型Customerを有することが推論されており、したがって、cは型Customerを有する。式本体c.Nameは、パラメータSに対応し、これは、型stringを有すると推論することができる。Customer型から、クラスc.Nameがstringなどの特定の型を有することを見つけることができる。したがって、ラムダ式本体とメソッドパラメータ戻り型との両方が、型stringを有する。したがって、型推論が、成功して完了している。この呼び出しは、次の明示的に型指定されたメソッド呼び出しと同等である。
【0084】
【表20】
【0085】
この例は、型情報をどのように判定できるか、および型情報が呼出し側メソッドならびにその非ラムダ式引数からラムダ式にどのように流れるかを示すものである。
【0086】
図12に移ると、オーバーロード解決の方法1200を示す流れ図が示されている。より具体的には、方法1200は、例えば、オーバーロードされるメソッドの解決にラムダ式をどのように用いることができるかを示す。符号1210で、ラムダ式を、例えばメソッド引数として識別する。1220で、例えば推論のセットに基づく推論によって、ラムダ式の戻り型を判定する。最後に、1230で、ラムダ式の戻り型に基づいて、特定のオーバーロードされるメソッドを選択する。例えば、次のように異なる結果を返す2つのSum関数を含むクラスを検討されたい。
【0087】
【表21】
【0088】
ここでは、Sumがオーバーロードされる。ここで、次のコードが指定されると仮定する。
【0089】
【表22】
【0090】
どのSumを呼び出すかを決定し、オーバーロードを解決するためには、ラムダ式の戻り型を判定しなければならない。ここで、psが、型List<Product>を有することが示されている。これから、pが型Productを有すると推論することができる。次に、Productのクラス定義に基づいて、p.Priceの型を判定することができる。この例について、この定義から、p.Priceが型doubleを有することが明らかになると仮定する。ここで、指定されたコードが、Productをとり、doubleを返すことがわかる。したがって、このコードは、型Func<Product,double>を有する。この知識から、第2のSumを選択することができる。Productクラス定義から、p.Priceが型integerを有することが明らかにされる場合には、このコードは、型Func<Product,int>を有する。このシナリオでは、型integerはdoubleに変換可能であるが、第1のSum関数がよりよい一致なので、第1のSum関数が選択されるはずである。この例から了解されるとおり、ラムダ式戻り型に基づいて、正しいメソッドまたは関数を選択することができるので、関数のうちの一方をまず選択する必要はない(例えば、構造的型指定を用いて行われるように)。
【0091】
図13は、実装コード(例えば、実行可能ファイル、中間言語...)を作るのに利用できるコンパイラ環境1300を示す概略ブロック図である。コンパイラ環境1300は、コンパイラ220を含み、コンパイラ220は、フロントエンドコンポーネント1320、コンバータコンポーネント1330、バックエンドコンポーネント1340、エラーチェッカコンポーネント1350、シンボルテーブル1360、解析ツリー1370、および状態1380を含む。コンパイラ220は、入力としてソースコードを受け入れ、出力として実装コードを作る。入力には、本明細書で説明する区切られたプログラム式または修飾された識別子を含めることができるが、これらに限定はされない。このコンパイラ環境のコンポーネントおよびモジュールの間の関係は、データのメインフローを示す。他のコンポーネントおよび関係は、図を明瞭にし、単純にするために図示されていない。実施態様に応じて、コンポーネントを追加し、省略し、複数のモジュールに分割し、他のモジュールと組み合わせ、かつ/またはモジュールの他の構成とすることができる。
【0092】
コンパイラ220は、要素のシーケンスの処理に関連するソースコードを有するファイルを入力として受け入れる。ソースコードには、ラムダ式ならびに関連する関数、メソッド、および/または他のプログラムコンストラクトを含めることができる。コンパイラ220は、コンストラクトを分析し、コードを生成するか注入するために、1つまたは複数のコンポーネントと共にソースコードを処理することができる。
【0093】
フロントエンドコンポーネント1320は、ソースコードを読み取り、ソースコードに対する字句解析を実行する。本質的に、フロントエンドコンポーネント1320は、ソースコード内の文字(例えば英数字)のシーケンスを読み取り、これらを、とりわけ定数、識別子、演算子シンボル、キーワード、および句読点を示す構文要素またはトークンに変換する。
【0094】
コンバータコンポーネント1330は、トークンを中間表現に解析する。例えば、コンバータコンポーネント1330は、構文をチェックし、トークンを式または他の構文構造にグループ化し、この式または他の構文構造は、ステートメントツリーに合体される。概念的に、これらのツリーは、解析ツリー1370を形成する。さらに、適当に、コンバータコンポーネント1330は、エントリをシンボルテーブル1360に置くことができ、このシンボルテーブルは、関連する特性と共に、ソースコード内で使用されるシンボル名および型情報をリストする。
【0095】
状態1380を使用して、受け取られたまたは取り出されたソースコードの処理および解析ツリー1370の形成におけるコンパイラ220の進行を追跡することができる。例えば、異なる状態値は、コンパイラ220が、クラス定義または関数の始めに位置する、クラスメンバを宣言し終えたばかりである、あるいは1つの式を完了したことを示す。コンパイラが進行する時に、コンパイラは、状態1380を継続的に更新する。コンパイラ220は、状態1380を外部エンティティに部分的にまたは完全に公開することができ、この外部エンティティは、コンパイラ220に入力を供給することができる。
【0096】
ソースコード内のコンストラクトまたは他のシグナルに基づいて(または、他の形で機会が認識される場合に)、コンバータコンポーネント1330または別のコンポーネントは、効率的で正しい実行を容易にするために、対応するコードを注入することができる。コンバータコンポーネント1330または他のコンポーネントにコーディングされたルールは、所望の機能性を実施するために行わなければならないことを示し、コードを注入すべき位置または他の動作を実行しなければならない位置を識別する。注入されるコードは、通常、1つまたは複数の位置に追加されるステートメント、メタデータ、または他の要素を含むが、このことばは、既存ソースコードの変更、削除、または他の形での修正をも含むことができる。注入されるコードは、1つまたは複数のテンプレートとして、またはある他の形で格納することができる。さらに、シンボルテーブル操作および解析ツリー変換を行うことができることを了解されたい。
【0097】
シンボルテーブル1360および解析ツリー1370に基づいて、バックエンドコンポーネント1340は、中間表現を出力コードに変換することができる。バックエンドコンポーネント1340は、中間表現を、ターゲットプロセッサ内でまたはこれによって実行可能な命令、変数のメモリ割当などに変換する。出力コードは、実プロセッサによって実行可能とすることができるが、本発明は、仮想プロセッサによって実行可能な出力コードをも企図している。
【0098】
さらに、フロントエンドコンポーネント1320およびバックエンドコンポーネント1340は、コード最適化など、追加の機能を実行することができ、説明される動作を単一のフェーズまたは複数のフェーズとして実行することができる。コンパイラ220のコンポーネントの様々な他の態様は、性質において普通であり、同等の機能を実行するコンポーネントに置換することができる。さらに、ソースコードの処理中の様々なステージで、エラーチェッカコンポーネント1350は、語彙構造のエラー、構文エラー、およびセマンティックエラーなどのエラーについてチェックすることができる。エラーの検出時に、チェッカコンポーネント1350は、コンパイルを停止し、エラーを示すメッセージを生成することができる。
【0099】
開示される主題の様々な態様のコンテキストを提供するために、図14および15ならびに次の議論は、開示される主題の様々な態様を実施できる適切な環境の短い全般的な説明を提供することを意図されたものである。この主題を、1つのコンピュータおよび/または複数のコンピュータで動作するコンピュータプログラムのコンピュータ実行可能命令の全般的な文脈で上で説明したが、当業者は、本発明を他のプログラムモジュールと組み合わせて実施することもできることを認めるであろう。一般に、プログラムモジュールは、特定のタスクを実行し、かつ/または特定の抽象データ型を実装するルーチン、プログラム、コンポーネント、データ構造などを含む。さらに、当業者は、本発明の方法を、シングルプロセッサコンピュータシステムまたはマルチプロセッサコンピュータシステム、ミニコンピューティングデバイス、メインフレームコンピュータ、ならびにパーソナルコンピュータ、ハンドヘルドコンピューティングデバイス(例えば、携帯情報端末(PDA)、電話機、腕時計...)、マイクロプロセッサベースのまたはプログラマブルなコンシューマエレクトロニクスまたは産業用エレクトロニクス、および類似物を含む、他のコンピュータシステム構成を用いて実践できることを了解するであろう。示された態様は、通信ネットワークを介してリンクされたリモート処理デバイスによってタスクが実行される分散コンピューティング環境でも実践することができる。しかし、本発明の態様の、すべてではないにせよ一部を、独立型コンピュータで実践することができる。分散コンピューティング環境では、プログラムモジュールを、ローカルとリモートとの両方のメモリストレージデバイスに置くことができる。
【0100】
図14を参照すると、本明細書で開示される様々な態様を実施する例示的環境1410に、コンピュータ1412(例えば、デスクトップ機、ラップトップ機、サーバ、ハンドヘルド機、プログラマブルなコンシューマエレクトロニクスまたは産業用エレクトロニクス...)が含まれる。コンピュータ1412は、処理ユニット1414、システムメモリ1416、およびシステムバス1418を含む。システムバス1418は、システムメモリ1416を含むがこれに限定されないシステムコンポーネントを処理ユニット1414に結合する。処理ユニット1414は、様々な使用可能なマイクロプロセッサのいずれかとすることができる。デュアルマイクロプロセッサおよび他のマルチプロセッサアーキテクチャも、処理ユニット1414として使用することができる。
【0101】
システムバス1418は、メモリバスもしくはメモリコントローラ、周辺バスもしくは外部バス、ならびに/または11ビットバス、Industrial Standard Architecture(ISA)、マイクロチャネルアーキテクチャ(MCA)、Extended ISA(EISA)、Intelligent Drive Electronics(IDE)、VESA Local Bus(VLB)、Peripheral Component Interconnect(PCI)、Universal Serial Bus(USB)、Advanced Graphics Port(AGP)、Personal Computer Memory Card International Associationバス(PCMCIA)、およびSmall Computer Systems Interface(SCSI)を含むがこれに限定されない様々な使用可能なバスアーキテクチャのいずれかを使用するローカルバスを含む複数のタイプのバス構造のいずれかとすることができる。
【0102】
システムメモリ1416は、揮発性メモリ1420および不揮発性メモリ1422を含む。スタートアップ中などにコンピュータ1412内の要素の間で情報を転送する基本ルーチンを含む基本入出力システム(BIOS)が、不揮発性メモリ1422に格納される。限定ではなく例として、不揮発性メモリ1422は、読取専用メモリ(ROM)、プログラマブルROM(PROM)、電気的プログラム可能ROM(EPROM)、電気的消去可能ROM(EEPROM)、またはフラッシュメモリを含むことができる。揮発性メモリ1420は、外部キャッシュメモリとして働くランダムアクセスメモリ(RAM)を含む。限定ではなく例として、RAMは、シンクロナスRAM(SRAM)、ダイナミックRAM(DRAM)、シンクロナスDRAM(SDRAM)、ダブルデータレートSDRAM(DDR SDRAM)、エンハンストSDRAM(ESDRAM)、Synchlink DRAM(SLDRAM)、およびdirect Rambus RAM(DRRAM)などの多数の形で入手可能である。
【0103】
コンピュータ1412は、リムーバブル/ノンリムーバブルの揮発性/不揮発性コンピュータ記憶媒体をも含む。図14に、例えば、ディスクストレージ1424を示す。ディスクストレージ1424は、磁気ディスクドライブ、フロッピー(登録商標)ディスクドライブ、テープドライブ、Jazドライブ、Zipドライブ、LS−100ドライブ、フラッシュメモリカード、またはメモリスティックなどのデバイスを含むが、これらに限定はされない。さらに、ディスクストレージ1424に、コンパクトディスクROMデバイス(CD−ROM)、CD recordableドライブ(CD−Rドライブ)、CD rewritableドライブ(CD−RWドライブ)、またはデジタル多用途ディスクROMドライブ(DVD−ROM)などの光学ディスクドライブを含むがこれに限定されない記憶媒体を、他の記憶媒体と別々にまたはこれらと組み合わせて含めることができる。システムバス1418へのディスクストレージデバイス1424の接続を容易にするために、インターフェース1426などのリムーバブルまたはノンリムーバブルのインターフェースが、通常は使用される。
【0104】
図14に、ユーザと、適切なオペレーティング環境1410で説明した基本的なコンピュータリソースとの間の媒介として働くソフトウェアが記載されていることを了解されたい。そのようなソフトウェアに、オペレーティングシステム1428が含まれる。オペレーティングシステム1428は、ディスクストレージ1424に格納することができるが、コンピュータシステム1412を制御し、そのリソースを割り当てるように働く。システムアプリケーション1430は、プログラムモジュール1432を介するオペレーティングシステム1428によるリソースの管理およびシステムメモリ1416内またはディスクストレージ1424上のいずれかに格納されたプログラムデータ1434を利用する。本発明を、様々なオペレーティングシステムまたはオペレーティングシステムの組合せを用いて実施できることを了解されたい。
【0105】
ユーザは、入力デバイス1436を介してコンピュータ1412にコマンドまたは情報を入力する。入力デバイス1436は、マウスなどのポインティングデバイス、トラックボール、スタイラス、タッチパッド、キーボード、マイクロホン、ジョイスティック、ゲームパッド、衛星パラボラアンテナ、スキャナ、TVチューナカード、デジタルカメラ、デジタルビデオカメラ、ウェブカメラ、および類似物を含むが、これらに限定はされない。これらおよび他の入力デバイスは、インターフェースポート1438を介し、システムバス1418を介して処理ユニット1414に接続される。インターフェースポート1438は、例えば、シリアルポート、パラレルポート、ゲームポート、およびuniversal serial bus(USB)を含む。出力デバイス1440は、入力デバイス1436と同一タイプのポートのいくつかを使用する。したがって、例えば、USBポートを使用して、コンピュータ1412に入力を提供し、コンピュータ1412から出力デバイス1440に情報を出力することができる。出力アダプタ1442が、ディスプレイ(例えば、フラットパネルおよびCRT)、スピーカ、およびプリンタなど、出力デバイス1440の中でも特殊なアダプタを必要とするいくつかの出力デバイス1440があることを示すために提供される。出力アダプタ1442には、限定ではなく例として、出力デバイス1440とシステムバス1418との間の接続の手段を提供する、ビデオカードおよびサウンドカードが含まれる。リモートコンピュータ1444など、他のデバイスおよび/またはデバイスのシステムが、入力機能と出力機能との両方を提供することに留意されたい。
【0106】
コンピュータ1412は、リモートコンピュータ1444などの1つまたは複数のリモートコンピュータへの論理接続を使用して、ネットワーク化された環境で動作することができる。リモートコンピュータ1444は、パーソナルコンピュータ、サーバ、ルータ、ネットワークPC、ワークステーション、マイクロプロセッサベースの機器、ピアデバイス、または他の一般的なネットワークノードおよび類似物とすることができ、リモートコンピュータ1444は、通常は、コンピュータ1412に関して説明した要素の多数またはすべてを含む。図を簡単にするために、メモリストレージデバイス1446だけが、リモートコンピュータ1444と共に図示されている。リモートコンピュータ1444は、論理的にネットワークインターフェース1448を介してコンピュータ1412に接続され、次に、物理的に通信接続1450を介して接続される。ネットワークインターフェース1448は、ローカルエリアネットワーク(LAN)および広域ネットワーク(WAN)などの通信ネットワークを含む。LANテクノロジは、Fiber Distributed Data Interface(FDDI)、Copper Distributed Data Interface(CDDI)、イーサネット(登録商標)/IEEE802.3、トークンリング/IEEE 802.5、および類似物を含む。WANテクノロジは、ポイントツーポイントリンク、サービス総合デジタル網(ISDN)およびその変形形態などの回路交換網、パケット交換網、およびデジタル加入者回線(DSL)を含むが、これに限定はされない。
【0107】
通信接続1450は、ネットワークインターフェース1448をバス1418に接続するのに使用されるハードウェア/ソフトウェアを指す。通信接続1450は、図を明瞭にするためにコンピュータ1412の内部に図示されているが、コンピュータ1412の外部とすることもできる。ネットワークインターフェース1448への接続に必要なハードウェア/ソフトウェアは、例示のみとして、通常の電話等級モデム、ケーブルモデム、電力線モデム、およびDSLモデムを含むモデム、ISDNアダプタ、ならびにイーサネット(登録商標)カードまたはイーサネット(登録商標)コンポーネントなどの、内蔵テクノロジおよび外付けテクノロジを含む。
【0108】
図15は、本発明が相互作用できるサンプルのコンピューティング環境1500の概略ブロック図である。システム1500は、1つまたは複数のクライアント1510を含む。クライアント1510は、ハードウェアおよび/またはソフトウェア(例えば、スレッド、プロセス、コンピューティングデバイス)とすることができる。システム1500は、1つまたは複数のサーバ1530をも含む。したがって、システム1500は、他のモデルの中でも、2ティアクライアントサーバモデルまたはマルチティアモデル(例えば、クライアント、ミドルティアサーバ、データサーバ)に対応することができる。サーバ1530も、ハードウェアおよび/またはソフトウェア(例えば、スレッド、プロセス、コンピューティングデバイス)とすることができる。サーバ1530は、例えば、本発明を使用することによって、変換を実行するスレッドを収容することができる。クライアント1510とサーバ1530との間の可能な通信の1つを、複数のコンピュータプロセスの間で伝送されるように適合されたデータパケットの形とすることができる。システム1500は、クライアント1510とサーバ1530との間の通信を容易にするのに使用することができる通信フレームワーク1550を含む。クライアント1510は、クライアント1510にローカルな情報を格納するのに使用できる1つまたは複数のクライアントデータストア1560に動作可能に接続される。同様に、サーバ1530は、サーバ1530にローカルな情報を格納するのに使用することができる1つまたは複数のサーバデータストア1540に動作可能に接続される。
【0109】
上で説明したものは、請求される主題の諸態様の例を含む。もちろん、請求される主題の説明においてコンポーネントまたは方法のすべての考えられる組合せを説明することは不可能であるが、当業者は、開示された主題の多数のさらなる組合せおよび置換が可能であることを認めるであろう。したがって、開示された主題は、添付の特許請求の範囲の趣旨および範囲に含まれるすべてのそのような代替形態、修正形態、および変形形態を含むことが意図されている。さらに、用語「含む(includes)」、「有する(has)」、または「有する(having)」が詳細な説明または特許請求の範囲のいずれかで使用される範囲で、これらの用語は、用語「含む(comprising)」が特許請求の範囲で前後を接続する単語として使用される時に「含む(comprising)」が解釈される形に類似する形で包含的であることを意図されている。
【図面の簡単な説明】
【0110】
【図1】ラムダ式の実行システムを示すブロック図である。
【図2】ラムダ式をサポートするプログラミングシステムを示すブロック図である。
【図3】型変換システムを示すブロック図である。
【図4】ラムダ式に関連する型を推論する型推論システムを示すブロック図である。
【図5】ラムダ式を型チェックする型チェックシステムを示すブロック図である。
【図6】オーバーロード解決システムを示すブロック図である。
【図7】ラムダ式実行方法を示す流れ図である。
【図8】プログラミング方法を示す流れ図である。
【図9】ラムダ式変換方法を示す流れ図である。
【図10】ラムダ式に関連する型推論方法を示す流れ図である。
【図11】例示的な型推論方法を示す流れ図である。
【図12】オーバーロード解決方法を示す流れ図である。
【図13】コンパイル環境を示す概略ブロック図である。
【図14】適切なオペレーティング環境を示す概略ブロック図である。
【図15】サンプルのコンピューティング環境を示す概略ブロック図である。
【特許請求の範囲】
【請求項1】
ラムダ式に関連するコンテキスト情報を入手するコンテキストコンポーネントと、
前記コンテキストコンポーネントによって供給される前記コンテキスト情報に基づいて、前記ラムダ式に関連する型を推論する推論コンポーネントと
を含むことを特徴とするコンピュータプログラムコンパイルシステム。
【請求項2】
暗黙のうちにおよび/または明示的に型指定される0個以上のパラメータと本体とを含むラムダ式の指定を容易にする開発コンポーネントをさらに含むことを特徴とする請求項1に記載のシステム。
【請求項3】
前記ラムダ式は、|パラメータ|本体、||=本体、パラメータ=>本体、(パラメータ)=>本体、パラメータ==>本体、および(パラメータ)==>本体のうちの1つの形であることを特徴とする請求項2に記載のシステム。
【請求項4】
前記本体は、式およびステートメントブロックのうちの1つを含むことを特徴とする請求項3に記載のシステム。
【請求項5】
前記コンテキストコンポーネントは、前記ラムダ式が割り当てられる関数からコンテキスト情報を取り出すことを特徴とする請求項1に記載のシステム。
【請求項6】
前記推論コンポーネントは、前記推論された型を検証するために、前記関数の戻り型を前記ラムダ式の戻り型と比較する検証コンポーネントを含むことを特徴とする請求項5に記載のシステム。
【請求項7】
前記関数は、delegate型およびジェネリックdelegate型のうちの1つであることを特徴とする請求項6に記載のシステム。
【請求項8】
前記コンテキストコンポーネントは、ラムダ式パラメータクラスからコンテキスト情報を取り出すことを特徴とする請求項5に記載のシステム。
【請求項9】
推論された型を1つまたは複数の明示的な型と比較し、前記明示的な型が前記推論された型と一致しない場合にエラーを生成する型チェッカコンポーネントをさらに含むことを特徴とする請求項1に記載のシステム。
【請求項10】
前記ラムダ式およびオーバーロードされるメソッドのパラメータが同一である場合に、前記ラムダ式の戻り型に基づいてオーバーロードされるメソッドを選択する選択コンポーネントをさらに含むことを特徴とする請求項1に記載のシステム。
【請求項11】
ラムダ式の電子表現およびdelegate型の電子表現が互換であるかどうかを判定することと、
前記式および前記型が互換である場合に前記ラムダ式を前記delegate型に変換し、そうでない場合にエラーを生成することと
を含むことを特徴とするコンピュータ実施されるラムダ式変換方法。
【請求項12】
互換性を判定することは、前記delegate型を分析することを含み、前記ラムダ式およびdelegate型は、前記delegate型がvoid戻り型を有するかrefパラメータまたはoutパラメータを含む場合に非互換であることを特徴とする請求項11に記載の方法。
【請求項13】
互換性を判定することは、前記ラムダ式および前記delegate型のそれぞれのパラメータを分析することを含み、前記ラムダ式およびdelegate型は、これらが異なる個数のパラメータを有する場合および/または対応するパラメータが異なる型を有する場合に非互換であることを特徴とする請求項12に記載の方法。
【請求項14】
互換性を判定することは、前記ラムダ式に関連する式本体を分析することを含み、前記ラムダ式およびdelegate型は、前記式本体が同一の型を有するか前記delegate型の戻り型に変換可能である場合に互換であることを特徴とする請求項13に記載の方法。
【請求項15】
請求項11に記載の方法を実行するコンピュータ実行可能命令がその上に格納されていることを特徴とするコンピュータ可読媒体。
【請求項16】
メソッド引数内のラムダ式を識別することと、
前記ラムダ式の戻り型を判定することと、
前記戻り型に基づいて、オーバーロードされるメソッドのうちの1つを選択することと
を含むことを特徴とするコンピュータ実施されるオーバーロード解決方法。
【請求項17】
オーバーロードされるメソッドのうちの1つを選択することは、前記ラムダ式と同一の戻り型を有するメソッドを選択することを含むことを特徴とする請求項16に記載の方法。
【請求項18】
オーバーロードされるメソッドのうちの1つを選択することは、前記ラムダ式の戻り型と互換である戻り型を有するメソッドを選択することを含むことを特徴とする請求項16に記載の方法。
【請求項19】
前記戻り型を判定することは、前記ラムダ式に関連するコンテキスト情報を入手することと、前記コンテキスト情報に基づいて前記戻り型を推論することとを含むことを特徴とする請求項16に記載の方法。
【請求項20】
請求項16に記載の方法を実行するコンピュータ実行可能命令がその上に格納されていることを特徴とするコンピュータ可読媒体。
【請求項1】
ラムダ式に関連するコンテキスト情報を入手するコンテキストコンポーネントと、
前記コンテキストコンポーネントによって供給される前記コンテキスト情報に基づいて、前記ラムダ式に関連する型を推論する推論コンポーネントと
を含むことを特徴とするコンピュータプログラムコンパイルシステム。
【請求項2】
暗黙のうちにおよび/または明示的に型指定される0個以上のパラメータと本体とを含むラムダ式の指定を容易にする開発コンポーネントをさらに含むことを特徴とする請求項1に記載のシステム。
【請求項3】
前記ラムダ式は、|パラメータ|本体、||=本体、パラメータ=>本体、(パラメータ)=>本体、パラメータ==>本体、および(パラメータ)==>本体のうちの1つの形であることを特徴とする請求項2に記載のシステム。
【請求項4】
前記本体は、式およびステートメントブロックのうちの1つを含むことを特徴とする請求項3に記載のシステム。
【請求項5】
前記コンテキストコンポーネントは、前記ラムダ式が割り当てられる関数からコンテキスト情報を取り出すことを特徴とする請求項1に記載のシステム。
【請求項6】
前記推論コンポーネントは、前記推論された型を検証するために、前記関数の戻り型を前記ラムダ式の戻り型と比較する検証コンポーネントを含むことを特徴とする請求項5に記載のシステム。
【請求項7】
前記関数は、delegate型およびジェネリックdelegate型のうちの1つであることを特徴とする請求項6に記載のシステム。
【請求項8】
前記コンテキストコンポーネントは、ラムダ式パラメータクラスからコンテキスト情報を取り出すことを特徴とする請求項5に記載のシステム。
【請求項9】
推論された型を1つまたは複数の明示的な型と比較し、前記明示的な型が前記推論された型と一致しない場合にエラーを生成する型チェッカコンポーネントをさらに含むことを特徴とする請求項1に記載のシステム。
【請求項10】
前記ラムダ式およびオーバーロードされるメソッドのパラメータが同一である場合に、前記ラムダ式の戻り型に基づいてオーバーロードされるメソッドを選択する選択コンポーネントをさらに含むことを特徴とする請求項1に記載のシステム。
【請求項11】
ラムダ式の電子表現およびdelegate型の電子表現が互換であるかどうかを判定することと、
前記式および前記型が互換である場合に前記ラムダ式を前記delegate型に変換し、そうでない場合にエラーを生成することと
を含むことを特徴とするコンピュータ実施されるラムダ式変換方法。
【請求項12】
互換性を判定することは、前記delegate型を分析することを含み、前記ラムダ式およびdelegate型は、前記delegate型がvoid戻り型を有するかrefパラメータまたはoutパラメータを含む場合に非互換であることを特徴とする請求項11に記載の方法。
【請求項13】
互換性を判定することは、前記ラムダ式および前記delegate型のそれぞれのパラメータを分析することを含み、前記ラムダ式およびdelegate型は、これらが異なる個数のパラメータを有する場合および/または対応するパラメータが異なる型を有する場合に非互換であることを特徴とする請求項12に記載の方法。
【請求項14】
互換性を判定することは、前記ラムダ式に関連する式本体を分析することを含み、前記ラムダ式およびdelegate型は、前記式本体が同一の型を有するか前記delegate型の戻り型に変換可能である場合に互換であることを特徴とする請求項13に記載の方法。
【請求項15】
請求項11に記載の方法を実行するコンピュータ実行可能命令がその上に格納されていることを特徴とするコンピュータ可読媒体。
【請求項16】
メソッド引数内のラムダ式を識別することと、
前記ラムダ式の戻り型を判定することと、
前記戻り型に基づいて、オーバーロードされるメソッドのうちの1つを選択することと
を含むことを特徴とするコンピュータ実施されるオーバーロード解決方法。
【請求項17】
オーバーロードされるメソッドのうちの1つを選択することは、前記ラムダ式と同一の戻り型を有するメソッドを選択することを含むことを特徴とする請求項16に記載の方法。
【請求項18】
オーバーロードされるメソッドのうちの1つを選択することは、前記ラムダ式の戻り型と互換である戻り型を有するメソッドを選択することを含むことを特徴とする請求項16に記載の方法。
【請求項19】
前記戻り型を判定することは、前記ラムダ式に関連するコンテキスト情報を入手することと、前記コンテキスト情報に基づいて前記戻り型を推論することとを含むことを特徴とする請求項16に記載の方法。
【請求項20】
請求項16に記載の方法を実行するコンピュータ実行可能命令がその上に格納されていることを特徴とするコンピュータ可読媒体。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【公表番号】特表2009−505174(P2009−505174A)
【公表日】平成21年2月5日(2009.2.5)
【国際特許分類】
【出願番号】特願2008−523885(P2008−523885)
【出願日】平成18年6月23日(2006.6.23)
【国際出願番号】PCT/US2006/024567
【国際公開番号】WO2007/018774
【国際公開日】平成19年2月15日(2007.2.15)
【出願人】(500046438)マイクロソフト コーポレーション (3,165)
【Fターム(参考)】
【公表日】平成21年2月5日(2009.2.5)
【国際特許分類】
【出願日】平成18年6月23日(2006.6.23)
【国際出願番号】PCT/US2006/024567
【国際公開番号】WO2007/018774
【国際公開日】平成19年2月15日(2007.2.15)
【出願人】(500046438)マイクロソフト コーポレーション (3,165)
【Fターム(参考)】
[ Back to top ]