Co je to programovací jazyk?
Ú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]
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
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
2
Klasifikace jazyků z
z
3
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
1
Klasifikace jazyků
Úrovně jazyků
Deklarativní jazyky – popisujeme, co se má vypočítat, ne jak.
z
Strojově orientované jazyky z z z
z
z
Logické - programy jsou kolekcemi tvrzení v konkrétní logice (nejčastěji predikátové) Prolog, Goedel
z
Jazyky vyšší úrovně z z z
Funkcionální - programy se popisují jako soustavy rovností s aplikacemi funkcí na hodnoty. FP, LISP, Scheme, ML, Haskell
z z z z
Programovací jazyky a překladače
5
Úloha překladače z
z
z
Programovací jazyky a překladače
z
Co je to jazyk? z
z z
z
Přirozený jazyk – složitá, nejednoznačná pravidla Formální jazyk - popsán gramatikou
z
Zobrazení T : L1 → L2 L1: zdrojový jazyk (např. C++) L2: cílový jazyk (např. strojový kód P4)
z
z
z
7
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
Programovací jazyky a překladače
6
Vyhledání chyb ve zdrojovém textu
Co je to překlad? 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
Úloha překladače
Překlad jednoho jazyka na druhý z
instrukce, adresy přímo závislé na konkrétním procesoru náročný vývoj aplikací
Jména proměnných a funkcí Odkazy do zdrojového textu Programovací jazyky a překladače
8
2
Zdrojový jazyk z
Cílový jazyk
Přirozený jazyk z
z
Předmět zájmu (počítačové) lingvistiky
Strojový jazyk z z
z
Programovací jazyk z
z
z
C, C++, Java, C#, Prolog, Haskell
z
Speciální jazyk z 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
z
Kompilační překladač
Programovací jazyky a překladače
Jazyk virtuálního procesoru z
9
Absolutní binární kód Přemistitelný binární kód (.obj, .o) Jazyk symbolických instrukcí Vyšší programovací jazyk (např. C)
Java Virtual Machine MSIL pro .NET Programovací jazyky a překladače
10
Interpretační překladač
11
Programovací jazyky a překladače
12
3
Využití technologie překladačů
Historie – teoretické začátky
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.
Alonzo Church z 30. léta - lambda-kalkul jako základ teorie vyčíslitelnosti
Specializované překladače z 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 Programovací jazyky a překladače
Alan Turing z 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čů„ John von Neumann z pojem paměti z základní model většiny současných počítačů z návrh zkratek pro Mark I
13
Programovací jazyky a překladače
Historie – první jazyky
Historie – první překladače
kolem 1946 Konrad Zuse – Plankalkul z použit také pro šachy z rukopis publikován až v roce 1972, nebyl nikdy implementován
Výraz "kompilátor" z z z
1949 John Mauchly - Short Code z 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
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ě)
1951 Grace Murray Hopper z prosazovala vytvoření vyšších jazyků z pracovala na návrhu prvního překladače z zavedla pojem "počítačový virus" Programovací jazyky a překladače
14
15
Programovací jazyky a překladače
16
4
FORTRAN
Historie – vyšší jazyky
C C C
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í
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
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ů
PROGRAM P1 IMPLICIT NONE INTEGER N, F, FACT READ(*,*) N F = FACT(N) WRITE(*,*) "Fact = ", F END Programovací jazyky a překladače
17
Programovací jazyky a překladače
LISP
ALGOL 60
(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)
begin integer N; ReadInt(N);
Programovací jazyky a překladače
18
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 19
Programovací jazyky a překladače
20
5
Historie – vyšší jazyky
COBOL
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
IDENTIFICATION DIVISION. PROGRAM-ID. Iter. AUTHOR. Michael Coughlan.
Programovací jazyky a překladače
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. 21
Programovací jazyky a překladače
PL/I
Historie – vyšší jazyky
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;
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
23
Programovací jazyky a překladače
22
24
6
Historie – strukturované programování
Pascal program P3;
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
var F: Text; LineNo: Integer; Line: array [1..60] of Char; begin if ParamCount < 1 then begin WriteLn('Pouziti: opis
'); Halt; end;
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
Historie – modulární programování
Programovací jazyky a překladače
26
Modula-2 DEFINITION MODULE Storage;
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
Reset(F, ParamStr(1)); LineNo := 1; while not Eof(F) do begin ReadLn(F, Line); WriteLn(LineNo:4, ': ', Line); LineNo := LineNo + 1; end; end.
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.
27
Programovací jazyky a překladače
28
7
Historie – objektově orientované programování
Ada with TEXT_IO; use TEXT_IO;
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
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;
1972 Smalltalk 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 z
begin PUT("Zadejte cislo:"); GET(cislo); PUT(f(cislo)); SKIP_LINE; end faktorial;
1982-85 C++ 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 z
Programovací jazyky a překladače
29
Historie – objektově orientované programování
30
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); } }
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 z 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 2000-02 C# z Anders Hejlsberg, Microsoft z základní jazyk architektury .NET z implementován i pro Linux (projekt Mono) a BSD Unix (projekt Rotor) Programovací jazyky a překladače
Programovací jazyky a překladače
31
Programovací jazyky a překladače
32
8
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
9