No, los compiladores no son el tipo de software más difícil de desarrollar. El tipo de software más difícil de desarrollar es el software en tiempo real, de alto rendimiento y vital para el control de dispositivos físicos.
Cuando era estudiante universitario, era común que los estudiantes de tercer año desarrollaran un compilador Pascal durante un curso de un semestre.
Los compiladores se descomponen en un front-end y back-end.
- ¿Cómo describirías la arquitectura cliente-servidor en términos simples?
- ¿Cuál es su opinión sobre Atom (editor de texto)?
- ¿Se utiliza el término API de forma ambigua y cómo?
- ¿Cuál es mejor para ser utilizado como máquina de desarrollo, Fedora o Arch?
- ¿Cuáles son algunos proyectos de software que incluyen álgebra lineal, cálculo y otras matemáticas incluidas en CS?
El front end toma el código fuente, lo tokeniza, analiza los tokens y genera una representación interna del resultado, generalmente un árbol de sintaxis abstracta. Los desafíos en la parte frontal incluyen una salida de error significativa y un análisis inequívoco de la entrada. Para algunos idiomas esto es fácil: la gramática BNF para Pascal se ajusta en un par de páginas. Pascal – Sintaxis en notación BNF Contraste esto con C ++ que es increíblemente difícil de analizar. (Veo esto como una gran debilidad del lenguaje). ¿Existe una gramática estándar de C ++?
El back-end toma el árbol de sintaxis abstracta y lo traduce a código de máquina que se puede ejecutar en la arquitectura de destino. Crear un back-end básico es tedioso pero relativamente simple. Se vuelve difícil cuando comienzas a tratar de optimizar, especialmente con despacho múltiple, ejecución especulativa, múltiples núcleos, coherencia de caché … La optimización correcta de la salida requiere un análisis picayune de la hoja de datos del procesador y mucho análisis.
El software en tiempo real, de alto rendimiento y vital para controlar dispositivos físicos es difícil porque:
- En tiempo real significa que debe tener un rendimiento determinista para todas las condiciones. No quiere que el piloto automático de su avión de reacción se comporte de manera irregular bajo la lluvia. Los dispositivos físicos en tiempo real + significan que generalmente no puede usar un punto de interrupción para depurar el programa: ¡esa máquina de escáner CAT continuará bombeando rayos X mientras entra en una función!
- Alto rendimiento en este contexto significa que está cerca del límite de lo que puede hacer el procesador; está limitado en el registro que puede generar sin cargar el sistema, de modo que no se puede lograr en tiempo real.
- Crítico para la vida significa que las personas pueden morir si el software no funciona. Trabajé en una empresa de Wall Street y, en voz baja, enfatizaron que su tasa de error de software tenía que ser inferior a uno en un millón. Inapropiadamente, me reí: ¡el último lugar donde trabajé fue en sistemas de radiocomunicación de emergencia, donde validamos las tasas de error a menos de uno en mil millones!
- Los dispositivos físicos exhiben todo tipo de comportamiento inesperado: stiction, resonancia mecánica, incluidos subarmónicos, desgaste, envejecimiento, temperatura.
Mi madre quería que yo fuera médico. No quería hacer eso porque no quería tener un mal día y matar a alguien. Es curioso, ahora trabajo en software vital donde un mal día podría matar a muchas personas. Y soy muy consciente de eso.