(Advarsel: Denne artikkelen er basert på fordommer og mangelfull kunnskap om C og C++, og kan således føre til latterliggjøring hvis du prøver å gjengi synspunkter herfra til noen som vet bedre.)
Etter å ha levd et beskyttet liv i mange år, der jeg stort sett har sluppet unna med å forholde meg til enkle språk som Fortran og Python, har jeg i det siste blitt utsatt for C++. Hvor vanskelig kan det egentlig være, tenkte jeg til å begynne med, det er sikkert bare litt som Python med masse ekstra typedeklarasjoner, semikolon og krøllparanteser. Det viser seg imidlertid å være litt mer enn som så, og da tenker jeg naturligvis spesielt på pekere. Ah, pekere. De vil for alltid ha en spesiell plass i den delen av mitt hjerte som finner en viss glede i å irritere seg over idiotiske idéer.
For den ikke-tekniske delen av leserskaren er det kanskje på sin plass med en forklaring. I programmering har man noe som kalles variabler. Det er essensielt en merkelapp, og en verdi. Hvis du for eksempel lager en variabel som heter
x, og som har verdien 2, så finnes det noe magi i datamaskinen som sørger for at når du sier
x, så vet den hvor den skal slå opp i minnet, og der ligger verdien 2 lagret. Enkelt og greit. Men i C, C++ og andre språk som er designet av galninger (og forsåvidt også i Fortran, men det er ingen som er rett i hodet som bruker peker i Fortran) finnes det en spesiell type variabler som holder en minneadresse, som peker til det stedet der man finner det man er interessert i. Så i stedet for at datamaskinen slår opp direkte der verdien ligger, slår den opp et sted i minne der det ligger en ny adresse, som peker til et nytt sted i minnet, og det er det som ligger der man egentlig er interessert i. Og dette kalles altså en peker.
Akkurat hva som er poenget med en peker har jeg aldri skjønt. På maskinkodenivå trenger man åpenbart pekere, eller i allefall en eller annen måte å holde minneadresser i minnet, men hvorfor jeg skal måtte tenke på denslags kan jeg ikke fatte & begripe. Det er tross alt en grunn til at vanlige mennesker ikke lenger skriver ting i assembler.
Men i C støter man altså på disse pekerne over alt. I dag, for eksempel, hadde jeg et lite problem med en variabel som ikke oppførte seg helt som forventet. Jeg hadde en klasse, den hadde en atributt erklært med private, og denne atributten endret verdi på et eller annet sted i koden uten at jeg kunne finne hvor. Private betyr at det bare er metoder i den samme klassen (og muligens klasser som arver fra denne) som kan endre innholdet, så det burde egentlig være grei skuring å finne ut hva som skjedde, men akk, nei. Etter ganske intens debugging i Visual Studio, der jeg endte opp med å gjøre barske ting som å direkte inspisere innholdet i minnet (jeg synes i alle fall det er barskt å skrive ting som
*(long*)0x031110fb i Watch-vinduet, men det er kanskje dagligdags for erfarne utviklere), fant jeg ut at konstruktoren til en annen klasse ble kalt med en referanse til variabelen jeg kikket på, som betyr at det ble laget en peker til den samme minneadressen som variabelen min bodde i.
I praksis koker dette ned til at det fantes to variable som begge følte at de eide den samme minneadressen, og derfor kunne min private variabel uten problemer oppdateres fra en helt uventet del av koden. Jeg er opplært til at når man roter borti minne som tilhører noen andre kalles det en segmentation fault, men i C kalles det altså pekermagi (jeg vet ikke om det er det tekniske begrepet), og er tydeligvis ansett som helt kurant.
Det er mange som sier de ikke liker Fortran, og at det er et tungvint språk å jobbe i og blablabla. Jeg nikker og smiler og tenker mitt. Spesifikt tenker jeg at det er nok en grunn til at man har
The International Obfuscated C Code Contest, og ikke noe tilsvarende for Fortran.
Comments