Programspråk: en snabbgenomgång.

Okej, det blev lite för mycket midsommar där med lite för mycket sol och frisk luft. Alltså blev det ingen artikel i onsdags… eller fredags… eller lördags… men om jag lyckas få in den här innan midnatt så har jag i alla fall hållit mig till mindre än en vecka mellan artiklarna!

Källkod? Maskinkod? Bankomatkortskod?

Vad är då det här ”kod” som data-nissarna pratar om hela tiden?
Jo, så här ”enkelt” är det: En dator är i grund och botten en väldigt väldigt enkel maskin. Om man skalar bort rätt många abstraktionsnivåer så har man en generell maskin som stegar sig igenom en lista med väldigt väldigt simpla instruktioner av stilen läs en bit data, skriv en bit data, lägg ihop två bitar data, gör något om en bit data är samma som en annan bit data. Det är de verktyg maskinen behöver för att visa videofilm, animera grafer i excel, räkna på vädersystem och styra målsökande raketer. Låter rätt absurt eller hur? Det är det här som folk lite släpphänt reducerar till att säga ”datorer jobbar bara med ettor å nollor”.

Vill man vara elak så kan man påpeka att en dator inte ens vet vad ett och noll är, det är värre än så. Den jobbar oftast med låg eller hög spänning genom ett antal miljoner mikroskopiska transistorer på ett kiselchip. Det är vi människor som kallar de olika spänningslägena ett och noll för att det är lättare för oss. Vi blir väldigt lätt förvirrade och vi är lata. Alltså gillar vi att använda oss av abstraktioner. Vi anser att effekten av att gå till köket, vrida på kranen och hålla en kastrull under tills den har vatten i sig, lägga några ägg i kastrullen, lyfta över den till spisen, vrida på rätt reglage och vänta tills vattnet bubblar plus några minuter till är ungefär samma som om vi hänger en gryta med soppa över en brasa och väntar tills den bubblar. Vi säger ”aha! saker som är lika!”, kallar det genast ”att koka” och så slipper vi beskriva varje litet steg varje gång vi vill att någon fixar frukost åt oss. Det räcker med att säga ”kan du koka lite kaffe” till vår kollega så förstår han vad vi vill att han ska göra.

Datorer däremot är som jag sagt tidigare fantastiskt korkade men lydiga. De behöver exakta instruktioner för varje litet irriterande delmoment. Den här listan med de väldigt väldigt grundläggande steg för steg-instruktionerna som vi visualiserar som ettor och nollor eller långa kedjor av siffror i udda talbaser kallas maskinkod. Det är helt enkelt en instruktion på datorns eget språk.

Programmerare är dock inte datorer. De tenderar snarare att vara smarta men olydiga och allt som oftast lata och lättuttråkade. De gillar helt enkelt inte att behöva skriva alla dessa små petiga beskrivningar om och om och om igen. Det är ju jättetråkigt och vem har tid med sånt? Det är ju en jätterepetitiv uppgift som man borde ge till någon korkad men lydig… aha!
Varför inte låta datorer skriva maskinkoden? Det låter ju som en perfekt uppgift för dem! Sagt och gjort så löser man problemet genom att skriva program som skriver program.

Eller ja… man har förskjutit problemet i alla fall. För nu måste man ju få programmen att skriva program som gör det man vill. Men det är ju ett mycket behagligare problem. Man kan nämligen se till att höja abstraktionsnivån steg för steg. Först ser man till att hitta på ett språk som man själv kan förstå, sen ser man till att traggla sig igenom den tråkiga uppgiften att skriva ett program på datorns språk som klarar av att sammanställa de instruktioner man skriver på sitt eget språk och översätta dem till datorspråk. När man sen gjort det så kan man i fortsättningen skriva alla sina program på sitt eget språk och låta sitt sammanställnings/tolk-program (kompilator) göra om dem till maskinkod som datorn förstår. Jättepraktiskt!

