¿Cuál es el historial para nombrar constantes en mayúsculas?

20

¿Cuál es la historia detrás de la convención de nombrar constantes en mayúsculas?

Mi intuición es que comenzó con el preprocesador C, donde las personas desarrollaron una práctica para nombrar macros de preprocesador en mayúsculas para que pudieran vivir efectivamente en un espacio de nombres separado y evitar colisiones de nombres. Mi creencia es que esta práctica fue malentendida y bastarda para aplicarla también a las constantes no preprocesadoras ( enums, constvariables).

Nombrar macros de preprocesador en mayúsculas me parece realmente útil. Nombrar constantes generales de esa manera, no tanto (y contraproducente si crea colisiones con nombres de macro).

¿Estoy fuera de la base? ¿La práctica de las constantes en mayúsculas es anterior a C?

jamesdlin
fuente
3
Creo que estás aquí Los primeros idiomas tenían casi todo en mayúsculas, y el uso de minúsculas se puso de moda más tarde. Los primeros libros de C parecen mostrar típicamente constidentificadores en minúsculas y #definesen mayúsculas. Sin embargo, Java adoptó mayúsculas para constantes y otros lenguajes seguidos, pero podría equivocarme un poco. ¡Se necesita más investigación! :)
David Arno
Estoy de acuerdo con @DavidArno probablemente debido a la naturaleza de C o ensamblador.
Snoop

Respuestas:

13

Para C, la primera edición de The C Programming Language (también conocido como K&R) sugiere que su intuición sobre las macros de preprocesadores es correcta:

Los nombres constantes simbólicos se escriben comúnmente en mayúsculas para que puedan distinguirse fácilmente de los nombres de variables en minúsculas.

En muchos sentidos, esto era un remanente del lenguaje ensamblador, donde las macros se definían en mayúsculas junto con etiquetas, códigos de operación, nombres de registro y todo lo demás. El advenimiento del ensamblaje de estilo AT&T cambió eso en algunas plataformas, pero creo que estuvo muy influenciado por el hecho de que los terminales que admiten minúsculas se estaban convirtiendo en algo y Unix era lo que yo llamaría un "sistema operativo en minúsculas".

En los otros dos puntos, estás bateando .500:

Enum

Para cuando se publicó la segunda edición, enum habían definido los correos electrónicos, se los denominaba constantes de enumeración y se los cubría en la sección de constantes. Debido a que las constantes definidas por un enumestán representadas por símbolos, eso las convierte en constantes simbólicas que, si va a seguir la convención recomendada, deben nombrarse en mayúsculas. (Al igual que las macros de preprocesador, nada le impide hacer lo contrario).

La implicación aquí es que, a diferencia de algunos lenguajes que siguieron, C no trata enum como un tipo de primera clase donde los tipos en sí son distintos, los valores de enumeración son específicos de cada tipo y pueden reutilizarse en otros. En cambio, es efectivamente una forma abreviada conveniente para #defineque produce secuencias de enteros con identificadores adjuntos. Esto hace

enum foo  { BAR, BAZ };
enum quux { BLETCH, BAZ };

inválido porque todos los símbolos comparten alcance y BAZse redefinen. (Esta fue una mejora sobre el preprocesador que, en ese momento, no advirtió sobre uno#define golpeteo sobre otro.) Además, a C no le importa si los mezclas porque son todos enteros, haciendo

enum foo  { BAR, BAZ };
enum quux { BLETCH, BLRFL };

enum foo variable = BLETCH;

completamente válido incluso en un compilador moderno con todas las advertencias activadas.

Const

NB: La constpalabra clave se originó en 1981 con C With Classes de Stroustrup (que evolucionó a C ++) y finalmente fue adoptada por C. La elección del nombre es desafortunada, porque colisiona con el uso de K&R del término constante para significar lo que ahora llamaríamos un literal (por ejemplo 38, 'x'o"squabble" ). El texto en la segunda edición no fue reescrito para reflejar eso.

Variables declaradas const son una historia diferente porque siguen siendo variables. Se supone que no deben modificarse, pero si la noción de una variable constante tiene más sentido que, digamos, el camarón gigante es el forraje para otra discusión. En cualquier caso, C nunca fue realmente serio al respecto porque el estándar solo requiere que el compilador emita un diagnóstico cuando intente cambiar uno. El comportamiento real no está definido si se compila y ejecuta una modificación.

Al ser variables, tiene sentido que cualquier cosa constsiga la convención de ser nombrado en minúsculas. Usarlos para representar literales tiene algunas ventajas de seguridad de tipo, pero no es una buena optimización si tiene que alcanzar entre unidades de compilación para obtener el valor.

Lo que no son son constantes en el sentido de K&R, y por esa razón sus identificadores no deberían estar en mayúsculas. Algunas personas los usan de esa manera, pero no es una práctica que recomiendo, excepto en algunos casos específicos.

Blrfl
fuente
Voy a aceptar esto, y aunque aprecio la respuesta, los enumpárrafos sobre no ser de primera clase y sobre conflictos de redefinición no parecen relevantes. Que la primera edición de K&R describió que la práctica de "constantes simbólicas" es suficiente. (Además, después de revisar mi copia de la segunda edición de K&R, veo que sus ejemplos son todas enumconstantes de nombres en mayúsculas, por lo que valida aún más su respuesta.)
jamesdlin