Maskinkod (ven kallat maskinsprk, binrkod eller native code) r det "sprk" en processor direkt frstr och klarar att exekvera. Varje processortyp har sin srskilda maskinkod som r ett uttryck fr dess instruktionsuppsttning. Ett datorprogram i ngot programsprk (den s.k. kllkoden) kan antingen direkt tolkas och utfras via en interpretator eller versttas med en kompilator till maskinkod som i sin tur direkt kan kras, ngot som normalt ger bttre prestanda.
Maskinkod bestr av relativt enkla kommandon ssom "addera register B till register A", "jmfr register A med innehllet i minnescell 123456", "hoppa till adress 234567 om det var lika" och dylikt. Varje sdan instruktion representeras av ett eller flera binra ord (binra tal med fix lngd) vars lngd (typiskt 8, 16, 32 eller 64 bitar) och precisa anvndning varierar med CPU-typ. En enkel operation, som att exempelvis omvandla en strng av bokstver till stora bokstver, kan innebra mnga individuella maskinkodsinstruktioner. Varje instruktion bestr av ett eller flera ord som kodar fr en viss operation, fljd av eventuella argument i form av konstanter eller adresser, offset, etc. till platser dr data lagras. Argument kan lagras i samma ord som operationskoden eller i separata ord beroende p ordlngd, arkitektur, och/eller instruktionstyp (d ordlngden vida verstiger vad som behvs fr att representera alla operationer s anvnds ofta resten av ordet fr argument p ngot stt, se instruktionsuppsttning).
Bitarna i en instruktion kan var och en direkt styra en funktion i processorn, till exempel s att en bit anger att ett visst register skall anvndas, en annan att det r frgan om addition, en tredje att en operand skall hmtas med en viss typs minnesadressering o.s.v. men normalt anvnds rtt mycket avkodning fr att begrnsa antalet bitar och drmed spara minne; ursprungligen fr att arbetsminnet var begrnsat, men numera fr att mer skall rymmas i cache-minnet och drmed ge bttre prestanda.
Maskinkod r ganska svrtolkad fr mnniskor; ett maskinkodsprogram bestr av sekvenser av binra ord utan ngon uppenbar struktur. Utan att veta hur en specifik maskin indelar och tolkar dessa ord, kan man inte ens avgra vilka av orden som r instruktioner eller data. Maskinen vet dock hur lng varje typ av instruktion (inklusive argument) r och nr den har tolkat en instruktion s vet den drfr var nsta instruktion ligger. Fr att underltta manuell maskinsprksprogrammering anvnder man en "symbolisk maskinkod", assembler, dr maskinkodens instruktioner representeras av korta "minnesord" (engelska: mnemonics) och symboliska (namngivna) minnesadresser och konstanter. Denna kod verstts sedan till maskinkod av en assemblator (omvnt av en disassembler). Om man arbetar med en enklare instruktionsuppsttning kan man gra assembleringen fr hand, s kallad handassemblering.
Ocks om nstan alla datorprogram idag skrivs p ngot hgnivsprk (se programsprk), r frstelse fr maskinkod vsentlig i speciella fall, till exempel d man skriver en kompilator eller en drivrutin fr en hrdvaruenhet, d man optimerar kod som vsentligt pverkar ett datorprograms effektivitet eller d man sker efter vissa typer av fel.
Hr r ett exempel p hur en instruktion kan se ut i assembler (fr den virtuella processorn DCPU-16), det r ett SET-kommando som stter innehllet vid minnesadressen '0x1040' (hexadecimal notation fr 4160) till vrdet 0x0001 (hex fr 1). SET-instruktionen innebr allts att man lagrar ett tal p ett speciellt stlle i minnet. Denna instruktion bestr av ett ord som kodar fr en viss operation, i det hr fallet SET, fljd av argumenten i form av adress och vrde.
Hej, jag undrar ifall det finns ngon enkel metod att konvertera en subrutin till maskinkod? Allts fr hand d, hr r ett exempel vi ftt att jobba med (vi kan anvnda C och assembler men vi jobbar helst med assembler):
Fr att frst vad programmering r och vad det innebr s mste man knna till lite om hur en dator fungerar. Denna magiska maskin som r s underbar dljer ett mrkt frflutet som vi som programmerar mste knna till. En dator r nmligen en matematisk manick som bara fljer tydliga instruktioner som i frvg bestms. Vad betyder d detta? Jo man kan se en dator (egentligen processorn i datorn) som en avancerad minirknare. Rent definitionsmssigt s r det heller ingen skillnad p en modern minirknare och en avancerad persondator (PC) eller fr den delen en XBox.
Med en vanlig minirknare kan vi mata in data (input) i form av siffror samt bestmma vad vi ska gra med dessa. Vi kan addera, subtrahera, multiplicera och dividera med en enkel minirknare. Dessa operationer eller instruktioner fungerar likadant som p persondator dr processorn har ett visst antal instruktioner som den kan hantera. Nu har en processor betydligt fler instruktioner n en enklare minirknare dr de fyra rknestten bara r en del av de instruktioner som kan utfras. Minirknaren matar sedan ut resultatet p en liten display. Med en persondator kan vi anvnda betydligt fler hjlpmedel, ssom tangentbord, mus, mikrofon, scanner mm fr att mata in data. En persondator kan ven ge utdata (output) p en rad olika stt ssom via skrm, hgtalare och skrivare.
Vad r d ett program (dataprogram / datorprogram)? Jo det kan beskrivas som ett i frvg bestmd serie med instruktioner som bygger upp det vi i vardagligt tal kallar fr ett program. Nu fungerar inte en dator som "vanligt" folk utan har den egenheten att den bara frstr och kan behandla binra tal (data), dvs. de bermda ettorna och nollorna. Detta har med grundlggande digitalteknik att gra vilket vi inte kommer att g in p hr utan njer oss med att konstatera att man som programmerare har nytta av att knna till hur binra (och hexadecimala) tal fungerar.
Fr att rra till det ytterligare s finns program i tv format, kllkod och maskinkod (ibland binrkod). Eftersom det r vldigt jobbigt fr oss mnniskor att skapa maskinkod direkt s skrivs (programmeras) programmen i kllkod (ibland kort och gott kod). Kllkod kan liknas vid ett matrecept och beskriver steg fr steg vad som skall gras. Det r viktigt att kllkoden skrivs korrekt och med rtt grammatik vilket kallas syntax och som beror p det programmeringssprk som anvnds (mer om detta senare). Kllkod kan inte datorn frst rakt av utan den mste versttas till maskinkod (kompileras) s att datorn kan kra programmet (kallas ven exekvera). Programmet som verstter kllkoden till maskinkod kallas fr kompilator.
Det finns massvis med olika programmeringssprk (eller programsprk) att vlja bland. Det finns faktiskt ver hundra stycken varav ca ett tiotal r vanligt frekommande idag. Man kan lite slarvigt sga att alla programsprk r bra p ngot eller utvecklade fr en viss tillmpning eller att fungera i en viss milj. Detta i kombination med att vissa programsprk vidareutvecklats gr att det finns s mnga varianter p programsprk.
De strsta programsprken som man br knna till r C, C++, Java, C#, Assembler, VB och Python. Programsprken traditionellt brukar delas in i tv kategorier, lgnivsprk och hgnivsprk. Det finns ven s kallade skriptsprk dit sprk som PHP, Perl, ASP, Javascript med flera hr till. Ett skriptsprk kompileras inte utan tolkas i en speciell milj.
Till lgnivsprk hr frmst assembler men ven C rknas idag som ett lgnivsprk. Det som knnetecknar ett lgnivsprk r att man skriver vldigt detaljerad kod som ligger vldigt nra det sprk som datorn pratar (maskinkod). I Assembler t.ex. s byggs ett program upp instruktion fr instruktion vilket krver att man har god knnedom om hur processorn fungerar samt adressregistret. Detta gr det vldigt omstndigt att skapa mer avancerade program. Frdelen r att programmeraren har full kontroll p vad som hnder och att program skapade med lgnivsprk blir vldigt resurssnla och effektiva. Lgnivsprk var det man anvnde fr att utveckla program med fr lnge sedan (70-tal). I takt med att hgnivsprken blivit kraftfullare och kompilatorerna spottar ur sig allt bttre (optimerade) program s har anvndningen av lgnivsprk minskat. Idag anvnds lgnivsprk endast fr sm inbyggda system och vldigt krvande delar av ett operativsystem.
Hgnivsprk r betydligt kraftfullare n lgnivsprk. Med detta menas att vi som programmerare kan stadkomma mer med mindre anstrngning och det r ju helt perfekt/underbart. Nr man anvnder ett hgnivsprk s beskriver man mer vad som ska gras och inte exakt hur det ska gra. I alla fall s behver vi inte veta p detaljniv hur programmet vi skriver utfrs. Detta r kompilatorns problem. De flesta moderna programsprken r objektorienterade. Vad detta innebr ska vi inte g igenom i detalj eftersom kurs A enbart rr det mest grundlggande inom programmering. Man br dock knna till Objektorienterad programmering (Object Oriented Programming, OOP) och att det r ett stt att strukturera och hantera kod som underlttar nr man skapar strre och mer avancerade program. Man kan bl.a. teranvnda kod i strre utstrckning.
Maskinkoden som skapas r anpassad till den datortyp (plattform) som anvnds samt operativsystem. Detta gr t.ex. att ett program skapat p en PC med operativsystemet Windows inte kan kras p en SUN-dator eller p en PC med ett annat operativsystem ssom Linux eller MacOS.
Detta innebr att koden och programmen som skapas p detta stt r plattformsoberoende eftersom att det rcker att vi har en interpretator som kan tolka vr bytekod/CIL p det datorsystem som vi anvnder fr att vi ska kunna kra programmet. Vi kan allts kra vrt program p flera olika datorsystem (frutsatt att rtt interpretator finns). Allt detta kallas fr Common Language Infrastructure (CLI) i .NET. CLI r allts ett samlingsnamn fr CIL och CLR. Stor risk fr ihopblandning. Varje gng ett plattformsoberoende program krs s tolkar interpretatorn instruktionerna i CIL/bytekoden och generera maskinkod som vrt datorsystem frstr. Detta kallas fr JIT, Just-In-Time-kompilering. En nackdel med detta r att man aldrig fr riktigt samma prestanda som ett program som exekveras frn maskinkod direkt. Detta r dock ngot som blir bttre fr varje uppdatering av interpretatorn.
Att vlja programsprk kan vara svrt. Beroende p vem man frgar s fr man olika frklaringar varfr just ett sprk r bttre n ngot annat. Alla sprk har sina frdelar och de som lrt sig ett sprk brukar hlla sig till detta. Oftast mynnar en diskussion om programsprk ut i ett sandldekrig. De vanligaste och viktigaste sprken r C# (eg. allt med .NET vilket frklaras mer ingende senare), Java och C++.
c80f0f1006