729G46 Informationsteknologi och programmering¶

Tema 1, Föreläsning 1.2¶

Johan Falkenjack, johan.falkenjack@liu.se¶

"Any sufficiently advanced technology is indistinguishable from magic."

- Arthur C. Clarke

"We are about to study the idea of a computational process. Computational processes are abstract beings that inhabit computers. As they evolve, processes manipulate other abstract things called data. The evolution of a process is directed by a pattern of rules called a ___program___. People create programs to direct processes. In effect, we conjure the spirits of the computer with our spells."

- Abelson and Sussman, Structure and Interpretation of Computer Programs aka The Wizard Book

"Computer program, detailed plan or procedure for solving a problem with a computer; more specifically, an unambiguous, ordered sequence of computational instructions necessary to achieve such a solution. "

- Encyclopædia Britannica

Vad menas med en serie instruktioner?¶

In [2]:
from IPython import display
display.YouTubeVideo(id="cDA3_5982h8", width=400, height=300, start=37)
Out[2]:

Svårt när man inte kan reglerna¶

Vi behöver ett tydligare sätt att skriva instruktioner¶

Olika sätt att uttrycka instruktioner¶

Naturligt språk¶

Först gör ...

Sedan gör ...

Sedan ...

osv.

  • Naturligt språk. Otympligt och sällan objektivt som vi såg i videon. Alla har något olika tolkningar och idéer om vad ett påstående betyder.

Notation för matematik och logik¶

$$ A = \{1, 2, 3\}\\ B = \{3, 4, 5\}\\ A \cup B = \{x| x \in A \lor x \in B \} \\ A \cup B = C \\ $$
$$ C = \{1, 2, 3, 4, 5\} $$
  • Matematik. Jätteexakt, men sällan lättläst och ofta svårt att formulera lösningar i ren matematik.

Mer datornära kanske?¶

By United States. Dept. of the Air Force - Operation and Maintenance of Diesel-electric Locomotives, Public Domain, Link

Noter¶

By en:User:Prof.rick - author's "own edition and arrangement", Public Domain, Link

Någon som känner igen?¶

By WillowW - Own work, CC BY 3.0, Link

Noter, fast för?¶

By Huster - Own work, Public Domain, Link

Sista exemplet (jag lovar)¶


↑↑↓↓←→←→BA¶

Programmeringsspråk som Python¶

In [3]:
sul = "ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"
slv = "aeiouyåäö"
slc = ""
for i, l in enumerate("ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"):
    if l not in slv.upper():
        slc = slc + l.lower()

print(slc)
bcdfghjklmnpqrstvwxz
  • Verkligen jättedumma variabelnamn, gör inte så här.

Hur fattar datorn det?¶

Historia och abstraktion¶

Tidigt 1940-tal: ENIAC — Kod är kablar, data är hålkort¶

These US Army photos from the archives of the ARL Technical Library: Two women wiring the right side of the ENIAC with a new program, in the "pre- von Neumann" days. "U.S. Army Photo" from the archives of the ARL Technical Library. Standing: Ester Gerston Crouching: Gloria Gordon Bolotsky.

Programmers Gloria Gordon Bolotsky (crouching) and Ester Gerston (standing) wiring the right side of the ENIAC with a new program. By Unidentified U.S. Army photographer - ARL Technical Library, Public Domain, Link
  • Vi har konstaterat att datorer är maskiner. Elektroniska datorer uttrycker i grunden bara ett elektriskt flöde. På tidiga datorer som Eniac var detta extremt tydligt.
  • I ENIAC uttrycktes programmen som hundratals telefonväxelkablar, ställdon, och brytare som tillsammans lät strömmen flöda genom maskinen enligt ett visst mönster.
  • Själva datan lästes in via hålkort.
  • ENIAC var Turing-komplett. Dvs.bortsett från det oändliga lagringsutrymmet kunde ENIAC beräkna allt som Turing-maskinen kunde.

1945: EDVAC — Kod är också hålkort¶

By ArnoldReinhold - Own work, CC BY-SA 3.0, Link

  • Istället för att dra olika kablar. Dra alla kablar och låt ett kort med hål avgöra vilka kablar som ska brytas och vilka som ska vara öppna.
  • Notera antalet kolumner på hålkortet. 80 stycken.