Alltså, ”människospråk” stoppas in i kompilatorn och ut kommer maskinkod. Den där byttan ”människospråk” man börjar med? Det är det vi kallar källkod. Källkod är helt enkelt en samling med instruktioner i ett format som ska vara läsbart för människor som sen omvandlas till ett format som ska vara läsbart för datorn.

Programmeringsspråk

De här programmeringsspråken då… varför finns det en massa sådana? kan vi inte bara skriva ett program som förstår vanlig vettig svenska eller engelska?
Nja… det är inte särskilt lätt faktiskt. Vanliga människospråk har en massa konstiga vagheter och inbyggda liknelser som gör att det är väldigt svårt att vara så exakt i sin tolkning som en maskin behöver. Vi är också rätt bra på onödigt ordbajseri. Se bara den här bloggposten som exempel. Datorer behöver inte känna att du tycker om dem eller veta vad du gjorde i helgen. De är så nöjda så med exakta instruktioner. Så vi ger dem det i den mån vi kan. Varför försöka få en dator att förstå vad vi menar med ”Kan du vara snäll och gå igenom den där listan och ge mig skillnaden mellan den högsta temperaturen och den lägsta” när man istället kan formulera sig mer koncist
(- (max templist) (min templist)) om man pratar något Lisp-liknande eller kanske get_max_value(templist) - get_min_value(templist) i något C/C++-liknande språk.

Trots att man lätt kan få för sig att källkod är någon konstig sörja som skrivs för att vara så mystiskt som möjligt så är sanningen alltså den helt omvända. Den större delen av all källkod som skrivs är faktiskt formulerad för att vara så tydlig och entydig som möjligt.

Abstraktionsnivåer och paradigmer

Men varför är de då så många de där språken?
I många fall av ungefär samma skäl som det finns så många olika människospråk.
Olika människor i olika kulturer med olika avsikter har olika behov av ett språk. Folk i en nomadisk ökenkultur har andra saker att uttrycka än vattenreningsingenjörer i miljoninvånarstäder. På samma sätt har folk som vill göra små roliga spel som blinkar på en hemsida andra behov än forskare som försöker göra jätteberäkningar på komplexa vädersystem.

Ibland är det nödvändigt att ha väldigt hård koll på vad maskinen faktiskt gör och då håller man sig kanske på en väldigt låg abstraktionsnivå som ligger så nära maskinens språk som möjligt så att man kan veta nästan exakt vad den gör hela tiden. De första programmeringsspråken som kallades assemblerspråk hamnar i den här kategorin. De är i princip en mer läsbar form av maskinkod där de numeriska koderna för olika grundläggande instruktioner bytts ut mot mer lättlästa förkortningar som ”JMP” och ”ADD”.

Börjar man komma upp i lite högre programkomplexitet så blir det snabbt svåröverskådligt och jobbigt att hålla på med assembler så då kliver man upp ett steg i abstraktionen till språk med högre abstraktionsnivå. Där klumpar man ihop ofta förekommande kombinationer av maskinkodsinstruktioner till enkla uttryck så att programmeraren inte ska behöva återuppfinna hjulet varje gång han skriver något. Visst… i praktiken så kanske datorn för att skriva ut lite text på en terminal behöver hämta en teckenkod från någonstans i datorminnet, kolla upp den koden mot en tabell av instruktioner för vilka siffror som ska skickas till grafikkortet för att det ska rita en bokstav på skärmen och sen upprepa detta tills du fått ut alla bokstäver du ville så att de går att läsa. Men när man nu listat ut hur man ska beskriva för datorn hur den ska göra detta så blir det lättare att till nästa gång helt enkelt säga ”När jag säger print "hej där!" så menar jag att du ska följa alla de där steg för steg instruktionerna jag sa sist.

