---
title: "再配置とは？ロード時のアドレス補正とリンクとの違い【基本情報技術者試験】"
description: "再配置を、プログラムのロード位置に合わせて内部アドレスを補正する処理として整理し、リンク・再コンパイル・最適化・リロードとの違いを解説します。"
last_modified_at: "2026-08-02"
canonical_url: "https://stemtazoo.github.io/fe/relocation/"
section: "fe"
---

## まず結論

再配置とは、**プログラムを主記憶へ読み込んだ位置に合わせて、プログラム内部のアドレス情報を補正する処理**です。

基本情報技術者試験では、次の表現が決め手になります。

```text
主記憶へロードする
ロード位置に合わせる
内部アドレスを補正する
→ 再配置
```

覚える一文はこれです。

> **プログラムを置いた場所に合わせて、内部アドレスを直すのが再配置。**

## 直感的な説明

再配置は、引っ越し後に住所を書き換えるイメージです。

プログラムが、主記憶の0番地から配置される前提で作られていたとします。

ところが、実際には500番地から読み込まれた場合、内部で参照するアドレスも500番地分ずらす必要があります。

```text
想定していた先頭位置
→ 0番地

実際の先頭位置
→ 500番地

内部アドレス
→ 配置位置に合わせて補正
```

この補正処理が再配置です。

## 定義・仕組み

### なぜ再配置が必要なのか

主記憶には、OSやほかのプログラムがすでに配置されています。

そのため、新しく実行するプログラムが、毎回同じ位置へ読み込まれるとは限りません。

```text
主記憶の空き位置が変わる
↓
プログラムの配置位置も変わる
↓
内部アドレスの補正が必要
```

### ローダの役割

ローダは、実行可能プログラムを主記憶へ読み込み、実行できる状態にするプログラムです。

主な役割は次のとおりです。

- 実行可能プログラムを主記憶へ読み込む
- 必要な主記憶領域を確保する
- ロード位置に合わせてアドレスを補正する
- 実行開始位置へ制御を渡す

```text
読み込む
→ ロード

配置位置に合わせて直す
→ 再配置
```

### 絶対アドレスと相対アドレス

絶対アドレスは、主記憶上の具体的な番地です。

相対アドレスは、プログラムの先頭位置からの距離で表します。

```text
絶対アドレス
→ 主記憶上の具体的な番地

相対アドレス
→ プログラム先頭からの差
```

相対アドレスを利用すると、プログラムがどこへ配置されても、先頭位置を基準に参照先を求めやすくなります。

一方、絶対アドレスを含む部分では、配置位置に応じた補正が必要です。

### 再配置可能プログラム

ロード位置が変わっても、アドレスを補正することで実行できるプログラムを、再配置可能プログラムといいます。

```text
決まった位置でしか動かない
→ 再配置が難しい

配置位置に合わせて補正できる
→ 再配置可能
```