1945: John von Neumann och den fundamentala datorarkitekturen¶

von Neumann-arkitekturen

Om både kod och data är hålkort kan de hanteras på samma sätt

von_neumann_arch.svg
  • Processorenhet med aritmetisk-logisk enhet och in/ut-register för denna
  • Kontrollenhet med aktuellt instruktionsregister och en programräknare som håller koll på nästa instruktion
  • Externminne för långtidslagring av data och program (hålkorten)
  • Internminne som efter inläsning lagrar både data och instruktioner som används i den aktuella processen
  • In- och Utenheter
  • von Neumann refererade till Alan Turing och menade att hans arkitektur bara var en realisering av vad Turing uppfunnit iom den Universella Turing-maskinen
  • Kallas mer generellt för Stored-Program Computer och är det vi oftast menar när vi pratar om datorer idag
  • Andra arkitekturer finns och tas upp i kursen i Datorteknik

Binär maskinkod, vår första abstraktion i kod

  • Består av långa sekvenser av 1:or och 0:or som representerar instruktioner och den data som instruktionerna opererar på, motsvarar hål och inte hål på ett hålkort.
  • Exempelvis 10111000, 00000000, 10111000, 10001110, 11011000, 11000110, 00000110, 10011110, 00001111, 00100100, 11001101, 00100000
    • Med "vanliga" heltal med talbas 10 motsvarar detta 184, 0, 184, 142, 216, 198, 6, 158, 15, 36, 205, 32
  • Ofta uttrycker vi 8-bitars sekvenser av binära tal (1 byte) som hexadecimala tal (med talbas 16).
    • Vi använder a för att representera vanliga heltalet 10, b för 11, osv. upp till f för 15
    • Exemplet ovan blir då b8, 00, b8, 8e, d8, c6, 06, 9e, 0f, 24, cd, 20
  • Resultat på en dator med MS-DOS på Intel 8086-hårdvara: Ett dollartecken i nedersta högra hörnet på skärmen.
  • Vi säger att maskinkod är en abstraktion av den underliggande hårdvaran.
  • Vi behöver inte längre tänka på elektroniska komponenter, vi har abstraherat bort det.

Maskinkod för Intel 8085 (1976), några exempel

Binary Opcode (hex) Description
10000111 87 Add the contents of register A to that of the accumulator
00111010 3a Load data stored in the given memory address
01111001 79 Move data from register A to C
11000011 c3 Jump to instruction in specified memory address
11000001 c1 Pop from stack and copy to memory registers B + C
  • Språket är strikt bundet till en viss typ av hårdvara.

  • Inte särskilt uttrycksfullt. Vi kan hämta bit-sekvenser från minnet, placera dem i register, och utföra enkla matematiska och logiska operationer på dem.

  • Allt annat än lättläst

  • Det är ungefär allt. Vill vi göra något mer avancerat måste vi skriva väldigt många operationer.

  • Eller så bygger vi något i maskinkod som, givet vissa inputs, generera annan maskinkod.

Assemblykod assembleras till maskinkod

