(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024061591
(43)【公開日】2024-05-07
(54)【発明の名称】関数およびサブ関数分析に基づく自動的コード再構成
(51)【国際特許分類】
G06F 8/30 20180101AFI20240425BHJP
【FI】
G06F8/30
【審査請求】未請求
【請求項の数】20
【出願形態】OL
【外国語出願】
(21)【出願番号】P 2023066934
(22)【出願日】2023-04-17
(31)【優先権主張番号】18/048,690
(32)【優先日】2022-10-21
(33)【優先権主張国・地域又は機関】US
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.PYTHON
2.SIMULINK
3.SMALLTALK
4.ASCET
(71)【出願人】
【識別番号】520027235
【氏名又は名称】オーロラ ラブズ リミテッド
(74)【代理人】
【識別番号】100078282
【弁理士】
【氏名又は名称】山本 秀策
(74)【代理人】
【識別番号】100113413
【弁理士】
【氏名又は名称】森下 夏樹
(74)【代理人】
【識別番号】100181674
【弁理士】
【氏名又は名称】飯田 貴敏
(74)【代理人】
【識別番号】100181641
【弁理士】
【氏名又は名称】石川 大輔
(74)【代理人】
【識別番号】230113332
【弁護士】
【氏名又は名称】山本 健策
(72)【発明者】
【氏名】カーミット サハール
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376BC14
5B376BC15
5B376BC31
5B376BC38
(57)【要約】 (修正有)
【課題】関数およびサブ関数分析に基づいて、コードを自動的に再構成するコンピュータ実装方法及び非一過性コンピュータ可読媒体を提供する。
【解決手段】方法は、複数の関数を表すコード構造を解析することによって、少なくとも1つの第1の関数が閾値複雑度を有することを決定するステップと、決定に応答して、少なくとも1つの第1の関数に基づいて、少なくとも1つの第1の関数との共通性を有する複数のサブ関数を識別するステップと、識別された複数のサブ関数のうちの少なくとも1つをコールするように第1の関数を再構成することによって、第2の関数を形成するステップと、を含む。
【選択図】
図2
【特許請求の範囲】
【請求項1】
非一過性コンピュータ可読媒体であって、前記非一過性コンピュータ可読媒体は、命令を含み、前記命令は、少なくとも1つのプロセッサによって実行されると、前記少なくとも1つのプロセッサに、関数およびサブ関数分析に基づいて、コードを自動的に再構成するための動作を実施させ、前記動作は、
複数の関数を表すコード構造を解析することによって、少なくとも1つの第1の関数が閾値複雑度を有することを決定することと、
前記決定に応答して、前記少なくとも1つの第1の関数に基づいて、複数のサブ関数を識別することであって、前記複数のサブ関数は、前記少なくとも1つの第1の関数との共通性を有する、ことと、
前記識別された複数のサブ関数のうちの少なくとも1つをコールするように前記第1の関数を再構成することによって、第2の関数を形成することと
を含む、非一過性コンピュータ可読媒体。
【請求項2】
前記識別された複数のサブ関数のうちの少なくとも1つは、前記第1の関数によってコールされる内部サブ関数と関連付けられる、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項3】
前記複数のサブ関数を識別することは、コードの少なくとも1つのブロックと、前記コードの少なくとも1つのブロックを他のコードから区別する少なくとも1つのディバイダとを識別することを含む、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項4】
前記動作はさらに、
初期コードファイルを受信することであって、前記コード構造は、前記初期コードファイルを表す、ことと、
前記第2の関数を含むように前記初期コードファイルを更新することと
を含む、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項5】
前記閾値複雑度は、少なくとも部分的に、機械学習モデルによって決定され、
前記動作はさらに、
前記初期コードファイルと関連付けられる関数のサイズまたは複雑さのうちの少なくとも1つと前記更新された初期コードファイルを伴う関数のサイズまたは複雑さのうちの少なくとも1つを比較することと、
前記比較に基づいて、前記機械学習モデルを更新することと
を含む、請求項4に記載の非一過性コンピュータ可読媒体。
【請求項6】
前記動作はさらに、
ユーザ入力を受信することと、
前記ユーザ入力に基づいて、前記閾値複雑度を決定することと
を含む、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項7】
前記閾値複雑度は、文字の数、コード行の数、または記憶空間の量のうちの少なくとも1つによって定量化される関数長として表される、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項8】
前記コード構造は、抽象構文ツリー(AST)を備える、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項9】
前記閾値複雑度は、前記ASTに基づく、請求項8に記載の非一過性コンピュータ可読媒体。
【請求項10】
前記閾値複雑度は、抽象構文サブツリーのサイズとして表される、請求項8に記載の非一過性コンピュータ可読媒体。
【請求項11】
前記ASTは、ノードタイプを有する複数のノードを備え、
前記複数のサブ関数を識別することはさらに、前記ノードタイプに基づく、
請求項8に記載の非一過性コンピュータ可読媒体。
【請求項12】
前記閾値複雑度は、前記第1の関数のバイナリコードに基づく、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項13】
前記共通性は、コール、引数、文、または変数のうちの少なくとも1つを備える、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項14】
前記動作はさらに、
少なくとも1つの新しい変数を発生させることと、
前記サブ関数のうちの少なくとも1つにおいて前記少なくとも1つの新しい変数を配置することと
を含む、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項15】
前記コード構造は、コントローラ上で実行されるように構成されるコードと関連付けられる、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項16】
前記複数のサブ関数を識別することは、前記サブ関数のうちの少なくとも1つを抽出する、または発生させることを含む、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項17】
前記第1の関数を再構成することは、前記第1の関数からコードを除去することを含む、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項18】
前記複数のサブ関数が前記少なくとも1つの第1の関数と有する前記共通性は、共通の動作、共通のコマンド、共通のコマンドのシーケンス、共通の式、共通の引数、または共通のコード行のうちの少なくとも1つを備える、請求項1に記載の非一過性コンピュータ可読媒体。
【請求項19】
関数およびサブ関数分析に基づいて、コードを自動的に再構成するためのコンピュータ実装方法であって、
複数の関数を表すコード構造を解析することによって、少なくとも1つの第1の関数が閾値複雑度を有することを決定することと、
前記決定に応答して、前記少なくとも1つの第1の関数に基づいて、複数のサブ関数を識別することであって、前記複数のサブ関数は、前記少なくとも1つの第1の関数との共通性を有する、ことと、
前記識別された複数のサブ関数のうちの少なくとも1つをコールするように前記第1の関数を再構成することによって、第2の関数を形成することと
を含む、コンピュータ実装方法。
【請求項20】
初期コードファイルを受信することであって、前記コード構造は、前記初期コードファイルを表す、ことと、
前記第2の関数を含むように前記初期コードファイルを更新することと
をさらに含む、請求項19に記載のコンピュータ実装方法。
【発明の詳細な説明】
【技術分野】
【0001】
本明細書に説明される主題は、概して、電子制御ユニット(ECU)または他のコントローラ等のコントローラを利用し得る、種々のタイプのモノのインターネット(IoT)または他のネットワーク接続システムにおけるソフトウェアに関するコード分析および再構成を提供するための技法に関する。例えば、ある開示される実施形態は、実行可能ファイル長を縮小し、実行を改良し、他のソフトウェア効率を達成する方法を識別するために、コードを分析することを対象とする。これらの技法は、関数およびサブ関数分析に基づいて、コードを自動的に再構成することを含み得る。いくつかの技法は、関数分析に基づいて、更新ファイル等のソフトウェアファイルを縮小することを伴い得る。他の技法は、コードセットの間でシンボルを合致させる、および/またはシンボル分岐を決定することを伴い得る。
【背景技術】
【0002】
現代の車両および他のモノのインターネット(IoT)システムは、多くの場合、多くの異なるコントローラを利用し、これは、随時、ソフトウェア変更を必要とし得る。これらのソフトウェア変更は、多くの技術的およびセキュリティ課題を提示し得る。例えば、ソフトウェアが、経時的に更新されるにつれて、そのコンテンツおよび構造は、ますます複雑かつ無秩序になり、ソフトウェア開発者にとっての難度を増加させるだけではなく、また、コード長(すなわち、コード行の数)、ソフトウェアファイルサイズ、およびソフトウェア再構成および検証時間を増加させ得る。ある場合には、大きいソフトウェア更新ファイルが、もたらされ得、これは、地上波更新に関して高価または実行不可能であり、デバイスが、特に、多くの場合、限定された処理および/または記憶リソースを有するコントローラを実装することが困難であり得る。また、デバイスが、そのようなプログラムを実行することができるときであっても、これは、処理または記憶リソースに負担をかけ、かつシステム性能を劣化させ得る。いくつかの状況では、関数または関数のグループが、長いまたは複雑であり得、関数の変更は、小さく、単純であり得る。これは、これらの長いまたは複雑な関数の側面が変更されるとき、ソフトウェア変更を実装または検証するために、不必要に長い差分ファイル(または他のソフトウェア変更ファイル)およびコンピューティングリソースの大量の使用をもたらし得る。ソフトウェアは、多くの場合、極めて徹底的な試験を要求するため、単一の変更毎の承認プロセスは、非常に長く、費用がかかり、したがって、より長く見える非実質的な変更よりも小さくあり得、多くの場合、それによって難読化される、ソフトウェア変更の真の実質的な影響を決定する能力の必要性を生じさせる。また、個々のシンボルは、バイナリファイルにコンパイルされる個別のオブジェクトファイルを有し得るため、いくつかのシンボルへのわずかな変更は、ソフトウェア更新ファイルのサイズおよび複雑さへの劇的な変更につながり得る。いくつかのシナリオでは、機能的変更が殆どまたは全くコードにもたらされない、シンボル名の変更等、あまり実質的ではない変更が、コードの側面に行われ得る。しかしながら、現在のシステムは、これらの種類の変更に対する視点が欠如しており、コードの不必要な追加につながり、上記に説明される問題をさらに悪化させる。
【0003】
ソフトウェア分析および再構成に対する既存のアプローチは、現在、これらの問題を取り扱う能力を備えていない。例えば、従来の手段を使用してソフトウェア変更を局所化するための関数の手動リファクタリングは、大量の時間およびコンピューティングリソース(例えば、処理リソース、メモリ、および/または帯域幅)を要求し得る。手動プロセスはまた、効率的なコード再構成、シンボル合致、または他のソフト変更効率を決定しない場合がある。また、手動プロセスは、コードの間の形式的、構造的、および/または機能的差異を正しく識別することができない場合がある。
【0004】
現在のシステムの技術的欠点を考慮して、コントローラおよびシステムのための包括的コード分析および再構成を提供するための改良されたシステムおよび方法の必要性が、存在する。下記に議論される技法は、効率、性能、および使用性における多くの技術的改良をもたらす。例えば、いくつかの技法によると、コードの関数または他のシンボルが、複雑度に従って、自動的に分析および再構成されてもよい。別の実施例として、機械学習技法が、経時的にコードを簡略化および縮小するための改良された効率を識別するために使用されてもよい。
【0005】
関連する利点が、開示される技法が、コードへの変更を検証し、サブ関数への関連付けられる変更を決定し、低減されたサイズの差分ファイルを発生させることを伴うことからもたらされ得る。低減されたサイズの差分ファイルは、例えば、デバイス上のより少ない記憶空間が更新されることを要求し得、また、より迅速な更新プロセスを可能にし得る。同様に、低減されたサイズの差分ファイルは、(例えば、地上波で)より迅速に伝送され、より少ない帯域幅およびより少ない費用を伴い、そのライフサイクル全体を通してより管理可能となるであろう。
【0006】
また別の利点として、開示される技法は、共通ブロックの識別および関数または他のコードシンボルの再構成を通して、実行可能ファイルサイズの低減を可能にする。そのような技法は、より小さい実行可能ファイルを生成し得る。これはまた、より容易なデバッグ、保守、トラブルシューティング、および更新を促進することができる。
【0007】
上記に説明されるもの等のいくつかの技法はまた、シンボルを合致させ、実質的に異なるシンボルを決定することから利益を享受し得る。これらの技法は、差分ファイル、実行可能ファイル、または他のコードのサイズをさらに低減させることに役立ち得る。いくつかのシナリオでは、算出の複雑さを増加させるアルゴリズムが、シンボルを比較し、シンボル合致を潜在的に識別するために使用され得、これは、依然として更新ファイルサイズおよび更新時間を低減させる方法を識別しながら、処理リソースに対する負担を低減させ得る。例えば、より算出的に複雑なアルゴリズムが、コールグラフまたはコードの他の構造的表現を検証し、あまり洗練されていないアルゴリズムでは検出不能であり得るシンボル合致を識別し得る。
【発明の概要】
【課題を解決するための手段】
【0008】
いくつかの開示される実施形態は、コード行挙動および関係モデルを使用するための非一過性コンピュータ可読媒体、システム、および方法を説明する。例えば、例示的実施形態では、非一過性コンピュータ可読媒体は、少なくとも1つのプロセッサによって実行されると、少なくとも1つのプロセッサに、関数およびサブ関数分析に基づいて、コードを自動的に再構成するための動作を実施させる、命令を含んでもよい。動作は、複数の関数を表すコード構造を解析することによって、少なくとも1つの第1の関数が閾値複雑度を有することを決定するステップと、決定に応答して、少なくとも1つの第1の関数に基づいて、複数のサブ関数を識別するステップであって、複数のサブ関数は、少なくとも1つの第1の関数との共通性を有する、ステップと、識別された複数のサブ関数のうちの少なくとも1つをコールするように第1の関数を再構成することによって、第2の関数を形成するステップとを含んでもよい。
【0009】
さらなる実施形態によると、識別された複数のサブ関数のうちの少なくとも1つは、第1の関数によってコールされる、内部サブ関数と関連付けられる。
【0010】
さらなる実施形態によると、複数のサブ関数を識別するステップは、コードの少なくとも1つのブロックと、コードの少なくとも1つのブロックを他のコードから区別する、少なくとも1つのディバイダとを識別するステップを含む。
【0011】
さらなる実施形態によると、動作はさらに、初期コードファイルを受信するステップであって、コード構造は、初期コードファイルを表す、ステップと、第2の関数を含むように初期コードファイルを更新するステップとを含む。
【0012】
さらなる実施形態によると、閾値複雑度は、少なくとも部分的に、機械学習モデルによって決定され、動作はさらに、初期コードファイルと関連付けられる関数のサイズまたは複雑さのうちの少なくとも1つと更新された初期コードファイルと関連付けられる関数のサイズまたは複雑さのうちの少なくとも1つを比較するステップと、比較に基づいて、機械学習モデルを更新するステップとを含む。
【0013】
さらなる実施形態によると、動作はさらに、ユーザ入力を受信するステップと、ユーザ入力に基づいて、閾値複雑度を決定するステップとを含む。
【0014】
さらなる実施形態によると、閾値複雑度は、文字の数、コード行の数、または記憶空間の量のうちの少なくとも1つによって定量化される、関数長として表される。
【0015】
さらなる実施形態によると、コード構造は、抽象構文ツリー(AST)を備える。
【0016】
さらなる実施形態によると、閾値複雑度は、ASTに基づく。
【0017】
さらなる実施形態によると、閾値複雑度は、抽象構文サブツリーのサイズとして表される。
【0018】
さらなる実施形態によると、ASTは、ノードタイプを有する、複数のノードを備え、複数のサブ関数を識別するステップはさらに、ノードタイプに基づく。
【0019】
さらなる実施形態によると、閾値複雑度は、第1の関数のバイナリコードに基づく。
【0020】
さらなる実施形態によると、共通性は、コール、引数、文、または変数のうちの少なくとも1つを備える。
【0021】
さらなる実施形態によると、動作はさらに、少なくとも1つの新しい変数を発生させるステップと、サブ関数のうちの少なくとも1つにおいて少なくとも1つの新しい変数を配置するステップとを含む。
【0022】
さらなる実施形態によると、コード構造は、コントローラ上で実行されるように構成されるコードと関連付けられる。
【0023】
さらなる実施形態によると、複数のサブ関数を識別するステップは、サブ関数のうちの少なくとも1つを抽出する、または発生させるステップを含む。
【0024】
さらなる実施形態によると、第1の関数を再構成するステップは、第1の関数からコードを除去するステップを含む。
【0025】
さらなる実施形態によると、複数のサブ関数が少なくとも1つの第1の関数と有する共通性は、共通の動作、共通のコマンド、共通のコマンドのシーケンス、共通の式、共通の引数、または共通のコード行のうちの少なくとも1つを備える。
【0026】
さらなる開示される実施形態は、関数およびサブ関数分析に基づいて、コードを自動的に再構成するための方法を含む。本方法は、複数の関数を表すコード構造を解析することによって、少なくとも1つの第1の関数が閾値複雑度を有することを決定するステップと、決定に応答して、少なくとも1つの第1の関数に基づいて、複数のサブ関数を識別するステップであって、複数のサブ関数は、少なくとも1つの第1の関数との共通性を有する、ステップと、識別された複数のサブ関数のうちの少なくとも1つをコールするように第1の関数を再構成することによって、第2の関数を形成するステップとを含んでもよい。
【0027】
別の例示的実施形態では、非一過性コンピュータ可読媒体は、少なくとも1つのプロセッサによって実行されると、少なくとも1つのプロセッサに、差分ファイルのサイズを低減させるための動作を実施させる、命令を含んでもよい。動作は、デバイス上にインストールされたデバイスコードへの変更を表す変更コードを受信するステップと、デバイスコードを受信するステップと、変更コードまたは変更コードを表すコード構造を解析することによって、変更コードによって表される第1の関数を識別するステップと、デバイスコードまたはデバイスコードを表すコード構造を解析することによって、デバイスコードによって表される第2の関数を識別するステップと、第1および第2の関数に基づいて、複数のサブ関数を識別するステップと、複数のサブ関数のうちの少なくともいくつかへのサブ変更を決定するステップであって、サブ変更は、第2の関数への変更と関連付けられる、ステップと、オブジェクト変更要素を備える、差分ファイルを発生させるステップであって、オブジェクト変更要素は、デバイスコードへのサブ変更をもたらすように構成される、ステップとを含んでもよい。
【0028】
さらなる実施形態によると、オブジェクト変更要素のうちの1つは、デバイスコードにおける第2の関数を変更するように構成される。
【0029】
さらなる実施形態によると、サブ関数のうちの少なくともいくつかへのサブ変更を決定するステップは、サブ変更と関連付けられるサブ関数の第1のセットを決定するステップと、サブ変更と関連付けられないサブ関数の第2のセットを決定するステップとを含み、オブジェクト変更要素は、サブ関数の第1のセットに対応し、サブ関数の第2のセットに対応しない。
【0030】
さらなる実施形態によると、複数のサブ関数を識別するステップはさらに、少なくとも1つの関数が閾値複雑度を有することを決定するステップに基づく。
【0031】
さらなる実施形態によると、少なくとも変更コードまたはデバイスコードのコード構造は、抽象構文ツリー(AST)を備え、サブ変更のうちの少なくとも1つを識別するステップは、ASTを解析するステップを含む。
【0032】
さらなる実施形態によると、複数のサブ関数のうちの少なくともいくつかへのサブ変更を決定するステップは、変更コードのオブジェクトファイルとデバイスコードのオブジェクトファイルを比較するステップを含む。
【0033】
さらなる実施形態によると、複数のサブ関数は、少なくとも1つの関数の構造に基づいて識別される。
【0034】
さらなる実施形態によると、識別されたサブ関数のうちの少なくとも1つは、少なくとも1つの関数によってコールされる、内部サブ関数と関連付けられる。
【0035】
さらなる実施形態によると、動作はさらに、差分ファイルをデバイスに伝送するステップを含む。
【0036】
さらなる実施形態によると、動作はさらに、差分ファイルと関連付けられるランタイムへの影響が閾値を下回ることを決定するステップを含み、伝送は、決定されたランタイムへの影響が閾値を下回ることに基づく。
【0037】
さらなる実施形態によると、本デバイスは、コントローラである。
【0038】
さらなる実施形態によると、コントローラは、自動車における電子制御ユニット(ECU)である。
【0039】
さらなる開示される実施形態は、差分ファイルのサイズを低減させるための方法を含む。本方法は、デバイスコードを受信するステップと、変更コードまたは変更コードを表すコード構造を解析することによって、変更コードによって表される第1の関数を識別するステップと、デバイスコードまたはデバイスコードを表すコード構造を解析することによって、デバイスコードによって表される第2の関数を識別するステップと、第1および第2の関数に基づいて、複数のサブ関数を識別するステップと、複数のサブ関数のうちの少なくともいくつかへのサブ変更を決定するステップであって、サブ変更は、第2の関数への変更と関連付けられる、ステップと、オブジェクト変更要素を備える、差分ファイルを発生させるステップであって、オブジェクト変更要素は、デバイスコードへのサブ変更をもたらすように構成される、ステップとを含んでもよい。
【0040】
さらなる実施形態によると、オブジェクト変更要素のうちの1つは、デバイスコードにおける第2の関数を変更するように構成される。
【0041】
さらなる実施形態によると、サブ関数のうちの少なくともいくつかへのサブ変更を決定するステップは、サブ変更と関連付けられるサブ関数の第1のセットを決定するステップと、サブ変更と関連付けられないサブ関数の第2のセットを決定するステップとを含み、オブジェクト変更要素は、サブ関数の第1のセットに対応し、サブ関数の第2のセットに対応しない。
【0042】
さらなる実施形態によると、複数のサブ関数を識別するステップはさらに、少なくとも1つの関数が閾値複雑度を有することを決定するステップに基づく。
【0043】
さらなる実施形態によると、少なくとも変更コードまたはデバイスコードのコード構造は、抽象構文ツリー(AST)を備え、サブ変更のうちの少なくとも1つを識別するステップは、ASTを解析するステップを含む。
【0044】
さらなる実施形態によると、複数のサブ関数のうちの少なくともいくつかへのサブ変更を決定するステップは、変更コードのオブジェクトファイルとデバイスコードのオブジェクトファイルを比較するステップを含む。
【0045】
さらなる実施形態によると、複数のサブ関数は、少なくとも1つの関数の構造に基づいて識別される。
【0046】
さらなる実施形態によると、識別されたサブ関数のうちの少なくとも1つは、少なくとも1つの関数によってコールされる、内部サブ関数と関連付けられる。
【0047】
別の例示的実施形態では、非一過性コンピュータ可読媒体は、少なくとも1つのプロセッサによって実行されると、少なくとも1つのプロセッサに、実行可能ファイルのサイズを低減させるための動作を実施させる、命令を含んでもよい。動作は、複数の関数を有する、実行可能ファイルを識別するステップと、実行可能ファイルまたは実行可能ファイルを表すコード構造を解析することによって、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップと、共通ブロックを実施するように構成される、第3の関数を識別するステップと、第1または第2の関数のうちの少なくとも1つから共通ブロックを除去し、第1または第2の関数のうちの少なくとも1つの中に第3の関数へのコールを挿入することによって、第1および第2の関数を変更するステップと、実行可能ファイルにおいて、第1または第2の関数のうちの少なくとも1つを更新された第1または第2の関数のうちの少なくとも1つと置換し、第3の関数を実行可能ファイルに追加することによって、実行可能ファイルを更新するステップとを含んでもよい。
【0048】
さらなる実施形態によると、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップは、共通ブロックと関連付けられる識別子を決定するステップを含む。
【0049】
さらなる実施形態によると、識別子は、文字の組み合わせを備える。
【0050】
さらなる実施形態によると、識別子は、式である。
【0051】
さらなる実施形態によると、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップは、共通ブロックによって引き起こされる類似する効果を決定するステップを含む。
【0052】
さらなる実施形態によると、類似する効果を決定するステップは、第1および第2の関数に対して、静的または動的分析のうちの少なくとも1つを実施するステップを含む。
【0053】
さらなる実施形態によると、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップは、第1および第2の関数がそれぞれ、共通のコマンドまたは共通のコマンドのシーケンスを備えることを決定するステップを含む。
【0054】
さらなる実施形態によると、共通ブロックは、機械学習モデルに従って識別される。
【0055】
さらなる実施形態によると、第3の関数は、第1および第2の関数の構造に基づいて発生される。
【0056】
さらなる実施形態によると、実行可能ファイルは、更新に先立ってコントローラ上で実行されるように構成されるか、または更新の後にコントローラ上で実行されるように構成されるかのうちの少なくとも1つである。
【0057】
さらなる開示される実施形態は、実行可能ファイルのサイズを低減させるための方法を含む。本方法は、複数の関数を有する、実行可能ファイルを識別するステップと、実行可能ファイルまたは実行可能ファイルを表すコード構造を解析することによって、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップと、共通ブロックを実施するように構成される、第3の関数を識別するステップと、第1または第2の関数のうちの少なくとも1つから共通ブロックを除去し、第1または第2の関数のうちの少なくとも1つの中に第3の関数へのコールを挿入することによって、第1および第2の関数を変更するステップと、実行可能ファイルにおいて、第1または第2の関数のうちの少なくとも1つを更新された第1または第2の関数のうちの少なくとも1つと置換し、第3の関数を実行可能ファイルに追加することによって、実行可能ファイルを更新するステップとを含んでもよい。
【0058】
さらなる実施形態によると、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップは、共通ブロックと関連付けられる識別子を決定するステップを含む。
【0059】
さらなる実施形態によると、識別子は、文字の組み合わせを備える。
【0060】
さらなる実施形態によると、識別子は、式である。
【0061】
さらなる実施形態によると、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップは、共通ブロックによって引き起こされる類似する効果を決定するステップを含む。
【0062】
さらなる実施形態によると、類似する効果を決定するステップは、第1および第2の関数に対して、静的または動的分析のうちの少なくとも1つを実施するステップを含む。
【0063】
さらなる実施形態によると、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップは、第1および第2の関数がそれぞれ、共通のコマンドまたは共通のコマンドのシーケンスを備えることを決定するステップを含む。
【0064】
さらなる実施形態によると、共通ブロックは、機械学習モデルに従って識別される。
【0065】
さらなる実施形態によると、第3の関数は、第1および第2の関数の構造に基づいて発生される。
【0066】
さらなる実施形態によると、実行可能ファイルは、更新に先立ってコントローラ上で実行されるように構成されるか、または更新の後にコントローラ上で実行されるように構成されるかのうちの少なくとも1つである。
【0067】
別の例示的実施形態では、非一過性コンピュータ可読媒体は、少なくとも1つのプロセッサによって実行されると、少なくとも1つのプロセッサに、コードセットの間でシンボルを合致させるための動作を実施させる、命令を含んでもよい。動作は、ソフトウェアの第1のバージョンと関連付けられる第1のシンボルにアクセスするステップと、ソフトウェアの第2のバージョンと関連付けられる第2のシンボルにアクセスするステップと、第1のシンボルと第2のシンボルを比較するステップと、比較に基づいて、第2のシンボルが第1のシンボルの機能的同等物であるかどうかを決定するステップと、第2のシンボルが第1のシンボルの機能的同等物であるかどうかに基づいて、指定アクションを実施するステップとを含んでもよい。
【0068】
さらなる実施形態によると、指定アクションを実施するステップは、第2のシンボルが第1のシンボルの機能的同等物である場合、第2のシンボルを第1のシンボルとの合致として指定するステップ、または第2のシンボルが第1のシンボルの機能的同等物ではない場合、第1または第2のシンボルのうちの少なくとも1つを新規または削除のいずれかとして指定するステップのうちの少なくとも1つを含む。
【0069】
さらなる実施形態によると、ソフトウェアの第2のバージョンは、ソフトウェア変更ファイルによって表され、第2のシンボルが第1のシンボルの機能的同等物であるかどうかを決定するステップは、第2のシンボルが第1のシンボルの機能的同等物であることを決定するステップを含み、動作はさらに、第2のシンボルが第1のシンボルの機能的同等物であることを決定することに基づいて、アラートを提供するステップ、ソフトウェア変更ファイルをリネームするステップ、ソフトウェア変更ファイルにおける第2のシンボルをリネームするステップ、またはソフトウェア変更ファイルから第2のシンボルと関連付けられるコードの一部を除去するステップのうちの少なくとも1つを実施するステップを含む。
【0070】
さらなる実施形態によると、ソフトウェア変更ファイルは、差分ファイルである。
【0071】
さらなる実施形態によると、第1のシンボルと第2のシンボルを比較するステップは、増加する算出強度の複数の比較を実施するステップを含む。
【0072】
さらなる実施形態によると、第1のシンボルと第2のシンボルを比較するステップは、第1のシンボルと関連付けられる第1のファイル名と第2のシンボルと関連付けられる第2のファイル名を比較するステップと、第1のシンボルの第1のシンボル名と第2のシンボルの第2のシンボル名を比較するステップとを含み、第2のシンボルが第1のシンボルの機能的同等物であるかどうかを決定するステップは、第1のファイル名が第2のファイル名に合致し、第1のシンボル名が第2のシンボル名に合致するとき、第2のシンボルが第1のシンボルの機能的同等物であることを決定するステップを含む。
【0073】
さらなる実施形態によると、第1のシンボルと第2のシンボルを比較するステップは、第1のシンボルの第1のコールグラフと第2のシンボルの第2のコールグラフを比較するステップを含み、第2のシンボルが第1のシンボルの機能的同等物であるかどうかを決定するステップは、第1のコールグラフが第2のコールグラフに合致するとき、第2のシンボルが第1のシンボルの機能的同等物であることを決定するステップを含む。
【0074】
さらなる実施形態によると、第1のシンボルと第2のシンボルを比較するステップは、第1のシンボルと関連付けられるコールの第1のシーケンスと第2のシンボルと関連付けられるコールの第2のシーケンスを比較するステップを含み、第2のシンボルが第1のシンボルの機能的同等物であるかどうかを決定するステップは、第1のシーケンスが第2のシーケンスに合致するとき、第2のシンボルが第1のシンボルの機能的同等物であることを決定するステップを含む。
【0075】
別の例示的実施形態では、非一過性コンピュータ可読媒体は、少なくとも1つのプロセッサによって実行されると、少なくとも1つのプロセッサに、コードセットの間でシンボルを合致させるための動作を実施させる、命令を含んでもよい。動作は、ソフトウェアの第1のバージョンと関連付けられる第1のシンボルにアクセスするステップと、ソフトウェアの第2のバージョンと関連付けられる第2のシンボルにアクセスするステップと、第1および第2のシンボルの間で第1の比較を実施し、名称が合致する、および名称が合致しない第1および第2のシンボルを決定するステップであって、第1の比較は、第1および第2のシンボルの文字の間の比較を備える、ステップと、名称が合致しない第1および第2のシンボルの間の第2の比較を実施し、コールグラフが合致する、およびコールグラフが合致しない第1および第2のシンボルを決定するステップであって、第2の比較は、第1および第2のシンボルのコールグラフの間の比較を備える、ステップと、コールグラフが合致しない第1および第2のシンボルの間の第3の比較を実施し、コールシーケンスが合致する、およびコールシーケンスが合致しない第1および第2のシンボルを決定するステップであって、第3の比較は、第1および第2のシンボルのコールシーケンスの間の比較を備える、ステップと、第1、第2、および第3の比較に基づいて、ソフトウェアの第2のバージョンを表すコードを再編成するステップとを含んでもよい。
【0076】
さらなる開示される実施形態は、コードセットの間でシンボルを合致させるための方法を含む。本方法は、ソフトウェアの第1のバージョンと関連付けられる第1のシンボルにアクセスするステップと、ソフトウェアの第2のバージョンと関連付けられる第2のシンボルにアクセスするステップと、第1のシンボルと第2のシンボルを比較するステップと、比較に基づいて、第2のシンボルが第1のシンボルの機能的同等物であるかどうかを決定するステップと、第2のシンボルが第1のシンボルの機能的同等物であるかどうかに基づいて、指定アクションを実施するステップとを含んでもよい。
【0077】
さらなる実施形態によると、指定アクションを実施するステップは、第2のシンボルが第1のシンボルの機能的同等物である場合、第2のシンボルを第1のシンボルとの合致として指定するステップ、または第2のシンボルが第1のシンボルの機能的同等物ではない場合、第1または第2のシンボルのうちの少なくとも1つを新規または削除のいずれかとして指定するステップのうちの少なくとも1つを含む。
【0078】
さらなる実施形態によると、ソフトウェアの第2のバージョンは、ソフトウェア変更ファイルによって表され、第2のシンボルが第1のシンボルの機能的同等物であるかどうかを決定するステップは、第2のシンボルが第1のシンボルの機能的同等物であることを決定するステップを含み、本方法はさらに、第2のシンボルが第1のシンボルの機能的同等物であることを決定することに基づいて、アラートを提供するステップ、ソフトウェア変更ファイルをリネームするステップ、ソフトウェア変更ファイルにおける第2のシンボルをリネームするステップ、またはソフトウェア変更ファイルから第2のシンボルと関連付けられるコードの一部を除去するステップのうちの少なくとも1つを実施するステップを含む。
【0079】
さらなる実施形態によると、ソフトウェア変更ファイルは、差分ファイルである。
【0080】
さらなる実施形態によると、第1のシンボルと第2のシンボルを比較するステップは、増加する算出強度の複数の比較を実施するステップを含む。
【0081】
さらなる実施形態によると、第1のシンボルと第2のシンボルを比較するステップは、第1のシンボルと関連付けられる第1のファイル名と第2のシンボルと関連付けられる第2のファイル名を比較するステップと、第1のシンボルの第1のシンボル名と第2のシンボルの第2のシンボル名を比較するステップとを含み、第2のシンボルが第1のシンボルの機能的同等物であるかどうかを決定するステップは、第1のファイル名が第2のファイル名に合致し、第1のシンボル名が第2のシンボル名に合致するとき、第2のシンボルが第1のシンボルの機能的同等物であることを決定するステップを含む。
【0082】
さらなる実施形態によると、第1のシンボルと第2のシンボルを比較するステップは、第1のシンボルの第1のコールグラフと第2のシンボルの第2のコールグラフを比較するステップを含み、第2のシンボルが第1のシンボルの機能的同等物であるかどうかを決定するステップは、第1のコールグラフが第2のコールグラフに合致するとき、第2のシンボルが第1のシンボルの機能的同等物であることを決定するステップを含む。
【0083】
さらなる実施形態によると、第1のシンボルと第2のシンボルを比較するステップは、第1のシンボルと関連付けられるコールの第1のシーケンスと第2のシンボルと関連付けられるコールの第2のシーケンスを比較するステップを含み、第2のシンボルが第1のシンボルの機能的同等物であるかどうかを決定するステップは、第1のシーケンスが第2のシーケンスに合致するとき、第2のシンボルが第1のシンボルの機能的同等物であることを決定するステップを含む。
【0084】
さらなる開示される実施形態は、コードセットの間でシンボルを合致させるための方法を含む。本方法は、ソフトウェアの第1のバージョンと関連付けられる第1のシンボルにアクセスするステップと、ソフトウェアの第2のバージョンと関連付けられる第2のシンボルにアクセスするステップと、第1および第2のシンボルの間で第1の比較を実施し、名称が合致する、および名称が合致しない第1および第2のシンボルを決定するステップであって、第1の比較は、第1および第2のシンボルの文字の間の比較を備える、ステップと、名称が合致しない第1および第2のシンボルの間の第2の比較を実施し、コールグラフが合致する、およびコールグラフが合致しない第1および第2のシンボルを決定するステップであって、第2の比較は、第1および第2のシンボルのコールグラフの間の比較を備える、ステップと、コールグラフが合致しない第1および第2のシンボルの間の第3の比較を実施し、コールシーケンスが合致する、およびコールシーケンスが合致しない第1および第2のシンボルを決定するステップであって、第3の比較は、第1および第2のシンボルのコールシーケンスの間の比較を備える、ステップと、第1、第2、および第3の比較に基づいて、ソフトウェアの第2のバージョンを表すコードを再編成するステップとを含んでもよい。
【0085】
開示される実施形態の側面は、1つまたはそれを上回るプロセッサによって実行されると、開示される実施形態と一致する方法、動作、および同等物のうちの1つまたはそれを上回るものを実施および実行するために構成され、かつそれが可能である、ソフトウェア命令を記憶する、1つまたはそれを上回る有形コンピュータ可読媒体を含んでもよい。また、開示される実施形態の側面は、実行されると、開示される実施形態と一致する1つまたはそれを上回る動作を実施する、論理および命令とともにプログラムされる、ソフトウェア命令に基づいて、特殊目的プロセッサとして構成される、1つまたはそれを上回るプロセッサによって実施されてもよい。1つまたはそれを上回るプロセッサは、1つまたはそれを上回るデバイスおよび/またはシステムの一部であってもよい。
【0086】
前述の一般的説明および以下の詳細な説明は両方とも、例示的かつ説明的にすぎず、請求されるような開示される実施形態の制限ではないことを理解されたい。
本発明は、例えば、以下の項目を提供する。
(項目1)
非一過性コンピュータ可読媒体であって、上記非一過性コンピュータ可読媒体は、命令を含み、上記命令は、少なくとも1つのプロセッサによって実行されると、上記少なくとも1つのプロセッサに、関数およびサブ関数分析に基づいて、コードを自動的に再構成するための動作を実施させ、上記動作は、
複数の関数を表すコード構造を解析することによって、少なくとも1つの第1の関数が閾値複雑度を有することを決定することと、
上記決定に応答して、上記少なくとも1つの第1の関数に基づいて、複数のサブ関数を識別することであって、上記複数のサブ関数は、上記少なくとも1つの第1の関数との共通性を有する、ことと、
上記識別された複数のサブ関数のうちの少なくとも1つをコールするように上記第1の関数を再構成することによって、第2の関数を形成することと
を含む、非一過性コンピュータ可読媒体。
(項目2)
上記識別された複数のサブ関数のうちの少なくとも1つは、上記第1の関数によってコールされる内部サブ関数と関連付けられる、上記項目に記載の非一過性コンピュータ可読媒体。
(項目3)
上記複数のサブ関数を識別することは、コードの少なくとも1つのブロックと、上記コードの少なくとも1つのブロックを他のコードから区別する少なくとも1つのディバイダとを識別することを含む、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目4)
上記動作はさらに、
初期コードファイルを受信することであって、上記コード構造は、上記初期コードファイルを表す、ことと、
上記第2の関数を含むように上記初期コードファイルを更新することと
を含む、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目5)
上記閾値複雑度は、少なくとも部分的に、機械学習モデルによって決定され、
上記動作はさらに、
上記初期コードファイルと関連付けられる関数のサイズまたは複雑さのうちの少なくとも1つと上記更新された初期コードファイルを伴う関数のサイズまたは複雑さのうちの少なくとも1つを比較することと、
上記比較に基づいて、上記機械学習モデルを更新することと
を含む、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目6)
上記動作はさらに、
ユーザ入力を受信することと、
上記ユーザ入力に基づいて、上記閾値複雑度を決定することと
を含む、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目7)
上記閾値複雑度は、文字の数、コード行の数、または記憶空間の量のうちの少なくとも1つによって定量化される関数長として表される、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目8)
上記コード構造は、抽象構文ツリー(AST)を備える、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目9)
上記閾値複雑度は、上記ASTに基づく、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目10)
上記閾値複雑度は、抽象構文サブツリーのサイズとして表される、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目11)
上記ASTは、ノードタイプを有する複数のノードを備え、
上記複数のサブ関数を識別することはさらに、上記ノードタイプに基づく、
上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目12)
上記閾値複雑度は、上記第1の関数のバイナリコードに基づく、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目13)
上記共通性は、コール、引数、文、または変数のうちの少なくとも1つを備える、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目14)
上記動作はさらに、
少なくとも1つの新しい変数を発生させることと、
上記サブ関数のうちの少なくとも1つにおいて上記少なくとも1つの新しい変数を配置することと
を含む、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目15)
上記コード構造は、コントローラ上で実行されるように構成されるコードと関連付けられる、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目16)
上記複数のサブ関数を識別することは、上記サブ関数のうちの少なくとも1つを抽出する、または発生させることを含む、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目17)
上記第1の関数を再構成することは、上記第1の関数からコードを除去することを含む、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目18)
上記複数のサブ関数が上記少なくとも1つの第1の関数と有する上記共通性は、共通の動作、共通のコマンド、共通のコマンドのシーケンス、共通の式、共通の引数、または共通のコード行のうちの少なくとも1つを備える、上記項目のいずれか1項に記載の非一過性コンピュータ可読媒体。
(項目19)
関数およびサブ関数分析に基づいて、コードを自動的に再構成するためのコンピュータ実装方法であって、
複数の関数を表すコード構造を解析することによって、少なくとも1つの第1の関数が閾値複雑度を有することを決定することと、
上記決定に応答して、上記少なくとも1つの第1の関数に基づいて、複数のサブ関数を識別することであって、上記複数のサブ関数は、上記少なくとも1つの第1の関数との共通性を有する、ことと、
上記識別された複数のサブ関数のうちの少なくとも1つをコールするように上記第1の関数を再構成することによって、第2の関数を形成することと
を含む、コンピュータ実装方法。
(項目20)
初期コードファイルを受信することであって、上記コード構造は、上記初期コードファイルを表す、ことと、
上記第2の関数を含むように上記初期コードファイルを更新することと
をさらに含む、上記項目に記載のコンピュータ実装方法。
(摘要)
本明細書中に開示されるのは、関数およびサブ関数分析に基づいて、コードを自動的に再構成するための技法である。技法は、複数の関数を表すコード構造を解析することによって、少なくとも1つの第1の関数が閾値複雑度を有することを決定するステップと、決定に応答して、少なくとも1つの第1の関数に基づいて、複数のサブ関数を識別するステップであって、複数のサブ関数は、少なくとも1つの第1の関数との共通性を有する、ステップと、識別された複数のサブ関数のうちの少なくとも1つをコールするように第1の関数を再構成することによって、第2の関数を形成するステップとを含む。
【図面の簡単な説明】
【0087】
本明細書内に組み込まれ、その一部を成す、付随の図面は、いくつかの例示的実施形態を図示し、説明とともに、開示される原理を解説する役割を果たす。
【0088】
【
図1A】
図1Aは、本開示の実施形態と一致する、ソフトウェア分析およびソフトウェア変更をコントローラに提供するためのコントローラネットワークの例示的絵図表現を図示する。
【0089】
【
図1B】
図1Bは、本開示の実施形態と一致する、ソフトウェア分析デバイスの例示的絵図表現を図示する。
【0090】
【
図1C】
図1Cは、本開示の実施形態と一致する、コントローラの例示的絵図表現を図示する。
【0091】
【
図2】
図2は、本開示の実施形態と一致する、関数の分析に基づいて、コードを変更するための例示的プロセスのフローチャートを描写する。
【0092】
【
図3】
図3は、本開示の実施形態と一致する、関数の分析に基づくコードへの変更の例示的絵図表現を図示する。
【0093】
【
図4】
図4は、本開示の実施形態と一致する、サブ関数分析に基づいて、差分ファイルを発生させるための例示的プロセスのフローチャートを描写する。
【0094】
【
図5】
図5は、本開示の実施形態と一致する、関数分析に基づいて、実行可能ファイルを更新するための例示的プロセスのフローチャートを描写する。
【0095】
【
図6】
図6は、本開示の実施形態と一致する、共通コード部分に基づく関数の再構成の例示的絵図表現を図示する。
【0096】
【
図7】
図7は、本開示の実施形態と一致する、シンボル共通性および分岐を識別するための例示的プロセスのフローチャートを描写する。
【発明を実施するための形態】
【0097】
実施形態の説明
例示的実施形態の詳細な説明
ここで、その実施例が、付随の図面に図示され、本明細書に開示される、例示的実施形態が詳細に参照されるであろう。便宜的であるときは常時、同一の参照番号が、図面全体を通して、同一または同様の部分を指すために使用されるであろう。開示される実施形態は、当業者が開示される実施形態を実践することを可能にするために十分に詳細に説明される。他の実施形態が、利用され得、変更が、開示される実施形態の範囲から逸脱することなく、行われ得ることを理解されたい。したがって、材料、方法、および実施例は、例証にすぎず、必ずしも、限定であることを意図していない。
【0098】
図1Aは、システム100を含み得る、システムアーキテクチャ10の例示的絵図表現を図示する。システム100は、セキュリティプロバイダ、ソフトウェア開発者、コンピュータソフトウェアを開発または改良することと関連付けられる、エンティティ、またはこれらまたは類似するエンティティの任意の組み合わせによって維持されてもよい。システム100は、単一のデバイスまたはデバイスの組み合わせであり得、
図1Bに関してさらに詳細に説明される、ソフトウェア分析デバイス102を含んでもよい。ソフトウェア分析デバイス102は、ネットワークリソース104a、104b、および/または104c等の任意の数のネットワークリソースと通信してもよい。ネットワークリソースは、データベース、スーパーコンピュータ、汎用コンピュータ、特殊目的コンピュータ、仮想コンピューティングリソース、または任意の他のデータ記憶または処理リソースであってもよい。例えば、ネットワークリソースは、コンテナまたは仮想マシンであってもよく、これは、種々の処理基準に応答してスピンアップまたはスピンダウンされてもよい。別の実施例として、ネットワークリソースは、シンボル情報のテーブル(下記にさらに議論される)を記憶する、データベースまたは他の記憶媒体であってもよい。データベースは、任意の数のディスクドライブ、サーバ、サーバアレイ、サーバブレード、メモリ、またはデータを記憶することが可能な任意の他の媒体を含んでもよい。データベースはまた、テキストデータベース、集中データベース、分散データベース、階層化データベース、リレーショナルデータベース(例えば、構造化照会言語、すなわち、SQL)、オブジェクト指向データベース、またはデータを記憶するために好適な任意の他の構成におけるものを含む、いくつかの方式で構成されてもよい。ネットワークリソース104a、104b、および/または104cは、ソフトウェア分析デバイス102から外部に示されるが、それらはまた、例えば、ハードディスクパーティションとして、その内部に存在してもよい。
【0099】
システムアーキテクチャ10はまた、コントローラシステム108a、108b、および108c等の任意の数のコントローラシステムを含んでもよい。コントローラシステムは、種々のタイプのネットワーク接続機器、デバイス、またはサービス、例えば、ホームセキュリティシステム、駐車施設センサシステム、車両、在庫監視システム、家電、電話機器、ネットワークルーティングデバイス、スマート送電網システム、ドローンまたは他の無人車両、病院監視システム、または任意の他のモノのインターネット(IoT)システムであってもよい。コントローラシステムは、ローカルエリアネットワーク(LAN)、広域ネットワーク(WAN)、または任意の他の通信ネットワーク配列内に配列される、コントローラを含んでもよい。さらに、各コントローラシステムは、任意の数のコントローラを含んでもよい。例えば、例示的コントローラシステム108aは、同一または異なる機能性または目的を有し得る、コントローラ110a、112a、および114aを含む。これらのコントローラは、
図1Cに関して議論される、例示的コントローラ114aの説明を通してさらに議論される。コントローラシステム108a、108b、および108cは、それぞれ、接続106a、106b、および106cを通して、システム100に接続してもよい。システム100はまた、接続106dを通して、任意の数のコンピューティングデバイス(例えば、パーソナルデスクトップコンピュータを含む)を含み得る、遠隔システム103に接続してもよい。遠隔システム103は、コードの作成者、物理的コンポーネントおよび/またはデバイス(例えば、コントローラ)の製造業者、システム(例えば、車両)製造業者、またはソフトウェアを開発および/または展開することと関連付けられる、別のエンティティと関連付けられてもよい(例えば、それによってホストされる)。接続106は、バス、ケーブル、無線(例えば、地上波)通信チャネル、電波ベースの通信チャネル、ローカルエリアネットワーク(LAN)、インターネット、無線ローカルエリアネットワーク(WLAN)、広域ネットワーク(WAN)、セルラー通信ネットワーク、または任意のインターネットプロトコル(IP)ベースの通信ネットワークおよび同等物を含み得る、通信チャネルであってもよい。接続106a、106b、106c、および106dは、同一のタイプまたは異なるタイプであってもよい。
【0100】
システムアーキテクチャ10のコンポーネントの任意の組み合わせが、開示される例示的実施形態と一致する、本明細書に議論される例示的プロセスの任意の数のステップを実施してもよい。
【0101】
図1Bは、単一のデバイスまたは複数のデバイスであり得る、ソフトウェア分析デバイス102の例示的絵図表現を図示する。例えば、ソフトウェア分析デバイス102は、コンピュータ、サーバ、モバイルデバイス、特殊目的コンピュータ、または下記にさらに議論されるように、開示される実施形態の方法の任意の数のステップを実施し得る、任意の他のコンピューティングデバイスであってもよい。例えば、ソフトウェア分析デバイス102は、メモリ空間116において記憶される命令を実行するように構成され得る、下記に議論される、プロセッサ124を含んでもよい。コンポーネントの単数のインスタンスが、議論され得るが、複数のコンポーネントが、1つまたはそれを上回るデバイスを横断して存在してもよい。例えば、ソフトウェア分析デバイス102は、複数のプロセッサ124を含んでもよい。
【0102】
ソフトウェア分析デバイス102は、メモリ空間116と、プロセッサ124とを含んでもよい。いくつかの実施形態では、メモリ空間116は、複数のソフトウェア分析デバイス102を横断して存在してもよい。メモリ空間116は、単一のメモリコンポーネントまたは複数のメモリコンポーネントであってもよい。そのようなメモリコンポーネントは、例えば、電子記憶デバイス、磁気記憶デバイス、光学記憶デバイス、電磁記憶デバイス、半導体記憶デバイス、または前述の任意の好適な組み合わせを含んでもよい。例えば、メモリ空間116は、任意の数のハードディスク、ランダムアクセスメモリ(RAM)、読取専用メモリ(ROM)、消去可能プログラマブル読取専用メモリ(EPROMまたはフラッシュメモリ)、および同等物を含んでもよい。メモリ空間116は、本明細書に議論されるプロセスを実施するために1つまたはそれを上回るソフトウェアプログラムによって使用され得る、データ118を記憶してもよい。例えば、データ118は、コントローラソフトウェアプログラムの全てまたは一部を成すコード、ソフトウェア性能(実際の性能またはシミュレーション)に関する統計データ、コントローラ機能に関するデータ(例えば、機能名、機能実行時間、機能再構成の履歴等)、車両等のシステムの動作の間に取得されるデータ、および/または変数、バッファ、関数、コール、オブジェクト、文(例えば、分岐文)、識別子(例えば、メモリ場所識別子またはユーザ作成識別子)、コンパイル済みコード、未コンパイルコード、ソフトウェアパッケージ(例えば、ソフトウェア更新のため)、命令セット、または確認可能な意味を伴うコードの任意の他のセグメントであり得る、それをモデル化し得る、またはそれを表し得る、コードシンボルの分析に関する他のデータを含んでもよい。複数のソフトウェア分析デバイス102を伴う実施形態では、データ118は、複数のソフトウェア分析デバイス102を横断して重複形態において存在してもよい、および/または複数のソフトウェア分析デバイス102を横断して記憶される異なる部分に断片化されてもよい。メモリ空間116は、開示される実施形態に関連する機能を実施するためにプロセッサ124によって使用可能な命令を記憶するように構成される、1つまたはそれを上回る記憶デバイスを含んでもよい。例えば、メモリ空間116は、プロセッサ124によって実行されると、1つまたはそれを上回る動作(例えば、下記の図に関連して議論される動作)を実施する、ソフトウェアプログラム120またはコードセグメント等の1つまたはそれを上回るソフトウェア命令を伴って構成されてもよい。開示される実施形態は、専用タスクを実施するように構成される、別個のプログラムまたはコンピュータに限定されない。例えば、メモリ空間116は、システムアーキテクチャ10の機能を実施する、単一のプログラムまたは複数のプログラムを含んでもよい。
【0103】
ある実施形態では、メモリ空間116は、下記に議論される方法等の1つまたはそれを上回る方法を実施するようにプロセッサ124によって実行可能なソフトウェアを記憶してもよい。ソフトウェアは、C、MISRA-C、C#、C+、C++、PHP、Java(登録商標)、JavaScript(登録商標)、Python、ASCET、Lua、Go、Rust、Ada、および種々のその他等の様々なプログラミング技法、標準、および言語を介して、実装されてもよい。ソフトウェアはまた、SimulinkおよびStateflow等の種々のモデル化設計環境において実装されてもよい。さらに、本明細書に開示される技法が、自動車実施形態に限定されないことを強調されたい。スマートホーム家電、ネットワークセキュリティまたは監視機器、スマート需給メータ、接続されるセンサデバイス、駐車施設センサ、およびより多くのもの等の種々の他のIoT環境も、開示される技法を使用してもよい。そのような実施形態では、メモリ空間116は、上記に言及されるもの等の様々なプログラミング技法、標準、および言語に基づいて、ソフトウェアを記憶してもよい。
【0104】
プロセッサ124は、開示される実施形態と一致する、命令を実行するように構成される、または構成可能である、1つまたはそれを上回る専用処理ユニット、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、グラフィカル処理ユニット、またはメモリ空間116と結合される、種々の他のタイプのプロセッサまたは処理ユニットを含んでもよい。
【0105】
ソフトウェア分析デバイス102はまた、遠隔システム103またはシステム108b等の遠隔デバイスがソフトウェア分析デバイス102と相互作用することを可能にし得る、通信インターフェース122を含んでもよい。通信インターフェース122は、ソフトウェア分析デバイス102への、またはそこからの通信を可能にするために、アンテナまたは有線接続を含んでもよい。例えば、コントローラ114a、遠隔システム103、ネットワークリソース104c、またはソフトウェア分析デバイス102に通信可能に接続される任意の他のデバイス等の外部デバイスが、分析および/または再構成のためにコードをソフトウェア分析デバイス102に伝送してもよい。別の実施例として、ソフトウェア分析デバイス102は、コントローラ114a等のコントローラにコードを伝送し、メモリ空間116内に記憶されるソフトウェアを変更する等のある動作を実施するようにコントローラ114aに命令してもよい。
【0106】
ソフトウェア分析デバイス102はまた、ユーザまたはデバイスが、ソフトウェア分析デバイス102と相互作用することを可能にするように構成され得る、入/出力デバイス(I/O)126を含んでもよい。例えば、I/O126は、有線および/または無線ネットワークカード/チップセット(例えば、WiFiベース、セルラーベース等)、アンテナ、ディスプレイ(例えば、グラフィカルディスプレイ、テキストディスプレイ等)、発光ダイオード(LED)、ルータ、タッチスクリーン、キーボード、マイクロホン、スピーカ、触知デバイス、カメラ、ボタン、ダイヤル、スイッチ、ノブ、送受信機、入力デバイス、出力デバイス、または下記にさらに議論されるような開示される実施形態の方法の任意の数のステップを実施する、またはユーザがそれを実施することを可能にするように構成される、別のI/Oデバイスのうちの少なくとも1つを含んでもよい。ディスプレイは、液晶ディスプレイ(LCD)、面内切替型液晶ディスプレイ(IPS-LCD)、LEDディスプレイ、有機発光ダイオード(OLED)ディスプレイ、アクティブマトリクス有機発光ダイオード(AMOLED)ディスプレイ、陰極線管(CRT)ディスプレイ、プラズマディスプレイパネル(PDP)、デジタル光処理(DLP)ディスプレイ、またはユーザデバイスに接続し、情報をユーザに描写することが可能な任意の他のディスプレイを含んでもよい。ディスプレイは、グラフィカルインターフェース、相互作用可能グラフィカル要素、アニメーション、動的グラフィカル要素、および任意の他の視覚的要素を表示してもよい。
【0107】
図1Cは、電子制御ユニット(ECU)(例えば、Bosch
TM、Delphi Electronics
TM、Continental
TM、Denso
TM等の企業によって製造される)等の自動車コントローラであり得る、またはSkyworks
TM、Qorvo
TM、Qualcomm
TM、NXP Semiconductors
TM等によって製造されるIoTコントローラ等の非自動車コントローラであり得る、コントローラ114aの例示的絵図表現を図示する。コントローラ114aは、単一の機能(例えば、車両における制動機能、光感知、物体検出、運動感知、データ伝送等)または複数の機能を実施するように(例えば、プログラム134を通して)構成されてもよい。コントローラ114aは、開示される例示的実施形態と一致する、本明細書に議論される例示的プロセスの任意の数のステップを実施してもよい。
【0108】
コントローラ114aは、メモリ空間130と、プロセッサ138とを含んでもよい。メモリ空間130は、上記に説明される、メモリ空間116の任意の側面を含んでもよい。例えば、メモリ空間130は、開示される実施形態に関連する機能を実施するためにプロセッサ138によって使用可能な命令を記憶するように構成される、1つまたはそれを上回る記憶デバイスを含んでもよい。いくつかの実施形態では、メモリ空間130は、コントローラ動作(例えば、コントローラソフトウェア変更)に影響を及ぼすための1つまたはそれを上回る差分ファイルまたは他の形態のコントローラコードを含み得る、データ132を記憶してもよい。メモリ空間130はまた、プロセッサ138によって実行されると、1つまたはそれを上回る動作(例えば、車両動作、システム環境監視動作、産業システム動作、消費者アプリケーション動作等)を実施する、ソフトウェアプログラム134またはコードセグメント等の1つまたはそれを上回るソフトウェア命令を伴って構成されてもよい。
【0109】
プロセッサ138は、1つまたはそれを上回る専用処理ユニット、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、グラフィカル処理ユニット、またはメモリ空間130と結合される種々の他のタイプのプロセッサまたは処理ユニットを含んでもよい。
【0110】
コントローラ114aはまた、遠隔デバイスがコントローラ114aと相互作用することを可能にし得る、通信インターフェース136を含んでもよい。通信インターフェース136は、コントローラ114aへの、またはそこからの通信を可能にするために、アンテナまたは有線接続を含んでもよい。例えば、通信インターフェース136は、別のデバイスがコントローラ114aと通信することを可能にする、ユニバーサルシリアルバス(USB)ポートまたは他のタイプの接続インターフェースを含んでもよい。別の実施例として、外部デバイス(コントローラ114b、コントローラ116a、ソフトウェア分析デバイス102、またはコントローラ114aと通信することが可能な任意の他のデバイス)が、無線接続を経由して等、コントローラ114aにコード(例えば、差分ファイル等のソフトウェア変更ファイル)を伝送してもよく、これは、メモリ空間130内に記憶されるソフトウェアを変更する等のある動作を実施するようにコントローラ114aに命令してもよい。
【0111】
コントローラ114aはまた、コントローラ114aの物理的筐体の内部のAC/DCコンバータ、DC/DCコンバータ、調整器、またはバッテリであり得、電力をコントローラ114aに提供し、そのコンポーネントが機能することを可能にし得る、電力供給源140を含んでもよい。いくつかの実施形態では、電力供給源140は、コントローラの物理的筐体の外部に存在してもよく(すなわち、コントローラ114a自体の一部として含まれない場合がある)、電力を複数のコントローラ(例えば、コントローラシステム108a内の全てのコントローラ)に供給してもよい。
【0112】
コントローラ114aはまた、ユーザまたはデバイスが、コントローラ114aと相互作用することを可能にするように構成され得る、入/出力デバイス(I/O)142を含んでもよい。例えば、I/O142は、有線および/または無線ネットワークカード/チップセット(例えば、WiFiベース、セルラーベース等)、アンテナ、ディスプレイ(例えば、グラフィカルディスプレイ、テキストディスプレイ等)、LED、ルータ、タッチスクリーン、キーボード、マイクロホン、スピーカ、触知デバイス、カメラ、ボタン、ダイヤル、スイッチ、ノブ、送受信機、入力デバイス、出力デバイス、または下記にさらに議論されるような開示される実施形態の方法の任意の数のステップを実施する、またはユーザがそれを実施することを可能にするように構成される、別のI/Oデバイスのうちの少なくとも1つを含んでもよい。
【0113】
図2は、関数の分析に基づいて、コードを変更するための例示的プロセス200のフローチャートを図示する。上記の実施形態によると、プロセス200は、
図1に描写されるシステムアーキテクチャ10または任意のタイプのIoTネットワーク環境において実装されてもよい。例えば、プロセス200は、プロセッサ(例えば、プロセッサ124)および/または他のコンポーネント(例えば、ネットワークリソース104c)によって、または任意のコンピューティングデバイスまたはIoTシステムによって実施されてもよい。
【0114】
ステップ202において、プロセス200は、初期コードを受信してもよい。初期コードは、1つまたはそれを上回るコード行、シンボル(例えば、関数)のグループ等を含んでもよく、コンパイル済みまたは未コンパイルであってもよい。本明細書に議論される技法は、プログラミング言語に依存しないが、いくつかの実施形態では、初期コードは、C、MISRA-C、C#、C+、C++、PHP、Java(登録商標)、JavaScript(登録商標)、またはPython、または上記に言及されるプログラミング言語のうちのいずれか等の特定のプログラミング言語において書き込まれてもよい。初期コードは、コントローラ上のコードを変更することと関連付けられてもよい(例えば、そのために構成される)。例えば、初期コードは、コントローラ上のコードをコードの第1のバージョンからコードの第2のバージョンに変更するように構成されるコードを含んでもよい。いくつかの実施形態では、初期コードは、遠隔システム103から供給される、メモリ空間116からアクセスされる、または別様にプロセス200を実施するデバイスによってアクセスされてもよい。いくつかの実施形態では、初期コードは、グラフ、チャート、モデル、または他のコード構造によって表されてもよい。そのような表現は、プロセス200を実装するデバイスによって発生されてもよい、または初期コードの代わりに、またはそれに加えて受信されてもよい。例えば、プロセス200は、初期コードファイルを受信してもよく、初期コードファイルを表すコード構造にアクセスする、またはそれを発生させてもよい。いくつかの実施形態では、コード構造は、コントローラ上で実行されるように構成されるコードと関連付けられてもよい(例えば、それを表してもよい)。いくつかの実施形態では、コード構造は、コードの1つまたはそれを上回る部分(例えば、関数)および関係(例えば、コードの部分の間の影響、効果、相互依存関係、依存関係、コードフロー、制御転送、変数スコープ等)を含み得る、抽象構文ツリー(AST)を備えてもよい。いくつかの実施形態では、ASTは、ノードタイプを有する、複数のノードを備えてもよい。非限定的実施例として、ノードタイプは、関数タイプ、変数タイプ、コールタイプ、オブジェクトタイプ、演算子タイプ、リテラルタイプ、式タイプ、または文タイプのうちの少なくとも1つを含んでもよい。ノードタイプは、ノードと関連付けられるシンボルのタイプおよび/または機能的効果(例えば、デバイス動作に対する効果、別のノードに対する効果等)を識別してもよい。ノードはまた、ユーザ定義情報(例えば、ノードサブタイプ)と関連付けられてもよい。いくつかの実施形態では、ASTは、数千(またはさらには数十万)のノードを含んでもよい。
【0115】
ステップ204において、プロセス200は、第1の関数が閾値複雑度を有することを決定してもよい。例えば、プロセス200は、複数の関数を表すコード構造(例えば、AST)を解析することによって、少なくとも1つの第1の関数が閾値複雑度を有することを決定してもよい。コード構造(またはコンパイル済みまたは未コンパイルコードを含む、任意の形態のコード)を解析するステップは、開示される実施形態と一致する、アルゴリズムまたはモデルに従って、コード構造またはコードを分析するステップを含んでもよい。閾値複雑度は、関数と関連付けられる(例えば、その側面を示す、それに影響を及ぼす、またはそれによって影響を受ける)1つまたはそれを上回る属性を伴い得る、1つまたはそれを上回る方法で表されてもよい。例えば、閾値複雑度は、文字の数、コード行の数、または記憶空間の量(例えば、関数と関連付けられる記憶空間の量)のうちの少なくとも1つによって定量化される、関数長として表されてもよい。加えて、または代替として、閾値複雑度は、AST(例えば、上記に議論されるように、第1の関数等の単一の関数と関連付けられるASTまたは複数の関数と関連付けられるAST)に基づいてもよい。例えば、閾値複雑度は、ASTにおける枝の数、ASTにおける枝の長さ、ASTにおけるノードの数、またはそれらの任意の組み合わせに基づいてもよい(例えば、それと相関される、またはそれに比例する)。加えて、または代替として、閾値複雑度は、抽象構文サブツリー(例えば、より大きいASTの一部)のサイズとして表されてもよい。加えて、または代替として、閾値複雑度は、第1の関数のバイナリコードに基づいてもよい。いくつかの実施形態では、第1の関数は、コードのネスト化部分のループまたはグループを含んでもよい。加えて、または代替として、閾値複雑度は、ローカル変数の数、制御フローループの数、グローバル変数への参照の数、他の関数への参照の数、または関数からそれ自体への内部参照の数のうちの少なくとも1つに基づいてもよい(例えば、それと相関される、またはそれに比例する)。加えて、または代替として、閾値複雑度は、実行および/またはコンパイル時間に基づいてもよい(例えば、それと相関される、またはそれに比例する)。当然ながら、関数と関連付けられるこれらの属性の(例えば、アルゴリズムまたはモデルにおいて表されるような)任意の組み合わせが、(例えば、関数の)複雑さを決定するために使用されてもよい。コード構造を分析するステップは、(例えば、統計モデルを使用して)コード構造に静的分析を適用するステップ、(例えば、動的モデルを使用して)コード構造に動的分析を適用するステップ、および/またはコード構造と関連付けられる実行時間を決定するステップ、コード構造と関連付けられる実行タイミングを決定するステップ、コード構造と関連付けられる実行シーケンスを決定するステップ、または上記に議論されるように、複雑度を表す任意の他の属性を決定するステップ等、(例えば、静的または動的分析を通して)コード構造と関連付けられる複雑さ属性を決定するステップを含んでもよい。コード構造を分析するステップはまた、少なくとも1つの決定された複雑さ属性と所定の複雑さ閾値を比較するステップを含んでもよい。
【0116】
いくつかの実施形態では、プロセス200は、ユーザ入力を受信するステップと、ユーザ入力に基づいて、閾値複雑度を決定するステップとを含んでもよい。例えば、プロセス200は、ASTのレベル、関数長、またはコードの複雑度の他のインジケーションを備える、ユーザ入力を受信してもよい。さらなる実施例として、ユーザは、コードの複雑度を示すために、AST等のコントローラコードの視覚的表現の一部を選択してもよい。いくつかの実施形態では、閾値複雑度は、少なくとも部分的に、機械学習モデルによって決定されてもよい(または場合によっては再決定される)。機械学習モデルは、例えば、とりわけ、ニューラルネットワーク、畳み込みニューラルネットワーク(CNN)モデル、クラスタリングモデル、または回帰モデルであってもよい。例えば、機械学習モデルは、コードを再構成する好都合な方法(例えば、再構成するべき関数を決定するために使用するべき関数の閾値複雑度)を予測するために、異なる初期コードの入力を使用して(教師ありおよび/または教師なし訓練を通して)訓練されてもよい。例えば、機械学習モデルは、閾値複雑度等の出力に影響を及ぼす入力に基づいて、更新されたコード、ファイルサイズ、関数サイズ、実行時間、調節された関数と関連付けられる複雑度、または任意の他の複雑さのインジケーション等の結果として生じる出力を解釈してもよい。例えば、機械学習モデルは、コード変更ファイルが、低減された長さのサブ関数および/または関数を有する、低減された長さ(例えば、コード行の数)を有する、低減されたファイルサイズを有する、低減された実行時間を有する、および/または低減されたリソース負荷(例えば、プロセッサ負荷)を有する一方、依然として、初期ファイルと同一の機能的結果(例えば、デバイス機能挙動、デバイス能力、デバイスソフトウェアバージョン等)を達成する結果をもたらすであろう閾値複雑度を予測してもよい。
【0117】
ステップ206において、プロセス200は、少なくとも1つの第1の関数(例えば、ステップ202において決定される)に基づいて、複数のサブ関数を識別してもよい。サブ関数を識別するステップは、関数(例えば、第1の関数)のコードのサブセット(例えば、関数内の自己完結型コードブロック)をサブ関数として決定するステップを含んでもよい。いくつかの実施形態では、プロセス200は、関数の構造および/またはコンテンツに従って、関数のコードのサブセットを決定してもよい。例えば、第1の関数は、セミコロン、括弧、インデント、制御フロー文、キーワード、文字のキー文字列、またはコードの部分を分離する他のインジケータを含んでもよい。プロセス200は、サブ関数を識別するために、これらのインジケータの組み合わせを使用してもよい。例えば、プロセス200は、サブ関数の範囲を描出する点として使用するためのいくつかのインジケータを決定してもよい、および/またはサブ関数の範囲を描出する点として使用しないいくつかのインジケータ(例えば、関数のサブ関数への分割)を決定してもよい。別の実施例として、プロセス200は、AST(例えば、関数を表すAST)の枝(または枝のグループ)と関連付けられる(例えば、それに対応する、またはそれによって表される)コードがサブ関数であることを決定してもよい。いくつかの実施形態では、プロセス200は、(下記にさらに議論される機械学習技法を使用することによって等)ユーザ影響下および/または機械影響下のパラメータに基づいてインジケータを取り扱う方法を決定してもよい。例えば、プロセス200は、ASTのノードタイプまたはサブタイプに基づいてインジケータを取り扱う方法を決定してもよい。例えば、特定のノードタイプは、サブ関数を描出する点として使用しないように指定されてもよい。第1の関数が、コードのネスト化部分のループまたはグループを含む場合等のいくつかの実施形態では、プロセス200は、コードのネスト化部分をサブ関数として決定してもよい。
【0118】
いくつかの実施形態では、プロセス200は、第1の関数の決定(例えば、第1の関数が閾値複雑度を満たすこと)に応答して、複数のサブ関数を識別してもよい。いくつかの実施形態では、複数のサブ関数を識別するステップは、サブ関数のうちの少なくとも1つを抽出するステップを含んでもよい。例えば、プロセス200は、ソフトウェアの初期コードまたは他の部分からサブ関数を抽出してもよい。いくつかの事例では、サブ関数を抽出するステップは、初期コードからコードの一部をコピーするステップを含んでもよい。
【0119】
いくつかの実施形態では、複数のサブ関数を識別するステップは、サブ関数のうちの少なくとも1つを発生させるステップを含んでもよい。例えば、プロセス200は、初期コードの構造、機能性、またはコンテンツ(例えば、初期コードの関数)に基づいて、少なくとも1つのサブ関数を発生させてもよい。例えば、プロセス200は、関数のコードのサブセットをサブ関数として決定してもよく、コードのサブセットを明確に異なるサブ関数として保持するためのシェルまたは他のコード構造を発生させてもよい(例えば、引数、コール、コード行等のコードのサブセットを含有するコードを有する関数を発生させる)。いくつかの実施形態では、プロセス200は、第1のコード部分のうちの1つまたはそれを上回るものに類似し得る、1つまたはそれを上回る第2のコード部分を含み得る、少なくとも1つのサブ関数を発生させてもよい。例えば、第2のコード部分は、所定の閾値(例えば、実行プロファイル)に基づいて、第1のコード部分と同じであってもよい、第1のコード部分と同じ機能的効果を有してもよい、第1のコード部分と重複する部分を有してもよい、および/または第1のコード部分に類似する機能的効果を有してもよい。
【0120】
いくつかの実施形態では、複数のサブ関数は、少なくとも1つの第1の関数との共通性を有してもよい。サブ関数共通性は、コンテンツ、構造、および/または関数の共通性を含んでもよい。例えば、共通性は、共通のコール、引数、文、変数、動作、ブロック、シンボル、および/またはコード行のうちの少なくとも1つを備えてもよい。例えば、複数のサブ関数のうちの2つはそれぞれ、相互との共通の部分を有するコールを含んでもよい。別の実施例として、複数のサブ関数が少なくとも1つの第1の関数と有する共通性は、共通の動作、共通のコマンド、共通のコマンドのシーケンス、共通の式、共通の引数、または共通のコード行のうちの少なくとも1つを備えてもよい。また別の実施例として、共通性は、共通の構文、実行のシーケンス、シンボルとの関係、および/またはシンボルの組み合わせを備えてもよい。
【0121】
いくつかの実施形態では、複数のサブ関数のうちの少なくとも1つは、第1の関数によってコールされる、内部サブ関数(または他のコードシンボル)と関連付けられてもよい。いくつかの実施形態では、複数のサブ関数を識別するステップは、コードの少なくとも1つのブロックと、コードの少なくとも1つのブロックを他のコードから区別する、少なくとも1つのディバイダとを識別するステップを含んでもよい。コードのブロックは、コール、変数、語句、少なくとも1つのコード行、または確認可能な意味を有するコードの任意の他の部分と見なされてもよい。ディバイダは、文字(例えば、セミコロン)、キーワード、テキストのキー文字列、構文(例えば、インデント)、文(例えば、break文)、またはコードの意味のある部分の開始または終了を示す任意の他の表記を含んでもよい。いくつかの実施形態では、複数のサブ関数は、上記に議論されるように、関数の構造および/またはコンテンツに従って決定されてもよい。例えば、複数のサブ関数を識別するステップは、第1の関数内のbreak項を識別するステップを含んでもよく、break項は、case文の第1および第2のセットを分割する。複数のサブ関数を識別するステップは、case文の第1のセットと関連付けられる第1のサブ関数を識別する(または発生させる、アクセスする等)ステップと、case文の第2のセットと関連付けられる第2のサブ関数を識別する(または発生させる、アクセスする等)ステップとを含んでもよい。いくつかの実施形態では、複数のサブ関数を識別する(または発生させる、アクセスする等)ステップは、ノードタイプ(例えば、上記に議論される、ASTのノードタイプ)および/またはノード構成(例えば、ノードの間の関係)に基づいてもよい。
【0122】
閾値複雑度を伴う関数を決定することと同様に、プロセス200はまた、サブ関数を識別するステップに機械学習技法を適用してもよい。例えば、機械学習モデルは、異なるコード再構成(例えば、関数を伴うサブ関数の異なる識別)および結果として生じる関数またはファイル特性(例えば、ステップ208および210に議論される関数またはファイルの性能特性、エラーカウント、バイトサイズ等)に基づいて、予測することを学習してもよい。加えて、または代替として、機械学習モデルは、(可能性として考えられる将来の変更を含む)コードへの変更の複雑さおよび/またはサイズを低減させるが、また、閾値を超えるサブ関数またはコールの数を作成しない、いくつかのサブ関数をコールするように第1の関数を(例えば、第2の関数およびサブ関数に)再構成するための最適なパラメータを学習してもよい。加えて、または代替として、機械学習モデルは、そうでなければ、低減された性能品質、エラー、破壊的変更、または他の潜在的に不要な側面を引き起こし得る、あるインジケータを(上記に議論される)サブ関数の範囲を描出する点として使用しないように(例えば、入力の変更および出力および出力への変更の機械観察を伴う反復プロセスを通して)学習してもよい。
【0123】
ステップ208において、プロセス200は、第2の関数を形成してもよい。いくつかの実施形態では、第2の関数は、第1の関数と共通する1つまたはそれを上回る部分、および第1の関数と共通しない場合がある1つまたはそれを上回る部分を有してもよい。例えば、プロセス200は、複数のサブ関数のうちの少なくとも1つをコールするように第1の関数を再構成することによって、第2の関数を形成してもよく、これは、第1の関数に新しいサブ関数、関数、コール、引数、メモリ場所への参照、またはコードの他のセグメントを追加するステップを含んでもよい。いくつかの実施形態では、第1の関数を再構成するステップはまた、(例えば、その機能性を変更しない間に)第1の関数からコードを除去するステップまたは第1の関数にコードを追加するステップを含んでもよい。例えば、プロセス200は、第1の関数に、コード行の第1のグループを含むサブ関数をコールさせてもよく、サブ関数は、コード行の第1のグループに対応するコード行の第2のグループを含む。いくつかの実施形態では、第2の関数を形成するステップは、第2の関数の一部であり得、第1の関数からのコードに加えるものであり得る、ローカル変数または他のシンボルを発生させるステップを含んでもよい。いくつかの実施形態では、プロセス200は、少なくとも1つの新しい変数を発生させてもよく、(上記に議論されるように、発生される場合とそうではない場合がある)サブ関数のうちの少なくとも1つにおいて少なくとも1つの新しい変数を配置してもよく、これは、第2の関数を形成するステップの一部として行われてもよい。関数を形成する視覚的実施例が、
図3によって実証される。
【0124】
ステップ210において、プロセス200は、第2の関数に基づいて、初期コードを更新してもよい。例えば、プロセス200は、第2の関数を含むように初期コードファイルを更新してもよい。加えて、または代替として、プロセス200は、(例えば、初期コードがコントローラ上で実行されるとき)コントローラ上のコードからの第1の関数の除去を引き起こすように初期コード(例えば、差分ファイルであり得る、ソフトウェア変更ファイル)を構成してもよい。プロセス200はまた、第1の関数を非実行可能な状態にさせるように初期コードを構成してもよい(例えば、実行のシーケンスから第1の関数をリンク解除する、メモリアドレスを変更する、初期コードから第1の関数を除去する等)。いくつかの実施形態では、プロセス200は、初期コードファイルと関連付けられる(例えば、その中に含有される、またはそれによって表される)関数(または他のコードセグメント)のサイズまたは複雑さのうちの少なくとも1つと更新された初期コードファイルと関連付けられる関数(または他のコードセグメント)のサイズまたは複雑さのうちの少なくとも1つを比較してもよく、比較に基づいて、機械学習モデル(例えば、上記に議論されるように、より小さいまたは最も小さい長さ、ファイルサイズ、実行時間、またはリソース負荷を予測するように構成される機械モデル)を更新してもよい。関数の再構成されたバージョンを用いて初期コードを更新することによって、関数サイズ、ファイルサイズ、および/または実行時間(例えば、更新された初期ファイルと関連付けられる実行時間)は、低減され、帯域幅およびコンピューティングリソース負荷を低減させ得る。いくつかの実施形態では、プロセス200は、(例えば、プロセス500による)第1のコード部分の間の共通性を決定することに関連するステップを含んでもよく、これは、ファイルサイズ、実行時間、およびリソース負担の低減のさらなる効率を提供し得る。更新された初期ファイルは、C、MISRA-C、C#、C+、C++、PHP、Java(登録商標)、JavaScript(登録商標)、またはPython等の1つまたはそれを上回るプログラミング言語において書き込まれてもよい。
【0125】
図3は、プロセス200に従って等、関数の分析に基づくコードへの変更の非限定的例示的視覚表現を描写する。
図3に見られるように、関数300aは、コード部分302aと、コード部分302bと、コード部分302cとを含む。コード部分は、実行のために構成される場合とそうではない場合がある、コンピューティングコードの量である、またはそれを表してもよい。例えば、コード部分は、変数、バッファ、関数、コール、オブジェクト、文(例えば、case文)、識別子(例えば、メモリ場所識別子)、コンパイル済みコード、未コンパイルコード、ソフトウェアパッケージ(例えば、ソフトウェア更新のため)、命令セット、または確認可能な意味を伴うコードの任意の他のセグメントである、またはそれを表し得る、コードシンボルであってもよい。
【0126】
図3に示されるように、関数300aはまた、関数300b、サブ関数304a、サブ関数304b、およびサブ関数304cによって表されてもよい。いくつかの実施形態では、関数300b、サブ関数304a、サブ関数304b、およびサブ関数304c等の関数および/またはサブ関数は、プロセス200等のコードを変更するためのプロセスに従って発生されてもよい。いくつかの実施形態では、サブ関数(例えば、サブ関数304a)は、以前の関数(例えば、関数300a)からの1つまたはそれを上回るコード部分を含んでもよい。いくつかの実施形態では、サブ関数(例えば、サブ関数304b)は、関数(例えば、関数300a)におけるコードの全体よりも少ないものを含んでもよい。サブ関数はまた、関数において見出されない付加的コードを含んでもよい。いくつかの実施形態では、別の関数(例えば、関数300a)に基づいて形成されるサブ関数および/または関数は、他の関数の引数である、少なくとも1つの引数を含んでもよい。例えば、
図3に見られるように、サブ関数304aは、「int p2,」を含み、サブ関数304bは、「int p1,」を含み、その両方は、関数300aの引数である。
【0127】
本実施例では、サブ関数304aは、コード部分302aを含み、サブ関数304bは、コード部分302bを含み、サブ関数304cは、コード部分302cを含む。したがって、各サブ関数は、関数300aからのコード部分を含む。いくつかの実施形態では、以前の関数(例えば、関数300a)に基づいて発生され得る、第1の関数(例えば、関数300b)は、少なくとも1つのサブ関数への1つまたはそれを上回るコールを含んでもよく、少なくとも1つのサブ関数は、以前の関数からのコードの一部を含んでもよい。本実施例に見られるように、関数300bは、サブ関数304a、304b、および304cのそれぞれへのコールを含む。
【0128】
図4は、サブ関数分析に基づいて、差分ファイルを発生させるための例示的プロセス400のフローチャートを図示する。上記の実施形態によると、プロセス400は、
図1に描写されるシステムアーキテクチャ10または任意のタイプのIoTネットワーク環境において実装されてもよい。例えば、プロセス400は、プロセッサ(例えば、プロセッサ124)および/または他のコンポーネント(例えば、ネットワークリソース104c)によって、または任意のコンピューティングデバイスまたはIoTシステムによって実施されてもよい。いくつかの実施形態では、プロセス200の全てまたは一部が、プロセス400および他の開示される実施形態の側面とともに実装されてもよい。
【0129】
ステップ402において、プロセス400は、変更コードを受信してもよい。変更コードは、デバイス上にインストールされたデバイスコードへの変更を表してもよく、コントローラ等のデバイス上のコードを更新する、ダウングレードする、または別様に改変することと関連付けられる任意の量のコードを含んでもよい。変更コードは、デバイス上で実行されるように構成される場合とそうではない場合がある。例えば、変更コードは、バイナリコード、ソフトウェアライブラリ、ソフトウェア画像、差分ファイル、またはデバイス(例えば、コントローラ)上のコードを変更するために好適な任意の他のファイルを備えてもよい。変更コードは、C、MISRA-C、C#、C+、C++、PHP、Java(登録商標)、JavaScript(登録商標)、またはPython等の1つまたはそれを上回るプログラミング言語において書き込まれてもよい。
【0130】
ステップ404において、プロセス400は、デバイスコードを受信してもよい。デバイスコードは、デバイス(例えば、それに変更コードが実装されるべきであるデバイス)に現在展開されているコードを表してもよい。デバイスコードはまた、変更コードに対するソフトウェアの以前のバージョンを表すコードであってもよい。いくつかの実施形態では、デバイスコードは、デバイス自体から受信されてもよい。実施例として、プロセス400を実装するシステム100は、コントローラ110cからデバイスコードを受信してもよい。また別の実施例として、デバイスコードは、プロセス400の全てまたは一部を実施している場合がある、システム100から遠隔のソフトウェア開発者と関連付けられ得る、遠隔システム103から受信されてもよい。いくつかの実施形態では、デバイスコードを受信するステップは、記憶コンポーネントにおいて記憶されるデバイスコードにアクセスするステップを含んでもよい。例えば、プロセス400を実装するシステム100は、メモリ空間116からデバイスコードにアクセスしてもよい。
【0131】
ステップ406において、プロセス400は、変更コードによって表される、第1の関数を識別してもよい。例えば、プロセス400は、変更コードまたは変更コードを表すコード構造を解析することによって、第1の関数を識別してもよい。いくつかの実施形態では、変更コードは、第1の関数を含んでもよい。いくつかの実施形態では、変更コードを表すコード構造は、ASTを備えてもよい、および/または
図2に関して上記に議論されるコード構造の任意の特性を含んでもよい。
【0132】
ステップ408において、プロセス400は、デバイスコードによって表される、第2の関数を識別してもよい。例えば、プロセス400は、デバイスコードまたはデバイスコードを表すコード構造を解析することによって、第2の関数を識別してもよい。いくつかの実施形態では、デバイスコードは、第2の関数を含んでもよい。いくつかの実施形態では、デバイスコードを表すコード構造は、ASTを備えてもよい、および/または
図2に関して上記に議論されるコード構造の任意の特性を含んでもよい。
【0133】
ステップ410において、プロセス400は、決定論的プロセスを通して等、第1および第2の関数に基づいて、複数のサブ関数を識別してもよい。いくつかの実施形態では、複数のサブ関数を識別するステップは、プロセス200に関して議論される同一または類似する側面を含んでもよい。サブ関数は、変数、引数、コール、コマンド、命令、または関数の任意の部分を含んでもよい。いくつかの実施形態では、複数のサブ関数を識別するステップは、コードの部分の間の分割点を決定し、コードの部分をサブ関数として指定するステップを含んでもよい。例えば、複数のサブ関数を識別するステップは、第1および第2の関数を、第1および第2の関数の機能性を表すサブ関数の個別のセットに構造化するステップを含んでもよい。いくつかの実施形態では、第1および第2の関数のサブ関数のセットは、同一であってもよい。例えば、プロセス400は、第1および第2の関数を同一の構造のサブ関数にリファクタリングしてもよい。加えて、または代替として、プロセス400は、ユーザ入力に基づいて、分割点を決定してもよい。例えば、ユーザは、関数に関する1つまたはそれを上回る分割点(例えば、上記に議論される、ディバイダ)を指定してもよい、および/または非分割に関してコードの一部(例えば、関数の一部)を指定してもよい(例えば、コードの一部を分割またはリファクタリングされるべきではないサブ関数として識別する)。加えて、いくつかの実施形態では、コードのバージョンが、変更される(例えば、変更コードのバージョン、デバイスコードのバージョン、デバイスコードのバージョンに対する変更コードのバージョン等)場合、プロセス400は、決定された分割点を変更することなく、識別されたサブ関数を変更してもよく、これは、関数、ファイル、ソフトウェアバージョン等の間の変更のより容易な追跡または実装を可能にし得る。
【0134】
いくつかの実施形態では、サブ関数のサブセットが、1つまたはそれを上回る基準を使用して識別されてもよい。例えば、複数のサブ関数は、少なくとも1つの関数(例えば、第1および/または第2の関数)の構造および/または少なくとも1つの関数内のコードセグメントの機能的効果に基づいて、識別されてもよい。例えば、サブ関数は、関数内のサブ関数の明示的な識別子に基づいて識別されてもよい。加えて、または代替として、サブ関数識別基準は、長さ(例えば、コード行の数、文字の数、動作の数等)、バイトサイズ、相互依存関係、使用の頻度、実行時間、コード行内のインデントレベル(または他の構造的差別化要因)、コードの部分の分離(例えば、キーワード、テキストのキー文字列、セミコロン、コロン、括弧、および同等物による)、階層内のコードの部分の位置(例えば、ASTにおける枝の数によって表される)、コードの一部の機能的影響(例えば、コードをモデル化することを通して決定する)、または関数内のコードの一部の機能および/または構造の任意の他のインジケータに基づいて決定され得る、複雑度(機能的および/または構造的)であってもよい、またはそれと関連付けられてもよい。
【0135】
いくつかの実施形態では、複数のサブ関数を識別するステップは、少なくとも1つの関数(例えば、第1および/または第2の関数)が閾値複雑度を有することを決定するステップに基づいてもよい。例えば、プロセス400は、AST内のノードの第3のレベルに置かれるコードの一部が、サブ関数と見なされるべきであることを決定してもよい。別の実施例として、プロセス400は、明確に異なる機能的効果を有し、定義された範囲内でいくつかのコード行を有するコードの一部が、サブ関数と見なされるべきであることを決定してもよい。当然ながら、絶対的、可変的、相対的、統計的、および/または決定論的であり得る、基準の任意の組み合わせが、サブ関数を識別する(例えば、コードの部分の間の分割点を決定し、コードの一部をサブ関数として指定する)ために使用されてもよい。
【0136】
いくつかの実施形態では、1つまたはそれを上回る識別基準は、機械学習技法に従って等、経時的に更新されてもよい。例えば、ニューラルネットワーク等のモデルは、結果として生じる差分ファイル(例えば、ステップ414において発生される)のサイズが、最小限にされるように、サブ関数を識別するためのコードの部分の間に分割点を配置する場所を決定するための閾値を最適化するために使用するための識別基準を決定するように(例えば、再帰的プロセスを通して)訓練されてもよい。さらなる実施例として、モデルは、入力の組み合わせ(例えば、関数サイズ、AST構造、サブ関数識別基準等)および1つまたはそれを上回る結果として生じる差分ファイルを検証し、入力組み合わせと差分ファイルサイズとの間の関係(例えば、正の相関、負の相関等)を識別してもよい。
【0137】
ステップ412において、プロセス400は、複数のサブ関数のうちの少なくともいくつかへのサブ変更を決定してもよい。いくつかの実施形態では、サブ変更は、第2の関数への変更(例えば、その一部)と関連付けられてもよい。例えば、第2の関数への変更は、変更コードによって(例えば、変更コードの第1の関数によって)暗示されてもよい。いくつかの実施形態では、サブ関数のうちの少なくともいくつかへのサブ変更を決定するステップは、サブ変更と関連付けられる(例えば、その実装に関連する)サブ関数の第1のセットを決定するステップと、サブ変更と関連付けられない(例えば、その実装に関連しない)サブ関数の第2のセットを決定するステップとを含んでもよい。いくつかの実施形態では、サブ関数変更は、関数のコードの変更、変数の定義の変更、または変数の初期化の変更を含んでもよい。
【0138】
いくつかの実施形態では、サブ変更のうちの少なくとも1つを識別するステップは、変更コード、デバイスコード、および/またはバイナリコードのAST(例えば、コンパイルからもたらされる)を解析するステップを含む。いくつかの実施形態では、識別されたサブ関数のうちの少なくとも1つは、少なくとも1つの関数(例えば、第1および/または第2の関数)によってコールされる、内部サブ関数と関連付けられてもよい。加えて、または代替として、複数のサブ関数のうちの少なくともいくつかへのサブ変更を決定するステップは、変更コードのオブジェクトファイルまたは画像ファイルとデバイスコードのオブジェクトファイルまたは画像ファイルを比較するステップを含んでもよい。
【0139】
ステップ414において、プロセス400は、デバイスコードを現在実装し得る、デバイスに変更コードを実装するように構成され得る、差分ファイルを発生させてもよい。差分ファイルは、コードの2つの部分(例えば、変更コードおよびデバイスコード)の間の少なくとも1つの差分または差異を備えてもよい。いくつかの実施形態では、差分ファイルは、少なくとも1つの差分に加えて、デバイス(例えば、コントローラ)上に差分によって表される変更を実装するように構成され得る、構成コードを備えてもよい。いくつかの実施形態では、本デバイスは、構成コードの全てまたは一部を含んでもよい。
【0140】
いくつかの実施形態では、差分ファイルは、オブジェクト変更要素を備えるように発生されてもよく、オブジェクト変更要素は、デバイスコードへのサブ変更をもたらすように構成されてもよい。オブジェクト変更要素は、差分ファイルおよび/またはデバイスコードと関連付けられ得る(例えば、それに対応する)、オブジェクトファイル(例えば、バイナリファイル)への変更を表す、および/またはそれを実装するように構成される、命令、コード行、または任意の他のデータであってもよい。例えば、ループにおけるローカルインデックスが、コードの第1のバージョン(例えば、デバイスコード、すなわち、より古いコード)において「5」に初期化され、コードの第2のバージョン(例えば、変更コード、すなわち、より新しいコード)において、これが、「7」に初期化される場合、オブジェクト変更要素は、オブジェクトファイル(例えば、ループと関連付けられるオブジェクトファイル)へのローカルインデックスの変更をもたらすように発生および/または構成されてもよい。いくつかの実施形態では、各オブジェクトファイルは、コードのセット(例えば、ソフトウェア変更、差分ファイル、デバイスコード)内の異なるオブジェクト(例えば、関数、変数)と関連付けられてもよい。いくつかの実施形態では、リンカーが、複数のオブジェクトファイル(例えば、ソフトウェア変更ファイルと関連付けられる、差分ファイルと関連付けられる全てのオブジェクトファイル)を単一のファイル(例えば、バイナリファイル)にリンクさせてもよい。例えば、各オブジェクト変更要素は、サブ変更に対応してもよい。いくつかの実施形態では、オブジェクト変更要素のうちの少なくとも1つは、デバイスコードにおける第2の関数を変更するように構成されてもよい。いくつかの実施形態では、オブジェクト変更要素は、(上記に議論される)サブ関数の第1のセットに対応し、(同様に上記に議論される)サブ関数の第2のセットに対応しない場合がある。したがって、サブ変更を特定のサブ関数に局所化することによって、関数全体へのより大きい変更ではなく、差分ファイル(または他のタイプのファイル)へのより小さい変更が、表され、より小さい結果として生じるソフトウェア変更ファイル(例えば、差分ファイル)を可能にすることができる。例えば、上記のローカルインデックスおよびループ実施例を再び参照すると、ループが、以前にサブ関数に抽出された場合、ループに関するオブジェクトファイルは、関数全体のオブジェクトファイルではなく、ソフトウェア変更ファイルの中にもたらされ得る。
【0141】
いくつかの実施形態では、プロセス400はまた、デバイスに差分ファイルを伝送するステップを含んでもよい。例えば、プロセス400は、それに差分ファイルがソフトウェア変更(例えば、上記に議論されるように、関数変更、サブ変更等)をもたらすように構成されるデバイスに差分ファイルを伝送してもよい。いくつかの実施形態では、本デバイスは、自動車における電子制御ユニット(ECU)等のコントローラであってもよい。
【0142】
いくつかの実施形態では、プロセス400は、1つまたはそれを上回る決定に基づいて、差分ファイルを伝送してもよい。例えば、プロセス400は、コードの第1のバージョンを有し得る、遠隔デバイスまたはシステム(例えば、システム108c)が、遠隔デバイスまたはシステム上でコードの第2のバージョンを実装するために差分ファイルへのアクセス(例えば、ネットワークリソースにおいて等、ローカル記憶装置内)を有する別のデバイス(例えば、ソフトウェア分析デバイス102)との確立された接続を有することを決定してもよい。例えば、プロセス400は、差分ファイルと関連付けられるランタイムへの影響が閾値を下回ることを決定してもよく、決定されたランタイムへの影響が閾値を下回ることに基づいて、差分ファイルを伝送してもよい。加えて、または代替として、プロセス400は、伝送および/または受信デバイスに関する帯域幅、待ち時間、信号強度、記憶空間、バージョン互換性、または他の信頼性パラメータの少なくとも1つの信頼性基準が満たされていることを決定してもよく、信頼性基準が満たされることを決定することに基づいて、差分ファイルを伝送してもよい。
【0143】
このように、プロセス400は、ソフトウェア変更ファイルのサイズを低減させ得る。ソフトウェア変更によって暗示される局所化された変更のみを含み得る、差分ファイルを発生させることによって、画像ファイル等のより大きいソフトウェアファイルは、発生および/またはデバイスに伝送される必要はなく、差分ファイルを発生させるデバイスおよび差分ファイルを受信するデバイスの両方において、帯域幅およびコンピューティングリソースを節約し得る。関数への変更よりも少ない量のコードによって表され得る、サブ関数へのサブ変更を決定することによって、ソフトウェア変更ファイルのサイズは、低減され、したがって、帯域幅および他のコンピューティングリソースを節約し、かつより速い伝送および更新をもたらし得る。いくつかの実施形態では、プロセス300のステップは、効率をさらに改良するために、プロセス400に組み込まれてもよい(例えば、関数の再構成されたバージョンを用いて変更コードおよび/またはデバイスコードを更新する)。
【0144】
図5は、関数分析に基づいて、実行可能ファイルを更新するための例示的プロセス500のフローチャートを図示する。上記の実施形態によると、プロセス500は、
図1に描写されるシステムアーキテクチャ10または任意のタイプのIoTネットワーク環境において実装されてもよい。例えば、プロセス500は、プロセッサ(例えば、プロセッサ124)および/または他のコンポーネント(例えば、ネットワークリソース104c)によって、または任意のコンピューティングデバイスまたはIoTシステムによって実施されてもよい。
【0145】
ステップ502において、プロセス500は、複数の関数を有し得る、実行可能ファイルを識別してもよい。いくつかの実施形態では、実行可能ファイルは、個別のシンボルに対応し得る、複数のオブジェクトファイルを含んでもよい。実行可能ファイルは、C、MISRA-C、C#、C+、C++、PHP、Java(登録商標)、JavaScript(登録商標)、またはPython等の1つまたはそれを上回るプログラミング言語において書き込まれてもよい。実行可能ファイルが、プロセス500において説明されるが、本タイプのファイルは、例示的にすぎず、未コンパイルコードのファイル等の他のタイプのファイルもまた、プロセス500に従って使用されてもよい。
【0146】
ステップ504において、プロセス500は、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定してもよい。共通ブロックは、比較の2つの対象(例えば、関数)の間で意味論的に、および/または実質的に、類似する(例えば、閾値内で)または同じであるブロックであってもよい。ブロックは、1つまたはそれを上回る動作、命令、コマンド、テキストの文字列、コール、インデント、空白の部分、コード行、またはコードの任意のセグメント(例えば、関数内のコードセグメント)を含んでもよい。例えば、共通ブロックは、以下の例示的シナリオにおいて見出され得る。
A.厳密なクローン-第1および第2の関数の間のブロックは、コメント、レイアウト、および/または空白の変更を除いて、同じコードセグメントである、
B.リネーミングされたクローン-第1および第2の関数の間のブロックは、コメント、識別子、タイプ、リテラル、および/またはレイアウトの変更以外、構文的または構造的に類似する、
C.「ニアミス」クローン-第1の関数のコピーされた断片が、第2の関数内に存在する場合等、第1および第2の関数の間のブロックは、ある程度の重複を有するが、文の追加または除去、および、空白、識別子、レイアウト、コメント、およびタイプの変更等の修正を伴い、但し、関数の機能的結果は、類似する、
D.意味論的クローン-第1および第2の関数は、機能的に類似するが、異なる構文変形によって実装されるブロックを有する。
【0147】
プロセス500は、第1および/または第2の関数の形式的、構造的、および/または機能的特色を検証すること等、1つまたはそれを上回るステップを通して、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定してもよい。例えば、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップは、共通ブロックと関連付けられる(例えば、それとのデータ連携を有する)識別子を決定するステップを含んでもよい。本実施例をさらに進めると、識別子は、文字の組み合わせ(例えば、方法名、式名等)を備えてもよい。加えて、または代替として、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップは、第1および第2の関数がそれぞれ、共通のコマンドまたは共通のコマンドのシーケンスを備えることを決定するステップを含んでもよい。加えて、または代替として、プロセス500は、実行可能ファイルまたは実行可能ファイルを表すコード構造を解析する(およびいくつかの実施形態では、それから情報を抽出する)ことによって、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定してもよい。上記に議論されるように、コード構造は、ASTまたは他のコード表現または抽象化を備えてもよい。いくつかの実施形態では、プロセス500は、第1および/または第2の関数からのコードとデータベースまたは他の記憶媒体内に維持されるコードの一部を比較することによって、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定してもよい。
【0148】
第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップは、複数のコード部分が同一の関数の一部であること、複数のコード部分が同一のシンボルをコールすること、共通のシンボル関係等を決定するステップを含んでもよい。コード部分は、1つまたはそれを上回るシンボルおよび/またはコード行を含んでもよい。シンボルは、変数、バッファ、関数、コール、オブジェクト、文(例えば、制御フロー文)、識別子(例えば、メモリ場所識別子)、デバイス、コマンド、またはコードの区別可能なセグメントのうちのいずれかである、またはそれを表してもよい。用語「コード行」は、必ずしも文字通りのコード行に限定されず、また、コード行の代わりに、またはそれに加えて、抽象コード表現、コンパイル済みコード、未コンパイルコード、ソフトウェアパッケージ(例えば、ソフトウェア更新のため)、命令セット、および/またはそのコンテンツ、構造、または機能が(例えば、本明細書に議論される方法に従って)分析および/または構成され得る任意のソフトウェアを含んでもよい。
【0149】
いくつかの実施形態では、第1および第2の関数がそれぞれ、共通ブロックを備えることを決定するステップは、共通の動作によって引き起こされる(例えば、関連付けられるデバイスまたはシステムの動作に)類似する効果を決定するステップを含んでもよい。いくつかの実施形態では、類似する効果を決定するステップは、第1および/または第2の関数(または関連付けられるブロック、サブ関数等)に対して、静的または動的分析のうちの少なくとも1つを実施するステップを含んでもよい。例えば、プロセス500は、決定論的または確率論的プロセスを使用することによって等、アクセスされたメモリアドレス、実行時間、実行のシーケンス、アクセスされた変数、コールされた関数、リソース使用量、および同等物の組み合わせを分析してもよい。静的および/または動的分析は、第1および/または第2の関数(または関連付けられるブロック、サブ関数等)、およびデバイス(例えば、第1の関数、第2の関数、および/または関連付けられるブロックまたはサブ関数を実装することが可能なコントローラ)の既知の動作特性を使用して、実施されてもよい。いくつかの実施形態では、共通の動作は、機械学習モデルに従って識別されてもよい。例えば、完全教師あり、部分教師あり、または完全教師なしモデルが、コードのある組み合わせおよび/またはコードの部分の間の相互作用に基づいて、ある機能的効果を識別するように経時的に訓練されてもよい。例えば、機械学習モデル(例えば、ニューラルネットワーク)は、意味論的意味におけるコード類似性を識別する(例えば、機能的に同じ、またはほぼ同じ挙動を有するコードの形式的に異なる断片を識別する)ように構成されてもよい。例えば、機械学習モデルは、言語的に異なるように見えるコードの2つの断片(例えば、ソートアルゴリズムQuick SortおよびMerge Sort)を受信してもよく、コードの2つの断片の算出挙動を分析する(例えば、厳密に同一の出力をもたらす)ことに基づいて、コードの2つの断片が、意味論的に類似し、機能的に同じである(またはほぼ同じである)ことを決定してもよい。
【0150】
ステップ506において、プロセス500は、共通ブロックを実施するように構成される、第3の関数を識別してもよい。いくつかの実施形態では、第3の関数を識別するステップは、第3の関数を発生させる、および/またはそれに(例えば、ローカルまたは遠隔記憶装置から)アクセスするステップを含んでもよい。いくつかの実施形態では、第3の関数は、第1および第2の関数の構造および/またはコンテンツに基づいて発生されてもよい。例えば、第1および第2の関数は両方とも、(上記に議論されるような)関数、動作、コール、コマンドのシーケンス等の共通ブロックを含んでもよい。本実施例を継続すると、第3の関数は、第1および第2の関数の同一の共通ブロックを含む(例えば、実装する)ように発生されてもよい。2つのブロックは、それらが、同一の構造、構文、機能的効果、文字のシーケンス、または同等物を共有する場合、共通と見なされてもよい。いくつかの実施形態では、第3の関数を発生させるステップは、新しいシンボルを発生させるステップを含んでもよい。例えば、第3の関数は、第1および第2の関数におけるブロックの繰り返し挙動(例えば、動作)に基づくループを含んでもよく、プロセス500は、ループに関する「loopmax」変数を発生させてもよい。
【0151】
ステップ508において、プロセス500は、第1および第2の関数を変更してもよく、これは、共通の動作および第3の関数に基づいてもよい。いくつかの実施形態では、プロセス500は、第1または第2の関数のうちの少なくとも1つから共通の動作を除去し、第1または第2の関数のうちの少なくとも1つの中に第3の関数(共通の動作を含み得る)へのコールを挿入することによって、第1および第2の関数を変更してもよい。
【0152】
ステップ510において、プロセス500は、実行可能ファイルを更新してもよい。いくつかの実施形態では、プロセス500は、実行可能ファイルにおいて、第1または第2の関数のうちの少なくとも1つを更新された第1または第2の関数のうちの少なくとも1つと置換し、第3の関数を実行可能ファイルに追加することによって、実行可能ファイルを更新してもよい。いくつかの実施形態では、実行可能ファイルは、更新に先立ってコントローラ上で実行されるように構成されるか、または更新の後にコントローラ上で実行されるように構成されるかのうちの少なくとも1つであってもよい。更新された実行可能ファイルは、C、MISRA-C、C#、C+、C++、PHP、Java(登録商標)、JavaScript(登録商標)、またはPython等の1つまたはそれを上回るプログラミング言語において書き込まれてもよい。いくつかの実施形態では、プロセス500は、更新された実行可能ファイルの完全性を確認するための少なくとも1つの動作を実施してもよい。例えば、プロセス500は、更新された実行可能ファイルが更新されていない実行可能ファイルの機能的同等物であるかどうかを決定するために、更新されていない実行可能ファイルに対する更新された実行可能ファイルの分析を実施してもよい。いくつかの実施形態では、更新された実行可能ファイルの分析は、更新された実行可能ファイルおよび/または更新されていない実行可能ファイルに関して、実行経路、アクセスされたメモリ場所、実行時間、相互作用されたデバイスまたはコード、リソース使用量、動作頻度、または機能的差異および/または同等性を決定するために使用され得る任意の他のコード属性のうちの少なくとも1つを比較および/または分析するステップを含み得る、静的または動的プロセスを含んでもよい。
【0153】
図6は、プロセス500に従って等、共通コード部分に基づく関数の再構成の非限定的例示的視覚表現を描写する。
図6に見られるように、関数600a、関数602a、および604aはそれぞれ、コード部分606(例えば、共通の動作)を含んでもよい(例えば、それを実装するように構成される)。コード部分は、実行のために構成される場合とそうではない場合がある、コンピューティングコードの量である、またはそれを表してもよい。例えば、コード部分は、変数、バッファ、関数、コール、オブジェクト、文(例えば、case文)、識別子(例えば、メモリ場所識別子)、コンパイル済みコード、未コンパイルコード、ソフトウェアパッケージ(例えば、ソフトウェア更新のため)、命令セット、または確認可能な意味を伴うコードの任意の他のセグメントである、またはそれを表し得る、コードシンボルであってもよい。
【0154】
図6に示されるように、関数600aは、関数600bに再構成されてもよく、関数602aは、関数602bに再構成されてもよく、関数604aは、関数604bに再構成されてもよい。関数600b、602b、および604bは、コード部分606を含まない場合がある(例えば、それを実装するように構成されない)。しかしながら、サブ関数608は、コード部分606を含んでもよい(例えば、それを実装するように構成される)。
図6に示されるように、関数600b、602b、および604bは、(関数600b、602b、および604bにおけるコードのラインをサブ関数608に接続する破線によって示されるように)サブ関数608をコールするように構成されてもよい。
【0155】
図7は、シンボル共通性および分岐を識別するための例示的プロセス700のフローチャートを図示する。上記の実施形態によると、プロセス700は、
図1に描写されるシステムアーキテクチャ10または任意のタイプのIoTネットワーク環境において実装されてもよい。例えば、プロセス700は、プロセッサ(例えば、プロセッサ124)および/または他のコンポーネント(例えば、ネットワークリソース104c)によって、または任意のコンピューティングデバイスまたはIoTシステムによって実施されてもよい。シンボルの間の共通性および分岐を識別することによって、プロセス700は、分岐を反映するためにコードに必要とされるより小さい変更の程度を決定してもよく、これは、より速いコード更新、より小さいファイルサイズ、およびより少ないコンピュータリソース使用量をもたらし得る。
【0156】
ステップ702において、プロセス700は、ソフトウェアの第1のバージョンと関連付けられる(例えば、その中に含有される、またはその中に表される)第1のシンボルにアクセスしてもよい。シンボルは、
図2に関して上記に議論されるシンボルの任意の特性を共有してもよい。例えば、シンボルは、関数を表してもよい。第1のシンボルにアクセスするステップは、C、MISRA-C、C#、C+、C++、PHP、Java(登録商標)、JavaScript(登録商標)、またはPython等の1つまたはそれを上回るプログラミング言語において書き込まれ得る、ソフトウェア変更ファイル、画像ファイル、または第1のバージョンを表す他のソフトウェアにアクセスするステップを含んでもよい。いくつかの実施形態では、プロセス700は、非位置独立コードを位置独立コードに変換してもよく、位置独立コードから第1のシンボルにアクセスしてもよい。いくつかの実施形態では、プロセス700はまた、シンボル(例えば、位置独立コードテーブル内の位置)と関連付けられる(例えば、それを記憶する)メモリ場所への参照として(例えば、ソフトウェアファイル内の)シンボルを表してもよい。
【0157】
ステップ704において、プロセス700は、ソフトウェアの第2のバージョンと関連付けられる第2のシンボルにアクセスしてもよい。いくつかの実施形態では、ソフトウェアの第2のバージョンは、C、MISRA-C、C#、C+、C++、PHP、Java(登録商標)、JavaScript(登録商標)、またはPython等の1つまたはそれを上回るプログラミング言語において書き込まれ得る、ソフトウェア変更ファイルまたは他のソフトウェアファイルによって表されてもよい。例えば、ソフトウェア変更ファイルは、ソフトウェアの第2のバージョンを実装する(例えば、デバイス上のソフトウェアを第1のバージョンから第2のバージョンに更新する)ように構成されてもよい。いくつかの実施形態では、ソフトウェア変更ファイルは、(上記に議論される)差分ファイルであってもよい。例えば、ソフトウェア変更ファイルは、ソフトウェアの第1および第2のバージョンの間の変更を表す、1つまたはそれを上回る差分を有する、差分ファイルであってもよい。いくつかの実施形態では、プロセス700は、非位置独立コードを位置独立コードに変換してもよく、位置独立コードから第2のシンボルにアクセスしてもよい。上記に言及されるように、プロセス700はまた、シンボルと関連付けられるメモリ場所への参照として(例えば、ソフトウェアファイル内の)シンボルを表してもよい。
【0158】
ステップ706において、プロセス700は、第1のシンボルと第2のシンボルを比較してもよい。第1のシンボルと第2のシンボルを比較するステップは、テキスト比較、構造比較、動作比較、統計比較、および/または機能比較を含んでもよい。例えば、第1のシンボルと第2のシンボルを比較するステップは、第1のシンボルと関連付けられる第1のファイル名と第2のシンボルと関連付けられる第2のファイル名を比較するステップを含んでもよい。別の実施例として、第1のシンボルと第2のシンボルを比較するステップは、第1のシンボルの第1のシンボル名と第2のシンボルの第2のシンボル名を比較するステップを含んでもよい。
【0159】
加えて、または代替として、第1のシンボルと第2のシンボルを比較するステップは、第1のシンボルの第1のコールグラフと第2のシンボルの第2のコールグラフを比較するステップを含んでもよい。いくつかの実施形態では、プロセス700は、第1のコールグラフおよび/または第2のコールグラフを発生させてもよい。プロセス700はまた、記憶デバイスからコールグラフにアクセスする、または遠隔デバイスからコールグラフを受信することによって等、第1のコールグラフおよび/または第2のコールグラフにアクセスしてもよい。プロセス700はまた、異なるコールグラフの一部を比較してもよく、これは、コールグラフの部分の間の境界を決定するステップを含んでもよい。加えて、または代替として、プロセス700は、第1および第2のシンボルの使用を表すASTを比較してもよい。
【0160】
加えて、または代替として、第1のシンボルと第2のシンボルを比較するステップは、第1および/または第2のシンボルと関連付けられる実行コンテキストを比較するステップを含んでもよい。例えば、プロセス700は、1つの関数(例えば、第1のシンボル)の実行の前および/または後に実施される動作の第1のグループと、別の関数(例えば、第2のシンボル)の実行の前および/または後に実施される動作の第2のグループを比較してもよい。加えて、または代替として、第1のシンボルと第2のシンボルを比較するステップは、第1のシンボルと関連付けられるコールの第1のシーケンスと第2のシンボルと関連付けられるコールの第2のシーケンスを比較するステップを含んでもよい。当然ながら、他の機能比較も、想定される。例えば、プロセス700は、静的または動的分析を使用して、第1および第2のシンボルの機能プロファイルを決定してもよく、機能プロファイルを比較してもよい。
【0161】
ステップ708において、プロセス700は、第2のシンボルが第1のシンボルの機能的同等物であるかどうかを決定してもよい。決定は、比較に基づいてもよい。例えば、プロセス700は、(例えば、ステップ706における比較に基づいて)第1のファイル名が第2のファイル名に合致し、第1のシンボル名が第2のシンボル名に合致するとき、第2のシンボルが第1のシンボルの機能的同等物であることを決定してもよい。加えて、または代替として、プロセス700は、第1のコールグラフが第2のコールグラフに合致するとき、第2のシンボルが第1のシンボルの機能的同等物であることを決定してもよい。加えて、または代替として、プロセス700は、第1のシーケンスが第2のシーケンス(例えば、コールのシーケンス、動作等)に合致するとき、第2のシンボルが第1のシンボルの機能的同等物であることを決定してもよい。加えて、または代替として、プロセス700は、第2のシンボルの機能プロファイルが第1のシンボルの機能プロファイルに合致するとき、第2のシンボルが第1のシンボルの機能的同等物であることを決定してもよい。「合致」は、同じ合致または閾値内の合致を指し得る。例えば、実行時間の1ミリ秒の差異を除いて、同一の機能プロファイルを伴う2つのシンボルは、依然として合致すると見なされてもよい。
【0162】
ステップ710において、プロセス700は、第2のシンボルが第1のシンボルの機能的同等物であるかどうかに基づいて、指定アクションを実施してもよい。指定アクションは、シンボルの識別子を標識と(例えば、テーブル内で)関連付けるステップ、シンボルを類似するシンボル(例えば、同一の指定を伴うシンボル)のグループに配置するステップ、メタデータをシンボルと関連付けるステップ、および/または可能性としてシンボルが別のシンボルといかなる関係も有していないことを示すことを含む、シンボルが別のシンボルに関連する(例えば、その機能的同等物である)ことを示すための任意の動作を実施するステップを伴ってもよい。いくつかの実施形態では、指定アクションを実施するステップは、第2のシンボルが第1のシンボルの機能的同等物である場合、第2のシンボルを第1のシンボルとの合致として指定するステップを含んでもよい。加えて、または代替として、指定アクションを実施するステップは、第2のシンボルが第1のシンボルの機能的同等物ではない場合、第1または第2のシンボルのうちの少なくとも1つを新規または削除のいずれかとして指定するステップを含んでもよい。例えば、第1のシンボル(例えば、コードのより古いバージョンと関連付けられる)は、削除として指定されてもよく、第2のシンボル(例えば、コードのより新しいバージョンと関連付けられる)は、新規として指定されてもよい。いくつかの実施形態では、プロセス700は、第2のシンボルが第1のシンボルの機能的同等物である、またはそうではないことを決定することに基づいて、付加的アクションを実施してもよい。例えば、プロセス700は、第2のシンボルが第1のシンボルの機能的同等物ではないとして指定される場合、ステップ712に進んでもよい。プロセス700はまた、第2のシンボルが第1のシンボルの機能的同等物として指定される場合、ステップ714、716、および718のうちのいずれか1つまたは組み合わせに進んでもよい。当然ながら、1つまたはそれを上回る第1のシンボルは、1つまたはそれを上回る第2のシンボルと比較されてもよく、いくつかの比較は、合致(例えば、機能的同等物)の指定をもたらし得、いくつかの比較は、不一致(例えば、機能的同等物ではない)の指定をもたらし得る。「合致」を有するシンボルを決定し、「合致」を有していないシンボル(例えば、ソフトウェアのバージョンに対して「新規」であるシンボル)を決定することによって、プロセス700は、実施する(例えば、コード変更を実装する)動作の数を低減させてもよい。いくつかの実施形態では、シンボル合致は、1対1であってもよい(例えば、コードの第2のバージョンと関連付けられるシンボルは、コードの第1のバージョンと関連付けられる1つのシンボルとのみ合致される、または合致可能であってもよい)。
【0163】
ステップ712において、プロセス700は、コードに第2のシンボルを組み込んでもよい。例えば、プロセス700は、第2のシンボルを使用して、ソフトウェアの第1のバージョンをソフトウェアの第2のバージョンに更新してもよい。ソフトウェアの第1のバージョンを第2のバージョンに更新するステップは、新しいコードを挿入するステップ、コードを削除するステップ、コードの部分の間の接続を行うステップ、コードの部分の間の接続を切断するステップ、コードをアンコンパイルするステップ、および/またはコードをコンパイルするステップを含んでもよい。例えば、プロセス700は、第2のシンボルと関連付けられるコードをソフトウェアの第1のバージョンに追加し、ソフトウェアの第1のバージョンをファイル(例えば、差分ファイル、ソフトウェア更新ファイル、画像ファイル等)に再コンパイルしてもよく、これは、ソフトウェアの第2のバージョンを表してもよく、C、MISRA-C、C#、C+、C++、PHP、Java(登録商標)、JavaScript(登録商標)、またはPython等の1つまたはそれを上回るプログラミング言語において書き込まれてもよい。いくつかの実施形態では、プロセス700は、第2のシンボルと、位置独立コードテーブル内のシンボル指定および/またはメモリ場所等の他の情報との間の関連付けを作成してもよい。いくつかの実施形態では、位置独立コードテーブルは、インデックス付きアドレス(例えば、関数または他のコードセグメントと関連付けられるアドレス)等のインデックス付き情報を含んでもよい。実施例として、「PIT[345]」のインデックスインジケータは、関数「Func1」と関連付けられるアドレスを記憶する、位置独立コードテーブル内の場所と関連付けられてもよい。これは、「Func1」への間接的参照を可能にし得る。例えば、「X=PIT[345]()+7」が、「X=Func1()+7」と同一の効果を遂行するために書き込まれてもよい。
【0164】
ステップ714において、プロセス700は、アラートを提供してもよい。アラートを提供するステップは、メッセージを伝送するステップ、グラフィカルユーザインターフェース(GUI)プロンプトを(例えば、I/O126の一部であるディスプレイにおいて)発生させるステップ、デバイスに可聴音を発行させるステップ、ディスプレイに表示される情報を変更させるステップ、デバイスを振動させるステップ、または情報(例えば、ステップ708において行われた決定を示す情報)のインジケーションを生成する、またはそれを利用可能にするステップ等を含んでもよい。いくつかの実施形態では、プロセス700は、アラートをソフトウェア分析デバイス102等のローカルデバイス(例えば、プロセス700を実装するデバイス)に、または遠隔システム103等の遠隔システムまたはデバイス(例えば、プロセス700を実装するデバイスから遠隔のデバイス)に提供してもよい。例えば、プロセス700は、ディスプレイに、1つのシンボルが別のシンボルの機能的同等物であるかどうかの視覚的インジケータを示させる命令を伝送してもよい。
【0165】
ステップ716において、プロセス700は、リネーミング動作を実施してもよい。いくつかの実施形態では、プロセス700は、ファイル名、プログラム、シンボル、メモリ場所、または同等物をリネームしてもよい。例えば、プロセス700は、ソフトウェア変更ファイルをリネームする、および/またはソフトウェア変更ファイル内にあり得る、第2のシンボルをリネームしてもよい。いくつかの実施形態では、プロセス700は、位置独立テーブル内に記憶され得る、シンボル識別子または他のシンボル情報をリネームしてもよい。いくつかの実施形態では、プロセス700は、第2のシンボルの名称に合致するように第1のシンボルをリネームしてもよい、または逆もまた同様である。いくつかの実施形態では、第1のシンボルと同一の機能的効果、コンテンツ等を有する第2のシンボルの名称に合致するように第1のシンボルをリネームするステップは、ソフトウェア変更、ソフトウェアサイズ(例えば、バイト単位で表される)、コンパイルの量、再コンパイルの量等を低減させてもよい。
【0166】
ステップ718において、プロセス700は、コードを変更してもよい。いくつかの実施形態では、プロセス700は、ソフトウェアの第1および/または第2のバージョンと関連付けられるコードを変更してもよい。例えば、プロセス700は、ソフトウェア変更ファイル内のコードを変更してもよい。いくつかの実施形態では、プロセス700は、ソフトウェア変更ファイルから第2のシンボルと関連付けられるコードの一部を除去することによって、コードを変更してもよい。
【0167】
いくつかの実施形態では、第1のシンボルと第2のシンボルを比較するステップは、増加する算出強度の複数の比較を実施するステップを含んでもよく、これは、シンボル合致が、より迅速に、かつ処理リソースに対するより少ない負担を伴って決定されることを可能にし得る。例えば、テキスト比較を実施するステップは、機能比較よりも迅速に実施され得る。いくつかの実施形態では、プロセス700は、最初に、シンボルのセットに対するあまり算出的に関与しない比較を実施し、シンボルの第2のサブセットと合致するシンボルの第1のサブセットを決定し、次いで、他のサブセット(例えば、第1または第2のサブセット内にない残りのシンボル)を伴うより算出的に関与する比較を適用してもよい。開示される実施形態と一致して、プロセス700は、ソフトウェアの第1のバージョンと関連付けられる第1のシンボルにアクセスしてもよい。プロセス700はまた、ソフトウェアの第2のバージョンと関連付けられる1つまたはそれを上回る第2のシンボルにアクセスしてもよい。1つまたはそれを上回る第1および第2のシンボルにアクセスするステップは、ステップ702および704に関して等、上記に議論される側面を含んでもよい。
【0168】
いくつかの実施形態では、プロセス700は、第1および第2のシンボルの間で第1の比較を実施し、名称が合致する、および名称が合致しない第1および第2のシンボルを決定してもよい。いくつかの実施形態では、第1の比較は、第1および第2のシンボルの文字の間の比較を備えてもよい。プロセス700はまた、名称が合致しない第1および第2のシンボルの間の第2の比較を実施し、コールグラフが合致する、およびコールグラフが合致しない第1および第2のシンボルを決定してもよい。いくつかの実施形態では、第2の比較は、第1および第2のシンボルのコールグラフの間の比較を備えてもよい。プロセス700はまた、コールグラフが合致しない第1および第2のシンボルの間の第3の比較を実施し、コールシーケンスが合致する、およびコールシーケンスが合致しない第1および第2のシンボルを決定してもよい。いくつかの実施形態では、第3の比較は、第1および第2のシンボルのコールシーケンスの間の比較を備えてもよい。いくつかの実施形態では、プロセス700は、第1および第2のシンボルの間の他の比較を実施してもよく、これは、コード形態、コード構造、コード関数の側面、および
図7(例えば、ステップ706および708)に関して上記に議論される任意の他の側面を比較するステップを伴ってもよい。
【0169】
いくつかの実施形態では、プロセス700は、第1、第2、および第3の比較に基づいて、ソフトウェアの第2のバージョンを表すコードを再編成してもよい。コードを再編成するステップは、ステップ712、714、716、および/または718に関して上記に議論される側面を含んでもよい。例えば、プロセス700は、第1の比較に基づいて、コードに第2のシンボルの第1の部分を組み込む、第2の比較に基づいて、コードに第2のシンボルの第2の部分を組み込む、および/または第3の比較に基づいて、コードに第2のシンボルの第3の部分を組み込んでもよい。
【0170】
開示される実施形態が、必ずしも、それらの用途において、以下の説明に記載される、および/または図面および/または実施例に図示される、コンポーネントおよび/または方法の構造および配列の詳細に限定されないことを理解されたい。開示される実施形態は、変形例が可能である、または種々の方法において実践または実行されることが可能である。例えば、異なるプロセスに関して議論される側面は、別のプロセスを形成するために組み合わせられてもよい。一実施例として、コードは、プロセス200に従って再構成され、次いで、(例えば、プロセス400に従って)差分ファイルを縮小する、または(例えば、プロセス500に従って)実行可能ファイルを縮小するために使用されてもよい。また別の実施例として、シンボルは、プロセス700に従って合致されてもよく、これは、(例えば、プロセス200、400、および/または500に従って)構成または再構成に関するコードの量を低減させてもよい。また、いくつかの側面は、例えば、関数、サブ関数、または変数に関して議論され得るが、これらが、(上記に議論される)任意のシンボルまたはコードのブロックに等しく適用され得ることを完全に理解されたい。
【0171】
別の実施例として、いくつかの実施形態は、電子コントローラユニット(ECU)および車両を伴う文脈において議論されるが、これらの要素は、各実施形態に存在する必要はない。車両通信システムが、いくつかの実施形態では、議論されるが、任意の種類のコントローラを有する、他の電子システム(例えば、IoTシステム)もまた、開示される実施形態内で動作してもよい。そのような変形例は、完全に、説明される実施形態の範囲および精神内である。同様に、本明細書に議論される任意のコードおよび/またはコードの表現は、特定のタイプのコントローラを含む、コントローラと関連付けられてもよい(例えば、その上で実行されるように構成される)。
【0172】
開示される実施形態は、システム、方法、および/またはコンピュータプログラム製品において実装されてもよい。コンピュータプログラム製品は、プロセッサに本開示の側面を実行させるためのコンピュータ可読プログラム命令をその上に有する、コンピュータ可読記憶媒体(または複数の媒体)を含んでもよい。
【0173】
コンピュータ可読記憶媒体は、命令実行デバイスによる使用のための命令を留保および記憶し得る、有形デバイスであり得る。コンピュータ可読記憶媒体は、例えば、限定ではないが、電子記憶デバイス、磁気記憶デバイス、光学記憶デバイス、電磁記憶デバイス、半導体記憶デバイス、または前述の任意の好適な組み合わせであってもよい。コンピュータ可読記憶媒体のより具体的実施例の非包括的リストは、以下、すなわち、ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリ(RAM)、読取専用メモリ(ROM)、消去可能プログラマブル読取専用メモリ(EPROMまたはフラッシュメモリ)、スタティックランダムアクセスメモリ(SRAM)、ポータブルコンパクトディスク読取専用メモリ(CD-ROM)、デジタル多用途ディスク(DVD)、メモリスティック、フロッピー(登録商標)ディスク、その上に記録される命令を有する、パンチカードまたは溝内の隆起された構造等の機械的にエンコーディングされたデバイス、および前述の任意の好適な組み合わせを含む。コンピュータ可読記憶媒体は、本明細書で使用されるように、それ自体は、電波または他の自由伝搬電磁波、導波管または他の伝送媒体を通して伝搬する電磁波(例えば、光ファイバケーブルを通して通過する、光パルス)、またはワイヤを通して伝送される、電気信号等の一過性信号であるとして解釈されるものではない。
【0174】
本明細書に説明されるコンピュータ可読プログラム命令は、コンピュータ可読記憶媒体または外部コンピュータまたは外部記憶デバイスから、ネットワーク、例えば、インターネット、ローカルエリアネットワーク、広域ネットワーク、および/または無線ネットワークを介して、個別のコンピューティング/処理デバイスにダウンロードされることができる。ネットワークは、銅伝送ケーブル、光学伝送ファイバ、無線伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイコンピュータ、および/またはエッジサーバを備えてもよい。各コンピューティング/処理デバイス内のネットワークアダプタカードまたはネットワークインターフェースは、コンピュータ可読プログラム命令をネットワークから受信し、個別のコンピューティング/処理デバイス内のコンピュータ可読記憶媒体の中への記憶のために、コンピュータ可読プログラム命令を転送する。
【0175】
本開示の動作を実行するためのコンピュータ可読プログラム命令は、アセンブラ命令、命令セットアーキテクチャ(ISA)命令、機械命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、または上記に言及されるもの等、および低レベルアセンブリ言語、Smalltalk、C++、または同等物等のオブジェクト指向プログラミング言語、および従来の手続型プログラミング言語を含む、1つまたはそれを上回るプログラミング言語の任意の組み合わせにおいて書き込まれる、ソースコードまたはオブジェクトコードのいずれかであってもよい。コンピュータ可読プログラム命令は、完全に、ユーザのコンピュータ上で、部分的に、ユーザのコンピュータ上で、独立型ソフトウェアパッケージとして、部分的に、ユーザのコンピュータ上で、かつ部分的に、遠隔コンピュータ上で、または完全に、遠隔コンピュータまたはサーバ上で実行されてもよい。後者のシナリオでは、遠隔コンピュータは、ローカルエリアネットワーク(LAN)または広域ネットワーク(WAN)を含む、任意のタイプのネットワークを通して、ユーザのコンピュータに接続されてもよい、または接続は、外部コンピュータに対して行われてもよい(例えば、インターネットサービスプロバイダを使用して、インターネットを通して)。いくつかの実施形態では、例えば、プログラマブル論理回路網、フィールドプログラマブルゲートアレイ(FPGA)、またはプログラマブル論理アレイ(PLA)を含む、電子回路網は、本開示の側面を実施するために、コンピュータ可読プログラム命令の状態情報を利用して、電子回路網を個人化することによって、コンピュータ可読プログラム命令を実行してもよい。
【0176】
本開示の側面は、本開示の実施形態による、方法、装置(システム)、およびコンピュータプログラム製品のフローチャート図および/またはブロック図を参照して本明細書に説明される。フローチャート図および/またはブロック図の各ブロックおよびフローチャート図および/またはブロック図内のブロックの組み合わせが、コンピュータ可読プログラム命令によって実装され得ることを理解されたい。また、ステップおよび/またはブロックの特定のセットおよび順序が、示され得るが、ステップおよび/またはブロックは、ステップおよび/またはブロックを再順序付けする、挿入する、繰り返す、削除する、または(さらに異なるプロセスから)組み合わせることによって等、任意の様式で修正されることができる。
【0177】
これらのコンピュータ可読プログラム命令は、汎用コンピュータ、特殊目的コンピュータ、または他のプログラマブルデータ処理装置のプロセッサに提供され、コンピュータまたは他のプログラマブルデータ処理装置のプロセッサを介して実行される、命令が、フローチャートおよび/またはブロック図のブロックまたは複数のブロック内に規定された機能/行為を実装するための手段を作成するように、機械を生成してもよい。これらのコンピュータ可読プログラム命令はまた、その中に記憶される命令を有する、コンピュータ可読記憶媒体が、フローチャートおよび/またはブロック図のブロックまたは複数のブロック内に規定された機能/行為の側面を実装する、命令を含む、製造品を備えるように、コンピュータ、プログラマブルデータ処理装置、および/または他のデバイスに、特定の様式において機能するように指示し得る、コンピュータ可読記憶媒体内に記憶されてもよい。
【0178】
コンピュータ可読プログラム命令はまた、コンピュータ、他のプログラマブル装置、または他のデバイス上で実行される、命令が、フローチャートおよび/またはブロック図のブロックまたは複数のブロック内に規定された機能/行為を実装するように、コンピュータ、他のプログラマブルデータ処理装置、または他のデバイス上にロードされ、一連の動作ステップをコンピュータ、他のプログラマブル装置、または他のデバイス上で実施させ、コンピュータ実装プロセスを生成してもよい。
【0179】
図内のフローチャートおよびブロック図は、本開示の種々の実施形態による、システム、方法、およびコンピュータプログラム製品の可能性として考えられる実装のアーキテクチャ、機能性、および動作を図示する。この点で、フローチャートまたはブロック図内の各ブロックは、ソフトウェアプログラム、セグメント、またはコードの一部を表し得、これは、規定された論理機能を実装するための1つまたはそれを上回る実行可能命令を備える。また、いくつかの代替実装では、ブロック内に記述される機能が、図に記述される順序以外で生じ得ることに留意されたい。例えば、連続して示される2つのブロックは、実際には、実質的に並行して実行されてもよい、またはブロックは、関与する機能性に応じて、時として、逆順で実行されてもよい。また、いくつかのブロックは、繰り返し(例えば、1つまたは複数のプロセスの一部として)実行されてもよく、いくつかのブロックは、全く実行されなくてもよい。また、ブロック図および/またはフローチャート図の各ブロックおよびブロック図および/またはフローチャート図内のブロックの組み合わせが、規定された機能または行為または特殊目的ハードウェアおよびコンピュータ命令の組み合わせを実施する、特殊目的ハードウェアベースのシステムによって実装され得ることに留意されたい。いくつかの実施形態では、異なるプロセスの側面が、組み合わせられてもよい。例えば、複雑さの閾値は、プロセス200に対して議論される側面に従って、プロセス300において決定されてもよい。別の実施例として、ファイルは、プロセス200、400、500、および700の任意の組み合わせに従って更新されてもよく、これは、改良された結果(例えば、さらにより小さいファイルサイズ)をもたらし得る。
【0180】
本開示の種々の実施形態の説明は、例証目的のために提示されているが、包括的であること、または開示される実施形態に限定されることを意図するものではない。多くの修正および変形例が、説明される実施形態の範囲および精神から逸脱することなく、当業者に明白となるであろう。本明細書で使用される専門用語は、実施形態の原理、実践的用途、または市場に見出される技術に優る技術的改良を最良に解説し、当業者が本明細書に開示される実施形態を理解することを可能にするように選定されている。
【0181】
本願からの特許権が満了するまでの存続期間の間、多くの関連仮想化プラットフォーム、仮想化プラットフォーム環境、信頼されたクラウドプラットフォームリソース、クラウドベースのアセット、プロトコル、通信ネットワーク、セキュリティトークン、および認証証明書が、開発されるであろうことが予期され、これらの用語の範囲は、全てのそのような新しい技術を先験的に含むように意図される。
【0182】
明確にするために別個の実施形態の文脈において説明される、本開示のある特徴がまた、単一の実施形態において組み合わせて提供され得ることを理解されたい。逆に言えば、簡潔にするために単一の実施形態の文脈において説明される、本開示の種々の特徴はまた、別個に、または任意の好適な副次的組み合わせにおいて、または本開示の任意の他の説明される実施形態において好適なものとして提供されてもよい。種々の実施形態の文脈において説明される、ある特徴は、実施形態が、それらの要素を伴わない場合、動作不能ではない限り、それらの実施形態の不可欠な特徴と見なされるものではない。
【0183】
本開示は、その具体的実施形態と併せて説明されているが、多くの代替、修正、および変形例が、当業者に明白となるであろうことが明白である。故に、添付の請求項の精神および広範な範囲内に該当する、全てのそのような代替、修正、および変形例を包含することを意図している。
【外国語明細書】