+ All Categories
Home > Documents > Ing. Marek Běhálek Katedra informatiky FEI VŠB-TUO A-1018...

Ing. Marek Běhálek Katedra informatiky FEI VŠB-TUO A-1018...

Date post: 27-Oct-2019
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
41
Programovací jazyky Ing. Marek Běhálek Katedra informatiky FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek [email protected]
Transcript

Programovací jazykyIng. Marek Běhálek

Katedra informatiky FEI VŠB-TUOA-1018 / 597 324 251

http://www.cs.vsb.cz/[email protected]

ZPP - Programovací jazyky 2

ObsahCo je to programovací jazykVývoj programovacích jazykůParadigma programování a různá paradigmata programováníSpecifikace programovacích jazykůPřekladačeKlasifikace jazyků a méně tradiční přístupy k programování

Studijní program „Informační a komunikačnítechnologie“

ZPP - Programovací jazyky 3

Programovací jazyk

Popis výpočtů, obvykle ve tvaru, jenžumožňuje provedení elektronickým počítačem (program)Standardizovaný nástroj pro komunikaci s počítačem

S jakými daty má počítač pracovat?Jak se tato data budou ukládat a přenášet?Které akce a kdy se mají provést?

ZPP - Programovací jazyky 4

Proč používáme programovací jazyky?

Zjednodušují přenos určitého typu informaceNoty v hudběMatematické formuleElektrotechnická schémata

Vyznačují se velkou přesností vyjádřeníPřirozené jazyky – vynechávání, gramatické chyby, víceznačnost

Jsou obvykle proveditelné na počítačiZnačkovací jazyky (HTML) – data, ne programSpecifikační jazyky (λ-kalkul) – teoretický výzkum

ZPP - Programovací jazyky 5

Historie – Teoretické začátkyAlonzo Church

30. léta - lambda-kalkul jako základ teorie vyčíslitelnosti

Alan Turingukázal, že stroj může řešit problémy"programování ve strojovém kódu omezuje rychlost a snadnost programování počítačů„

John von Neumannpojem pamětizákladní model většiny současných počítačůnávrh zkratek pro Mark I

ZPP - Programovací jazyky 6

Historie – První jazykykolem 1946 Konrad Zuse – Plankalkul

použit také pro šachyrukopis publikován až v roce 1972, nebyl nikdy implementován

1949 John Mauchly - Short Codeprvní počítačový jazyk skutečně použitý na elektronickém zařízeníurčen pro zadávání rovnic"ručně kompilovaný" jazyk

1951 Grace Murray Hopperprosazovala vytvoření vyšších jazykůpracovala na návrhu prvního překladačezavedla pojem "počítačový virus"

ZPP - Programovací jazyky 7

Historie - Úrovně jazykůStrojově orientované jazyky

instrukce, adresypřímo závislé na konkrétním procesorunáročný vývoj aplikací

Jazyky vyšší úrovněDelší doba překladu a generování cílového kóduVětší nároky na čas a paměť v době běhu programuPřenositelnost - podstatně menší závislost programů nakonkrétním technickém vybaveníČitelnostProstředky abstrakce - abstrakce dat a operacíKontrola a detekce chyb - ještě před spuštěním programu

ZPP - Programovací jazyky 8

Historie – První překladačeVýraz "kompilátor"

poč. 50. let - Grace Murray Hopperpřeklad jako 'kompilace posloupnosti podprogramů z knihovny'“automatické programování“ - kompilace v dnešním slova smyslu, považovalo se za nemožné

1954-57 FORTRAN (FORmula TRANslator)John Backus, IBMproblémově orientovaný, strojově značně nezávislý, optimalizaceprokázala se vhodnost kompilovaných jazyků vysoké úrovněad hoc struktury - komponenty a technologie se vymýšlely během výstavby překladačepřekladače se chápaly jako něco tajemného, složitého a drahého (18 člověkoroků - jeden z největších projektů v té době)

ZPP - Programovací jazyky 9

Historie – FORTRANCC Vypocet funkce faktorialC

INTEGER FUNCTION FACT(N)IMPLICIT NONEINTEGER N, I, FF = 1DO 10 I = 1,N

F = F * I10 CONTINUE

FACT = FEND

