Hablando como desarrollador de un fabricante de equipos de red conocido en todo el mundo, diría que C y C++.
En cuanto a las razones:
- Control de la gestión de recursos: normalmente te encuentras desarrollando en un entorno con recursos limitados (CPU, RAM, almacenamiento). C y C++ tienen la ventaja indiscutible de no hacerte «pagar» por lo que no necesitas (en términos de recursos), siendo además lenguajes de programación probados y adecuados también para problemas grandes y complejos. No son ni los lenguajes de programación más bonitos ni los más fáciles que existen para este propósito, pero son razonablemente buenos y dan al desarrollador el control completo sobre la asignación y gestión de recursos;
- soporte de terceros: los protocolos de red de bajo nivel son difíciles de implementar, difíciles de probar en entornos reales y difíciles de conseguir que interoperen correctamente con lo que hay (es decir, no creas que todo funciona perfectamente según las especificaciones – es software y por lo tanto tiene errores, incluso sutiles). Por lo tanto, no se puede pensar en desarrollar y mantener todo internamente. Hay un montón de implementaciones de protocolos de red personalizables y listas para usar, por lo general hechas en C o C++, que pueden ser licenciadas por terceros y le ahorran mucho tiempo. Por no hablar de la compatibilidad con el hardware;
- pruebas de campo: algunos códigos en C/C++ llevaban más de 15 años de pruebas de campo y corrección de errores, que tendrían que volver a hacerse si se desechan, con una enorme pérdida y sin ninguna ventaja clara. C y C++ eran las mejores opciones en ese momento, así que eso es lo que se sigue utilizando hoy en día;
- Disponibilidad de desarrolladores: hay muchos desarrolladores senior con más de 10 años de experiencia en C/C++. Cuando haces un firmware para ponerlo en producción, quieres desarrolladores con experiencia y una sólida formación.