En los viejos tiempos (1970 y antes) algunas computadoras no tenían ninguna MMU (y esto es cierto hoy en día para microcontroladores muy baratos).
En tales sistemas, no hay protección de memoria, por lo que no hay un segmento de solo lectura en el espacio de direcciones , y un programa con errores podría sobrescribir una constante (ya sea en la memoria de datos o incluso dentro del código de la máquina).
Los compiladores de Fortran en ese momento pasaron argumentos formales por referencia . Entonces, si lo hizo CALL FUN(4)
y SUBROUTINE FUN(I)
su cuerpo está cambiando I
, por ejemplo, con una declaración I = I + 1
en su cuerpo, podría tener un desastre, cambiando 4 a 5 en la persona que llama (o peor).
Esto también fue cierto en los primeros microordenadores como el IBM PC AT original de 1984, con MS-DOS
FWIW, soy lo suficientemente mayor como para haber usado, cuando era adolescente a principios de la década de 1970, tales computadoras: IBM1620 y CAB500 (en un museo: ¡estas son computadoras de la era de la década de 1960!). El IBM1620 fue bastante divertido: se usaba en tablas de memoria para adiciones y multiplicaciones (y si sobrescribió estas tablas, se produjo el caos). Entonces, no solo podría sobrescribir un 4, sino que incluso podría sobrescribir cada futura adición de 2 + 2 o multiplicaciones de 7 * 8 (pero realmente olvidé estos detalles sucios, por lo que podría estar equivocado).
Hoy, puede sobrescribir el código del BIOS en la memoria flash, si es lo suficientemente perseverante. Lamentablemente, ya no me siento tan divertido, así que nunca lo intenté. (Incluso tengo miedo de instalar algunos LinuxBios en mi placa base).
En las computadoras y sistemas operativos actuales, pasar una constante por referencia y cambiarla dentro de la persona que llama solo provocará una violación de la segmentación , que suena familiar para muchos desarrolladores de C o C ++.
Por cierto: ser quisquilloso: sobrescribir 4 no es una cuestión de lenguaje, sino de implementación.