Eliminación de código muerto

De Wikipedia, la enciclopedia libre

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]

La eliminación del código inactivo puede reducir el tiempo de procesamiento y carga, y puede conducir a una reducción en el uso de recursos, como la cantidad de bytes transferidos[4]​.

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.[5]​ Luego se publicó un artículo donde se mostraba esta técnica mediante static single assignment form.[6]​ Más tarde se mejoró el algoritmo removiendo las operaciones de flujo de control innecesarias.[7]

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». 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. Malavolta, Ivano et al. “JavaScript Dead Code Identification, Elimination, and Empirical Assessment.” IEEE transactions on software engineering 49.7 (2023): 3692–3714. Web.
  5. Ken Kennedy. A Survey of Data-flow Analysis Techniques. In Program Flow Analysis, Muchnick and Jones (editors), Prentice-Hall, 1981.
  6. 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.
  7. 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]