2010-07-10 3 views
6

Ho cercato un po 'di letteratura sullo sviluppo di programmi multipiattaforma e non ho trovato nulla di veramente buono.Come scrivere un programma multipiattaforma?

Non sto cercando una macchina virtuale per multipiattaforma come Java.

C'è qualche libro o letteratura su questo?

+2

Come si definisce cross-platform? Ad esempio, i programmi ANSI C possono essere compilati su molte piattaforme. –

+3

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

+0

Ad esempio, un programma che utilizza un socket. Ha diverse implementazioni in Linux o Windows. – rigon

risposta

4

@Staffan e altri hanno dato consigli sterlina, quindi non ho intenzione di offrire una soluzione - suggerisco solo un approccio.

Ci sono molte soluzioni possibili e direi che una decisione importante è se si desidera o meno una GUI. In caso contrario, probabilmente si può andare con C. Con una GUI, andare con Java (cosa che non si vuole), o usare NetBEans come IDE con Qt per i widget.

Ma qualunque cosa tu faccia, penso che il più importante sia rilevare potenziali proneli il prima possibile. Se si utilizza C, è possibile utilizzare Splint o altri strumenti di analisi del codice statico che avvertiranno dei problemi di portabilità. Allo stesso modo, aumentare i livelli di avviso del compilatore al massimo dovrebbe aiutare.

Impostare un sistema di integrazione continua come Hudson per creare tutto regolarmente e assicurarsi di avere molti test di unità autometd (utilizzando CppUnit o simili) e utilizzare lo stesso test su ciascuna piattaforma, con i test rivolti ai problemi di portabilità.

Forse considerare Posix o utilizzare solo Ansi C o qualche altro linguaggio conforme agli standard.

Come si va sulla configurazione CI dipende da quanti potenziali obiettivi che hai. Forse è necessario eseguire ciascuno su un PC sepearte o in una VM sparate. Se si sceglie C o C++ si potrebbe essere soddisfatti utilizzando GCC sotto Cygwin in Windows e il C/C++ di vostra scelta

Vedi anche (bisogno di consigli su una buona uno gratuito?):

http://www.hookatooka.com/wpc/

e, naturalmente, http://www.google.com/search?hl=en&rls=com.microsoft%3Aen-sg&q=portable+code

1

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 ..

+1

@Jack: non è proprio vero. Utilizzando la compilazione condizionale in C o C++, è possibile scrivere un programma che utilizzerà le caratteristiche specifiche del sistema operativo e semplicemente compilare in modo diverso su ogni piattaforma. Ovviamente in tal caso lo sforzo può quasi essere lo stesso di scrivere due applicazioni. –

+2

Sì, ma non sta scrivendo un'applicazione multipiattaforma. Questo sta scrivendo due diverse applicazioni che si basano su alcuni componenti condivisi (multipiattaforma) che non utilizzano funzionalità avanzate. compilazione condizionale è un modo per compilare su molte piattaforme senza avere un vero e proprio programma di cross-platform (poiché, come si stato anche lo sforzo è quasi tanto quanto la scrittura 2 applicazioni) – Jack

+0

Ci sono molti programmi open-source che compilano su Windows e vari unix sistemi operativi, ad esempio, così, usando autoconf, per esempio, si può avere l'ambiente adattare in modo che possa compilare su praticamente qualsiasi combinazione di OS/hardware. –

0

Non esiste alcuna macchina virtuale di Java che funzioni su piattaforme diverse. Java ha diverse macchine virtuali che girano su piattaforme diverse in modo che un programma Java possa girare su ogni piattaforma. È una sorta di livello che rende i programmi Java in grado di funzionare ovunque.

Ad esempio un programma C può essere eseguito su Windows e Linux ma deve essere compilato con il compilatore corrispondente del sistema operativo su cui viene eseguita l'applicazione.

Ma in Java, non è necessario. Basta compilare la fonte e distribuire i file compilati pronti per essere eseguiti su qualsiasi piattaforma.

7

Direi che questo si riduce a:

  • Non utilizzando le funzioni non standard "Standard Library", in cui non standard dipende da ciò che si target piattaforme (sistemi compatibili POSIX-per esempio). Ad esempio, se si utilizza C non utilizzare popen() se si desidera che l'applicazione venga eseguita su sistemi non POSIX.
  • Assicurati di gestire correttamente l'endessess dove è necessario, ad es. quando si trasmettono dati sulla rete a un altro computer, eventualmente utilizzando un ordine di byte diverso.
  • Scrivi solo codice conforme, ad es. non dipendere dalle funzionalità specifiche di GCC/VC/name-your-compiler.

Su un livello più pratico il mio consiglio è:

  • Utilizzo tra librerie della piattaforma che astratta la funzionalità non standard si ha bisogno, o scrivere il codice per gestire tutte le piattaforme che come bersaglio.
  • E, in relazione al punto precedente, stare lontano dalle dipendenze non multipiattaforma. Per esempio. usa OpenGL invece di Direct3D e Qt/Gtk/qualunque invece del tuo toolkit nativo per le piattaforme.

