Most recent comments
Jogging og blogging
Are, 9 måneder, 1 uke
Liveblogg nyttårsaften 2016
Are, 9 måneder, 1 uke
Reading in dark times
Are, 11 måneder, 1 uke
Moldejazz 2016
Camilla, 1 år, 2 måneder
Dørskilt
Karoline, 1 år, 3 måneder
Halifax
Tor, 1 år, 4 måneder
Sony Smartwatch 3 review
Tor, 1 år, 4 måneder
Numerikk, takk
Tor, 1 år, 4 måneder
Topp tur
Camilla, 1 år, 6 måneder
Tolkien reading day
Tor, 1 år, 6 måneder
50 book challenge
Camilla, 9 måneder, 2 uker
Ten years ago
Oppdageren Tor
Tor
Controls
Register

Pekermagi

(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.
Are likes this

Comments

Camilla,  12.06.13 23:41

Med min tunge kodebakgrunn føler jeg at jeg med en viss autoritet kan avfeie denslags som unødvendig slitsomt. Du får holde deg til Python.

Are,  16.06.13 21:27

Haha :) Man kan jo være heldig og få en segfault når sånt skjer - jeg husker ikke akkurat hvilke caser som gjorde hva. Men det er jo det som er sjarmen, at her kan alt skje. Nei, takke meg til mer humane språk som Java, C# og Python for den del. Det er fint å ha jobbet litt med C og assembler for å sette ordentlig pris på dem...

Poenget med pekere er vel rett og slett å gi mer finkornet kontroll over hva som foregår og få bedre ytelse - hvis du gir noen en peker til dataene dine slipper du jo å lage en ny kopi av dem, som du må hvis du skal lage en ny variabel og sende over den istedet.
Tor,  16.06.13 23:46

Du kan vel fint sende en variabel uten å kopiere uten å ty til pekere? Stemmer det ikke at en variabel er en referanse til en minneadresse, mens en peker er en referanse til en minneadresse som inneholder en ny minneadresse?