型推論された定数は、スカラー値(つまり、整数、倍精度浮動小数点数など)のみにすることができます。これらの種類の定数の場合、コンパイラーは、式で定数と出会うたびに、定数の記号を定数の値に置き換えます。
一方、型付き定数は、構造化された値(配列とレコード)にすることができます。これらの人は、実行可能ファイルに実際のストレージを必要とします。つまり、OSが実行可能ファイルをロードするときに、型付き定数の値がメモリ内のある場所に物理的に含まれるように、ストレージを割り当てる必要があります。
歴史的に、初期のDelphiとその前身であるTurbo Pascalの型付き定数が書き込み可能である(したがって、本質的に初期化されたグローバル変数である)理由を説明するには、DOSの時代に戻る必要があります。
DOSは、x86用語でリアルモードで実行されます。これは、 MMUが仮想物理マッピングを行うことなく、プログラムが物理メモリに直接アクセスできることを意味します。プログラムがメモリに直接アクセスできる場合、メモリ保護は有効になりません。つまり、任意のアドレスにメモリがある場合、リアルモードで読み取りと書き込みの両方が可能です。
そのため、実行時にメモリ内のアドレスに値が割り当てられる、型付き定数を使用するDOS用のTurbo Pascalプログラムでは、その型付き定数は書き込み可能になります。ハードウェアMMUが邪魔になり、プログラムがそれに書き込むのを妨げることはありません。同様に、PascalにはC ++のような「定数」の概念がないため、型システムにはあなたを止めるものは何もありません。Turbo PascalとDelphiは当時、グローバル変数を機能として初期化していないため、多くの人がこれを利用していました。
Windowsに移ると、メモリアドレスと物理アドレスの間にメモリ管理ユニットという層があります。このチップは、アクセスしようとしているメモリアドレスのページインデックス(シフトされたマスク)を取得し、そのページテーブルでこのページの属性を検索します。これらの属性には、読み取り可能、書き込み可能、および最新のx86チップの場合は実行不可能なフラグが含まれます。このサポートにより、.EXEまたは.DLLのセクションに属性をマークして、Windowsローダーが実行可能イメージをメモリにロードするときに、これらのセクション内のディスクページにマップされるメモリページに適切なページ属性を割り当てることができます。
32ビットのWindowsバージョンのDelphiコンパイラが登場したとき、OSにもこの機能があるため、constのようなものを実際にconstにすることは理にかなっています。