Úvod doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes
[email protected]
Co je to programovací jazyk? z
Louden: Notace pro popis výpočtů ve formě čitelné pro stroj i pro člověka.
z
Reade: Programovací jazyk je konvence pro psaní popisů, které lze vyhodnotit.
z
Stansifer: Cílem jazyka je komunikace […] Programovací jazyky se používají ke komunikaci s literárně nadanými stroji. Programovací jazyky a překladače
2
1
Proč studovat programovací jazyky? z
Učíme-li se nové jazyky, nacházíme nové postupy pro vyjádření svých myšlenek (i když tyto jazyky k vyjadřování nepoužíváme)
z
Vytváření nástrojů a metodologií pro vyhodnocení jazyků určených ke konkrétním projektům
z
Zlepšení schopnosti učit se nové jazyky
z
Zlepšení schopnosti navrhovat nové jazyky (většina velkých programových balíků obsahuje i vlastní programovací jazyk)
z
Vytváření lepších programů v konkrétních jazycích – lepší porozumění výhodám a nevýhodám konkrétních struktur
z
Pomoc při výběru správného jazyka pro zadaný úkol. Programovací jazyky a překladače
3
Klasifikace jazyků z
z
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, JSI Objektově 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# Programovací jazyky a překladače
4
2
Klasifikace jazyků Deklarativní jazyky – popisujeme, co se má vypočítat, ne jak. z
Logické - programy jsou kolekcemi tvrzení v konkrétní logice (nejčastěji predikátové) Prolog, Goedel
z
Funkcionální - programy se popisují jako soustavy rovností s aplikacemi funkcí na hodnoty. FP, LISP, Scheme, ML, Haskell Programovací jazyky a překladače
5
Úrovně jazyků z
Strojově orientované jazyky z z z
z
instrukce, adresy přímo závislé na konkrétním procesoru náročný vývoj aplikací
Jazyky vyšší úrovně z z z z z z z
Delší doba překladu a generování cílového kódu Větší nároky na čas a paměť v době běhu programu Přenositelnost - podstatně menší závislost programů na konkrétním technickém vybavení Čitelnost Prostředky abstrakce - abstrakce dat a operací Kontrola a detekce chyb - ještě před spuštěním programu Programovací jazyky a překladače
6
3
Úloha překladače z
Překlad jednoho jazyka na druhý z
Co je to jazyk? z z
z
Přirozený jazyk – složitá, nejednoznačná pravidla Formální jazyk - popsán gramatikou
Co je to překlad? z z z
Zobrazení T : L1 → L2 L1: zdrojový jazyk (např. C++) L2: cílový jazyk (např. strojový kód P4)
Programovací jazyky a překladače
7
Úloha překladače z
Vyhledání chyb ve zdrojovém textu z
z
z
z
Snažíme se co nejvíce chyb objevit v době překladu Zotavení po chybě – překladač je schopen pokračovat v činnosti a najít další chyby Oprava chyb – náročné, nepoužívá se
Vytvoření informací pro ladění programu z z
Jména proměnných a funkcí Odkazy do zdrojového textu Programovací jazyky a překladače
8
4
Zdrojový jazyk z
Přirozený jazyk z
z
Programovací jazyk z
z
Předmět zájmu (počítačové) lingvistiky
C, C++, Java, C#, Prolog, Haskell
Speciální jazyk z z z
Jazyky pro popis VLSI prvků (VHDL) Jazyky pro popis dokumentů (LaTeX, HTML, XML, RTF) Jazyky pro popis grafických objektů (PostScript) Programovací jazyky a překladače
9
Cílový jazyk z
Strojový jazyk z z z z
z
Absolutní binární kód Přemistitelný binární kód (.obj, .o) Jazyk symbolických instrukcí Vyšší programovací jazyk (např. C)
Jazyk virtuálního procesoru z z
Java Virtual Machine MSIL pro .NET Programovací jazyky a překladače
10
5
Kompilační překladač
Programovací jazyky a překladače
11
Interpretační překladač
Programovací jazyky a překladače
12
6
Využití technologie překladačů Klasické překladače z základní součást vývojových nástrojů v operačním systému z křížové překladače (cross compilers) - vývoj programů pro vestavné systémy apod. Specializované překladače systémy pro formátování textů (nroff, troff, LaTeX) z silikonové překladače - popis a vytváření struktury VLSI obvodů z příkazové interprety v operačním systému (shell) z databázové systémy – dotazy, SQL z reprezentace grafických objektů - jazyk PostScript z skriptovací jazyky – možnost rozšíření určitého systému uživatelem z
Programovací jazyky a překladače
13
Historie – teoretické začátky Alonzo Church z 30. léta - lambda-kalkul jako základ teorie vyčíslitelnosti Alan Turing ukázal, že stroj může řešit problémy z "programování ve strojovém kódu omezuje rychlost a snadnost programování počítačů„ z
John von Neumann pojem paměti z základní model většiny současných počítačů z návrh zkratek pro Mark I z
Programovací jazyky a překladače
14
7
Historie – první jazyky kolem 1946 Konrad Zuse – Plankalkul z použit také pro šachy z rukopis publikován až v roce 1972, nebyl nikdy implementován 1949 John Mauchly - Short Code první počítačový jazyk skutečně použitý na elektronickém zařízení z určen pro zadávání rovnic z "ručně kompilovaný" jazyk z
1951 Grace Murray Hopper prosazovala vytvoření vyšších jazyků z pracovala na návrhu prvního překladače z zavedla pojem "počítačový virus" z
Programovací jazyky a překladače
15
Historie – první překladače Výraz "kompilátor" z z z
poč. 50. let - Grace Murray Hopper př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) z John Backus, IBM z problémově orientovaný, strojově značně nezávislý, optimalizace (nutná v konkurenci s JSI) z prokázala se vhodnost kompilovaných jazyků vysoké úrovně z ad hoc struktury - komponenty a technologie se vymýšlely během výstavby překladače z př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ě) Programovací jazyky a překladače
16
8
FORTRAN C C C
10
Vypocet funkce faktorial INTEGER FUNCTION FACT(N) IMPLICIT NONE INTEGER N, I, F F = 1 DO 10 I = 1,N F = F * I CONTINUE FACT = F END PROGRAM P1 IMPLICIT NONE INTEGER N, F, FACT READ(*,*) N F = FACT(N) WRITE(*,*) "Fact = ", F END Programovací jazyky a překladače
17
Historie – vyšší jazyky 1958-59 LISP 1.5 (List Processing) z John McCarthy, M. I. T. z první funkcionální jazyk - implementace lambda-kalkulu z možnost imperativního stylu programování 1958-60 ALGOL 60 (Algorithmic Language) z J. Backus, P. Naur z bloková struktura, složené příkazy, rekurze z syntax poprvé popsána formálně gramatikou (BNF) z koncem 60. let se stal nejpopulárnějším jazykem v Evropě z základ mnoha dalších programovacích jazyků
Programovací jazyky a překladače
18
9
LISP (defun quicksort (vec l r) (let ((i l) (j r) (p (svref vec (round (+ l r) 2)))) (while (<= i j) (while (< (svref vec i) p) (incf i)) (while (> (svref vec j) p) (decf j)) (when (<= i j) (rotatef (svref vec i) (svref vec j)) (incf i) (decf j))) (if (> (- j l) 1) (quicksort vec l j)) (if (> (- r i) 1) (quicksort vec i r))) vec) Programovací jazyky a překladače
19
ALGOL 60 begin integer N; ReadInt(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; ReadReal(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; PrintReal(avg) end end Programovací jazyky a překladače
20
10
Historie – vyšší jazyky 1960 COBOL (Common Business Oriented Language) z pro vytváření rozsáhlých programů k vládním a obchodním účelům z formalizovaný anglický text, čitelný pro manažery z zavedl propracované záznamové struktury z vytvořen konferencí CODASYL (Conference of Data Systems and Languages), v roce 1968 standardizován ANSI 1964 BASIC (Beginners All-Purpose Symbolic Instruction Code) z John G. Kemeny, Thomas E. Kurz, Dartmouth University z první implementace je kompilátor (1. 5. 1964 04:00) z 1975 Tiny BASIC běží na mikropočítači s 2KB RAM z 1975 Bill Gates, Paul Allen prodávají firmě MITS 1963-64 PL/I (Programming Langugage I) z kombinace jazyků COBOL, FORTRAN, ALGOL 60 z snaha, aby obsahoval "všechno pro všechny" => příliš složitý z zavedl konstrukce pro souběžné zpracování a výjimky Programovací jazyky a překladače
21
COBOL IDENTIFICATION DIVISION. PROGRAM-ID. Iter. AUTHOR. Michael Coughlan. DATA DIVISION. WORKING-STORAGE SECTION. 01 Num1 PIC 9 VALUE ZEROS. 01 Num2 PIC 9 VALUE ZEROS. 01 Result PIC 99 VALUE ZEROS. 01 Operator PIC X VALUE SPACE. PROCEDURE DIVISION. Calculator. PERFORM 3 TIMES DISPLAY "Enter First Number : " ACCEPT Num1 DISPLAY "Enter Second Number : " ACCEPT Num2 DISPLAY "Enter operator (+ or *) : " ACCEPT Operator IF Operator = "+" THEN ADD Num1, Num2 GIVING Result END-IF IF Operator = "*" THEN MULTIPLY Num1 BY Num2 GIVING Result END-IF DISPLAY "Result is = ", Result END-PERFORM. STOP RUN. Programovací jazyky a překladače
22
11
PL/I FINDSTRINGS: PROCEDURE OPTIONS(MAIN) /* načte STRING a poté vytiskne každý následující shodující se řádek */ DECLARE PAT VARYING CHARACTER(100), LINEBUF VARYING CHARACTER(100), (LINENO, NDFILE, IX) FIXED BINARY; NDFILE = 0; ON ENDFILE(SYSIN) NDFILE=1; GET EDIT(PAT) (A); LINENO = 1; DO WHILE (NDFILE=0); GET EDIT(LINEBUF) (A); IF LENGTH(LINEBUF) > 0 THEN DO; IX = INDEX(LINEBUF, PAT); IF IX > 0 THEN DO; PUT SKIP EDIT (LINENO,LINEBUF)(F(2),A) END; END; LINENO = LINENO + 1; END; END FINDSTRINGS; Programovací jazyky a překladače
23
Historie – vyšší jazyky 1968 ALGOL 68 z značně rozšířená verze jazyka ALGOL 60 z příliš složitý na pochopení i implementaci z strukturované datové typy, reference z formální definice syntaxe i sémantiky z dynamické přidělování paměti, garbage collection, moduly 1966 LOGO z "želví" grafika z určen pro výuku programování Programovací jazyky a překladače
24
12
Historie – strukturované programování 1968-71 Pascal z Niklaus Wirth, ETH Zurich z jednoduchý jazyk, určen pro výuku programování z P-kód – instrukce virtuálního procesoru z specializované procesory pro P-kód 1972 C z Dennis Ritchie z určen částečně pro návrh přenositelných operačních systémů Programovací jazyky a překladače
25
Pascal program P3; var F: Text; LineNo: Integer; Line: array [1..60] of Char; begin if ParamCount < 1 then begin WriteLn('Pouziti: opis
'); Halt; end; Reset(F, ParamStr(1)); LineNo := 1; while not Eof(F) do begin ReadLn(F, Line); WriteLn(LineNo:4, ': ', Line); LineNo := LineNo + 1; end; end. Programovací jazyky a překladače
26
13
Historie – modulární programování 1980 Modula-2 z velmi dobrá podpora modularity, silná typová kontrola, dynamická pole, koprogramy 1980-83 Ada z Jean Ichibah, Honeywell Bull pro US DoD z podpora programování ve velkém, tvorba spolehlivého software z silně typovaný jazyk, výjimky, modularita, paralelismus z standardizace (Ada 83, Ada 95), oficiální validace překladačů z do 1997 jediný přípustný jazyk v projektech DoD 1985-88 Oberon z Wirth, Gutknecht, ETH Zurich z určen pro výuku, objektově orientované vlastnosti Programovací jazyky a překladače
27
Modula-2 DEFINITION MODULE Storage; VAR ClearOnAllocate : BOOLEAN; PROCEDURE PROCEDURE PROCEDURE PROCEDURE
Allocate( VAR a: ADDRESS; size: CARDINAL ); Free( VAR a: ADDRESS ); Deallocate( VAR a: ADDRESS; size: CARDINAL ); Reallocate( VAR a: ADDRESS; size: CARDINAL );
PROCEDURE MemorySize( a : ADDRESS ): CARDINAL; TYPE TMemoryStatus = RECORD MemoryLoad : LONGCARD; (* percent of memory in use *) TotalPhys : LONGCARD; (* bytes of physical memory *) END; PROCEDURE GetMemoryStatus( VAR MemoryStatus : TMemoryStatus ); END Storage.
Programovací jazyky a překladače
28
14
Ada with TEXT_IO; use TEXT_IO; procedure faktorial is package IIO is new INTEGER_IO(Integer); use IIO; cislo: Integer; function f(n : Integer) return Integer is begin if n < 2 then return 1; else return n*f(n-1); end if; end f; begin PUT("Zadejte cislo:"); GET(cislo); PUT(f(cislo)); SKIP_LINE; end faktorial; Programovací jazyky a překladače
29
Historie – objektově orientované programování 1964-67 SIMULA 67 z Ole Dahl, Kristen Nygaard (Norsko) z pro vytváření diskrétních simulačních modelů z abstraktní datové typy, třídy, jednoduchá dědičnost - základ objektově orientovaných jazyků z procesy, koprogramy 1972 Smalltalk z Alan Kay, Xerox z původně pouze experimentální jazyk z čistě objektově orientovaný - vše je objekt, předávání zpráv z první jazyk podporující GUI s okny z zpočátku interpretovaný, nyní překlad do abstraktního strojového kódu, příp. Just-in-time generování kódu 1982-85 C++ z Bjarne Stroustrup, AT&T Bell Labs z odvozen z jazyka C => mnoho nebezpečných vlastností, např. dynamické přidělování paměti bez GC, aritmetika s ukazateli z 1997 ISO a ANSI standard Programovací jazyky a překladače
30
15
Historie – objektově orientované programování 1984-85 Objective C z Brad J. Cox z rozšíření jazyka C, pro OOP jsou určeny nové konstrukce z považuje se za mnohem lepší než C++, volně dostupné překladače se objevily příliš pozdě z hlavní programovací jazyk pro Apple NeXT a OS Rhapsody 1994-95 Java James Gosling, Sun Microsystems z původně pro vestavná zařízení, později široké použití v rámci WWW z strojově nezávislý binární kód (Java bytecode), použití just-in-time překladu z
2000-02 C# Anders Hejlsberg, Microsoft z základní jazyk architektury .NET z implementován i pro Linux (projekt Mono) a BSD Unix (projekt Rotor) z
Programovací jazyky a překladače
31
C# using System; using System.Windows.Forms; using System.Drawing; public class Sample : Form { [STAThread] public static int Main(string[] args) { Application.Run(new Sample()); return 0; } public Sample() { Button btn = new Button(); btn.Text = "OK"; Controls.Add(btn); } } Programovací jazyky a překladače
32
16
Historie – shrnutí z
z
z
Základní principy překladačů už jsou přes 30 let stále stejné a tvoří součást jádra informatiky I nejstarší programovací jazyky jsou stále živé – tradice, investice, vývoj Z historie se můžeme poučit – inspirace, ověřené principy i chyby Programovací jazyky a překladače
33
17