In termini molto semplici, ciò che rende un programma multipiattaforma è la tua capacità di prendere le fonti da un ambiente, compilarle in un altro e far funzionare il prodotto finito come previsto.
In termini meno semplici, sta avendo una sovrapposizione completa tra ciò che il programma si aspetta sia disponibile e ciò che gli ambienti di destinazione forniscono. Una volta che fai qualcosa che rende la sovrapposizione inferiore al 100%, come l'uso di una libreria specifica per l'ambiente o di una lingua con comportamento indefinito, hai legato il tuo programma agli ambienti che possono fornire funzionalità non sovrapposte.
("Piattaforma" è un po 'una parola soffocante: le persone possono parlare di Windows e Unix come piattaforme o Linux, OS X, BSD e Solaris come piattaforme anche se sono tutte nominalmente Unix. sopra su architetture hardware diverse e le cose diventano ancora più nebulose. Detto questo, inizierò a usare la parola.)
Fortunatamente, esistono degli standard per facilitare questo problema:
Lingue. Stai scrivendo C ++, che è stato prima standardizzato dall'ISO nel 1998. Qualsiasi programma scritto che sia conforme a quello standard può essere compilato ed eseguito con i risultati attesi su qualsiasi piattaforma con un compilatore e un runtime conformi. Non c'è limite alle dimensioni o alla sofisticazione del programma se non si discosta dallo standard. Se un programma che soddisfa in modo soddisfacente lo standard non funziona come previsto su una determinata piattaforma, l'implementazione della lingua su quella piattaforma diventa sospetta. Molte lingue hanno suite di test progettate con cura che possono essere utilizzate per verificare la conformità.
Java riceve una menzione speciale perché non solo standardizza una lingua, ma standardizza anche il codice oggetto, che rende i suoi programmi eseguibili ovunque senza ricompilazione. Ciò si ottiene spingendo il punto di conformità verso un livello aggiuntivo in una macchina virtuale personalizzata della piattaforma (o anche hardware) in grado di eseguire il codice dell'oggetto.
API. Le chiamate che fai per fare in modo che il tuo programma faccia certe cose possono essere standardizzate. Come le lingue, queste API e le librerie che le implementano possono essere configurate per comportarsi come i chiamanti si aspettano di utilizzare un'implementazione sottostante adatta per una piattaforma particolare. Una di queste API è lo standard POSIX dell'IEEE, che è nato come un modo per arginare la frammentazione che stava accadendo a Unix durante gli anni '80 . (Ero in giro allora, questo aspetto non era divertente.) Definendo chiamate e comportamenti standard, i venditori di sistemi potevano dare ai loro clienti la certezza che la migrazione al loro sistema operativo non avrebbe comportato enormi quantità di lavoro come nel passato. POSIX è stato ampiamente adottato ed è ancora ampiamente utilizzato quasi 30 anni dopo.
Ho realizzato numerosi progetti che hanno seguito pedissequamente gli standard perché sapevo che avrebbero dovuto essere eseguiti su piattaforme multiple. Quello che ho ottenuto per i miei problemi era il codice che funzionava ovunque avessi programmato di eseguirlo e piacevolmente mi ha sorpreso su alcuni dei quali non avevo.