Cosa significa eseguire il software in modo nativo?


27

Mi chiedevo cosa significhi per il software eseguire in modo nativo. Che cos'è esattamente tale software e in cosa differisce dal software che non funziona in modo nativo? Come posso sapere se una determinata porzione di software verrà eseguita nativamente sul mio computer? È probabile che sul mio computer sia già presente un software che funziona in modo nativo?


2
"native" implica che è progettato per funzionare su qualsiasi piattaforma / sistema
operativo sia


5
@faB Ti rendi conto che nessun moderatore è stato coinvolto nella chiusura della domanda?
Slhck,

Lo ammetto, il titolo della domanda mi ha fatto pensare alla differenza tra l'esecuzione di un "programma" sotto un "sistema operativo" o sul processore stesso (ad es. Accesso diretto all'hardware).
Sfondamento

Non è che la domanda sia di per sé negativa , ma non è buona per questo sito. Come evidenziato dalle risposte, non è qualcosa a cui si possa rispondere in modo chiaro e abbia una serie di argomenti che lo circondano, il che rende la sua chiusura del tutto appropriata in base alle FAQ.
Afrazier

Risposte:


43

Un software è nativo di una piattaforma se è stato progettato per funzionare su quella piattaforma.

Una piattaforma di solito si riferisce a un sistema operativo, ma può anche essere applicata a dispositivi come Nintendo Game Boy.

Usando Game Boy come esempio, ottiene il suo software dalle cartucce. Queste cartucce contengono codice che viene eseguito in modo nativo su Game Boy.

Gli emulatori sono uno strato che consente al software progettato per una piattaforma di essere eseguita su un'altra. Ad esempio, ci sono emulatori che possono eseguire immagini delle cartucce di Game Boy e consentirti di giocare ai giochi di Game Boy sul tuo computer o persino sul tuo telefono cellulare.

Un livello di compatibilità è un po 'come un emulatore. Quando i computer e i sistemi operativi a 64 bit sono diventati mainstream, dovevano essere compatibili con le tecnologie a 32 bit esistenti. Poiché le architetture a 64 e 32 bit sono molto diverse, spesso è necessario un livello di compatibilità per eseguire software a 32 bit su macchine a 64 bit. Per le edizioni a 64 bit di Microsoft Windows, Microsoft doveva scrivere un livello di compatibilità in modo che i programmi a 32 bit funzionassero ancora sul nuovo sistema a 64 bit. Questo è il motivo per cui alcuni programmi vengono spesso installati in una cartella chiamata Program Files (x86), dove x86significa "32 bit".

I livelli di compatibilità tendono ad essere più intimi con il sistema nativo rispetto agli emulatori. VirtualBox emula l' hardware per i sistemi operativi * e i sistemi che emula non hanno molta interazione diretta con il sistema host. WoW64 è un livello di compatibilità in quanto consente ai programmi a 32 bit di funzionare su Windows a 64 bit in modo più integrato. WoW64 aiuta a rendere i programmi compatibili piuttosto che emularli in un ambiente isolato.

Una libreria di traduzione è un componente dei livelli di compatibilità. Ogni volta che il codice binario viene eseguito in modo non nativo, una libreria di traduzione consente di reindirizzare chiamate esterne, non native a chiamate native che il sistema può comprendere. I programmi di assemblaggio scritti per la TI-83 originale potrebbero non essere compatibili con i nuovi calcolatori della TI-83/84 Plus perché alcune chiamate sensate nell'architettura della TI-83 potrebbero non essere più valide nella TI-83/84 +. Una libreria di traduzione (probabilmente inclusa in shell come MirageOS ) assicura che le chiamate per la TI-83 vadano verso i nuovi posti aggiornati nei calcolatori della TI-83/84 +.

