Föreläsning 5 5DV086 - Programspråk Petter Ericson (pettter@cs.umu.se) Umeå University 6 februari, 2015
Haskell-frågor?
Haskell-tips do-syntax State-monaden
Dagens plan Programspråksteori Varför? Vad? Hur?
Varför? Enklare lära sig nya språk Enklare välja rätt språk Enklare uttrycka idéer Bättre koll på implementation Bättre utnyttja verktyg ni redan kan Allmänbildning
Varför? Vad används datorer till? Business (mainframe) Science (HPC m.m.) AI System Web (End-user programming)
Varför? Hur fungerar datorer? Harvard-arkitektur von Neumann-arkitektur En/flerkärnigt Nätverkat FPGA Olika abstraktionsnivåer Olika implementationer (Allt är elektronik)
Varför? Förstå inverkan på programspråk Alltid avvägningar Förstå varför vissa avvägningar gjorts
Vad? Historik (finns främst i boken) Bakgrund Analys/utvärdering
Historik Trender inom programspråk 50-talet: Hårdvara 60-talet: Senare delen: språken/metoder 70-talet: Senare delen: dataabstraktion 80-talet: Funktionell/logisk programmering 90-talet: OOP På sistone: Funktionell programmering igen, concurrency viktigare Mer i boken (kapitel 2 är intressant!)
Bakgrund Underliggande hårdvara/elektronik är viktig von Neumann-arkitektur: Data och instruktioner i samma minne CPU <= data/prg => minne Hexkod -> speedcode -> ASM -> imperativa språk Kännetecknande för imperativa språk Variabler minnesceller Tilldelning skicka data Iteration är effektivt
Fetch-execute-cykeln Program Counter (PC) = <minnesaddress för programmets första instruktion while 1 Hämta instruktionen vid PC PC += 1 tolka instruktionen utför instruktionen
Abstraktionslager
Bakgrund Överliggande abstraktion är viktig λ-kalkyl Allt är funktioner (inklusive nummer!) Kan göra allt en universell Turing-maskin kan (Church-Turing-tesen) AI -> Symboliskt tänk -> Lisp -> övriga funktionella språk Kännetecknande för funktionella språk Ingen uppfattning om specifika minnesceller Namngivna värden, inga variabler Listor och rekursion, inte iteration
Implementationer Kompilering till maskinkod Körs direkt på hårdvaran Potentiellt effektivast (beror lite på kompilator m.m.) Ren interpretering/tolkning Varje uttryck tolkas varje gång en instruktion utförs Generellt en magnitud långsammare än kompilerat Hybrid Kompilerat till IL (intermediate language) Virtual machine Just-in-time-kompilerat
Kompilering
Interpretering
Hybrid - IL
Hybrid - VM
Hybrid - JIT
KAFI
Programmeringsmiljö I början: allt manuellt Texteditor för källkod preprocessa kompilera länka Samlingsverktyg make -> automake -> cmake/maven/ant/foo/bar/baz RCS -> CVS -> SVN -> git, mercurial, etc. Utvecklingsmiljöer - IDE Enkla - Turbo Pascal, Think C, div. emacs-script, vim-plugin etc. Mer avancerade - Eclipse, Visual Studio, NetBeans, Delphi
Utvärderingskriterier Läsbarhet Skrivbarhet Tillförlitlighet Kostnad
Läsbarhet Givet ett program, hur enkelt är det att förstå? Viktigt för underhåll Påverkas av bl.a.: Enkelhet Ortogonalitet Syntax Inbyggda datatyper
Skrivbarhet Givet ett problem, hur enkelt är det att skriva ett program för? Viktigt för användbarhet Påverkas av bl.a.: Läsbarhet Abstraktionsmöjligheter Uttrycksfullhet
Tillförlitlighet Hur tidigt och tydligt kan felaktigheter hittas? Hur katastrofala är buggar? Viktigt för.. det mesta faktiskt Påverkas av bl.a.: Läsbarhet Skrivbarhet Stöd för undantag Stöd för alias Typkontroller
Kostnad Givet ett problem, hur mycket kostar det att utveckla ett program för det? Givet ett program, hur mycket kostar det att använda/hålla igång? Påverkas av bl.a.: Läsbarhet/skrivbarhet Tillförlitlighet Existerande verktyg Portabilitet Optimeringsmöjligheter
Beskriva syntax Reguljära lexem Kontextfria grammatiker...plus lite till
Backus-Naur Form BNF CFG N LHS LHS... LHS Relativt enkelt bygga parser från grammatik
EBNF Snyggare regler Liknar regex-utökningar
Attributgrammatiker EBNF/CFG klarar inte allt (kolla typer, att variabler är definierade etc.) Lösning: Sätt attribut på regler Ökar (beräknings)komplexiteten på språket Arbeta i flera steg
Beskriva semantik Kommer inte in tokmycket på det.. Finns ett antal olika sätt Informellt vanligast
Formell semantik Operational semantics Denotational semantics Axiomatic semantics