stringtranslate.com

Calificador de tipo

En los lenguajes de programación C , C++ y D , un calificador de tipo es una palabra clave que se aplica a un tipo , lo que da como resultado un tipo calificado. Por ejemplo, un tipo calificado representa un número entero constante, mientras que el tipo no calificado correspondiente es simplemente un número entero. En D, estos se conocen como constructores de tipos, por analogía con los constructores en la programación orientada a objetos .const intint

Los calificadores de tipo son una forma de expresar información adicional sobre un valor a través del sistema de tipos y garantizar la corrección en el uso de los datos. Los calificadores de tipo generalmente no se usan fuera de la familia de lenguajes C/C++: muchos lenguajes tienen una notación de constantes, pero lo expresan mediante el enlace del nombre como constante (una "variable que no varía"), en lugar de a través del sistema de tipos. ; consulte las alternativas a continuación.

Por idioma

C/C++

A partir de 2014 y C11 , hay cuatro calificadores de tipo en el estándar C: const( C89 ), volatile( C89 ), restrict( C99 ) y _Atomic( C11 ); este último tiene un nombre privado para evitar conflictos con nombres definidos por el usuario. [1] Los dos primeros, consty volatile, también están presentes en C++ y son los únicos calificadores de tipo en C++. Así, en C++ el término " tipo calificado cv " (para constante y volátil ) se usa a menudo para "tipo calificado", mientras que los términos " tipo calificado c " y " tipo calificado v " se usan cuando solo uno de las eliminatorias es relevante.

De estos, constes, con diferencia, el más conocido y utilizado, aparece en las bibliotecas estándar de C y C++ y se encuentra en cualquier uso significativo de estos lenguajes, que deben satisfacer la corrección constante . Los otros calificadores se utilizan para programación de bajo nivel y, aunque se utilizan ampliamente allí, los programadores típicos rara vez los utilizan. Sin embargo, durante un tiempo, volatilealgunos programadores de C++ lo utilizaron para la sincronización durante el subprocesamiento, aunque esto no se desaconsejó y ahora no funciona en la mayoría de los compiladores.

D

En D los constructores de tipos son const, immutable, sharedy inout. immutablees una variante más fuerte de const, que indica datos que nunca pueden cambiar su valor, mientras que constindica datos que no se pueden cambiar a través de esta referencia: es una vista constante de datos posiblemente mutables. sharedse usa para datos compartidos en subprocesos múltiples (como volatilese usó brevemente en C++). inoutes un comodín utilizado para permitir que funciones que no modifican datos (y por lo tanto solo se ocupan del tipo no calificado de datos) devuelvan el mismo tipo calificado que la entrada. consty immutabletambién se pueden utilizar como especificadores de clase de almacenamiento.

Sintaxis

En C y C++, un tipo se proporciona en una declaración de función o declaración de variable proporcionando uno o más especificadores de tipo y, opcionalmente, calificadores de tipo. Por ejemplo, una variable entera se puede declarar como:

intx ; 

¿Dónde intestá el especificador de tipo? Una variable entera sin signo se puede declarar como:

int sin signo x ;  

donde ambos unsignedy intson especificadores de tipo. Una variable entera constante sin signo se puede declarar como:

constante sin firmar int x ;   

donde es un calificador de tipo, cuál es constel tipo calificado y el tipo no calificado .xconst unsigned intunsigned int

Las declaraciones de variables tienen además un especificador de clase de almacenamiento opcional . Propiamente, este es un tema separado, distinto del tipo, aunque consten una declaración de variable también se considera que tiene implicaciones para la clase de almacenamiento, es decir, que se puede almacenar en memoria de solo lectura.

Corrección volátil

El otro calificador en C y C++ volatile, indica que un objeto puede ser modificado por algo externo al programa en cualquier momento y, por lo tanto, debe volver a leerse desde la memoria cada vez que se accede a él.

El calificador se encuentra con mayor frecuencia en código que manipula hardware directamente (como en sistemas integrados y controladores de dispositivos ) y en aplicaciones multiproceso (aunque a menudo se usa incorrectamente en ese contexto; consulte enlaces externos en variable volátil ). Se puede usar exactamente de la misma manera que consten declaraciones de variables, punteros, referencias y funciones miembro y, de hecho, volatilea veces se usa para implementar una estrategia similar de diseño por contrato que Andrei Alexandrescu llama volatile-corrección, [2] aunque esto es mucho menos común que constla corrección. El volatilecalificador también puede eliminarse const_casty puede combinarse con el constcalificador como en este ejemplo:

// Configurar una referencia a un registro de hardware de sólo lectura // asignado en una ubicación de memoria codificada. const volatile int & hardwareRegister = * reinterpret_cast < int *> ( 0x8000 );      int valoractual = registrohardware ; // Leer la ubicación de la memoria int newValue = hardwareRegister ; // Leelo de nuevo        Registro de hardware = 5 ; // Error, no se puede escribir en una ubicación constante   

Por hardwareRegistereso volatile, no hay garantía de que mantenga el mismo valor en dos lecturas sucesivas aunque el programador no pueda modificarlo. La semántica aquí indica que el valor del registro es de solo lectura pero no necesariamente invariable.

Historia

La noción de calificador de tipo fue introducida, junto con el ejemplo de readonly(posteriormente renombrado const) por Bjarne Stroustrup en un Memorando técnico interno de Bell Labs de 1981, [3] e implementado en C con Classes , el predecesor de C++ . [4] En cuanto a la motivación, Stroustrup escribe: [4]

