# Software

Software of programmatuur is een geheel van computerprogramma's met bijbehorende data, die bewerkingen en taken uitvoeren. Naast toepassingen voor mainframes, personal computers, tablets, smartphones en spelcomputers, bevatten ook televisies, telefoons, telefooncentrales, auto's en machines sinds de jaren zeventig steeds vaker embedded software.
Software kan worden ingedeeld naar toepassingsgebied of gebruikersgroep.
Het begrip "software" komt uit het Engels en is de tegenhanger van hardware (apparatuur), waarmee alle "tastbare" apparatuur wordt bedoeld. Het onderscheid tussen software en hardware is niet altijd eenduidig aan te geven. Ter wille van betere prestaties worden sommige functies in hardware geïmplementeerd, die ook in de vorm van software gerealiseerd kunnen worden. Bovendien zijn er tussenvormen, zoals firmware (software die in hardware is vastgelegd) en programmable gate arrays (generieke hardware die softwarematig van een functie wordt voorzien).

## Privésoftware

Thuis op de pc of spelcomputer:
* Webbrowsers
* Computerspellen
* Educatieve software
* Audioprogrammatuur

## Kantoorsoftware

Kantoorsoftwarepakketten bestaan vaak uit:
* Tekstverwerker
* Spreadsheet
* Databaseprogramma en toepassingen
* Presentatiesoftware
* Projectplanning
Kantoorsoftware draait meestal op een desktopcomputer of laptop. Bekende toepassingen zijn Microsoft Office, Google Docs en LibreOffice. Er kan ook een CAD-systeem in een kantoorpakket zitten.

## Bedrijfssoftware

Bedrijfssoftware zijn grotere softwarepakketten, vaak bestemd voor meerdere gebruikers die deze al dan niet tegelijkertijd gebruiken. Het doel van software is om de dagelijkse activiteiten van bedrijven te optimaliseren (vaak automatiseren) en om ze efficiënter te laten verlopen. Deze optimalisatie zorgt eveneens voor een kosten- en tijdsbesparing, kleinere foutenmarge (want minder manueel werk) en minder administratieve rompslomp.
Voorbeelden van bedrijfssoftware:
* Enterprise resource planning (ERP)
* Supply chain management (SCM)
* Customer relationship management (CRM)
* Personeelsinformatiesysteem
* Propriëtaire software, dit is vaak maatwerk, zoals het elektronisch patiëntendossier, of de software van de belastingdienst, grote banken, industrie etc., software gemaakt voor een bedrijf. Voor technisch en wetenschappelijk onderzoek worden zeer specifieke toepassingen vaak binnen de organisatie zelf ontwikkeld.
* Product data management (PDM)
* Digitaal archiefsysteem
* Praktijkmanagementsysteem voor artsen, tandartsen, apothekers en overige zorgverleners.
* Boekhoudsoftware
Er bestaan verschillende standaardsoftwarepakketten, maar vaak kiezen bedrijven ervoor om "software op maat" te laten maken, omdat bepaalde functionaliteiten binnen de standaardpakketten niet beantwoorden aan hun specifieke behoeften. In dat geval heeft een bedrijf software nodig die zich aanpast aan de gebruiker en niet omgekeerd. Aangezien zulke gepersonaliseerde software volledig afgestemd is op de nood van een bepaald bedrijf, is het kostenplaatje voor de aankoop van zo'n pakket groter dan bij een standaardpakket. Software op maat wordt immers ook ontwikkeld op basis van de laatste technologieën, blijft ondersteunen zolang het bedrijf dat wenst en groeit mee met het bedrijf. Gepersonaliseerde software is dikwijls ook de oplossing voor de integratie tussen verschillende systemen. Zo kunnen bedrijven die nood hebben aan verschillende functies van meerdere softwarepakketten toch al deze functies geïntegreerd zien in één systeem, namelijk in hun op maat gemaakt softwarepakket.

## Systeemsoftware

Systeemsoftware wordt ook wel een besturingssysteem genoemd, met als bekende voorbeelden Windows, Mac OS en Linux. Dit zijn alle programma's die nodig zijn voor het functioneren van het computersysteem, bijvoorbeeld programma's om bestanden te kopiëren (cp of copy), te verwijderen (rm of del), mappen aan te maken en de inhoud van een bestandssysteem zichtbaar te maken (ls of dir). Typische onderdelen zijn BIOS, device drivers en interrupt service routines. Deze laag wordt ook wel low level software genoemd.
* De kernel: deze implementeert alle diensten die voor het hele systeem beschikbaar (moeten) zijn zoals multitasking, geheugenbeheer en semaforen.
* Programmabibliotheken met specifieke functionaliteit, zoals netwerkabstracties (bv. TCP/IP), implementaties van specifieke bestandssystemen, grafische routines en basisbibliotheken voor specifieke computertalen (libc, bijvoorbeeld).
* Daemons, processen die weliswaar niet bij de kernel horen, maar wel noodzakelijk zijn voor het functioneren van het systeem zoals programmamanagers, printermanagers, windowmanagers en cronachtige programma's. Daemons worden (in de regel) door het systeem zelf gestart en zijn voortdurend actief.
* Netwerkprogrammatuur (bijvoorbeeld voor internet), FTP, NNTP- en IRC-servers en -cliënten.
* Om te kunnen werken hebben computers ten minste firmware nodig, bijvoorbeeld het BIOS van een pc, maar in de regel bevat een computer een grote verscheidenheid aan software. De uitzondering hierop is een embedded system, dat over het algemeen uitsluitend op firmware berust.

## Hardwareplatform

De ontwikkeling van software is naarmate die dichter bij de hardware staat, nauwer verweven met het platform waarop het werkt. Op het allerlaagste niveau dient de ontwikkelaar van dit soort software op de hoogte te zijn van de werking van de hardware, terwijl het op het hoogste niveau vaak mogelijk is software zo te schrijven dat die op een groot aantal verschillende platforms kan worden gebruikt, door handig gebruik te maken van verschillende abstractielagen. Goede voorbeelden hiervan zijn Qt en de POSIX-standaard.

## Realtimesoftware

Realtimesoftware geldt als een speciaal geval, waarin niet alleen het uiteindelijke resultaat, maar ook scherpe tijdsrestricties gelden. Voor alle software is van enig belang hoe snel de resultaten beschikbaar komen; in een tekstverwerker een paar minuten moeten wachten om naar een volgende pagina te bladeren, zou niet aanvaardbaar zijn. Zakelijke en administratieve software, alsook simulatie van wiskundige modellen worden echter niet als realtime beschouwd. Er is geen directe relatie met processen buiten het softwaresysteem. Over het algemeen wordt een onderscheid gemaakt tussen
* Soft real time, waarbij alleen een maximumresponstijd geldt, die afhankelijk is van de eisen; een voorbeeld is de navigatie- en doelzoeksoftware voor geleide wapens.
* Hard real time, waarbij het systeem 'deterministisch' moet zijn.
Hoewel vele realtimetoepassingen eveneens embedded zijn, zijn de twee begrippen geenszins equivalent.

## Ingebouwde software

Ingebouwde oftewel embedded software is ingebouwd in apparaten, zoals auto's, thermostaten, televisies, camera's, mobiele telefoons, Active Suspension, routenavigatiesysteem, dataloggers, gps-cliënten, remote sensors en satellieten.
Enkele voorbeelden van automobielsoftware: ABS, cruisecontrol of het motormanagement dat ervoor zorgt dat de wagen zo weinig mogelijk CO$_2$ uitstoot.

## Software versioning

Software versioning is het proces van het toewijzen van unieke nummers aan elke versie van computersoftware.