Programovací jazyk univerzální notace pro zápis algoritmů, která je implementována. Proč studovat programovací jazyky? æ schopnost psát efektivní programy pole jako parametr funkce nebo procedury lze v principu předat i hodnotou rekurze (např. násobení se dá naprogramovat pomocí sčítání cyklem, ale i rekurzí) æ lepší využití existujících programovacích jazyků æ přehled o užitečných programových konstrukcích lidé mají tendenci myslet v prog. jazycích, které ovládají užitečné konstrukce, které se vyskytují v jednom jazyce, je možné naprogramovat v jiném æ schopnost výběru prog. jazyka, vhodného pro danou aplikaci æ zjednoduší se proces učení nových jazyků æ snadnější návrh nových jazyků 1
Vývoj programovacích jazyků 50. léta æ Assembler. Jazyk symbolických adres. Zaváděl jména pro instrukce, které byla schopna provádět procesorová jednotka a zejména symbolické označení (návěští) cílové adresy skokových instrukcí. æ FORTRAN (FORmula TRANslator), 1955-57. Numerické výpočty, hlavní důraz kladen na efektivitu generovaného kódu. æ LISP (LISt Processing). Následník IPL, nasazen pro aplikace v oblasti umělé inteligence (snadná práce se seznamy, které reprezentují stavový prostor). Jde o první funkcionální jazyk. æ ALGOL (ALGOrithmic Language), 1958. Vznikl jako alternativa k Fortranu, objevuje se myšlenka nezávislosti na HW (návrh Fortranu byl původně podřízen architektuře IBM 704). Zavádí se koncept Call by name (obtížně implementovatelné). 60. léta æ COBOL (COmmon Business Oriented Language), 1960. Snaha vytvořit čitelný jazyk blízký mluvené angličtině, oddělení strojově nezávislých částí kódu od strojově závislých, oddělení popisu algoritmu od popisu dat. æ Simula, 1967. Používá se pro programové simulace reálných procesů. Zavádí se pojem třídy. æ PL/I. Snaha zkombinovat schopnosti FORTRANu (numerické výpočty) a COBOLu (snadná čitelnost programů). æ Revize existujících programovacích jazyků (FORTRAN, COBOL, AL- GOL). 70. léta æ Pascal, 1970. Patrně nejpopulárnější programovací jazyk 70. let. Charakteristická je silná podpora strukturovaného programování. Při přenosu na nové HW platformy byl úspěšně použit tzv. bootstrapping. 2
æ C, 1970. Vyvinut pro účely systémového programovaní v návaznosti na OS Unix (použit při přepisu jádra Unixu do vyššího programovacího jazyka). Jde o velmi úsporný jazyk, např. vstupně/výstupní funkce nejsou součástí jeho definice. æ Ada. Původně navržena pro vojenské aplikace snaha sjednotit vývoj veškerého vojenského SW na jediné bázi (standard pro jazyk Ada existoval dříve, než fungující překladač). Ada obsahuje podporu pro distribuované a real-time aplikace, jde o složitý a obtížně implementovatelný jazyk. æ Prolog (PROgramming in LOGic), 1972. Dominantní jazyk v oblasti tzv. logického programování. Používá se pro aplikace z oblasti umělé inteligence (zejména expertní systémy). æ ML (Meta Language). Kombinuje imperativní a funkcionální programování, má zajímavě řešený systém typové kontroly. æ Smalltalk. Původně šlo nejen o jazyk, ale vlastněo totální prostředí (jazyk, počítač, programovací prostředí). Později byl jazyk přenesen i na jiné operační systémy. Je od začátku koncipován jako objektový jazyk. 80. léta æ C++, 1986. Rozšíření jazyka C, zavedení konstrukcí umožňujících objektové programování. æ OCCAM. Jazyk nízké úrovně navržený pro transputerové desky. Podporuje superparalelní programování výpočetní proces se rozloží na mnoho podúloh, z nichž každá se řeší na zvláštním procesoru. æ 4GL. Jazyky čtvrté generace se používají při programování databázových aplikací. Charakteristické jsou silné instrukce pro manipulaci s daty (např. SQL) i pro tvorbu uživatelského rozhraní. æ PostScript. Jazyk pro popis stránek. Interpret tohoto jazyka bývá součástí firmware kvalitnějších tiskáren. Umožňuje vytvářet dokumenty nezávisle na rozlišení výstupního zařízení. 3
90. léta æ HTML (Hyper-Text Markup Language). Jazyk pro popis struktury hypertextových dokumentů. æ Java. Objektový jazyk kompilovaný do poměrně hutného mezikódu, který je interpretován koncovým zařízením (nezávislost na HW za cenu ztráty výkonu). Malá velikost mezikódu umožňuje jeho on-line přenos po síti. æ Perl (Practical Extraction and Report Language). Výkonný nástroj původně navržený pro snadnou práci s textovými soubory. 4
Faktory ovlivňující návrh programovacích jazyků æ Výkon a vybavení počítačů æ Prostředí Prostředí dávkových systémů (transformace souboru se vstupními daty na soubor dat s výsledky). æ I/O operace jsou souborově orientované æ Žádný mechanismus pro ošetření chyb a vyjímek æ Žádné časově omezující podmínky æ Typická struktura hlavní program a pomocné podprogramy Interaktivní prostředí (komunikace s uživatelem během provádění programu i při kompilaci) æ I/O operace dokáží snadno zpracovat vstup z terminálu æ Kontrola správnosti dat, která vstupují z terminálu. æ Programy podléhají časovým omezením (reakce na povely uživatele, časový limit na zadání vstupu,...) æ Hlavní program v obvyklém smyslu často neexistuje; program reaguje na požadavky uživatele. Prostředí vnořených systémů (programy, které jsou integrální součástí větších systémů jako elektrárny, nukleární zbraně, atd.) æ Nestandardní I/O operace, často chybí operační systém æ Ošetření chyb a vyjímek je kritické æ Obvykle jde o real-time aplikace æ Program sestává z mnoha podúloh, které běží nezávisle (kontrolují různé části systému) 5
Programovací prostředí (soubor nástrojů pro editaci, kompilaci, ladění, testování, verifikaci) æ Separátní kompilace (tvorba a kompilace programu po částech). Kompilátor potřebuje informace o externích podprogramech a sdílených datových objektech: æ Počet, pořadí a typ parametrů všech externích podprogramů. æ Deklarace dat. Např. o každé proměnné je nutné vědět, zda je globální nebo lokální v jiném podprogramu, aby byla zvolena správná přístupová metoda. æ Definice datových typů. Při deklaraci lokálních proměnných je třeba vymezit patřičný pamět ový prostor. Možné přístupy: æ Explicitní zopakovaní této informace (redeklarace). Výhodou je naprostá nezávislost modulů (tzv. nezávislá kompilace), sdílené objekty se však obtížně modifikují a chybí možnost kontroly integrity. Použito u FORTRANU. æ Zavedením určitého pořadí kompilace. Před zkompilovaním modulu A jsou nejprve přeloženy všechny moduly, na nichž A závisí (ADA, Pascal). æ Před kompilací musí existovat knihovna, která obsahuje potřebné informace (C++, ADA). æ Testování a ladění æ Podpora trasování (LISP, Prolog). æ Body přerušení (breakpoints). æ Predikáty (assertions C++) æ Programovací a implementační metody æ Teoretické studie æ Standardizace Výrobcem, který jazyk vyvinul a vlastní. Pokud jde o rozšířený a populární jazyk, je tento způsob standardizace často neúčinný. 6
Standardizačními organizacemi na základě obecné dohody. æ ANSI (American National Standards Institute) æ IEEE (The Institute of Electrical and Electronic Engineers) æ BSI (British Standards Institute) æ ISO (International Standards Organization Ženeva) Má-li být standardizace účinná, musí být dobře načasovaná (FORTRAN æ ADA, C) dobře definovat vlastnosti jazyka a překladače, které jsou předmětem zaváděné normy zohlednit vývoj daného jazyka aktualizací zavedených norem (důležitá je zpětná kompatibilita). æ Oblast nasazení Vědecko-technické výpočty (FORTRAN) Databázové a informační systémy (4GL, HTML, Java) Umělá inteligence (LISP, PROLOG) Systémové programování (C, C++, Perl) Elektronické publikování (T E X, PostScript, HTML) 7
Paradigmata programovacích jazyků æ Imperativní (také procedurální) jazyky. Program je posloupnost příkazů, které jsou postupně prováděny. příkaz 1 ; příkaz 2 ; :::příkaz n ; Každý příkaz jistým způsobem změní momentální obsazení paměti (stav) počítače a ten tak přejde do nového stavu, kdy se vykoná další instrukce. Během provádění programu se tedy počáteční stav (tj. počáteční obsazení paměti) počítače postupně modifikuje, dokud se nedosáhne stavu cílového. Většina běžných jazyků (FORTRAN, C, C++, Pascal, Perl,...) jsou jazyky imperativní. æ Funkcionální jazyky. Na program lze také nahlížet jako na funkci, která obdrží jako parametr počáteční stav počítače a vrátí stav koncový. Takto chápaný program je pak vlastně zápisem uvedené funkce ta je ovšem dosti komplikovaná, proto je vhodné ji vyjádřit jako kompozici jednodužších funkcí. fce n è:::fce 2 èfce 1 èdataèè :::è Jazyky, které zdůrazňují tento aspekt výpočtu, jsou označovány jako funkcionální. Text programu pak sestává z definic funkcí a jejich vzájemné aplikace (v čistych funkcionálních jazycích proto není přiřazovací příkaz, nebot není potřebný). Jazyky, které podporují funkcionální programovaní, jsou např. LISP a ML. æ Rule-based jazyky. Program je posloupnost pravidel, která se skládají z podmínky a s ní spojené akce: podmínka 1! akce 1 podmínka 2! akce 2... podmínka n! akce n Tento seznam se prochází a pokud je podmínka splněná, provede se asociovaná akce. Příkladem je Prolog nebo YACC. 8
Překladače Programy, které transformují kód A ve vstupním jazyce na kód B v jazyce výstupním tak, že platí jistá relace mezi A a B. æ Preprocesor (makroprocesor). Přeloží rozšířený vyšší programovací jazyk do jeho standardní podoby. æ Kompilátor. Transformuje kód ve vyšším programovacím jazyku na ekvivalentní kód v jazyku symbolických adres. æ Asembler. Transformuje kód zapsaný v jazyku symbolických adres na přemístitelný kód ve strojovém jazyku (object-code). æ Linker (loader). Transformuje object-code na proveditelný kód. Interprety Programy, které načtou kód ve vyšším programovacím jazyce a simulují jeho provádění. 9