"Cumplió dos funciones: como una forma de definir una constante simbólica que obedece a reglas de alcance y tipo (es decir, sin usar una macro) y como una forma de considerar inmutable un objeto en la memoria".

constLuego se adoptó en C como parte de la estandarización y aparece en C89 (y versiones posteriores) junto con otro calificador de tipo, volatileque fue inventado por el comité de estándares ANSI C (X3J11). [5] volatile apareció en 1985; [6] y uno de sus primeros usos fue en la compilación del kernel UNIX para MIPS , para permitir una compilación optimizada evitando que se apliquen optimizaciones habituales a variables volátiles. [7]noalias En la reunión de diciembre de 1987 del comité X3J11 se sugirió otro calificativo , pero fue rechazado; Su objetivo finalmente lo cumplió el restrictclasificado en C99. La motivación noaliasera complementaria a la de volatile, es decir, que indicaba que incluso se podían realizar optimizaciones normalmente inseguras. Ritchie no apoyó mucho los calificadores de tipo, argumentando que no "llevaban su peso", pero en última instancia no defendió su eliminación del estándar; [8] Sin embargo, se opuso noaliasy fue eliminado del borrador.

Java no tiene calificadores de tipo y es notoriamente omitido const: una propuesta de 1999 para agregarlo fue rechazada, en particular porque agregarlo después del hecho y luego cambiar la biblioteca estándar para usarlo consistentemente habría roto la compatibilidad. [9] Sin embargo, Java inicialmente dejó abierta la posibilidad de implementar const, destacando que constes una palabra reservada , aunque en realidad no se utiliza como palabra clave . En cambio, Java tiene la palabra clave orientada a objetos final, que se utiliza para calificar atributos (y por lo tanto también para variables locales) como constantes, pero no para calificar tipos.

Alternativas

Otros lenguajes adoptan un enfoque diferente, considerando la constancia como una propiedad de un identificador (o enlace de nombre ), no un tipo. Por lo tanto, dichos lenguajes tienen identificadores constantes (correspondientes a "variables" que no varían) con asignación única, pero no tienen una noción de corrección constante: dado que la constancia no es parte del tipo, no hay posibilidad de que el tipo no coincida. Los ejemplos incluyen Ada 83 con objetos constantes y una constantpalabra clave, [10] [a] y Java con la finalpalabra clave.

Notas

  1. ^ El estándar Ada llama a esto una " palabra reservada "; consulte ese artículo para conocer su uso.

Referencias

  1. ^ C11: El nuevo estándar C, Thomas Plum
  2. ^ "Genérico <Programación>: volátil: la corrección volátil del mejor amigo del programador multiproceso o cómo hacer que su compilador detecte las condiciones de carrera por usted" por Andrei Alexandrescu en el Foro de expertos en C++ del C/C++ Users Journal
  3. ^ Bjarne Stroustrup , "Extensiones del concepto de tipo de lenguaje C", Memorando técnico interno de Bell Labs, 5 de enero de 1981.
  4. ^ ab Rivalidad entre hermanos: C y C++, Bjarne Stroustrup , 2002, p. 5
  5. ^ Dennis M. Ritchie , "El desarrollo del lenguaje C Archivado el 10 de enero de 2015 en archive.today ", 2003: "X3J11 también introdujo una serie de adiciones y ajustes más pequeños, por ejemplo, los calificadores de tipo constante y volátil , y reglas de promoción de tipo ligeramente diferentes."
  6. ^ Aparece en las notas de la charla técnica de la reunión del Grupo Europeo de Usuarios del Sistema UNIX (EUUC) "El borrador del estándar ANSI para el lenguaje de programación C" de Mike Banahan, 13 de septiembre de 1985, impreso en el Boletín del grupo australiano de usuarios de sistemas Unix (AUUGN ), Vol. 6, n.º 6, pág. 73
  7. ^ John Mashey (16 de agosto de 1991). "Re: ¿RISC vs CISC? ¿Llamar a las cosas por su nombre?". Grupo de noticias : comp.arch. Usenet:  [email protected].
  8. ^ "Permítanme comenzar diciendo que no estoy convencido de que incluso los calificadores anteriores a diciembre ('const' y 'volatile') tengan su peso; sospecho que lo que agregan al costo de aprender y usar el idioma no es "Volatile", en particular, es un adorno para aplicaciones esotéricas, y se expresa mucho mejor por otros medios. Su principal virtud es que casi todo el mundo puede olvidarse de él. no puedes evitar aprender sobre él, debido a su presencia en la interfaz de la biblioteca. Sin embargo, no estoy a favor de la eliminación de los calificadores, aunque sólo sea porque es demasiado tarde."
  9. ^ JDK-4211070: Java debería admitir parámetros constantes (como C++) para el mantenimiento del código [sic]
  10. ^ 1815A, 3.2.1. Declaraciones de objetos:
    "El objeto declarado es una constante si la palabra reservada constante aparece en la declaración del objeto; la declaración debe incluir una inicialización explícita. El valor de una constante no se puede modificar después de la inicialización. Parámetros formales de modo en subprogramas y entradas , y los parámetros formales genéricos del modo en, también son constantes; un parámetro de bucle es una constante dentro del bucle correspondiente; un subcomponente o porción de una constante es una constante.

enlaces externos