Immagino che ci siano molti modi per rispondere..
Dall'altra risposta "Input, Struttura, Azione e Risultati". Questo è corretto per il software individuale, come un'applicazione.
Può non dirvi molto. Forse siete alla ricerca di librerie individuali, per un'applicazione.
Ma questo vale anche per una visione globale del computer. Quindi all'incirca hai:
- Sistema operativo (OS)
- Applicazioni
In passato avresti avuto il controllo completo dell'input e dell'output dell'hardware, quindi non avresti "avuto bisogno" di un sistema operativo (vale ancora per i microcontrollori), in quanto l'OS era immaturo per gli standard moderni.
Ora, si passa sempre attraverso il sistema operativo, per input e output, per due motivi. Ti piace essere indipendente dall'hardware (e i "driver" forniscono questo, possono rigorosamente non essere parte del sistema operativo, ma spesso, almeno quelli fondamentali sono in bundle con). La seconda ragione è il multi-tasking. O anche il task-switching, che è più comunemente fatto in Android (mentre il multi-window è anche disponibile, e le notifiche lo sono anche in un certo senso). Il sistema operativo deve controllare chi ha accesso allo schermo (o quale parte in quali momenti).
L'interfaccia utente, che è parte del sistema operativo in Windows e Mac OS, non deve esserlo strettamente. In Unix/Linux, è un componente, chiamato X Windows (o Wayland o Mir). Per questa ragione, esso e altre cose (come OpenSSL per la crittografia), sono strettamente "software di sistema". Non c'è un confine chiaro a ciò che dovrebbe essere parte del software di sistema o del sistema operativo (si veda ad esempio United States v. Microsoft Corp. sul fatto che un browser web debba farne parte, allora i browser servivano per visualizzare le pagine, ora sono una parte dell'interfaccia utente principale (una delle tre opzioni) di tutti i principali sistemi operativi).
Anche le utility sono parti del software di sistema, non normali "app", a seconda di come si intende quella parola, ma per configurare parti del sistema operativo.
Tutti questi singoli componenti software possono essere in un unico pezzo, ma di solito non lo sono, con un eseguibile principale (".exe"), che include librerie collegate dinamicamente (.dll o .so), che possono essere distribuite con l'app o essere parte del software di sistema (come la libreria C, una specie di alternativa e più piccola di JVM e CLR qui sotto).
JVM e CLR (parte di .NET) sono una sorta di librerie o software di sistema... e con le parti associate ti danno un'interfaccia utente o una piattaforma che è in un modo simile ai browser web ora, un sistema operativo all'interno di un sistema operativo..