Devi comprendere perché C è utile per i sistemi di basso livello, principalmente perché offre un compromesso tra il modo in cui funziona il computer e come gli umani possono capire lo stesso. Assembler sarebbe un linguaggio di sistema migliore, se noi meatbags potessimo capirlo ed essere produttivo in esso.
Quindi la chiave è che il livello di astrazione si adatta al punto debole tra non rallentare le cose dal punto di vista del computer e tenere le cose comprensibili dalle nostre.
In linea con questo, un nuovo linguaggio ipotetico farebbe esattamente le stesse cose di C, con poche astrazioni.
Ci sono alcune cose che il compilatore o gli strumenti potrebbero aiutarci - anche se, nota alcuni strumenti come la raccolta dei rifiuti, ci sono utili e teoricamente rendono il sistema più efficiente, ma in pratica rallentano e rendono sono imprevedibili e talvolta più difficili da lavorare. Posso immaginare le aree in cui un C migliorato sarebbe RAII (adoro questo in C ++, è fantastico, il compilatore mette le tue routine di de-allocazione dove le inseriresti!), E una migliore routine di stringhe - rendendo le stringhe delimitate da null aveva senso quando la memoria era molto costosa, ma nei sistemi in cui usiamo 2 byte per carattere, questa limitazione non è più in circolazione. Avrei una stringa preceduta da una dword per la lunghezza che dovrebbe migliorare un sacco di prestazioni. Nota che non andrei oltre: nessun riferimento a classi di stringhe o qualcosa di simile, e probabilmente non farei "classi", anche se introdurrei qualche forma di mini modulo che aiuta a incapsulare il codice correlato (e generato dal compilatore routine come per RAII).
Si potrebbe desiderare di avere alcune routine di localizzazione della memoria integrate, che aiutano con coerenza della cache della CPU, e forse una forma primitiva di threading - non così le persone possono abusarne generando fili e serrature volenti o nolenti, ma così devono pensare a cosa stanno facendo.
Penso che quest'ultimo aspetto sia importante in C, mentre possiamo aggiungere un carico di funzioni per semplificare la vita del programmatore, introducono tutte un sovraccarico, che viene aggravato dalle persone che creano più astrazioni usando quelle astrazioni in cui finisci con codice seriamente inefficiente, che la gente usa perché è "abbastanza veloce". Non è mai abbastanza veloce per la programmazione di sistemi di basso livello:)