
| プログラム実行 |
|---|
| 一般的な概念 |
| コードの種類 |
| コンパイル戦略 |
| 注目すべき実行時間 |
| 注目すべきコンパイラとツールチェーン |
|
コンピュータにおいて、マシンコードとは、コンピュータの中央処理装置(CPU)をプログラム可能なインターフェースを介して制御するために符号化され、構造化されたデータ です。コンピュータプログラムは、主にマシンコード命令のシーケンスで構成されています。[ 1 ]マシンコードは、CPUが直接解釈する言語であるため、ホストCPUに対してネイティブに分類されます。 [ 2 ]一部のソフトウェアインタープリタは、解釈するプログラミング言語を仮想マシンコード(バイトコード)に変換し、 Pコードマシンで処理します。
マシンコード命令は、CPU に次のような特定のタスクを実行させます。
命令セットアーキテクチャ(ISA)はCPUへのインターフェースを定義するもので、x86やARMなどのCPU設計のグループやファミリによって異なります。一般的に、あるファミリと互換性のあるマシンコードは他のファミリとは互換性がありませんが、例外もあります。VAXアーキテクチャは、PDP-11命令セットのオプションサポートを含んでいます。IA -64アーキテクチャは、IA-32命令セットのオプションサポートを含んでいます。また、PowerPC 615は、 PowerPCとx86の両方の命令をネイティブに処理できます。
アセンブリ言語

