Senza utilizzare una macchina virtuale si verifica sempre lo stesso problema: molte funzionalità che è possibile utilizzare su un sistema operativo sono specifiche per tale sistema operativo.
Questo perché nessuno ha mai seriamente pensato di definire solo un modo per fare le stesse cose, principalmente perché avere DirectX10 per esempio è un vantaggio rispetto ad altri sistemi operativi.
Direi che è piuttosto facile scrivere un'applicazione multipiattaforma in grado di girare su MacosX e Linux solo perché puoi sfruttare molte cose che sono in grado di girare su entrambe le macchine (pensa a X11 o GTK) e entrambi hanno Unix sotto il cofano. Di solito con qualche sforzo riesci a far funzionare i tuoi programmi anche su Windows (magari con MinGW o Cygwin) anche se manca la compatibilità di alcune funzionalità.
Inoltre i diversi sistemi operativi hanno implementazioni effettivamente diverse per le stesse cose (si pensi a socket, sistema io, grafica, audio, ecc.) Quindi è impossibile scrivere solo una versione che funziona ovunque: si è costretti a scrivere un versione diversa per qualsiasi sistema operativo per il quale si prevede di rilasciare il programma.
La risposta breve è: no, non è possibile senza un linguaggio VM a meno che non si limiti le funzionalità del programma a un piccolo insieme di funzionalità comuni.
(sto supponendo che stiamo parlando di C/C++ solo perché di solito le altre lingue sono gestite da un solo gruppo di persone ciascuno che si prende cura di rilasciare il più cross-platform possibile)
I non vedo davvero alcun vero punto negativo nel fare affidamento su una macchina virtuale. Al giorno d'oggi i computer sono in grado di eseguire macchine virtuali senza grandi problemi di velocità. Quindi avere qualcosa che si preoccupa di posizionare uno strato di astrazione tra te e il sistema operativo ti consentirà di fare cose avanzate semplicemente conoscendo un modo per farlo. Penso che un compromesso di velocità di qualcosa come Java sia ampiamente accettabile ... hanno appena fatto cosa dovresti fare quando provi a scrivere una complessa applicazione multipiattaforma.
solo un fatto: ho davvero avuto in dolore quando si cerca di porto una macchina virtuale che ho scritto da Unix (Linux/OSX) a Windows a causa di freopen
funzione .. purtroppo di Windows gestisce i flussi in modo diverso rispetto ad altri sistemi operativi in modo MinGW mancava questa funzione e ho dovuto trovare un modo per aggirare questo problema ..
Come si definisce cross-platform? Ad esempio, i programmi ANSI C possono essere compilati su molte piattaforme. –
Di quale tipo di funzionalità ha bisogno il tuo programma? Quali piattaforme vuoi supportare? Se ti affidi alle funzionalità specificate in POSIX, il tuo programma sarà trasferibile a molti unic, ma potrebbe non essere compilato su Windows - almeno, probabilmente non lo farà a meno che tu non faccia affidamento sul sottoinsieme di POSIX supportato da Windows. Un altro modo per rendere il vostro programma portatile è di affidarsi a un livello di astrazione che si prende cura delle cose specifiche piattaforma per voi, come rete e filo strutture di Qt. Il problema con questo approccio è che il tuo programma sarà nel migliore dei casi portatile ai sistemi supportati dal tuo livello di astrazione. – George
Ad esempio, un programma che utilizza un socket. Ha diverse implementazioni in Linux o Windows. – rigon