Il codice indipendente dalla piattaforma è scritto in un linguaggio interpretato da qualcosa che di solito viene eseguito in modo nativo. Ad esempio, PHP è un linguaggio di programmazione interpretato ed eseguito dal binario PHP installato, che è già stato compilato in modo nativo per i sistemi operativi basati su Windows, Mac e Unix. Il codice PHP che scrivono gli script Web è indipendente dalla piattaforma, consentendo al codice di funzionare su più sistemi operativi purché PHP sia installato per tali sistemi operativi.


miscellaneo

Correzioni

* Grazie, Michael Kjörling , per aver individuato alcuni problemi con questa risposta .

Altro

La differenza tra "nativo" e "non nativo" non è in bianco e nero . (Crediti a Afrazier )


3
Minore nitpick: (è VirtualBox, non VirualBox e) VirtualBox non emula il sistema operativo, emula l' hardware . Quindi puoi installare qualsiasi sistema operativo che ti piace in VirtualBox (soggetto a limiti di virtualizzazione) o persino scrivere il tuo da zero.
un CVn

1
Native spesso implica anche che sta usando il set di librerie e le API primarie per la piattaforma sottostante, il che può rendere le distinzioni un po 'confuse. Ci sono alcune persone che non considerano le applicazioni .NET "native" come le API Win32 sono "native", e allo stesso modo alcune persone non considerano un programma KDE in esecuzione su un desktop Gnome "nativo".
Afrazier

@afrazier: Questo perché le applicazioni .NET sono progettate per essere eseguite su "Common Language Runtime" e necessitano di un livello di compatibilità per essere eseguite su Windows. O un diverso livello di compatibilità da eseguire su Linux.
Ben Voigt,

@Ben Voigt: è ancora un'API di prima parte, i binari sono compilati in codice x86 / amd64 nativo (sia in fase di esecuzione dal CLR o in anticipo con ngen), e il framework è stato distribuito con versioni recenti di Windows. Questo fa parte di un argomento più ampio, e non è proprio appropriato qui.
Afrazier

Virtual Box non è tecnicamente un emulatore ma un Virtualizer. Un emulatore dei tempi passati ha sempre emulato hardware completamente diverso. Sotto un virtualizzatore, il sistema operativo e il software funzionano effettivamente in modo nativo sulla CPU host. La differenza è che i dispositivi sono virtuali o emulati. È una piccola differenza tecnica che anche il sito Web di Virtual Box sottolinea qui: virtualbox.org/wiki/Virtualization
Matt H

4

Il codice nativo viene solitamente utilizzato come opposto del codice indipendente dalla piattaforma. Se si esegue un software nativo, si esegue un file binario compilato e non, ad esempio, uno script indipendente dalla piattaforma come javascript o Java bytecode. C compilato o C ++ compilato sono i buoni esempi di codice nativo.


3

Ci sono sorprendentemente un paio di risposte possibili, ma lo standard di solito è: codice compilato per gli opcode per la CPU, e in esecuzione contro le librerie di programmazione del sistema operativo che ha avviato il computer. In questo caso, la maggior parte del codice eseguito sarà un codice nativo. Forse alcuni contro-esempi chiariranno le cose.

Java non è un codice nativo. Viene compilato in un bytecode intermedio, che viene quindi eseguito sul chipset specifico. Java può chiamare il codice nativo. Eclipse è un ottimo esempio: per velocità, Java chiama alcune chiamate grafiche native della piattaforma.

Se si esegue WINE , un emulatore dell'API di MS Windows, che non è un codice nativo. Sebbene tu stia eseguendo il codice progettato per quel chipset (x86), non stai eseguendo il codice per il sistema operativo che lo ha avviato, ma le librerie sostitutive. MAME esegue binari per CPU e sistemi operativi diversi.

Gli script non sono codice nativo. Sono scritti in un linguaggio di livello superiore che deve essere convertito in fase di esecuzione in codice che viene eseguito sulla CPU.

Ci sono alcune linee sfocate. Il tuo browser funziona come codice nativo, ma può anche eseguire Java (compilato in bytecode) o Javascript (un linguaggio interpretato da script).


