# Incompatibilità del software

L'incompatibilità del software è una caratteristica di componenti o sistemi software destinati a funzionare in modo cooperativo o indipendente che non possono funzionare correttamente insieme sullo stesso computer o su computer diversi collegati da una rete informatica. È possibile che alcuni componenti o sistemi software siano compatibili in un ambiente e incompatibili in un altro.

## Esempi
### Deadlock

Considera i seguenti programmi sequenziali:
Un particolare programma potrebbe utilizzare una stampante (risorsa A) e un file (risorsa B) per stampare il file.
Se diversi programmi (P1,P2,P3, ...) funzionano contemporaneamente, il primo ad essere eseguito bloccherà gli altri fino al rilascio delle risorse e i programmi verranno eseguiti a turno e non ci saranno problemi. Non fa alcuna differenza se viene utilizzato un sistema monoprocessore o multiprocessore, poiché è l'allocazione delle risorse che determina l'ordine di esecuzione.
Si noti, tuttavia, che i programmatori, in generale, nonostante esistano linee guida, non sono vincolati a scrivere programmi seguendo un preciso standard. Una variante del programma precedente può essere:
Le risorse A e B sono le stesse dell'esempio precedente, non semplicemente variabili vincolate, altrimenti i programmi sarebbero identici.
Come prima, se ci sono diversi programmi di questo tipo, Q1,Q2,Q3 che vengono eseguiti contemporaneamente utilizzando le risorse di prima, non ci saranno problemi.
Tuttavia, se diversi P sono impostati per essere eseguiti contemporaneamente a diversi Q, può verificarsi una condizione di stallo. Si noti che non si verifica sicuramente, ma potrebbe verificarsi.
Ora né P né Q possono procedere $^1$ .
Questo è un esempio in cui i programmi possono dimostrare incompatibilità.

### Incompatibilità dell'interfaccia

Un altro esempio potrebbe essere quello in cui un componente software fornisce servizi a un altro. L'incompatibilità potrebbe essere semplice come un cambiamento nell'ordine dei parametri tra il componente software che richiede il servizio e il componente che fornisce il servizio: si tratta di incompatibilità di interfaccia. Questo potrebbe essere considerato un bug, e a volte risulta difficile da rilevare in alcuni sistemi. Alcune incompatibilità di interfaccia possono essere facilmente scovate durante la fase di build, in particolare per i sistemi fortemente tipizzati, altre potrebbero essere difficili da trovare e potrebbero essere rilevate solo in fase di esecuzione, mentre altre ancora potrebbero essere praticamente impossibili da rilevare senza un'analisi dettagliata del programma.
Considera il seguente esempio:
Una variante di Q (Q') ha un comportamento simile, con le seguenti differenze:
Se P non chiama mai Q con y impostato su 100, utilizzare invece Q' è un calcolo compatibile. Tuttavia, se P chiama Q con y impostato su 100, l'utilizzo di Q' porterà invece a un calcolo non terminato.
Se assumiamo inoltre che f(x) abbia un valore numerico, allora la componente Q'' definita come:
potrebbe causare un comportamento problematico. Se P ora chiama Q'' con y = 101, i risultati del calcolo non saranno corretti, ma potrebbero non causare un errore del programma. Se P chiama Q'' con y = 102, i risultati sono imprevedibili e potrebbe verificarsi errore, probabilmente a causa della divisione per zero o di altri errori come l'overflow aritmetico . Se P chiama Q ' con y = 103, nel caso in cui P utilizzi il risultato in un'operazione di divisione, potrebbe verificarsi un errore di divisione per zero.
Questo esempio mostra come un programma P1 può essere sempre compatibile con un altro Q1, ma possono essere costruiti altri programmi Q1' e Q1 '' tali che P1 e Q1' sono talvolta incompatibili, e P1 e Q1 '' sono sempre incompatibili.

### Incompatibilità delle prestazioni

A volte i programmi P e Q possono essere eseguiti sullo stesso computer e la presenza di uno inibisce le prestazioni dell'altro. Ciò può verificarsi in particolare quando il computer utilizza la memoria virtuale. Il risultato potrebbe essere che si verifichi un esaurimento del disco e che uno o entrambi i programmi abbiano prestazioni notevolmente ridotte. Questa forma di incompatibilità può verificarsi se P e Q sono destinati a cooperare, ma può anche verificarsi se P e Q non sono completamente correlati ma semplicemente funzionano contemporaneamente. Un caso potrebbe essere se P è un programma che produce file di output di grandi dimensioni, che vengono archiviati nella memoria principale, e Q è un programma antivirus che esegue la scansione di molti file sul disco rigido. Se viene utilizzata una cache di memoria per la memoria virtuale, è possibile che i due programmi interagiscano negativamente e le prestazioni di ciascuno verranno drasticamente ridotte.
Per alcuni programmi P e Q la compatibilità delle prestazioni può dipendere dall'ambiente in cui vengono eseguiti. Potrebbero essere sostanzialmente incompatibili se eseguiti su un computer con memoria principale limitata, ma potrebbe essere possibile eseguirli in modo soddisfacente su una macchina con più memoria. Alcuni programmi invece potrebbero presentare prestazioni incompatibili nella maggior parte degli ambienti.