Föreläsning 23 Programmeringens historia och paradigmer Grunderna i programmering (Java) Jan Lönnberg Institutionen för datateknik -universitetets tekniska högskola 1.12.2010
Programspråkens historia Överblick Det har utvecklats tusentals programspråk. Bara några tiotal har eller har haft någon större betydelse. Språkens historia kan indelas i olika generationer kopplade till hur språket är strukturerat och används. Föreläsning 23 Programmeringens historia och paradigmer 2/39
Programspråkens historia Generationer 1. Maskinkod 2. Assemblerkod 3. Generella språk som låter programmeraren uttrycka begrepp på sitt sätt istället för datorns 4. Specialspråk för specifika ändamål 5. Villkors- och logikprogrammering Föreläsning 23 Programmeringens historia och paradigmer 3/39
Programspråkens historia Första generationen 1937 1952 Maskinkod Numeriska koder för instruktioner Absoluta adresser i instruktioner och data Svårt att lägga till och ta bort instruktioner NOP Programmering oftast från noll Betoning på hur man uttrycker sitt program i programspråket ( coding ) Föreläsning 23 Programmeringens historia och paradigmer 4/39
Programspråkens historia Andra generationen 1949 1956 Symboliska representationer av maskinkod: assemblatorer Automatisk kodgeneration betraktades ännu som slöseri med resurser. Lättare att ändra på program och återanvända befintliga rutiner Föreläsning 23 Programmeringens historia och paradigmer 5/39
Andra generationen Short code Mauchly & Schmitt 1949 1950 på BINAC och UNIVAC I. Aritmetiska uttryck, förgrening och subrutinsanrop kodade i två teckens koder. x 0 = y 0 blev 00 X0 03 20 06 Y0 Tolkad; ungefär 50 gånger långsammare än maskinkod Föreläsning 23 Programmeringens historia och paradigmer 6/39
Andra generationen A-0 Grace Hopper 1951 1952 på UNIVAC I Första kompilatorn Byggde på att kombinera anrop till färdiga subrutiner En tre teckens kod angav operationer, sedan argument och resultat Föreläsning 23 Programmeringens historia och paradigmer 7/39
Andra generationen A-0 y = e x n sin cx Operation Argument Resultat Förklarning apn 1,10 4 u = x n x-e 4 5 U = e u amc 6,1 7 v = cx ts0 7 8 V = sin v am0 5,8 9 y = UV Källa: Grace Murray Hopper: The Education of a Computer, Proceedings of the 1952 ACM national meeting Föreläsning 23 Programmeringens historia och paradigmer 8/39
Programspråkens historia Tredje generationen Låta programmeraren förklara sina begrepp för datorn Språk oberoende av maskinen 1957 Föreläsning 23 Programmeringens historia och paradigmer 9/39
FORTRAN IBM Mathematical FORmula TRANslating System Utvecklad 1954 1957 av John Backus et al. Gjord för att lätt producera effektiv kod för beräkningar Variabler, uttryck, satser, kommentarer Aritmetisk (tre-vägs) IF, DO-slingor Fixerad källkodslayout Subrutiner (utan rekursion) Föreläsning 23 Programmeringens historia och paradigmer 10/39
FORTRAN II Subrutiner och funktioner med parametrar och returvärden FORTRAN IV Boolesk datatyp och operationer (logisk IF) FORTRAN 77 Ordentliga textsträngar IF i blockform med ELSE Föreläsning 23 Programmeringens historia och paradigmer 11/39
Fortran 90 Rekursion Operationer på tabeller (och delar därav) på en gång Fri källkodslayout Fortran 2003 Objekt-orientering Föreläsning 23 Programmeringens historia och paradigmer 12/39
Fortran 90 exempel PROGRAM Temperatures IMPLICIT NONE REAL, DIMENSION (1:5,1:5) :: Fahrenheit, Celsius INTEGER :: Long, Lat DO Lat=1,5 PRINT *, ' For Latitude= ',Lat DO Long=1,5 PRINT *, ' For Longitude', Long READ *,Fahrenheit( Long, Lat) END DO END DO Celsius = 5.0/9.0 * (Fahrenheit - 32.0) PRINT *, Celsius PRINT *, Fahrenheit END PROGRAM Temperatures Källa: Ian David Chivers, Jane Sleighthome: Introducing Fortran 95, Springer 2000 Föreläsning 23 Programmeringens historia och paradigmer 13/39
ALGOL ALGOrithm Language Preliminär version, ALGOL 58, från Association for Computing Machinery och Gesellschaft für Angewandte Mathematik und Mechanik Första färdiga versionen från samma organisationer: ALGOL 60 Reviderad i ALGOL 68 Föreläsning 23 Programmeringens historia och paradigmer 14/39
ALGOL 60 if/then/else Blockstruktur och nästlade strukturer Rekursion Anrop med värde eller namn Explicit typdeklaration Åtkomstregler för lokala variabler Dynamisk minnesallokation Föreläsning 23 Programmeringens historia och paradigmer 15/39
ALGOL 60 I/O inte definierat i språket beroende av systemet ALGOL var populärt i akademiska sammanhang ett tag, men har hunnit falla helt ur bruk. Många modern programspråk är kraftigt influerade av ALGOL. Föreläsning 23 Programmeringens historia och paradigmer 16/39
ALGOL 60 exempel begin integer N; Read Int(N); begin real array Data[1:N]; real sum, avg; integer i; sum:=0; for i:=1 step 1 until N do begin real val; Read Real(val); Data[i]:=if val<0 then -val else val end; for i:=1 step 1 until N do sum:=sum + Data[i]; avg:=sum/n; Print Real(avg) end end Källa: Neil Ziring: Dictionary of Programming Languages Föreläsning 23 Programmeringens historia och paradigmer 17/39
COBOL COmmon Business Oriented Language, Grace Hopper, 1959 Utvecklad för financiellt och administrativt bruk Fortfarande mycket utbrett i företags datorsystem Datan och manipulerandet därav beskrivs skilt Datastrukturer Filmanipulation Liknar en byråkrats uppfattning om engelska Föreläsning 23 Programmeringens historia och paradigmer 18/39
COBOL exempel IDENTIFICATION DIVISION. PROGRAM-ID. SeqReadNo88. AUTHOR. Michael Coughlan. * An example showing how to read a sequential le without * using condition names. * See SeqRead.CBL for the denitive example. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT StudentFile ASSIGN TO "STUDENTS.DAT" ORGANIZATION IS LINE SEQUENTIAL. Föreläsning 23 Programmeringens historia och paradigmer 19/39
COBOL exempel DATA DIVISION. FILE SECTION. FD StudentFile. 01 StudentDetails. 02 StudentId PIC 9(7). 02 StudentName. 03 Surname PIC X(8). 03 Initials PIC XX. 02 DateOfBirth. 03 YOBirth PIC 9(4). 03 MOBirth PIC 9(2). 03 DOBirth PIC 9(2). 02 CourseCode PIC X(4). 02 Gender PIC X. Föreläsning 23 Programmeringens historia och paradigmer 20/39
COBOL exempel PROCEDURE DIVISION. Begin. OPEN INPUT StudentFile READ StudentFile AT END MOVE HIGH-VALUES TO StudentDetails END-READ PERFORM UNTIL StudentDetails = HIGH-VALUES DISPLAY StudentId SPACE StudentName SPACE CourseCode SPACE YOBirth READ StudentFile AT END MOVE HIGH-VALUES TO StudentDetails END-READ END-PERFORM CLOSE StudentFile STOP RUN. Källa: http://www.csis.ul.ie/cobol/examples/seqread/seqreadno88.htm Föreläsning 23 Programmeringens historia och paradigmer 21/39
BASIC Beginner s All-purpose Symbolic Instruction Code Kemeny & Kurtz, 1964 Tolkad Implicit deklaration av variabler Populär på 60- och 70-talet i undervisning Utbredd på hemdatorer på 80- och början av 90-talet Splittrad i massvis med dialekter Gav på 90-talet upphov till Microsoft s Visual Basic Föreläsning 23 Programmeringens historia och paradigmer 22/39
Microsoft QBASIC exempel DECLARE FUNCTION Factorial# (x&) PRINT Factorial#(10) END FUNCTION Factorial# (x&) s# = 1 FOR a& = 1 TO x& s# = s# * a& NEXT Factorial# = s# END FUNCTION Föreläsning 23 Programmeringens historia och paradigmer 23/39
PL/I Programming Language 1, IBM, 1964 Generellt programspråk: skulle ersätta ALGOL, FORTRAN och COBOL Trådar Undantagshantering Pekare Massvis med datatyper Föreläsning 23 Programmeringens historia och paradigmer 24/39
Ada USAs försvarsdepartments försök på slutet av 1970-talet att göra kod lättare att upprätthålla Betonar tydlighet och anpassningsbarhet Försöker också ersätta alla andra programspråk Innehåller en massa mekanismer för att göra det lättare att bekräfta kodens korrekthet Populär bland militära och flygtrafiksdatorsystem Föreläsning 23 Programmeringens historia och paradigmer 25/39
C Thompson & Ritchie vid Bell Labs, 1972 Utvecklad för Unix Särskilt väl lämpad för lågnivåsprogrammering Operativsystemskärnor Inbyggda system Mycket effektiv Kompakt men kryptisk Utgår från att programmeraren vet vad han gör (pekare, svagt typsystem) Mycket vanligt särskilt i Unix-världen Föreläsning 23 Programmeringens historia och paradigmer 26/39
C exempel #include <stdio.h> /* count lines of standard input */ int main(int argc, char *argv[]) { char lbuf[256]; int lcnt; for(lcnt = 0; fgets(lbuf,sizeof(lbuf) - 1, stdin); lcnt++); printf("%d lines\n", lcnt); exit(0); } Källa: Neil Ziring: Dictionary of Programming Languages Föreläsning 23 Programmeringens historia och paradigmer 27/39
C++ Bjarne Stroustrup, 1985 C med objektorientering Multipelt arv Undantagshantering Generiska typer Överlagring av operatorer Mycket utbrett Föreläsning 23 Programmeringens historia och paradigmer 28/39
Java Sun Microsystems, 1995 Förenklad och uppstädad C++ Saknar krångliga delar av C och C++: Multipelt arv Överlagring av operatorer Pekare Svagt typsystem Automatisk skräpsamling Microsofts C# är mycket liknande, men lämnar bort mindre. Föreläsning 23 Programmeringens historia och paradigmer 29/39
Python Guido van Rossum, 1991 Försöker vara ett generellt språk som inte är bunden till en viss paradigm Betonar läslighet: Indentering för block istället för klamrar Ord hellre än specialtecken Allt är objekt Avbildningar viktig del av språket Föreläsning 23 Programmeringens historia och paradigmer 30/39
Programspråkens historia Fjärde generationen Lätt obestämd kategori, men typiskt programspråk som är designade för en viss tillämpning, t.ex.: Språk inom tillämpningsprogram, t.ex. Visual Basic for Applications Databasspråk, som SQL Rapportgeneratorer Föreläsning 23 Programmeringens historia och paradigmer 31/39
Programmeringsparadigmer Vad är en paradigm? Ett sätt att närma sig programmerandet Vad ett program består av och gör Viktiga paradigmer Procedurell programmering Objektorienterad programmering Funktionell programmering Logikprogrammering Parallellprogrammering Föreläsning 23 Programmeringens historia och paradigmer 32/39
Programmeringsparadigmer Procedurell programmering Program består av operationer som utförs efter varann. Programmet bygger på en algoritm. Program består av delar som funktioner/procedurer, moduler... Exempel: FORTRAN, COBOL, ALGOL, Pascal, Ada, C, BASIC... Föreläsning 23 Programmeringens historia och paradigmer 33/39
Programmeringsparadigmer Objektorienterad programmering Programmet ses som objekt som har tillstånd och kommunicerar med varann. Betonar abstraktion och uppbyggande av en modell som innehåller de centrala begreppen och operationerna Introducerat i programspråk i Simula 67 (Dahl & Nygaard) Vidareutvecklat i Smalltalk (Xerox PARC, 1972) Exempel: C++, Java, C#, Python Föreläsning 23 Programmeringens historia och paradigmer 34/39
Programmeringsparadigmer Funktionell programmering Program består av funktioner som anropar andra funktioner I dess rena form finns inte tilldelningssatser och exekveringsordning alls. Rekursion centralt Datastrukturer bygger ofta på listor Exempel: Lisp (McCarthy, 1958), Scheme (Sussman & Steele, 1975), ML (Milner & Tofte, 1973) Föreläsning 23 Programmeringens historia och paradigmer 35/39
Programmeringsparadigmer Lisp exempel (defun fact1 (num) (cond ((not (integerp num)) nil) ((<= num 1) 1) (t (* num (fact1 (- num 1))))) ) Källa: Neil Ziring: Dictionary of Programming Languages Föreläsning 23 Programmeringens historia och paradigmer 36/39
Programmeringsparadigmer Logikprogrammering Programmet strukturerat som mål och regler som används för att uppnå målet Datorn ges en fråga, och den använder data och deduktionsregler för att hitta ett svar. Exempel: Prolog Föreläsning 23 Programmeringens historia och paradigmer 37/39
Programmeringsparadigmer Prolog exempel male(isaac). male(lot). female(milcah). female(yiscah). father(abraham,isaac). father(haran,lot). father(haran,milcah). father(haran,yiscah). son(x,y) :- father(y,x), male(x). daughter(x,y) :- father(y,x), female(x). son(x,haran)? Källa: Leon Sterling, Ehud Shapiro: The Art of Prolog, MIT Press 1994 Föreläsning 23 Programmeringens historia och paradigmer 38/39
Slut Nästa föreläsning Fortsättning och tentråd 8.12.2010 16:15 18:00 i T1 Kom ihåg Deadline för tionde ronden är tisdag 7.12 kl. 12! Föreläsning 23 Programmeringens historia och paradigmer 39/39