Programovací jazyk — univerzální notace pro zápis algoritmu, ˚ která je implementována“. ” Procˇ studovat programovací jazyky?
schopnost psát efektivní programy – pole jako parametr funkce nebo procedury lze v principu pˇredat i hodnotou
– rekurze (napˇr. násobení se dá naprogramovat pomocí sˇcítání — cyklem, ale i rekurzí)
lepší využití existujících programovacích jazyku˚ pˇrehled o užiteˇcných programových konstrukcích – lidé mají tendenci myslet“ v prog. jazycích, které ovládají
” – užiteˇcné konstrukce, které se vyskytují v jednom jazyce, je možné naprogramovat“ v jiném
”
ˇ prog. jazyka, vhodného pro danou apli schopnost výberu kaci
zjednoduší se proces uˇcení nových jazyku˚ ˇ návrh nových jazyku˚ snadnejší
1
Vývoj programovacích jazyku˚ 50. léta
Assembler. Jazyk symbolických adres. Zavádˇel jména“ pro instrukce, ” které byla schopna provádˇet procesorová jednotka a zejména symbolické oznaˇcení (návˇeští) cílové adresy skokových instrukcí.
FORTRAN (FORmula TRANslator), 1955-57. Numerické výpoˇcty, hlavní duraz ˚ kladen na efektivitu generovaného kódu.
LISP (LISt Processing). Následník IPL, nasazen pro aplikace v oblasti umˇelé 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 puvodnˇ ˚ e podˇrízen architektuˇre IBM 704). Zavádí se koncept Call by ” name“ (obtížnˇe implementovatelné).
60. léta
COBOL (COmmon Business Oriented Language), 1960. Snaha vyˇ oddˇelení strojovˇe netvoˇrit cˇ itelný“ jazyk blízký mluvené angliˇctine, ” závislých cˇ ástí kódu od strojovˇe závislých, oddˇelení popisu algoritmu od popisu dat.
Simula, 1967. Používá se pro programové simulace reálných procesu. ˚ Zavádí se pojem tˇrídy“. ” PL/I. Snaha zkombinovat schopnosti FORTRANu (numerické výpocˇ ty) a COBOLu (snadná cˇ itelnost programu). ˚
Revize existujících programovacích jazyku˚ (FORTRAN, COBOL, ALGOL).
70. léta
Pascal, 1970. Patrnˇe nejpopulárnˇejší programovací jazyk 70. let. Charakteristická je silná podpora strukturovaného programování. Pˇri pˇrenosu na nové HW platformy byl úspˇešnˇe použit tzv. bootstrapping. 2
C, 1970. Vyvinut pro úˇcely systémového programovaní v návaznosti na OS Unix (použit pˇri pˇrepisu jádra Unixu do vyššího programovacího jazyka). Jde o velmi úsporný“ jazyk, napˇr. vstupnˇe/výstupní ” funkce nejsou souˇcástí jeho definice.
Ada. Puvodnˇ ˚ e 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ˇríve, než fungující pˇrekladaˇc). Ada obsahuje podporu pro distribuované a real-time aplikace, jde o složitý a obtížnˇe implementovatelný jazyk.
Prolog (PROgramming in LOGic), 1972. Dominantní jazyk v oblasti tzv. logického programování. Používá se pro aplikace z oblasti umˇelé inteligence (zejména expertní systémy).
ML (Meta Language). Kombinuje imperativní a funkcionální programování, má zajímavˇe ˇrešený systém typové kontroly.
Smalltalk. Puvodnˇ ˚ e šlo nejen o jazyk, ale vlastnˇe o totální prostˇredí“ ” (jazyk, poˇcítaˇc, programovací prostˇredí). Pozdˇeji byl jazyk pˇrenesen i na jiné operaˇcní systémy. Je od zaˇcátku koncipován jako objektový jazyk.
80. léta
C++, 1986. Rozšíˇrení jazyka C, zavedení konstrukcí umožˇnujících objektové programování.
OCCAM. Jazyk nízké úrovnˇe“ navržený pro transputerové desky. ” Podporuje superparalelní“ programování – výpoˇcetní proces se roz” loží na mnoho podúloh, z nichž každá se ˇreší na zvláštním procesoru.
4GL. Jazyky cˇ tvrté generace“ se používají pˇri programování databá” zových aplikací. Charakteristické jsou silné instrukce pro manipulaci s daty (napˇr. SQL) i pro tvorbu uživatelského rozhraní.
PostScript. Jazyk pro popis stránek“. Interpret tohoto jazyka bývá ” souˇcástí firmware kvalitnˇejších tiskáren. Umožˇnuje vytváˇret dokumenty nezávisle na rozlišení výstupního zaˇrízení. 3
90. léta
HTML (Hyper-Text Markup Language). Jazyk pro popis struktury hypertextových dokumentu. ˚
Java. Objektový jazyk kompilovaný do pomˇernˇe hutného“ mezikódu, ” který je interpretován koncovým zaˇrízením (nezávislost na HW za cenu ztráty výkonu). Malá velikost mezikódu umožˇnuje jeho on-line pˇrenos po síti.
Perl (Practical Extraction and Report Language). Výkonný nástroj puvodnˇ ˚ e navržený pro snadnou práci s textovými soubory.
4
ˇ Faktory ovlivnující návrh programovacích jazyku˚
Výkon a vybavení poˇcítaˇcu˚ Prostˇredí – Prostˇredí dávkových systému˚ (transformace souboru se vstupními daty na soubor dat s výsledky).
I/O operace jsou souborovˇe orientované Žádný mechanismus pro ošetˇrení chyb a vyjímek Žádné cˇ asovˇe omezující podmínky Typická struktura — hlavní program a pomocné podprogramy
– Interaktivní prostˇredí (komunikace s uživatelem bˇehem provᡠprogramu i pˇri kompilaci) dení
I/O operace dokáží snadno zpracovat vstup z terminálu Kontrola správnosti dat, která vstupují z terminálu. Programy podléhají cˇ asovým omezením (reakce na povely uživatele, cˇ asový limit na zadání vstupu, . . . ) Hlavní program v obvyklém smyslu cˇ asto neexistuje; program reaguje na požadavky uživatele.
– Prostˇredí vnoˇrených“ systému˚ (programy, které jsou integrální ” souˇcástí vˇetších systému˚ jako elektrárny, nukleární zbranˇe, atd.)
Nestandardní I/O operace, cˇ asto chybí operaˇcní systém Ošetˇrení chyb a vyjímek je kritické Obvykle jde o real-time aplikace Program sestává z mnoha podúloh, které bˇeží nezávisle (kontrolují ruzné ˚ cˇ ásti systému)
5
– Programovací prostˇredí (soubor nástroju˚ pro editaci, kompilaci, ladˇení, testování, verifikaci) ˇ ás Separátní kompilace (tvorba a kompilace programu po c tech). Kompilátor potˇrebuje informace o externích“ podpro” gramech a sdílených datových objektech: Poˇ cet, poˇradí a typ parametru˚ všech externích“ podpro” gramu. ˚ Deklarace dat. Napˇ r. o každé promˇenné je nutné vˇedˇet, zda je globální nebo lokální v jiném podprogramu, aby byla zvolena správná pˇrístupová“ metoda. ” Definice datových typu. ˚ Pˇri deklaraci lokálních promˇenných je tˇreba vymezit patˇriˇcný pamˇet’ový prostor. Možné pˇrístupy: Explicitní zopakovaní této informace (redeklarace). Výhodou je naprostá nezávislost modulu˚ (tzv. nezávislá kompilace), sdílené objekty se však obtížnˇe modifikují a chybí možnost kontroly integrity. Použito u FORTRANU. Zavedením urˇ citého poˇradí kompilace. Pˇred zkompilovaním modulu A jsou nejprve pˇreloženy všechny moduly, na nichž A závisí (ADA, Pascal). Pˇ red kompilací musí existovat knihovna“, která obsahuje ” potˇrebné informace (C++, ADA). Testování a ladˇ ení Podpora trasování (LISP, Prolog). Body pˇ rerušení (breakpoints). Predikáty (assertions — C++)
Programovací a implementaˇcní metody Teoretické studie Standardizace – Výrobcem, který jazyk vyvinul a vlastní. Pokud jde o rozšíˇrený a populární jazyk, je tento zpusob ˚ standardizace cˇ asto neúˇcinný. 6
– Standardizaˇcními organizacemi na základˇe 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 úˇcinná, musí – být dobˇre naˇcasovaná (FORTRAN ADA, C) – dobˇre definovat vlastnosti jazyka a pˇrekladaˇce, které jsou pˇredˇ metem zavádˇené normy – zohlednit vývoj daného jazyka aktualizací zavedených norem (duležitá ˚ je zpˇetná kompatibilita).
Oblast nasazení ˇ – Vedecko-technické výpoˇcty (FORTRAN) – Databázové a informaˇcní systémy (4GL, HTML, Java) ˇ inteligence (LISP, PROLOG) – Umelá – Systémové programování (C, C++, Perl) – Elektronické publikování (TEX, PostScript, HTML)
7
Paradigmata programovacích jazyku˚
Imperativní (také procedurální) jazyky. Program je posloupnost pˇríkazu, ˚ které jsou postupnˇe provádˇeny.
pˇríkaz1; pˇríkaz2 ; : : : pˇríkazn ; Každý pˇríkaz jistým zpusobem ˚ zmˇení momentální obsazení pamˇeti (stav) poˇcítaˇce a ten tak pˇrejde do nového stavu, kdy se vykoná další instrukce. Bˇehem provádˇení programu se tedy poˇcáteˇcní stav (tj. poˇcáteˇcní obsazení pamˇeti) poˇcítaˇce postupnˇe modifikuje, dokud ˇ se nedosáhne stavu cílového. Vˇetšina bežných“ jazyku˚ (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ˇcáteˇcní stav poˇcítaˇce a vrátí stav koncový. Takto chápaný program je pak vlastnˇe zápisem uvedené funkce — ta je ovšem dosti komplikovaná, proto je vhodné ji vyjádˇrit jako kompozici jednodužších funkcí. fcen (: : : fce2 (fce1(data)) : : :) Jazyky, které zdurazˇ ˚ nují tento aspekt výpoˇctu, jsou oznaˇcovány jako funkcionální. Text programu pak sestává z definic funkcí a jejich vzájemné aplikace (v cˇ istych“ funkcionálních jazycích proto není pˇriˇra” zovací pˇríkaz, nebot’ není potˇrebný). Jazyky, které podporují funkcionální programovaní, jsou napˇr. LISP a ML.
Rule-based“ jazyky. Program je posloupnost pravidel, která se sklá” dají z podmínky a s ní spojené akce:
podmínka1 ! akce1 podmínka2 ! akce2 ... podmínkan ! akcen Tento seznam se prochází a pokud je podmínka splnˇená, provede se asociovaná akce. Pˇríkladem je Prolog nebo YACC. 8
ˇ Pˇrekladace 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ˇreloží rozšíˇrený“ vyšší programo” vací 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ˇremístitelný“ kód ve strojovém jazyku (object-code). ” Linker (loader). Transformuje object-code na proveditelný kód.
Interprety Programy, které naˇctou kód ve vyšším programovacím jazyce a simulují jeho provádˇení.
9