PROGRAM P1IMPLICIT NONEINTEGER N, F, FACTREAD(*,*) NF = FACT(N)WRITE(*,*) "Fact = ", FEND

ZPP - Programovací jazyky 10

Historie – Vyšší jazyky (1)1958-59 LISP 1.5 (List Processing)

John McCarthy, M. I. T.první funkcionální jazyk - implementace lambda-kalkulumožnost imperativního stylu programování

1958-60 ALGOL 60 (Algorithmic Language)J. Backus, P. Naurbloková struktura, složené příkazy, rekurzesyntax poprvé popsána formálně gramatikou (BNF)koncem 60. let se stal nejpopulárnějším jazykem v Evropězáklad mnoha dalších programovacích jazyků

ZPP - Programovací jazyky 11

Historie – ALGOL 60begin

integer N;ReadInt(N);

beginreal array Data[1:N];real sum, avg;integer i;sum:=0;for i:=1 step 1 until N dobegin real val;ReadReal(val);Data[i]:=if val<0 then -val else val

end;for i:=1 step 1 until N dosum:=sum + Data[i];

avg:=sum/N;PrintReal(avg)

endend

ZPP - Programovací jazyky 12

Historie – Vyšší jazyky (2)1960 COBOL (Common Business Oriented Language)

pro vytváření rozsáhlých programů k vládním a obchodním účelůmformalizovaný anglický text, čitelný pro manažeryzavedl propracované záznamové struktury

1964 BASIC (Beginners All-Purpose Symbolic InstructionCode)John G. Kemeny, Thomas E. Kurz, Dartmouth University1975 Tiny BASIC běží na mikropočítači s 2KB RAM1975 Bill Gates, Paul Allen prodávají firmě MITS

1963-64 PL/I (Programming Langugage I)kombinace jazyků COBOL, FORTRAN, ALGOL 60, snaha, aby obsahoval "všechno pro všechny" => příliš složitýzavedl konstrukce pro souběžné zpracování a výjimky

ZPP - Programovací jazyky 13

Historie – Vyšší programovacíjazyka (2)

Strukturované programování1968-71 Pascal

Niklaus Wirth, ETH Zurichjednoduchý jazyk, určen pro výuku programováníP-kód – instrukce virtuálního procesoruspecializované procesory pro P-kód

1972 CDennis Ritchieurčen částečně pro návrh přenositelných operačních systémů

Modulární programování1980 Modula-21980-83 Ada

ZPP - Programovací jazyky 14

Historie – Objektověorientované programování (1)1964-67 SIMULA 671972 Smalltalk

Alan Kay, Xerox - původně pouze experimentální jazykčistě objektově orientovaný - vše je objekt, předávání zprávprvní jazyk podporující GUI s okny

1982-85 C++Bjarne Stroustrup, AT&T Bell Labsodvozen z jazyka C => mnoho nebezpečných vlastností, např. dynamicképřidělování paměti bez GC, aritmetika s ukazateli1997 ISO a ANSI standard

1984-85 Objective C1994-95 Java

James Gosling, Sun Microsystemspůvodně pro vestavná zařízení, později široké použití v rámci WWW, strojověnezávislý binární kód (Java bytecode), použití just-in-time překlad

2000-02 C#Anders Hejlsberg, Microsoft, základní jazyk architektury .NET

ZPP - Programovací jazyky 15

Historie – Jazyk a architektura počítače

Omezení jazyku na to, co lze efektivně implementovat na současných procesorech.Von Neumannova architektura

Model klasických procesorůZáklad klasických jazyků

Funkcionální jazykyBackus (1978, Turing Adward) – kritika přístupu „od architektury k jazyku“Funkcionální jazyky jsou efektivnější než imperativní

Lze dokazovat vlastnosti programůJednoduše je lze paralelizovatZaloženo na algebraických pravidlech

Malá efektivita implementace – možné optimalizace

ZPP - Programovací jazyky 16

Paradigmata programování -Úvod

Paradigma programování určuje styl programování.Paradigma programování reprezentuje a definuje jakým způsobem vnímá programátor vykonávání programu.Například objektově orientované paradigma programovánídefinuje program jako kolekci komunikujících objektů.Různé programovací jazyky implementují různá paradigmata programování.

