De termen 'bepaald' en 'onbepaald' zijn geen standaardclassificaties voor software zelf. Ze kunnen echter van toepassing zijn op *aspecten* van softwaregedrag of -ontwerp. Het onderscheid heeft meestal betrekking op voorspelbaarheid en controle:
* Bepaal software (of gedrag): Dit verwijst naar software waarbij deze, gegeven dezelfde input en initiële omstandigheden, *altijd* dezelfde output zal produceren. Er is geen sprake van willekeur of onvoorspelbaar gedrag. Het uitvoeringspad wordt volledig bepaald door de invoer en de logica van het programma. Voorbeelden:
* Een eenvoudige rekenmachine: Gegeven 2 + 2, zal het altijd 4 opleveren.
* Een compiler: Gegeven dezelfde broncode zou deze altijd dezelfde objectcode moeten genereren (behoudens compileroptimalisaties die instructies zouden kunnen herschikken zonder het resultaat te veranderen).
* Een deterministische simulatie: Een natuurkundige simulatie die vaste regels gebruikt en geen willekeur bevat.
* Onbepaalde software (of gedrag): Dit verwijst naar software waarbij, zelfs met dezelfde invoer en beginvoorwaarden, de uitvoer kan variëren. Deze onvoorspelbaarheid is vaak opzettelijk en komt voort uit:
* Genereren van willekeurige getallen: Gebruikt in games, simulaties of cryptografie voor onvoorspelbare elementen.
* Gelijktijdigheid/Parallelisme: In programma's met meerdere threads kan de volgorde van uitvoering van threads niet-deterministisch zijn, wat tot verschillende resultaten leidt, afhankelijk van de planningsbeslissingen van het besturingssysteem.
* Externe factoren: Software die communiceert met externe apparaten (sensoren, netwerken) kan verschillende inputs ontvangen, wat kan leiden tot verschillende outputs, zelfs met dezelfde initiële programmastatus.
* Niet-deterministische algoritmen: Sommige algoritmen onderzoeken van nature verschillende oplossingspaden, en het is niet gegarandeerd dat de uitkomst bij elke run hetzelfde is (bijvoorbeeld sommige optimalisatie-algoritmen of gerandomiseerde zoekalgoritmen).
Samengevat:
Het kernverschil ligt in de voorspelbaarheid. Bepaal dat software voorspelbaar is; zijn output is uitsluitend een functie van zijn input. Onbepaalde software introduceert een element van willekeur of onvoorspelbaarheid, wat resulteert in potentieel verschillende outputs, zelfs voor identieke inputs. De "onbepaaldheid" is niet noodzakelijkerwijs een bug; het is vaak een functie die voor specifieke doeleinden in het systeem is ontworpen. |