Eliminación de código muerto

En programación, la eliminación de código muerto es una técnica de optimización de software comúnmente llevada a cabo de forma automática por un compilador optimizador que consta en eliminar cualquier tipo de código muerto, código inalcanzable, código redundante y almacenamiento muerto.[1][2] Resulta importante eliminar este tipo de código por varias razones entre las que se enumeran: ahorrar tiempo de cómputo innecesario, evitar accesos a memoria innecesarios y ejecutar código que no se utilice ya que puede arrojar excepciones.[3]

Algoritmos

Históricamente la eliminación de código muerto fue llevada a cabo mediante la información que se obtiene de un análisis de flujo de datos.[4] Luego se publicó un artículo donde se mostraba esta técnica mediante static single assignment form.[5] Más tarde se mejoró el algoritmo removiendo las operaciones de flujo de control innecesarias.[6]

Ejemplo

Suponiendo el siguiente trozo de código:

int foo() {
   int a = 24;
   int b = 25; // almacenamiento muerto
   int c = a << 2;
   if (true) //código muerto
       c = a << 2; //código redundante
   return c;
   b = 24; // código inalcanzable
}

Dado que presenta varios errores una eliminación de código muerto debería de dejar el código de la siguiente manera:

int foo() {
   int a = 24;
   int c = a << 2;
   return c;
}

Dependiendo de que algoritmo se usó y de que forma se realice el código resultante puede variar. Utilizando otras técnicas de optimización como el plegamiento de constantes y la propagación de constantes de forma exhaustiva el código se podría llegar a reducir a lo siguiente:

int foo() {
   return 24 << 2;
}

O dependiendo del plegamiento y otras técnicas de optimización se podría calcular 24<<2 e incluso eliminar la función y reemplazar cada llamada a la misma, por ese valor.

Véase también

Referencias

  1. «Código muerto». Archivado desde el original el 20 de julio de 2013. Consultado el 17 de enero de 2013.
  2. «FUNDAMENTOS DE OPTIMIZACIÓN». Archivado desde el original el 2 de enero de 2010. Consultado el 17 de enero de 2013.
  3. Hongwei. «Page 1 Dead Code Elimination throughDependent Types» (en inglés). Archivado desde el original el 9 de marzo de 2012. Consultado el 17 de enero de 2013.
  4. Ken Kennedy. A Survey of Data-flow Analysis Techniques. In Program Flow Analysis, Muchnick and Jones (editors), Prentice-Hall, 1981.
  5. Ron Cytron, Jeanne Ferrante, Barry Rosen, and Ken Zadeck. Efficiently Computing Static Single Assignment Form and the Program Dependence Graph. ACM TOPLAS 13(4), 1991.
  6. Keith D. Cooper and Linda Torczon, Engineering a Compiler, Morgan Kaufmann, 2003, pages 498ff.

Bibliografía

  • Aho, Alfred V.; Sethi, Ravi; Ullman, Jeffrey D. (1986). Compilers - Principles, Techniques and Tools. Addison Wesley Publishing Company. ISBN 0-201-10194-7.
  • Grune, Dick; Bal, Henri E.; Jacobs, Ceriel J.H.; Langendoen, Koen G. (2000). Modern Compiler Design. John Wiley & Sons, Inc. ISBN 0-471-97697-0.

Enlaces externos

Este artículo ha sido escrito por Wikipedia. El texto está disponible bajo la licencia Creative Commons - Atribución - CompartirIgual. Pueden aplicarse cláusulas adicionales a los archivos multimedia.