Inledning
För att förstå vad programmering är och vad det innebär så måste man känna till lite om hur en dator fungerar. Denna magiska maskin som är så underbar döljer ett mörkt förflutet som vi som programmerar måste känna till. En dator är nämligen en matematisk manick som bara följer tydliga instruktioner som i förväg bestäms. Vad betyder då detta? Jo man kan se en dator (egentligen processorn i datorn) som en avancerad miniräknare. Rent definitionsmässigt så är det heller ingen skillnad på en modern miniräknare och en avancerad persondator (PC) eller för den delen en XBox.
Instruktioner
Med en vanlig miniräknare kan vi mata in data (input) i form av siffror samt bestämma vad vi ska göra med dessa. Vi kan addera, subtrahera, multiplicera och dividera med en enkel miniräknare. Dessa operationer eller instruktioner fungerar likadant som på persondator där processorn har ett visst antal instruktioner som den kan hantera. Nu har en processor betydligt fler instruktioner än en enklare miniräknare där de fyra räknesätten bara är en del av de instruktioner som kan utföras. Miniräknaren matar sedan ut resultatet på en liten display. Med en persondator kan vi använda betydligt fler hjälpmedel, såsom tangentbord, mus, mikrofon, scanner mm för att mata in data. En persondator kan även ge utdata (output) på en rad olika sätt såsom via skärm, högtalare och skrivare.
Vad är ett program?
Vad är då ett program (dataprogram / datorprogram)? Jo det kan beskrivas som ett i förväg bestämd serie med instruktioner som bygger upp det vi i vardagligt tal kallar för ett program. Nu fungerar inte en dator som "vanligt" folk utan har den egenheten att den bara förstår och kan behandla binära tal (data), dvs. de berömda ettorna och nollorna. Detta har med grundläggande digitalteknik att göra vilket vi inte kommer att gå in på här utan nöjer oss med att konstatera att man som programmerare har nytta av att känna till hur binära (och hexadecimala) tal fungerar.
Källkod och maskinkod
För att röra till det ytterligare så finns program i två format, källkod och maskinkod (ibland binärkod). Eftersom det är väldigt jobbigt för oss människor att skapa maskinkod direkt så skrivs (programmeras) programmen i källkod (ibland kort och gott kod). Källkod kan liknas vid ett matrecept och beskriver steg för steg vad som skall göras. Det är viktigt att källkoden skrivs korrekt och med rätt grammatik vilket kallas syntax och som beror på det programmeringsspråk som används (mer om detta senare). Källkod kan inte datorn förstå rakt av utan den måste översättas till maskinkod (kompileras) så att datorn kan köra programmet (kallas även exekvera). Programmet som översätter källkoden till maskinkod kallas för kompilator.
Olika programmeringsspråk
Det finns massvis med olika programmeringsspråk (eller programspråk) att välja bland. Det finns faktiskt över hundra stycken varav ca ett tiotal är vanligt förekommande idag. Man kan lite slarvigt säga att alla programspråk är bra på något eller utvecklade för en viss tillämpning eller att fungera i en viss miljö. Detta i kombination med att vissa programspråk vidareutvecklats gör att det finns så många varianter på programspråk.
De största programspråken som man bör känna till är C, C++, Java, C#, Assembler, VB och Python. Programspråken traditionellt brukar delas in i två kategorier, lågnivåspråk och högnivåspråk. Det finns även så kallade skriptspråk dit språk som PHP, Perl, ASP, Javascript med flera hör till. Ett skriptspråk kompileras inte utan tolkas i en speciell miljö.
Till lågnivåspråk hör främst assembler men även C räknas idag som ett lågnivåspråk. Det som kännetecknar ett lågnivåspråk är att man skriver väldigt detaljerad kod som ligger väldigt nära det språk som datorn pratar (maskinkod). I Assembler t.ex. så byggs ett program upp instruktion för instruktion vilket kräver att man har god kännedom om hur processorn fungerar samt adressregistret. Detta gör det väldigt omständigt att skapa mer avancerade program. Fördelen är att programmeraren har full kontroll på vad som händer och att program skapade med lågnivåspråk blir väldigt resurssnåla och effektiva. Lågnivåspråk var det man använde för att utveckla program med för länge sedan (70-tal). I takt med att högnivåspråken blivit kraftfullare och kompilatorerna spottar ur sig allt bättre (optimerade) program så har användningen av lågnivåspråk minskat. Idag används lågnivåspråk endast för små inbyggda system och väldigt krävande delar av ett operativsystem.
Högnivåspråk är betydligt kraftfullare än lågnivåspråk. Med detta menas att vi som programmerare kan åstadkomma mer med mindre ansträngning och det är ju helt perfekt/underbart. När man använder ett högnivåspråk så beskriver man mer vad som ska göras och inte exakt hur det ska göra. I alla fall så behöver vi inte veta på detaljnivå hur programmet vi skriver utförs. Detta är kompilatorns problem. De flesta moderna programspråken är objektorienterade. Vad detta innebär ska vi inte gå igenom i detalj eftersom kurs A enbart rör det mest grundläggande inom programmering. Man bör dock känna till Objektorienterad programmering (Object Oriented Programming, OOP) och att det är ett sätt att strukturera och hantera kod som underlättar när man skapar större och mer avancerade program. Man kan bl.a. återanvända kod i större utsträckning.
Så skapas ett körbart program
Program skrivna med traditionella programspråk såsom C++, dock ej C#/Java, skapas enligt följande modell:
- Med ett textredigeringsprogram (text editor) skrivs källkoden och lagras i en fil.
- Kompilatorn översätter källkoden till objektkod (maskinkod) som lagras i en fil.
- Ett program består oftast av flera delar/objektfiler. Länkaren sätter samma de olika delarna och resultatet blir det körbara programmet.
Maskinkoden som skapas är anpassad till den datortyp (plattform) som används samt operativsystem. Detta gör t.ex. att ett program skapat på en PC med operativsystemet Windows inte kan köras på en SUN-dator eller på en PC med ett annat operativsystem såsom Linux eller MacOS.
Programspråken C# (.NET) och Java skiljer sig åt från traditionella programspråk på följande sätt:
- Precis som innan så används ett textredigeringsprogram (text editor) för att skriva källkoden och lagra den i en fil.
- Därefter översätter kompilatorn källkoden till bytekod (för Java) eller Common Intermediate Language (CIL) om vi använder C# (.NET). Detta är alltså inte är maskinkod.
- Instruktionerna i CIL-filen eller bytekoden, beroende på språk, tolkas och utförs av interpretatorn som är en form av virtuell maskin. I .NET kallas denna för Common Language Runtime (CLR) och används Java så kallas den för Java Virtual Machine (JVM).
Detta innebär att koden och programmen som skapas på detta sätt är plattformsoberoende eftersom att det räcker att vi har en interpretator som kan tolka vår bytekod/CIL på det datorsystem som vi använder för att vi ska kunna köra programmet. Vi kan alltså köra vårt program på flera olika datorsystem (förutsatt att rätt interpretator finns). Allt detta kallas för Common Language Infrastructure (CLI) i .NET. CLI är alltså ett samlingsnamn för CIL och CLR. Stor risk för ihopblandning. Varje gång ett plattformsoberoende program körs så tolkar interpretatorn instruktionerna i CIL/bytekoden och generera maskinkod som vårt datorsystem förstår. Detta kallas för JIT, Just-In-Time-kompilering. En nackdel med detta är att man aldrig får riktigt samma prestanda som ett program som exekveras från maskinkod direkt. Detta är dock något som blir bättre för varje uppdatering av interpretatorn.
Val av programspråk
Att välja programspråk kan vara svårt. Beroende på vem man frågar så får man olika förklaringar varför just ett språk är bättre än något annat. Alla språk har sina fördelar och de som lärt sig ett språk brukar hålla sig till detta. Oftast mynnar en diskussion om programspråk ut i ett sandlådekrig. De vanligaste och viktigaste språken är C# (eg. allt med .NET vilket förklaras mer ingående senare), Java och C++.
Faktum är att de vanligaste språken har fler likheter än olikheter. Detta betyder att om man behärskar ett programspråk så kan man relativt enkelt byta till ett annat och man lär sig det nya mycket snabbt. Skillnaden i syntax mellan C# och Java är inte stor.
Vilket språk ska man då välja? Det är lite av en smaksak, ungefär som att välja glass. Vi kommer här att arbeta med C# vilket idag är det självklara valet om man utvecklar program för Windows (det finns lösningar för andra miljöer såsom Linux också men mer om det längre fram). C# är ett väldigt kraftfullt och lättarbetat språk som skapats och utvecklas av Microsoft. Största konkurrenten till C# är Java som skapats av SUN. Båda språken är egentligen plattformsoberoende vilket betyder att den kod som man skapar går att köra på olika typer av datorer utan att ändra i den. Detta är mer uttalat i samband med Java eftersom Javas virtuella maskin finns till betydligt fler plattformar. Program skapade i C# (egentligen .NETs virtuella maskin) är något snabbare än motsvarande program skapat i Java. Detta varierar något beroende på vilken plattform som används (java vs c#). En fördel men Java är valfriheten, det finns nämligen ett 30-tal olika virtuella maskiner att välja mellan (kan också vara en nackdel enligt vissa) samt att Java dominerar inom vissa branscher (debatt).
Författare: Jesper Nilsson
Hej!
Jag har precis börjat Programmering1.
Jag begriper inte riktig omCIL.
CIL är inte ens maskinkod men består av binära tal.
Men maskinkod består av ettor och nollor också.
Vad är CIL egentligen?
Hej!
CIL är maskinkod för en tänkt ”virtuell” dator. När koden sedan ska köras på riktigt så måste anpassningar/optimeringar göras för den dator som faktiskt ska köra koden. Detta kallas JIT (just in time) kompilering. Det är en stor fördel att den ”tyngsta” kompileringen redan är gjord en gång så att man utgår från CIL-kod som nästan är klar att köra.
All information är ettor o nollor men häng inte upp dig för mycket på dessa detaljer. Du behöver inte veta något om detta för att programmera.
Common Intermediate Language (CIL) (tidigare kallat Microsoft Intermediate Language eller MSIL) är ett mellanliggande högnivå-assemblyspråk som beskrivs i Common Language Infrastructure (CLI). Alla CLI-kompatibla programspråk kompileras till CIL bytekod. CIL är ett objektorienterat assemblyspråk som är baserad på stack-principen. CIL är plattformsoberoende och exekveras av en virtuell maskin. Bland språk som kompileras till CIL finns C#, Visual Basic .NET, C++/CLI och J#.
CIL gick tidigare under namnet Microsoft Intermediate Language (MSIL) men är sedan standardisering känt som CIL. Trots detta kallas det fortfarande MSIL av många utvecklarna som varit med från början.
Tack för kommentar. Det stämmer det du skriver. Tror inte vi nämner MSIL i artikeln, bara CIL.
Det stämmer däremot inte att CIL är ett objektorienterat assemblyspråk, där har svenska Wikipedia fel. Det är ett assemblyspråk kort och gott.