stringtranslate.com

Calificador de tipo

Un calificador de tipo es una analogía con los constructores en la programación orientada a objetos .

Por idioma

C/C++

A partir de 2014 y C11 , hay cuatro calificadores de tipo en C estándar: const( C89 ), volatile( C89 ), restrict( C99 ) y _Atomic( C11 ); este último tiene un nombre privado para evitar conflictos con los 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++. Por lo tanto, en C++, el término " tipo calificado por cv " (para const y volátil ) se usa a menudo para "tipo calificado", mientras que los términos " tipo calificado por c " y " tipo calificado por v " se usan cuando solo uno de los calificadores es relevante.

De estos, constes por lejos el más conocido y el más utilizado, ya que 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 la programación de bajo nivel y, aunque se usan ampliamente allí, rara vez los utilizan los programadores típicos. Sin embargo, durante un tiempo volatilealgunos programadores de C++ lo usaron para la sincronización durante el subprocesamiento, aunque esto se desaconsejó y ahora está roto en la mayoría de los compiladores.

D

En D, los constructores de tipo son const, immutable, shared, y 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 utiliza para datos compartidos en subprocesos múltiples (como volatilese usó brevemente para en C++). inoutes un comodín utilizado para permitir que las funciones que no modifican datos (y, por lo tanto, solo se ocupan del tipo no calificado de los 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 variable mediante uno o más especificadores de tipo y, opcionalmente, calificadores de tipo. Por ejemplo, una variable entera se puede declarar como:

entero x ; 

donde intes el especificador de tipo. Una variable entera sin signo se puede declarar como:

entero sin signo x ;  

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

constante int sin signo x ;   

donde constes un calificador de tipo, cuyo tipo calificado xes const unsigned inty el tipo no calificado es unsigned int.

Las declaraciones de variables tienen además un especificador de clase de almacenamiento opcional . En realidad, se trata de un tema aparte, distinto del tipo, aunque tambiénconst se considera que la declaración de una variable tiene implicaciones para la clase de almacenamiento, es decir, que se puede almacenar en una 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 los enlaces externos en variable volátil ). Se puede usar exactamente de la misma manera que consten las declaraciones de variables, punteros, referencias y funciones miembro y, de hecho, volatilea veces se usa para implementar una estrategia de diseño por contrato similar que Andrei Alexandrescu llama volatile-corrección, [2] aunque esto es mucho menos común que const-corrección. El volatilecalificador también se puede eliminar con const_cast, y se puede combinar con el constcalificador como en este ejemplo:

// Establezca una referencia a un registro de hardware de solo lectura que esté asignado en una ubicación de memoria codificada. const volátil int & hardwareRegister = * reinterpret_cast < int *> ( 0x8000 );      int currentValue = hardwareRegister ; // Leer la ubicación de la memoria int newValue = hardwareRegister ; // Leerlo nuevamente        hardwareRegister = 5 ; // Error, no se puede escribir en una ubicación constante   

Como hardwareRegisteres volatile, no hay garantía de que contenga 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 inmutable.

Historia

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

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

constfue adoptado en C como parte de la estandarización, y aparece en C89 (y versiones posteriores) junto con otro calificador de tipo, volatile, que fue inventado por el comité de estándares ANSI C (X3J11). [5] volatile apareció en 1985; [6] y un uso temprano fue en la compilación del núcleo UNIX para MIPS , para permitir la compilación optimizada al evitar que se apliquen optimizaciones habituales a variables volátiles. [7] Un calificador adicional, noalias, fue sugerido en la reunión de diciembre de 1987 del comité X3J11, pero fue rechazado; su objetivo finalmente se cumplió con el restrictcalificador en C99. La motivación para noaliasera complementaria a volatile, es decir, que indicaba que incluso se podían realizar optimizaciones normalmente inseguras. Ritchie no apoyaba mucho los calificadores de tipo, argumentando que no "tenían su peso", pero en última instancia no defendió su eliminación del estándar; [8] sin embargo, se opuso noalias, y se eliminó del borrador.

Java no tiene calificadores de tipo, y se omite llamativamente 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 de manera consistente habría roto la compatibilidad. [9] Sin embargo, Java inicialmente dejó abierta la posibilidad de implementar const, notable en que constes una palabra reservada , aunque en realidad no se usa como palabra clave . En cambio, Java tiene la palabra clave orientada a objetos final, que se usa 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 de un enlace de nombre ), no de un tipo. Por lo tanto, dichos lenguajes tienen identificadores constantes (que corresponden a "variables" que no varían) con una única asignación, pero no tienen una noción de corrección constante: dado que la constancia no es parte del tipo, no hay posibilidad de que haya un desajuste de tipos. Algunos 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 su uso.

Referencias

  1. ^ C11: El nuevo estándar C, Thomas Plum
  2. ^ "Generic<Programming>: volátil: el mejor amigo del programador multiproceso Corrección volátil o cómo hacer que su compilador detecte las condiciones de carrera por usted" por Andrei Alexandrescu en el Foro de expertos de C++ del C/C++ Users Journal
  3. ^ Bjarne Stroustrup , "Extensiones del concepto de tipo del 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ág. 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 pequeñas adiciones y ajustes, por ejemplo, los calificadores de tipo const 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 de usuarios de sistemas UNIX europeos (EUUC) "El borrador del estándar ANSI para el lenguaje de programación C" por Mike Banahan, 13 de septiembre de 1985, tal como se publicó en el boletín del grupo de usuarios de sistemas UNIX australianos (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 añaden al costo de aprender y usar el lenguaje no se compensa con una mayor expresividad. 'Volatile', en particular, es un adorno para aplicaciones esotéricas, y se expresa mucho mejor por otros medios. Su principal virtud es que casi todos pueden olvidarse de él. 'Const' es al mismo tiempo más útil y más intrusivo; no se puede evitar aprender sobre él, debido a su presencia en la interfaz de la biblioteca. Sin embargo, no defiendo la extirpación de los calificadores, aunque sea solo porque es demasiado tarde".
  9. ^ JDK-4211070: Java debería soportar 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. Los parámetros formales del modo en de 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