Parlando come sviluppatore per un produttore di apparecchiature di rete conosciuto in tutto il mondo, direi C e C++.
Per quanto riguarda i motivi:
- controllo della gestione delle risorse: di solito ci si trova a sviluppare in un ambiente con risorse limitate (CPU, RAM, storage). C e C++ hanno l'indiscutibile vantaggio di non farti "pagare" ciò che non ti serve (in termini di risorse), il tutto mentre sono linguaggi di programmazione collaudati adatti anche a problemi grandi e complessi. Non sono né i più belli né i più facili linguaggi di programmazione in circolazione per questo scopo, ma sono ragionevolmente buoni e danno allo sviluppatore il completo controllo sull'allocazione e la gestione delle risorse;
- supporto di terze parti: i protocolli di rete di basso livello sono difficili da implementare, difficili da testare in ambienti reali e difficili da farli interoperare correttamente con ciò che c'è là fuori (cioè non credere che tutto funzioni perfettamente secondo le specifiche -- è software e quindi ha dei bug, anche sottili). Quindi non si può pensare di sviluppare e mantenere tutto in-house. Ci sono un sacco di implementazioni personalizzabili pronte all'uso dei protocolli di rete, di solito fatte in C o C++, che possono essere concesse in licenza da terze parti e ti fanno risparmiare un sacco di tempo. Per non parlare del supporto hardware;
- sul campo: alcuni codici C/C++ avevano sulle spalle 15+ anni di test sul campo e correzione di bug, che avrebbero dovuto essere rifatti se buttati via, con una perdita enorme e nessun chiaro vantaggio. C e C++ erano le migliori opzioni all'epoca, quindi è quello che si usa ancora oggi;
- disponibilità di sviluppatori: ci sono un sacco di sviluppatori senior là fuori con 10+ anni di esperienza C/C++. Quando si sta facendo un firmware da mettere in produzione, si vogliono sviluppatori con esperienza e un solido background.