2015-10-16 10 views
6

Mi manca qualcosa di base qui. A che serve compilare da una lingua di origine in bytecode (java) o in linguaggio intermedio (.NET) e poi eseguirli dall'interno della JVM o CLR?Perché è necessario/utilizzare il codice gestito (su nativo)?


C'è una diminuzione delle prestazioni (anche se lieve o grande) dell'uso del codice gestito, ma quali sono i vantaggi? So che ci sono la garbage collection e la gestione della memoria, ma anche così non sarebbe meglio semplicemente compilare il codice sorgente in modo nativo, senza bisogno di questo livello intermedio?

Inoltre (sto aggiungendo questo qui poiché è direttamente correlato alla domanda) - Apparentemente le app di Windows 10 Universal sono compilate con .NET Native che compila il codice macchina nativo. Sono curioso di sapere perché questo non è stato fatto prima con tutti i programmi .NET.

+1

Un grande vantaggio di bytecode è la possibilità di eseguirlo comunque è stata implementata la VM.L'ambito di applicazione per questo è limitato in Windows perché si sta veramente prendendo di mira solo una manciata di architetture (atom, x86 ecc.) – Sammy

+0

. Native .NET NON si limita semplicemente a "compilare codice macchina", ma essenzialmente jit in anticipo, in modo che non sia necessario essere ingaggiato più tardi. Questo è ancora convertito nello stesso identico codice macchina che sarebbe stato durante il jit; la tua ipersemplificazione eccessivamente semplificata ha fatto sembrare che tu pensassi che magicamente sia diventato C++ nativo. – Krythic

+0

@Krythic vedo. Ma quelli non sono la mia scelta di parole, stavo citando il link che avevo menzionato ([Native .NET] (https://msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx)). –

risposta

2

Oltre a tutto ciò che è stato indicato nelle altre risposte, i principali vantaggi di questo approccio sono le importanti riduzioni dei costi ottenute nello sviluppo e nella manutenzione e la scalabilità notevolmente migliorata dell'ambiente di sviluppo.

Considerare il caso in cui non esiste una lingua intermedia; avresti bisogno di sviluppare e mantenere un compilatore per ogni lingua supportata e ogni piattaforma supportata. Diciamo che hanno lingue L1, L2 e L3 e piattaforme P1, P2 e P3. Ciò significherebbe avresti bisogno di sviluppare e mantenere 9 diversi compilatori: C1 (L1, P1), C2 (L1, P2), C3 (L1, P3), C4 (L2, P1) , ecc

D'altra parte, avere un linguaggio comune intermedia I consente di sviluppare compilatori specifici 3 lingua C1 (L1, I), C2 (L2, I) e C3 (L3, I) e 3 compilatori specifici per piattaforma C4 (I, P1), C 5 (I, P2) e C6 (I, P3).

Evidentemente, maggiore è il linguaggio e la base di piattaforma supportati, più significativa sarà la riduzione dei costi.

Offre inoltre molta flessibilità nelle future aggiunte di piattaforme o linguaggi supportati; qualsiasi nuova lingua L4 richiede solo lo sviluppo di un singolo compilatore C (L4, I) e si supporta immediatamente tutte le piattaforme per il prezzo di uno sviluppo. Al contrario, se si dispone di una nuova piattaforma P4, si avrà solo bisogno di sviluppare C (I, P4) e, bingo, avete L1, L2 e L3 tutti lavorando in P4.

È fondamentalmente una situazione win win.

-1

Bytecode e JVM "shenanigans" significano che il codice viene sempre interpretato allo stesso modo, indipendentemente dalla piattaforma su cui viene eseguito. Ricordo vagamente di aver letto da tempo che Intel e AMD (e anche altri processori) eseguono alcune operazioni logiche in modo diverso, il che porta a risultati diversi su quei processori e che possono risultare in alcuni bug multipiattaforma. Quindi bytecode risolve ciò e il risultato è sempre costante.

D'altra parte, se si sa che si sta programmando per una sola piattaforma e si desiderano prestazioni extra, è qui che entra in gioco lo sviluppo di software integrato (o linguaggi di basso livello). Java e .NET sono i più utilizzati quando si sa la performance non è così importante.

0

È perché la compilazione in codice nativo renderebbe specificata la piattaforma del programma. Tuttavia, con la compilazione come lingua intermedia, il programma è portatile e può essere eseguito su ogni piattaforma se esiste una piattaforma JVM/CLR specificata.

Sia Java che .Net utilizzano la compilazione Just-in-time in modo che possano fornire la portabilità, ma prestazioni ancora migliori rispetto all'uso dell'interprete.

Inoltre, Microsoft ha già fornito Ngen insieme a Visual Studio per la compilazione del codice .Net in codice nativo:
https://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx
Una differenza principale tra Ngen e .Net nativa è che Ngen ancora dipende Framework .Net e .Net Native compila il codice richiesto di .Net insieme al programma, quindi l'installazione di .Net Framework non è richiesta.

-1

In java quando il codice byte viene generato, che è specifico per un particolare tipo di architettura, aiuta java a raggiungere l'abilità 'compila una volta eseguito ovunque'. In aggiunta a ciò, ci vuole molto meno memoria.

2

Questo è da MSDN:

Benefici di codice gestito

lingue gestite forniscono un modo generalizzato per gestire i dettagli della gestione della memoria e raccolta dei rifiuti, al costo di una piccola quantità di overhead. Questo compromesso ti libera da attività soggette a errori e ti consente di scrivere programmi più compatti, leggibili e privi di errori.

Vantaggi di codice Un gestiti

Se si utilizza un linguaggio non gestito, come C++, è necessario scrivere codice aggiuntivo per gestire la memoria e la sicurezza, e ripulire gli oggetti dopo che hanno servito il loro scopo. I dettagli delle pulizie sono complicati e non si riferiscono alla funzione prevista del programma, quindi gli sviluppatori spesso trascurano queste attività, le ignorano o ne perdono la traccia. Di conseguenza, il codice non gestito è spesso più costoso e dispendioso in termini di tempo da testare e richiede una maggiore formazione e disciplina per i programmatori.

Tuttavia, gli sviluppatori preferiscono spesso codice non gestito perché esegue più rapidamente, consente una maggiore flessibilità nell'uso dei puntatori e fornisce il controllo diretto dell'hardware.

+2

Sembra che la domanda di Aniruddha Varma non riguardi il codice gestito/non gestito. Si sta chiedendo perché un linguaggio intermedio sia usato nel programma Java/.Net. –

Problemi correlati