高級言語はそれぞれどのアドレス指定方式に対応していますか?

emile-perron-xrVDYZRGdw4-unsplash.jpg

質問

高級言語はそれぞれどのアドレス指定方式に対応していますか?
またどのように使い分けられていますか?


解答

とても良い質問です。
高級言語(C, Java, Pythonなど)は、アドレス指定方式そのものを意識せずに書けるように設計されていますが、
コンパイルや実行時には内部で適切なアドレス指定方式が使われています。

ここでは「高級言語が内部でどのようなアドレス指定方式に対応しているのか」「どう使い分けられているのか」を分かりやすく解説します。


✅ 前提:アドレス指定方式と高級言語の関係

  • 高級言語は抽象度が高く、命令の背後に複数のアドレス指定方式が隠れている

  • コンパイラ(Cなど)やインタプリタ(Pythonなど)が、CPU命令に変換する際に適切なアドレス指定方式を選ぶ


✅ 高級言語とアドレス指定方式の対応表

高級言語の記述実際に使われるアドレス指定方式(例)説明
x = 5即値アドレッシング定数5を直接代入(命令に値が含まれる)
x = y直接 or レジスタアドレッシングyのメモリまたはレジスタから読み込み
x = *p(C言語)間接アドレッシングポインタpが指すアドレスから取得
x = a[i]インデックスアドレッシングaのベース+インデックス値で取得
x = struct.memberベース+オフセット構造体のベース+固定のオフセット

✅ 高級言語別の傾向

【C / C++】

  • アドレス操作ができる代表的な言語

  • &, *, [], struct などで各方式を明示的に利用可能

  • ポインタの存在により、間接アドレッシングを明示的に書ける

例:

int a[10];        // 配列(インデックス方式)int *p = &a[0];   // ポインタ(間接方式)int x = *p;       // pが指すアドレスの値(間接)

【Java】

  • ポインタがない(安全性のため)

  • すべてのオブジェクトは参照型だが、開発者はアドレスを意識しない

  • JVM(仮想マシン)レベルで間接アドレッシングを使っている

例:

int[] a = new int[5];a[1] = 10;   // インデックス方式に対応

【Python】

  • 動的型付け+高抽象

  • すべてが参照で動作(値渡しはイミュータブルなオブジェクトのみ)

  • 実装(Cで書かれたCPythonなど)内部で間接やインデックス方式を使用

例:

a = [1, 2, 3]x = a[1]  # インデックス

✅ 使い分けの観点

シーン使われる方式説明
定数の代入即値アドレッシング例:x = 10
単なる変数コピーレジスタや直接例:x = y
配列・リストアクセスインデックス or ベース+オフセット例:x = arr[i]
ポインタ操作間接アドレッシング例:x = *p(C)
関数のジャンプや分岐相対アドレッシングif文や関数呼び出しで使われる

✅ 補足:実際の選択は誰がしている?

  • プログラマが書いたソースコード
     → コンパイラや仮想マシンが最適なアドレス指定方式を選ぶ

例:

x = y + 3;
  • レジスタにyを読み込み(レジスタアドレッシング)

  • 3を即値で指定(即値アドレッシング)

  • 結果をxに保存


✅ まとめ

高級言語での構文内部で使われるアドレス指定方式
x = 5即値
x = y直接 / レジスタ
x = *p間接
x = a[i]インデックス
x = s.memberベース+オフセット

なぜ使い分けるのか?

→ 処理速度、柔軟性、メモリ効率、構造体や配列操作など用途に応じて最適化するため。





SwiftUI対応 たった2日でマスターできる iPhoneアプリ開発集中講座 Xcode16/iOS18/Swift6.0対応【電子書籍】[ 藤治仁 ]

価格:2800円
(2025/7/14 14:39時点)
感想(0件)


The DevOps ハンドブック 理論・原則・実践のすべて【電子書籍】[ ジーン・キム ]

価格:3520円
(2025/5/8 12:12時点)
感想(0件)


 



この記事へのコメント