.NET, VBA, XUL , IA-32 (almeno sulle CPU AMD64), ...
un CVn

3

Dipende molto dal contesto. Per me "nativo" significa che un'applicazione utilizza le funzionalità e i meccanismi forniti dal sistema operativo, piuttosto che implementarne uno proprio. Ciò può valere per le funzionalità dell'interfaccia utente (pulsanti, finestre, finestre di dialogo per la scelta dei file), nonché per le funzioni nascoste (ad es. Integrazione con "Apri con ...").

Ad esempio, su Windows, un'app nativa userebbe "WinAPI" per ottenere gli stessi pulsanti, barre di scorrimento, ecc. Di altre applicazioni. Si comportano esattamente nello stesso modo nelle app di sistema (blocco note) delle app di terze parti native.

Le applicazioni Java usano spesso "Swing" e sembrano completamente diverse, perché disegnano da sole i loro controlli, piuttosto che usare quelli di sistema. Il vantaggio è che il programma ha lo stesso aspetto su tutti i sistemi operativi.

Un'altra opzione per creare una GUI è un toolkit multipiattaforma come "QT". QT chiederà al sistema operativo di disegnarne i controlli, quindi dovrebbero apparire molto nativi, indipendentemente dal fatto che tu stia eseguendo Windows, OSX o Linux. Una casella di testo QT apparirà come una casella di testo di Windows, tuttavia non è esattamente una nativa, ma una sorta di emulazione. Potresti notare piccole differenze nei dettagli (ad es. Menu contestuale, metodi di input, ecc.).

Nota quando le persone dicono "nativo", spesso significano che un programma viene compilato in codice macchina anziché in un codice intermedio, che viene eseguito in una macchina virtuale (come i programmi Java e .NET). Negli esempi precedenti, WinAPI e l'app QT utilizzano il codice macchina, mentre il programma Java viene compilato in bytecode Java. Questo utilizzo è un po 'problematico al giorno d'oggi, perché molti utenti considererebbero un'applicazione .NET ben fatta nativa per Windows: è solo un file .exe, utilizza esattamente gli stessi controlli e le stesse API ed è quasi indistinguibile da un programma compilato per codice macchina.

Allo stesso modo, prenderei in considerazione un programma che utilizza GTK, conosce la struttura del file system Unix e forse viene fornito in un pacchetto .deb nativo per Ubuntu o Gnome. Esistono persino app Gnome di prima parte scritte in javascript che si potrebbero chiamare native! Lo stesso vale per le app "Metro" di Windows 8, che possono essere scritte in una varietà di lingue, alcune compilate, altre no.


2

Per dirla in termini più astratti, è come lasciare che qualcun altro della tua fiducia esegua un programma in una lingua diversa.

  • Nativo significa che il sistema operativo utilizzerà il dialetto più veloce e più semplice che lui conosca, binario.

    Pro: veloce, ampia disponibilità di linguaggio in grado di parlare tra loro dal momento che dipende dal metal. Contro: sicurezza, API complesse, limitato alle funzionalità del sistema operativo, anche i compilatori sono difficili da realizzare, perché un programma, una volta compilato, viene rilasciato in libertà.

  • Non nativo, significa che il tuo codice non verrà eseguito direttamente dal sistema operativo. Può essere eseguito in molti modi diversi, i principali vengono interpretati ed eseguono una versione bytecode del programma in una macchina virtuale.

    Pro: l'API cambia quasi sempre, quindi è molto più facile per i programmatori lavorare (almeno quando si attengono a questo particolare linguaggio). Contro: prestazioni (è spesso una leggera diminuzione, raramente può diventare un problema), e non tutti useranno effettivamente questo particolare linguaggio, quindi può anche essere un problema adottare questa tecnologia. Anche la sicurezza può essere un problema, ma è molto più sotto controllo. In qualche modo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.