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 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 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!'.