# Softwareportabiliteit

Softwareportabiliteit heeft betrekking op de herbruikbaarheid van software bij het veranderen van omgeving. Het is een onderwerp dat vooral bij highlevelprogrammeren belangrijk is.

## Inleiding

Wanneer dezelfde applicatie op meerdere platformen geïnstalleerd moet worden, kunnen met behulp van portabiliteit de kosten aanzienlijk worden verminderd. De enige voorwaarde voor portabiliteit is dat er een algemene abstractie bestaat tussen de logica van de applicatie en de interfaces van het systeem.
Wanneer de software geoptimaliseerd wordt voor een ander systeem, spreekt men van porteren. Hierbij wordt ervoor gezorgd dat een programma een hogere portabiliteit krijgt voor een bepaald systeem.

## Verschillende methoden

Er zijn drie manieren waarmee een zekere portabiliteit bereikt kan worden:
* De bronbestanden worden opnieuw gecompileerd voor een nieuw systeem.
* Het programma wordt opnieuw geïnstalleerd (met dezelfde gedistribueerde bestanden) op een nieuw systeem.
* De geïnstalleerde programmabestanden worden op een nieuw systeem geplaatst.
De methoden zijn geordend van minst gebruiksvriendelijk naar meest gebruiksvriendelijk en van hoogste systeemkwaliteit naar laagste systeemkwaliteit.
Het hangt af van de gelijkheid tussen twee systemen welke keuze uit bovenstaande manieren de beste is. Hierbij zijn er twee belangrijke factoren: het besturingssysteem en de processorarchitectuur.

## Systemen met hetzelfde besturingssysteem

Wanneer we systemen met hetzelfde besturingssysteem hebben, is het vaak mogelijk om programma's tussen deze systemen te verplaatsen. Omdat een programma gebruikmaakt van bibliotheken moet hiermee rekening worden gehouden. De nodige bibliotheken moeten worden meegegeven met het programma of men gaat ervan uit dat de bibliotheken reeds aanwezig zijn op het tweede systeem. Het is belangrijk dat hierover bij de ontwikkeling van het programma een correcte beslissing wordt genomen.
Ideale portabiliteit zou worden bereikt wanneer het programma op een draagbaar, beschrijfbaar medium wordt geplaatst (bijvoorbeeld een USB-stick) waarop zowel het programma als de bibliotheken staan. Dit draagbare medium omvat dan alle software die nodig is om het programma te kunnen draaien.

## Systemen met een verschillend besturingssysteem

Als het besturingssysteem verschilt, is het meestal niet meer mogelijk om simpelweg de nodige bestanden en eventueel bibliotheken te verplaatsen.
In onderstaande lijst zijn enkele mogelijke verschillen tussen Unix-besturingssystemen vermeld.
* De lengte van de bestandsnamen
* Ondersteuning voor symbolic links
* Aanwezigheid van de select system call
* Zal select werken op een serieel apparaat?
* Verloopt seriële input en output via System V of Berkeley ioctl semantics?
* Zijn Unix-domainsockets beschikbaar?
* Is job control beschikbaar?
* Kan het besturingssysteem mappen naar een bestand in het geheugen?
* Kunnen shellscripts setuid uitvoeren?
* Kan een gebruiker een bestand weggeven met chown?
* Worden threads ondersteund? Zo ja, met of zonder semantics?
Als oplossing voor dit probleem zijn nieuwe besturingssystemen van de Unix-familie, waaronder Linux, BSD, Solaris en MacOS X, in staat om de POSIX-standaard te gebruiken voor system calls en zo de portabiliteit aanzienlijk te vergroten. Onder Microsoft Windows kan de POSIX-standaard ook worden gebruikt door middel van interfacesoftware (bijvoorbeeld Cygwin).
Wanneer er portabiliteit moet zijn tussen een Unix en een Microsoft Windows-systeem komt er nog meer bij kijken. Deze systemen hebben fundamenteel verschillende manieren van aanpak van zaken zoals procesmanagement en interprocescommunicatie.
In de laatste versies van Microsoft Windows-besturingssystemen is het mogelijk om programma's uit te voeren alsof een gebruiker op een ander besturingssysteem werkt. Dit is voor Microsoft Windows-gebruikers een goede verbetering van de portabiliteit van programma's tussen de verschillende versies van Microsoft Windows-besturingssystemen.

## Systemen met verschillende processorarchitecturen

Bij systemen met een verschillende processorarchitectuur treden de meeste problemen op wat betreft portabiliteit, doordat de lowlevelinstructies hier op een andere manier plaatsvinden.
Een processorarchitectuur wordt gekenmerkt door de woordbreedte, woordvolgorde en word alignment. De woordbreedte' is typisch 16, 32 of 64 bits. De woordvolgorde is big-endian of little-endian. De word alignment heeft betrekking op de uitlijning van de woorden in functie van de geheugenadressen.
Een mogelijke oplossing voor het portabiliteitsprobleem is gebruikmaken van een webbrowser. Deze is immers processoronafhankelijk. Hierbij komt echter veel kijken. Zo moet de programmeertaal worden aangepast zodat het programma via een webbrowser kan worden uitgevoerd. Het programma zal ook niet te zwaar mogen zijn. Daarnaast zijn er nog veiligheids- en machtigingsproblemen. De verbinding met de webbrowser moet stabiel en veilig zijn en het programma mag uit veiligheidsoverwegingen slechts beperkte machtigingen hebben. Deze aanpak, waarbij meestal gebruikgemaakt wordt van Java, kan zonder webbrowser worden uitgevoerd. Hierbij is er een link tussen het programma en Java.
De laatste oplossing is vaak vergezocht. Meestal zal de softwarefabrikant de software compileren voor verschillende besturingssystemen en verschillende processorarchitecturen, waardoor de gebruiker de software opnieuw zal moeten installeren.

## Opnieuw compileren

Om de software opnieuw te kunnen compileren is de broncode vereist. Compileren wordt dus meestal door de makers van de software gedaan en niet door de gebruiker zelf. Een uitzondering hierop is openbronsoftware, waarbij de broncode wel beschikbaar is voor de gebruiker.
De broncode wordt het best in een programmeertaal geschreven waarvoor er compatibele compilers bestaan voor de verschillende gewenste platformen.
De beste methode om een goede portabiliteit te bekomen is door de software meerdere malen te porteren en te zoeken naar fouten die steeds terugkomen. Als deze fouten worden opgelost en het programma daarna opnieuw gecompileerd wordt, is een goede portabiliteit bereikt.
* Mooney, Bringing Portability to the Software Process, West Virginia University. Dept. of Statistics and Computer Science, 1997
* Garey, Software Portability: Weighing Options, Making Choices, Volume 77, Issue 11, 2007