En storlek passar inte alla: Varför programvaran inte är universellt kompatibel

Programvaran är densamma på vilket operativsystem som helst, eller hur? Fel. Det kan se ut på samma sätt och fungera på liknande sätt, men det är annorlunda bakom kulisserna.

Programvaran är densamma på vilket operativsystem som helst, eller hur?  Fel.  Det kan se ut på samma sätt och fungera på liknande sätt, men det är annorlunda bakom kulisserna.
Annons

Du har just hämtat en uppdaterad uppdatering till din favoritprogram med öppen källkod. Allt fungerar bra, och du använder det på dina andra enheter - så det är dags att rulla ut det till dem också.

Förutom din glänsande nya Linux-bärbar dator är inte kompatibel med ditt Windows-installationspaket. Vad sägs om din Android-Tablet? iPhone? PS4? Varför kan du inte bara ta den programvaran och använda den vart du vill? Låt oss utforska några olika hinder för drömmen om "köp en gång, spring någonstans."

Programutveckling och OS Arkitektur

Förstå varför programvara inte fungerar över operativsystem kräver lite (bara lite, jag lovar) kunskap om hur programvara görs.

Programvaruutvecklingsprocessen

I ett mycket grundläggande mjukvaruutveckling för skrivbord, server och mobil (dvs inte webbprogrammering vs webbutveckling: Vad är skillnaden? Programmering vs Webbutveckling: Vad är skillnaden? Du kanske tror att applikationsprogrammerare och webbutvecklare gör samma jobb, men det är långt ifrån sanningen. Här är de viktigaste skillnaderna mellan programmerare och webbutvecklare. Läs mer), en programmerare kommer att:

  1. Skriv någon kod i en eller flera filer.
  2. Kompilera koden i någonting som datorn kan exekvera.
  3. Testa för att försäkra dig om att programmet fungerar som förväntat.
  4. Paket och distribuera / distribuera programvaran.

programvara os kompatibilitet dev process

Det är en kombination av de första och andra stegen som berör oss här. Processen att kompilera programvara, eller vrida den från kod till de och nollor som en dator förstår (maskinspråk) är komplex. Vi kommer inte in i det i detalj, men det är användbart att förstå på hög nivå vad som händer.

OS Arkitektur

En viktig punkt att förstå är att ett operativsystem inte är en enda enhet. Snarare består det av lager av programvara.

Operativsystem Kärnor

Ett operativsystems kärna är ansvarigt för att kommunicera med datorns maskinvara. Programvaran kommunicerar sina kommandon till kärnan, som i sin tur utfärdar kommandon till hårdvaran till (till exempel) läser en fil från hårddisken eller ritar ett fönster på skärmen. Det samordnar i princip all information (oavsett om det är lagrat data, beräkningar eller användarinmatning) mellan hårdvara och olika programvaror. Kärnan gör all denna funktionalitet tillgänglig för programvara via systemanrop .

Grundläggande programkompatibilitet för programkompatibilitet
Bildkredit: Wikimedia Commons

Varje operativsystems kärna kommer att implementera systemsamtal annorlunda, i fråga om vilka som är tillgängliga, vad de kallas eller vilka alternativ de tar. Som ett resultat måste mjukvaran ta hänsyn till systemanrop som stöds av kärnan i varje operativsystem som det riktar sig till. Systemanropet du använder för att skicka data till GPU i Linux kan ha ett annat namn, en lista med information du behöver tillhandahålla, eller båda i Windows. Det exakta samtalet kanske inte ens finns överallt.

Systembiblioteken

I många fall ringer inte programvara direkt till kärnan. Istället ringer det till systembibliotek eller samlingar av grundläggande funktioner. Bibliotek finns så (till exempel) varje program som sparar filer till hårddisken behöver inte skriva en funktion för att göra det. Istället länkar det helt enkelt till ett systembibliotek och använder en befintlig funktion. GLibC-biblioteket för Linux är ett utmärkt exempel, liksom .DLL-filerna i Win32 API eller innehållet i en Mac / System / Library-katalog. Så här får du tillgång till OS X-bibliotekets mapp och varför det är praktiskt att få tillgång till OS X-biblioteket Mapp & varför det är praktiskt De flesta OS X-biblioteksmappar är bäst kvar, men det är användbart att känna till din väg i och runt användarbiblioteket. Läs mer .

