JP6911059B2 - Cpu利用およびコードリファクタリングのためのクエリオプティマイザー - Google Patents

Cpu利用およびコードリファクタリングのためのクエリオプティマイザー Download PDF

Info

Publication number
JP6911059B2
JP6911059B2 JP2018563782A JP2018563782A JP6911059B2 JP 6911059 B2 JP6911059 B2 JP 6911059B2 JP 2018563782 A JP2018563782 A JP 2018563782A JP 2018563782 A JP2018563782 A JP 2018563782A JP 6911059 B2 JP6911059 B2 JP 6911059B2
Authority
JP
Japan
Prior art keywords
query
functionally equivalent
program code
computing device
rule
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2018563782A
Other languages
English (en)
Other versions
JP2019523942A (ja
JP2019523942A5 (ja
Inventor
イワニル,エラド
タミル,ガル
エルク,アーミル
コレー,エリ
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microsoft Corp
Microsoft Technology Licensing LLC
Original Assignee
Microsoft Corp
Microsoft Technology Licensing LLC
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Microsoft Corp, Microsoft Technology Licensing LLC filed Critical Microsoft Corp
Publication of JP2019523942A publication Critical patent/JP2019523942A/ja
Publication of JP2019523942A5 publication Critical patent/JP2019523942A5/ja
Application granted granted Critical
Publication of JP6911059B2 publication Critical patent/JP6911059B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/72Code refactoring
    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • G06F16/24534Query rewriting; Transformation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Computational Linguistics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Description

[0001]ソフトウェア開発者が使用してソフトウェアを開発できる様々なタイプのソフトウェア開発アプリケーションが存在する。統合開発環境(IDE:integrated development environment)は、1つのパッケージにいくつかの開発ツールを収める一種のソフトウェア開発アプリケーションである。IDEは、ソースコードエディター(「コードエディター」)、ビルド自動化ツール、およびデバッガーなどのツールを含むことができる。IDEの例は、カナダ、オタワのEclipse Foundationによって開発されたEclipse(商標)、カナダ、バンクーバーのActiveStateによって開発されたActiveState Komodo(商標)、チェコ共和国のJetBrainsによって開発されたIntelliJ IDEA、カリフォルニア州レッドウッドシティのOracle Corporationによって開発されたOracle JDeveloper(商標)、Oracle Corporationによって開発されたNetBeans、カリフォルニア州サンフランシスコのCodenvyによって開発されたCodenvy(商標)、カリフォルニア州クパチーノのApple Corporationによって開発されたXcode(登録商標)、およびワシントン州レドモンドのMicrosoft Corporationによって開発されたMicrosoft(登録商標) visual studio(登録商標)を含む。
[0002]現在の多くのプログラミング言語が、データに対するクエリをネイティブにサポートする。例えば、Microsoft Corporationによって開発されたMicrosoft .NET Frameworkは、LINQ(統合言語クエリ(Language Integrated Query))の形でクエリをサポートし、一方、カリフォルニア州レッドウッドシティのOracle Corporationによって開発されたJava(登録商標)は、Streamsの形でクエリをサポートする。プログラミング言語におけるクエリのネイティブサポートは、開発者のために統合クエリ機能がクエリの実際の実装を担当するので、開発者が彼らのプログラムコードのロジック部分に集中することを可能にする。これにより、開発者は、彼らのコーディングのスピードアップを可能にすることができる。
[0003]しかし、非効率的なクエリの影響を知らないこと、または十分に理解していないことが、非効率的なプログラムコードの開発をもたらすことがある。さらに、ソフトウェアを開発するための今日の最善の手法により、開発者は、より優れた可読性のために彼らのコード内で、比較的大きいメソッド/プロシージャを比較的小さいメソッド/プロシージャに分割する傾向があり、これが、プログラムコード内のクエリの非効率性をもたらすこともある。
[0004]発明を実施するための形態において下記でさらに説明される簡素化した形で概念の選択を紹介するために、本概要が提供される。本概要は、特許請求された主題の主要な特徴または本質的特徴を識別することを意図するものではなく、特許請求の範囲の主題の範囲を限定するために使用されることを意図するものでもない。
[0005]プログラムコード内のクエリの効率性を向上させるための方法、システム、装置、およびコンピュータープログラム製品が提供される。プログラムコードがコードエディターにエンターされるとき、またはコンパイル中などに、複数のクエリがプログラムコード内で検出される。クエリがプログラムコード内でそこまでに評価される遅延(laziness)が拡大される。さらに、検出されたクエリより効率的に評価する機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットが、検出されたクエリに適用される。
[0006]ユーザーによって手動で生成されること、または機械学習、コード例のビッグデータ分析、等などのアルゴリズムによって自動生成されることを含む任意の手法で、ルールセットに含まれるルールが生成されてよい。このようなルールのセットは、開発者の日々の作業の中で発生するほとんどの共通エラーを著しく改善することができる。
[0007]単一の機能的に等価なクエリセットが生成され、既存クエリのうちの1つまたは複数の代わりにプログラムコードに入力されてよく、また1つのクエリセットがプログラムコードへの入力として選択される、複数の候補となる機能的に等価なクエリセットが生成されてもよい。ユーザーは、プログラムコードへの入力として、候補となる機能的に等価なクエリセットを選択してよく、また候補となる機能的に等価なクエリセットが自動選択されてもよい。候補となる機能的に等価なクエリセットの選択は、選択が(例えば、コードエントリ中、またはコンパイル時といった)開発中に行われるか、実行中に行われるかによって影響を受けることがある。実行中に、実行時間の要因(例えば、ネットワーク可用性、利用可能な処理能力、等などの実行条件)に(少なくとも部分的に)基づいて、プログラムコードへの入力のために複数の候補から、候補となる機能的に等価なクエリセットが選択されてよい。
[0008]本発明のさらなる特徴および利点、ならびに本発明の様々な実施形態の構造および動作が、添付の図面を参照しながら下記で詳細に説明される。本発明は、本明細書で説明される特定の実施形態に限定されないということに留意されたい。このような実施形態は、例証のためだけに本明細書で提示される。さらなる実施形態は、本明細書に収められる教示に基づいて、当業者には明白になるであろう。
[0009]本明細書に組み込まれ、本明細書の一部をなす、添付の図面が本出願の実施形態を示し、本説明と共に、実施形態の原理を説明し、当業者が実施形態を作り、使用することを可能にするのにさらに役立つ。
[0010]1つの実施形態の例による、プログラムコード内でのクエリ実行の効率性を改善するように構成されたクエリオプティマイザーを収めるコンピューティングデバイスのブロック図である。 [0011]1つの実施形態の例による、プログラムコード内でのクエリ実行の効率性を改善するように構成されたクエリオプティマイザーを有する開発アプリケーションを含むコンピューティングデバイスのブロック図である。 [0012]1つの実施形態の例による、プログラムコード内でのクエリ実行の効率性を改善するための処理を示すフローチャートである。 [0013]1つの実施形態の例による、クエリオプティマイザーのブロック図である。 [0014]1つの実施形態の例による、コードエディター内で提案された置換クエリセットを生成して、提示するための処理を示すフローチャートである。 [0015]1つの実施形態の例による、提案された置換クエリセットと共にプログラムコードを表示するコードエディターウィンドウを含むコンピューティングデバイスのブロック図である。 [0016]1つの実施形態の例による、コンパイル時に置換クエリセットを生成し、実行するための処理を示すフローチャートである。 [0017]1つの実施形態の例による、プログラムコード内でのクエリ実行の遅延を拡大させるための処理を示すフローチャートである。 [0018]1つの実施形態の例による、遅延エクステンダーのブロック図である。 [0019]1つの実施形態の例による、プログラムコードに対する置換クエリセットを決定するために、ルールセットを適用するための処理を示すフローチャートである。 [0020]1つの実施形態の例による、等価クエリセットジェネレーターのブロック図である。 [0021]1つの実施形態の例による、複数の候補となる機能的に等価なクエリセットを生成して、この中から選択するための処理を示すフローチャートである。 [0022]実施形態を実行するために使用され得るコンピューティングデバイスの例のブロック図である。
[0023]本発明の特徴および利点は、全体を通じて同じ参照文字が対応する要素を識別する図面と併せて読むことにより下記に示される詳細な説明からさらに明白になるであろう。図面では、同じ参照番号は全体的に、同一、機能的に類似、および/または構造的に類似の要素を示す。要素が最初に現れる図面が、対応する参照番号の一番左の桁によって示される。
I.導入
[0024]本明細書および添付の図面は、本発明の特徴を組み込む1つまたは複数の実施形態を開示する。本発明の範囲は、開示の実施形態に限定されない。開示の実施形態は本発明を例示するにすぎず、開示の実施形態の修正バージョンも本発明によって包含される。本発明の実施形態は、本明細書に添付の特許請求の範囲によって定義される。
[0025]「1つの実施形態(one embodiment)」、「実施形態(an embodiment)」、「実施形態の例(an example embodiment)」、等への明細書内での言及は、説明される実施形態が、特定の特徴、構造、または特性を含んでよいが、あらゆる実施形態が、特定の特徴、構造、または特性を必ずしも含まなくてよいということを示す。その上、このような句は、同じ実施形態を必ずしも参照しない。さらに、特定の特徴、構造、または特性が実施形態に対して説明されるとき、明確に説明されていてもいなくても、他の実施形態に対してこのような特徴、構造、または特性をもたらすことが当業者には知られているということが提起される。
[0026]議論において、特に明記しない限り、本開示の実施形態の1つの特徴または複数の特徴の条件または関連の特性を修飾する「実質的に(substantially)」および「おおよそ(about)」などの形容詞は、アプリケーションが意図されるアプリケーションの実施形態の動作に受入れ可能な許容範囲内に条件または特性が定義されるということを意味すると理解される。
[0027]多くの例示的な実施形態が以下のように説明される。本明細書につけられた任意のセクション/サブセクションの見出しは、限定していることを意図するものではないということに留意されたい。実施形態は本文書の全体を通じて説明され、任意のタイプの実施形態が任意のセクション/サブセクションに含まれてよい。さらに、任意のセクション/サブセクションで開示された実施形態は、同じセクション/サブセクションおよび/または異なるセクション/サブセクションにおいて任意の手法で説明される他の任意の実施形態と組み合わされてよい。
II.プログラムコード内のクエリを最適化するための実施形態の例
[0028]現在の多くのプログラミング言語が、クエリをネイティブにサポートする。例えば、Microsoft Corporationによって開発されたMicrosoft .NET Frameworkは、LINQ(統合言語クエリ)の形でクエリをサポートし、一方、カリフォルニア州レッドウッドシティのOracle Corporationによって開発されたJava(登録商標)は、Streamsの形でクエリをサポートする。プログラミング言語におけるクエリのネイティブサポートは、開発者のためにクエリの実際の実装を担当することによって、開発者が彼らのプログラムコードのロジック部分に集中することを可能にする。これにより、開発者は、彼らのコーディングのスピードアップを可能にすることができる。しかし、非効率的なクエリの影響を知らないこと、または十分に理解していないことが、完全に機能しないプログラムコードの開発をもたらす可能性がある。例えば、このようなプログラムコードは、結局は未使用に終わるデータを取得するクエリ、冗長量のデータを取得するクエリ、および/または必要以上に頻繁に、もしくは必要以上に早くデータを取得するクエリを含むことがある。クエリは、同じ論理的な結果を生じる多くの様々なやり方で書かれてよいが、性能に対して非常に様々な影響を与える。
[0029]さらに、ソフトウェアを開発するための今日の最善の手法により、開発者は、より優れた可読性のために彼らのコード内の比較的大きいメソッド/プロシージャを比較的小さいメソッド/プロシージャに分割する傾向がある。現在利用可能なコードオプティマイザーは、このように開発されたコードを最適化するのに苦労することがある。
[0030]実施形態によれば、プログラムコードは、非効率的に実装されるクエリについて自動分析され、クエリは、さらに効率的だが論理的に等価なクエリのセットで置き換えられる。このような実施形態は、(例えば、CPU最適化のために)コンパイル中に影響を及ぼすように、ならびに/またはIDEツールおよび/もしくはIDEアドイン内でリファクタリングの提案として実装されるように実装されてよい。例えば、1つの実施形態において、コードエディターは、さらに効率的なクエリセットを決定すること、および開発者のコードに実装されるように、さらに効率的なクエリセットを開発者に提案すること、を行うように構成される。実施形態は、開発者によって可読コードが開発されることを可能にし、さらにコードを、さらに効率的なコードに自動的に変換する。
[0031]1つの実施形態において、クエリオプティマイザーは、(a)プログラムコード内のクエリ(例えば、LINQ、Streams、等)を識別すること、(b)クエリの結果を検査して、これらの使用法/前後関係を決定すること、(c)クエリを極小単位に分解すること、(d)クエリ最適化が実装され得る場所を決定するために、(a)、(b)、および(c)を集約すること、を行うように構成されてよい。例えば、ルールのセットに対してパターンマッチングが行われてよく、ルールのセットは、明確に定義されたルールおよび/または自動生成されたルールであってよい。例えば、ルールは、機械学習、コード例のビッグデータ分析、等などのアルゴリズムによって自動生成されてよい。このようなルールのセットは、開発者の日々の作業の中で発生するほとんどの共通エラーを著しく改善することができる。
[0032]したがって、実施形態は、(1)クエリ性能を改善するコード変更を分析および推奨するツールおよび処理、(2)等価なさらに最適化されたクエリに、クエリを自動変更するツールおよび処理、(3)クエリの自動性能改善のための、コンパイラのための事前処理するコード分析ツールおよび処理、(4)(.NETにおける「entity framework」、および他の言語における等価物のような)データベースに対するクエリのコードリファクタリングを分析および推奨する自動ツールおよび処理、ならびに実行中に等価なクエリをサンプリングし、シナリオに最善のクエリを自動的に選んで置き換える機械学習を実装するコード最適化ツールおよび処理、のうちの1つまたは複数を提供する。
[0033]本明細書で使用されるように、クエリは、データに対するクエリ(またはリクエスト)であり、データクエリと呼ばれることもある。クエリは、データベース、アプリケーション、API(アプリケーションプログラミングインターフェース(application programming interface))、等を含む、データの任意のソースに提供されてよい。データベースに対するクエリは、「データベースクエリ」と呼ばれることがある。
[0034]実施形態は様々な方式で実装されてよい。例えば、図1は、1つの実施形態の例による、プログラムコード内でのクエリ実行の効率性を改善するように構成されたクエリオプティマイザー104を収めるコンピューティングデバイス102のブロック図を示す。図1に示されるように、クエリオプティマイザー104は、開発者(プログラムコードを書く人/入力する人/修正する人)によってエンターされたプログラムコード106を受け取る。プログラムコード106は複数のクエリ110を含む。クエリ110は複数のクエリを含み、これらは、1つもしくは複数の別々のクエリ演算子および/または1つもしくは複数のクエリ式(文字列/一連のクエリ演算子)を含むことができる。クエリオプティマイザー104は、クエリ110に対するクエリの置換セットを分析および生成するように構成され、それによって、置換クエリ112を含むリファクタリングされたプログラムコード108を出力する。リファクタリングされたプログラムコード108は、元のプログラムコード106と論理的に等価である(同じ機能を実行する)が、置換クエリ112で書き直されるプログラムコードである。置換クエリ112は、プログラムコードによって使用されないデータを取得しないようにすること、冗長データの取得リクエストを作成しないようにすること、冗長動作を実行しないようにすること、ならびに/またはあまり頻繁にデータを取得しないこと、および/もしくは後で取得すること(遅延を増大させること)などによって、元のクエリ110より効率的に実行するように構成される。
[0035]クエリオプティマイザー104は、独立して実装されるか、またはコードエディター、コードコンパイラ、コードデバッガー、等などの、プログラムコードを入力または処理するために開発者によって使用され得る任意のシステムまたはツールに含まれてよい。例えば、図2は、1つの実施形態の例による、クエリオプティマイザー104を含む開発アプリケーション200を含むコンピューティングデバイス102のブロック図を示す。開発アプリケーション200は統合開発環境(IDE)の例である。図2に示されるように、コンピューティングデバイス102は、開発アプリケーション200、ストレージ210、および通信インターフェース208を含む。ストレージ210は、プログラムコード106および108、ならびにルールセット216を格納する。開発アプリケーション200は、ソースコードエディター202、コンパイラ204、およびデバッガーツール206を含む。ソースコードエディター202は、ユーザーインターフェース212を含む。点線矢印で示されるように、クエリオプティマイザー104は、ソースコードエディター202、コンパイラ204、および/またはデバッガーツール206のうちの任意の1つまたは複数に実装されてよく、またこれらによってコールされてもよい。開発アプリケーション200は、例証目的のために、また実施形態の例として示され、開発アプリケーション200の特徴のすべてが、すべての実施形態に存在していなければならないというわけではないということに留意されたい。さらに、図2に示されないさらなる特徴がいくつかの実施形態に存在してもよい。図2に示された開発アプリケーション200の特徴が、以下のように説明される。
[0036]図2に示されるように、開発アプリケーション200は、1つまたは複数のコンピューティングデバイス102に実装されてよい。例えば、ソースコードエディター202、コンパイラ204、およびデバッガーツール206が、同じコンピューティングデバイスに含まれてよく、またソースコードエディター202、コンパイラ204、およびデバッガーツール206のうちの1つまたは複数が、ソースコードエディター202、コンパイラ204、およびデバッガーツール206の他のもののコンピューティングデバイスとは別々の1つまたは複数のコンピューティングデバイスに実装されてもよい。
[0037]コンピューティングデバイス102は、任意のタイプの据置型または携帯型コンピューティングデバイスのうちの1つまたは複数であってよく、携帯型コンピューターもしくは携帯型コンピューティングデバイス(例えば、Microsoft(登録商標) Surface(登録商標)デバイス、パーソナルデジタルアシスタント(PDA:personal digital assistant)、ラップトップコンピューター、ノートブックコンピューター、Apple iPad(登録商標)、ネットブック、等などのタブレット型コンピューター)、携帯電話、ウェアラブルコンピューティングデバイス、または他のタイプの携帯型デバイス、あるいはデスクトップコンピューターまたはPC(パーソナルコンピューター(personal computer))などの据置型コンピューティングデバイスを含む。
[0038]コードエディター202は、本明細書の他の場所で言及される、またはそうでなければ知られている、プログラムコードの編集のために構成される任意の専用または一般のコードエディター(例えば、Eclipse(商標)、ActiveState Komodo(商標)、IntelliJ IDEA、Oracle JDeveloper(商標)、NetBeans、Codenvy(商標)、Xcode(登録商標)、Microsoft(登録商標) Visual Studio(登録商標)、等のコードエディター)であってよい。
[0039]開発者は、アプリケーションのソースコードを生成する際に、プログラムコードをエンターし、修正するために、ソースコードエディター202と対話することができる。例えば、開発者は、タイプピング、音声入力、提案されたコードブロックの選択、等などを行うことによって、プログラムコードテキストを追加、修正、または削除するために、ソースコードエディター202のユーザーインターフェース212と対話することができる。したがって、ユーザーインターフェース212は、1つもしくは複数のテキストエントリボックス/ウィンドウ(例えば、図6のコードエディターウィンドウ604)、音声認識/言語認識、1つもしくは複数のグラフィカルユーザーインターフェース要素(例えば、ボタン、チェックボックス、ラジオボタン、プルダウンメニュー、等)、および/または開発者が対話できる他のユーザーインターフェース要素を含むことができる。完了時または他の間隔で、ユーザーは、「保存」ボタンまたは他のユーザーインターフェース要素と対話することによって、プログラムコードを保存できるようになることがある。
[0040]例えば、図2に示されるように、開発者は、プログラムコード106を生成するために、ソースコードエディター202のユーザーインターフェース212と対話することができる。プログラムコード106はソースコードであり、人間が読めるコンピュータープログラミング言語を使用して書かれた(場合によっては、コメントを含む)コンピューター命令の集合体である。人間が読める適切なコンピュータープログラミング言語の例は、C#、C++、Java、等を含む。プログラムコード106は、1つもしくは複数のファイル内で、または他の形式で受け取られてよい。例えば、プログラムコード106は、(Cプログラミング言語が使用されるときには)1つまたは複数の「.c」ファイル、(C++プログラミング言語が使用されるときには)1つまたは複数の「.cpp」ファイル、等として受け取られてよい。プログラムコード106をリファクタリングするためにソースコードエディター202によってクエリオプティマイザー104が使用されると、リファクタリングされたプログラムコード108がソースコードエディター202によって生成され、保存されてよい。実施形態において、ソースコードエディター202は、リファクタリングされたプログラムコード108内にクエリのさらに効率的なセットを作り出すために、プログラムコード106の(「クエリ演算子」とも呼ばれる)クエリコンポーネントにルールセット216のルールを適用することができる。
[0041]図2に示されるように、プログラムコード106および/または108は、ストレージ210に格納されてよい。ストレージ210は、データを格納するための任意のタイプの物理ストレージハードウェア/回路機器のうちの1つまたは複数を含むことができ、(例えば、ハードディスクドライブ内の)磁気ディスク、(例えば、光ディスクドライブ内の)光ディスク、(例えば、テープドライブ内の)磁気テープ、RAMデバイス、ROMデバイス、等などのメモリデバイス、および/または他の任意の適切なタイプの物理ストレージハードウェア/回路機器を含む。
[0042]コンパイラ204は、コマンドライン、グラフィカルユーザーインターフェース、等などによって任意の手法で起動されてよい。フルコンパイルを行うためにコンパイラ204が起動されるときに、「−full」スイッチまたは他のスイッチが使用されてよい。コンパイラ204は、プログラムコード106(またはプログラムコード108)を受け取ってコンパイルし、機械語222を生成するように構成される。特に、コンパイラ204は、典型的には、機械語またはオブジェクトコードと呼ばれるバイナリ形式の別のコンピューター言語の形で、プログラムコード106および/または108を機械語222に変換するように構成される。いくつかのケースでは、コンパイラ204は複数のステージを含むことができ、最初にプログラムコード106を中間形式(例えば、中間言語)にコンバートすることができ、中間形式はその後、機械語222にコンバートされる。
[0043]コンパイラ204は、機械語222を生成する際に、プログラムコード106および/または108に対して1つまたは複数のタイプの最適化を行うように構成されてよい。最適化されたビルドは、最適化されずに生成された機械語に意味的に等価の機械語を生じるが、最適化された機械語の実行中に、より少ないリソースが使用される方式(例えば、少ないメモリ、より少ないプロシージャコール、等)で構成される。実施され得る最適化の例は、ループの最適化、データフローの最適化、SSAベースの最適化、コードジェネレーターの最適化、関数型言語の最適化、内部手続きの最適化、および/または当業者に知られているさらなるタイプの最適化を含む。多くの特定のタイプの最適化が存在する。例えば、呼出側関数によって呼び出された被呼出側関数が呼出側関数の本体にコピーされる「インライン展開」が行われることがある。特定の最適化の別の例では、コードの単一のインスタンスが、ソースコード内で何度も計算される量に対して使用される「共通式の削除」が行われることがある。プログラムコード106をリファクタリングするために、コンパイラ204によってクエリオプティマイザー104が使用されると、コンパイラ204によって機械語222を生成するために、リファクタリングされたプログラムコード108が生成され、使用されてよい。
[0044]機械語222は、実行可能プログラムまたはアプリケーションを形成するために、ファイル(例えば、オブジェクトすなわち「.obj」ファイル)に含まれてよく、また別の形式で作り出され/格納されてもよい。機械語222は場合によっては、ストレージ210に格納されてよい。
[0045]開発のデバッグステージのためにプログラムコード106および/または108がコンパイラ204によってコンパイルされると、デバッガーツール206は機械語222を受け取ることができる。デバッガーツール206は、機械語222で表されたアプリケーションに対して、デバッガー(または「デバッグ」、「デバッギング」)セッションを実行するように構成される。デバッガーセッションでは、開発者は、プログラムコード106および/または108にエンターされた(ならびにデバッグのためにコンパイラ204によって機械語222に渡された)任意のデバッグコード/文の結果にアクセスできることを含めて、機械語222の実行によって生成された変数、配列、属性、および/または出力の値(例えば、レジスタ、GUI、等の内容)を見ながら、機械語222のコードの実行を1ステップずつ行えるようになることがある。このように、開発者は、プログラムコード106および/または108のテストまたはトラブルシューティング(「デバッグ」)ができ、デバッガーセッションの結果に基づいて、ソースコードエディター202を使用してプログラムコード106および/または108を編集することができる。修正バージョンのプログラムコード106および/または108は、コンパイラ204によってコンパイルされ、さらなるデバッグのためにデバッガーツール206によって受け取られてよい。デバッグ中、デバッガーツール206は、プログラムコード106内のクエリを提案し、および/または書き換えて、プログラムコード108を生成することができる。デバッガーツール206は、機械語222を実行する物理および/または仮想の1つまたは複数のプロセッサ(例えば、中央処理装置(CPU:central processing unit))を含むことができる。
[0046]デバッガーツール206によるデバッグが完了し、プログラムコード106および/または108がその最終バージョンになると、コンパイラ204は、開発のリリースステージのためにプログラムコード106および/または108をコンパイルし、機械語222を生成することができる。リリースバージョンの機械語222は、ユーザーによって使用されるようにリリースされてよい。
[0047]通信インターフェース208は、プログラムコード106および/もしくは108をリモートエンティティに伝送すること、実施形態によるプログラムコードを改善するためのルールを受け取ること、ならびに/または専用もしくは一般の任意の適切な通信プロトコルに従って他のデータを通信することを行うように構成される。通信インターフェースおよび通信プロトコルのさらなる例が、次のセクションで説明される。
[0048]クエリオプティマイザー104は、様々な方式でその機能を実行するように構成されてよい。例えば、図3は、実施形態の1つの例による、プログラムコード内でのクエリ実行の効率性を改善するための処理を示すフローチャート300を示す。クエリオプティマイザー104は、1つの実施形態におけるフローチャート300に従って動作することができる。図1および図4を参照しながら以下のようにフローチャート300が説明される。図4は、実施形態の1つの例による、クエリオプティマイザー104のブロック図を示す。図4に示すように、クエリオプティマイザー104は、クエリ検出器402、遅延エクステンダー404、および等価クエリセットジェネレーター406を含み、これらは、フローチャート300を参照しながら以下のように説明される。
[0049]フローチャート300はステップ302で始まる。ステップ302において、複数のクエリがプログラムコード内で検出される。図1に示されるように、クエリオプティマイザー104は、クエリ110を含むプログラムコード106を受け取る。図4のクエリ検出器402は、クエリを検出するためにプログラムコード106を初めから終わりまで解析するように構成される。クエリ検出器402は、プログラムコード106内の符号語を、知られているクエリ演算子/構成要素、等の所定のリストと比較することなどによる、任意の手法でクエリを検出することができる。例えば、LINQクエリを検索するとき、クエリ検出器402は、Select、Where、Sum、Min、Max、Average、Aggregate、Join、GroupJoin、OrderBy、GroupBy、Union、Contains、Count、ToList、ToDictionary、等などの、知られているLINQ演算子についてプログラムコード106を初めから終わりまで解析することができる。それぞれの見つけられたクエリ演算子(例えば、テキストマッチングによって見つけられたクエリ演算子)は、プログラムコード106のクエリとしてクエリ検出器402によって示される。
[0050]1つの例証となる例において、クエリ検出器402は、クエリについて以下のプログラムコードを解析することができる。
Figure 0006911059
この例では、クエリ検出器402は、コードの3行目にOrderby(x=>x)およびToList()のLINQクエリ、ならびにコードの4行目にOrderByDescending(x=>x)およびToList()のLINQクエリを検出することができる。
[0051]ステップ302(およびフローチャート300の残り)は、任意の適切なコード開発ツールまたはアプリケーション内のクエリオプティマイザー104によって実装されてよいということに留意されたい。例えば、図5は、実施形態の1つの例による、コードエディター内に提案される置換クエリセットを生成し、提示するための処理を示すフローチャート500を示す。1つの実施形態において、図3のフローチャート300は図5のフローチャート500を実装することができる。例えば、フローチャート300のステップ302はフローチャート500のステップ502を実装することができ、ステップ504は、フローチャート300への追加のステップであってよい。フローチャート500は以下のように説明される。
[0052]ステップ502において、コードエディター内でプログラムコード内のクエリが検出される。1つの実施形態において、クエリ検出器402は、開発者がプログラムコードをエンターし、編集するコードエディター202(図2)などのコードエディター内で、プログラムコード106内のクエリを検出するように構成されてよい。クエリ検出器402は、定期的に、および/または他の任意の所望の時間に、もしくはその時間毎に、(例えば、「クエリ検出」ボタンをクリックすることによって)開発者によってリクエストされるのに応答して、開発者がコードを保存するときはいつでも、開発者がコードをエンターしながら、プログラムコード106内のクエリ用語検索を行うことができる。
[0053]例えば、図6は、実施形態の1つの例による、プログラムコード106を表示するコードエディターウィンドウ604を含むコンピューティングデバイス102のブロック図を示す。ディスプレイ602は、LCD(液晶ディスプレイ(liquid crystal display))、CRT(陰極線管(cathode ray tube))ディスプレイ、LED(発光ダイオード(light emitting diode))ディスプレイ、プラズマディスプレイ、等を含む、任意の適切なタイプの表示デバイスまたは画面であってよい。コードエディターウィンドウ604は、コードエディターウィンドウ604に表示されるプログラムコード106と対話するためのグラフィカルユーザーインターフェース(GUI:graphical user interface)として、ディスプレイ602内のコードエディター202によって表示される(フレームのある、またはフレームのない)ウィンドウである。コードライン606、608、および610は、当業者に知られているような任意の適切なプログラミング言語のコードのそれぞれの1つまたは複数のラインである。1つの実施形態において、クエリ検出器402は、ステップ502に従って、クエリについてコードライン606、608、および610を含むプログラムコード106を解析する。
[0054]ステップ504において、複数のクエリを機能的に等価なクエリセットで置き換えるために、コードエディターがプログラムコードを自動的にリファクタリングするオプションが提示される。1つの実施形態において、クエリオプティマイザー104がクエリを検出し、(本明細書の他の場所でさらに説明されるように)プログラムコード106内で検出されたクエリを置き換えるためにさらに効率的なクエリを決定した後、コードエディター202は、決定されたさらに効率的なクエリを開発者が受け入れるか、または却下するためのオプションを提示することができる。例えば、図6に示されるように、提案された置換クエリセット612が、開発者による受諾または却下のためにコードエディターウィンドウ604に表示されてよい。提案された置換クエリセット612は、プログラムコード106内で検出されたクエリセットより効率的であると、クエリオプティマイザー104によって決定されたクエリの提案されたセットである。(例えば、ボタンをクリックすることによって)提案された置換クエリセット612を開発者が受け入れると、コードエディター202は、プログラムコード106内で、クエリの検出されたセットを、提案された置換クエリセット612で置き換え、リファクタリングされたプログラムコード108を生成し、コードエディターウィンドウ604に表示することができる。提案された置換クエリセット612を開発者が却下すると、プログラムコード106に対する変更は行われず、提案はもはや表示されない。別の実施形態において、提案された置換クエリセット612は、(開発者の受諾をリクエストすることなく)プログラムコード106に自動的に実装されてよいということに留意されたい。
[0055]別の実施形態において、上述のように、クエリ検出器402は、コンパイル中にプログラムコード106内のクエリを検出するように構成されてよい。例えば、図7は、実施形態の1つの例による、コンパイル時に置換クエリセットを生成して実装するための処理を示すフローチャート700を示す。1つの実施形態において、図3のフローチャート300は、図7のフローチャート700を実装することができる。例えば、フローチャート300のステップ302は、フローチャート700のステップ702を実装することができ、ステップ704は、フローチャート300への追加のステップであってよい。フローチャート700は以下のように説明される。
[0056]ステップ702において、コンパイル中にプログラムコード内のクエリが検出される。1つの実施形態において、クエリ検出器402は、プログラムコード106がコンパイルされるときに、コンパイラ204(図2)などのコンパイラで(例えば、テキストマッチング等によって)プログラムコード106内のクエリを検出するように構成されてよい。
[0057]ステップ704において、複数のクエリが機能的に等価なクエリセットで置き換えられたバージョンのプログラムコードに基づき、コンパイラにおいてコンパイルされたコードが生成される。1つの実施形態において、下記にさらに詳細に説明されるように、クエリオプティマイザー104は、クエリ検出器402によってプログラムコード106内で検出されたクエリのさらに効率的な置換クエリセットを生成すること、プログラムコード106のコピー内で、検出されたクエリを置換クエリセットと置き換えて、リファクタリングされたプログラムコード108を生成すること、およびリファクタリングされたプログラムコード108をコンパイルすることによって、コンパイルされたバージョンのプログラムコード106を生成することを行うように構成される。このように、プログラムコード106を変更することなく、さらに効率的に動作するクエリセットを含むコンパイルされた機械語が生成されるので、開発者は、コードエディター202内でプログラムコード106を後で編集する際に、変更されたクエリがわからない。しかし、別の実施形態において、置換クエリセットは、(開発者の受諾をリクエストすることなく)コンパイル時にプログラムコード106に自動的に実装されてよい。
[0058]図3のフローチャート300を再び参照すると、ステップ304において、プログラムコード内でクエリが評価される遅延が拡大される。1つの実施形態において、遅延エクステンダー404は、クエリ検出器402によってプログラムコード106内で検出されたクエリを分析すること、および(プログラムコードが実行されるときに)クエリの評価の遅延を拡大させることを行うように構成される。「遅延評価」は、数式の値が必要とされるまで数式の評価を遅らせる評価技法を指す。遅延エクステンダー404はクエリを受け取り、その演算子の実行をできるだけ後に先送りするように構成される。したがって、遅延エクステンダー404は、プログラムコード106を分析してクエリの評価を遅らせることができるクエリを決定し、クエリを遅らせて実行する1つまたは複数の等価のクエリ文を決定する。
[0059]例えば、図8は、実施形態の1つの例による、プログラムコード内のクエリ実行の遅延を拡大させるための処理を示すフローチャート800を示す。1つの実施形態において、遅延エクステンダー404は、フローチャート800に従って動作する。フローチャート800は、図9に関連して以下のように説明される。図9は、実施形態の1つの例による、遅延エクステンダー404のブロック図を示す。図9に示されるように、遅延エクステンダー404は、延期可能(extendable)クエリ検出器902およびクエリ式アセンブラ904を含む。
[0060]フローチャート800はステップ802で始まる。ステップ802において、評価延期可能なクエリのうちの1つまたは複数が検出される。1つの実施形態において、遅延エクステンダー404の延期可能クエリ検出器902は、プログラムコード106内のクエリの現在の場所にクエリの出力値は必要ではないが、その代わりに後で使用されるので、プログラムコード106を分析してクエリの評価を遅らせることができるクエリを決定する。このような実施形態において、延期可能クエリ検出器902は、クエリの値が直接的にユーザーに出力される場所、または数式がクエリの値を使用してユーザーへの出力を生成する場所などの、クエリの値が必要とされる場所、またはその場所に比較的近い場所(例えば、数式、コードライン、等)を見つけるために、特定のクエリに対して、プログラムコード106内の当該クエリを越えて解析するように構成される。
[0061]1つの実施形態において、延期可能クエリ検出器902は、検出されたクエリ906の各クエリに対して、演算ツリーなどのデータ構造を構築することによって始まり、このデータ構造は、プログラムコード内でクエリ検出器402によって検出されたクエリ、ならびにクエリではないプログラムコードの演算を含む。延期可能クエリ検出器902は、同じ演算ツリーの下にある複数の関連するクエリを合わせてリスト化する。このような演算ツリーはグラフとして表されてよく、ここで各ノードは、データソースから実際のデータをフェッチしない(例えば、データに対して演算を行う)クエリのマッチングクエリ演算子を表し、演算ツリーの各リーフは、データソースから実際のデータをフェッチするクエリのクエリ演算子を表す。延期可能クエリ検出器902は、プログラムコード内の各変数/クエリ演算子/方法/コード文に従うこと、および演算ツリーにデータを再帰的に追加することによって演算ツリーを構築する。したがって、延期可能クエリ検出器902はクエリを受け取り、これらを関連するツリーに変換する。
[0062]例えば、1つの例において、延期可能クエリ検出器902は、以下のプログラムコードを分析し、LINQクエリの評価を遅らせる1つまたは複数のLINQクエリを決定することができる。
Figure 0006911059
このプログラムコードの例は、OrderBy、ToList、およびFirstという検出されたLINQクエリを含む。延期可能クエリ検出器902は、以下の演算ツリーを指定する。
Figure 0006911059
ここで、1stOfPrimesは、演算ツリーの最高レベルの要素であり、Firstは、演算ツリーの最低レベルの要素である。この例において、1stOrderedの値はすぐに必要とされない(後のコードラインに対する入力である)が、Firstはリーフであり、したがって延期可能であると示されないので、延期可能クエリ検出器902は、延期可能(遅らせる実行)としてOrderByおよびToListを示す。
[0063]別の例において、延期可能クエリ検出器902は、以下のプログラムコードを分析し、LINQクエリの評価を遅らせる1つまたは複数のLINQクエリを決定することができる。
Figure 0006911059
このプログラムコードの例は、OrderBy、ToList、OrderByDescending、ToList、First、およびFirstという検出されたLINQクエリを含む。延期可能クエリ検出器902は、以下の第1および第2のブランチを有する演算ツリーを指定する。
Figure 0006911059
この演算ツリーでは、共通の1stOfPrimesの要素は最高レベルの要素であり、OrderByおよびOrderByDescendingのノードは、1stOfPrimesの要素にリンクされた共通のReturnListOfPrimesのノードに分岐する。この例において、延期可能クエリ検出器902は、1stOrderedおよびLastOrderedの値はすぐに必要とされない(後のコードラインに対する入力である)が、第1のブランチ内のFirstおよび第2のブランチ内のFirstは両方リーフであり、したがって延期可能であると示されないので、延期可能(遅らせる実行)として第1のブランチ内のOrderByおよびToList、ならびに第2のブランチ内のOrderByDescendingおよびToListを示す。
[0064]さらなる別の例において、延期可能クエリ検出器902は、以下のプログラムコードの例を分析し、LINQクエリの評価を遅らせる1つまたは複数のLINQクエリを決定することができる。このプログラムコードの例は、2から1000の範囲内の最後の素数を見つけるようにデザインされる。
Figure 0006911059
この例において、第3のメソッド(「MainMethod」)は、初めの方の2つのメソッド(「ReturnListOfPrimes」および「ReturnDictionaryOfPower」)を参照する。第1のメソッドは、Range、Where、およびToListというクエリコンポーネントを含む。第2のメソッドは、クエリコンポーネントToDictionaryを含む。第3のメソッドは、クエリコンポーネントLastを含む。クエリ検出器402は、3つのメソッド内でこれらのクエリを検出する(図3のステップ302)。図9に示されるように、延期可能クエリ検出器902は、検出されたクエリ906を受け取り、これは、プログラムコード内でクエリ検出器402によって検出されたクエリを含む。1つの実施形態において、延期可能クエリ検出器902は、(例えば、簡潔さのために本明細書に図示していない演算ツリーを生成することによって、)検出されたクエリ906およびプログラムコード106を分析し、検出されたクエリがプログラムコード106内で遅延として評価されてよいかどうかを判定する。
[0065]具体的には、第3のメソッドは4つのコードラインを含む。第3のメソッドが実行されると、1行目は第1の値のために第1のメソッドにアクセスし、2行目は(第1の値に基づいて)第2の値のために第2のメソッドにアクセスし、3行目は第2の値に関連するクエリ(Last)を実行して第3の値を生成し、4行目は第3の値に基づいて出力を生成する。したがって、延期可能クエリ検出器902は、1行目および2行目がすぐに必要とされない(例えば、ユーザーまたはデータベースに出力されない)が、代わりに後のコードラインへの入力として使用される値を生成するということを判定するので、1行目および2行目内のクエリの評価は遅らせることができる。図9に示されるように、延期可能クエリ検出器902は延期可能クエリ908を出力し、これは、延期可能クエリ検出器902によって延期可能であると判定されたクエリを示す。
[0066]図8のフローチャート800を再び参照すると、ステップ804において、1つまたは複数の評価延期可能なクエリを含む単一のクエリ式が形成される。1つの実施形態において、クエリ式アセンブラ904は延期可能クエリ908を受け取り、(ステップ802において)評価を延期可能であると判定されたクエリを含む単一のクエリ式を生成する。図9に示されるように、クエリ式アセンブラ904は修正されたクエリ910を生成し、これは、プログラムコードに対して延期可能クエリ検出器902によって決定された、評価延期可能なクエリを組み合わせる単一のクエリ式を含む。特定のプログラムコードに関して、クエリ式アセンブラ904は、評価延期可能なクエリを組み合わせるこのようなクエリ式のうちの1つまたは複数を生成することができるということに留意されたい。別々のクエリを単一のクエリ式に組み合わせるためにクエリ式アセンブラ904によって行われる技法は、当業者に知られており、特定の問い合わせ言語(query language)に依存する。1つの例において、数式内の変数は、変数を決定するために他の場所で使用される数式と置き換えられてよい。
[0067]例えば、上記プログラムコードの例について、クエリ式アセンブラ904は、式「var lastItem」に関して以下の単一のクエリ式を生成することができ、これは、第1および第2のメソッドのLINQクエリ、第3のメソッドの最初の3つのラインを含む。
Figure 0006911059
上記に示すように、式「var lastItem」は、3つのすべてのメソッドのクエリコンポーネントRange、Where、ToList、ToDictionary、およびLastを含むクエリコンポーネントの集約セットであり、さらに上記に示された元のプログラムコードに機能的に等価である。このように、クエリコンポーネントRange、Where、ToList、ToDictionary、およびLastは、「MainMethod」が実行されると、遅延として評価され、「lastItem」の出力が提示される直前に評価されるだけである。
[0068]1つの実施形態において、クエリ式アセンブラ904は、クエリに対して延期可能クエリ検出器902によって生成される演算ツリーを受け取ることによって動作し、演算ツリーのデータ構造の中で、リーフでなければクエリ実行が明確に「無効化される」ようにするクエリ演算子を指示/マークすることができるということに留意されたい。言い換えると、クエリ式アセンブラ904は、クエリ実行がリーフに対してのみ起こるという手法で演算ツリーにマークすることができ、それによって最新の時点にクエリの遅延を拡大させる。
[0069]図3のフローチャート300を再び参照すると、ステップ306において、複数のクエリよりも効率的に評価する、当該複数のクエリと機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットがクエリコンポーネントに適用される。1つの実施形態において、等価クエリセットジェネレーター406(図4)は、検出されたクエリ(図1のクエリ110)を分析すること、および検出されたクエリに機能的に等価な代替クエリセット(図1の置換クエリ112)を生成することを行うように構成され、さらに、検出されたクエリの元の構成より効率的に実行する。例えば、等価クエリセットジェネレーター406は、プログラムコードによって使用されないデータを取得しないようにすること、データを冗長に取得しないようにすること、出力に対する効果のないデータに対して演算しないようにすること、等のために、置換クエリ112を生成することができる。これらの効率性を実践するために、等価クエリセットジェネレーター406は、クエリコンポーネントを取り除き、クエリコンポーネントを追加し、および/またはクエリコンポーネントを修正することができる。
[0070]等価クエリセットジェネレーター406は、その機能を様々な方式で行うことができる。例えば、図10は、1つの実施形態の例による、プログラムコードに対する置換クエリセットを決定するためにルールセットを適用するための処理を示すフローチャート1000を示す。等価クエリセットジェネレーター406は、1つの実施形態におけるフローチャート1000に従って動作することができる。フローチャート1000は、図11に関して以下のように説明される。図11は、実施形態の1つの例による、等価クエリセットジェネレーター406のブロック図を示す。図11に示されるように、等価クエリセットジェネレーター406は、前後関係決定器1104およびルールセレクター1106を含み、ルールセット216を収めるストレージ210と通信連結される。
[0071]フローチャート1000はステップ1002で始まる。ステップ1002において、複数のクエリコンポーネント間の共通の論理的な前後関係が決定される。図11に示されるように、前後関係決定器1104は修正されたクエリ910を受け取り、このクエリは、クエリ検出器402によって検出され、遅延エクステンダー404によってさらなる遅延評価のために書き直されたクエリである。前後関係決定器1104は、共通の論理的な前後関係について、修正されたクエリ910を分析する。例えば、前後関係決定器1104は、単一のクエリ式である可能性のある、修正されたクエリ910をクエリコンポーネントのセットに分解することができ、クエリコンポーネントを互いに比較する。類似のまたは関連するタイプのクエリコンポーネントが検出されると(例えば、OrderBy、およびOrderByDescending、等)、クエリコンポーネント間の共通の論理的な前後関係が成立する。図11に示されるように、前後関係決定器1104は、前後関係からみて関連のあるクエリ1114を出力し、これは、前後関係からみて関連のある修正されたクエリ910のクエリコンポーネントのグループを含む。
[0072]ステップ1004において、共通の論理的な前後関係に対応するルールセットのルールが、複数のクエリコンポーネントに適用される。図11に示されるように、ルールセレクター1106は、前後関係からみて関連のあるクエリ1114を受け取る。ルールセレクター1106は、第1のルール1108、第2のルール1110、等などの、ルールセット216のルールの適用性について、前後関係からみて関連のあるクエリ1114を分析する。ルールセット216の各ルールは、対応する共通の前後関係があるクエリコンポーネントに適用されること、ならびに前後関係からみて関連のあるクエリのクエリコンポーネントを追加、修正、および/または削除することなどによって、より高い効率性のクエリコンポーネントに書き換えることを行うように構成される。ルールの任意の数および多様性がルールセット216に含まれてよい。ルールセット216に含まれ得るルールの7つの例が、例証のために以下のように説明される。各ルールは、ルールの機能/仕組みについての例示的なルール名、概要、および説明によって下記に説明される。
[0073](A)ルール名:OrderByミニマイザ
概要:不必要なOrderBy演算を無くすために使用される
ルールの仕組み:OrderByミニマイザは、プログラムコード内で見つけられたOrderBy演算子のリストを1ステップずつ実行し、プログラムコード内で結果が使用されることのないOrderBy演算子のいずれかを見つける(ここで「使用される」は、OrderBy演算子によって行われる順序付けが、後の数式またはメソッドによって依存されない、つまり後の数式またはメソッドによって出力されないか、または要求されないということを意味する)。このような見つけられたOrderBy演算子に対して、OrderByミニマイザは、冗長であるとしてプログラムコードからOrderBy演算子を削除し、コードライン文の削除(例えば、変数名を置き換えること、等)によって影響を受けるプログラムコードの他の任意のラインを書き換える。
[0074](B)ルール名:ToCurrentコレクション
概要:「ToList」、「ToDictionary」、等の「ToCurrent」タイプの演算子を何度も連続して実行する複雑なクエリの場合に使用される。これらのToCurrent演算子のそれぞれはコストがかかり、これらのシーケンス内では、これらはシーケンス内のlast演算子を除いて冗長である。
ルールの仕組み:クエリコンポーネントの集約セット(例えば、フローチャート800のステップ804で生成された複数のクエリコンポーネントを収める単一のクエリ式)内のこのような演算子のうちの2つ以上のパターンが検出される。ToCurrentタイプの演算子のすべては、(ロジックを変更することなく)1つを除いてクエリコンポーネントの集約セットから廃棄される。
[0075](C)ルール名:DataRetrivalミニマイザ−タイプ1
概要:クエリ演算子によってリクエストされた大量のデータが最終的に使用されないときに使用されるので、データ取得が問題なく減らされるか、または全く行われないこともある。
ルールの仕組み:クエリ演算子がデータを取得する、取得されたデータがソートされる、およびソートされたデータのうちの最初または最後の要素だけが使用されるというパターンが検出される。このクエリを、データからの最低値の要素または最大値の要素の取得をそれぞれ行うだけのクエリで置き換える。
[0076](D)ルール名:DataRetrivalミニマイザ−タイプ2
概要:クエリ演算子によってリクエストされた大量のデータが最終的に使用されないときに使用されるので、データ取得が問題なく減らされるか、または全く行われないこともある。
ルールの仕組み:クエリ演算子がデータを取得する、およびデータの最初または最後の要素だけが使用されるというパターンが検出される。このクエリを、データから任意のランダムのデータ要素を取得するだけのクエリで置き換える。
[0077](E)ルール名:DataRetrivalミニマイザ−タイプ3
概要:単一の非常に大きいデータエンティティが取得されるが、データの一部だけが最終的に使用されるときに使用される。
ルールの仕組み:大きいデータセット(例えば、XMLデータ、JSONデータ、ファイル全体、等)である可能性のあるデータがリクエストされるが、取得されたデータのサブセットだけが使用されることになるというパターンが検出される。このクエリを、データのサブセットを取得するだけのクエリで置き換える。
[0078]「DataRetrivalミニマイザ−タイプ3」のルールの適用性の例は以下を含む。
[0079](1)ファイルの取得をリクエストするが、(ファイルの内容を使用するのではなく)ファイルのメタデータだけを最終的に使用してファイルがどれだけ大きいかを判定する。このルールは、クエリ演算子を使用してファイル全体を取得しないようにし、代わりにクエリ演算子を使用してファイルのメタデータを取得するために使用されてよい(メタデータは、ファイル全体よりサイズが小さい、いくつかのファクタであることがある)。
[0080](2)単一のデータベースのラインまたはエンティティをリクエストし、このライン/エンティティの単一の列だけを最終的に使用する。DBのライン/エンティティの全体は非常に大きいことがある。このルールは、クエリ演算子を、所望の列だけを取得する別のクエリ演算子と置き換えるために使用されてよい。
[0081](F)ルール名:列挙反復ミニマイザ
概要:クエリが単一の値を利用しているときに使用されるので、メモリ内でデータ全体の構造を構築する必要はない。
ルールの仕組み:「ToCurrent」タイプの演算子の後の単一の値だけが使用されるというパターンが検出される。最初のものを後のものにスイッチする。
[0082](G)ルール名:Last()演算子を使用する際の列挙の逆転
概要:最後の項目だけが必要とされる場合に使用されるので、開始から終了までを列挙することは非効率的である。逆の順序で列挙することによって、性能を向上させる。
ルールの仕組み:「ToCurrent」タイプの演算子の後の最後の値だけが使用されるというパターンが検出される。列挙を、その「逆の(reverse)」マッチング演算子と置き換える、および/または列挙範囲の値を逆転させる、ならびに演算子「Last」を演算子「First」と置き換える。
[0083]さらなる例証として、上記で生成された単一のクエリ式、説明を簡単にするために下記に繰り返す、に対してルールの例を適用する。
Figure 0006911059
上述のように、この機能的に等価なクエリコンポーネントの集約セットを生成するために、遅延評価が拡大された(フローチャート300のステップ304、遅延エクステンダー404)。さらに、この単一のクエリ式の効率性は、ルールセット216のルールを適用することによってさらに改善されることがある(フローチャート300のステップ306、等価クエリセットジェネレーター406)。
[0084]例えば、ToCurrentコレクションミニマイザのルール(上記のルール(B))が適用されてよい。このような場合、前後関係決定器1104は、共通の論理的な前後関係を成立させる上記のクエリ文内でToListおよびToDictionary演算子を検出する。ルールセレクター1106は、ToCurrentコレクションミニマイザのルールを適用し、このルールは、ルールセット216内でこの共通の論理的な前後関係と関連付けられる。ToCurrentコレクションミニマイザのルールは、最後の1つを除いてクエリ文からすべてのToCurrent演算子を除去し、以下のさらに効率的で、機能的に等価なクエリ式を生成する。
Figure 0006911059
[0085]さらに、ToCurrent文(この場合、ToDictionary)の前に配置されるように、Last()/First()演算子を移す列挙反復ミニマイザのルール(上記のルール(F))が使用されてよい。このように、クエリ文は、第1の項目が見つけられるまで反復するので、データ構造すべてが埋められるわけではない。代わりに、ToDictionary演算子は、単一のエンティティに対して演算する。したがって、前後関係決定器1104は、共通の論理的な前後関係を成立させるために、上記のクエリ文内のLast演算子が続くToDictionary演算子を決定する。ルールセレクター1106は列挙可能な反復ルールを適用し、これは、この共通の論理的な前後関係と関連付けられる。列挙可能な反復ルールは、ToDictionary演算子の前にLast演算子を移して、以下のさらに効率的で、機能的に等価なクエリ式を生成する。
Figure 0006911059
[0086]さらに、最後の項目を検索する順序を逆転させる、Last()演算子を使用する際の列挙の逆転(上記のルール(G))が、使用されてよい。これは、これが、最後の項目を探す時に逆の順序で行うのにさらに一層効率的だからである。したがって、このルールは逆の順序で数字を列挙し、最後の要素ではなく最初の要素を採用する。したがって、前後関係決定器1104は、共通の論理的な前後関係を成立させるために、上記のクエリ文内のToDictionary演算子の直前のLast演算子を決定する。ルールセレクター1106は、この共通の論理的な前後関係に関連のある列挙可能なルールの最適化を適用する。列挙可能なルールの最適化は、Last演算子を第1の演算子で置き換えて、以下のさらに効率的で、機能的に等価なクエリ式を生成する。
Figure 0006911059
この最終的なクエリは、1100から始まる整数に対して減少方向に反復し、その中で最初の素数を見つけ、さらに上記に示された元の3つのメソッドのバージョンよりも、(例えば、より少ないメモリを使用してデータを格納し、CPUをより良く使用して)これを一層効率的に行う。
[0087]1つの実施形態において、等価クエリセットジェネレーター406は、単一の機能的に等価なクエリセットを決定するために、これ以上のルールが適用されることがなくなるまで、ルールセット216のルールを順次適用することができるということに留意されたい。別の実施形態において、機能的に等価なクエリセットの複数の様々なセットが、等価クエリセットジェネレーター406によって決定されてよく、それぞれの決定されたセットは、プログラムコード106内の検出されたクエリを置き換えるために適用可能である。このような実施形態において、ルールセレクター1106は、機能的に等価なクエリセットのうちの1つを開発者が手動で選択してプログラムコード106に適用し、リファクタリングされたプログラムコード108を生成することを可能にすることができる。一方、ルールセレクター1106は、選択を自動的に行うこともできる。
[0088]例えば、図12は、1つの実施形態の例による、複数の候補となる機能的に等価なクエリセットを生成して、この中から選択するための処理を示すフローチャート1200を示す。1つの実施形態において、ルールセレクター1106は、フローチャート1200を実行することができる。フローチャート1200は以下のように説明される。
[0089]ステップ1202において、ルールセットのルールの複数の組合せをクエリコンポーネントに適用することが、複数の候補となる機能的に等価なクエリセットを生成するために評価される。1つの実施形態において、ルールセレクター1106は、様々な機能的に等価なクエリセットを生成するために、ルールの様々な組合せおよび/または順序をプログラムコードに適用することができる。例えば、特定のプログラムコードは、クエリコンポーネントOrderBy、GroupBy、およびThenByをクエリ式に含むことができる。ルールセレクター1106は、OrderByおよびGroupByを第1のクエリ演算子で置き換える第1のルールをクエリ式に適用して、第1の機能的に等価なクエリセットを生成することができ、その後、代替として、GroupByおよびThenByを第2のクエリ演算子で置き換える第2のルールをクエリ式にさらに適用して、第2の機能的に等価なクエリセットを生成することができる。このように、2つの機能的に等価なクエリセットが同じクエリ式に対して生成され、これらは、これら自体の効率特性をそれぞれ有することができる。クエリ式内の特定のクエリ演算子、およびルールセット216に利用可能なルールに応じて、任意の数の機能的に等価なクエリセットが同じクエリ式に対して生成されてよい。
[0090]ステップ1204において、複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する1つの候補となる機能的に等価なクエリセットが選択されて、生成された機能的に等価なクエリセットとなる。上記の例において、ルールセレクター1106は、第1および第2の機能的に等価なクエリセットのどちらをプログラムコードにリファクタリングすべきかを、開発者が選択することを可能にすることができ、また第1および第2のクエリコンポーネントのどちらをプログラムコードにリファクタリングすべきかを、自動選択することもできる。例えば、ルールセレクター1106は、最大効率を有する利用可能な機能的に等価なクエリセットのうちの1つを選択することができる。この最大効率は、様々な方式で決定されてよい。
[0091]例えば、ルールセット216内の各ルールは、ルールの相対的な効率性を示す、対応する効率性の値(例えば0から1の数字)を有することができる。ルールセレクター1106は、この機能的に等価なクエリセットの全体的な効率性の値を決定するために、特定の機能的に等価なクエリセットに対して使用されるルールのそれぞれに対する効率性の値を組み合わせることができ、その後、すべての機能的に等価なクエリセットに対する全体的な効率性の値を比較して、どちらが最大効率を有するかを判定することができる。他の実施形態において、ルールセレクター1106は、他の方式で最大効率を決定することができる。
[0092]1つの実施形態において、フローチャート1200は、コンパイル時または実行時に実行されてよいということに留意されたい。例えば、実行時に、実行可能なバージョンのプログラムコード106またはリファクタリングされたプログラムコード108(例えば、機械語222)は、(例えば、オペレーティングシステム内、等で)実行エンジンによって実行されてよい。実行時の実施形態によれば、最善の候補となる機能的に等価なクエリセットが、実際のシステムの健全性の状態を考慮に入れる方式で決定されてよい。これは、候補となる機能的に等価なクエリセットのうちの1つまたは複数によってもたらされる効率性の向上が、実行時の実行条件に少なくとも部分的に依存するからである。例えば、実行時に、実行可能なバージョンのプログラムコードは実行することができ、特定のクエリが実行されることになると、実行時の条件(例えば、ネットワーク条件、利用可能な処理帯域幅、利用可能な処理能力、等)に基づいて、どちらの候補となる機能的に等価なクエリセットを実行すべきかを選択するために、プログラムコードによって、(例えば実行エンジンによって実行されることがある)ルールセレクター1106に対するコールが行われてよい。
[0093]例えば、通常の実行時の条件(例えば、十分なネットワーク可用性、等)において、候補となる機能的に等価なクエリセットAは、機能的に等価なクエリセットBより効率的である可能性がある。しかし、特定の実行中に、低速インターネット接続、等などの望まれない何かが、機能的に等価なクエリセットAのクエリコンポーネントの性能を妨げることがある。したがって、このような実行時の条件(例えば、不十分なネットワークレスポンス)では、(クエリセットAではなく)機能的に等価なクエリセットBがさらなる効率性をもたらすことがあるので、ルールセレクター1106によって、この特定の実行中に実行されるように選択されてよい。したがって、実施形態において、ルールセレクター1106は実行時に、候補となる機能的に等価なクエリセットの選択を可能にするように構成されてよい。
[0094]ルールは、手動または自動を含む任意の手法でルールセット216に追加されてよいということに留意されたい。例えば、開発者は、開発者がわかるような、または知っているようなクエリで特定の効率性の問題を解決したいという要望を含む、開発者の経験に基づいて、ルールをルールセット216に追加することができる。別の実施形態において、自動メカニズムは、機械学習を組み込む自動メカニズムを含む、新しいルールを生成することができる。機械学習は、相対的な効率性のために実行中に等価なクエリをサンプリングするため、およびこれに基づいて、このシナリオに対する最も効率的なクエリを自動選択するために使用されてよい。ルールによって提供されるそれぞれのクエリ最適化に関して、クエリオプティマイザー104は、クエリ最適化によって受ける影響の詳細な分析を維持することができる。
III.携帯型および据置型デバイスの実施形態の例
[0095]コンピューティングデバイス102、クエリオプティマイザー104、コンパイラ204、開発アプリケーション200、ソースコードエディター202、コンパイラ204、デバッガーツール206、クエリ検出器402、遅延エクステンダー404、等価クエリセットジェネレーター406、延期可能クエリ検出器902、クエリ式アセンブラ904、内容決定器1104、ルールセレクター1106、フローチャート300、フローチャート500、フローチャート700、フローチャート800、フローチャート1000、およびフローチャート1200は、ハードウェア、またはソフトウェアおよび/もしくはファームウェアと組み合わされたハードウェアに実装されてよい。例えば、クエリオプティマイザー104、コンパイラ204、開発アプリケーション200、ソースコードエディター202、コンパイラ204、デバッガーツール206、クエリ検出器402、遅延エクステンダー404、等価クエリセットジェネレーター406、延期可能クエリ検出器902、クエリ式アセンブラ904、内容決定器1104、ルールセレクター1106、フローチャート300、フローチャート500、フローチャート700、フローチャート800、フローチャート1000、および/またはフローチャート1200は、1つまたは複数のプロセッサ内で実行され、コンピューター可読ストレージ媒体に格納されるように構成されたコンピュータープログラムコード/命令として実装されてよい。一方、コンピューティングデバイス102、クエリオプティマイザー104、コンパイラ204、開発アプリケーション200、ソースコードエディター202、コンパイラ204、デバッガーツール206、クエリ検出器402、遅延エクステンダー404、等価クエリセットジェネレーター406、延期可能クエリ検出器902、クエリ式アセンブラ904、内容決定器1104、ルールセレクター1106、フローチャート300、フローチャート500、フローチャート700、フローチャート800、フローチャート1000、および/またはフローチャート1200は、ハードウェアロジック/電気回路機器として実装されてよい。
[0096]例えば、1つの実施形態において、クエリオプティマイザー104、コンパイラ204、開発アプリケーション200、ソースコードエディター202、コンパイラ204、デバッガーツール206、クエリ検出器402、遅延エクステンダー404、等価クエリセットジェネレーター406、延期可能クエリ検出器902、クエリ式アセンブラ904、内容決定器1104、ルールセレクター1106、フローチャート300、フローチャート500、フローチャート700、フローチャート800、フローチャート1000、および/またはフローチャート1200のうちの1つまたは複数は、任意の組合せで、SoCに合わせて実装されてよい。SoCは、プロセッサ(例えば、中央処理装置(CPU)、マイクロコントローラ、マイクロプロセッサ、デジタルシグナルプロセッサ(DSP:digital signal processor)、等)、メモリ、1つもしくは複数の通信インターフェース、および/またはさらなる回路のうちの1つまたは複数を含む集積回路チップを含んでよく、場合によっては、受け取られたプログラムコードを実行するか、および/または機能を実行するための埋込型ファームウェアを含んでもよい。
[0097]図13は、実施形態が実行され得るコンピューティングデバイス1300の例示的な実装形態を描写する。例えば、コンピューティングデバイス102および/またはクライアントコンピューティングデバイス104は、コンピューティングデバイス1300の1つまたは複数の特徴および/または代替の特徴を含む、据置型または携帯型コンピューターの実施形態における、コンピューティングデバイス1300に類似の1つまたは複数のコンピューティングデバイスに実装されてよい。本明細書で提供されるコンピューティングデバイス1300の説明が例証のために提供されるが、限定することを意図するものではない。実施形態は、当業者に知られているような、さらなるタイプのコンピューターシステムに実装されてよい。
[0098]図13に示されるように、コンピューティングデバイス1300は、プロセッサ回路1302と呼ばれる1つまたは複数のプロセッサ、システムメモリ1304、およびシステムメモリ1304を含む様々なシステム構成要素をプロセッサ回路1302に連結するバス1306を含む。プロセッサ回路1302は、中央処理装置(CPU)、マイクロコントローラ、マイクロプロセッサ、および/または他の物理ハードウェアプロセッサ回路として、1つまたは複数の物理ハードウェア電気回路デバイス要素および/または集積回路デバイス(半導体材料のチップもしくはダイ)に実装される電気的および/または光学的回路である。プロセッサ回路1302は、オペレーティングシステム1330、アプリケーションプログラム1332、他のプログラム1334、等のプログラムコードなどの、コンピューター可読媒体に格納されたプログラムコードを実行することができる。バス1306は、メモリバスまたはメモリコントローラ、周辺機器バス、アクセラレイティッドグラフィックスポート、および様々なバスアーキテクチャのいずれかを使用するプロセッサまたはローカルバスを含む、いくつかのタイプのバス構造のいずれかのうちの1つまたは複数を表す。システムメモリ1304は、リードオンリメモリ(ROM:read only memory)1308およびランダムアクセスメモリ(RAM:random access memory)1310を含む。基本入出力システム1312(BIOS:basic input/output system)は、ROM1308に格納される。
[0099]コンピューティングデバイス1300も、ハードディスクに読み書きするためのハードディスクドライブ1314、リムーバブル磁気ディスク1318に読み書きするための磁気ディスクドライブ1316、およびCD ROM、DVD ROM、または他の光媒体などのリムーバブル光ディスク1322に読み書きするための光ディスクドライブ1320といったドライブのうちの1つまたは複数を有する。ハードディスクドライブ1314、磁気ディスクドライブ1316、および光ディスクドライブ1320は、ハードディスクドライブインターフェース1324、磁気ディスクドライブインターフェース1326、および光学ドライブインターフェース1328のそれぞれによってバス1306に接続される。ドライブおよびこれらに関連のあるコンピューター可読媒体は、コンピューター可読命令、データ構造、プログラムモジュール、およびコンピューターの他のデータを非一時的に格納する。ハードディスク、リムーバブル磁気ディスク、およびリムーバブル光ディスクが説明されるが、フラッシュメモリカード、デジタルビデオディスク、RAM、ROM、および他のハードウェアストレージ媒体などの他のタイプのハードウェアベースのコンピューター可読ストレージ媒体がデータを格納するために使用されてよい。
[0100]いくつかのプログラムモジュールは、ハードディスク、磁気ディスク、光ディスク、ROM、またはRAMに格納されてよい。これらのプログラムは、オペレーティングシステム1330、1つまたは複数のアプリケーションプログラム1332、他のプログラム1334、およびプログラムデータ1336を含む。アプリケーションプログラム1332または他のプログラム1334は、クエリオプティマイザー104、コンパイラ204、開発アプリケーション200、ソースコードエディター202、コンパイラ204、デバッガーツール206、クエリ検出器402、遅延エクステンダー404、等価クエリセットジェネレーター406、延期可能クエリ検出器902、クエリ式アセンブラ904、内容決定器1104、ルールセレクター1106、(フローチャート300、フローチャート500、フローチャート700、フローチャート800、フローチャート1000、フローチャート1200の任意の適切なステップを含む)フローチャート300、フローチャート500、フローチャート700、フローチャート800、フローチャート1000、および/もしくはフローチャート1200、ならびに/または本明細書で説明されるさらなる実施形態を実装するための、例えば、コンピュータープログラムロジック(例えば、コンピュータープログラムコードまたは命令)を含むことができる。
[0101]ユーザーは、キーボード1338およびポインティングデバイス1340などの入力デバイスを通じてコマンドおよび情報をコンピューティングデバイス1300にエンターすることができる。他の入力デバイス(図示せず)は、マイクロフォン、ジョイスティック、ゲームパッド、パラボラアンテナ、スキャナ、タッチスクリーンおよび/もしくはタッチパッド、音声入力を受け取るための音声認識システム、ジェスチャ入力を受け取るためのジェスチャ認識システム、または同様のものを含むことができる。これらおよび他の入力デバイスは、バス1306に連結されるシリアルポートインターフェース1342を通じてプロセッサ回路1302に接続されることが多いが、パラレルポート、ゲームポート、またはユニバーサルシリアルバス(USB:universal serial bus)などの他のインターフェースによって接続されてもよい。
[0102]表示画面1344も、ビデオアダプタ1346などのインターフェースを介してバス1306に接続される。表示画面1344は、コンピューティングデバイス1300の外部にあるか、または組み込まれてよい。表示画面1344は情報を表示することができ、ならびに(例えば、タッチ、指を使ったジェスチャ、仮想キーボード、等によって)ユーザーコマンドおよび/または他の情報を受け取るためのユーザーインターフェースであってよい。表示画面1344に加えて、コンピューティングデバイス1300は、スピーカおよびプリンタなどの他の周辺機器出力デバイス(図示せず)を含むことができる。
[0103]コンピューティングデバイス1300は、アダプタもしくはネットワークインターフェース1350、モデム1352、またはネットワーク上で通信を確立するための他の手段を通じて、ネットワーク1348(例えば、インターネット)に接続される。モデム1352は、内部または外部にあってよいが、図13に示されるようにシリアルポートインターフェース1342を介してバス1306に接続されてよく、またパラレルインターフェースを含む別のインターフェースのタイプを使用してバス1306に接続されてもよい。
[0104]本明細書で使用されるように、ハードディスクドライブ1314に関連のあるハードディスク、リムーバブル磁気ディスク1318、リムーバブル光ディスク1322、RAM、ROM、フラッシュメモリカード、デジタルビデオディスク、ジップディスク、MEM、ナノテクノロジーベースのストレージデバイス、および物理的な/有形のハードウェアストレージ媒体のさらなるタイプ(図13のメモリ1320を含む)などの他の物理ハードウェア媒体などの、物理ハードウェア媒体を指すために、用語「コンピュータープログラム媒体」、「コンピューター可読媒体」、および「コンピューター可読ストレージ媒体」が使用される。このようなコンピューター可読ストレージ媒体は、通信媒体とは区別され、重複しない(通信媒体を含まない)。通信媒体は、搬送波などの変調データ信号内で、コンピューター可読命令、データ構造、プログラムモジュール、または他のデータを具体化する。用語「変調データ信号」は、その特性セットのうちの1つもしくは複数を有する、または信号内の情報をエンコードするような方式で変更された、信号を意味する。例として、また限定ではなく、通信媒体は、アコースティック、RF、赤外線、および他のワイヤレス媒体などのワイヤレス媒体、ならびに有線媒体を含む。実施形態は、コンピューター可読ストレージ媒体を対象とする実施形態とは別々で、重複していないこのような通信媒体も対象とする。
[0105]上述のように、(アプリケーションプログラム1332および他のプログラム1334を含む)コンピュータープログラムおよびモジュールは、ハードディスク、磁気ディスク、光ディスク、ROM、RAM、または他のハードウェアストレージ媒体に格納されてよい。このようなコンピュータープログラムは、ネットワークインターフェース1350、シリアルポートインターフェース1342、または他の任意のインターフェースのタイプを介して受け取られてもよい。このようなコンピュータープログラムは、アプリケーションによって実行されるか、またはロードされると、本明細書で論じられる実施形態の特徴をコンピューティングデバイス1300が実行することを可能にする。したがって、このようなコンピュータープログラムは、コンピューティングデバイス1300のコントローラに相当する。
[0106]実施形態は、任意のコンピューター可読媒体に格納されたコンピューターコードまたは命令を含む、コンピュータープログラム製品も対象とする。このようなコンピュータープログラム製品は、ハードディスクドライブ、光ディスクドライブ、メモリデバイスパッケージ、ポータブルメモリスティック、メモリカード、および他のタイプの物理ストレージハードウェアを含む。
IV.実施形態の例
[0107]1つの実施形態において、方法は、プログラムコード内の複数のクエリを検出することと、クエリがプログラムコード内でそこまでに評価される遅延を拡大させることと、検出されたクエリより効率的に評価する機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットを検出されたクエリに適用することとを含む。
[0108]1つの実施形態において、検出することが、コードエディター内でプログラムコード内のクエリを検出することを含み、方法が、複数のクエリを機能的に等価なクエリセットで置き換えるために、コードエディターがプログラムコードを自動的にリファクタリングするオプションを提示することをさらに含む。
[0109]1つの実施形態において、検出することが、コンパイル中にプログラムコード内のクエリを検出することを含み、方法が、プログラムコードのバージョンに基づくコンパイラでコンパイルされたコードを生成することであって、機能的に等価なクエリセットで複数のクエリが置き換えられる、生成することをさらに含む。
[0110]1つの実施形態において、クエリがプログラムコード内でそこまでに評価される遅延を拡大させることが、評価延期可能なクエリのうちの1つまたは複数を検出することと、1つまたは複数の評価延期可能なクエリを含む単一のクエリ式を形成することとを含む。
[0111]1つの実施形態において、ルールセットを適用することが、複数のクエリコンポーネント間の共通の論理的な前後関係を決定することと、共通の論理的な前後関係に対応するルールセットのルールを複数のクエリコンポーネントに適用することとを含む。
[0112]1つの実施形態において、生成された機能的に等価なクエリセットが、複数のクエリのクエリ結果より少ないメモリ空間しか消費せずに、複数のクエリより実行の時間がかからずに、複数のクエリより少ないネットワーク帯域幅しか消費せずに、または複数のクエリより少ない処理能力しか消費せずに、クエリ結果を生成することのうちの少なくとも1つによって、複数のクエリより効率的に評価する。
[0113]1つの実施形態において、ルールセットを適用することが、複数の候補となる機能的に等価なクエリセットを生成するために、ルールセットのルールの複数の組合せをクエリコンポーネントに適用することを評価することと、複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する1つの候補となる機能的に等価なクエリセットを選択して、生成された機能的に等価なクエリセットとすることとを含む。
[0114]1つの実施形態において、ルールセットを適用することが、複数の候補となる機能的に等価なクエリセットを生成するために、ルールセットのルールの複数の組合せをクエリコンポーネントに適用することを実行中に評価することと、複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する1つの候補となる機能的に等価なクエリセットを実行中に選択して、生成された機能的に等価なクエリセットとすることとを含む。
[0115]1つの実施形態において、候補となる機能的に等価なクエリセットのうちの1つまたは複数によってもたらされる効率性の向上が、実行時の実行条件に少なくとも部分的に依存する。
[0116]1つの実施形態において、方法が、機械学習を使用して少なくとも1つのルールを生成し、ルールセットに追加することをさらに含む。
[0117]別の実施形態において、コンピューティングデバイスは、少なくとも1つのプロセッサ回路と、少なくとも1つのプロセッサ回路によって実行されるように構成されたプログラムコードを格納する少なくとも1つのメモリであって、演算を行うように構成されたプログラムコードが、プログラムコード内の複数のクエリを検出すること、クエリがプログラムコード内でそこまでに評価される遅延を拡大させること、および検出されたクエリより効率的に評価する機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットを検出されたクエリに適用することを含む、少なくとも1つのメモリとを備える。
[0118]1つの実施形態において、検出することが、コードエディター内でプログラムコード内のクエリを検出することを含み、方法が、複数のクエリを機能的に等価なクエリセットで置き換えるために、コードエディターがプログラムコードを自動的にリファクタリングするオプションを提示することをさらに含む。
[0119]1つの実施形態において、検出することが、コンパイル中にプログラムコード内のクエリを検出することを含み、方法が、プログラムコードのバージョンに基づくコンパイラでコンパイルされたコードを生成することであって、機能的に等価なクエリセットで複数のクエリが置き換えられる、生成することをさらに含む。
[0120]1つの実施形態において、クエリがプログラムコード内でそこまでに評価される遅延を拡大させることが、評価延期可能なクエリのうちの1つまたは複数を検出することと、1つまたは複数の評価延期可能なクエリを含む単一のクエリ式を形成することとを含む。
[0121]1つの実施形態において、ルールセットを適用することが、複数のクエリコンポーネント間の共通の論理的な前後関係を決定することと、共通の論理的な前後関係に対応するルールセットのルールを複数のクエリコンポーネントに適用することとを含む。
[0122]1つの実施形態において、ルールセットを適用することが、複数の候補となる機能的に等価なクエリセットを生成するために、ルールセットのルールの複数の組合せをクエリコンポーネントに適用することを評価することと、複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する1つの候補となる機能的に等価なクエリセットを選択して、生成された機能的に等価なクエリセットとすることとを含む。
[0123]1つの実施形態において、ルールセットを適用することが、複数の候補となる機能的に等価なクエリセットを生成するために、ルールセットのルールの複数の組合せをクエリコンポーネントに適用することを実行中に評価することと、複数の候補となる機能的に等価なクエリセットのうちの最大効率ゲインを有する1つの候補となる機能的に等価なクエリセットを実行中に選択して、生成された機能的に等価なクエリセットとすることとを含む。
[0124]1つの実施形態において、候補となる機能的に等価なクエリセットのうちの1つまたは複数によってもたらされる効率性の向上が、実行時の実行条件に少なくとも部分的に依存する。
[0125]1つの実施形態において、演算が、機械学習を使用して少なくとも1つのルールを生成し、ルールセットに追加することをさらに含む。
[0126]別の実施形態において、コンピューティングデバイスは、少なくとも1つのプロセッサ回路と、少なくとも1つのプロセッサ回路によって実行されるように構成されたプログラムコードを格納する少なくとも1つのメモリであって、プログラムコードが、プログラムコード内の複数のクエリを検出するように構成されるクエリ検出器、クエリがプログラムコード内でそこまでに評価される遅延を拡大させるように構成される遅延エクステンダー、および検出されたクエリより効率的に評価する機能的に等価なクエリセットを生成するために、複数のルールを含むルールセットを検出されたクエリに適用するように構成される等価クエリセットジェネレーターを含む、少なくとも1つのメモリと、を備える。
V.結論
[0127]様々な本発明の実施形態が上述されたが、これらはほんの一例として提示され、限定されないということを理解されたい。添付の特許請求の範囲に規定されたような本発明の精神および範囲から逸脱することなく、形式および詳細の様々な変更が、その中で行われてよいということが当業者によって理解されよう。したがって、本発明の広がりおよび範囲は、上述の例示的な実施形態のいずれによっても限定されるべきではなく、以下の特許請求の範囲およびその均等物によってのみ定義されるべきである。

Claims (20)

  1. コンピューティングデバイスが実行する方法であって、
    プログラムコード内の複数のクエリを検出するステップと、
    前記クエリが前記プログラムコード内で評価されるまでの遅延を拡大させるステップと、
    前記プログラムコードの実行中に、前記複数のクエリが実行される前記コンピューティングデバイスの実行時の条件を決定するステップと、
    遅延を拡大させた前記クエリが、データセットを取得し、前記データセットをソートし、ソートされた前記データセットのサブセットを利用するように構成されていることを決定するステップと、
    前記プログラムコードの実行中に、決定された前記実行時の条件に関し、遅延を拡大させた前記クエリよりも効率的に評価する機能的に等価なクエリセットを、前記データセットの取得を最小化するルールに基づき生成するステップであって、前記ルールはルールセットに含まれ、前記ルールセットは、前記機能的に等価なクエリセットを、遅延を拡大させた前記クエリが、前記データセットを取得し、前記データセットをソートし、ソートされた前記データセットの前記サブセットを利用するように構成されていることを決定する前記ステップに応答して決定する、ステップと
    を含み、
    前記機能的に等価なクエリセットは、前記データセットの前記サブセットを、前記データセットの全体を取得すること及び前記データセットをソートすることの代わりに取得するよう構成された、方法。
  2. 請求項1に記載の方法であって、前記クエリが前記プログラムコード内で評価されるまでの遅延を拡大させる前記ステップは、
    前記クエリのうちの評価延期可能な1つまたは複数を検出するステップと、
    前記1つまたは複数の評価延期可能なクエリを含む単一のクエリ式を形成するステップと
    を含む、方法。
  3. 請求項1に記載の方法であって、生成する前記ステップは、
    複数のクエリコンポーネント間の共通の論理的な前後関係を決定するステップと、
    前記共通の論理的な前後関係に対応する前記ルールセットの第2のルールを前記複数のクエリコンポーネントに適用するステップと
    を含む、方法。
  4. 請求項1に記載の方法であって、生成された前記機能的に等価なクエリセットは、前記複数のクエリのクエリ結果より少ないメモリ空間しか消費せずにクエリ結果を生成することと、前記複数のクエリより実行の時間がかからずにクエリ結果を生成することと、前記複数のクエリより少ないネットワーク帯域幅しか消費せずにクエリ結果を生成することと、前記複数のクエリより少ない処理能力しか消費せずにクエリ結果を生成することとのうちの少なくとも1つによって、前記複数のクエリよりも効率的に評価する、方法。
  5. 請求項1に記載の方法であって、生成する前記ステップは、
    複数の候補となる機能的に等価なクエリセットを生成するために、前記ルールセットのルールの複数の組合せのクエリコンポーネントへの適用を評価するステップと、
    前記複数の候補となる機能的に等価なクエリセットのうち、最大効率ゲインを有する1つの候補となる機能的に等価なクエリセットを選択して、生成された前記機能的に等価なクエリセットとするステップと
    を含む、方法。
  6. 請求項1に記載の方法であって、生成する前記ステップは、
    複数の候補となる機能的に等価なクエリセットを生成するために、前記ルールセットのルールの複数の組合せのクエリコンポーネントへの適用を、実行中に評価するステップと、
    前記複数の候補となる機能的に等価なクエリセットのうち、最大効率ゲインを有する1つの候補となる機能的に等価なクエリセットを実行中に選択して、生成された前記機能的に等価なクエリセットとするステップと
    を含む、方法。
  7. 請求項6に記載の方法であって、前記候補となる機能的に等価なクエリセットのうちの1つまたは複数によってもたらされる効率性の向上は、実行時の実行条件に少なくとも部分的に依存する、方法。
  8. 請求項1に記載の方法であって、
    機械学習を使用して少なくとも1つのルールを生成して前記ルールセットに追加するステップ
    をさらに含む方法。
  9. 少なくとも1つのプロセッサ回路と、
    プログラムを格納する少なくとも1つのメモリと
    を含むコンピューティングデバイスであって、前記プログラムは前記少なくとも1つのプロセッサ回路に演算を行わせ、前記演算は、
    前記プログラムに含まれるかまたは含まれないプログラムコード内の複数のクエリを検出するステップと、
    前記クエリが前記プログラムコード内で評価されるまでの遅延を拡大させるステップと、
    前記プログラムコードの実行中に、前記複数のクエリが実行される前記コンピューティングデバイスの実行時の条件を決定するステップと、
    遅延を拡大させた前記クエリが、データセットを取得し、前記データセットをソートし、ソートされた前記データセットのサブセットを利用するように構成されていることを決定するステップと、
    前記プログラムコードの実行中に、決定された前記実行時の条件に関し、遅延を拡大させた前記クエリよりも効率的に評価する機能的に等価なクエリセットを、前記データセットの取得を最小化するルールに基づき生成するステップであって、前記ルールはルールセットに含まれ、前記ルールセットは、前記機能的に等価なクエリセットを、遅延を拡大させた前記クエリが、前記データセットを取得し、前記データセットをソートし、ソートされた前記データセットの前記サブセットを利用するように構成されていることを決定する前記ステップに応答して決定する、ステップと
    を含み、
    前記機能的に等価なクエリセットは、前記データセットの前記サブセットを、前記データセットの全体を取得すること及び前記データセットをソートすることの代わりに取得するよう構成された、
    コンピューティングデバイス。
  10. 請求項9に記載のコンピューティングデバイスであって、前記クエリが前記プログラムコード内で評価されるまでの遅延を拡大させる前記ステップは、
    前記クエリのうちの評価延期可能な1つまたは複数を検出するステップと、
    前記1つまたは複数の評価延期可能なクエリを含む単一のクエリ式を形成するステップと
    を含む、コンピューティングデバイス。
  11. 請求項9に記載のコンピューティングデバイスであって、生成する前記ステップは、
    複数のクエリコンポーネント間の共通の論理的な前後関係を決定するステップと、
    前記共通の論理的な前後関係に対応する前記ルールセットの第2のルールを前記複数のクエリコンポーネントに適用するステップと
    を含む、コンピューティングデバイス。
  12. 請求項9に記載のコンピューティングデバイスであって、生成する前記ステップは、
    複数の候補となる機能的に等価なクエリセットを生成するために、前記ルールセットのルールの複数の組合せのクエリコンポーネントへの適用を評価するステップと、
    前記複数の候補となる機能的に等価なクエリセットのうち、最大効率ゲインを有する1つの候補となる機能的に等価なクエリセットを選択して、生成された前記機能的に等価なクエリセットとするステップと
    を含む、コンピューティングデバイス。
  13. 請求項9に記載のコンピューティングデバイスであって、生成する前記ステップは、
    複数の候補となる機能的に等価なクエリセットを生成するために、前記ルールセットのルールの複数の組合せのクエリコンポーネントへの適用を、実行中に評価するステップと、
    前記複数の候補となる機能的に等価なクエリセットのうち、最大効率ゲインを有する1つの候補となる機能的に等価なクエリセットを実行中に選択して、生成された前記機能的に等価なクエリセットとするステップと
    を含む、コンピューティングデバイス。
  14. 請求項13に記載のコンピューティングデバイスであって、前記候補となる機能的に等価なクエリセットのうちの1つまたは複数によってもたらされる効率性の向上は、実行時の実行条件に少なくとも部分的に依存する、コンピューティングデバイス。
  15. 請求項9に記載のコンピューティングデバイスであって、前記演算は、
    機械学習を使用して少なくとも1つのルールを生成して前記ルールセットに追加するステップ
    をさらに含む、コンピューティングデバイス。
  16. 少なくとも1つのプロセッサ回路と、
    プログラムを格納する少なくとも1つのメモリと
    を含むコンピューティングデバイスであって、前記プログラムは、前記少なくとも1つのプロセッサ回路を、
    前記プログラムに含まれるかまたは含まれないプログラムコード内の複数のクエリを検出するよう構成されたクエリ検出器と、
    前記クエリが前記プログラムコード内で評価されるまでの遅延を拡大させるように構成れた遅延エクステンダーと、
    等価クエリセットジェネレーターと
    として機能させ、前記等価クエリセットジェネレーターは、
    前記プログラムコードの実行中に、前記複数のクエリが実行される前記コンピューティングデバイスの実行時の条件を決定することと、
    遅延を拡大させた前記クエリが、データセットを取得し、前記データセットをソートし、ソートされた前記データセットのサブセットを利用するように構成されていることを決定することと、
    前記プログラムコードの実行中に、決定された前記実行時の条件に関し、遅延を拡大させた前記クエリよりも効率的に評価する機能的に等価なクエリセットを、前記データセットの取得を最小化するルールに基づき生成することであって、前記ルールはルールセットに含まれ、前記ルールセットは、前記機能的に等価なクエリセットを、遅延を拡大させた前記クエリが、前記データセットを取得し、前記データセットをソートし、ソートされた前記データセットの前記サブセットを利用するように構成されていることの前記決定に応答して決定する、生成することと
    を行うように構成され、
    前記機能的に等価なクエリセットは、前記データセットの前記サブセットを、前記データセットの全体を取得すること及び前記データセットをソートすることの代わりに取得するよう構成された、
    コンピューティングデバイス。
  17. 請求項16に記載のコンピューティングデバイスであって、前記遅延エクステンダーは、
    前記クエリのうちの評価延期可能な1つまたは複数を検出し、
    前記1つまたは複数の評価延期可能なクエリを含む単一のクエリ式を形成する
    ことによって遅延を拡大させるように構成された、コンピューティングデバイス。
  18. 請求項16に記載のコンピューティングデバイスであって、前記等価クエリセットジェネレーターは、
    複数のクエリコンポーネント間の共通の論理的な前後関係を決定し、
    前記共通の論理的な前後関係に対応する前記ルールセットの第2のルールを前記複数のクエリコンポーネントに適用する
    ことによって前記機能的に等価なクエリセットを生成するように構成された、コンピューティングデバイス。
  19. 請求項16に記載のコンピューティングデバイスであって、前記等価クエリセットジェネレーターは、
    複数の候補となる機能的に等価なクエリセットを生成するために、前記ルールセットのルールの複数の組合せのクエリコンポーネントへの適用を、実行中に評価し、
    前記複数の候補となる機能的に等価なクエリセットのうち、最大効率ゲインを有する1つの候補となる機能的に等価なクエリセットを実行中に選択して、生成された前記機能的に等価なクエリセットとする
    ことによって前記機能的に等価なクエリセットを生成するように構成された、コンピューティングデバイス。
  20. 請求項19に記載のコンピューティングデバイスであって、前記候補となる機能的に等価なクエリセットのうちの1つまたは複数によってもたらされる効率性の向上は、実行時の実行条件に少なくとも部分的に依存する、コンピューティングデバイス。
JP2018563782A 2016-06-06 2017-05-31 Cpu利用およびコードリファクタリングのためのクエリオプティマイザー Expired - Fee Related JP6911059B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US15/174,688 US10558458B2 (en) 2016-06-06 2016-06-06 Query optimizer for CPU utilization and code refactoring
US15/174,688 2016-06-06
PCT/US2017/035085 WO2017213917A1 (en) 2016-06-06 2017-05-31 Query optimizer for cpu utilization and code refactoring

Publications (3)

Publication Number Publication Date
JP2019523942A JP2019523942A (ja) 2019-08-29
JP2019523942A5 JP2019523942A5 (ja) 2020-07-09
JP6911059B2 true JP6911059B2 (ja) 2021-07-28

Family

ID=59054257

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2018563782A Expired - Fee Related JP6911059B2 (ja) 2016-06-06 2017-05-31 Cpu利用およびコードリファクタリングのためのクエリオプティマイザー

Country Status (17)

Country Link
US (1) US10558458B2 (ja)
EP (1) EP3465425A1 (ja)
JP (1) JP6911059B2 (ja)
KR (1) KR20190015285A (ja)
CN (1) CN109313547B (ja)
AU (1) AU2017277831B2 (ja)
BR (1) BR112018074025A2 (ja)
CA (1) CA3023326A1 (ja)
CL (1) CL2018003468A1 (ja)
CO (1) CO2018013186A2 (ja)
IL (1) IL263264A (ja)
MX (1) MX2018015045A (ja)
PH (1) PH12018550197A1 (ja)
RU (1) RU2018142897A (ja)
SG (1) SG11201809886VA (ja)
WO (1) WO2017213917A1 (ja)
ZA (1) ZA201807412B (ja)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10210240B2 (en) * 2017-06-30 2019-02-19 Capital One Services, Llc Systems and methods for code parsing and lineage detection
US10705809B2 (en) * 2017-09-08 2020-07-07 Devfactory Innovations Fz-Llc Pruning engine
US10691433B2 (en) 2018-08-31 2020-06-23 Databricks Inc. Split front end for flexible back end cluster processing
US11106679B2 (en) 2019-10-30 2021-08-31 Ocient Holdings LLC Enforcement of sets of query rules for access to data supplied by a plurality of data providers
US20200409927A1 (en) * 2019-06-27 2020-12-31 Yrc Worldwide Inc. Cross-database platform synchronization of data and code
US11042369B1 (en) * 2020-02-03 2021-06-22 Architecture Technology Corporation Systems and methods for modernizing and optimizing legacy source code
US11210288B2 (en) 2020-05-12 2021-12-28 Coupang Corp. Systems and methods for reducing database query latency
US11782703B2 (en) * 2021-05-17 2023-10-10 Nec Corporation Computer code refactoring
US20220414101A1 (en) * 2021-06-24 2022-12-29 Microsoft Technology Licensing, Llc Shifting left database degradation detection
US12554717B2 (en) 2022-07-01 2026-02-17 Microsoft Technology Licensing, Llc Dynamically substituting a modified query based on performance analysis
US12487817B2 (en) 2022-12-20 2025-12-02 Microsoft Technology Licensing, Llc Software development artifact name generation
US12572836B2 (en) 2023-02-20 2026-03-10 Bank Of America Corporation Intelligent provisioning of quantum programs to quantum hardware
US20240281687A1 (en) * 2023-02-20 2024-08-22 Bank Of America Corporation Optimizing qubit consumption of quantum programs
US12579139B2 (en) * 2023-11-16 2026-03-17 Paypal, Inc. Large language model-based data query optimization

Family Cites Families (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6108648A (en) * 1997-07-18 2000-08-22 Informix Software, Inc. Optimizer with neural network estimator
AU6504801A (en) * 2000-05-26 2001-12-11 Computer Ass Think Inc System and method for automatically generating database queries
JP3956131B2 (ja) * 2002-12-26 2007-08-08 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラム変換装置、プログラム変換方法及びプログラム
US7634456B2 (en) 2003-09-06 2009-12-15 Oracle International Corporation SQL structure analyzer
JP2007219598A (ja) * 2006-02-14 2007-08-30 Nippon Telegr & Teleph Corp <Ntt> 多重化データベースシステム及びその同期化方法、データベースサーバ、並びに、データベースサーバプログラム
US20080065590A1 (en) 2006-09-07 2008-03-13 Microsoft Corporation Lightweight query processing over in-memory data structures
US20090144229A1 (en) 2007-11-30 2009-06-04 Microsoft Corporation Static query optimization for linq
US8713048B2 (en) 2008-06-24 2014-04-29 Microsoft Corporation Query processing with specialized query operators
CN101763428A (zh) * 2010-01-04 2010-06-30 山东浪潮齐鲁软件产业股份有限公司 一种SOA对web服务的注册存储管理应用系统
US9665620B2 (en) * 2010-01-15 2017-05-30 Ab Initio Technology Llc Managing data queries
US8332388B2 (en) * 2010-06-18 2012-12-11 Microsoft Corporation Transformation rule profiling for a query optimizer
US9177017B2 (en) 2010-09-27 2015-11-03 Microsoft Technology Licensing, Llc Query constraint encoding with type-based state machine
US20120078878A1 (en) * 2010-09-28 2012-03-29 Microsoft Corporation Optimized lazy query operators
US8914782B2 (en) 2010-11-10 2014-12-16 Microsoft Corporation Optimization of declarative queries
KR101238381B1 (ko) * 2011-06-07 2013-02-28 엔에이치엔(주) 다중범위 스캔에서의 n 정렬 질의를 최적으로 처리하기 위한 방법 및 장치
US8997070B2 (en) * 2011-12-15 2015-03-31 Sap Se Extension mechanism for scripting language compiler
US20140082014A1 (en) 2012-03-02 2014-03-20 Logics Research Centre Sia Abstract, structured data store querying technology
CN102982103A (zh) * 2012-11-06 2013-03-20 东南大学 一种olap海量多维数据维存储方法
US9514230B2 (en) * 2013-07-30 2016-12-06 Facebook, Inc. Rewriting search queries on online social networks
CN103970870A (zh) * 2014-05-12 2014-08-06 华为技术有限公司 数据库查询方法和服务器
US11461319B2 (en) * 2014-10-06 2022-10-04 Business Objects Software, Ltd. Dynamic database query efficiency improvement

Also Published As

Publication number Publication date
CO2018013186A2 (es) 2018-12-14
KR20190015285A (ko) 2019-02-13
ZA201807412B (en) 2020-01-29
JP2019523942A (ja) 2019-08-29
US10558458B2 (en) 2020-02-11
SG11201809886VA (en) 2018-12-28
RU2018142897A (ru) 2020-06-05
US20170351512A1 (en) 2017-12-07
CN109313547A (zh) 2019-02-05
MX2018015045A (es) 2019-03-06
PH12018550197A1 (en) 2019-09-16
WO2017213917A1 (en) 2017-12-14
CL2018003468A1 (es) 2019-03-15
AU2017277831A1 (en) 2018-11-22
BR112018074025A2 (pt) 2019-02-26
AU2017277831B2 (en) 2021-09-09
EP3465425A1 (en) 2019-04-10
IL263264A (en) 2018-12-31
CA3023326A1 (en) 2017-12-14
CN109313547B (zh) 2022-04-15

Similar Documents

Publication Publication Date Title
JP6911059B2 (ja) Cpu利用およびコードリファクタリングのためのクエリオプティマイザー
CN111796831B (zh) 一种多芯片兼容的编译方法和装置
US10942734B2 (en) Software dependency shading
US9430200B1 (en) Cross-library framework architecture feature sets
US11635949B2 (en) Methods, systems, articles of manufacture and apparatus to identify code semantics
US9081586B2 (en) Systems and methods for customizing optimization/transformation/ processing strategies
US11714613B2 (en) Surfacing underutilized tool features
CN110741354B (zh) 呈现代码实体调用之间的差异
US9311077B2 (en) Identification of code changes using language syntax and changeset data
CN108139891A (zh) 针对外部文件的缺失包括建议
US20140310688A1 (en) Using stack data and source code to rank program changes
WO2018161509A1 (zh) 条件编译预处理方法、终端及存储介质
US12182551B2 (en) Using a semantic tree of a compiler to execute a semantic code query against source code
WO2021169227A1 (zh) 一种代码处理方法、装置、设备及介质
US10839124B1 (en) Interactive compilation of software to a hardware language to satisfy formal verification constraints
US10949209B2 (en) Techniques for scheduling instructions in compiling source code
US8819626B2 (en) Sharable development environment bookmarks for functional/data flow
JP6651974B2 (ja) 情報処理装置、コンパイル方法及びコンパイラプログラム
He et al. From bug reports to workarounds: The real-world impact of compiler bugs
Sharma Performance comparison of Java and C++ when sorting integers and writing/reading files.
HK1262687A1 (en) Query optimizer for cpu utilization and code refactoring
HK1262687B (zh) 用於cpu利用率和代码重构的查询优化器

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20200528

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20200528

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20210416

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20210608

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20210707

R150 Certificate of patent or registration of utility model

Ref document number: 6911059

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees