Programmeringens minsta beståndsdelar

jonas-svidras-448332.jpg

Programmering handlar om att ge en dator instruktioner för vad den ska beräkna och hur den ska jobba. Datorer så som vi känner till dem har inte funnits längre än en bit in på 1900 talet men beräkningsmaskiner har funnits sedan innan den elektriska datorn uppfanns och därmed så har även grundtanken kring hur ettor och nollor kan representera bokstäver och symboler funnits länge, så kallad binärkod. Och det är denna logik som ligger till grund för hur all programmering av datorer ser ut idag. Idag finns det dock tusentals olika typer av programmeringsspråk och alla programmeringsspråk finns till för att lösa olika saker många gånger snabbare än vad vi som människor hade kunnat göra det.

Oftast när man lär sig programmera idag så lär man sig inte att skriva binärkod direkt utan man lär sig ett så kallat högnivåspråk. Att ett språk är ett högnivåspråk innebär att det är väldigt abstrakt och ligger ganska långt ifrån den binära kod som datorn i grund och botten förstår och närmre språk som vi som människor har lätt att förstå och skriva, som t.ex. engelska. Men anledningen till att det kan vara bra att förstå hur datorn jobbar med denna binära är att alla språk tillslut kokar ner till denna universallogik. Högnivåspråk brukar normalt översättas av en kompilator till ett så kallat assemblerspråk som i sin tur sedan blir översatt till maskinkod. Det är maskinkoden som är den binära kod som datorn egentligen förstår och tolkar till saker så som: addera register A med register B eller lägg till 143 till register C. Processorn använder sig sedan av sina minnen för att lagra de ettor och nollor den jobbat med, kolla in detta tech-talk för att fräscha upp minnet om hur datorn kommer ihåg!

Varför har vi dessa tre nivåer av översättning mellan människa och processor? 

 Det första högnivåspråket Fortran skrevs 1950 av ett team på IBM lett av John Backus.

Det första högnivåspråket Fortran skrevs 1950 av ett team på IBM lett av John Backus.

Maskinkod beskriver i detalj exakt vad processorn ska göra genom att berätta vilka bitar som skall sparas och förändras och vart dessa ska ligga. Men maskinkod kan för människor vara otroligt svårt att förstå sig på då det för olika processorer skiljer sig i hur denna kod skrivs och det inte finns någon tydlig uppdelning mellan vad som är instruktion, adress och data. Därför skapades assemblerspråken som gör det tydligare för människor hur man ska kommunicera med processorn samt att det är lättare att använda samma typ av kod på olika processorer. Assemblerspråk gör precis det som maskinkod gör dock med skillnaden att man som programmerare kan skriva dessa instruktioner med ord istället för siffror. I assemblerspråk kan man dock inte använda sig av abstrakta ting så som variabler och funktioner utan dessa abstraktioner finns istället i högnivåspråken så som Fortran, C och Java. 

Att lära sig att räkna som en dator

Men om man nu vill förstå hur man kan använda 1 och 0 för att beskriva för datorn vad den ska göra hur gör man då? Först kan man lära sig hur man med hjälp av ettor och nollor (binär kod) kan uttrycka vilket tal som helst!

Säg att vi vill skriva talet 1234 hur hade vi gjort detta binärt? Först och främst måste man veta att binär kod läses från höger till vänster och att en etta betyder att talet finns och en nolla att talet inte finns. I vanliga fall så räknar man så kallat decimalt: 1 2 3 4 5 6 7 8 9 10 och då räknar man från vänster till höger. Men binärt så räknar man alltså från andra hållet 10 9 8 7 6 5 4 3 2 1 och sen så räknar man med andra siffror, istället för att lägga på 1 till talet innan så multiplicerar man talet innan med 2.

Man räknar helt enkelt såhär: 1024 512 256 128 64 32 16 8 4 2 1. Sedan berättar man med hjälp av ettor och nollor huruvida ett av dessa tal ska finnas med eller inte. Kepigt? Det är lättare att visa! Vi vill skapa talet 1234 så vi tittar på hur man räknar binärt och kollar vilka siffror som tillsammans blir 1234.

1024     512     256     128     64     32     16     8     4     2     1

1024 + 128 + 64 + 16 + 2 = 1234

Istället för att fetmarkera de tal som vi vill slå ihop för att skapa 1234 så uttrycker vi med hjälp av ettor och nollor vilka tal som ska slås ihop. Man kan tänka såhär: Vi vill inte ha en etta, men vi vill ha en tvåa, vi vill inte ha en 4 eller 8a men vi vill ha 16 osv. Vill man inte ha talet då står det 0 på den platsen där siffran brukar stå och vill man ha den siffran så skriver man 1. 

1024     512     256     128     64     32     16     8     4    2    1

   1           0         0         1         1        0       1      0     0    1      0

Alltså blir talet 1234 skrivet binärt: 10011010010

Testa och se om du kan skriva talet 36 binärt!

Skriv ditt eget namn binärt!

 Såhär kan binär kod uppdelat i bytes dvs 8 bits se ut. Här har vi 28 bytes som innehåller ett meddelande, kolla om du kan lösa det! 

Såhär kan binär kod uppdelat i bytes dvs 8 bits se ut. Här har vi 28 bytes som innehåller ett meddelande, kolla om du kan lösa det! 

Ofta så behöver man inte räkna högre än 255 binärt och det är för att man klarar sig bra med att uttrycka bokstäver och siffror med endast 8 st ettor eller nollor som man även kan kalla för 8 bit. För att översätta binär kod till bokstäver och siffror så kan man använda t.ex. ASCII tabeller där man kan uttrycka bokstäverna a-z och A-Z samt siffrorna 0-9 samt en gäng specialtecken så som !&% genom att med binär kod uttrycka en siffra mellan 0-255. T.ex. så är siffran 65 ett stort A och uttrycks med hjälp av 8 bit som: 01000001. Såhär hade man skrivit TECH:

01010100     01000101     01000011      01001000

84                69                67                 72

T                   E                  C                  H

01010100010001010100001101001000

Ofta så läser man all binär kod på detta sätt dvs. genom att dela upp hela raden i 8 bitar i taget, läsa bakifrån och se vilken siffra som det motsvarar! Nedan kan du se själv vilka bokstäver som tillhör vilken siffra med hjälp av en tabell.

Dec  Char                           Dec  Char     Dec  Char     Dec  Char
---------                           ---------     ---------     ----------
  0  NUL (null)                      32  SPACE     64  @         96  `
  1  SOH (start of heading)          33  !         65  A         97  a
  2  STX (start of text)             34  "         66  B         98  b
  3  ETX (end of text)               35  #         67  C         99  c
  4  EOT (end of transmission)       36  $         68  D        100  d
  5  ENQ (enquiry)                   37  %         69  E        101  e
  6  ACK (acknowledge)               38  &         70  F        102  f
  7  BEL (bell)                      39  '         71  G        103  g
  8  BS  (backspace)                 40  (         72  H        104  h
  9  TAB (horizontal tab)            41  )         73  I        105  i
 10  LF  (NL line feed, new line)    42  *         74  J        106  j
 11  VT  (vertical tab)              43  +         75  K        107  k
 12  FF  (NP form feed, new page)    44  ,         76  L        108  l
 13  CR  (carriage return)           45  -         77  M        109  m
 14  SO  (shift out)                 46  .         78  N        110  n
 15  SI  (shift in)                  47  /         79  O        111  o
 16  DLE (data link escape)          48  0         80  P        112  p
 17  DC1 (device control 1)          49  1         81  Q        113  q
 18  DC2 (device control 2)          50  2         82  R        114  r
 19  DC3 (device control 3)          51  3         83  S        115  s
 20  DC4 (device control 4)          52  4         84  T        116  t
 21  NAK (negative acknowledge)      53  5         85  U        117  u
 22  SYN (synchronous idle)          54  6         86  V        118  v
 23  ETB (end of trans. block)       55  7         87  W        119  w
 24  CAN (cancel)                    56  8         88  X        120  x
 25  EM  (end of medium)             57  9         89  Y        121  y
 26  SUB (substitute)                58  :         90  Z        122  z
 27  ESC (escape)                    59  ;         91  [        123  {
 28  FS  (file separator)            60  <         92  \        124  |
 29  GS  (group separator)           61  =         93  ]        125  }
 30  RS  (record separator)          62  >         94  ^        126  ~
 31  US  (unit separator)            63  ?         95  _        127  DEL

Testa att skriva ditt namn binärt!

Källor: https://www.techopedia.com/definition/3903/assembly-language, https://it-ord.idg.se/ord/maskinkod/, https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html

 

Maria HjorthComment