Hai appena scaricato un aggiornamento ricco di funzionalità per la tua app open source preferita. Tutto funziona bene e lo si utilizza sugli altri dispositivi, quindi è giunto il momento di implementarlo anche su quelli.
Tranne il tuo nuovo brillante laptop Linux non è compatibile con il tuo pacchetto di installazione di Windows. Che ne dici del tuo tablet Android? i phone? PS4? Perché non puoi semplicemente prendere quel software e usarlo dove vuoi? Esaminiamo alcuni diversi ostacoli al sogno di "comprare una volta, correre ovunque".
Sviluppo software e architettura del sistema operativo
Capire perché il software non funziona su tutti i sistemi operativi richiede un po '(solo un po', lo prometto) la conoscenza di come viene prodotto il software.
Il processo di sviluppo del software
In un flusso di sviluppo software di base per desktop, server e dispositivi mobili (ad esempio, non programmazione web e sviluppo Web: qual è la differenza? Programmazione vs sviluppo Web: qual è la differenza? Si potrebbe pensare che i programmatori di applicazioni e gli sviluppatori web facciano lo stesso lavoro, ma questo è lontano dalla verità.Qui sono le differenze chiave tra i programmatori e gli sviluppatori Web. Per saperne di più), un programmatore:
- Digitare del codice in uno o più file.
- Compilare il codice in qualcosa che il computer può eseguire.
- Verificare che il programma funzioni come previsto.
- Imballa e distribuisci / distribuisci il software.
È una combinazione del primo e del secondo passo che ci riguardano qui. Il processo di compilazione del software o di conversione da codice a quelli e zeri che un computer comprende (linguaggio macchina) è complesso. Non ci entreremo in dettaglio, ma è utile capire ad alto livello cosa succede.
Architettura del sistema operativo
Un punto importante da capire è che un sistema operativo non è una singola entità. Piuttosto, è costituito da strati di software.
Kernel del sistema operativo
Il kernel di un sistema operativo è responsabile della comunicazione con l'hardware del computer. Il software comunica i suoi comandi al kernel, che a sua volta impartisce comandi all'hardware per (ad esempio) leggere un file dal disco rigido o disegnare una finestra sullo schermo. Fondamentalmente coordina tutte le informazioni (sia che si tratti di dati memorizzati, calcoli o input dell'utente) tra hardware e vari software. Il kernel rende tutte queste funzionalità disponibili per il software tramite le chiamate di sistema .
Il kernel di ciascun sistema operativo implementerà le chiamate di sistema in modo diverso, in termini di quali sono disponibili, quali sono chiamati o quali opzioni prendono. Di conseguenza, il software deve tenere conto delle chiamate di sistema supportate dal kernel di ciascun sistema operativo target. La chiamata di sistema che usi per inviare dati alla GPU in Linux può avere un nome diverso, un elenco di informazioni che devi fornire, o entrambi in Windows. Quella chiamata esatta potrebbe anche non esserci affatto.
Librerie di sistema
In molti casi il software non chiama direttamente al kernel. Invece, chiama le librerie di sistema o le raccolte di funzioni di base. Le librerie esistono così (per esempio) ogni singolo programma che salva i file sul disco rigido non ha bisogno di scrivere una funzione per farlo. Invece, si collega semplicemente a una libreria di sistema e utilizza una funzione esistente. La libreria GLibC per Linux è un ottimo esempio, come lo sono i file .DLL nell'API Win32 o il contenuto della directory Mac / System / Library Come accedere alla cartella Libreria OS X e perché è pratico Come accedere alla libreria OS X Cartella e perché è pratica La maggior parte delle cartelle della libreria OS X è meglio lasciarle in pace, ma è utile conoscere la propria strada all'interno e intorno alla Libreria utente. Leggi di più .
Le librerie di sistema agiscono come una sorta di traduttore tra le applicazioni e il kernel per le attività di routine. Le applicazioni eseguono chiamate di funzione a queste librerie, che gestiscono molti dettagli di basso livello. Possono anche effettuare chiamate di sistema al kernel per comodità. Come avrete intuito, ciò significa che queste librerie sono scritte per un particolare kernel, e quindi non possono essere utilizzate su sistemi operativi con kernel diversi.
Intestazioni di esecuzione del sistema operativo
L'ultimo ostacolo al software universale è il formato dei file eseguibili per i sistemi operativi. Un sistema operativo si aspetta che i file che esegue seguano un particolare formato di file binario Tutto quello che c'è da sapere sui formati di file e le loro proprietà Tutto quello che c'è da sapere sui formati di file e le loro proprietà Usiamo il file di parole in modo intercambiabile: musica, immagine, foglio di lavoro, presentazione, e così via. Ma cosa rende un file un "file", comunque? Proviamo a capire questa parte fondamentale dell'informatica. Leggi di più . Ad esempio, i file ELF (Executable and Linkable Format) eseguiti su sistemi operativi come Linux e FreeBSD devono specificare determinate proprietà del file in determinati byte, come mostrato nell'immagine sottostante.
L' interfaccia binario dell'applicazione (ABI) mostrata è di particolare importanza. Una combinazione delle chiamate disponibili da processore, kernel e libararies di sistema, un ABI è simile a un'interfaccia API (Application Programming Interface) in quanto definisce il modo in cui due programmi comunicano tra loro. Ma l'API è qualcosa usato dai programmatori (umani) nel codice sorgente per indicare che due pezzi di software dovrebbero parlare tra loro. L'ABI è ciò che effettivamente consente loro di farlo una volta che il software è stato compilato ed eseguito. Ogni sistema operativo implementa un particolare ABI, che può o meno cambiare tra le versioni dello stesso sistema operativo.
In generale, i sistemi operativi implementano il proprio ABI, determinato da una combinazione del tipo di processore, del kernel e di qualsiasi libreria di sistema standard. Ma a volte un sistema operativo ne implementerà più di uno. FreeBSD ha il supporto per i binari di Linux, ad esempio, perché fornisce un ABI Linux come componente aggiuntivo del kernel di FreeBSD (invece del kernel di Linux). Questo è diverso dai programmi di virtualizzazione Che cos'è una macchina virtuale? Cos'è una macchina virtuale? Le macchine virtuali consentono di eseguire altri sistemi operativi all'interno del sistema operativo corrente, ma perché è così importante? Quali sono i pro e i contro? Ulteriori informazioni come VMWare o VirtualBox, che utilizzano software per simulare un'intera macchina (hardware e tutto). Di conseguenza questo tipo di compatibilità ABI è più veloce, ma molto più sforzo da mantenere. Questo è il motivo per cui è raro, anche se Microsoft ha recentemente visto il valore di Ubuntu è ora disponibile su Windows Store Ubuntu è ora disponibile su Windows Store Windows Insiders ora può scaricare e installare Ubuntu su Windows 10. Questo porta Linux e Windows insieme in un'unione empio pochi hanno mai immaginato che avrebbero vissuto abbastanza a lungo da testimoniare. Leggi di più nel farlo.
Eccezione: software interpretato
Sulla base di quanto sopra abbiamo appreso che gli sviluppatori scrivono software per uno, e solo uno, tipo di sistema di destinazione. Tranne quando non lo fanno. Ci sono molte applicazioni che puoi scaricare ed eseguire su un Mac, quindi copiarle ed eseguirle su Windows, e magari anche copiarle di nuovo ed eseguirle su Linux senza problemi. Com'è possibile?
Stavo mentendo fino ad ora?
A quanto pare, c'è una categoria di software che sembra superficiale come se fosse "corre ovunque". Puoi scaricarlo ed eseguirlo su qualsiasi piattaforma supportata - la parola chiave è "supportata". Infatti, stai scaricando il codice sorgente per l'applicazione, mentre un'altra applicazione (l' interprete ) è in grado di eseguire il codice sorgente direttamente in tempo reale. Si tratta di una semplificazione eccessiva, quindi osserviamo esattamente come funziona con un paio di lingue.
Giava
Quando Java è stato rilasciato per la prima volta, è promessa (letteralmente) "scrivere una volta, eseguire ovunque." L'idea era di creare applicazioni utilizzando le funzioni Java per come salvare i file, fare calcoli o creare una finestra dell'applicazione. Quindi un Java Runtime Enviornment (JRE) per ciascuna piattaforma di computer supportata eseguirà il codice e lo tradurrà in funzioni del sistema operativo nativo. Il trucco per Java, quindi, è che non viene eseguito "direttamente" sul sistema operativo. Funziona in una parte di JRE chiamata Java Virtual Machine ed è ciò che viene eseguito sul sistema operativo.
Inserendo questo livello software aggiuntivo tra l'applicazione e il sistema operativo, Java consente di concentrarsi su un insieme di funzioni uguali a tutti i sistemi operativi. Dì a Java cosa vuoi fare e lascia che la JVM del tuo sistema si preoccupi di come farlo effettivamente. L'immagine qui sotto mostra questo in azione, dove Java Desktop Application Framework di JIDE Software visualizza la stessa applicazione per Mac (in alto), Windows (in alto a sinistra), "puro Java" (medio-destra) e Linux (in basso).
I programmi Java non si "compilano" in modo preciso in tempo reale. Piuttosto, il compilatore Java li renderà in "bytecode". Puoi pensare al bytecode come a un programma semi-elaborato. Quando lo sviluppatore rilascia l'applicazione, viene compilato per quanto possibile senza sapere su quale sistema operativo verrà eseguito. Quando lo si avvia effettivamente, la JVM "eseguirà il resto del percorso" per adattare le funzioni particolari del sistema operativo host.
Pitone
Un linguaggio interpretato popolare è Python 5 Ragioni per cui la programmazione in Python non è inutile 5 motivi per cui Python Programming non è inutile Python - Lo ami o lo odi. Potresti anche oscillare da un'estremità all'altra come un pendolo. Indipendentemente da ciò, Python è un linguaggio per il quale è difficile essere ambigui. Leggi di più . Quando si esegue uno script Python, l'interprete Python tradurrà il codice in istruzioni per il sistema operativo. Può anche funzionare in modo simile a Java: quando si "importa" il codice dall'esterno dell'applicazione viene compilato in bytecode la prima volta che viene eseguito. Quindi l'interprete saprà se, nelle esecuzioni successive, il codice originale è cambiato, a quel punto verrà ricompilato in un nuovo bytecode.
Un interessante sottoprodotto di questa esecuzione "on-demand" è che puoi usare l'interprete per sviluppare i tuoi script in modo interattivo. Semplicemente digitando "python" sulla riga di comando si avvia l'interprete ed è possibile eseguire il codice e vedere immediatamente i risultati.
Ciò significa che gli sviluppatori possono giocare e modificare le cose "dal vivo". Quindi, una volta che una riga di codice fa quello che vogliono, copia e incolla in un file di script (che è molto più efficiente del ciclo "code-compile-test" che programmatori linguistici non interpretati devono fare).
Anche quando il software è lo stesso, probabilmente no
Sfortunatamente per gli utenti, l'industria tecnologica non ha sviluppato un formato veramente "universale". E potrebbe non farlo mai. L'introduzione di questi tipi di standard spesso si traduce in una soluzione "minimo comune denominatore", con concessioni nell'interesse di ottenere l'approvazione di tutti.
Cosa ne pensi? Preferiresti avere un software universalmente compatibile, anche se ciò significa che non è così buono? O stai bene con il sistema operativo che stai utilizzando e non hai interesse per le app di altre piattaforme? Facci sapere di seguito nei commenti!
Crediti immagine: Masterchief_Productions / Shutterstock