Jazyk může být založen na jednom, ale klidně i na více paradigmatech.Často není striktní – jazyk obsahuje více paradigmat a záleží na programátorovi, jaký kód vyprodukuje (strukturovaný program v C++).Jednotlivé paradigmata mají většinou určité specifické vlastnosti.

Existuje celá řada paradigmat pro programováníVznikají stále nové.

ZPP - Programovací jazyky 17

Paradigmata programování –Různá paradigmata (1)

Annotative programming (as in Flare language) Aspect-oriented programming (as in AspectJ) Attribute-oriented programming (might be the same as annotative programming) (as in Java 5 Annotations, pre-processed by the XDoclet class; C# Attributes ) Class-based programming, compared to Prototype-based programming (within the context of object-oriented programming] Concept-oriented programming is based on using concepts as the main programming construct. Constraint programming, compared to Logic programming Data-directed programming Dataflow programming (as in Spreadsheets) Flow-driven programming, compared to Event-driven programming Functional programming Imperative programming, compared to Declarative programming Intentional Programming Logic programming (as in Mathematica)

ZPP - Programovací jazyky 18

Paradigmata programování –Různá paradigmata (2)

Message passing programming, compared to Imperative programming Object-Oriented Programming (as in Smalltalk) Pipeline Programming (as in the UNIX command line) Policy-based programming Procedural programming, compared to Functional programming Process oriented programming a parallel programming model. Recursive programming, compared to Iterative programming Reflective programming Scalar programming, compared to Array programming Component-oriented programming (as in OLE) Structured programming, compared to Unstructured programming Subject-oriented programming Tree programming Value-level programming, compared to Function-level programming

ZPP - Programovací jazyky 19

Specifikace programovacích jazyků - Co chceme popsat?

Jak má vypadat správně napsaný program?SYNTAXEFormální jazyky, gramatiky, automaty

Co má program dělat?SÉMANTIKAPredikátový počet, lambda kalkul, atributovégramatiky

ZPP - Programovací jazyky 20

Specifikace programovacích jazyků

Syntaxe - struktura jazykových konstrukcíTextové jazyky (C, Pascal, Java)Grafické jazyky (vývojové diagramy, UML)

a > 10

x := x + 5

if a > 10 then beginx := x + 5;

end

ano

ne

ZPP - Programovací jazyky 21

Specifikace programovacích jazyků - Popis syntaxe

Syntaktický diagram

Gramatikapříkaz → if podmínka then příkaz zbytekzbytek → else příkaz

| ε

if podmínka then příkaz else příkaz

ZPP - Programovací jazyky 22

Specifikace programovacích jazyků – Standardy

Backus-Naur Form (BNF)<decl> -> ‘DEF’ <ident> ‘=‘ <expr> <expr1>

| ‘TYPE’ <ident> ‘=‘ <type><expr1> -> ‘;’ <expr> <expr1>

| ePříklad: DEF a = 1;

Extended Backus-Naur Form (EBNF)Doplněny operátory pro regulární výrazy

<decl> -> ‘DEF’ <ident> ‘=‘ <expr> ( <expr> )*| ‘TYPE’ <ident> ‘=‘ <type>

ZPP - Programovací jazyky 23

Specifikace programovacích jazyků

Sémantika – význam jazykových konstrukcíStatická sémantika – v době překladuDynamická sémantika – v době běhu

Příklad: Co znamená X + 1 ?X je celé číslo: Přičti k hodnotě proměnné X jedničku.X je řetězec: Převeď konstantu 1 na řetězec a připoj na konec řetězce uloženého v proměnné X.X je objekt: Zavolej metodu "operator +“s parametrem 1.X je reálné číslo: Převeď 1 na reálné číslo 1.0 a přičti k hodnotě proměnné X.

ZPP - Programovací jazyky 24

Specifikace programovacích jazyků - Metody popisu sémantiky

Slovní popisNepřesný

Formální popisAxiomatická sémantika

Vyjádření významu programu pomocí tvrzení (predikátoválogika, specifikační jazyky, …){P} while R do S {Q ∧ ¬R}

Operační sémantikaVyjádření významu programu posloupností přechodů mezi stavy

Denotační sémantikaVyjádření významu programu pomocí funkcíE : Expr → (String → Int) → Int

ZPP - Programovací jazyky 25

Překladač

Analýza zdrojového textu, vyhledání chybZákladní stavební prvky – identifikátory, čísla, řetězce, operátory, oddělovače, …Programové konstrukce – deklarace, příkazy, výrazyKontextové vazby – definice/užití, datové typy

Syntéza cílového programu / InterpretaceStrojový jazyk (nebo JSI)Jazyk virtuálního procesoru (JVM, CLR)

ZPP - Programovací jazyky 26

Typy překladače

Kompilační překladač

Interpretační překladač

ZPP - Programovací jazyky 27

Typy překladače -Rozdíly mezi kompilátorem a interpretem

Interpret je mnohem pomalejší nežkompilátor

Je potřeba analyzovat zdrojový příkaz pokaždé, když na něj program narazí.Interpret je 10 x až 100 x pomalejší.

Interpret má ale i výhody.Nezávislost na platformě.Snadnější ladění – v době chyby máme k dispozici všechny informace.Možnost měnit program za běhu - Smaltalk.

ZPP - Programovací jazyky 28

Typy překladačeInkrementální překlad

Umožňuje po drobné opravě přeložit jen změněnou částMožnost provádění drobných změn během laděníprogramu

Just-in-time překladGenerování instrukcí virtuálního procesoru (Java VM - .class, .NET CLR – jazyk IL)Překlad až v okamžiku volání podprogramuOptimalizace podle konkrétního procesoru

ZPP - Programovací jazyky 29

Překlad C++

ZPP - Programovací jazyky 30

Klasifikace jazyků (1)Imperativní - programy jsou posloupnosti základních příkazů (nejčastěji přiřazení) s odpovídajícími řídicími strukturami (např. cykly), jež určují, které příkazy se budou provádět a v jakém pořadí.C, Pascal, Fortran, JSIObjektově orientované - programy jsou kolekcí komunikujících objektů. Často se s těmito jazyky spojuje dědičnost a polymorfismus.Simula, Smalltalk-80, C++, Java, C#

ZPP - Programovací jazyky 31

Klasifikace jazyků (2)Deklarativní jazyky

– popisujeme, co se má vypočítat, ne jak.

Logické - programy jsou kolekcemi tvrzenív konkrétní logice (nejčastěji predikátové)Prolog, GoedelFunkcionální - programy se popisují jako soustavy rovností s aplikacemi funkcí na hodnoty. FP, LISP, Scheme, ML, Haskell

ZPP - Programovací jazyky 32

Klasifikace jazyků (3)

Paralelní – programy jsou kolekcemi komunikujících nebo jinak kooperujících procesů.Některé verze jazyka Modula-2, Ada

V současné době paralelizace řešena spíše „knihovními“ funkcemi – MPI, PVM

Skriptovací – jsou určeny jako podpora pro větší programovací jazyk. Lze kombinovat s libovolným z předcházejících modelů.

ZPP - Programovací jazyky 33

Rozdíly mezí imperativními a deklarativními jazyky

Imperativní jazykyProgram má implicitní stav, který se modifikuje konstrukcemi programovacího jazyka.Explicitní pojem „pořadí“ příkazů

Vyjadřuje, jak se má program vyhodnocovatVychází z aktuální (Von Neummanovy) architektury počítačů

Jednoduchá a efektivní realizaceDeklarativní jazyky

Program nemá implicitní stav.Program je tvořen výrazy, ne příkazy.Popisujeme co se má spočítat, ne jak.

Není dáno pořadí příkazu.Efektivní implementace vyžaduje komplexní optimalizace.

Funkcionální jazyky x Relační (logické) jazyky

ZPP - Programovací jazyky 34

Funkcionální programování –Funkcionální programovací jazyky (1)

Vycházejí z λ-kalkulu – základním modelem výpočtu je matematický pojem funkce aplikované na argument a vypočítávající deterministicky jejívýsledek.Program je složen s funkcí bez vedlejších efektů.Funkce jsou brány jako běžné hodnoty („first-class values“).Funkcionální jazyky mají lepší mechanismus abstrakce

Možnost abstrahovat chování pomocí funkcí vyššího řádu.Program je budován z funkcí jejich kompozicí.Většinou mnohem stručnější programy

Funkcionální programovací jazyky neobsahují přiřazení, příkazy, cykly atd. Opakování je řešeno pomocí rekurze.Přiřazení má „matematický“ význam.Proměnná má v daném kontextu vždy tutéž hodnotu – referenční transparence.

ZPP - Programovací jazyky 35

Funkcionální programování –Funkcionální programovací jazyky (2)

Umožňují nové algebraické přístupyLazy evaluation ( x eager evaluation)

Možnost používat potencionálně nekonečné struktury.Možnost oddělení dat od řízení – nemusíme se starat o to, jak proběhne vyhodnocení.

Umožňuje nové přístupy k vývoji programůMožnost dokazovat programy Možnost transformovat program na základě algebraických vlastností

Umožňuje lepší využití paralelního provádění programůJednoduchá dekompozice programů na části, které lze vyhodnocovat paralelně.

Potencionálně příliš mnoho paralelismů.Možnost kompozice dvou paralelních úloh jednoduchou kompozicífunkcí.

ZPP - Programovací jazyky 36

Funkcionální programování –Příklady

Vytvoření seznamu druhých mocnindm [] = []dm (x:xs) = sq x : dm xs

where sq x = x * x

Seřazení seznamu (quicksort)qs [] = []qs (x:xs) =

let ls = filter (< x) xsrs = filter (>=x) xs

in qs ls ++ [x] ++ qs rs

ZPP - Programovací jazyky 37

OOP – Smalltalk (1)Existují i jiné objektově orientované jazyky nežJava…"When I invented the term 'object-oriented' I did not have C++ in mind." -- Alan Kay

Jedním z „jiných“ objektově orientovaných jazyků je jazyk Smalltalk

Ve skutečnosti neexistuje jazyk Smalltalk. Existuje celářada „variant“ jazyků obsahujících Smalltalk v jejich názvu.Obvykle je pod pojemem Smalltalk rozuměn jazyk Smalltalk-80.

ZPP - Programovací jazyky 38

OOP – Smalltalk (2)Smalltalk je čistě objektově orientovaný jazyk.

Koncepce tříd a objektůZákladní myšlenkou je, že vše je objekt a objekty spolu komunikují prostřednictvím zpráv

Objekty mohou v jazyce Smalltalk provádět právě tři činnostiUdržovat stav (reference na další objekty)Přijímat zprávy od sebe a nebo od jiných objektůV rámci reakce na zprávu posílat zprávy jiným objektům.

Vše v jazyce Smalltalk je objekt. Každý objekt je instancí nějaké třídy. Třídy jsou také objekty. Každá třída je instancí nějaké metatřídy.Metatřídy jsou všechny instancí třídy Metaclass. Blok zdrojového kódu je taky objekt

Například tělo metody – zprávy

ZPP - Programovací jazyky 39

OOP – Smalltalk (3)Jazyk Smaltalk integruje kompletní mechanismus reflexe.Obvykle realizuje „image-based persistence“

Prostředí pro jazyky jako Java oddělují zdrojový kód od stavu programu.

Zdrojový kód je nahrán při startu aplikace.Po ukončení jsou ztraceny všechny data kromě těch, kterébyly explicitně uloženy.

V jazyce Smalltalk je vše objektem, tedy například i třídy, a vše je uloženo jako jeden „image“.Ten může být snadno „obnoven“.Vývojové prostředí je obvykle součástí prostředí. Nenívyužíván žádný „externi“ nástroj.

ZPP - Programovací jazyky 40

OOP – Smalltalk – Řídicístruktury (2)

Cykly typu „while“| a |a := 100 atRandom.[ a = 42 ] whileFalse: [ a := 100 atRandom ].

Cyklus typu „for“100 timesRepeat: [ Transcript show: 'Hello

world.'; cr ].

Na závěr Hello world program (omlouvám se, že nebyl někde na začátku☺):Transcript show: 'Hello, world!'.

ZPP - Programovací jazyky 41

Studijní program „Informační a komunikační technologie“

Úvod do programování (Java)Programování v C/C++Programování v C#Programovací technikyProgramovací jazyky a překladačeSeminář z programování

Funkcionální a logické programování


Recommended