(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-10-20
(45)【発行日】2023-10-30
(54)【発明の名称】マスク関数を用いるコンパイラデバイス
(51)【国際特許分類】
G06F 21/14 20130101AFI20231023BHJP
【FI】
G06F21/14
(21)【出願番号】P 2020573351
(86)(22)【出願日】2019-07-05
(86)【国際出願番号】 EP2019068129
(87)【国際公開番号】W WO2020008045
(87)【国際公開日】2020-01-09
【審査請求日】2022-06-30
(32)【優先日】2018-07-06
(33)【優先権主張国・地域又は機関】EP
(73)【特許権者】
【識別番号】590000248
【氏名又は名称】コーニンクレッカ フィリップス エヌ ヴェ
【氏名又は名称原語表記】Koninklijke Philips N.V.
【住所又は居所原語表記】High Tech Campus 52, 5656 AG Eindhoven,Netherlands
(74)【代理人】
【識別番号】110001690
【氏名又は名称】弁理士法人M&Sパートナーズ
(72)【発明者】
【氏名】マロン ウィレム チャールズ
(72)【発明者】
【氏名】ペストリン アラン
(72)【発明者】
【氏名】ガルシア モーション オスカー
【審査官】平井 誠
(56)【参考文献】
【文献】特開2011-191993(JP,A)
【文献】特開2001-290653(JP,A)
【文献】米国特許出願公開第2011/0214179(US,A1)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 21/14
(57)【特許請求の範囲】
【請求項1】
コンピュータプログラム表現を受け取る通信インターフェースと、プロセッサとを含む、コンピュータプログラムを難読化するためのコンパイラデバイスであって、
前記プロセッサは、前記コンピュータプログラム表現に生存変数解析を行い、前記生存変数解析によって、前記コンピュータプログラム表現内に割り当てられている変数の集合に関連付けられている生存区間領域、変数が書き込まれている場所を示す定義情報、及び、変数が読み取られる場所を示す使用情報が取得され、
前記プロセッサはさらに、前記変数の集合から、第1の変数及び第2の変数を選択し、ここで、前記第2の変数は、前記第2の変数に関連付けられている前記定義情報に従って前記第1の変数に関連付けられている前記生存区間領域において定義されておらず、
前記プロセッサはさらに、前記定義情報によって、かつ、前記第1の変数に関連付けられている前記使用情報によって定義された場所において、少なくとも前記第2の変数を符号化パラメータとして使用して前記第1の変数を符号化する符号化コードを用いて前記コンピュータプログラム表現を修正する、
コンパイラデバイス。
【請求項2】
前記コンピュータプログラム表現は、制御フローグラフを含み、前記生存区間領域、前記定義情報、及び前記使用情報は、前記制御フローグラフ内のノードを構成する、請求項1に記載のコンパイラデバイス。
【請求項3】
前記プロセッサは、
前記変数の集合からランダムに第1の変数を選択するか、又は、
前記変数の集合から順に第1の変数を選択する、
請求項1又は2に記載のコンパイラデバイス。
【請求項4】
前記プロセッサは、
前記コンピュータプログラム表現内のコンパイラディレクティブに従って第1の変数を選択し、
第2の変数が存在するかどうかを決定し、存在しない場合は、警告信号を生成する、
請求項1から3のいずれか一項に記載のコンパイラデバイス。
【請求項5】
前記プロセッサは、
所与の第1の変数について複数の第2の変数を決定し、
前記決定された複数の第2の変数から、第2の変数をランダムに選択するか、又は、
前記第1の変数の前記生存区間領域により近い使用を有する第2の変数を選択する、
請求項1から4のいずれか一項に記載のコンパイラデバイス。
【請求項6】
前記符号化コードは、
前記第1の変数を前記第2の変数でマスクするか、又は、
前記第1の変数に符号化テーブルを適用し、前記符号化テーブルは、前記第2の変数を、キーとしての入力として受け取る、
請求項1から5のいずれか一項に記載のコンパイラデバイス。
【請求項7】
前記符号化コードは、前記第1の変数を剰余数系において符号化し、前記剰余数系のモジュライは、前記第2の変数から少なくとも部分的に導出される、
請求項1から6のいずれか一項に記載のコンパイラデバイス。
【請求項8】
前記コンピュータプログラム表現を修正することは、符号化された第1の変数に対する演算を符号化された演算に置き換えることを含む、請求項1から7のいずれか一項に記載のコンパイラデバイス。
【請求項9】
前記符号化された演算は、前記第2の変数を修正しない、請求項8に記載のコンパイラデバイス。
【請求項10】
前記プロセッサは、前記修正されたコンピュータプログラムをコンパイルする、請求項1から9のいずれか一項に記載のコンパイラデバイス。
【請求項11】
前記プロセッサは、構文解析、中間コード生成、コード最適化、割り当て、ターゲットコード生成のうちの1つ以上を行う、請求項1から10のいずれか一項に記載のコンパイラデバイス。
【請求項12】
コンピュータプログラムを難読化するためのコンパイラ方法であって、
コンピュータプログラム表現を受け取るステップと、
前記コンピュータプログラム表現に生存変数解析を行うステップであって、前記生存変数解析によって、前記コンピュータプログラム表現内に割り当てられている変数の集合に関連付けられている生存区間領域、変数が書き込まれている場所を示す定義情報、及び、変数が読み取られる場所を示す使用情報が取得される、ステップと、
前記変数の集合から、第1の変数及び第2の変数を選択するステップであって、前記第2の変数は、前記第2の変数に関連付けられている前記定義情報に従って前記第1の変数に関連付けられている前記生存区間領域において定義されていない、ステップと、
前記定義情報によって、かつ、前記第1の変数に関連付けられている前記使用情報によって定義された場所において、少なくとも前記第2の変数を符号化パラメータとして使用して前記第1の変数を符号化する符号化コードを用いて前記コンピュータプログラム表現を修正するステップと、
を含む、方法。
【請求項13】
プロセッサシステムに、請求項12に記載の方法を行わせるための命令を表す一時的又は非一時的データを含む、コンピュータ
読取可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンパイラデバイス、コンパイラ方法、及びコンピュータ可読媒体に関する。
【背景技術】
【0002】
コンピュータプログラムは、クラウド、パーソナルコンピュータ、又は組み込みデバイスなど、まったく異なる環境においてデータを処理する。プログラムによって使用又は処理されるデータは、高い値を有する可能性がある。例えば、所与の機能を実施する機械学習アルゴリズムは、機械学習プロセス中に学習された非常に特殊な重みを使用し得る。プログラムのリバースエンジニアリングによって、これらの重みを明らかにすることができるので、機械学習アルゴリズムを訓練するために使用されたデータへのアクセス、又は訓練プロセスを実現するために必要とされる計算能力へのアクセスを必要とせずに、攻撃者がアルゴリズム機能を容易に複製又は改善できる。同様に、他の攻撃を適用して、プログラムの機能を修正し、その可用性に影響を与え得る。例えば、攻撃者がタイミング若しくは消費電力を観察するか、又はグレーボックスファジャーを使用してバグを検出するグレーボックス攻撃である。
【0003】
過去数年の間に、データの機密性のための様々なタイプの保護(完全準同型スキーム及び符号化スキーム)が大幅に進歩した。また、プログラムの完全性(例えば、異なる難易度の完全性チェック)やプログラムの可用性のために、異なるタイプの保護がある。
【0004】
参照により本明細書に組み込まれる米国特許8752032号「System and method of interlocking to protect software-mediated program and device behaviours」に、最新のコンパイルデバイスの一例が説明されている。
【0005】
既知のコンパイラは、ソフトウェアのソースコードを受け取り、ソースコードをロジックの様々な基本ブロックに細分化する。これらの基本ブロックは、それらの内容及びプログラムのロジック及び制御フローにおけるそれらの位置に基づいて、様々な基本ブロック間の依存性を増大又は生成するように修正される。基本ブロックに対する修正は、いくつかの基本ブロックの出力を拡張する一方で、他の対応する基本ブロックの入力を同様に拡張して、それらの間にインターロックを提供するという効果を有する。インターロックは、システムの一部Yの動作が、他の一部Xの挙動を改ざんすることによって高い確率で一部Yの誤動作又は故障を引き起こすように、他の一部Xの動作によって影響を受けるようにする。
【0006】
プログラムは、制御フローグラフ(CFG)として表され得る。コンパイラでは、プログラムを介する可能な制御フローは、制御フローグラフ(CFG)によって表され得る。制御フローグラフ(CFG)では、実行可能コード(単一の始点、単一の終点を有し、その始点からその終点まで順番に実行される「直線」コードシーケンス)の基本ブロック(BB)がグラフノードによって表され、アークがBB Uに対応するノードをBB Vに対応するノードに、含まれるプログラムの実行中に、制御は常に、又は可能であれば、BB Uの終わりからBB Vの始まりまで流れる場合に接続する。
【発明の概要】
【発明が解決しようとする課題】
【0007】
標準的な難読化技法は、メモリのどこかに格納された固定パラメータによる値の難読化に依存する。しかしながら、値は、プログラムの動的解析によって容易に明らかにされる。符号化を使用して、アルゴリズムを保護できる。しかしながら、プログラム全体に対して多くの符号化を使用することは、パフォーマンスのペナルティにつながる可能性があり、また、単一の符号化を使用することは、リバースエンジニアリングをより容易にする。
【0008】
コンピュータプログラムを難読化するためのコンパイラデバイスが提供される。
【課題を解決するための手段】
【0009】
コンパイラデバイスは、
コンピュータプログラム表現を受け取る通信インターフェースと、
プロセッサと、
を含み、
プロセッサは、コンピュータプログラム表現に生存変数解析を行い、生存変数解析によって、コンピュータプログラム表現内に割り当てられている変数の集合に関連付けられている生存区間領域(liveness region)、定義情報、及び使用情報が取得され、
プロセッサはさらに、変数の集合から第1の変数及び第2の変数を選択し、第2の変数は、第2の変数に関連付けられている定義情報に従って第1の変数に関連付けられている生存区間領域において定義されておらず、
プロセッサはさらに、定義情報によって、かつ、第1の変数に関連付けられている使用情報によって定義された場所において、少なくとも第2の変数を符号化パラメータとして使用して第1の変数を符号化する符号化コードを用いてコンピュータプログラム表現を修正する。
【0010】
コンパイラデバイスは、値の動的保護を導入する。プログラムの一部で値が静的である第2の変数を使用して、プログラムのその部分で第1の変数を保護する。第1の変数は、特定の実行に依存する値で保護され、これにより、保護を覆すことを困難にする。特に、例えば、マスキングだけに使用された変数を特定し、除去するホワイトボックスの自動解析は、コンパイラデバイスによって導入される難読化には難点がある。難読化変数は、プログラム内で自然に発生し、プログラムの通常の機能で関数を行う通常の変数であってよい。このような変数の除去は、プログラムの関数に影響を与える。さらに、そのような変数を見つけることは、マスキング又は符号化などに加えて有用な機能を果たすため、困難である。
【0011】
保護された第1の変数は、自動的に選択できる。例えば、それらはランダムに選択されても、又は、変数のすべて若しくは一部が、例えば、適切な第2の変数が利用可能であるかどうかを決定するために、順番に検査されてもよい。特に重要な変数は、例えばコンパイラディレクティブによって、プログラマによって示されてもよい。コンパイラデバイスの自動適用により、このやり方で多くの変数を難読化できることが分かった。特に、実施形態は、局所変数、例えば、小さい生存区間領域を有する変数を難読化する際に有利である。例えば、一実施形態では、第1の変数は、小さい生存区間領域、例えば、最大で閾値数のブロックを有する変数の集合から選択される。閾値は、例えば、2、4などである。
【0012】
一実施形態では、第1の変数は、関数に従って、例えば、関数によって計算された順位付けに従って順番に、変数の集合から選択される。関数はランダムであっても、ランダム成分を有していてもよい。関数は、ヒューリスティックスを含んでもよい。
【0013】
実施形態は、例えば、ソースコードプログラムで定義される変数、中間表現で定義される変数、又はさらには疑似レジスタに適用され得る。疑似レジスタはまた、シンボリックレジスタの仮想とも呼ばれる。
【0014】
保護はマスキングに基づき得る。例えば、XORマスキング、加算及び減算、例えば、モジュロ又はモジュラスなどである。固定された符号化パラメータに対して可逆的である他の関数を使用してもよい。保護は、秘密パラメータが第1の変数に依存するRNSなどの符号化に基づき得る。符号化はまた、ルックアップテーブル又は多項式を介して実施してもよい。例えば、一実施形態では、第1の変数は第2の変数でマスクされる。例えば、一実施形態では、第1の変数は、符号化テーブルを第1の変数に適用することによって符号化され、テーブルは、第2の変数を符号化パラメータ(例えばキー)としての入力として受け取る。
【0015】
一実施形態では、符号化コードは、第1の変数を剰余数系で符号化し得、剰余数系のモジュライは、第2の変数から少なくとも部分的に導出される。剰余数系は、各々が同じ第2の変数に関して符号化されている複数の第1の変数に適用され得る。
【0016】
一実施形態では、コンピュータプログラム表現を修正することは、符号化された第1の変数に対する演算を符号化された演算に置き換えることを含む。例えば、複数の第1の変数は、同じ第2の変数で符号化される。符号化された変数に対する計算は、符号化された領域において完全に行われ得る。
【0017】
コンパイラデバイスは、電子デバイスである。これは、コンピュータ、例えば、デスクトップ、ラップトップ、サーバなどであり得る。本明細書に説明されるコンパイラ方法は、広範囲の実用的な用途に適用され得る。このような実用的な用途には、独自のアルゴリズム、暗号コード、鍵の保護、金融ソフトウェアの保護などを含むソフトウェアの保護が含まれる。
【0018】
本方法の一実施形態は、コンピュータで実施される方法として、専用ハードウェアで、又は両方の組合せで、コンピュータ上で実施され得る。本方法の一実施形態の実行可能コードは、コンピュータプログラム製品上に格納され得る。コンピュータプログラム製品の例としては、メモリデバイス、光記憶デバイス、集積回路、サーバ、オンラインソフトウェアなどが挙げられる。好ましくは、コンピュータプログラム製品は、コンピュータプログラム製品がコンピュータ上で実行されると、本方法の一実施形態を行うためのコンピュータ可読媒体上に格納された非一時的プログラムコードを含む。
【0019】
一実施形態では、コンピュータプログラムは、コンピュータプログラムがコンピュータ上で実行されると、本方法の一実施形態のステップのすべて又は一部を行うように適応されたコンピュータプログラムコードを含む。好ましくは、コンピュータプログラムがコンピュータ可読媒体上に具現化される。
【0020】
本発明の別の態様は、コンピュータプログラムをダウンロード用に利用可能にする方法を提供する。この態様は、コンピュータプログラムが、例えばApple(登録商標)のAppStore(登録商標)、Google(登録商標)のPlayStore(登録商標)又はMicrosoft(登録商標)のWindowsStore(登録商標)にアップロードされて、コンピュータプログラムがこのようなストアからダウンロードできるときに使用される。
【図面の簡単な説明】
【0021】
本発明のさらなる詳細、態様、及び実施形態は、単なる例として、図面を参照して説明される。図中の要素は、簡潔さかつ明瞭さのために示されており、必ずしも縮尺通りに描かれていない。図面において、既に説明された要素に対応する要素は、同じ参照番号を有する。
【0022】
【
図1】
図1は、符号化の一実施形態の一例を概略的に示す。
【
図2】
図2は、符号化の一実施形態の一例を概略的に示す。
【
図3a】
図3aは、コンピュータプログラム表現の一実施形態の一例を概略的に示す。
【
図3b】
図3bは、コンピュータプログラム表現の一実施形態の一例を概略的に示す。
【
図4a】
図4aは、コンパイラデバイスの一実施形態の一例を概略的に示す。
【
図4b】
図4bは、コンパイラデバイスの一実施形態の一例を概略的に示す。
【
図5】
図5は、コンパイラ方法の一実施形態の一例を概略的に示す。
【
図6a】
図6aは、一実施形態によるコンピュータプログラムを含む書き込み可能部分を有するコンピュータ可読媒体を概略的に示す。
【
図6b】
図6bは、一実施形態によるプロセッサシステムの表現を概略的に示す。
【0023】
図1~
図4b、
図6a、
図6bの参照番号一覧
210 プログラム実行フロー
212 第1の変数の集合
214 第2の変数の集合
310 コンピュータプログラム
320a 制御フローグラフ
321~323 基本ブロック
400 コンパイラデバイス
410 メモリ
420 プロセッサ
431 通信インターフェース
432 第1のコンパイラ部
433 第2のコンパイラ部
440 コンピュータプログラム表現
442 変数の集合
444 関連する生存区間領域
450a 生存区間解析器
460 変数セレクタ
462 コード修正器
1000 コンピュータ可読媒体
1010 書き込み可能部分
1020 コンピュータプログラム
1110 集積回路
1120a 処理ユニット
1122 メモリ
1124 専用集積回路
1126a 通信要素
1130 相互接続部
1140 プロセッサシステム
【発明を実施するための形態】
【0024】
本発明は、多くの異なる形態の実施形態が可能であるが、図面に示されており、本明細書では1つ以上の特定の実施形態を詳細に説明するが、本開示は、本発明の原理の例示と見なされるべきであり、示され説明される特定の実施形態に本発明を限定することを意図するものではないことを理解されたい。
【0025】
以下では、理解のために、実施形態の要素が動作中に説明される。しかしながら、それぞれの要素は、それらによって実行されるように説明されている機能を実行することは明らかであろう。さらに、本発明は実施形態に限定されず、本発明は本明細書に記載された、又は相互に異なる従属請求項に列挙された、すべての新規の特徴又は特徴の組合せにある。
【0026】
プログラムで使用される変数の値を難読化する多くの方法がある。例えば、難読化は、混乱を生成することによってプログラムを保護する。変数の値を隠す技法は、プログラムに格納された静的値を使用して変数の値を隠すことを含む。例えば、次のプログラムフラグメントを考える。このプログラムフラグメントは、生存区間解析(liveness analysis)又は第1及び第2の変数の選択を使用せずに難読化された。その代わりに、機密変数の後の発生をマスクする目的で、変数「mask」が追加される。
Mask=0x18AE762C9
Variable=confidential_value XOR Mask
...[program]...
Variable=Variable XOR Mask
Variable=Function(variable) XOR Mask
...[program]...
【0027】
この場合、マスクは、プログラムに格納された静的値又は固定値である。プログラム内の秘密値は、マスクされる、例えば、マスクでXORされる。その結果、コンパイル後、2行目の秘密値は、もはやコンパイル済みプログラムに明示的に格納されなくなる。値が後に使用されるとき、それはマスクでマスク解除されて、例えば、再びXORされて、プレーン値が利用可能になるが、実行中にのみ生成される計算値としてのみ利用可能になる。
【0028】
このタイプの難読化をさらに複雑にするために、難読化に使用される値が静的値の代わりに関数によって返される動的マスクが使用される。しかしながら、このようなアプローチは、関数が例えば、常に「0」を返すように修正され得るので、依然として容易に攻撃可能である。
【0029】
図1は、符号化の一実施形態の一例を概略的に示す。例えば、ホワイトボックス暗号技術の分野から生じる符号化方式は、アルゴリズム及びそのデータのリバースエンジニアリングをより困難にするために設計されてきている。符号化は、例えば、(i)ニブル、(ii)剰余数系、又は(iii)代数変換に基づく。
図1は、符号化された領域で実現される演算の抽象表現を示す。整数(R,+,*)の環上の評価関数f()の代わりに、Rにおける要素は、A及び代替演算
【数1】
において表現される要素に基づいて同じ関数f()を実装できるように、変換T()によって異なる領域Aに変換される。この実装は、F()と示される。このような方式は、T()がデータを暗号化するための公開鍵の使用を表現でき、F()で実現される演算には、符号化された演算及びある種の評価鍵が含まれ、逆変換は秘密鍵の使用と等価であるという意味で、(完全)準同型暗号化((F)HE)方式とある程度類似している。しかし、依然として大きな違いがある。例えば、変換T()及びT-1()の使用法は、通常、コード自体内にマージされ、抽出の難しさは、それらを実装する大きなテーブルをリバースエンジニアリングする難しさに依存する。
【0030】
標準的な難読化技法は、メモリのどこかに格納された固定パラメータによる値の難読化に依存する。しかしながら、値は、プログラムの動的解析によって、例えば、プログラムが実行されるときに値がどのように発展するかを解析することによって容易に明らかにされるが、これは、ある時点で、演算を行うために難読化を除去する必要があるからである。符号化を使用して、アルゴリズムを保護できる。しかしながら、プログラム全体に対して多くの符号化を使用することは、パフォーマンスのペナルティにつながる可能性がある。したがって、場合によっては、いくつかの、さらには単一の符号化を使用することが好ましい。この場合、攻撃者は、特定の符号化を知るだけで済むため、プログラムのリバースエンジニアリングが容易になる。
【0031】
一実施形態では、異なるアプローチが使用される。第1の変数の集合が、例えば、難読化又は符号化を使用して保護される。保護は、プログラムで使用される第2の変数の集合から導出される値を使用することによって達成される。第2の変数の集合は、第1の変数の集合を保護するために使用される間、静的であると決定される変数を含む。変数の難読化は、別の変数を使用することによって行われるので、提案する難読化技法は、最新技術で知られているものよりも、動的解析に対してよりレジリエントである。
【0032】
図2にこの考え方を示す。プログラム実行フロー210を示す。保護されるべき第1の変数の集合212が選択される。
図2の左側に、第1の変数の集合212が生存している領域、例えば、それらの値が定義又は使用され得る領域を示す。第1の集合を保護するために、第2の変数の集合214が特定される。変数の集合214は、集合212の生存区間領域(liveness region)に定義をたまたま持たない変数である。
図2の右側に、第2の変数の集合が静的なままである領域を示す。さもなければ、集合214は、保護に関係のない理由、例えば、プログラムの関数を実行するために、プログラム内で定義及び使用される通常の変数であってもよい。
【0033】
変数の集合212は、少なくとも集合212の保護範囲の間、静的なままである変数の集合214から導出される値Vによって、保護される(例えば、マスクされる、符号化される)。保護は、難読化に基づくことができ、例えば、変数の値がクリアに格納されないように、Vを使用して集合212内の変数をXORする。保護は、符号化に基づくこともでき、符号化はVに依存する。例えば、Vを使用して、RNS符号化で使用される秘密モジュライを取得する。
【0034】
図4aは、コンパイラデバイス400の一実施形態の一例を概略的に示す。例えば、コンパイラデバイス400は、コンピュータ(例えば、デスクトップコンピュータ、サーバ、ラップトップ、ネットブックなど)である。コンパイラデバイス400は、モバイルデバイス(例えば、携帯電話、PDAなど)でもよい。コンパイラデバイス400は、スマートカード、セットトップボックス、テレビなどでもよい。
【0035】
コンパイラデバイス400は、メモリ410を含む。メモリ400は、コンピュータプログラム表現、コンパイラソフトウェア、コンピュータプログラムコンパイルのうちの1つ以上を格納する揮発性メモリである。例えば、メモリ410はRAMメモリである。コンパイラデバイス400は、追加のメモリ、例えば不揮発性メモリ、例えばROMメモリ、及び/又は、揮発性メモリなどを有する。
【0036】
コンパイラデバイス400は、一実施形態による方法を実施するプロセッサ420を含む。例えば、メモリ410は、プロセッサによる実行のために構成されたコンピュータ命令を格納する。これは必須ではないが、例えば、コンパイラデバイス400は、コンピュータコード(例えばコンパイラコード)にアクセスするためのストレージインターフェースを含む。プロセッサは、ストレージインターフェースを介してオペレーティングシステムコード及び/又はコンパイラコードにアクセスし、当該コードを実行する。ストレージインターフェースは、ローカルストレージ(例えばローカルメモリ、ハードディスクなど)、又は非ローカルストレージ(例えばクラウドストレージ)へのインターフェースであってもよい。メモリ410は、プロセッサが作用するデータを含み得る。
【0037】
様々な実施形態における計算デバイスの動作は、プロセッサ(例えばプロセッサ回路)において実装されてもよく、その例を本明細書に示す。以下の図のいくつかは、プロセッサの機能ユニットであり得る機能ユニットを示す。例えば、
図4bは、プロセッサの可能な機能構成の設計図として使用される。
図4bでは、プロセッサ回路はユニットとは別個に示されていない。例えば、図に示される機能ユニットは、デバイスのメモリ(例えばデバイスの電子メモリ)に格納され、デバイスのマイクロプロセッサによって実行可能なコンピュータ命令において、全体的に又は部分的に実装される。ハイブリッド実施形態では、機能ユニットは、部分的にハードウェアで(例えばコプロセッサとして)実装され、部分的にデバイス上に格納され実行されるソフトウェアで実装される。プロセッサは、まとめられることでプロセッサを形成する複数のサブプロセッサを含み得る。例えば、プロセッサは、複数のプロセッサ回路を含む。
【0038】
コンパイラデバイス400は、コンパイラデバイス400の用途に応じて、追加のハードウェア及び/又はソフトウェア要素を含み得る。例えば、コンパイラデバイス400は、コンピュータネットワークを介する通信のための通信インターフェース、又はコンパイラデバイス400に接続可能なディスプレイ上での計算結果を表示のためのディスプレイインターフェースを含む。
【0039】
例えば、コンパイラデバイス400は、コンピュータネットワークを介して通信する。コンピュータネットワークは、インターネット、イントラネット、LAN、WLANなどである。コンピュータネットワークは、インターネットでもよい。コンピュータネットワークは、全体若しくは一部が有線、及び/又は全体若しくは一部が無線であってもよい。例えば、コンピュータネットワークは、イーサネット(登録商標)接続を含む。例えば、コンピュータネットワークは、Wi-Fi(登録商標)、ZigBee(登録商標)などの無線接続を含む。デバイスは、必要に応じて他の電子デバイス(例えば他のコンピューティングデバイス及び/又はコンパイルデバイス)と通信するための接続インターフェースを含んでもよい。例えば、接続インターフェースは、コネクタ(例えば有線コネクタ、例えばイーサネット(登録商標)コネクタ、又は無線コネクタ、例えばアンテナ、例えばWi-Fi(登録商標)、4G又は5Gアンテナ)を含む。例えば、デバイス400は、通信インターフェース431を含む。
【0040】
図4bは、コンパイラデバイス400の一実施形態の一例を概略的に示す。コンパイラデバイス400は、コンピュータプログラム表現を受信する通信インターフェース431を含む。例えば、コンピュータプログラム表現は、コンピュータネットワーク、又はコンピュータストレージなどから受信される。例えば、通信インターフェース431は、コンピュータネットワークインターフェース又はコンピュータストレージインターフェースである。例えば、コンピュータプログラム表現は、コンピュータ言語(例えばいわゆるソースコード)で書かれる。例えば、コンピュータプログラム表現は、ソースコードファイルである。例えば、ソースコードは、C、C#、C++、Swift、Java(登録商標)、F#などの高レベルのコンピュータプログラム言語で書かれる。例えば、コンピュータプログラム表現は、例えばテキストで書かれたステートメントの線形シーケンスを含む。
【0041】
コンピュータ言語表現は、中間コンパイラ言語で書かれてもよい。例えば、中間コンパイラ言語には、レジスタ転送言語(RTL)、中の中間言語表現(MIR)、低の中間言語表現(LIR)などの言語が含まれる。後者の2つの言語は、S.Muchnickによる「Advanced Compiler design & Implementation」に説明されている。これらの中間言語は、例えばステートメント(例えば言語要素)のシーケンス(例えば配列など)として、線形に編成されるか、又はフラットである。中間言語では、ループ制御構造のようなものがもはや利用できなくなり、配列アクセスは、ポインタオフセットの観点から表現され、変数はすでに(シンボリック)レジスタに割り当てられている場合がある。
【0042】
コンピュータ言語表現はまた、有向グラフの形態であってもよく、例えば、線形に順序付けられていなくてもよい。例えば、コンピュータ言語表現は、いわゆる制御フローグラフである。制御フローグラフ(CFG)は、基本ブロックB1、…、Bnをノードとする有向グラフである。制御がB1からB2に流れることができる場合、有向エッジB1→B2が存在する。コンピュータ言語表現は、静的単一代入(SSA)形式にすることができるが、これは必須ではない。制御フローグラフは、中間表現、すなわち、ソースとターゲット機械語との間の途中にあるプログラムの表現である。CFGは、基本ブロックの代わりに、ノードとしてより小さなプログラム部分(例えば、基本ブロックとしての個々のステートメント)、又はより大きなプログラム部分(例えば、拡張基本ブロック)を有することができる。
【0043】
CFGは、例えば、各プロシージャの中間コードを基本ブロックに分割することによって構築される。基本ブロックは一片の直線コードであり、例えば、ブロックの中央への又はそこからのジャンプがない。CFGは、グラフのソース及びシンクであるENTERやEXITなど、1つ以上の特殊なノードを有する。各基本ブロックの内部には、任意の既知の中間表現(例えばタプル、樹、DAGなど)があり得る。
【0044】
コンピュータプログラムの様々な可能な表現は、互いに変換される。例えば、制御フローグラフは、コンピュータプログラム言語(例えばソースコード言語)及び/又はコンパイラ中間言語の表現から生成されてもよいし、又はその反対も可能である。
【0045】
一実施形態では、デバイス400は、第1のコンパイラ部432を含む。例えば、第1のコンパイラ部432は、第1のコンピュータプログラム表現を受け取り、第2のコンピュータプログラム表現を生成する。例えば、第1及び第2の表現は、異なる言語である。例えば、第1のコンピュータプログラム表現は、線形言語であり、第2のコンピュータプログラム表現は、樹(例えば制御フローグラフ)である。例えば、第1のコンピュータプログラム表現は、ソースコード言語(例えば高レベル言語)であり、第2のコンピュータプログラム表現はコンパイラ中間言語である。
【0046】
例えば、一実施形態において、第1のコンパイラ部432は、パーサ、意味解析器、及びコード生成器を含む。コード発生器は、例えば、LIR発生器、CFG発生器などである。第1のコンパイラ部432は、オプティマイザ、レジスタアロケータなどを含んでもよい。
【0047】
第1のコンパイラ部432は、変数の数を変更できる。例えば、変数は、例えば、デッドコード除去、強度低減などによって除去される。例えば、いくつかの変数が導入されてもよく、例えば、単一の変数が複数の変数に分割されてもよく、一時的な変数が導入されてもよい。
【0048】
一実施形態では、通信インターフェース431は、内部インターフェース(例えばアプリケーションプログラミングインターフェース)である。例えば、通信インターフェース431は、例えば、既にコンパイラ中間言語であるコンピュータプログラムの中間形式か、又はCFG及び/若しくはSSAなどの樹形式を受け取る。例えば、コンパイラデバイスは、さらなるコンパイラデバイスの一部(例えばサブルーチン)として使用される。
【0049】
一実施形態では、コンピュータプログラム表現は、制御フローグラフである。CFGは、通信インターフェース431で受信されてもよいし、第1コンパイラ部432によって生成されてもよい。例えば、
図3aは、フラット表現と呼ばれることもある線形言語のコンピュータプログラム310のフラグメントの一例を示す。言語は、高レベルソースコード言語でもコンパイラ中間言語でもよい。プログラム310の最終行は「return」とマークされて、例えば、サブルーチンからのリターンを示す。代わりに、プログラムフラグメントは、例えば、追加のプログラムステートメントなどを用いて継続することもできる。
【0050】
図3bは、プログラム表現310から生成された制御フローグラフ320を示す。コンピュータプログラム表現は、より大きなコンピュータプログラム(例えば、ルーチン、プロシージャ、ユニット、ライブラリなど)の一部であり得る。基本ブロックの代わりに、コンピュータプログラムの部分への別の分割(例えば拡張基本ブロック)を使用してもよい。
図3bのCFGは、基本ブロックを含むノードを有する。例えば、CFG320は6つの基本ブロックを含み、そのうちの3つは、基本ブロック321、322、及び323とマークされている。
【0051】
コンパイラデバイス400は、生存区間解析器450を含む。生存区間解析器450は、例えば、第1のコンパイラ部分432から、又は通信インターフェース431から、コンピュータプログラム表現440を受け取る。生存区間解析器450は、コンピュータプログラム表現440に対して生存変数(live variable)解析を行う。生存変数解析によって、コンピュータプログラム表現440に割り当てられた変数の集合442に関連付けられた生存区間領域444が生成される。変数の集合442は、生存区間解析器450によって生成されても、又は別のエンティティによって生成されてもよい。変数の集合442はまた、明示的に(例えば、割り当ての集合としてなど)、又は暗黙的に(例えば、それらの使用によって定義されるように)、コンピュータプログラム表現440の一部であり得る。
【0052】
生存区間解析器450は、変数の集合のための定義情報(define-information)及び使用情報(use-information)を生成し得る。例えば、定義情報は、変数の書き込み場所を示し、使用情報は、変数の読み取り場所を示す。例えば、定義情報は変数が定義された(例えば宣言及び/又は変更された)ときを含む。
【0053】
変数の集合442は、例えば、すべて変数で、例えば、未決定の順序にある。変数の集合442は、任意選択的に、変数の範囲又は生存区間範囲などのヒューリスティックスに従った順序にある、すべての変数の部分集合であり得る。
【0054】
例えば、コンピュータプログラム表現440(例えば制御フローグラフ)は、基本ブロック(例えば基本ブロックノード)の集合を含む。生存区間領域及び定義/使用情報は、基本ブロック(例えば、CFG内のノード)に関連付けられ得る。あるいは、生存区間情報は、CFG内のエッジに関連付けられてもよい。
【0055】
コンパイラ理論では、生存変数解析(生存区間解析とも呼ばれる)は、各プログラムポイントについて、次の書き込みの前に読み出される可能性がある変数(例えば、各プログラムポイントからの出口で生存している変数)を計算するためにコンパイラによって実行されるデータフロー解析である。変数は、将来必要とされ得る値を保持する場合、生存していると見なされ得る。
【0056】
生存区間解析は、好ましくはステートメントごとに行われる。例えば、1つ以上の変数を書き込むか読み取るステートメントごとに、そのポイントにおいてどの変数が生存しているかが決定される。生存区間解析は、コンピュータプログラム表現が基本ブロックに分割されるときに行われてもよく、生存区間解析は、基本ブロック内の各ステートメントについて行われてもよい。例えば、基本ブロックはCFGのノードである。生存区間解析にCFGを使用するのではなく、フラットプログラムコード(例えばフラグメント310)に直接解析を行うこともできる。
【0057】
生存区間解析は、生存変数の数を過大評価することが可能である。これにより、考慮からいくつかの可能なマスキングが外されるが、修正されたプログラムの正しさには影響しない。生存区間解析は、結果の生存集合が大きすぎることで、各ステートメントにわたる非生存集合が小さすぎる限り、不正確であり得る。
【0058】
例えば、生存区間解析は、ブロック又はステートメントごとに、例えば行ごとに行われる。後者は、より細粒の生存区間領域が得られるので有利であり得る。生存区間解析はまた、ブロックごとに行うこともできるが、ブロック境界のみでの生存又は非生存情報では十分ではない場合がある。例えば、ブロック境界での生存区間解析は、各基本ブロックBに、変数が書き込まれる前にBで使用される変数の集合use(B)、Bで書き込まれた変数の集合def(B)、Bの始まりにおいて生存している変数の集合in(B)、及びBの終わりにおいて生存している変数の集合out(B)を割り当てることができる。集合in()及びout()は、再帰方程式:in(B)=use(B)∪(out(B)-def(B))及びout(B)=Us∈succ(B)in(S)を使用して定義される。Succ(B)は、Bのサクセサノードである。これらの方程式は、基本ブロックにわたって反復し、すべてのブロックについて方程式が満たされるまで、in(B)及びout(B)を更新することによって満たすことができる。生存区間解析は、例えば、Muchnickのセクション14.1.3「Live variables analysis」のアルゴリズム、又はAndrew W.Appel、Maja Grinburgによる「Modern Complier Implementation in C」の第10章(「livenss analysis」)の生存区間アルゴリズムを使用する。
【0059】
ブロックレベルでの生存区間解析の後、ステートメントレベルでの生存区間を得ることができる。例えば、ブロックの後方トラバーサルを行うことができ、ブロックのライブアウト(live-out)集合で初期化され、各ステートメントにわたる生存変数を決定するために使用される。例えば、ブロック境界に不正確な情報(生存が多すぎる)を格納できるが、非生存集合は好ましくは命令レベル粒度で決定される。変数は、ブロック境界では非生存であり、ブロック内では生存していることに留意されたい。例えば、所与の変数xの生存区間を推定するために、それは、xがin(B)、out(B)又はuse(B)のいずれかで発生するブロックBで生存しているとみなされる。
【0060】
例えば、生存区間解析は後退解析で行われる。解析は逆順に行われ、データフロー合流演算子は和集合に設定される。つまり、関数内の特定の数の論理枝を持つ関数に生存区間解析を適用する場合、解析は、関数の終わりから開始して始まりに向かって実行され、関数内で前方に移動する枝のいずれかが変数の現在値を必要とする可能性がある場合、変数は生存していると見なされる。
【0061】
例えば、CFG320の生存区間解析は、変数cがout(Block 322)、in(Block 323)にあることを見つける。変数cの生存区間領域は、ブロック322及びブロック323であると結論付けられる。しかしながら、例えば、個々のステートメントのレベルでのより綿密な解析が、生存区間領域を変更する場合がある。例えば、変数cは、基本ブロック323の2行目では使用されないので、変数cの生存区間領域は、ブロック322とブロック323の1行目として定義される。in(Block 321)は、変数b、d、x、t、f、eであり、これらの変数は、推定されるように、コンピュータプログラム310の別のフラグメントで定義されていることに留意されたい。
【0062】
例えば、CFG320を考慮すると、変数の集合442は{a,b,c,d,e,f,g,h,x}である。例えば、変数cはout(Block 322)であり、in(Block 323)内であるので、変数cの生存区間領域はブロック322及び323である。集合442は、ヒューリスティック規則に従って制限され得る。例えば、変数(例えば変数x)は、変数が異なるプログラムユニット(例えばライブラリなど)においてのみ定義される場合、例えば、システムライブラリにおいて定義される、例えば、決して又はほとんど変更されない、本質的に一定であるグローバル変数である場合、集合442から省略されてもよい。
【0063】
生存区間領域は、暗黙的に格納されてもよい。例えば、一実施形態では、解析アルゴリズムの後に、プログラム内の特定のポイントで生存しているすべての変数が決定される。したがって、変数の生存区間領域に属するコード内の点が既知となる。例えば、コンピュータプログラム表現440は、生存区間情報で拡張される。例えば、コンピュータプログラム表現440のノード、線、又は要素は、そのポイントで生存している変数を示す情報に関連付けられる(例えばタグ付けされる)。関連情報には、定義情報及び使用情報も含まれてよい。あるいは、生存区間領域、定義情報及び使用情報のうちの1つ以上又はすべてがコンピュータプログラム表現440から外部に格納されてもよい。例えば、変数の集合442は、生存区間、定義、及び使用に関する関連情報を有する。例えば、変数の集合442、ならびに、生存区間、定義及び使用に関する変数に関連付けられる情報は、リスト、データベースなどに格納される。
【0064】
コンピュータプログラム表現が、例えばテキストファイルのように、線形(例えばフラット)である場合、変数xの生存区間は、変数xが定義される最初のプログラムポイントp1、及び変数xが使用される最後のプログラムポイントp2として決定される。この表現の結果は、多すぎる変数がステートメントにわたって生存していると示され、したがって、非生存集合が小さすぎる。しかし、これはマスキングの可能性は少なくするが、正しさは妨害しない。
【0065】
変数が複数の場所で定義されている場合、変数の生存期間を分割して、これらの生存期間のそれぞれを個別にマスクすることができる。しかしながら、このようなアプローチは、最初にSSA変換を適用し、次いで、生存区間解析を適用し、続いてマスキングアルゴリズムを適用することと同等である。
【0066】
コンパイラデバイス400は、セレクタ460を有する。セレクタ460は、変数の集合442から、第1の変数及び第2の変数を選択する。第2の変数は、第2の変数に関連付けられた定義情報に従って第1の変数に関連付けられた生存区間領域において定義されていない。
【0067】
例えば、変数cを第1の変数と考える。基本ブロックレベル(例えば基本ブロック322及び323)で生存区間をとると、セレクタ460は、変数a、b、d、g、h、xのいずれか1つを第2の変数として選択する。これは、これらの変数のいずれもブロック322及び323において定義されていないからである。例えば、変数bを第2の変数とすると、ブロック322及び323(フラグメント310の3から6行目)は、次のように書き換えられる:
c:=ENC(b/d,b)
if DEC(c,b)<x goto L2
e:=b/DEC(c,b)
f:=e+1
【0068】
上記の場合、第1の変数cは、変数bを符号化パラメータとして使用して符号化され、同じ変数bを使用して復号される。この場合、第1の変数cが符号化される符号化演算が使用され、cが使用される復号演算が使用される。
【0069】
書き換えは、デバイス400のコード修正器462によって行われ得る。コード修正器462は、定義情報によって定義された場所において、かつ、少なくとも第2の変数を符号化パラメータとして使用して第1の変数を符号化する符号化コードを用いて、第1の変数に関連付けられた使用情報によって、コンピュータプログラム表現を修正し得る。ENC及びDECの最初のパラメータの後のパラメータは、ここでは符号化パラメータとして使用される。これらは、DEC(ENC(x,y1,…,yn)y1,…,yn)=xという特性がある。
【0070】
例えば、コード修正器462は、変数cがブロック322の1及び2行目ならびにブロック323の1行目で定義及び/又は使用されることを、定義情報及び使用情報から得る。あるいは、定義情報は、フラグメント310の3から5行目を指してもよい。この場合、コード修正器462は、第1の変数が定義されている符号化ルーチンと、第1の変数が使用されている復号ルーチンとを挿入する。
【0071】
生存区間解析は、結果の生存集合が大きすぎることで、各ステートメントにわたる非生存集合が小さすぎる限り、不正確であり得る。生存区間解析がより小さい粒度で、例えばプログラム310において、例えばステートメントのレベルで行われる場合、変数e及びfは、ブロック323において定義されているが、変数cを符号化するために依然として使用され得ることが分かり得る。これは、後者の生存区間領域はブロック323の最終ステートメントに拡張されないからである。従って、フラグメントは以下のように修正され得る:
c:=ENC(b/d,e+f)
if DEC(c,e+f)<x goto L2
e:=b/DEC(c,e+f)
f:=e+1
【0072】
上記の例では、複数の第2の変数から導出された値、すなわち、この場合、第2の変数e及びfから導出された値e+fが符号化パラメータとして使用される。
【0073】
第2の変数は、ランダムに選択されてもよい。例えば、セレクタ460は、複数の第2の変数を決定し、そこから変数がランダムに選択される。例えば、この場合、セレクタ460は、変数a、b、d、g、h、xからランダム変数を選択する。
【0074】
一実施形態では、セレクタ460は、ヒューリスティックスを適用して、1つ以上の第2の変数を選択することができる。例えば、一実施形態では、セレクタ460は、第1の変数の生存区間領域により近い使用を有する第2の変数を選択する。例えば、変数d及びxは、変数cの生存区間領域におけるブロックの集合から距離1にあるブロックにおいて使用される変数a、b、g、hよりも近い変数cの生存区間領域において使用される。
【0075】
同様に、セレクタ460は、第1の変数の生存区間領域により近い定義、より好ましくは一定ではない定義を有する第2の変数を選択し得る。例えば、変数a、b、g、hは、距離1のブロックにおいて定義され、変数d、xは、このプログラムフラグメントでは定義されない。
【0076】
例えば、セレクタ460は、異なるヒューリスティックスに従って異なる重み付けを割り当て、重み付けの合計に従って、集合442内の変数をランク付けする。1つ以上の変数は、高いランク、例えば、最も高いランク又は閾値を上回るランクなどを有する第2の変数として選択され得る。
【0077】
一実施形態では、セレクタ460は、複数の第2の変数を選択し、コード修正器462は、複数の第2の変数を符号化パラメータとして使用する。例えば、同じプログラムコード行は、次のように書き換えられる:
c:=ENC(b/d,b,d)
if DEC(c,b,d)<x goto L2
e:=b/DEC(c,b,d)
f:=e+1
【0078】
上記の場合、複数の符号化及び復号パラメータを取る符号化及び復号関数を使用する。あるいは、コードを次のように書き換えられる:
I:
V1:=ENC_PARAM(b,d)
c:=ENC(b/d,V1)
V2:=:=ENC_PARAM(b、d)
if DEC(c,V2)<x goto L2
V3:=ENC_PARAM(b,d)
e:=b/DEC(c,V3)
f:=e+1
又は、
II:
V:=ENC_PARAM(b,d)
c:=ENC(b/d,V)
if DEC(c,V)<x goto L2
e:=b/DEC(c,V)
f:=e+1
【0079】
上記の場合I及びIIでは、符号化パラメータは、複数の第2の変数から計算され、第1の変数の符号化又は復号パラメータとして使用される。第1のオプションIでは、符号化パラメータは、例えばそれが必要とされるたびに、又は少なくとも複数回計算される。第2のオプションIIでは、符号化パラメータは、例えば第1の符号化演算の前に、1回計算される。符号化及び復号演算は、有利には、入力として第1及び第2の変数を取るルックアップテーブル又は多項式関数を使用して行うことができる。例えば、第1の変数cを第2の変数yで符号化するには、Enc(c,y)=table[c][y]を使用する。
【0080】
一実施形態では、符号化/復号は、マスキング演算であり得る。例えば、コードは次のように書き換えられる:
c:=(b/d)+b
if c-b<x goto L2
e:=b/(c-b)
f:=e+1
【0081】
上記の場合、マスキングは、算術マスキングであり、代わりにXOR演算を使用してもよい。
【0082】
一実施形態では、セレクタ460は、第1の変数の生存区間領域の前に定義される、例えば、第1の変数の生存区間領域に生存する第2の変数のみを選択する。この選択の利点は、第2のコンパイラ部に通常のコンパイラを使用できることである。例えば、コード修正器462は、フラットプログラムコード(場合によっては中間、場合によっては高レベル)を修正することができ、デバイス400は、従来のコンパイラを使用して、例えば、第2のコンパイラ部433でコンパイルを終了する。一実施形態では、変数が第1の変数の生存区間領域中に一定である限り、変数が定義される前に変数を使用することが可能である。しかしながら、変数が定義される前に変数を使用することは、従来のコンパイラを混乱させ、例えば、警告又はエラーにつながる。
【0083】
一実施形態では、セレクタ460は、複数の第1の変数を選択し得る。例えば、選択された第1の変数は、同じ生存区間領域、重なり合う生存区間領域、又は閾値内にある(例えば2つの基本ブロック内にある)生存区間領域を有する。変数セレクタ460によって選択される1つ以上の第2の変数は、いずれの第1の変数の生存区間領域にも定義されない。
【0084】
一実施形態では、コード修正器462は、第1の変数を剰余数系で符号化し、剰余数系のモジュライは、第2の変数から少なくとも部分的に導出される。剰余数系を使用することは、複数の第1の変数には特に有利である。例えば、プログラムコードは、次のように書き換えられる:
V1:=RNS_MODULUS(b)
V2:=RNS_MODULUS(d)
c:=RNS_ENC(b/d,V1,V2)
if RNS_DEC(c,V1,V2)<x goto L2
e:=b/RNS_DEC(c,V1,V2)
f:=e+1
あるいは、
V:=RNS_MODULI(b,d)
c:=RNS_ENC(b/d,V)
if RNS_DEC(c,V)<x goto L2
e:=b/RNS_DEC(c,V)
f:=e+1
あるいは
V:=RNS_MODULI(b,d)
c:=RNS_ENC(b/d,V)
x1:=RNS_ENC(x,V)
if RNS_CMP(c,x1) goto L2
e:=b/RNS_DEC(c,V)
f:=e+1
【0085】
第2のオプションでは、符号化パラメータVは、複数の符号化パラメータ(ここでは、複数のRNSパラメータ)の集合である。第3のオプションでは、変数xは、例えば生存区間領域が大きすぎることから、第1の変数として使用されないが、符号化された第1の変数と共に符号化された入力として使用できるように、一時的に符号化される。例えば、一実施形態では、コンパイラデバイス、例えばセレクタ460は、第1の変数の生存区間領域で使用されるが定義されない1つ以上のさらなる変数を選択する。1つ以上のさらなる変数は、第2の変数で符号化され得る。例えば、符号化されたさらなる変数は、第1の変数の生存区間領域の外側でもはや使用されない。例えば、デッドコード削除最適化が、符号化されたさらなる変数を除去する。符号化されたさらなる変数はこの領域において静的であるため、さらなる変数を、使用後に、例えば、復号することなく、廃棄しても差し支えない。
【0086】
RNSモジュライを明示的に計算することが回避され得る。RNSモジュライの計算は、符号化/復号又は計算関数に統合され得る。例えば、コードは以下のように書き換えられる:
c:=RNS_ENC(b/d,b,d)
x1:=RNS_ENC(x,b,d)
if RNS_CMP(c,x1,b,d) goto L2
e:=b/RNS_DEC(c,b,d)
f:=e+1
【0087】
上記のコードでは、RNS符号化及び復号演算は、1つ以上の符号化パラメータ(この場合、2:b及びd)を取る。復号なしの比較演算などのRNS演算も、符号化パラメータ(複数可)を入力としても取り得る。例えば、符号化コード、復号コード、及び/又は演算コードは、符号化パラメータを入力として取り、そこから、例えば符号化パラメータをシードとして取ってRNSモジュライを計算する。このアプローチの利点は、モジュライは、RNS演算の外部に格納する必要がないことである。RNSでは、いくつかの演算を復号なしで行うことができる。例えば、RNS_ADDは復号を必要としない。
【0088】
例えば、コード修正器462は、変数が定義された1つ以上の場所を取得し、符号化又はマスキングコードを追加する。例えば、定義c:=f(x1,…,xn)では、符号化は、第1の変数cが符号化されるように外部レベルで追加される。例えば、c:=ENC(f(x1,…,xn),encoding variable(s)。例えば、コード修正器462は、変数が使用される1つ以上の場所を取得し、復号又はデマスキングコードを追加する。例えば、使用y:=g(c,…)では、復号が第1の変数に追加される。例えば、y:=g(DEC(c,encoding variable(s),…)。
【0089】
一実施形態では、コード修正器462は、符号化された第1の変数に対する演算を符号化された演算で置き換え得る。例えば、一実施形態では、同じ第2の変数で保護される複数の異なる第1の変数が特定される。例えば、変数c1、c2、及びc3はすべて、同じ1つ以上の変数vで符号化される。
【0090】
符号化されていない第1の変数に対する演算c1=f(c1,c2)を、c1=F(c1,c2)又はc1=f(c1,c2,v)に置き換え得る。ここで、関数Fは、符号化された変数を入力として取り、符号化された変数を出力として生成する。関数が符号化されていない変数に出力する場合、符号化された変数を入力として取り、符号化されていない出力、例えばd=F(c1,c2,v)を生成する関数を使用し得、ここで、dは符号化されていない。例えば、マスキングを例にとると、c1、c2、c3、c4を第1の変数とし、vを1つ以上の第2の変数とし、dを符号化されていない変数として、次のプログラムフラグメント:
c1:=a
c2:=b
c3:=ADD(c1,c2)
d:=ADD(c3,c2)
c4:=ADD(c1,d)
は、(I)のように符号化され得る。
c1:=ADD(a,v)
c2:=ADD(b,v)
c3:=ADD(SUB(c1,v),SUB(c2,v),v)
d:=ADD(SUB(c3,v),SUB(c2,v))
c4:=ADD(SUB(c1,v),d)
しかし、(II)としても符号化され得る。
c1:=ADD(a,v)
c2:=ADD(b,v)
c3:=ADD_1(c1,c2,v)
d:=ADD_2(c3,c2,v)
c4:=ADD_3(c1,d)
【0091】
実施例(I)では、符号化演算が第1の変数の各定義に追加され(この場合、符号化は算術マスキング)、復号演算が第1の変数の各使用に追加される(この場合、復号は算術デマスキング)。
【0092】
実施例(II)では、第1の変数を定義する演算c3:=ADD(c1,c2)が第1の変数で特定される。演算ADDは、演算ADD_1に置き換えられる。演算ADD_1は、符号化された変数を入力とし、符号化された変数を出力として生成する。この場合、ADD_1はc1+c2-vとして定義できる。
【0093】
さらに、符号化されていない変数を定義する演算d:=ADD(c3,c2)が第1の変数で特定される。演算ADDは、演算ADD_2に置き換えられる。演算ADD_2は、符号化された変数を入力として取り、符号化されていない変数を出力として生成する。この場合、ADD_2はc1+c2-2vとして定義できる。
【0094】
符号化及び/若しくは非符号化入力、並びに/又は、符号化及び/若しくは非符号化出力の他の組合せも可能である。例えば、演算c4:=ADD(c1,d)は、混合された符号化入力及び符号化出力を有する。演算ADDは、符号化された変数と符号化されていない変数の組合せを入力として取り、符号化された変数を出力として生成する演算ADD_3に置き換えられ得る。この場合、ADD_3はc1+dとして定義できる。
【0095】
なお、これらの例では、置換された演算は、第2の変数を入力として取る場合もあれば、取らない場合もある。演算の置換は、演算が符号化された領域で行われ得る準同型符号化に特に有利である。例えば、符号化は、ある数を、1つ以上の第2のモジュライに依存するモジュライを有するRNS数系に変換する。RNS符号化数に対する演算はRNS演算で置き換えることができる。例えば、加算又は乗算を、RNS加算又は乗算などで置き換えることができる。
【0096】
例として、以下の典型的なCプログラムフラグメントを考える:
(...)
for(int i=0;i<=10;i++)
{
for(int j=0;j<=10;j++)
{
data[i,j]=0;
}
}
(...)
【0097】
生存区間解析器は、変数i及びjがほぼ同じ生存区間領域、例えば、それらの生存区間領域が重なり合い、それらの差が閾値内にあることを見出し得る。したがって、変数i及びjは、第2の変数(必ずしも上記に示されていない)に依存するモジュライを有するRNS数系において符号化され得る。ループインデックスのすべての計算は、符号化された変数に対して行われてよい。しかしながら、変数は、例えば、配列へのポインタを計算するために復号されてもよい。なお、中間コードへの変換は、例えば、適切なインデックスにおける配列へのポインタを計算するために、追加の一時変数を導入し得る。
【0098】
一実施形態では、コンパイラデバイスは、複数の第1の変数を選択する。第1の変数は、重複する生存区間領域と、1つ以上の第2の変数とを有する。複数の第1の変数の各々は、1つ以上の第2の変数で符号化され得る。追加の制約を第1の変数に課してもよい。例えば、第1の変数は、それらの生存区間領域が近い、例えば、2つの第1の変数の2つの生存区間領域間の距離が小さい、例えば、せいぜい閾値であるものが決定される。距離は、生存区間領域のうちの1つのみにある基本ブロックの数であり得る。さらに、例えば、使用ステートメントにおいて一緒に発生する対話(例えば、上記の例における配列割り当て)を共有する第1の変数を選択することができる。
【0099】
一実施形態では、セレクタは、例えばプロシージャ内でループに対してローカルに定義される1つ以上の第1の変数を選択する。
【0100】
一実施形態では、集合442に複数の変数があり得る。潜在的な第1の変数が、集合442から、例えば、ランダムに、又は集合442内の変数を順番に考慮することによって、選択される。潜在的な第1の変数について、第2の変数が存在するかどうか、例えば、第1の変数の生存区間領域中に静的である集合442内の第2の変数が存在するかどうかが決定され得る。そのような第2の変数が存在しない場合、潜在的な第1の変数は破棄され、次の潜在的な第1の変数が、例えば、適切な1つ以上の第1の変数及び1つ以上の第2の変数が見つかるまで、選択され、試行され得る。
【0101】
第1の変数の選択は、プログラマの影響を受ける場合もある。例えば、コンパイラディレクティブがコンピュータプログラム表現、例えば、高レベルソースコード表現に挿入される。例えば、ディレクティブは、#protectである。セレクタ460は、まず、ディレクティブを有する変数について1つ以上の第2の変数を見つける。このような第2の変数が見つからない場合には、警告信号が生成され得る。警告信号はディスプレイに表示され得る。別のコンパイラディレクティブは、#confidentialであり得る。このディレクティブが使用される場合、このディレクティブでマークされた変数は、パスワードなどである可能性があるため、第2の変数として使用すべきではない。
【0102】
コンパイラ400は、コンピュータプログラムコード表現440上で複数の反復を実行し得る。例えば、第1及び第2の変数を選択し、コードを修正する複数回の反復である。反復を通じて、コンピュータプログラムはますます難読化される。一実施形態による難読化は、従来の難読化と組み合わされ得る。例えば、難読化ユニットが、ダミー変数、ダミーコードを導入し、変数を符号化し、関数をテーブルに置換し、制御フローを複雑化する。特に、一実施形態による難読化は、専用マスキング変数を有する従来のマスキングと組み合わされ得る。例えば、一実施形態では、生存区間解析を使用して、第1及び第2の変数が選択される。第1の変数は、第2の変数及び固定マスキング定数を使用して符号化され得る。
【0103】
実施形態は、自動化された難読化解除及びスクレーピング攻撃から保護する。スクレーピング攻撃は、プログラムを解釈しようとすることなく、プログラム内のすべての値を潜在的なキーとして試みることによって、キーを回収することを目的とする。
【0104】
コンピュータプログラム表現440の修正後、コンパイルは、例えば、第2のコンパイラ部433によって完了され得る。例えば、第2のコンパイラ部433は、コード生成、例えば、コンピュータプログラム表現440のターゲット言語(例えば機械語)へのマッピングを行う。しかしながら、第2のコンパイラ部433は、追加のコンパイルステップ(例えば、最適化、レジスタ割当てなど)を行ってもよい。なお、生存区間解析は、コンパイラデバイス400(例えば、第1のコンパイラ部432、第2のコンパイラ部433)において、例えば、他の目的(例えば、最適化、レジスタ割り当てなど)のために、複数回行われてもよい。
【0105】
レジスタ割り当てとは、IR内の変数に(物理)レジスタを割り当てるプロセスを指す。これは、IRにおいて、同時に生きている多くの変数があるが、コンピュータのレジスタの数は限られているので、重要である。レジスタ割り当ては、変数の生存区間解析(例えば、生存期間の解析)によって実現される。
【0106】
例えば、一実施形態では、第1のコンパイラ部432は、構文解析及び中間コード生成のために構成される。構文解析後、コンパイラデバイスは、ソースコードの中間コードを生成し得る。これは、何かの抽象機械又はターゲットデバイス用のプログラムを表し得る。これは、典型的には高レベル言語と機械語との間にある。中間コードは、SSA形式であってもよい。
【0107】
第2のコンパイラ部433は、コード生成のために構成され得る。例えば、コード生成器が中間コードの表現を取り、それをターゲット機械語にマッピングする。コード生成器は、中間コードを機械コードのシーケンスに翻訳する。機械コードは、再配置可能であってよい。
【0108】
第1及び第2のコンパイラ部のいずれか1つ(例えば第1及び第2のコンパイラ部のうちの1つ、いずれでもない、又は両方)が、追加のコンパイラタスクを行い得る。追加のコンパイラタスクは、コード最適化、及び割り当てを含み得る。コードの最適化により、不要なコードが削除され、一連のステートメントがある順序に配置されて、プログラムの実行が高速化され得る。割り当て中に、レジスタ、メモリなどが変数に割り当てられ得る。
【0109】
コンパイルデバイスは、コンパイラプログラムの形式であってもよい。コンパイラは、プログラム、例えば、その変数及び/又はその処理されたデータを保護し得る。有利には、コンパイラは、少なくとも部分的に、符号化された領域で実行されるプログラムPを自動的に作成し得る。プログラマが、プログラムをプレーン領域でコード化し、後になって、プログラマがそのプログラムを暗号化された領域で実行することに関心がある場合にのみ、プログラムPを暗号化された領域に向けてコンパイルすることができる。
【0110】
コンパイラでは、例えば、第1のコンパイラ部432による部分コンパイルの後に、グラフ表現、又はプログラムの中間表現(IR)が得られる。一実施形態では、IRプログラムは、右辺が最大2つのオペランドを含むように、一連のステートメントとして表される。プログラムのIR表現は、SSA特性を有するように変換できる。
【0111】
コンパイル及びSSA変換の後、結果のデータフローグラフには、phi命令及びコピー命令を使用するブロックのサブネットワークが含まれ得る。このようなネットワークの境界は、異なるタイプのステートメント、例えば、算術演算、メモリ演算などをもつノードによって表される。
【0112】
一実施形態では、第1のステップは、入力プログラムをSSA特性を有する中間表現に変換することであり得る。このステップは必須ではないが、次のステップを容易にする。静的単一代入(SSA)特性:各変数が1回だけ割り当てられ、すべての変数は使用前に定義される。このグラフでは、エッジは(時間的)変数で、ノードは演算(+、-、*、…)、メモリアクセス(*p=…)などである。phi演算を使用して、グラフ内のデータ選択を実施する。例えば、z=phi(a,b)は、aへの最後の割り当てがbへの最後の割り当てよりも最近であるとき、aがzに割り当てられるべきであり、又はその逆も同様であることを意味する。
【0113】
次のステップは、生存区間解析を実行することであり、例えば、プログラム実行の後の時点で依然として使用される変数を含むリストが取得される。単一の変数Bがあるとする。この情報があると、変数A1、A2、A3、及び関連する演算を保護できる。例えば、以下の演算を考える:
A3=A1*A2+A2
【0114】
このような演算及び変数は、B(又は変数Bの集合)によって、異なるやり方で保護できる。
【0115】
難読化を適用する場合、変数BをXORマスクとして使用できる:
A1=A1 XOR B
A2=A2 XOR B
...
A3=(((A1 XOR B)*(A2 XOR B))+(A2 XOR B))XOR B
【0116】
これは、メモリにA1、A2、及びA3に保持する代わりに、Bを用いてXORされた値を保持することを意味する。Bは、上記の保護範囲において生きており、静的であることを想起されたい。Bは、プログラム内の任意の通常の変数であってもよく、それ自体がプログラムの何らかの機能を果たす。
【0117】
符号化を適用する場合、変数A1、A2、及びA3を使用する演算を同様のやり方で保護できる。剰余数系(RNS)の使用を考える。モジュライN及びモジュライq0,…,q{N-1}の数を返す関数RNS_param(x)があると仮定する。
A1_rns=RNS_rep(A1,RNS_param(B))
A2_rns=RNS_rep(A2,RNS_param(B))
...
A3_rns=RNS+(RNS*(A1_rns,A2_rns),A2_rns)
【0118】
2つの関数RNS+及びRNS*について。上記の行では、RNS_rep(x,y)が、モジュライq0,…,q{N-1}の数Nを所与として、xのRNS表現を返す。RNS*(x,y)が、xとyとのRNS表現間の乗算を行う。RNS+(x,y)が、xとyとのRNS表現間の加算を行う。
【0119】
なお、保護は、変数A1、A2、A3、…、Axを保護するために、変数B1、B2、…、BMの集合(上記の例のようにBだけでなく)を使用することによっても実現できる。これは、関数COMBINE(B1,B2,…,BM)を使用してXORマスク(難読化の場合)として又はRNS_param()への入力として使用される値を導出することで行われる。一実施形態では、難読化及び/又は符号化は、集合B内の変数の生存期間が終了する前に逆転される必要がある。また、複数の変数集合を有するネストされたスコープを使用することも可能であることに留意されたい。例えば、BがAに対して静的であり、CがBに対して静的であり、DがCに対して静的であると仮定する。この場合、例えば、DはCを符号化するために使用され、CはBを符号化するために使用され、BはAを符号化するために使用される。
【0120】
生存集合対非生存集合の重要性に留意されたい。大きすぎる「生存」へのあらゆるアプローチは、小さすぎる非生存をもたらすが、これは、マスキングの正しさには影響しない。しかし、推定は可能であるが、ステートメントレベルで特定の変数に対してこの非生存特性を確立する必要がある。
【0121】
「変数の生存集合」を考慮するプログラム内のポイントは、ステートメントの直前及び直後である。この集合を計算するために、すべての可能な将来の実行を考慮できる。効率を改善するために、例えば、上述のような既知のアルゴリズムを使用して、各基本ブロックの始まり及び終わりにおいて完全な最終生存集合を計算する。次に、ブロックのライブアウト(live-out)集合で初期化されたブロックの後方トラバーサルを使用して、各ステートメントにわたる生存変数を決定する。
【0122】
アウトマスキングアルゴリズムについては、「変数「a」は、変数「x」の生存期間中に変更しないか」という問題に関心がある。これは、変数「a」を変更する各ステートメントSについて、変数「x」は、「S」の実行中に非生存が保証されているか、と言い換えられる。(また、「「S」の実行中」とは、「Sの直前及び直後」を意味する)。
【0123】
したがって、特定の潜在的なマスク変更ステートメントにわたって、非生存集合に関心があり、したがって、完全な生存区間解析を行う必要がない。変数「x」が、特定のステートメント全体にわたって非生存が保証されていることを示すだけで十分である。以下の例では、これを、時に、大域解析を行わずに推定する方法を示す。しかしながら、大域解析は非常に安価であるため、通常、それを使用しない説得力のある理由はない。さらに、大域生存区間解析では、生存していないことが保証される変数の集合が最大(生存集合の逆数)であり、これは、可能なマスクの集合を増加させる。
【0124】
実施例:以下のブロックを考える:
x=10;
y=s;
z=y+x;
...
t=f(z)
【0125】
ローカルでは、変数zは、ステートメントy=sの前又は後では非生存であると結論付けることができる。「y=s」が「y」を変更する唯一のステートメントである場合、「y」を使用して「z」をマスクできる。
x=10;
y=s;
z=mask(y+x,y);
...
t=f(unmask(z,y))
zは、yへの割り当て中は非生存であるため、zの使用は、それがプログラムのどこにあろうとも、「y=s」の影響を受けない。
【0126】
例えば線形プログラムテキストのプロパティに基づく他のアプローチも、保護したい変数が保護変数を変更するステートメントで非生存であると決定できれば、うまくいく。したがって、ステートメント全体で多すぎる変数を生存とマークするあらゆる種類の解析が、関数的に正しい結果につながる。
【0127】
コンパイラデバイス400の様々な実施形態では、通信インターフェースを、様々な代替形態から選択できる。例えば、インターフェースは、ローカルエリアネットワーク又はワイドエリアネットワーク(例えばインターネット)へのネットワークインターフェース、内部又は外部データストレージへのストレージインターフェース、キーボード、アプリケーションインターフェース(API)などである。
【0128】
コンパイラデバイス400は、1つ以上のボタン、キーボード、ディスプレイ、タッチスクリーンなどのよく知られている要素を含むユーザインターフェースを有し得る。ユーザインターフェースは、コンパイル動作を行うためのユーザとの対話に対応する。
【0129】
コンパイラデバイス400用のストレージは、電子メモリ(例えばフラッシュメモリ)、又は磁気メモリ(例えばハードディスク)などとして実装され得る。ストレージは、全体でストレージを構成する複数のディスクリートメモリを含んでもよい。ストレージはまた、一時的なメモリ、例えばRAMでもよい。
【0130】
典型的には、デバイス400は、デバイス400に格納されている適切なソフトウェアを実行するマイクロプロセッサを含む。例えば、そのソフトウェアは、ダウンロードされて、対応するメモリ(例えばRAMといった揮発性メモリ又はフラッシュといった不揮発性メモリ)に格納されていてよい。あるいは、デバイス400は、プログラマブルロジック、例えば、フィールドプログラマブルゲートアレイ(FPGA)として、全体的に又は部分的に実装されてもよい。デバイス400は、いわゆる特定用途向け集積回路(ASIC)、例えば、特定使用のためにカスタマイズされた集積回路(IC)として、全体的に又は部分的に実装されてもよい。例えば、回路は、例えば、Verilog、VHDLなどのハードウェア記述言語を使用して、CMOSで実装されてもよい。
【0131】
一実施形態では、コンパイラデバイス400は、第1のコンパイラ部回路、第2のコンパイラ部回路、生存区間解析回路、変数セレクタ回路、及びコード修正子回路のうちの1つ以上を含む。回路は、本明細書に説明した対応するユニットを実現する。回路は、プロセッサ回路及びストレージ回路であってよく、プロセッサ回路は、ストレージ回路において電子的に表現されている命令を実行する。
【0132】
プロセッサ回路は、分散方式で、例えば、複数のサブプロセッサ回路として実装されてもよい。ストレージは、複数の分散サブストレージにわたって分散されてもよい。メモリの一部又は全部は、電子メモリ、磁気メモリなどであってもよい。例えば、ストレージは揮発性部分と不揮発性部分とを有する。ストレージの一部は、読み取り専用であってもよい。
【0133】
図5は、コンパイラ方法500の一実施形態の一例を概略的に示す。コンパイラ方法500は、コンピュータプログラムを難読化する。コンパイラ方法は、コンピュータプログラム表現を受け取るステップ(510)と、コンピュータプログラム表現に生存変数解析を行うステップ(520)であって、生存変数解析によって、コンピュータプログラム表現において割り当てられている変数の集合(442)に関連付けられた生存区間領域(444)、定義情報、及び使用情報が取得される、ステップと、変数の集合から第1の変数及び第2の変数を選択するステップ(530)であって、第2の変数は、第2の変数に関連付けられている定義情報に従って第1の変数に関連付けられている生存区間領域において定義されていない、ステップと、定義情報によって、かつ、第1の変数に関連付けられている使用情報によって定義された場所において、少なくとも第2の変数を符号化パラメータとして使用して第1の変数を符号化する符号化コードを用いて、コンピュータプログラム表現を修正するステップ(540)とを含む。
【0134】
当業者には明らかなように、本方法を実行する多くの異なる方法が可能である。例えば、ステップは、示された順序で行うことができるが、ステップの順序を変更しても、いくつかのステップを並列に行ってもよい。さらに、ステップ間に、他の方法ステップを挿入してもよい。挿入されたステップは、本明細書で説明される方法の改良を表しても、本方法とは無関係であってもよい。さらに、所与のステップは、次のステップが開始される前に完全に終了していなくてもよい。
【0135】
本方法の実施形態は、プロセッサシステムに方法500を行わせるための命令を含むソフトウェアを使用して実行され得る。ソフトウェアは、システムの特定のサブエンティティによって行われるステップのみを含み得る。ソフトウェアは、ハードディスク、フロッピー(登録商標)、メモリ、光ディスクなどの適切な記憶媒体に記憶され得る。ソフトウェアは、有線、無線、又はデータネットワーク(例えば、インターネット)を使用して、信号として送信され得る。ソフトウェアは、サーバ上でのダウンロード及び/又はリモート使用のために利用可能にされ得る。本方法の実施形態は、本方法を行うように、プログラマブルロジック、例えばフィールドプログラマブルゲートアレイ(FPGA)を構成するビットストリームを使用して実行され得る。
【0136】
以下の番号付けされた節は、企図され、限定されない実施形態を含む。第1節:コンピュータプログラムを難読化するためのコンパイラデバイス(400)であって、コンピュータプログラム表現を受け取る通信インターフェース(431)と、プロセッサと、を含み、プロセッサは、コンピュータプログラム表現に生存変数解析を行い、生存変数解析によって、コンピュータプログラム表現内で割り当てられている変数の集合(442)に関連付けられている生存区間領域(444)、定義情報、及び使用情報が取得される。プロセッサはさらに、変数の集合から第1の変数及び第2の変数を選択し、第2の変数は、第2の変数に関連付けられた定義情報に従って第1の変数に関連付けられた生存区間領域内で定義されていない。プロセッサはさらに、定義情報によって、かつ、第1の変数に関連付けられた使用情報によって定義された場所において、少なくとも第2の変数を符号化パラメータとして使用して第1の変数を符号化する符号化コードを用いてコンピュータプログラム表現を修正する。第2節:コンピュータプログラムを難読化するためのコンパイラ方法(500)であって、コンピュータプログラム表現を受け取るステップ(510)と、コンピュータプログラム表現に生存変数解析を行うステップ(520)であって、生存変数解析によって、コンピュータプログラム表現内で割り当てられている変数の集合(442)に関連付けられている生存区間領域(444)、定義情報、及び使用情報が取得される、ステップと、変数の集合から第1の変数及び第2の変数を選択するステップ(530)であって、第2の変数は、第2の変数に関連付けられた定義情報に従って第1の変数に関連付けられた生存区間領域内で定義されていない、ステップと、定義情報によって、かつ、第1の変数に関連付けられた使用情報によって定義された場所において、少なくとも第2の変数を符号化パラメータとして使用して第1の変数を符号化する符号化コードを用いてコンピュータプログラム表現を修正するステップ(540)とを含む。
【0137】
本発明はまた、本発明を実施するように適合されたコンピュータプログラム、特に担体上又は担体内のコンピュータプログラムに拡張されることが理解されるのであろう。プログラムは、ソースコード、オブジェクトコード、コード中間ソース、及び部分的にコンパイルされた形態などのオブジェクトコードの形態であっても、又は本方法の実施形態の実装で使用するのに適した任意の他の形態であってもよい。コンピュータプログラム製品に関する一実施形態は、記載された方法のうちの少なくとも1つの方法の処理ステップのそれぞれに対応するコンピュータ実行可能命令を含む。これらの命令は、サブルーチンに分割されても、静的又は動的にリンクされる1つ以上のファイルに格納されてもよい。コンピュータプログラム製品に関する別の実施形態は、記載されたシステム及び/又は製品のうちの少なくとも1つのシステム及び/又は製品の手段のそれぞれに対応するコンピュータ実行可能命令を含む。
【0138】
図6aは、コンピュータプログラム1020を含む書き込み可能部分1010を有するコンピュータ可読媒体1000を示す。コンピュータプログラム1020は、プロセッサシステムに、一実施形態によるコンパイラ方法を行わせる命令を含む。コンピュータプログラム1020は、物理マークとして、又はコンピュータ可読媒体1000の磁気化によって、コンピュータ可読媒体1000上で具現化され得る。しかしながら、任意の他の適切な実施形態も考えられる。さらに、ここでは光ディスクとして示されているが、コンピュータ可読媒体1000は、ハードディスク、ソリッドステートメモリ、フラッシュメモリなどの任意の適切なコンピュータ可読媒体であってもよく、記録不可能又は記録可能であってもよいことが理解されるであろう。コンピュータプログラム1020は、プロセッサシステムに、コンパイラ方法を行わせる命令を含む。
【0139】
図6bは、コンパイラデバイスの一実施形態によるプロセッサシステム1140の概略図を示す。プロセッサシステムは、1つ以上の集積回路1110を含む。
図6bでは、1つ以上の集積回路1110のアーキテクチャを概略的に示す。回路1110は、一実施形態による方法を実行する、及び/又はそのモジュール若しくはユニットを実現するためにコンピュータプログラムコンポーネントを実行させるための処理ユニット1120(例えばCPU)を含む。回路1110は、プログラミングコード、データなどを格納するためのメモリ1122を含む。メモリ1122の一部は読み出し専用であってもよい。回路1110は、通信要素1126、例えば、アンテナ、コネクタ又はその両方などを含んでもよい。回路1110は、方法で定義された処理の一部又は全部を行うための専用集積回路1124を含んでもよい。プロセッサ1120、メモリ1122、専用IC1124、及び通信要素1126は、相互接続部1130(例えばバス)を介して互いに接続され得る。プロセッサシステム1110は、アンテナ及び/又はコネクタをそれぞれ使用して、接触及び/又は非接触通信用に構成されてもよい。
【0140】
例えば、一実施形態では、プロセッサシステム1140(例えば、コンパイラデバイス)は、プロセッサ回路及びメモリ回路を含み、プロセッサ回路は、メモリ回路に格納されているソフトウェアを実行する。例えば、プロセッサ回路は、IntelCore i7(登録商標)プロセッサ、ARMCortex-R8(登録商標)などである。一実施形態では、プロセッサ回路は、ARMCortex M0(登録商標)とすることができる。メモリ回路は、ROM回路であってもよいし、フラッシュメモリなどの不揮発性メモリであってもよい。メモリ回路は、揮発性メモリ、例えばSRAMメモリであってもよい。後者の場合、デバイスは、ソフトウェアを提供するように構成された不揮発性ソフトウェアインターフェース、例えばハードドライブ、ネットワークインターフェースなどを含み得る。
【0141】
上述の実施形態は、本発明を限定するものではなく、例示するものであり、当業者は、多くの代替実施形態を設計することができることに留意されたい。
【0142】
請求項において、括弧内に付された参照記号は、請求項を限定するものと解釈してはならない。動詞「有する」及びその活用形の使用は、請求項に記載されたもの以外の要素又はステップの存在を排除するものではない。単数形は、複数のそのような要素の存在を排除するものではない。本発明は、いくつかの別個の要素を含むハードウェアによって、及び適切にプログラムされたコンピュータによって実施され得る。いくつかの手段を列挙する装置請求項において、これらの手段のいくつかは、ハードウェアの1つの同じアイテムによって具現化され得る。特定の手段が相互に異なる従属請求項に記載されているという単なる事実は、これらの手段の組合せを有利に使用することができないことを示すものではない。
【0143】
特許請求の範囲では、括弧内の参照が例示的な実施形態の図面又は実施形態の式における参照符号を指し、したがって、特許請求の範囲の理解度を高める。これらの参照は、請求項を限定するものと解釈してはならない。