In che modo Java migliora il C ++ nell'area della portabilità?

5

Stavo leggendo un libro di Java dell'autore Herbert Schildt e lui ha scritto che il vantaggio di Java rispetto a C ++ in portabilaty è che mentre C ++ può essere eseguito ovunque, richiede comunque che ogni programma venga compilato con un compilatore creato per quella CPU, e la creazione di compilatori è difficile, mentre Java non ha bisogno di essere compilato per ogni CPU finché c'è una JVM per quel processore.

La mia domanda è: come è un miglioramento? La JVM non deve comunque essere compilata per ogni architettura, quindi è necessario un compilatore per ogni tipo di CPU? Quindi, qual è questo vantaggio?

    
posta SteelToe 06.01.2017 - 20:10
fonte

4 risposte

8

Il vantaggio per te è che se c'è già una buona JVM per tutte le tue piattaforme di destinazione, tutto quello che devi veramente fare è rilasciare la tua applicazione Java una volta e dovrebbe solo essere eseguita su tutte. Non dovresti fare altro!

... ovviamente, questa è la teoria . In realtà, probabilmente dovresti test su ogni piattaforma di destinazione prima di essere rilasciato. Nel caso in cui la tua applicazione dipenda (intenzionalmente o accidentalmente) da funzionalità specifiche del sistema operativo.

Con C ++, spetta a tu assicurarti di compilare la tua applicazione separatamente per ogni piattaforma, con il compilatore e le librerie specifici della piattaforma. E poi prova per ognuno.

Il vantaggio che Java potrebbe darti qui va via se non c'è una JVM adatta alla tua piattaforma di destinazione.

    
risposta data 06.01.2017 - 20:16
fonte
5

Se hai 10 programmi e 10 piattaforme, hai bisogno di 100 file binari per C ++ (compilando ciascun programma su ciascuna piattaforma), ma solo 20 file binari per Java (10 dei tuoi programmi su Java, 10 sulla JVM sulle piattaforme ... e questi ultimi 10 probabilmente non sono nemmeno creati da te, e il costo per la loro compilazione può essere ammortizzato su tutti gli altri programmi che hanno come target anche la JVM).

    
risposta data 06.01.2017 - 20:45
fonte
5

How does Java improve over C++ in the area of portability?

Vale anche la pena affrontare questa domanda più ampia. Le due lingue hanno diversi obiettivi di "portabilità".

Java ha l'obiettivo di "scrivere una volta, eseguire ovunque." Ha lo scopo di scaricare programmi su un'ampia varietà di dispositivi e farli produrre lo stesso risultati . Le specifiche Java Language Spec e VM Spec fanno di tutto per rendere portatili i programmi Java in questo senso. (In pratica, ci sono bug di libreria che riducono questo in "scrivi una volta, esegui il debug ovunque.")

C ++ ha un obiettivo non scritto di "correre veloce ovunque" ma non si tratta di produrre gli stessi risultati o di evitare errori. Il linguaggio C ++ fa di tutto per far funzionare velocemente i programmi su un'ampia varietà di dispositivi, ma il significato dei programmi C ++ varia a seconda del compilatore e del dispositivo di destinazione. Questo è un diverso senso di "portabilità".

Esempi di semantica C ++ che differiscono per compilatore e destinazione:

  • short , int e long hanno larghezze diverse, può essere grande o piccolo-endian, può fare due complementi, un complemento o magnitudine + segno matematico, e >> può fare uno spostamento con segno o senza segno , così la matematica intera produce risultati diversi
  • i vari casi causano un arbitrario comportamento indefinito (che significa il compilatore può generare qualsiasi codice, ad esempio, cadere nel codice che produce un'accelerazione incontrollata del motore): uso di una variabile non inizializzata, overflow di interi con segno, conteggio di turni di grandi dimensioni, dereferenziamento di un puntatore nullo, accesso di array fuori limite, overflow dello stack e digita aliasing
  • un'istruzione come a[i++] = f(i++) + i non ha un ordine di valutazione specificato quindi non ha un significato ben definito, e se f() genera un'eccezione, C ++ non specifica quali effetti collaterali si saranno verificati o meno, per esempio quale i conterrà
  • struct packing layout
  • gli switch del compilatore cambiano il significato del codice (ad esempio la dimensione enum)
risposta data 07.01.2017 - 23:40
fonte
3

È meno sul codice e sui sistemi operativi, più sui binari compilati e le architetture dei processori.

In C ++, possiamo scrivere codice che è portatile (funziona su Windows, Linux e Mac e sulle architetture dei processori più popolari i386, amd64, ARM ecc.), ma l'output del compilatore è associato a una combinazione specifica del sistema operativo e dell'architettura del processore . Dobbiamo compilare il programma separatamente per ciascuna combinazione.

In Java, il codice viene compilato nel codice byte Java. Questo codice byte può essere eseguito su Java Virtual Machine (VM) in esecuzione su qualsiasi configurazione hardware / OS . La VM deve ancora essere compilata separatamente per ogni architettura del processore e sistema operativo, ma viene sempre eseguita dal provider VM. Esistono differenze tra VM di provider diversi, pertanto il codice e il codice byte sono sempre portabili nel contesto del singolo provider VM. È possibile scrivere un programma Java eseguito su più implementazioni VM, ma le differenze devono essere prese in considerazione.

In breve:

  1. L'unica fonte è facile, il binario del singolo programma è più difficile,
  2. Java aggiunge problemi di implementazione cross-vm a problemi di cross-os già presenti.
risposta data 06.01.2017 - 22:54
fonte

Leggi altre domande sui tag