Annuncio pubblicitario
Hai appena scaricato un aggiornamento ricco di funzionalità per la tua app open source preferita. Tutto funziona bene e lo usi su altri dispositivi, quindi è tempo di distribuirlo anche a quelli.
Tranne il tuo nuovo brillante laptop Linux non è compatibile con il pacchetto di installazione di Windows. E il tuo tablet Android? i phone? PS4? Perché non puoi semplicemente prendere quel software e usarlo dove vuoi? Esploriamo alcune diverse barriere 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 una conoscenza un po '(solo un po', lo prometto) 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 es. non web Programmazione vs. Sviluppo Web: qual è la differenza?Potresti pensare che i programmatori di applicazioni e gli sviluppatori web facciano lo stesso lavoro, ma è tutt'altro che vero. Ecco le principali differenze tra programmatori e sviluppatori web. Leggi di più ), un programmatore dovrà:
- Digita un po ' codice in uno o più file.
- Compilare il codice in qualcosa che il computer può eseguire.
- Test per assicurarsi che il programma funzioni come previsto.
- Pacchetto e distribuzione / distribuzione il software.
È una combinazione del primo e del secondo passo che ci riguarda qui. Il processo di compilazione software o trasformarlo da codice in uno e azzerare la comprensione di un computer (linguaggio macchina) è complesso. Non ci entreremo nei dettagli, ma è utile capire ad alto livello cosa succede.
OS Architecture
Un punto importante da capire è che un sistema operativo non è una singola entità. Piuttosto, è composto da strati di software.
Kernel del sistema operativo
Un sistema operativo nocciolo è responsabile della comunicazione con l'hardware del computer. Il software comunica i suoi comandi al kernel, che a sua volta invia comandi all'hardware per (ad esempio) leggere un file dal disco rigido o disegnare una finestra sullo schermo. Fondamentalmente coordina tutte le informazioni (siano esse dati memorizzati, calcoli o input dell'utente) tra hardware e vari software. Il kernel rende disponibili tutte queste funzionalità al software tramite chiamate di sistema.
Il kernel di ciascun sistema operativo implementerà le chiamate di sistema in modo diverso, in termini di quali sono disponibili, come vengono chiamate o quali opzioni prendono. Di conseguenza, il software deve tenere conto delle chiamate di sistema supportate dal kernel di ciascun sistema operativo di destinazione. 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 il kernel. Invece, chiama a librerie di sistemao raccolte di funzioni di base. Le librerie esistono quindi (per esempio) ogni programma che salva i file sul disco rigido non ha bisogno di scrivere una funzione per farlo. Invece, semplicemente collegamenti a una libreria di sistema e utilizza una funzione esistente. La libreria GLibC per Linux è un ottimo esempio, così come i file .DLL nell'API Win32 o il contenuto di una directory / sistema / libreria di un Mac Come accedere alla cartella della libreria di OS X e perché è maneggevoleLa maggior parte delle cartelle della Libreria di OS X è preferibile lasciarla sola, ma è utile conoscere come accedere alla Libreria degli utenti. 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 fanno chiamate di funzione a queste librerie, che gestiscono molti dettagli di basso livello. Possono anche effettuare chiamate di sistema al kernel per comodità. Come avrai intuito, ciò significa che queste librerie sono scritte per un determinato 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 prevede che i file che esegue seguano un determinato formato di file binario Tutto ciò che devi sapere sui formati di file e le loro proprietàUsiamo il file di parole in modo intercambiabile: musica, immagine, foglio di calcolo, presentazione e così via. Ma cosa rende comunque un file un "file"? 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 alcune proprietà del file in determinati byte, come mostrato di seguito Immagine.
Il interfaccia binaria dell'applicazione (ABI) mostrato capace è di particolare importanza. Una combinazione di chiamate disponibili da libarari di processori, kernel e sistema, una ABI è simile a un API (Application Programming Interface) in quanto definisce come due programmi comunicano tra loro. Ma l'API è qualcosa usato dai programmatori (umani) nel codice sorgente per indicare due parti di software dovrebbero parlarci. L'ABI è ciò che in realtà consente loro di farlo una volta che il software è stato compilato ed eseguito. Ogni sistema operativo implementa un ABI particolare, che può cambiare o meno 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 eventuali librerie di sistema standard. Ma a volte un sistema operativo implementerà più di uno. FreeBSD ha il supporto per i binari Linux, ad esempio, perché fornisce un ABI Linux come componente aggiuntivo al kernel FreeBSD (anziché al kernel Linux). Questo è diverso da programmi di virtualizzazione Che cos'è una macchina virtuale? Tutto quello che devi sapereLe macchine virtuali consentono di eseguire altri sistemi operativi sul computer corrente. Ecco cosa dovresti sapere su di loro. Leggi di più come VMWare o VirtualBox, che utilizzano software per simulare un'intera macchina (hardware e tutto il resto). Di conseguenza, questo tipo di compatibilità ABI è più veloce, ma richiede molto più impegno. Questo è il motivo per cui è raro, sebbene Microsoft ha recentemente visto il valore Ubuntu è ora disponibile su Windows StoreWindows Insiders ora può scaricare e installare Ubuntu su Windows 10. Ciò riunisce Linux e Windows in un'unione empia che pochi hanno mai immaginato di vivere 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 un solo tipo di sistema di destinazione. Tranne quando non lo fanno. Esistono molte applicazioni che è possibile scaricare ed eseguire su un Mac, quindi copiare ed eseguire su Windows e forse anche copiare di nuovo ed eseguire su Linux senza problemi. Com'è possibile?
Stavo mentendo fino ad ora?
A quanto pare, esiste una categoria di software che sembra in superficie come "funziona ovunque". Puoi scaricarlo ed eseguirlo su qualsiasi piattaforma supportata: la parola chiave "supportata". In effetti, stai scaricando il codice sorgente per l'applicazione, mentre un'altra applicazione (il interprete) è una specie di esecuzione del codice sorgente direttamente in tempo reale. Questa è una sorta di semplificazione eccessiva, quindi vediamo esattamente come funziona con un paio di lingue.
Giava
Quando Java fu rilasciato per la prima volta, la promessa era (letteralmente) "scrivere una volta, correre ovunque". L'idea era di creare applicazioni usando le funzioni Java per come salvare file, fare calcoli o creare un'applicazione finestra. Poi un Java Runtime Enviornment (JRE) per ogni piattaforma di computer supportata eseguire il codice e tradurlo in funzioni del sistema operativo nativo. Il trucco di Java, quindi, è che non viene eseguito "direttamente" sul sistema operativo. Funziona in una parte del JRE chiamato il macchina virtuale Java ed è quello che funziona sul sistema operativo.
Inserendo questo livello software aggiuntivo tra l'applicazione e il sistema operativo, Java ti consente di concentrarti su una serie di funzioni che sono le stesse su tutti i sistemi operativi. Dite a Java cosa volete fare e lasciate che la JVM per il vostro sistema si preoccupi di come farlo realmente. L'immagine sotto mostra questo in azione, dove Java Desktop Application Framework di JIDE Software visualizza la stessa applicazione per Mac (in alto), Windows (al centro a sinistra), “Java puro” (al centro a destra) e Linux (in basso).
I programmi Java non si "compilano" con precisione in tempo reale. Piuttosto, il compilatore Java li renderà in "bytecode". Puoi pensare al bytecode come a un programma cotto a metà. Quando lo sviluppatore rilascia l'applicazione, viene compilata il più possibile senza sapere su quale sistema operativo verrà eseguito. Quando lo avvii effettivamente, JVM lo "cuocerà per il resto" per adattarsi alle funzioni particolari del sistema operativo host.
Pitone
Una lingua interpretata popolare è Pitone 5 motivi per cui la programmazione Python non è inutilePython - O lo ami o lo odi. Potresti persino oscillare da un'estremità all'altra come un pendolo. Indipendentemente da ciò, Python è un linguaggio di cui è difficile essere ambivalenti. 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 "importi" il codice dall'esterno dell'applicazione, viene compilato in bytecode la prima volta che viene eseguito. Quindi l'interprete saprà se, nelle successive esecuzioni, il codice originale è cambiato, a quel punto lo ricompilerà in un nuovo bytecode.
Un interessante sottoprodotto di questa corsa "su richiesta" è che puoi usare l'interprete per sviluppare i tuoi script in modo interattivo. Digitando semplicemente "python" nella riga di comando, avvierai l'interprete e potrai 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 vuole, copialo e incollalo un file di script (che è molto più efficiente del ciclo "code-compile-test" che i programmatori di lingue non interpretati devono fare).
Anche quando il software è lo stesso, probabilmente non lo è
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 "meno comune denominatore", con concessioni nell'interesse di ottenere l'approvazione di tutti.
Cosa pensi? Preferiresti avere un software universalmente compatibile, anche se ciò significa che non era così buono? Oppure sei d'accordo 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
Aaron è stato al gomito tecnologico come analista aziendale e project manager per quindici anni, ed è stato un fedele utente di Ubuntu per quasi tutto il tempo (dal Breezy Badger). I suoi interessi includono open source, applicazioni per piccole imprese, integrazione di Linux e Android e informatica in modalità testo normale.