Константы, определяемые по типу, могут быть только скалярными значениями - то есть такими вещами, как целые числа, числа с двойными числами и т. Д. Для этих типов констант компилятор действительно заменяет символ константы значением константы всякий раз, когда он встречает их в выражениях.
Типизированные константы, с другой стороны, могут быть структурированными значениями - массивами и записями. Этим парням нужно фактическое хранилище в исполняемом файле, т. Е. Им должно быть выделено хранилище для них таким образом, чтобы, когда ОС загружает исполняемый файл, значение типизированной константы физически содержалось в некотором месте в памяти.
Чтобы объяснить, почему исторически типизированные константы в раннем Delphi и его предшественнике Turbo Pascal доступны для записи (и, таким образом, по существу инициализировали глобальные переменные), нам нужно вернуться к временам DOS.
DOS работает в реальном режиме в терминах x86. Это означает, что программы имеют прямой доступ к физической памяти без каких-либо MMU виртуальных и физических отображений. Когда программы имеют прямой доступ к памяти, защита памяти не действует. Другими словами, если по какому-либо адресу есть память, в реальном режиме она доступна как для чтения, так и для записи.
Таким образом, в программе Turbo Pascal для DOS с типизированной константой, значение которой распределяется по адресу в памяти во время выполнения, эта типизированная константа будет доступна для записи. Нет никакого аппаратного MMU, мешающего и мешающего программе записать в него. Точно так же, поскольку Паскаль не имеет понятия «константности», которое есть в C ++, в системе типов нет ничего, что могло бы вас остановить. Многие люди воспользовались этим, поскольку Turbo Pascal и Delphi в то время еще не инициализировали глобальные переменные как функцию.
Переходя к Windows, существует слой между адресами памяти и физическими адресами: блок управления памятью. Этот чип берет индекс страницы (сдвинутую маску) адреса памяти, к которому вы пытаетесь получить доступ, и ищет атрибуты этой страницы в своей таблице страниц . Эти атрибуты включают в себя читаемые, записываемые и для современных чипов x86 неисполняемые флаги. Благодаря этой поддержке можно помечать разделы .EXE или .DLL такими атрибутами, чтобы при загрузке Windows загрузчик выполнил образ в память, он назначал соответствующие атрибуты страниц для страниц памяти, которые отображаются на страницы диска в этих разделах.
Когда появилась 32-битная версия компилятора Delphi для Windows, имело смысл сделать const-подобные вещи действительно const, поскольку ОС также имеет эту функцию.