Articulo de referencia

Aliasing (informática)

En informática , el aliasing describe una situación en la que se puede acceder a una ubicación de datos en la memoria mediante diferentes nombres simbólicos en el programa. Por ...

En informática , el aliasing describe una situación en la que se puede acceder a una ubicación de datos en la memoria mediante diferentes nombres simbólicos en el programa. Por lo tanto, modificar los datos mediante un nombre modifica implícitamente los valores asociados a todos los nombres con alias, lo cual puede resultar inesperado para el programador. En consecuencia, el aliasing dificulta considerablemente la comprensión, el análisis y la optimización de los programas. Los analizadores de aliasing tienen como objetivo generar y calcular información útil para comprender el aliasing en los programas.

Punteros con alias

El aliasing puede ocurrir en cualquier lenguaje que permita referirse a una misma ubicación de memoria con más de un nombre (por ejemplo, con punteros ). Este es un problema común en las funciones que aceptan argumentos de puntero, y su tolerancia (o la falta de ella) al aliasing debe documentarse cuidadosamente, especialmente para las funciones que realizan manipulaciones complejas en las áreas de memoria que se les pasan.

Alias ​​especificado

En algunos casos, puede ser deseable un comportamiento de alias controlado (es decir, un comportamiento de alias especificado, a diferencia del habilitado por la disposición de la memoria en C). Es una práctica común en Fortran . El lenguaje de programación Perl especifica, en algunas construcciones, un comportamiento de alias, como en los bucles. Esto permite modificar ciertas estructuras de datos directamente con menos código. Por ejemplo,foreach

mi @array = ( 1 , 2 , 3 );foreach my $element ( @array ) { # Incrementa $element, modificando automáticamente # @array, ya que $element tiene un alias # para cada uno de los elementos de @array a su vez. $element ++ ; }imprimir "@array \n" ;

El resultado será "2 3 4". Si se quisiera evitar los efectos de alias, se podría copiar el contenido de la variable de índice en otra y modificar la copia.

Conflictos con la optimización

Los optimizadores a menudo tienen que hacer suposiciones conservadoras sobre las variables cuando es posible el aliasing. Por ejemplo, conocer el valor de una variable (como xes 5) normalmente permite ciertas optimizaciones (como la propagación de constantes ). Sin embargo, el compilador no puede usar esta información después de una asignación a otra variable (por ejemplo, en C, *y = 10) porque podría ser que *ysea un alias de x. Este podría ser el caso después de una asignación como y = &x. Como efecto de esta asignación a *y, el valor de xtambién cambiaría, por lo que propagar la información de que xes 5 a las instrucciones siguientes *y = 10sería potencialmente incorrecto (si *yes de hecho un alias de x). Sin embargo, si hay información sobre punteros, el proceso de propagación de constantes podría hacer una consulta como: ¿puede xser un alias de *y? Entonces, si la respuesta es no, x = 5se puede propagar de forma segura.

Otra optimización afectada por el aliasing es la reordenación del código. Si el compilador decide que xno es alias de *y, entonces el código que usa o cambia el valor de xpuede moverse antes de la asignación *y = 10, si esto mejoraría la planificación o permitiría realizar más optimizaciones de bucle .

Para permitir tales optimizaciones de manera predecible, el estándar ISO para el lenguaje de programación C (incluida su edición más reciente C99 , ver sección 6.5, párrafo 7) especifica que es ilegal (con algunas excepciones) acceder a la misma ubicación de memoria usando punteros de diferentes tipos. Por lo tanto, un compilador puede asumir que tales punteros no tienen alias. Esta regla, conocida como regla de alias estricto , a veces permite aumentos impresionantes en el rendimiento, [ 1 ] pero se sabe que rompe código que de otro modo sería válido. Varios proyectos de software violan intencionalmente esta parte del estándar C99. Por ejemplo, Python 2.x lo hizo para implementar el conteo de referencias , [ 2 ] y requirió cambios en las estructuras de objetos básicas en Python 3 para habilitar esta optimización. El kernel de Linux hace esto porque el alias estricto causa problemas con la optimización del código en línea. [ 3 ] En tales casos, cuando se compila con gcc-fno-strict-aliasing , se invoca la opción para evitar optimizaciones no deseadas que podrían producir código inesperado.

Aliasing de hardware

El término aliasing también se utiliza para describir la situación en la que, debido a una decisión de diseño de hardware o a una falla del hardware, uno o más de los bits de dirección disponibles no se utilizan en el proceso de selección de memoria. [ 4 ] Esto puede ser una decisión de diseño si hay más bits de dirección disponibles de los necesarios para admitir el o los dispositivos de memoria instalados. En caso de falla, uno o más bits de dirección pueden cortocircuitarse entre sí, o pueden ser forzados a tierra (lógica 0) o a la tensión de alimentación (lógica 1).

Ejemplo

Para este ejemplo, suponiendo un diseño de memoria con 8 ubicaciones, se requieren solo 3 líneas de dirección (o bits , ya que = 8). Los bits de dirección (denominados A2 a A0) se decodifican para seleccionar ubicaciones de memoria únicas de la siguiente manera, al estilo de un contador binario estándar :

En la tabla anterior, cada una de las 8 combinaciones únicas de bits de dirección selecciona una ubicación de memoria diferente. Sin embargo, si un bit de dirección (por ejemplo, A2) se conectara a tierra, la tabla se modificaría de la siguiente manera:

En este caso, dado que A2 siempre es cero, las primeras cuatro ubicaciones de memoria se duplican y aparecen nuevamente como las siguientes cuatro. Las ubicaciones de memoria de la 4 a la 7 se han vuelto inaccesibles.

Si este cambio se produjera en un bit de dirección diferente, los resultados de la decodificación serían distintos, pero en general el efecto sería el mismo: la pérdida de un solo bit de dirección reduce a la mitad el espacio de memoria disponible, con la consiguiente duplicación (aliasing) del espacio restante.

Véase también

  • Suavizado de bordes
  • Sinónimos para los usos de la palabra cuando se aplica al procesamiento de señales, incluidos los gráficos por computadora.

Referencias

  1. Mike Acton (01/06/2006). "Comprendiendo el alias estricto" .
  2. Neil Schemenauer (17 de julio de 2003). "Alias ​​estrictos ANSI y Python" .
  3. Linus Torvalds (26-02-2003). "Re: Compilación inválida sin -fno-strict-aliasing" .
  4. Michael Barr (27-07-2012). "Pruebas de memoria basadas en software" .
  • Aliasing, conversiones de punteros y gcc 3.3 : artículo informativo en la lista de correo de NetBSD.
  • Análisis de alias basado en tipos en C++ – Artículo informativo sobre el análisis de alias basado en tipos en C++
  • Comprender el alias estricto en C/C++ : artículo sobre alias estricto originalmente de la wiki para desarrolladores de Boost.