アセンブリ言語は、人間が読めるソースコードから機械語への比較的直接的なマッピングを提供します。アセンブリ言語のソースコードは、ニーモニックやラベルなどの数値コードを機械語で表現します。[ 3 ]例えば、x86NOPプロセッサのアセンブリ言語では、x86アーキテクチャのオペコード0x90が機械語で表現されます。プログラムを機械語で記述することも可能ですが、面倒でエラーが発生しやすくなります。そのため、プログラムは通常、アセンブリ言語、あるいはより一般的には高水準プログラミング言語で記述されます。
命令セット
機械命令は、機械の命令セットに指定されたフォーマットに基づいて、ビットのパターンとして操作をエンコードします。 [注 1 ] [ 4 ]
命令セットは様々な点で異なります。セット内の命令はすべて同じ長さの場合もあれば、異なる長さの場合もあります。また、アーキテクチャのワードサイズよりも小さい場合も、同じサイズの場合も、大きい場合もあります。命令の数は比較的少ない場合もあれば、多い場合もあります。命令は、アーキテクチャのワード境界など、特定のメモリ境界に揃える必要がある場合もあれば、そうでない場合もあります。[ 4 ]
命令セットは、コンピュータのデジタル論理レベルの回路を実行する必要があります。デジタルレベルでは、プログラムはコンピュータのレジスタ、バス、メモリ、ALU、その他のハードウェアコンポーネントを制御する必要があります。[ 5 ]コンピュータのアーキテクチャ機能を制御するために、機械命令が作成されます。機械命令を使用して制御される機能の例:
指示形式の基準は次のとおりです。
- 最もよく使われる命令は、めったに使われない命令よりも短くする必要があります。[ 4 ]
- 基盤となるハードウェアのメモリ転送速度によって、メモリ フェッチ命令の柔軟性が決まります。
- アドレスフィールドのビット数には特別な考慮が必要である。[ 9 ]
アドレスフィールドのサイズは、スペースと速度のどちらかを選択することになります。[ 9 ]一部のコンピュータでは、アドレスフィールドのビット数が小さすぎて物理メモリ全体にアクセスできない場合があります。また、仮想アドレス空間も考慮する必要があります。別の制約として、アドレスの構築に使用されるレジスタのサイズ制限が挙げられます。アドレスフィールドが短いほど命令の実行速度は速くなりますが、命令フォーマットを設計する際には、他の物理的特性も考慮する必要があります。
命令は、汎用命令と特殊命令の2種類に分けられます。特殊命令は、コンピュータ固有のアーキテクチャ上の特徴を利用します。汎用命令は、すべてのコンピュータに共通するアーキテクチャ上の特徴を制御します。[ 10 ]
汎用命令制御:
- ある場所から別の場所へのデータの移動
- 結果を生成する1つのオペランドを持つモナド演算
- 2つのオペランドから結果を生成する2項演算
- 比較と条件分岐
- 手続き呼び出し
- ループ制御
- 入力/出力
重複する指示
可変長命令セットを備えたプロセッサアーキテクチャ[ 11 ] ( Intelのx86プロセッサファミリなど)では、クラスカルカウントと呼ばれる制御フローの再同期現象の制限内で、[ 12 ] [ 11] [ 13 ] [ 14 ] [ 15 ] 、オペコードレベルのプログラミングを通じて、結果のコードを意図的に配置して、2つのコードパスがオペコードシーケンスの共通フラグメントを共有することが時々可能です。[注2 ]これらは、重複命令、重複オペコード、重複コード、重複コード、命令切断、または命令の途中へのジャンプと呼ばれます。[ 16 ] [ 17 ] [ 18 ]
1970年代と1980年代には、メモリ空間を節約するために、オーバーラップ命令が時々使用されました。一例として、MicrosoftのAltair BASICにおけるエラーテーブルの実装が挙げられます。この実装では、インターリーブ命令が命令バイトを相互に共有していました。[ 19 ] [ 11 ] [ 16 ]この手法は現在ではほとんど使用されていませんが、ブートセクタに収まるブートローダの実装など、バイトレベルでの極端なサイズ最適化が必要な領域では、依然としてこの手法に頼る必要がある場合があります。[注3 ]
また、逆アセンブルや改ざんに対する対策として、コード難読化技術として使用されることもあります。[ 11 ] [ 14 ]
この原理は、複数の命令セットに互換性のないプロセッサプラットフォームで実行する必要があるファットバイナリの共有コードシーケンスでも使用されます。 [注 2 ]
この特性は、既存のコードリポジトリ内のガジェットと呼ばれる意図しない命令を見つけるためにも使用され、リターン指向プログラミングでは、 return-to-libc攻撃などのエクスプロイトに対するコードインジェクションの代替として使用されます。[ 20 ] [ 11 ]
マイクロコード
一部のコンピュータでは、アーキテクチャの機械語は、マイクロコードと呼ばれるさらに基礎的な層によって実装されており、基盤となるデータフローが大きく異なるコンピュータのモデル間で、共通の機械語インターフェースを提供しています。これは、異なるモデル間での機械語プログラムの移植を容易にするために行われています。 [ 21 ]この例として、IBM System/360ファミリーのコンピュータとその後継機が挙げられます。[ 22 ]
例
IBM 709x
IBM 704、709、704x、709x では、各命令ワードに 1 つの命令が格納されます。IBM では、ビットを左から S、1、...、35 と番号付けしています。ほとんどの命令は、次の 2 つの形式のいずれかになります。
- ジェネリック
- S,1-11
- 12-13 フラグ、一部の命令では無視される
- 14-17 未使用
- 18-20 タグ
- 21~35歳
- TSX以外のインデックスレジスタ制御
- S,1-2 オペコード
- 3-17 減分
- 18-20 タグ
- 21~35歳
IBM 7094および 7094 II を除くすべての機種には、A、B、C の 3 つのインデックスレジスタがあります。タグ内の複数の 1 ビットでインデックスを設定すると、選択されたインデックスレジスタの論理和が減算され、タグ内の複数の 1 ビットでロードすると、選択されたすべてのインデックスレジスタがロードされます。7094 および 7094 II には 7 つのインデックスレジスタがありますが、電源投入時にはマルチタグモードになります。このモードでは、以前の機種と互換性のある方法で 3 つのインデックスレジスタのみが使用されます。残りの 4 つのインデックスレジスタにアクセスするには 、Leave Multiple Tag Mode ( LMTM ) 命令が必要です。
実効アドレスは通常YC(T)です。ここでC(T)は、タグが0の場合は0、マルチタグモードの場合は選択されたインデックスレジスタの論理和、マルチタグモード以外の場合は選択されたインデックスレジスタのいずれかです。ただし、インデックスレジスタ制御命令の実効アドレスはYのみです。
両方のビットが 1 のフラグは間接アドレス指定を選択します。間接アドレス ワードにはタグと Y フィールドの両方があります。
転送(分岐) 命令に加えて、これらのマシンには、条件付きで 1 ワードまたは 2 ワードをスキップするスキップ命令があります。たとえば、Compare Accumulator with Storage (CAS) は 3 方向の比較を行い、結果に応じて条件付きで NSI、NSI+1、または NSI+2 にスキップします。
ミップス
MIPSアーキテクチャは、命令が常に32ビット長であるマシンコードの具体例を提供している。[ 23 ]:299 命令の一般的な型は、最上位6ビットのop (演算)フィールドによって示される。J型(ジャンプ)命令とI型(即値)命令はopによって完全に指定される。R型(レジスタ)命令には、正確な演算を決定するためのfunct (関数)フィールドが追加される。これらの型で使用されるフィールドは以下のとおりである。
6 5 5 5 5 6 ビット [ op | rs | rt | rd |shamt| funct] R型 [ op | rs | rt | アドレス/即時] I型 [ op | ターゲットアドレス ] Jタイプ
rs、rt、rdはレジスタオペランドを示し、shamtはシフト量を示し、アドレスフィールドまたは即値フィールドにはオペランドが直接含まれる。[ 23 ]:299–301
例えば、レジスタ1と2を加算し、その結果をレジスタ6に格納する処理は次のようにエンコードされる: [ 23 ] : 554
[ op | rs | rt | rd |shamt| 機能] 0 1 2 6 0 32 10進数 000000 00001 00010 00110 00000 100000 バイナリ
レジスタ3にリストされている位置から68セル後のメモリセルから取得した値をレジスタ8にロードします: [ 23 ] : 552
[ op | rs | rt | アドレス/即時] 35 3 8 68 小数点 100011 00011 01000 00000 00001 000100 バイナリ
アドレス1024にジャンプ: [ 23 ] : 552
[ op | ターゲットアドレス ] 2 1024 10進数 000010 00000 00000 00000 10000 000000 バイナリ
バイトコード
マシンコードはバイトコードと似ていますが、根本的に異なります。マシンコードと同様に、バイトコードは通常、ソースコードから(つまりコンパイラによって)生成されます。しかし、マシンコードとは異なり、バイトコードはCPUで直接実行できません。例外は、Javaプロセッサのように、バイトコードをマシンコードとして使用するように設計されているプロセッサの場合です。バイトコードがソフトウェアインタープリタによって処理される場合、そのインタープリタは仮想マシンであり、バイトコードはそのマシンコードとなります。
ストレージ
実行中、マシンコードは通常RAMに保存されますが、一部のデバイスではROMからの実行もサポートされています。また、パフォーマンスを向上させるために、コードはより特殊なメモリにキャッシュされることもあります。アーキテクチャによっては、命令用とデータ用のキャッシュが異なる場合があります。[ 24 ]
プロセスの観点から見ると、マシンコードはそのアドレス空間の指定された部分であるコード空間に存在します。マルチスレッド環境では、1つのプロセス内の異なるスレッドがデータ空間に加えてコード空間を共有するため、プロセススイッチングに比べてコンテキストスイッチングのオーバーヘッドが大幅に削減されます。 [ 25 ]
読みやすさ
機械コードは一般的に人間が読めるものではないと考えられており[ 26 ] 、ダグラス・ホフスタッターはそれをDNA分子の原子を調べることに例えています。[ 27 ]しかし、さまざまなツールや方法が機械コードの理解をサポートしています。
逆アセンブリは機械語をアセンブリ言語にデコードしますが、アセンブリ命令は機械語に1対1でマッピングできるため、これが可能になります。[ 28 ]
デコンパイラはマシンコードを高級言語に変換しますが、その結果は比較的難読化される(理解しにくい)可能性があります。
プログラムは、デバッグシンボル(ネイティブ実行ファイルに埋め込まれているか、別のファイルに存在します)と関連付けることができます。これにより、プログラムを外部ソースコードにマッピングできます。デバッガはこれらのシンボルを読み取り、プログラマが対話的にプログラムを デバッグできるようにします。例えば、以下のようなものがあります。
- IBM 709、IBM 7090、IBM 7094コンピュータ用のSHAREオペレーティングシステム(1959)は、SQUOZEと呼ばれるロード可能なコード形式をサポートしていました。SQUOZE はアセンブリ言語コードの圧縮バイナリ形式で、シンボルテーブルを含んでいました。
- z/OSなどの現代のIBMメインフレーム・オペレーティング・システムでは、関連データ(ADATA)と呼ばれるシンボル・テーブルが利用可能です。このテーブルは、 IBM高水準アセンブラ(HLASM)[ 29 ] [ 30 ] 、 IBMのCOBOLコンパイラ[ 31 ] 、およびIBMのPL/Iコンパイラ[ 32 ]によって生成されるファイルに格納されます。このファイルは、独立したSYSADATAファイルとして、または汎用オブジェクト出力ファイル(GOFF) [ 33 ]内のADATAレコードとして生成されます。これにより、 OS/360のTESTレコードは廃止されますが、 TSOのTESTコマンドでそれらを要求して使用することは引き続き可能です。
- Windowsは、プログラムデータベース(.pdb )ファイルに保存されているシンボルテーブル[ 34 ]を使用します。[ 35 ]
- ほとんどのUnix系オペレーティングシステムでは、stabsおよびDWARFというシンボルテーブル形式が利用可能です。macOSやその他のDarwinベースのオペレーティングシステムでは、デバッグシンボルはDWARF形式で別の.dSYMファイルに保存されます。
参照
- エンディアン – コンピュータワード内のバイトの順序
- 機械語の一覧
- マシンコードモニター - 1970年代から1980年代の家庭用コンピュータ時代に人気があったソフトウェア
- Micro-Professor MPF-I – 1981年にMultitech社が発売したマイクロコンピュータ
- ネイティブ実行ファイル – コンピュータに指示された指示に従わせるデータ
- オブジェクトコード – コンピュータ言語における文または命令のシーケンス
- Pコードマシン – プログラミング仮想マシン
- 縮小命令セットコンピュータ - 最小限のクロックサイクルで1つの命令を実行するプロセッサ(RISC)
- 非常に長い命令語 - 並列処理を支援するコンピュータアーキテクチャ
注記
- ^初期の十進マシンでは、文字、数字、数字記号のパターンは
- ^ a b可変長命令セットを持つプロセッサ アーキテクチャ上の重複命令は、制御フローの再同期化によって異なるコード パスを 1 つにマージするように調整できる場合がありますが、異なるプロセッサ アーキテクチャの重複コードは、ファット バイナリで使用されることがあるように、基盤となるプロセッサに応じて実行パスが異なる方向に分岐するように作成される場合もあります。
- ^たとえば、 DR-DOS のマスター ブート レコード(MBR) とブート セクタ(パーティション テーブルとBIOS パラメータ ブロックも保持し、コード用にそれぞれ 446 バイトと 423 バイト未満を残す) は、従来、 FAT12またはFAT16ファイル システム内でブート ファイル自体を見つけて、それをまとめてメモリにロードできました。これに対し、 MS-DOSとPC DOSでは、システム ファイルがファイル システムの最初の 2 つのディレクトリ エントリ位置を占め、 IBMBIO.COMの最初の 3 つのセクタが、ファイルの残りの部分をメモリにロードするためのセカンダリ ローダーを含む連続セクタ内のデータ領域の先頭に格納されることに依存しています ( SYS がこれらすべての条件を処理する必要があります)。 FAT32と論理ブロック アドレス指定(LBA) のサポートが追加されたとき、マイクロソフトはコード サイズを理由にi386命令を必須とし、ブート コードを 2 つのセクターに分割する方式に切り替えましたが、これは DR-DOS では採用できない選択肢でした。マルチブートやチェーン ロードのシナリオで他のオペレーティング システムとの後方互換性と相互互換性が失われ、古いIBM PC 互換機でも同様だったからです。代わりにDR-DOS 7.07 のブート セクターでは自己書き換えコード、機械語でのオペコードレベルのプログラミング、(文書化された)副作用の制御された利用、マルチレベルのデータ/コード オーバーラップ、アルゴリズムによる折りたたみ手法を採用し、拡張機能を一切犠牲にすることなく、すべてを 512 バイトの物理セクターに収めました。
参考文献
- ^ Stallings, William (2015). 『コンピュータの構成とアーキテクチャ 第10版』 ピアソン・プレンティス・ホール. p. 776. ISBN 978-93-325-7040-5。
- ^ Gregory, Kate (2003年4月28日). 「マネージド、アンマネージド、ネイティブ:これはどんなコードか?」Developer.com . 2009年9月23日時点のオリジナルよりアーカイブ。 2008年9月2日閲覧。
- ^ドゥーリッシュ、ポール(2004). 『行動の源:身体化されたインタラクションの基礎』 MIT Press . p. 7. ISBN 0-262-54178-5. 2023年3月5日閲覧。
- ^ a b cタネンバウム 1990、p. 251
- ^タネンバウム1990、162ページ
- ^タネンバウム1990、231ページ
- ^タネンバウム1990、237ページ
- ^タネンバウム1990、236ページ
- ^ a b Tanenbaum 1990、p. 253
- ^タネンバウム1990、283ページ
- ^ a b c d e Jacob, Matthias; Jakubowski, Mariusz H.; Venkatesan, Ramarathnam [Wikidataにて] (2007年9月20~21日).インテグラルバイナリ実行に向けて:オーバーラップ命令エンコーディングを用いたオブリビアスハッシュの実装(PDF) . 第9回マルチメディア&セキュリティワークショップ (MM&Sec '07) 議事録. ダラス、テキサス州、米国: Association for Computing Machinery . pp. 129– 140. CiteSeerX 10.1.1.69.5258 . doi : 10.1145/1288869.1288887 . ISBN 978-1-59593-857-2. S2CID 14174680 . 2018年9月4日にオリジナルからアーカイブ(PDF) . 2021年12月25日閲覧.(12ページ)
- ^ラガリアス、ジェフリー・クラーク(ジェフ)、レインズ、エリック・マイケル、ヴァンダーベイ、ロバート・J.(2009年)[2001年10月13日]。「クラスカル数」。ブラムス、スティーブン、ゲーライン、ロバーツ、フレッド・S.(編)『選好、選択、秩序の数学』 。選択と福祉の研究。ベルリン/ハイデルベルク、ドイツ:シュプリンガー・フェアラーク。pp . 371– 391。arXiv:math /0110143。doi: 10.1007 / 978-3-540-79128-7_23。ISBN 978-3-540-79127-0。(22ページ)
- ^ Andriesse, Dennis; Bos, Herbert [Wikidataにて] (2014-07-10). オランダ、アムステルダム自由大学にて執筆. Dietrich, Sven (編).隠蔽トリガーベースマルウェアのための命令レベルステガノグラフィ(PDF) . 第11回侵入・マルウェア検知・脆弱性評価国際会議 (DIMVA).コンピュータサイエンス講義ノート. 英国エガム; スイス: Springer International Publishing . pp. 41–50 [45]. doi : 10.1007/978-3-319-08509-8_3 . eISSN 1611-3349 . ISBN 978-3-31908508-1. ISSN 0302-9743 . S2CID 4634611 . LNCS 8550 . 2023年8月26日時点のオリジナルよりアーカイブ(PDF) . 2023年8月26日閲覧.(10ページ)
- ^ a b Jakubowski, Mariusz H. (2016年2月). 「ソフトウェア改ざん防止のためのグラフベースモデル」 . Microsoft . 2019年10月31日時点のオリジナルよりアーカイブ。 2023年8月19日閲覧。
- ^ Jämthagen, Christopher (2016年11月).ソフトウェアセキュリティにおける攻撃と防御の手法について(PDF) (論文). ルンド, スウェーデン:ルンド大学電気情報技術学部. p. 96. ISBN 978-91-7623-942-1. ISSN 1654-790X . 2023年8月26日時点のオリジナルよりアーカイブ(PDF) . 2023年8月26日閲覧.(1+xvii+1+152ページ)
- ^ a b「x86における意図しない命令」。Hacker News。2021年。2021年12月25日時点のオリジナルよりアーカイブ。 2021年12月24日閲覧。
- ^キンダー、ヨハネス (2010-09-24)。x86 実行可能ファイルの静的解析[ x86 Maschinensprache におけるプログラムの統計解析] (PDF) (論文)。ミュンヘン、ドイツ:ダルムシュタット工科大学。 D17. 2020-11-12 のオリジナルからアーカイブ。2021年12月25日閲覧。(199ページ)
- ^ 「「重複命令」難読化とは何か?」Reverse Engineering Stack Exchange 2013年4月7日。2021年12月25日時点のオリジナルよりアーカイブ。 2021年12月25日閲覧。
- ^ゲイツ、ウィリアム「ビル」ヘンリー、個人的なコミュニケーション(注:Jacob et al .によると)
- ^ Shacham, Hovav (2007). The Geometry of Innocent Flesh on the Bone: Return-into-libc without Function Calls (on the x86) (PDF) . Proceedings of the ACM, CCS 2007. ACM Press . 2021年12月15日時点のオリジナルよりアーカイブ(PDF) . 2021年12月24日閲覧.
- ^ケント、アレン、ウィリアムズ、ジェームズ・G. (1993年4月5日).コンピュータサイエンスとテクノロジー百科事典:第28巻 - 補足13:AerosPateによるツリー構造への人工知能の応用. CRC Press. pp. 33– 34. ISBN 978-0-8247-2281-4。
- ^ Tucker, SG (1967-12-31). 「SYSTEM/360のマイクロプログラム制御」 . IBM Systems Journal . 6 (4): 222– 241. doi : 10.1147/sj.64.0222 . ISSN 0018-8670 – IEEE Xplore経由.
- ^ a b c d eハリス、デイビッド、ハリス、サラ・L. (2007).デジタルデザインとコンピュータアーキテクチャ.モーガン・カウフマン出版社. ISBN 978-0-12-370497-9. 2023年3月5日閲覧。
- ^ Su, Chao; Zeng, Qingkai (2021). 「CPUキャッシュベースのサイドチャネル攻撃の調査:体系的な分析、セキュリティモデル、および対策」 .セキュリティと通信ネットワーク. 2021 (1) 5559552. doi : 10.1155/2021/5559552 . ISSN 1939-0122 .
- ^ 「CS 537 ノート、セクション #3A: プロセスとスレッド」 . pages.cs.wisc.edu . ウィスコンシン大学マディソン校 コンピューター・データ・情報科学部. 2025年7月18日閲覧。
- ^サミュエルソン 1984年、683ページ。
- ^ホフスタッター1979、290ページ 。
- ^ Tanenbaum 1990、398ページ 。
- ^ 「関連データアーキテクチャ」。高レベルアセンブラおよびツールキット機能。
- ^ 「関連データファイル出力」(PDF) . High Level Assembler for z/OS & z/VM & z/VSE - 1.6 -HLASM Programmer's Guide(PDF)(第8版). IBM . 2022年10月. pp. 278– 332. SC26-4941-07 . 2025年2月14日閲覧。
- ^ 「COBOL SYSADATAファイルの内容」。Enterprise COBOL for z/OS。
- ^ 「SYSADATAメッセージ情報」。Enterprise PL/I for z/OS 6.1の情報。2025年3月17日。
- ^ 「付録C. 汎用オブジェクト・ファイル・フォーマット(GOFF)」(PDF) . z/OS - 3.1 - MVS プログラム管理:拡張機能(PDF) . IBM . 2024年12月18日. pp. 201– 240. SA23-1392-60 . 2025年2月14日閲覧。
- ^ 「Windowsデバッグ用のシンボル」 . Microsoft Learn . 2022年12月20日.
- ^ 「.Pdbファイルのクエリ」 . Microsoft Learn . 2024年1月12日.
出典
- ホフスタッター、ダグラス・R. (1979).ゲーデル、エッシャー、バッハ:永遠の黄金の編み紐.ベーシックブックス. ISBN 0-465-02685-0. 2025年2月10日閲覧。
- サミュエルソン、パメラ(1984). 「CONTU再考:機械可読形式のコンピュータプログラムに対する著作権保護に反対するケース」デューク・ロー・ジャーナル. 33 (4): 663– 769. doi : 10.2307/1372418 . hdl : hein.journals/duklr1984 . JSTOR 1372418. 2025年2月10日閲覧.
- Tanenbaum , Andrew S. (1990). Structured Computer Organization, Third Edition . Prentice Hall. p. 398. ISBN 978-0-13-854662-5。
さらに読む
- ヘネシー, ジョン・L. ;パターソン, デイビッド・A. (1994). 『コンピュータの構成と設計 ハードウェア/ソフトウェア・インターフェース』モーガン・カウフマン出版社. ISBN 1-55860-281-X。
- Tanenbaum, Andrew S. (1999). Structured Computer Organization (第4版). Prentice Hall . ISBN 0-13-020435-8. 2025年2月10日閲覧。
- ブルックシア、J. グレン (2007). 『コンピュータサイエンス:概要』(第9版).アディソン・ウェスリー. ISBN 978-0-321-38701-1. 2025年2月10日閲覧。