"コンピュータのメモリデバイスに記憶された実行可能なプログラムに関連付けられた時間計算量を検出する方法であって、1前記記憶されたプログラムをコンピュータプロセッサで自動的に解析して、そのコード内のループに基づいて前記プログラムの時間計算量を検出することと、2前記記憶されたプログラムを前記プロセッサで自動的に解析して、前記プログラム内の前記コードのフローと分岐命令の分岐先とに基づいて前記プログラムの時間計算量を検出することと、1で検出される時間計算量と2で検出される時間計算量との最小時間計算量を前記プログラムの時間計算量として自動的に決定することとを備える、方法。実行可能なマシンコードプログラムを記憶した非一時的でコンピュータ読み取り可能な記憶媒体であって、前記プログラムはマイクロプロセッサにステップのシーケンスを実行するように命令し、グラフィカルに表される前記プログラムは複数の機械命令行を備え、グラフィカルな矢印が分岐機械命令行から分岐先の機械命令行まで伸びて、a.下向きの分岐に対応する矢印は、マシンコードの左側に現れ、かつ、分岐の元となる行に始まる横線であって、前記横線が前記横線からその分岐先の命令行まで下向きに進行する縦線に接続され、前記縦線が前記分岐の分岐先における、前記分岐先の命令を指す右向き矢印を有する横線に接続されるような横線を備え、b.上向きの分岐に対応する矢印は、前記マシンコードの右側に現れ、分岐の元となる行に始まる横線であって、前記横線が前記横線からその分岐先の命令行まで上向きに進行する縦線に接続され、前記縦線が前記分岐の分岐先における、前記分岐先の命令を指す左向き矢印を有する横線に接続されるような横線を備える、記憶媒体。互いの比較的近くに下向きおよび上向きに分岐する交互配置の機械命令が存在する場合に、下向きおよび上向きの分岐の組み合わせが反時計回りのフローを有する、請求項2に記載の非一時的でコンピュータ読み取り可能な記憶媒体。共通の分岐先を共有する分岐は、それらの縦線が互いに重なるように描かれ、共通の分岐先を共有しない分岐は、それらの縦線が重ならないように描かれる、請求項2に記載の非一時的でコンピュータ読み取り可能な記憶媒体。より近い分岐先を有する分岐は、より遠い分岐先を有する分岐よりも前記コードに近く位置する縦線を有する、請求項2に記載の非一時的でコンピュータ読み取り可能な記憶媒体。前記コード内の他の関数に結合する分岐は、命令の右に向かう単一の横方向の両矢印で表される、請求項2に記載の非一時的でコンピュータ読み取り可能な記憶媒体。戻り分岐は、命令の右に向かう単一の横方向の右向き矢印で表される、請求項2に記載の非一時的でコンピュータ読み取り可能な記憶媒体。実行可能なマシンコードプログラムを記憶した非一時的でコンピュータ読み取り可能な記憶媒体であって、前記プログラムはマイクロプロセッサにステップのシーケンスを実行するように命令し、グラフィカルに表される前記プログラムは複数の機械命令行を備え、分岐機械命令の直後に続く機械命令はそれが分岐命令の分岐先でない限り1タブ字下げされる、非一時的でコンピュータ読み取り可能な記憶媒体。関数内の下向きの分岐に遭遇すると、その分岐先は字下げフリーズシンボルでマーク付けされる、請求項8に記載の非一時的でコンピュータ読み取り可能な記憶媒体。関数内の上向きまたは下向きの分岐に遭遇すると、字下げフリーズシンボルに遭遇するか前記関数の終わりに到達するまですべての後続の行が字下げされる、請求項8に記載の非一時的でコンピュータ読み取り可能な記憶媒体。実行可能なマシンコードプログラムを記憶した非一時的でコンピュータ読み取り可能な記憶媒体であって、前記プログラムはマイクロプロセッサにステップのシーケンスを実行するように命令し、グラフィカルに表される前記プログラムは複数の機械命令行を備え、コードのブロックはそれぞれ対応する時間計算量に従って視覚的にマーク付けされ、前記時間計算量は前記プログラムのフロー中で前記ブロックが関連付けられた前記コード内のループの数を含む、非一時的でコンピュータ読み取り可能な記憶媒体。jを0以上の整数とするj個のループを有するブロックの時間計算量はオーダーnであると判断され、nをループが実行される任意の回数とするOnj記法で視覚的にマーク付けされる、請求項11に記載の非一時的でコンピュータ読み取り可能な記憶媒体。前記コードの各計算量のセクションは、視覚的な表示によって追加で視覚的にマーク付けされる、請求項11に記載の非一時的でコンピュータ読み取り可能な記憶媒体。前記視覚的な表示は強調表示色のグラデーションを含む、請求項13に記載の非一時的でコンピュータ読み取り可能な記憶媒体。ある機械命令行の時間計算量が視覚的にマーク付けされ、前記時間計算量は前記機械命令行が内部に存在する連続したループの最大数を示す、請求項11に記載の非一時的でコンピュータ読み取り可能な記憶媒体。実行可能なマシンコードプログラムの各命令行に関連付けられた時間計算量を検出する方法であって、各命令行はそれに対応する時間計算量に従って視覚的にマーク付けされ、前記コードプログラムの個別の行に対応するノードが前記プログラムの制御フローに基づいて接続されるようにコードのフローグラフを作成することと、閉路を形成する、前記コードのフローグラフ内の複数のノードのあらゆるグループに対応する複数の強連結部分グラフを識別することと、前記複数の強連結部分グラフを、1つの集合の各強連結部分グラフが同じ根ノードを共有するように複数の集合にグループ分けすることと、前記複数の集合のうちの1つの集合に含まれる根ノードが他の集合に含まれるか否かに基づいて前記複数の集合の有向グラフを構築することによって、集合グラフを作成することと、親を持たないノードに到達するまで前記各集合の各ノードをノードを繰り返すことなく後向きにノード走査したときの最長の数を求めることによって、前記集合グラフにおける最長の経路を解析することと、前記最長の経路の解析におけるノード走査の数を用いて、数が小さい方から大きい方への複数の集合のソート済みリストを作成することによって、複数の集合をソートすることと、ノード走査の値に基づいて、p=0,1,2,である時間計算量値pをコードの各命令行に割り当てることと、前記マシンコードプログラムの各行について時間計算量の尺度Onpを割り当てることとを備える、方法。コンピュータのマシンコードの書式を設定してユーザによるプログラムの基礎的なフローの理解を高める装置であって、ユーザが入力したソースコードを受け取り、対応するソースファイルを生成するエディタと、前記ソースファイルを受け取り、マシンコードで構成されるオブジェクトファイルを生成するコンパイラと、前記オブジェクトファイルを受け取り、前記オブジェクトファイルの状態を変更して、グラフィカルに表される前記プログラムが複数の機械命令行で構成されるように変更オブジェクトファイルを作成するマシンコードエディタであって、グラフィカルな矢印が分岐機械命令行から分岐先の機械命令行まで伸びて、分岐機械命令の直後に続く機械命令はそれが分岐命令の分岐先でない限り1タブ字下げされ、コードのブロックはそれぞれ対応する時間計算量に従って視覚的にマーク付けされ、前記時間計算量は前記プログラムのフロー中で前記ブロックが関連付けられた前記コード内のループの数を含む、マシンコードエディタと、前記変更オブジェクトファイルを受け取り、出力ファイルとして出力される実行ファイルを生成するリンカとを備える、装置。コンピュータのマシンコードの書式を設定してユーザによるプログラムの基礎的なフローの理解を高める方法であって、ユーザが入力したソースコードをエディタで受け取り、対応するソースファイルを生成することと、前記エディタが生成した前記ソースファイルをコンパイラで受け取り、マシンコードで構成されるオブジェクトファイルを生成することと、前記コンパイラが生成した前記オブジェクトファイルをマシンコードエディタで受け取り、前記オブジェクトファイルの状態を変更して、グラフィカルに表される前記プログラムが複数の機械命令行を備えるように変更オブジェクトファイルを作成することであって、グラフィカルな矢印が分岐機械命令行から分岐先の機械命令行まで伸びて、分岐機械命令の直後に続く機械命令はそれが分岐命令の分岐先でない限り1タブ字下げされ、コードのブロックはそれぞれ対応する時間計算量に従って視覚的にマーク付けされ、前記時間計算量は前記プログラムのフロー中で前記ブロックが関連付けられた前記コード内のループの数を含むことと、前記マシンコードエディタが生成した前記変更オブジェクトファイルをリンカで受け取り、出力ファイルとして出力される実行ファイルを生成することとを備える、方法。コードを記憶する非一時的なメモリデバイスにアクセスするコンピュータプロセッサによって実行され、コードを動的に実行する必要なしにコードの時間計算量を推定するコンピュータの動作方法であって、前記コードの複数の分岐を決定するステップと、前記複数の分岐のうち第1の決定された分岐が、前記複数の分岐のうちの、前記第1の分岐よりもスキップする命令の数が多い他の決定された分岐内に完全に含まれるか否かを確認するステップと、前記確認ステップにおいて前記第1の分岐が完全に含まれると確認された場合、前記第1の分岐に関連付けられた増加した時間計算量を示すステップと、前記コードの最大時間計算量を推定するために、前記コード内の前記複数の分岐のうち複数のさらに決定された分岐について、上述のステップの少なくとも一部を再帰的に実行するステップとを前記コンピュータプロセッサが実行する、方法。前記コード内の各決定された分岐について、前記実行ステップが再帰的に実行される、請求項19に記載の方法。前記複数の分岐は複数の命令を含み、前記実行ステップは、前記複数の命令に関連付けられた、前に割り当てられた時間計算量の値と、前記複数の分岐に関連付けられた前記示された時間計算量とを比較して、前記複数の命令のそれぞれについて時間計算量を割り当てる、請求項19に記載の方法。前記決定ステップは、前記コードの順序付き静的リストにおいて、前記複数の決定された分岐が前記順序付きリストの複数の前の部分に分岐するか否かを判定することを備える、請求項19に記載の方法。前記決定ステップは、所定の方向に分岐する前記コード内の複数の分岐を決定する、請求項19に記載の方法。前記所定の方向は上向きを含む、請求項23に記載の方法。人間によって知覚可能な表示を提供するために、前記推定される最大時間計算量を表示装置上に表示することをさらに含む、請求項19に記載の方法。本明細書に記載する手法は、コンピュータプラットフォーム、パーソナルコンピュータ、ネットワークサーバ、据置型または携帯型ビデオゲーム機、計算能力を有するその他のあらゆる種類の装置または構成を含む、あらゆる種類のコンピュータまたはゲームシステムにおいて実行可能である。以下に、例示を目的とする非限定の実施の一例を説明するが、その他の実施も可能である。図1は、本明細書に提示する本実施例が実装されたハードウェアプラットフォームの非限定の一例を示す。プラットフォーム100は、中央処理装置CPU101、ハードディスクドライブHDD102等の不揮発性記憶装置またはフラッシュメモリデバイス、ランダムアクセスメモリRAM103、グラフィックスプロセッサ104、入力装置インターフェイス105、通信インターフェイス106を含む。CPU101は、共通バス107を介して他の構成要素とやり取りしながらプラットフォームを制御する。RAM103は、CPU101が実行するオペレーティングシステムプログラムおよびアプリケーションプログラムの少なくとも一部を一時的に記憶する。記憶装置102は、ソフトウェアツールに加えて、もしあればオペレーティングシステムOSおよびアプリケーションプログラムも記憶する。図1では1つのコンピュータプラットフォームを示しているが、他の複数のコンピュータがネットワーク40に接続され、各コンピュータが本明細書に提示する本実施例で構成されてもよい。グラフィックスプロセッサ104は、CPU101からのコマンドに応じて映像を作成し画面10に表示する。入力装置インターフェイス105は、例えばキーボード20、マウス30、ゲームコントローラ32、34等の外部入力装置から信号を受け取る。これらの入力信号はバス107を介してCPU101に供給される。通信インターフェイス106によって、CPU101はネットワーク40上で他のコンピュータとデータ交換が可能になる。図2は、本明細書に提示する本実施例で構成される、プラットフォーム100で実行される処理機能を示すブロック図である。より具体的には、プラットフォーム100は、エディタ200、複数のソースファイル210、211、212等、コンパイラまたはアセンブラ201、複数のオブジェクトファイル221、222、223等、マシンコードエディタ202、複数の変更オブジェクトファイル231、232、233等、リンカ203、複数の実行ファイル241、242、243等、逆アセンブラ204、通信プロセッサ205等の演算要素を含む。ソースファイル210、211、212は、プログラミング言語で書かれたソースコードの形式で処理を表す。オブジェクトファイル221、222、223は、コンピュータ100が直接実行可能な特定のマシンコードの形式で処理を表す。変更オブジェクトファイル231、232、233は、後述するように、ユーザがオブジェクトファイル221、222、223に対して行った変更を表す。実行ファイル241、242、243は、1つ以上の変更オブジェクトファイルを1つのファイルに結合することでそれぞれが作成された変更マシンコードファイルである。上記のファイルはすべて記憶装置102および/またはRAM103に記憶される。逆アセンブラ204は、実行ファイル241、242、243をアセンブリ言語のソースファイル245、247、249に変換し、これらのソースファイルは一実施では、2進数16進数の機械命令とそれに1対1で対応するアセンブリ言語のソース命令との両方を含んでおり、これらのソース命令はオペコードのニーモニック、アドレスラベル、関数呼び出しラベルで構成される。ユーザはエディタ200を用いてソースコードを書いたり編集したりできる。例えばプログラマ等のユーザは、例えばC言語等の適切なプログラミング言語で命令のセットを入力する。そして、彼/彼女はエディタ200に保存コマンドを与え、エディタ200はその結果得られたソースファイルを記憶装置102に書きこむ。コンパイラ201は、ソースファイルを受け取りマシンコードを生成する。これは記憶装置102にアクセスして、プログラマが書いたソースファイルを読み出し、ファイル内のソースコードの各行をパースし、ソースコードをコンピュータ100が理解可能なマシンコードに変換して行われる。この処理はコンパイルとして知られ、コンパイルの出力はオブジェクトコードと呼ばれる。コンパイラ201は、コンパイルされたオブジェクトコードをオブジェクトファイルとして記憶装置102に保存する。続いて、本明細書に提示する本実施例によれば、プログラマ等のユーザには、コンパイラ201が作成したマシンコードを確認し、場合によってはマシンコードや対応する高水準のソースコードの変更も行うという選択肢があり、これにより変更オブジェクトファイル231、232、233等のマシンコードの変更バージョンが、将来の確認、想定されるデバッグ、および/または想定される修正のためにより見やすく提示されることになる。本明細書に提示するこれらの変更手法は、コンパイラから出力されるマシンコードをユーザがその計算量だけでなくそのフローに関してもより良く理解することを助け、さらに、最適化コンパイラ201がソースコードをどのようにコンパイルするかをユーザが理解することも助ける。リンカ203は、記憶装置102にアクセスし、ユーザが作成した1つ以上の変更オブジェクトコードファイルを読み出す。そして、リンカ203は、これらの変更オブジェクトコードファイルを単一のロードモジュールへ結合しながら、いくつかの部分を編集して解決済みの絶対アドレスおよび相対アドレスとともに命令の一貫したセットとして整理する。この処理はリンクとして知られる。リンカ203は、これらの実行ファイル241、242、243を記憶装置102に保存する。通信プロセッサ205は、ネットワーク40内の他のコンピュータに加えて、ソースファイル、オブジェクトファイル、変更オブジェクトファイル、実行ファイル、アセンブリ言語ファイルのいずれとも通信している。上記のように、マシンコードはコンピュータの中央処理装置CPUが直接実行する命令のセットである。一般に、マシンコードはほとんどの人々にとっては読んで理解するのが非常に困難である。これらのコンピュータの命令は、コンパイルされたコンピュータプログラムおよび/またはアセンブリコンピュータプログラムが最低水準で表現されたものと考えてもよく、CPUの実行対象と1対1で対応してもよい。各プロセッサファミリには固有のマシンコードの命令セットがある。これらの命令はマシンに対する異なるコマンドと対応している。マシンコードの命令セットは、すべての命令の長さが同じであってもよく、また命令の長さが可変であってもよい。大部分の命令は1つ以上のフィールドを有し、これらによって実際の演算例えば加算または比較、アドレッシングモード、アドレス指定オフセット、または実際の値そのものに加えて、基本的な命令の種類例えば算術、論理、ジャンプ等も特定される。図3は、本明細書に提示する本実施例による、マシンコードを変更して人間による理解を高める方法の、例示を目的とする非限定のソフトウェアのフローチャートの一例を示す。まずステップS1において、コンピュータ100は、ユーザが書いて入力した、例えばC言語のソースコードを受け取る。続いてステップS2において、コンピュータ100のコンパイラ201は、受け取ったソースコードをマシンコードにコンパイルするあるいはコンパイラ201は、中間のアセンブリ言語コードを作成し、その後これを図示しないアセンブラがマシンコードに変換してもよい。ユーザはマシンコードを受け取りステップS3、それを調べ、後述する手法の1つを用いてそのプログラムを適宜変更するステップS4。そして、コンピュータ100は、変更されたコードを受け取り、リンカ203を介して実行ファイルを生成しステップS5、ステップS6において、これが出力コードとして出力される。一実施例によれば、命令フローの理解を結果的に要するコードの見直しや変更は、以下の3つの主な方法で支援される。マシンコードにおける矢印注釈付き分岐マシンコードの分岐命令は、大抵は分岐先のオフセットまたはアドレスを特定するだけである。分岐先の追跡はとりわけ精神的な労力を要するため、分岐から分岐先の命令まで矢印を描くことでマシンコードを単純化してもよい。一部の分岐が前の機械命令に関連付けられ、一部が後続の機械命令に関連付けられることを考慮すると、これらの矢印は規則的に整理できる。一実施例では、前向き/下向きの分岐矢印はすべてコードの左側に現れ、後向き/上向きの分岐矢印はすべてコードの右に現れる。こうして提示することで、矢印は図4に示すように反時計回りの規則的なフローを有する。例えば図4で分かるように、コードの左側には4本の前向き/下向きの分岐矢印が存在し、コードの右側には2本の後向き/上向きの分岐矢印が存在する。また、分岐先が同一の矢印同士を縦方向の進行で合体させて、混雑や矢印の数を減らしてもよい。例えば、これらの矢印は共通の縦方向セクションを有するように描かれてもよい。規則的なコードの提示を保つためには、分岐先が近い分岐を分岐先が遠い矢印よりもコードの近くに配置するべきである。例えば図4で分かるように、コードの左側において、分岐先がcmplwr9,r5の分岐は分岐先がcmplwr8,r4の分岐よりも長いため、後者の分岐がコードにより近く描かれている。本実施例では、コード内の他の関数に戻ったり結合したりする分岐は、単一の横方向の矢印または両矢印で表されるのが最も望ましい。例えば、コード内の他の関数に結合する分岐は、命令の右に向かう単一の横方向の両矢印で表され、戻り分岐は、命令の右に向かう単一の横方向の右向き矢印で表される図4のコードの最後の命令行の右に向かう矢印を参照。マシンコードにおける字下げ注釈付き分岐典型的には、マシンコードは字下げを含まないしかし、高水準言語は字下げを含むことが多い。言い換えれば、すべての命令行が縦方向に揃っている。この書式では、プログラムのフローを追跡する際に視覚的な洞察ができない。よって、外見的に理解するために、コードの論理ブロックに基づいてこれを可能にすることが望ましい。好ましい実施例では、すべての機械命令が順次反復される。一実施例では、関数内の下向きの分岐に遭遇すると、その分岐先に字下げフリーズシンボルでマーク付けするなお、この行はさらに字下げするべきではない。例えば図5で分かるように、3番目の行で関数内の下向きの分岐に遭遇し、分岐先である行28に等の字下げフリーズシンボルでマーク付けする。同様に、下向きの分岐の分岐先に対応する行15、17、25にもそれぞれ字下げフリーズシンボルでマーク付けする。本実施例では、関数内の上向きまたは下向きの分岐に遭遇すると、字下げフリーズシンボルに遭遇するか関数の終わりに到達するまですべての後続の行が字下げされる。そして、分岐に続く行で処理が再開される。例えば図5のコード表現の場合、行2で分岐に遭遇するため、後続の行3は字下げされ、以降の各行が、行28で字下げフリーズシンボルに遭遇するまで字下げされる。この字下げの効果により、分岐命令に続くコードの重要性が強調される。図6は、字下げアルゴリズムの一例を示すものであり、これに従って、各機械命令の字下げレベルをそれが分岐命令の分岐先でない限りタブ1つインクリメントする。まず、すべての機械命令を字下げレベルがゼロとなるように初期化するステップS10。続いてアルゴリズムはコード内のすべての機械命令のリストを最初から最後までたどる。例えば図5に示すコードの場合、アルゴリズムは最初のlir10,0から最後のblrまですべての機械命令を検討する。次にアルゴリズムは、分岐機械命令に遭遇したか否かを判定するステップS12。答えが否定の場合、アルゴリズムは戻り、機械命令のリストをたどり続ける。一方、答えが肯定の場合、アルゴリズムは、遭遇した分岐が下向きの分岐であるか否かを判定するステップS14。判定に対する答えが否定の場合、アルゴリズムはステップS15A後述するへ進む。答えが肯定の場合、アルゴリズムは検討中の機械命令において、分岐の分岐先にフリーズトークンでマーク付けしステップS15、次のステップへ進む。下向きの分岐の分岐先を指定する機械命令においてフリーズトークンでマーク付けした後、ステップS15Aにおいて、アルゴリズムは各行の字下げレベルをインクリメントしながら後続の一連の機械命令をたどる。各機械命令を終えるごとに、アルゴリズムは、フリーズトークンに遭遇したか否かを判定するステップS17。答えが否定の場合、アルゴリズムはステップS16へ進む。一方、答えが肯定の場合、アルゴリズムはその機械命令行の字下げレベルをインクリメントせず、ステップS12へ戻る現在の行番号が最後の行番号ではないものとして、ステップS12A、S12B参照。最後にアルゴリズムは、機械命令がすべての機械命令のリストの最後であるか否かを判定するステップS12A。そうであればアルゴリズムは終了しステップS20、そうでなければ、現在の行番号をインクリメントした後にステップS12に戻る。図6の字下げアルゴリズムの適用例が図5に示される。下向きの分岐に遭遇する最初の命令行は3番目の行である。したがって、その行が分岐する分岐先にフリーズトークンを用いてマーク付けし、そして、次の行行3はタブ1つ字下げされ、各後続の行は、行28にフリーズトークンがあることから行28まで字下げされる。行4に続く後続の行5~11は字下げされ、この処理は最後の行blr命令の右に向かう単一の横方向の右向き矢印で表される戻り分岐に到達するまで継続する。他の実施例では、フリーズシンボルの配置や字下げを行う場合には無条件分岐のみを検討する。これにより、外観が若干異なる/より分かりやすくなる。マシンコードにおけるアップブランチ法を用いた時間計算量注釈付きブロック他の実施例では、マシンコードの各行に、分岐の結果生じる時間計算量の推定を表す視覚的指標でマーク付けできる。これは、分岐の結果としての重要な特徴とプログラムのフローとを視覚的に判別するさらに他の方法である。典型的なマシンコードでは、コード内に多数のループが設けられていると、プログラマは行や複数の行によるブロックの計算量を速やかに読んで理解することができない。例えば、いかなるループも含まないコードは実行時間が一定であると判断され、典型的にはビッグO記法でO1として表される。一方、単一のループで構成されるコードは時間計算量がオーダーnまたはOnであると判断され、このときnはループの実行が可能な任意の回数である。さらに、コードのループが他のコードのループ内に存在する場合、つまりコードが入れ子のループを有する場合、内側のコードのループは時間計算量がオーダーn2またはOn2であると判断される。このとき、外側のループはn回実行可能であり、内側のループは外側のループ1周につきn回実行可能であるため、結果として内側のループは合計n×n回反復される。同様に、コードのループ内のコードのループ内のコードのループから成る三重のループでは、最も内側のループの時間計算量がオーダーn3またはOn3となる。例えば図7に示すように、3番目の行と最後から2番目の行との間の命令行から成るブロックは単一のループで構成されるため、Onで表される。一方、行4と行26との間の行から成るブロックは他のループ内のループで構成されるため、On2で表される。コードの各行の時間計算量を知らせることは、そのコードの構造およびフローを理解するのに役立つため、重要な時間計算量のセクションにはそれぞれ強調表示の色やその他の視覚的表示で視覚的にマーク付けしてもよい。この手法の一実施例としては、図7に示すように、例えば時間計算量がO1のコードのセクションは白で、時間計算量がOnのコードのセクションは黄で、時間計算量がOn2のコードのセクションはオレンジ色でそれぞれ色をつける一般に特許はカラー印刷されないため、これらの異なる色を陰影で表現している。他の実施例としては、時間計算量が悪化するコードには特定の色の単色グラデーションで色をつける。例えば図7に示すように、計算量がレベルOnのセクションは、例えば黄色薄い陰影で表現され、計算量がレベルOn2のセクションは、例えばオレンジ色中間の陰影で表現される。マシンコード命令の各ブロック全体の時間計算量を指定するだけでなく、一実施例では、個別のマシンコード命令の時間計算量も指定する。マシンコードにおいてループは、前のマシンコード命令へ条件付きまたは無条件で分岐するマシンコード命令で決定できる。このループは、マシンコード分岐の分岐先とこのマシンコード分岐自体との間で表されるすべてのマシンコード命令のセットである。あるマシンコード命令の時間計算量は、ループが他のループ内に存在するには完全に含まれていなければならないという要件で、このマシンコード命令が内部に存在するループの最大数で決定できる。マシンコード命令がいかなるループの中にも存在しない場合、時間計算量はO1である。マシンコード命令が1つだけのループ内に存在する場合、時間計算量はOnである。マシンコード命令が2つのループループ内のループ内に存在する場合、時間計算量はOn2である。マシンコード命令が3つのループループ内のループ内のループ内に存在する場合、時間計算量はOn3である。マシンコード命令の時間計算量のこの定義は一定のパターンに従って無限に続く。本明細書に提示する非限定のアップブランチ法の一例は、コードが書かれたインラインの順序に基づいて時間計算量を推定するヒューリスティックな手法を提供する。人間のプログラマは入れ子を反映した順序でコードを書くことが多い。例えば、コードの一部分がエントリーポイントを含み、その後に多数のインオーダー命令が続き、その後にループが続いてエントリーポイントへ戻っている場合、この人間のプログラマがインオーダー命令をループの一部となるように意図したことが推測できる。この前提が必ず正しいとは限らないが、コードの他の部分からごくわずかにアクセスされるか、あるいは決してアクセスされない命令やコードの断片がコードのブロック内に存在することもあり、結果的にこれらはループの一部ではない。それにもかかわらず、プログラマがループ内の命令を定義するコードを書く際には、そのような命令もこのループの実行回数と同じだけ実行される可能性が高いため、本質的にはこのループに属している。このようにアップブランチ法は、ループに属する命令を、これらの命令をプログラマが書いたときの順序に基づいて推測するのに有用となりうるヒューリスティック解析を提供する。さらに、多くの場合、同じコードに対して異なるヒューリスティックな手法を実行して、アップブランチ法による時間計算量が正確でない状況を検出することで、アップブランチ法の精度を確認できる。図8は、非限定のアルゴリズムの一例を示すものであり、これに従って、関数内のあるマシンコード命令の時間計算量が決定されるアップブランチ法と呼ぶ。以下、種々の計算量レベルを、ゼロ=O1、1=On、2=On2、3=On3等で表す。まずステップS30において、アルゴリズムはすべてのマシンコード命令を時間計算量がゼロとなるように初期化する。次に、前の命令に分岐するすべての条件分岐または無条件分岐のリストを構築しステップS31、続いて、すべての上向きの分岐のリストを、スキップするマシンコード命令の数が小さい方から大きい方へソートするステップS32。そして、アルゴリズムはすべての上向きの分岐のリストをループしステップS33、各分岐について、分岐が1の時間計算量を表すとして分岐が表せる最大時間計算量を求めるステップS34。分岐の最大時間計算量は図9のフローチャートによって決定される。続いてアルゴリズムは、分岐の分岐先から開始してマシンコード分岐自体で終了するまですべてのマシンコード命令をループしステップS35、この分岐が表す最大時間計算量がこのマシンコード命令に関する前に記憶された時間計算量よりも大きい場合、この分岐が表す最大時間計算量をこのマシンコード命令に関する新たな時間計算量として記憶しステップS36、終了するステップS37。また、図9に示す以下のアルゴリズムは、初期的な計算量明細書の最後に記載する疑似コードを与えられると、ある分岐に関する最大時間計算量を決定できる。当該分岐について、アルゴリズムはこの分岐よりもスキップする命令の数が多いすべての分岐をループしステップS40、ステップS41において、当該分岐がこの反復で検討中の分岐内に完全に含まれる場合、計算量は、現在の計算量とこの反復で検討中の分岐の計算量とのうち量が大きい方に等しいこのアルゴリズムを現在の計算量とともに再帰的に呼び出すことで決定される。最後にステップS42において、アルゴリズムは計算量の値を返し、終了するステップS43。アセンブリコードにおける強連結部分グラフ法を用いた時間計算量注釈付きの行一実施例では、以下のアルゴリズム強連結部分グラフ法と称するによって、アセンブリコードの命令の最悪のケースにおける大まかな時間計算量が検出される。この方法はコードのフローと分岐命令の分岐先とに基づくものである。Onpに置き換えた時間計算量を検出できる。図10は、非限定のアルゴリズムの一例を示すものであり、これに従って、あるアセンブリコード命令の時間計算量が決定される。コードのフローグラフを作成まずステップS50において、コードのフローグラフを作成する。より具体的には、アセンブリコードの各行をノードとしてこれらのノードがプログラムの制御フローに従って接続された有向グラフを作成する。例えば3行からなるアセンブリプログラムの場合、通常、コードのフローはある行から次の行へと進むため、これに対応するコードのフローグラフは{1→2,2→3,3→null}となる。最初のコード命令が行3への条件ジャンプであれば、新たなグラフは{1→2,1→3,2→3,3→null}となる。各強連結部分グラフを識別次にステップS51において、アルゴリズムは各強連結部分グラフを識別する。深さ優先探索を開始ノードから行って、コードのフローグラフのすべての強連結部分グラフを識別する。強連結部分グラフは、閉路を形成するあらゆるノードまたはノードのあらゆるグループである。より正確に言えば、AからBへの経路が存在しBからAへの経路が存在する場合つまり、閉路が形成される場合、ノードAおよびBは強連結部分グラフを形成する。強連結部分グラフが深さ優先探索中に識別されるのは、探索対象である次のノードが現在の走査に既に含まれるノードである場合である。こうして識別された強連結部分グラフは、現在の走査に含まれることが判明したノード根ノードと呼ぶから開始して現在の探索走査の最終ノードまでが記録される。例えば深さ優先探索において経路{1,2,3,4,5,2}が探索される場合、強連結部分グラフ{2,3,4,5}が記録され、前の走査の最終ノードが葉子を持たない終端ノードであるかのように深さ優先探索を続行する。2つ以上の強連結部分グラフが同一である場合、これらの同一の強連結部分グラフのうち1つだけが保持される。強連結部分グラフの集合を作成各強連結部分グラフを識別した後、ステップS52において、これらを同じ根ノードを共有する種々の集合に配置する。例えば強連結部分グラフ{2,3,4}および{2,3,5}は同じ根ノード2を有するため、同じ集合に含まれることになる。強連結部分グラフを集合に追加する前に、この強連結部分グラフがこの集合内の他の強連結部分グラフの部分集合であるかが確認される。他のグラフの部分集合であるグラフは、他のグラフの連続部分と同一のグラフとして定義される。例えばグラフ{2,3,4}はグラフ{2,3,4,5}の部分集合である。この強連結部分グラフがこの集合内の他の強連結部分グラフの部分集合である場合、この集合には追加されず、逆に他の適切な集合に、同じ根ノードを有しかつその集合内のどの強連結部分グラフの部分集合でもないことを条件として追加される。強連結部分グラフをどの集合にも追加できない場合、この特定の強連結部分グラフが固有の集合を定義する。集合グラフを作成強連結部分グラフの種々の集合が作成された後、ステップS53において、以下のアルゴリズムを用いてこれらの集合の新たな集合グラフを構築する。ある集合C1が異なる集合C2内の他の強連結部分グラフ内に含まれる根ノードを有し、C2内のいずれの強連結部分グラフもC1内の強連結部分グラフの部分集合ではない場合ノードのシーケンスの移動を考慮したとしても、C1はC2の子として、例えばC2→C1のように定義される。例えば集合C1が{3,4,5}を含み、集合C2が{2,3,4}を含む場合、C1はC2の子である。さらなる例として、集合C3が{2,3}を含み、集合C4が{3,2,4}を含む場合、C3はC4の子であるが、C4はC3の子ではないC3がC4の部分集合であるため。一旦グラフが完成すると、C1がC2の子でC2がC1の子であるノードC1およびC2の各集合については、これらのノードをお互いに非連結にする。集合グラフにおける各ノードの最長の経路を解析次にステップS54において、集合グラフにおける最長の経路を解析する。これらの集合の新たに作成された集合グラフを用いて、親を持たないノードへ到達するまで各ノードを後向きにノード走査したときの最長の数を求める。例えばC1→C2、C1→C3、C2→C3の場合、C1が親を持たない唯一のノードで走査コストはゼロであり、C2は走査コストが1でありC1へ到達するのに1ノード走査する、C3は走査コストが2であるC2を経由してC1へ到達するのに2ノード走査する。集合をソートステップS54におけるノード走査による識別に続いて、ステップS55において、ノード走査の数を基準として用いて、数が小さい方から大きい方へ集合のソート済みリストLを作成する。時間計算量を割り当て次にステップS56において、各ノードつまり、コードの各行に時間計算量例えば自然数0、1、2、pを割り当てる。まずコードの各行について、時間計算量をゼロに初期化する。そして、ソート済みリストLの各集合について、この集合の各強連結部分グラフ内のコードの各個別の行の時間計算量をノード走査の値プラス1として割り当てる。時間計算量を置き換え最後にステップS57において、各行に割り当てられた時間計算量に応じて、この行の計算量を以下のようにビッグO記法で表す。0→On0=O11→On1=On2→On23→On34→On4p→Onpプログラムは終了ステップS58例上記の強連結部分グラフ法を用いて、例えば以下のアセンブリコードプログラムの一例に関して時間計算量を検出できる。Exampleassemblyprogramアセンブリプログラム例11Dowork実行2Dowork実行3Dowork実行4Conditionallybranchtoline3条件付きで行3に分岐5Conditionallybranchtoline7条件付きで行7に分岐6Dowork実行7Conditionallybranchtoline2条件付きで行2に分岐8Dowork実行Step1Createacodeflowgraphコードのフローグラフを作成1→22→33→44→34→55→65→76→77→27→88→nullStep2Identifystronglyconnectedsubgraphs各強連結部分グラフを識別11212312341234Foundstronglyconnectedsubgraph強連結部分グラフを発見3412345123457123457Foundstronglyconnectedsubgraph強連結部分グラフを発見23457123457812345612345671234567Foundstronglyconnectedsubgraph強連結部分グラフを発見23456712345678Listofallstronglyconnectedsubgraphsすべての強連結部分グラフのリスト2345672345734Step3Createcollectionsofstronglyconnectedsubgraphs強連結部分グラフの集合を作成Collection集合A34Collection集合B23456723457Step4Createacollectiongraph集合グラフを作成B→AStep5Analyzethelongestpathincollectiongraph集合グラフにおける最長の経路を解析Collection集合A1Collection集合B0Step6Sortcollections集合をソートCollection集合B0Collection集合A1Step7Assigntimecomplexity時間計算量を割り当て1021324251617180Step8Interprettimecomplexity時間計算量を置き換え1O2O3O4O5O6O7O8OExampleassemblyprogramアセンブリプログラム例21Dowork実行2Conditionallybranchtoline1条件付きで行1に分岐3Conditionallybranchtoline1条件付きで行1に分岐4Dowork実行Step1Createacodeflowgraphコードのフローグラフを作成1→22→32→13→43→14→nullStep2Identifystronglyconnectedsubgraphs各強連結部分グラフを識別11212Foundstronglyconnectedsubgraph強連結部分グラフを発見12123123Foundstronglyconnectedsubgraph強連結部分グラフを発見1231234Listofallstronglyconnectedsubgraphsすべての強連結部分グラフのリスト12123Step3Createcollectionsofstronglyconnectedsubgraphs強連結部分グラフの集合を作成Step3aCollection集合A12123Step3bCollection集合A123Collection集合B12集合Aの{1,2,3}の部分集合だったStep4Createacollectiongraph集合グラフを作成A→BStep5Analyzethelongestpathincollectiongraph集合グラフにおける最長の経路を解析Collection集合A0Collection集合B1Step6Sortcollections集合をソートCollection集合A0Collection集合B1Step7Assigntimecomplexity時間計算量を割り当て12223140Step8Interprettimecomplexity時間計算量を置き換え1O2O3O4OExampleassemblyprogramアセンブリプログラム例31Conditionallybranchtoline3条件付きで行3に分岐2Conditionallybranchtoline4条件付きで行4に分岐3Conditionallybranchtoline2条件付きで行2に分岐4Conditionallybranchtoline3条件付きで行3に分岐Step1Createacodeflowgraphコードのフローグラフを作成1→21→32→32→43→43→24→34→nullStep2Identifystronglyconnectedsubgraphs各強連結部分グラフを識別11313213241324Foundstronglyconnectedsubgraph強連結部分グラフを発見324132Foundstronglyconnectedsubgraph強連結部分グラフを発見32134134Foundstronglyconnectedsubgraph強連結部分グラフを発見341212412431243Foundstronglyconnectedsubgraph強連結部分グラフを発見2431243Foundstronglyconnectedsubgraph強連結部分グラフを発見43123123Foundstronglyconnectedsubgraph強連結部分グラフを発見2312341234Foundstronglyconnectedsubgraph強連結部分グラフを発見34Listofallstronglyconnectedsubgraphsすべての強連結部分グラフのリストいかなる重複も除外32432342434323Step3Createcollectionsofstronglyconnectedsubgraphs強連結部分グラフの集合を作成Step3aCollection集合A23243Collection集合B3232434Collection集合C43Step3bCollection集合A24323Collection集合B32434Collection集合C43Collection集合D32集合Bの{3,2,4}の部分集合だったStep4Createacollectiongraph集合グラフを作成Step4aA→BB→CA→DB→AB→CB→DC→DStep4cA→BB→ABreakbothconnectionsbetweenAandBAB間の両連結を非連結にするA→CA→DB→CB→DC→DStep5Analyzethelongestpathincollectiongraph集合グラフにおける最長の経路を解析Collection集合A0Collection集合B0Collection集合C1Collection集合D2Step6Sortcollections集合をソートCollection集合A0Collection集合B0Collection集合C1Collection集合D2Step7Assigntimecomplexity時間計算量を割り当て10233342Step8Interprettimecomplexity時間計算量を置き換え1O2O3O4O時間計算量検出アルゴリズムの組み合わせ本願では、時間計算量を計算する2つの方法として、アップブランチ法および強連結部分グラフ法を開示した。これらの相違点に加えて長所と短所を一覧にして以下に示す。アップブランチ法では、アルゴリズムが行番号に基づいてグループ分けを行う性質上、実際にはコードの行が閉路の一部ではない可能性がある場合に、このコードの行の時間計算量が誤って大きく判断されることがあるアセンブリプログラム例No.4を参照。アップブランチ法は控えめなものであり、コードの最初か最後の行が複数の閉路間で共有される場合には閉路を含むとは認識せず、ある閉路が行番号に関して他の閉路と部分的に重複する場合にも閉路を含むとは認識しないアセンブリプログラム例No.5を参照。強連結部分グラフ法は、ソースコードまたはアセンブリコードが実際には結果としてこの時間計算量とならない可能性がある場合でも、閉路を含むと積極的に認識する。これは分岐を行うコードの各行の実際の計算が解析されないことによる。これによっても時間計算量の精度が下がることになるため、Ologn等の計算量は得られない。強連結部分グラフ法では、コードの行の時間計算量が理論的に可能な時間計算量よりも小さく判断されることは決してないため、計算されるすべての時間計算量が最大値となる。アップブランチ法による時間計算量アルゴリズムおよび強連結部分グラフ法による時間計算量アルゴリズムの上記の長所と短所を踏まえて、以下の方策を取ることが有利である。強連結部分グラフ法を用いて、理論的に可能な最悪時間計算量を決定する。コードの各行の最小時間計算量は、アップブランチ法と強連結部分グラフ法とのいずれかから選択するアセンブリプログラム例No.4およびNo.5を参照。これにより、時間計算量を控えめに推定しつつ、アップブランチ法に存在する実際よりも大きい誤った時間計算量をいずれも除外する。その他の例時間計算量を計算する上に開示する2つの方法を用い、その結果を以下の2つのアセンブリプログラム例のために比較した。Exampleassemblyprogramアセンブリプログラム例41Conditionallybranchtoline3条件付きで行3に分岐2Unconditionallybranchtoline4無条件で行4に分岐このコードの行は閉路内にはない3Conditionallybranchtoline1条件付きで行1に分岐4Dowork実行UpBranchMethodofcomputingtimecomplexity時間計算量を計算するアップブランチ法1O2O3O4OStronglyConnectedSubgraphMethodofcomputingtimecomplexity時間計算量を計算する強連結部分グラフ法1O2O3O4OMinimumbetweeneachtimecomplexitymethod各時間計算量方法のうち最小値控えめで誤りがない1MinOO2MinOO3MinOO4MinOOExampleassemblyprogramアセンブリプログラム例51Conditionallybranchtoline3条件付きで行3に分岐2Unconditionallybranchtoline5無条件で行5に分岐このコードの行は閉路内にはない3Conditionallybranchtoline1条件付きで行1に分岐4Conditionallybranchtoline1条件付きで行1に分岐5Dowork実行UpBranchMethodofcomputingtimecomplexity時間計算量を計算するアップブランチ法1O2O3O4O5OStronglyConnectedSubgraphMethodofcomputingtimecomplexity時間計算量を計算する強連結部分グラフ法1O2O3O4O5OMinimumbetweeneachtimecomplexitymethod各時間計算量方法のうち最小値控えめで誤りがない1MinOO2MinOO3MinOO4MinOO4MinOO図11および図12は、複雑なコードシーケンスと、アップブランチ法および強連結部分グラフ法をそれぞれ用いて得られた対応する時間計算量の解析結果との一例を示す。より具体的には、図11は、コードシーケンスと、アップブランチ法を用いて得られたこのコードシーケンスの時間計算量との一例を示す。図12は、全く同じコードシーケンスと、強連結部分グラフ法を用いて得られた時間計算量の結果とを示す。図11および図12で分かるように、これらの2つの方法は性質や閉路検出のアプローチ等が異なるため、一部のコードの行の時間計算量の尺度についての値が異なる。したがって、上述のように、コードの各行の最小時間計算量の尺度をアップブランチ法と強連結部分グラフ法とのいずれかから選択することで、2つの方法を組み合わせればよい。これを図13に示す。これにより、時間計算量を控えめに推定したものを表し、アップブランチ法に本質的に起因する実際よりも大きい誤った時間計算量をいずれも除外する。以下に、例示を目的とする非限定のアルゴリズムの実施の一例を追加説明する。分岐機械命令行から分岐先の機械命令行に伸びるグラフィカルな矢印であって、a.複数の下向きの分岐がマシンコードの左側に現れ、i.分岐の元となる行における、iiに接続する横線と、ii.横線から分岐先の命令行まで下向きに進行する、iiiに接続する縦線と、iii.分岐の分岐先における、分岐先の命令を指す右向き矢印を有する横線とから成り、b.複数の上向きの分岐がマシンコードの右側に現れ、i.分岐の元となる行における、iiに接続する横線と、ii.横線から分岐先の命令行まで上向きに進行する、iiiに接続する縦線と、iii.分岐の分岐先における、分岐先の命令を指す左向き矢印を有する横線とから成り、c.互いの比較的近くに下向きおよび上向きに分岐する交互配置の機械命令が存在する場合に、下向きおよび上向きの分岐を組み合わせて反時計回りのフローを形成し、d.共通の分岐先を共有する分岐は、任意でそれらの縦線が互いに重なるように描かれ、e.共通の分岐先を共有しない分岐は、それらの縦線が互いに重ならないように描かれ、f.より近い分岐先を有する分岐は、より遠い分岐先を有する分岐よりもコードに近く位置する縦線を有するべきであり、g.他の関数に結合する分岐は、命令の右に向かう単一の横方向の両矢印で表され、h.戻り分岐は、命令の右に向かう単一の横方向の右向き矢印で表される、グラフィカルな矢印。分岐機械命令に続く機械命令はそれらが分岐命令の分岐先でない限り、以下のアルゴリズムに従ってタブ1つ字下げされる。a.すべての機械命令を字下げレベルがゼロとなるように初期化する。b.機械命令のリストを最初から最後までたどる。c.分岐機械命令に遭遇した場合、以下を実行する。i.分岐が下向きの場合、その分岐先にフリーズトークンでマーク付けする。ii.各行の字下げレベルをインクリメントしながら一連の機械命令をたどる。iii.フリーズトークンに遭遇した場合、その行の字下げレベルはインクリメントせず、ステップcを停止し、ステップbを続行する。コンピュータの時間計算量はコードの重要な特性であり、コードのブロックをそれぞれ対応する時間計算量で視覚的に示すことで視覚化できる。関数内のすべてのマシンコード命令の時間計算量は、ゼロ=O1、1=On、2=On2、3=On3等として、以下のアップブランチアルゴリズムによって決定できる。a.すべてのマシンコード命令を時間計算量がゼロとなるように初期化する。b.複数の前の命令に分岐するすべての条件分岐または無条件分岐のリストを構築する。c.すべての前への分岐のリストを、スキップするマシンコード命令の数が小さい方から大きい方へソートする。d.すべての前への分岐のリストをループする。i.この分岐について、分岐が1の時間計算量を表すとして分岐が表せる最大時間計算量を求める。ii.分岐の分岐先から開始してマシンコード分岐自体で終了するまですべてのマシンコード命令をループする。a.この分岐が表す最大時間計算量がこのマシンコード命令に関する前に記憶された時間計算量よりも大きい場合、この分岐が表す最大時間計算量をこのマシンコード命令に関する新たな時間計算量として記憶する。以下のアルゴリズムは、初期的な計算量明細書の後に記載する疑似コードを与えられると、ある分岐に関する最大時間計算量を決定できる。a.前の命令に分岐するすべての条件分岐または無条件分岐のリストが与えられると、スキップするマシンコード命令の数が小さい方から大きい方へソートする。b.当該分岐について、この分岐よりもスキップする命令の数が多いすべての分岐をループする。i.当該分岐がこの反復で検討中の分岐内に完全に含まれる場合、a.計算量は、現在の計算量とこの反復で検討中の分岐の計算量とのうち量が大きい方に等しいこのアルゴリズムを現在の計算量とともに再帰的に呼び出すことで決定される。c.計算量を返す。アップブランチ法によるマーク付け時間計算量アルゴリズムのソースコードの一例を以下に示す。上に開示する手法を用いてマシンコードまたはアセンブリコードを視覚的に変換することにより、例えばプログラマ等のユーザによる見直しや理解がより容易となり、場合によっては速度向上を目的として修正もできる。これらの方法はあらゆる種類のコンパイラが作成するマシンコードにおいて使用でき、開示する方法はコンピュータに限定されず、計算能力を有するあらゆる種類のマシンと連動して使用できる。例示を目的とする非限定の実施の例に関して本明細書の技術を説明してきたが、本発明はこの開示に限定されるものではない。本発明は、特許請求の範囲によって定義され、本明細書が具体的に開示するか否かにかかわらずすべての対応する構成および等価な構成を対象とすることが意図される。"