programvarusystem för kompatibilitetssystem
Bildkredit: ScottXW via Wikimedia Commons

Systembibliotek fungerar som en typ av översättare mellan program och kärnan för rutinuppgifter. Applikationer gör funktionssamtal till dessa bibliotek, som hanterar mycket av lågnivåinformationen. De kan också göra systemanrop till kärnan för enkelhets skyld. Som du kanske har gissat betyder det att dessa bibliotek skrivs för en viss kärna och därför inte kan användas över operativsystem med olika kärnor.

Operativsystem Execution Headers

Det sista blockblocket till universell programvara är formatet av körbara filer för operativsystemen. Ett operativsystem förväntar sig att filerna körs för att följa ett visst binärt filformat Allt du behöver veta om filformat och deras egenskaper Allt du behöver veta om filformat och deras egenskaper Vi använder ordet filen utbytbart: musik, bild, kalkylblad, bildspel, och så vidare. Men vad gör en fil en "fil", ändå? Låt oss försöka förstå denna grundläggande del av databehandling. Läs mer . Exempelvis måste filerna Executable och Linkable Format (ELF) som körs på operativsystem som Linux och FreeBSD ange vissa egenskaper hos filen i vissa byte, vilket visas i bilden nedan.

Kompatibilitet elf header för programvara

Det visade binära gränssnittet (ABI) kan vara av särskild betydelse. En kombination av samtal tillgängliga från processorn, kärnan och systembiblioteket, ett ABI, liknar ett API för applikationsprogrammering, eftersom det definierar hur två program kommunicerar med varandra. Men API är något som används av programmerare (människor) i källkod för att indikera att två bitar av programvara ska prata med varandra. ABI är vad som faktiskt tillåter dem att göra det när programvaran är sammanställd och körs. Varje operativsystem implementerar ett visst ABI, vilket eventuellt inte kan ändras mellan versioner av samma operativsystem.

I allmänhet implementerar operativsystem sina egna ABI, bestämda av en kombination av typ av processor, kärnan och alla standardbaserade systembibliotek. Men ibland kommer ett operativsystem att genomföra mer än en. FreeBSD har stöd för Linux-binärer, till exempel, eftersom det ger en Linux ABI som tillägg till FreeBSD-kärnan (i stället för Linux-kärnan). Detta skiljer sig från virtualizatiton-program Vad är en virtuell maskin? Vad är en virtuell maskin? Virtuella maskiner tillåter dig att köra andra operativsystem inom ditt nuvarande operativsystem, men varför spelar det roll? Vad är för och nackdelar? Läs mer som VMWare eller VirtualBox, som använder programvara för att simulera en hel maskin (hårdvara och allt). Som ett resultat är denna typ av ABI-kompatibilitet snabbare, men mycket mer ansträngning att behålla. Det är därför det är sällsynt, även om Microsoft nyligen såg värdet Ubuntu är nu tillgängligt på Windows Store. Ubuntu är nu tillgängligt på Windows Store. Windows Insiders kan nu ladda ner och installera Ubuntu på Windows 10. Det ger Linux och Windows tillsammans i en ohelig union få någonsin föreställde sig att de skulle leva tillräckligt länge för att bevittna. Läs mer om det.

Undantag: Tolkad programvara

Baserat på ovanstående har vi lärt oss att utvecklare skriver programvara för en och endast en, typ av målsystem. Förutom när de inte gör det. Det finns många program som du kan ladda ner och köra på en Mac, sedan kopiera och köra på Windows, och kanske till och med kopiera igen och köra på Linux utan problem. Hur är detta möjligt?

Ljugde jag fram till nu?