Programmeringsspråket C är ett typiskt mellannivå-språk som ligger ett par abstraktionsnivåer över maskinkod men där man oftast rätt lätt kan föreställa sig hur kompilatorn kommer översätta en given bit av din källkod till maskinkod.

Problemet med mellannivåspråk är att de fortfarande är lite för klumpiga att arbeta med i längden. Väldigt många saker man skriver i dem återkommer väldigt ofta. Det är en hel dem mönster som återkommer om och om igen. Upprepning av kod är inte bara tröttsamt för programmeraren utan också en vanlig källa till fel. Andra saker är helt enkelt väldigt jobbiga att tänka omkring om man hela tiden måste hålla reda på hur man ska representera det så att datorn kan förstå det.

Vi kan ta en jämförelse med dans till exempel. När man lär sig någon sorts dans som total nybörjare så behöver man få förklarat precis vilka rörelser man ska göra var och hur. Det är bra och praktiskt men väldigt väldigt otympligt för något mer komplicerat än grunderna. När man sen har skaffat sig en förståelse av hur de olika dansstegen utförs så har man möjligheten att sätta ihop koreografier genom att prata om dansstegen utan att bli bländad av komplexiteten om man faktiskt skulle behöva beskriva varje enskild muskelrörelse som varje enskild deltagare ska utföra vid en given tidpunkt.

Roligt nog så finns det väldigt många olika sätt att lösa problemet med hur man ska försöka göra de här abstraktionerna. Det har lett till att det finns en himla massa olika programmeringsspråk för olika ändamål och med olika tankar bakom. Vissa av dem är väldigt spridda och i brett bruk, andra används bara av ett fåtal personer på någon instutition. Som allt annat går det mode i programmeringsspråk också så att något som anses som aldeles förträffligt idag kanske är alldeles förlegat om ett år (som tur är brukar det gå i lite längre cykler än så). Rätt mycket handlar också om personliga preferenser hos enskilda programmerare eller företag vilket gör att man kan få väldigt livliga diskussioner om vilket språk som är ”bäst”. En fråga som kan debateras i evigheter då den saknar ett absolut svar. Olika språk har sina olika styrkor och brister och det finns inget enskilt språk som är bättre än alla andra på alla punkter.

Vissa språk är dock mer användbart att ha koll på än andra på grund av hur vanligt förekommande de är. Programmeringsspråket C är fortfarande det absolut vanligaste språket att skriva drivrutiner och andra program där exakthet och liten storlek är viktigare än lättheten att göra olika saker. C++ och Java är så vitt jag vet kungarna av språk att skriva applikationer i. Om du vill få dina hemsidor att göra roliga saker i din webläsare så har du att välja på det grovt underskattade språket JavaScript eller eventuellt skriva små Flash-program i språket ActionScript. Alternativt så kan du göra mer komplicerade saker redan på webservern i språk som PHP, ASP, JSP, Python eller Perl

I vilket fall som helst så lönar det sig att hitta ett språk där det är lätt att uttrycka det du vill göra. Det förenklar ditt arbete något otroligt.

Tillfälligt avbrott

hmm…
Skulle jag vara klar innan midnatt? Aj då.
Jag får nog betrakta det här som ett färdigt segment och återkomma senare i veckan med mer. Jag har trots alls ett jobb att gå till om några timmar. Så kan det gå. Hoppas jag inte förvirrat allt för mycket nu. Är det något som är väldigt otydligt så finns alltid möjligheten att ställa frågor i kommentarerna!

  • Share/Bookmark
Det här inlägget postades i Artiklar, Programmering. Bokmärk permalänken.

Ett svar till Programspråk: en snabbgenomgång.

  1. Oscar skriver:

    Perl borde inte få nämnas som serverbaserat programmeringspråk. Det används till det men det borde inte få göra det :)

Lämna ett svar

E-postadressen publiceras inte. Obligatoriska fält är märkta *

*

Följande HTML-taggar och attribut är tillåtna: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>