it-historie

Derfor brukes ! til negasjon i så mange programmeringsspråk

Et tilsynelatende ganske tilfeldig valg på slutten av 1960-tallet lever videre i mange av dagens mest populære programmeringsspråk.

Utropstegn kalles for «bang» på amerikansk slang, også i mange IT-miljøer.
Utropstegn kalles for «bang» på amerikansk slang, også i mange IT-miljøer.

Ikke alle programmeringsdiskusjoner på nettet handler om hvordan man best løser problemer. Noen handler også om hvordan ting har blitt som de har blitt. En slik diskusjon dukket nylig opp på Stackexchange, innledet av en bruker kaller seg for blues. Det innledende spørsmålet var «Hvorfor ble '!' valgt til negasjon?». I tillegg har et lignende spørsmål, om !=, blitt stilt tidligere i den samme tjenesten.

Negasjon eller ulikhet

I veldig mange programmeringsspråk er brukes utropstegnet som en unær operator – et matematisk uttrykk som bare har én variabel – som representerer negasjon eller nektelse.

I mange språk kan man skrive noe tilsvarende som dette:

if !a then

kode1;

else

kode2;

Dette betyr at dersom verdien av variabelen a ikke er sann (true), utføres kode1, og ellers utføres kode2.

Det er også vanlig i mange programmeringsspråk å bruke utropstegn i forbindelse med ulikhet, for eksempel

if a != b then

kode1;

else

kode2;

Her er != en operator for ulikhet. Dersom a ikke er lik b, utføres kode1, ellers utføres kode2.

Stammer fra B

Det er uklart om trådstarteren som stilte spørsmålet, kom så mye nærmere svaret på hvorfor akkurat utropstegnet ble valgt som negasjonsoperator. Det som derimot virker klart, er at utropstegnet ble tatt i bruk som negasjonsoperator i språket B, som var inspirert av språket BCPL.

I B brukes ! som negasjon, mens ! brukes som en operator for indeksering av array-er i BCPL.

Det nærmeste diskusjonstråden kommer et svar på spørsmålet, er i et innlegg fra en som kaller seg Kaz, som hevder at hen kontaktet Ken Thompson, som alene eller sammen med andre blant mye annet skapte programmeringsspråkene B og Go.

Thompson skal ikke ha kommet med noe klarere svar om valget av utropstegnet enn «jeg kan ha funnet på det».

Enkelt å bruke

Litt nærmere svaret kan vi nok likevel komme. Negasjon og ulikhet brukes mye i programmering. Dermed er det hensiktsmessig å benytte en representasjon som er (lett) tilgjengelig på de fleste tastaturer og dessuten ikke brukt til noe annet i språket.

I matematikk brukes tegnet ≠ for å representere ulikhet, men dette er ikke en gang en del av 7-bits ASCII-tegnsettet, så det er ganske uegnet for bruk i effektiv programmering. I matematikk er derimot utropstegnet brukt i notasjonen for fakultetfunksjonen (4! = 1⋅2⋅3⋅4 = 24).

I logikk er det tegnet ¬ som representerer negasjon. Dette er en del av 7-bits ASCII, men det mangler i de fleste tastaturoppsett. Et unntak er det britiske, hvor tegnet kan skapes ved å trykke skift + ` (gravis).

Da er ! og !=, eventuelt <> , langt enklere å få til på de fleste tastaturer.

Til stor inspirasjon

Det at utropstegnet ble tatt i bruk som negasjonsoperator i programmeringsspråket B, forklarer i seg selv ikke hvorfor det har samme rolle i så mange språk i dag. Men en annen IT-pioner, Dennis Ritchie – som var kollega av Thompson og medskaper av Unix, lot seg inspirere av B da han skapte programmeringsspråket C.

C er fortsatt blant verdens aller mest brukte programmeringsspråk. I tillegg er en lang rekke språk inspirert av eller basert på C, inkludert C++, C#, Go, Java, Javascript, Perl, PHP, Python og Rust. Det er derfor ikke så rart at Thompsons kanskje litt tilfeldige valg av negasjonstegn lever videre i dag.

#! – en liten digresjon

Mange kjørbare tekstfiler – altså skriptfiler – og særlig de skapt for kjøring i Unix-lignende systemer, innledes med tegnsekvensen #!, gjerne etterfulgt av en instruks om hvilken programvare som skal tolke filen. Det skal ha vært nevnte Dennis Ritchie som introduserte dette i en tidlig Unix-versjon.

Tegnene #! kalles gjerne for shebang, eventuelt hashbang. Trolig er shebang en slags sammenslåing av to kallenavn på tegnene, sharp (#) og bang (!).

Kallenavnet sharp skyldes at tegnet lignet på ♯, fortegnet kryss i noteskrift – altså et halvtonetrinn opp – som heter sharp på engelsk.

Bakgrunnen for kallenavnet bang for utropstegn er mer uklar, men det har blitt brukt på denne måten på engelsk i alle fall siden 1950-tallet. Det er selvfølgelig litt raskere å si «bang» enn å si «exclamation mark».

Powered by Labrador CMS