Som det visar sig finns det en kategori av programvara som ser ut på ytan som att den bara "körs överallt". Du kan ladda ner och köra den på vilken plattform som helst som stöds. Nyckelordet är "stöds". Du laddar faktiskt ner källkod för ansökan, medan en annan applikation ( tolken ) är typ av att köra källkoden direkt i realtid. Det här är något av en förenkling, så låt oss titta på exakt hur det fungerar med ett par språk.

java

När Java först släpptes, var det löftet "skriv en gång, springa var som helst." Tanken var att skapa applikationer genom att använda Java-funktioner för hur man sparar filer, gör beräkningar eller skapar ett programfönster. Då skulle en Java Runtime Enviornment (JRE) för varje stödd datormodell köra koden och översätta dessa till inbyggda operativsystem. Tricket till Java är då att det inte körs "direkt" på operativsystemet. Den körs i en del av JRE kallad Java Virtual Machine och det är det som körs på operativsystemet.

Genom att infoga detta ytterligare programlager mellan applikationen och operativsystemet kan Java fokusera på en uppsättning funktioner som är desamma över operativsystem. Du berättar för Java vad du vill göra, och låt JVM för ditt system oroa sig för hur man faktiskt gör det. Nedanstående bild visar detta i åtgärd, där JIDE Softwares Java Desktop Application Framework visar samma applikation för Mac (överst), Windows (mitten till vänster), "ren Java" (mitten till höger) och Linux (nederst).

programvara OS kompatibilitet jide jdaf
Bildkrediter: JIDE-programvara

Java-programmen "kompilerar" inte exakt i realtid. Istället kommer Java-kompilatorn att göra dem till "bytecode". Du kan tänka dig bytecode som ett halvbakat program. När utvecklaren släpper applikationen sammanställs det så mycket som det kan vara utan att veta vilket operativsystem det ska gå på. När du faktiskt startar det, kommer JVM "baka det resten av vägen" för att passa de specifika funktionerna i värd-operativsystemet.

Pytonorm

Ett populärt tolkat språk är Python 5 Anledningar till att Python-programmering inte är oanvändbar 5 Anledningar till att Python-programmering inte är oanvändbar Python - Du älskar antingen det eller du hatar det. Du kan till och med svänga från ena änden till en annan som en pendel. Oavsett, Python är ett språk som är svårt att vara ambivalent. Läs mer . När du kör ett Python-skript kommer Python-tolken att översätta kod till instruktioner för operativsystemet. Det kan också fungera på samma sätt som Java: när du "importerar" kod från din applikation sammanställs den till bytecode första gången den körs. Då kommer tolken att veta om den ursprungliga koden, vid efterföljande körningar, har ändrats, vid vilken tidpunkt det kommer att kompilera det på nytt byte-kod.

En cool biprodukt av denna "on-demand" -körning är att du kan använda tolken för att utveckla dina skript interaktivt. Genom att helt enkelt skriva "python" på kommandoraden startar du tolken, och du kan köra koden och se resultatet direkt.

mjukvara OS kompatibilitet python tolk

Det betyder att utvecklare kan spela runt och tweak sakerna "live". Sedan har en gång en kod kod gjort vad de vill ha, kopiera och klistra in det i en skriptfil (vilket är mycket effektivare än "code-compile-test" -cykeln som icke tolkade språkprogrammerare måste göra).

Även när programvaran är densamma är det förmodligen inte

Tyvärr för användarna har tekniken inte utvecklat ett riktigt "universal" format. Och det får aldrig göra det. Att introducera dessa typer av standarder resulterar ofta i en "minst gemensam nämnare" -lösning, med medgivanden för att få allas godkännande.

Vad tror du? Skulle du helst ha universellt kompatibel programvara, även om det menade att det inte var så bra? Eller är du okej med operativsystemet du använder, och har inget intresse för appar från andra plattformar? Låt oss veta nedan i kommentarerna!

Bildkrediter: Masterchief_Productions / Shutterstock

In this article