¿Qué deben saber todos los ingenieros de software acerca de los compiladores?

  • Los compiladores saben de lo que están hablando; Si te advierte sobre algo, será mejor que lo veas.
  • Los compiladores no saben lo que estás tratando de hacer; solo porque su código se compila incluso con -Werror y -Wall, no significa que todo esté bien en su código. Invierta en un analizador estático y prepárese para iniciar gdb.
  • Los compiladores a veces tienen errores (este blog ocasionalmente los discute: Integrado en la Academia). Pero ese comportamiento extraño en su programa es menos probable que sea uno de ellos. Si así lo cree, le sugiero que tome un descanso, lea sobre comportamientos indefinidos y modifique los indicadores de optimización. Ahora constrúyalo nuevamente; Mira, te dije que eras tú.
  • Los compiladores modernos son bastante buenos para optimizar el código. Esto significa que no tiene que preocuparse mucho por las optimizaciones simples. Pero esto no significa que pueda acceder a una matriz multidimensional en el orden principal de la columna C ++: matrices multidimensionales; Rendimiento mediante la asignación de columna principal frente a fila principal. – Clases y fragmentos de código
  • Y, sobre todo, todos deberían estar familiarizados con los indicadores básicos utilizados por sus compiladores.

  • Utilice tantos indicadores de error / advertencia como sea posible y aplique el nivel de cumplimiento más estricto (no se compila). Esto apesta al principio, pero te acostumbras pronto y te convierte en un programador más deliberado.
  • No optimices nada a nivel micro. Los compiladores lo hacen mejor para todo lo que es subjuego / supercomputación, y si estás en esos dominios, supongo que sabes lo que estás haciendo. Para todos los demás, primero verifique sus algoritmos, y solo luego perfile su código para la micro optimización (perfile agresivamente y solo optimice cosas que ocupan más del 20% de su tiempo). El objetivo aquí es la localidad de caché y el flujo de memoria mínimo y predecible.

Todo ingeniero de software debería haber escrito un pequeño compilador al menos una vez durante su vida. Esto definitivamente no es una pérdida de tiempo. Uno entendería mucho mejor de qué tipo de optimización son capaces y cuáles son sus limitaciones. Como beneficio adicional, esto también ayuda a comprender muchos conceptos relacionados, como JIT, intérpretes y algunos algoritmos de optimización.