Las constantes de tipo inferido solo pueden ser valores escalares, es decir, enteros, dobles, etc. Para este tipo de constantes, el compilador reemplaza el símbolo de la constante con el valor de la constante siempre que se encuentre en expresiones.
Las constantes tipadas, por otro lado, pueden ser valores estructurados: matrices y registros. Estos tipos necesitan almacenamiento real en el ejecutable, es decir, necesitan tener el almacenamiento asignado para ellos de forma que, cuando el SO cargue el ejecutable, el valor de la constante tipeada esté físicamente contenido en alguna ubicación de la memoria.
Para explicar por qué, históricamente, las constantes tipadas en Delphi inicial y su predecesor, Turbo Pascal, son escribibles (y, por lo tanto, variables globales esencialmente inicializadas), tenemos que volver a los días de DOS.
DOS se ejecuta en modo real, en términos de x86. Esto significa que los programas tienen acceso directo a la memoria física sin ningún MMU realizando asignaciones virtual-físicas. Cuando los programas tienen acceso directo a la memoria, no hay protección de memoria en efecto. En otras palabras, si hay memoria en cualquier dirección dada, es legible y escribible en modo real.
Entonces, en un programa Turbo Pascal para DOS con una constante tipada, cuyo valor se asigna a una dirección en la memoria en tiempo de ejecución, esa constante tipeada será escribible. No hay una MMU de hardware que se interponga y que impida que el programa escriba en ella. De manera similar, debido a que Pascal no tiene noción de 'const'ness' que C++ tiene, no hay nada en el sistema de tipos que lo detenga. Mucha gente se aprovechó de esto, ya que Turbo Pascal y Delphi en ese momento no habían inicializado las variables globales como una característica.
Pasando a Windows, hay una capa entre las direcciones de memoria y físicas: la unidad de gestión de memoria. Este chip toma el índice de página (una máscara desplazada) de la dirección de memoria a la que intenta acceder y busca los atributos de esta página en page table. Estos atributos incluyen legibles, editables, y para chips modernos x86, indicadores no ejecutables. Con este soporte, es posible marcar secciones de .EXE o .DLL con atributos tales que cuando el cargador de Windows carga la imagen ejecutable en la memoria, asigna atributos de página apropiados para las páginas de memoria que asignan páginas de disco dentro de estas secciones.
Cuando apareció la versión de Windows de 32 bits del compilador Delphi, tenía sentido hacer que las cosas similares a realmente const, ya que el sistema operativo también tiene esta función.
Que hizo el truco. Google revela que la directiva del compilador es {$ J +}. También está en las opciones del proyecto, probablemente debería haber buscado allí: P – Blorgbeard
Sí, me ha impresionado antes. (editado para agregar detalles después de mi publicación inicial) – Ray
IMHO '{$ WRITABLECONST OFF}' sería incluso mejor :) que '{J +}'. –