EDIT: Non c'è più roba a cui pensare, come se non supponendo che / viene utilizzato come separatore di percorso, o fare ipotesi non valide su quali caratteri sono consentiti nei nomi di file.

0

Se si sceglie un linguaggio di scripting moderno (Tcl e Python sono due esempi sterling) è possibile scrivere programmi che funzionano quasi identicamente su tutte le piattaforme. Certo, dovrai fare piccole quote per una piattaforma o un'altra, ma è abbastanza facile da fare. Dai un'occhiata a quelle lingue per avere qualche ispirazione.

Non creerai il prossimo photoshop o sparatutto in prima persona con questi linguaggi, ma per la maggior parte dei comuni compiti di programmazione questi sono abbastanza adatti.

Se si desidera qualcosa di concreto, dare un'occhiata a http://tkdocs.com che mette in mostra il Tk toolkit in esecuzione su più piattaforme e con più lingue (Tcl, Ruby, Perl, Python)

+0

In realtà si può raddrizzare il prossimo Photoshop in gran parte Python e alcune estensioni C portatili per le prestazioni, circa l'80% di Adobe Lightroom e tutti i suoi plug-ins sono scritti in LUA. E Google ha una versione di Quake in esecuzione su JavaScript @ 30+ fps. –

2

Se non si utilizza un "codice di once, run anywhere" ambiente di sviluppo (in altre parole, un po 'del vostro codice deve essere personalizzato per ogni piattaforma presi di mira), poi assicurati che il tuo programma abbia davvero bisogno di essere eseguito su più piattaforme.

so di un programma che compilato in due versioni, una per Mac e una per Windows. Sebbene la maggior parte del codice fosse identica per entrambe le piattaforme, una parte era specifica per l'host O/S e le modifiche e i test necessari di frequente erano esclusivi per i due ambienti. Le vendite sono state del 98% Windows, 2% Mac, tuttavia le due versioni hanno richiesto sostanzialmente uguale tempo di progettazione/programmazione/test/documentazione. I proprietari hanno deciso che invece di dare la metà di ogni $ di futuro programmatore alla versione Mac per solo un ritorno del 2%, hanno semplicemente memorizzato quella versione. Le loro problematiche cross-platform sono immediatamente scomparse e la produttività dei loro programmatori è sostanzialmente raddoppiata (cosa che ha soddisfatto i clienti Windows).

2

ho chiesto un libro, ma nessuno di cui esso.

ho trovato un libro chiamato "Cross-piattaforma di sviluppo in C++: Costruzione di Mac OS X, Linux e applicazioni Windows".

C'è va un link per Amazon e una descrizione per che sono interessati:

http://www.amazon.com/exec/obidos/tg/detail/-/032124642X/

 
    Cross-Platform Development in C++ is the definitive guide to developing 
    portable C/C++ application code that will run natively on Windows, 
    Macintosh, and Linux/Unix platforms without compromising functionality, 
    usability, or quality. 

    Long-time Mozilla and Netscape developer Syd Logan systematically 
    addresses all the technical and management challenges associated with 
    software portability from planning and design through coding, testing, 
    and deployment. Drawing on his extensive experience with cross-platform 
    development, Logan thoroughly covers issues ranging from the use of 
    native APIs to the latest strategies for portable GUI development. Along 
    the way, he demonstrates how to achieve feature parity while avoiding 
    the problems inherent to traditional cross-platform development 
    approaches. 

    This book will be an indispensable resource for every software 
    professional and technical manager who is building new cross-platform 
    software, porting existing C/C++ software, or planning software that may 
    someday require cross-platform support. 

    Build Cross-Platform Applications without Compromise 

    Throughout the book, Logan illuminates his techniques with realistic 
    scenarios and extensive, downloadable code examples, including a 
    complete cross-platform GUI toolkit based on Mozilla's XUL that you can 
    download, modify, and learn from. Coverage includes 
    - Policies and procedures used by Netscape, enabling them to ship Web 
    browsers to millions of users on Windows, Mac OS, and Linux 
    - Delivering functionality and interfaces that are consistent on all 
    platforms 
    - Understanding key similarities and differences among leading 
    platform-specific GUI APIs, including Win32/.NET, Cocoa, and Gtk+ 
    - Determining when and when not to use native IDEs and how to limit 
    their impact on portability 
    - Leveraging standards-based APIs, including POSIX and STL 
    - Avoiding hidden portability pitfalls associated with floating point, 
    char types, data serialization, and types in C++ 
    - Utilizing platform abstraction libraries such as the Netscape 
    Portable Runtime (NSPR) 
    - Establishing an effective cross-platform bug reporting and tracking 
    system 
    - Creating builds for multiple platforms and detecting build failures 
    across platforms when they occur 
    - Understanding the native runtime environment and its impact on 
    installation 
    - Utilizing wxWidgets to create multi-platform GUI applications from a 
    single code base 
    - Thoroughly testing application portability 
    - Understanding cross-platform GUI toolkit design with Trixul