このテーマは、基本情報技術者試験のOSやプログラム実行に関係する内容です。公式の出題範囲やシラバスは、[IPA：基本情報技術者試験](https://www.ipa.go.jp/shiken/kubun/fe.html) から確認できます。

## 科目Aでどう出る？

科目Aでは、用語の説明から正しいものを選ぶ問題として出題されます。

### 再配置を選ぶ手掛かり

```text
プログラムを主記憶へ読み込む
実際のロード位置
アドレス情報を補正する
配置先に合わせる
```

これらがあれば、再配置を考えます。

### 似た用語との切り分け

| 用語 | 主な意味 |
|---|---|
| 再コンパイル | ソースコードから目的プログラムを作り直す |
| 最適化 | 実行速度やメモリ使用量を改善する |
| 再配置 | ロード位置に合わせてアドレスを補正する |
| リロード | プログラムやデータを再び読み込む |
| リンク | 複数の目的モジュールやライブラリを結合する |

問題文の動詞を見ると判断しやすくなります。

```text
作り直す
→ 再コンパイル

効率を上げる
→ 最適化

配置位置へ合わせる
→ 再配置

もう一度読み込む
→ リロード

部品を結合する
→ リンク
```

## どんな場面で使う？

### 複数のプログラムを実行する

主記憶では、複数のプログラムが同時に存在することがあります。

そのため、後から読み込まれるプログラムは、空いている位置へ配置されます。

```text
プログラムA
→ ある領域を使用中

プログラムB
→ 別の空き領域へ配置

プログラムBの内部アドレス
→ 配置位置に合わせて補正
```

### OSが主記憶を管理する

OSは、空いている領域を管理し、実行するプログラムを配置します。

配置位置が変わっても実行できるようにするため、再配置の考え方が必要です。

### 共有ライブラリを利用する

実行時にライブラリを読み込む場合も、実際に配置された位置を基準にアドレスを解決します。

試験では細かな実装よりも、

```text
ロード後の位置に合わせてアドレスを直す
```

という役割を押さえれば十分です。

## リンクとの違い

リンクは、複数の目的モジュールやライブラリを結合して、一つの実行可能プログラムを作る処理です。

再配置は、できあがったプログラムを主記憶へ置く際に、配置位置へ合わせてアドレスを補正する処理です。

```text
複数の部品を一つにまとめる
→ リンク

主記憶上の位置に合わせて直す
→ 再配置
```

処理の流れで見ると、次のようになります。

```text
ソースコード
↓ コンパイル
目的プログラム
↓ リンク
実行可能プログラム
↓ ロード・再配置
主記憶上で実行
```

## 静的再配置と動的再配置

再配置には、大きく分けて次の考え方があります。

### 静的再配置

プログラムを主記憶へ読み込むときに、アドレスを補正します。

```text
ロード時に補正
→ 静的再配置
```

ロード後は、基本的に同じ位置で実行します。

### 動的再配置

実行中に、論理アドレスを物理アドレスへ変換します。

```text
実行時に変換
→ 動的再配置
```

ベースレジスタなどを使い、プログラムが使う論理アドレスへ一定値を加えて、実際の物理アドレスを求めます。

科目Aでは、まず次の違いを押さえます。

```text
ロード時に直す
→ 静的再配置

実行時に変換する
→ 動的再配置
```

## よくある誤解・混同

### 再配置は再コンパイルのこと

違います。

```text
ソースコードから作り直す
→ 再コンパイル

ロード位置に合わせて直す
→ 再配置
```

再配置では、ソースコードをコンパイルし直すとは限りません。

### 再配置は最適化のこと

違います。

最適化は、処理速度やメモリ使用量などを改善することです。

再配置は、アドレスを配置位置に合わせることです。

### 再配置はリロードのこと

違います。

リロードは、プログラムやデータを再び読み込むことです。

再配置は、読み込んだ位置に合わせてアドレスを補正することです。

### 再配置とリンクは同じ

違います。

```text
外部参照を解決して部品を結合
→ リンク

主記憶上の配置位置へ合わせる
→ 再配置
```

### すべてのアドレスを手作業で書き換える

実際には、ローダやアドレス変換機構が必要な補正を行います。

利用者が手作業で番地を書き換えるものではありません。

## まとめ（試験直前用）

- 再配置は、ロード位置に合わせて内部アドレスを補正する処理
- プログラムは毎回同じ主記憶位置へ置かれるとは限らない
- ローダは、読み込み・領域確保・再配置・実行開始を担当する
- 絶対アドレスは具体的な番地
- 相対アドレスはプログラム先頭からの距離
- リンクは部品の結合、再配置は配置位置へのアドレス補正
- 再コンパイルはソースから作り直す
- 最適化は効率を改善する
- リロードは再び読み込む
- ロード時なら静的再配置、実行時なら動的再配置

> **リンクはプログラムをまとめる処理、再配置は置いた場所に合わせて直す処理。**
