Eliminación de código muerto

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda

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[editar]

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 público 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[editar]

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[editar]

Referencias[editar]

  1. «Código muerto» (en español). Consultado el 17 de enero de 2013.
  2. «FUNDAMENTOS DE OPTIMIZACIÓN» (en español). Consultado el 17 de enero de 2013.
  3. Hongwei. «Page 1 Dead Code Elimination throughDependent Types» (en inglés). 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[editar]

  • 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[editar]