MOV AX, 47104
MOV DS, AX
MOV [3998], 36
INT 32
  • En assemblator (eng. assembler), skriven i maskinkod, kan använda ovanstående text och assemblera ett program i maskinkod.
    • (Exempel från http://www.swansontec.com/sprogram.html)
  • Olika assemblers kan generera maskinkod för olika besläktade hårdvaror utifrån samma kod.
  • Samma program som ovan, fast i Assembly-kod
  • Olika assemblatorer kan vara implementerade för olika hårdvaror, men deras assembly-kod kan se likadan ut.
  • Dvs. vi kan, med vissa begränsningar, assemblera samma assembly-kod till maskinkod för olika hårdvaror.
  • Vi har abstraherat bort maskinkoden, och i någon utsträckning, beroendet av viss hårdvara.
  • Mer läsbart, men fortfarande inte så uttrycksfullt.
  • Vi har abstraherat bort maskinkoden.

C kompileras till assembly- och maskinkod

Commodore Grace M. Hopper
(Sedermera Amiral) Grace M. Hopper (USN) gav namn åt kompilatorn och kom på konceptet med maskinoberoende programkod.
#include <stdio.h>
int main() {
  printf("Hello, World!\n");
  return 0;
}
  • En kompilator, som någon ursprungligen skapat med hjälp av assemblykod, översätter ett program från kod som alla programmerare, med lite övning, kan läsa och förstå, till maskinkod.
  • Källkoden är samma (eller nästan samma) för alla datorer, men kompileras till maskinkod för olika datorer.
  • Kan efter kompilering köras direkt och oberoende av kompilatorn.
  • Tillåter eller kräver ofta manuell hantering av hårdvaruresurser som t.ex. minne och man behöver ofta vara väldigt detaljerad för att kompilatorn ska producera optimal maskinkod.
  • Kompilering av stora projekt kan ta lång tid och efter kompilering är man åter bunden till viss hårdvara.
  • Kan dock ge mycket snabb kod.
  • Enormt mycket mer uttrycksfullt.

Högnivåkod som kan köras direkt av ett annat program

Claude Shannon, John McCarthy, Ed Fredkin und Joseph Weizenbaum
“Claude Shannon, John McCarthy, Ed Fredkin und Joseph Weizenbaum” by Peter Haas, CC BY-NC 2.0
(hate 'I
  (and 'programming-jokes
    (and 'lisp 'irony)))
  • En interpretator eller programtolk (eng. interpreter), kompilerad till maskinkod, kan köra program direkt, utan att översätta dem till maskinkod.
  • Källkoden är samma för alla datorer, men kräver att en interpretator är installerad på datorn (eller att källkoden och interpretatorn för att köra dem distribueras gemensamt).
  • Kräver alltid att interpretatorn för det aktuella språket är installerad för att programmet ska gå att köra.
  • Kan köras på alla plattformar till vilka det finns en interpretator.
  • Ofta en eller flera storleksordningar långsammare att köra än kompilerad kod.
  • Dock oftast mycket snabbare att skriva och testa.
  • Perfekt för att lära sig programmera.

Abstraktionshierarki


Interpreterade högnivåspråk
↓
Kompilerade högnivåspråk
↓
Assemblykod
↓
Maskinkod
↓
Digitala kretsar

Vilket programmeringsspråk är bäst?¶

Vilket verktyg är bäst?¶

Exhibit of traditional European carpenter's tools in Italy

By Georges Jansoone (JoJan) - Self-photographed, CC BY 3.0, Link
  • Vilket snickarverktyg är bäst, en såg eller en hammare?
  • Till skillnad från snickare så brukar programmerare ha ett svar.
    • De har dock nästan alltid fel (om man frågar ett slumpmässigt urval av andra programmerare).

  • Det finns fall där en viss typ av språk definitivt är bäst, men det beror på vad programmet ska göra.
  • Många verkliga program är byggda i flera olika språk där varje språk används för det som det är bäst på (i en idealvärld, i verkligheten blir det ofta vad programmerarna antingen redan kan eller något som de eller en chef bestämt är det nya häftiga språket som allt skall göras i, se Rust.

Bättre fråga: Vilket programmeringsspråk är bäst för vårt syfte?¶

  • Vad är vårt syfte?
  • Ska ni kunna lämna den här kursen och gå ut och börja jobba som färdiga programmerare?
  • Grundkurs. Förståelse för programmering som verktyg och tankesättet som krävs.
  • Vi tar inte upp allt.

Python-Logo.png

Kort om Python

guido.jpg
  • Födelsedatum: sent 80-tal men officiellt 20e februari 1991
  • Skapare: Guido van Rossum (före detta "Benevolent Dictator For Life", eller BDFL, över Python)
  • Fyllde 2.0 i oktober 2000
  • Fyllde 3.0 i december 2008
  • Idag: 3.13 (3.14 den 1 oktober)
    • I kursen använder vi 3.10 (från 2021)
  • Top 5 i de flesta rankningar av popularitet, nr 1 i flera av dem.
  • Interpreterat, objektbaserat och dynamiskt typat programmeringsspråk.
  • Varför Python i den här kursen?

  • Populärt som nybörjarspråk

    • Alltså finns väldigt mycket resurser på grundläggande nivå
  • Finns till flera plattformar, även inbäddade system, och används i produktion inom många områden

    • Alltså finns väldigt mycket resurser från verkligheten

    • Snabbt och enkelt att testa

  • Stöd för flera olika programmeringsparadigm

    • Möjlighet att demonstrera olika koncept inom programmering

Kommandot python3 i LiUs Linux-miljö¶

  1. Interaktiv användning: $ python3

  1. Kör ett skript: $ python3 filnamn
  • Side note: Vi skriver python3 för att på LiUs system så fanns länge en del gamla grejer som förutsatte att python pekade på Python 2.x. Dessa ska nu vara helt konverterade till Python 3, men under en övergångsperiod existerar inte kommandot python alls för att upptäcka eventuella missade program som fortfarande försöker använda Python 2.x.

Interaktiv användning¶

  • Starta en pythontolk genom att skriva python3 i terminalen.
  • Python ersätter skalprogrammet i terminalen.
  • Bra för att experimentera, testa och felsöka.
  • Avsluta genom att trycka Ctrl-D eller genom att köra python-kommandot exit().
    • Tekniskt sett så anropar vi funktionen exit utan några argument

Skriv och kör ett skript¶

  1. Starta en text-editor (t.ex. VSCode)
  2. Skriv kod och spara i en fil med exempelvis namnet hello.py.
  3. Från terminalen, kör programtolken och skicka med sökvägen till textfilen med pythonkoden som argument genom att skriva python3 hello.py
  • Bra för kod som man vill spara eller sätta i produktion.

Några termer¶

  • Källkod: Kod skriven i ett programmeringsspråk som kompileras till maskinkod. I överförd betydelse, kod som tolkas av en interpretator och utförs, även om en kompilering inte sker.
    • Alltid singular, dvs "källkod" eller "kod", aldrig "koder". Jämför med t.ex. "vatten". (Vi kan säga flera glas vatten, eller flera kodfiler, men aldrig flera vatten eller flera koder, när vi pratar om källkod dvs.)

Hur lär man sig programmera?¶

  • Inte genom att lyssna på föreläsningar och läsa kodexempel.
  • Rättelse: Inte genom att bara lyssna på föreläsningar och läsa kodexempel.

Ett vanligt missförstånd¶

  • Kritik från tidigare studenter:
    • "Det är orimligt att vi ska kunna lösa uppgifter vi inte sett förut."
    • "Jag känner igen duggauppgifterna, men de har alltid en twist jämfört med vad vi sett förut."

Förenklad jämförelse¶

  • Hur många här inne har sett följande mattetal förut?
$$4299234924 + 1$$
  • Hur många kan räkna ut det?
  • Vilka två tal som adderas gör det inte konceptuellt svårare att räkna ut resultatet.
    • Det kan vara svårare rent praktiskt om talen är stora, men...
    • Vi vet hur addition fungerar oavsett vilka tal som adderas.

Relevans?¶

Programmering fungerar på samma sätt¶

  • Vi lär oss
    • Hur språkliga konstruktioner (som t.ex. operatorn $+$) fungerar (semantik).
    • Hur sådana konstruktioner kan kombineras för att lösa olika problem (syntax och mer semantik).
    • Hur större problem kan brytas ned i hanterbara delar med hjälp av konstruktionerna (dekomposition).
    • Hur lösningar på delproblem kan namnges och återanvändas utan att behöva tänka på detaljerna (abstraktion).
    • Att känna igen återkommande mönster i problem (mönsterigenkänning).
    • Vilka mönster av konstruktioner som löser sådana återkommande problemmönster (algoritmer).
  • Vi lär oss inte
    • Lösningar på 1500 specifika uppgifter utantill.

Så om man är dålig på eller ogillar matte...¶

...kan man fortfarande bli en bra programmerare!¶

(Och ibland inse att man inte alls var så dålig på, eller tyckte så illa om, matte som man trodde.)