Úvod doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Co je to programovací jazyk? Louden: Notace pro popis výpočtů ve formě čitelné pro stroj i pro člověka. Reade: Programovací jazyk je konvence pro psaní popisů, které lze vyhodnotit. 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? 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) Vytváření nástrojů a metodologií pro vyhodnocení jazyků určených ke konkrétním projektům Zlepšení schopnosti učit se nové jazyky Zlepšení schopnosti navrhovat nové jazyky (většina velkých programových balíků obsahuje i vlastní programovací jazyk) 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 Pomoc při výběru správného jazyka pro zadaný úkol. Programovací jazyky a překladače 3 Klasifikace jazyků 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. Logické - programy jsou kolekcemi tvrzení v konkrétní logice (nejčastěji predikátové) Prolog, Goedel 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ů Strojově orientované jazyky instrukce, adresy přímo závislé na konkrétním procesoru náročný vývoj aplikací Jazyky vyšší úrovně 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 Překlad jednoho jazyka na druhý Co je to jazyk? Přirozený jazyk složitá, nejednoznačná pravidla Formální jazyk - popsán gramatikou Co je to překlad? 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 Vyhledání chyb ve zdrojovém textu 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 Jména proměnných a funkcí Odkazy do zdrojového textu Programovací jazyky a překladače 8 4
Zdrojový jazyk Přirozený jazyk Předmět zájmu (počítačové) lingvistiky Programovací jazyk C, C++, Java, C#, Prolog, Haskell Speciální jazyk 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 Strojový jazyk 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 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ákladní součást vývojových nástrojů v operačním systému 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) silikonové překladače - popis a vytváření struktury VLSI obvodů příkazové interprety v operačním systému (shell) databázové systémy dotazy, SQL reprezentace grafických objektů - jazyk PostScript skriptovací jazyky možnost rozšíření určitého systému uživatelem Programovací jazyky a překladače 13 Historie teoretické začátky Alonzo Church 30. léta - lambda-kalkul jako základ teorie vyčíslitelnosti Alan Turing uká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 Neumann pojem paměti základní model většiny současných počítačů návrh zkratek pro Mark I Programovací jazyky a překladače 14 7
Historie první jazyky kolem 1946 Konrad Zuse Plankalkul použit také pro šachy 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í určen pro zadávání rovnic "ručně kompilovaný" jazyk 1951 Grace Murray Hopper prosazovala vytvoření vyšších jazyků pracovala na návrhu prvního překladače zavedla pojem "počítačový virus" Programovací jazyky a překladače 15 Historie první překladače Výraz "kompilátor" 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) John Backus, IBM problémově orientovaný, strojově značně nezávislý, optimalizace (nutná v konkurenci s JSI) prokázala se vhodnost kompilovaných jazyků vysoké úrovně ad hoc struktury - komponenty a technologie se vymýšlely během výstavby překladače 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 Vypocet funkce faktorial C INTEGER FUNCTION FACT(N) IMPLICIT NONE INTEGER N, I, F F = 1 DO 10 I = 1,N F = F * I 10 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) John McCarthy, M. I. T. první funkcionální jazyk - implementace lambda-kalkulu možnost imperativního stylu programování 1958-60 ALGOL 60 (Algorithmic Language) J. Backus, P. Naur bloková struktura, složené příkazy, rekurze syntax 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ů 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) pro vytváření rozsáhlých programů k vládním a obchodním účelům formalizovaný anglický text, čitelný pro manažery zavedl propracované záznamové struktury vytvořen konferencí CODASYL (Conference of Data Systems and Languages), v roce 1968 standardizován ANSI 1964 BASIC (Beginners All-Purpose Symbolic Instruction Code) John G. Kemeny, Thomas E. Kurz, Dartmouth University první implementace je kompilátor (1. 5. 1964 04:00) 1975 Tiny BASIC běží na mikropočítači s 2KB RAM 1975 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 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 značně rozšířená verze jazyka ALGOL 60 příliš složitý na pochopení i implementaci strukturované datové typy, reference formální definice syntaxe i sémantiky dynamické přidělování paměti, garbage collection, moduly 1966 LOGO "želví" grafika určen pro výuku programování Programovací jazyky a překladače 24 12
Historie strukturované programování 1968-71 Pascal Niklaus Wirth, ETH Zurich jednoduchý jazyk, určen pro výuku programování P-kód instrukce virtuálního procesoru specializované procesory pro P-kód 1972 C Dennis Ritchie 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 <inp>'); 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 velmi dobrá podpora modularity, silná typová kontrola, dynamická pole, koprogramy 1980-83 Ada Jean Ichibah, Honeywell Bull pro US DoD podpora programování ve velkém, tvorba spolehlivého software silně typovaný jazyk, výjimky, modularita, paralelismus standardizace (Ada 83, Ada 95), oficiální validace překladačů do 1997 jediný přípustný jazyk v projektech DoD 1985-88 Oberon Wirth, Gutknecht, ETH Zurich určen pro výuku, objektově orientované vlastnosti Programovací jazyky a překladače 27 Modula-2 DEFINITION MODULE Storage; VAR ClearOnAllocate : BOOLEAN; PROCEDURE Allocate( VAR a: ADDRESS; size: CARDINAL ); PROCEDURE Free( VAR a: ADDRESS ); PROCEDURE Deallocate( VAR a: ADDRESS; size: CARDINAL ); PROCEDURE 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 Ole Dahl, Kristen Nygaard (Norsko) pro vytváření diskrétních simulačních modelů abstraktní datové typy, třídy, jednoduchá dědičnost - základ objektově orientovaných jazyků procesy, koprogramy 1972 Smalltalk Alan Kay, Xerox původně pouze experimentální jazyk čistě objektově orientovaný - vše je objekt, předávání zpráv první jazyk podporující GUI s okny 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++ Bjarne Stroustrup, AT&T Bell Labs odvozen z jazyka C => mnoho nebezpečných vlastností, např. dynamické přidělování paměti bez GC, aritmetika s ukazateli 1997 ISO a ANSI standard Programovací jazyky a překladače 30 15
Historie objektově orientované programování 1984-85 Objective C Brad J. Cox rozšíření jazyka C, pro OOP jsou určeny nové konstrukce považuje se za mnohem lepší než C++, volně dostupné překladače se objevily příliš pozdě hlavní programovací jazyk pro Apple NeXT a OS Rhapsody 1994-95 Java James Gosling, Sun Microsystems pů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řekladu 2000-02 C# Anders Hejlsberg, Microsoft základní jazyk architektury.net implementován i pro Linux (projekt Mono) a BSD Unix (projekt Rotor) 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á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