Komerční prezentace
Registrace uživatele

Přihlašte se k odběru informací, novinek, získejte přístup do diskuzního fóra.

Vesmír č. 10
Vesmír č. 10
Toto číslo vychází
2. 10. 2017
Novinky
Zdarma jedno celé číslo Vesmíru v pdf.
• Říjnové číslo Vesmíru
reklama

Půlstoletí programovacích jazyků

Zrání softwarových systémů
Publikováno: Vesmír 87, 843, 2008/12

Využití informačních technologií závisí na softwaru a vývoj softwaru závisí na vhodných nástrojích, jejichž klíčovou částí jsou programovací jazyky. První z nich spadají do let 1953 až 1961, během nichž vznikly základní programovací jazyky a produktivita práce programátorů vzrostla nejméně stokrát. Programovací jazyky jsou technické artefakty se vším, co k tomu patří, včetně obchodních vlastností, zájmů softwarových firem a údržby (odstraňování chyb, vylepšování, změn při přechodu na jiný systém). Rozhodující jsou potřeby, vědomosti, ale také předsudky informatiků i uživatelů.

Jazyk symbolických adres – asembler
Chceme-li pochopit, proč programovací jazyky vznikly, musíme se vrátit do roku 1952, kdy ještě neexistovaly. Počítače měly operační paměť rozčleněnou na slova (obvykle o 36 až 40 bitech). Sloužit měly hlavně k numerickým výpočtům podle dlouho známých algoritmů. Problémem nebylo co počítat, ale jak a na čem. 1)

Pro zjednodušení výkladu se omezíme na jednoadresové počítače typické pro tehdejší dobu. Činnost jejich programů byla dána prováděním instrukcí, které obsahovaly příkazovou a adresní část. Některé instrukce používaly k provedení operace určené příkazovou částí instrukce obsah střádače (registru) a obsah slova s adresou uvedenou v adresní části instrukce, výsledek ponechávaly ve střádači. Příkazy skoku měnily pořadí prováděných instrukcí, jiné instrukce se používaly k ovládání periferních zařízení. Program se zapisoval binárně, tj. jako posloupnost obsahů slov obsahujících instrukce programu. Obsah slova se zapisoval jako posloupnost šestnáctkových (hexadecimálních) cifer (0 až 9, A až F), někdy se používal osmičkový zápis v cifrách 0–7.

Osvědčilo se nejprve označit adresy symbolickými jmény a po napsání celého programu je ručně nahradit ekvivalenty ve dvojkové soustavě. Symbolicky se zapisovaly i příkazové části instrukcí. Tento pomocný tvar programu se členil na řádky, jeden řádek odpovídal obsahu jednoho slova. Každý řádek mohl mít symbolickou adresu (návěští), dále obsahoval příkazovou část instrukce a jednu adresu. Ta mohla být absolutní (tj. binární adresa slova v paměti), nebo symbolická (návěští nějakého jiného řádku). Na konec řádku se mohl napsat komentář. Kromě instrukcí byly v programech příkazy k definování míst pro data a k definování dat, pseudoinstrukce pro označení začátků i konců úseků programu (modulů) a odkazy na návěští v jiných modulech (externí adresy), které sloužily k propojování modulů. Dále se uváděly veřejné adresy, tj. adresy daného modulu, jež mohly být uvedeny jako externí v jiných modulech.

V další etapě se ručně určily hodnoty návěští a vytvořil se program v binární formě. To bylo velmi pracné a vznikalo tak mnoho chyb. Proto byly záhy zavedeny jazyky symbolických adres (asemblery) a implementovány jejich překladače (též zvané asemblery), které tuto práci zautomatizovaly. K tomu všemu byla potřeba tiskárna a čtecí zařízení schopné pracovat s písmeny i jinými symboly. Využila se děrnoštítková technika používaná pro ekonomické výpočty. Každá řádka zápisu odpovídala jednomu děrnému štítku.

Pro opakované využívání modulů bylo a dodnes je výhodné překládat modul asembleru do tvaru modulu jazyka relativních adres, což je v podstatě binární tvar programu s adresami, jako by byl modul umístěn od adresy nula. Kromě toho modul obsahuje symbolické veřejné adresy a symbolické externí adresy. K externím adresám je nutné najít (většinou v „knihovnách“) a do výsledného programu integrovat moduly, které tyto adresy obsahují jako veřejné. Nakonec se vzájemné odkazy aktualizují a adresy se převedou na binární podle umístění modulů v paměti. 2) Tím vznikne proveditelný program. To dělají sestavující programy.

Asemblery zvýšily produktivitu programování aspoň desetkrát a zůstaly dlouho 3) jediným prostředkem systémového programování. Nevýhodou asembleru je závislost na konkrétním počítači, nízká produktivita práce při programování a obtížná údržba. V některých situacích jsou však i dnes asemblery nenahraditelné.

Fortran
První úspěšný jazyk vyšší úrovně byl Fortran (FORmula TRANslator), jehož obecně úspěšná definice navazující na několik předchozích verzí byla zveřejněna v roce 1958. Byl zaměřen na vědeckotechnické výpočty. Firma IBM vyvinula pro Fortran vysoce optimalizované překladače (kompilátory) do modulů relativních adres. Program ve Fortranu je podstatně kratší a čitelnější než odpovídající program v asembleru. Programování ve Fotranu bylo minimálně desetkrát rychlejší než v asembleru, programy se snáze udržovaly, především již byly přenositelné mezi počítači různých výrobců. 4)

V programech ve Fortranu již – pro pohodlí programátorů – nebylo nutné zavádět proměnné, stačil výskyt nového jména (identifikátoru) a překladač (kompilátor) sám usoudil, že je třeba novou proměnnou zavést. To ale bylo nebezpečné, neboť mohlo jít o překlep. Právě tato vlastnost Fortranu způsobila kdysi Američanům ztrátu sondy k Venuši.

Slabinou bylo statické přidělování paměti.

Proměnným ve Fortranu se přidělovala paměť zhruba tak jako v jazyce symbolických adres – uvnitř modulů relativních adres. To umožňovalo efektivní práci programů, ale vedlo to k neefektivnímu využívání paměti a k problémům při implementaci některých typů algoritmů. Přes tyto a další nedostatky se Fortran v oblasti numerických výpočtů osvědčil. Přenositelnost programů mezi různými počítači umožnila vznik rozsáhlých knihoven algoritmů ve Fortranu.

Fortran prošel několika modernizacemi, hlavní proběhla v roce 1977. Inspiroval se jím jazyk Basic pro osobní počítače. Dnes jsou hlavním úkolem rozvoje Fortranu konstrukty pro masivně paralelní výpočty, včetně výpočtů na gridech. 5)

Algol
Nedostatky Fortranu vedly v roce 1960 k definici jazyka Algol60 (ALGOrithmic Language). Záměr byl definovat jazyk obecnějšího zaměření než Fortran. Ve skutečnosti byl definován moderní jazyk využitelný v praxi jen tam, kde se již osvědčil Fortran. To bylo asi hlavní příčinou neúspěchu Algolu.

Algol byl výsledkem iniciativy akademické obce a měl zásadní význam pro pokrok v oblasti definice jazyků a konstrukce „překladačů“ (kompilátorů) programovacích jazyků. Zásadní inovací bylo zavedení formálního aparátu definice syntaxe jako bezkontextového jazyka. Algol60 přinesl bohatý výběr strukturovaných příkazů. Díky tomu bylo možno omezit na minimum příkazy skoku, které bývají zdrojem nebezpečných chyb.

Algol vyžadoval dynamickou správu paměti s využitím zásobníku, kdy se paměť pro lokální proměnné v proceduře rezervuje až v okamžiku vyvolání podprogramu (procedury) a uvolňuje se při návratu z podprogramu. Podmínkou je možnost hardwaru používat bázované adresy. 6) Volání podprogramu pak ale není právě jednoduché, je nutné například změnit obsah příslušného bázovacího registru. Na druhé straně se otevírají nové možnosti pro programování některých typů algoritmů, např. symbolických manipulací (to bylo ale doménou jazyka LISP z roku 1960). V roce 1960 byly bázované adresy běžně k dispozici. 7)

Formalizovaná definice syntaxe Algolu nesplnila tak úplně očekávání. Použitá formální gramatika definovala syntaxi, a tím i význam některých konstrukcí nejednoznačně. Problém jednoznačnosti bezkontextových gramatik je algoritmicky nerozhodnutelný (neexistuje algoritmus, který by pro libovolnou bezkontextovou gramatiku rozhodl, zda je víceznačná). V informatice tedy existují praktické úkoly, které žádný počítač nevyřeší.

Algol60 neumožňoval automaticky zavádět proměnné, ale připouštěl využívat nelokální proměnné zavedené někde jinde, v nadřazených úrovních programu. I to se stalo zdrojem chyb. Nebyly zavedeny datové struktury, síla příkazů vstupu a výstupu nestačila. To byla zásadní nevýhoda pro ekonomické aplikace Algolu. Jazyk neposkytoval dostatečné prostředky propojování s programy ve Fortranu či v asembleru. V tomto důležitém aspektu byl slabší než Fortran. Ještě významnější byla slabá podpora firem.

Po deseti letech se Algol60 přestal používat. Principy použité při jeho definici silně ovlivňují celou oblast programovacích jazyků a jejich implementace. Pravděpodobně nejúspěšnějším následníkem Algolu byl jazyk Pascal, určený především pro výuku programování. Mezi autory Algolu byla řada zakladatelů informatiky jako vědy a jako technického oboru. Pro informatiku měl Algol zásadní význam.

Cobol
V roce 1961 zveřejnilo Ministerstvo obrany USA definici jazyka Cobol, určeného pro výpočty v ekonomické oblasti. Z dnešního pohledu šlo spíše o jazyk pro programování ekonomických informačních systémů. I přes dílčí nedostatky to bylo mistrovské dílo. Jazyk byl určen pro oblast, pro niž žádný jiný vhodný jazyk neexistoval. Syntaxe jazyka byla navržena tak, aby jazyk mohli používat i pracovníci s omezenými matematickými znalostmi.

Cobol uměl pracovat s datovými strukturami, vnějšími paměťmi, kvalitně kontrolovat formáty vstupů a generovat tiskové sestavy. Byl vhodný pro tvorbu systémů, jejichž architektura byla tvořena sítí „rovnoprávných“ autonomních dávkových programů, které zprvu poskytovaly podobné služby jako jednotlivé stroje děrnoštítkových stanic. Navíc měl Cobol podstatně kvalitnější prostředky k specifikaci přesnosti výpočtů než Fortran i Algol. To umožňovalo opravdu dokonalou přenositelnost programů. Architektura systémů psaných v Cobolu byla v jistém smyslu předobrazem servisně orientovaných systémů, které jsou hitem dnes.

Vlastnosti Cobolu umožňovaly vznik programů pracujících bez údržby po desetiletí. To se ukázalo v roce 2000, kdy byly v souvislosti s přechodem na nové tisíciletí nutné úpravy dat, a tedy i programů. Vyšlo najevo, že v podnicích byly bez jakékoliv údržby používány programy v Cobolu vytvořené programátory, kteří už dávno odešli do důchodu.

Kritiku budila určitá „upovídanost“ Cobolu. Ta ale zvyšovala čitelnost programů, a hlavně vyhovovala programátorům-ekonomům. Cobol byl nejpoužívanější jazyk až do rozšíření internetu. Dobře se dá používat v kombinaci s relačními databázemi. Nedokázal se plně vyrovnat s moderními softwarovými architekturami. V mnoha případech se používá dodnes.

Nová paradigmata
Hlavním vývojovým proudem se během sedmdesátých let staly modulární (z těch se používá hlavně jazyk Ada) a později objektově orientované jazyky. Základní konstrukcí objektově orientovaných jazyků je abstraktní objekt, chápaný nikoliv jako programová komponenta poskytující několik funkcí (to byl přístup modulárních jazyků), ale jako datová struktura, s níž jsou asociovány přípustné operace. Tato změna pohledu měla zásadní význam. Koncept objektů se ukázal jako velmi plodný a vedl ke vzniku mnoha úspěšných jazyků, především C++, C# a Java, které nacházejí uplatnění hlavně při práci s internetem a programování částí informačních, řídicích i operačních systémů. Pro zrychlení vývoje softwaru byla vytvořena vývojová prostředí, do nichž byly integrovány i kompilátory.

V sedmdesátých letech byly vytvořeny matematické základy relačních databází, jazyk SQL 8) a byly vyvinuty metody jejich implementace. To umožnilo vznik rozsáhlých datových úložišť a globálních informačních systémů. Výzkum v této oblasti pokračuje za významného přispění českých informatiků. 9)

Architektura softwarových systémů
Hlavním problémem je dnes struktura softwarových systémů ve velkém – architektura softwarových systémů. Je to vynuceno existencí globálních informačních systémů. Existují metasystémy umožňující snadnou definici nových jazyků, například „značkovací jazyk“ XML, 10) který má zásadní význam pro programování na internetu i pro budování softwarových architektur. Softwarové systémy měly nejprve architekturu dvouvrstvou (klient – server), pak třívrstvou (klient – aplikační vrstva – datová vrstva). S nástupem internetu a počítačových sítí se začaly vytvářet sítě volně vázaných komponent, které se svým chováním stále více podobají službám reálného světa. Hovoříme o servisní orientaci a servisně orientované architektuře (SOA). 11) Ta umožňuje snadnou integraci existujících softwarových systémů. Přinesla možnost zásadně snížit náklady na vývoj a údržbu systémů a zlepšit jejich vlastnosti, nikoliv však tím, že se programuje rychleji, ale tím, že se mnoho kódů použije znovu nebo se nakoupí. Nositelem změn je využívání nástrojů spojených s internetem a metaprostředků, jako je XML. Servisně orientovaná architektura může být tvořena sítí rozsáhlých systémů, například informačními systémy jednotlivých úřadů státní správy.

Servisní orientace vede k zlepšování kvality softwaru a k dalšímu růstu jeho významu. Je jedinou cestou jak zvládat vývoj a údržbu obrovských informačních systémů globálních podniků, státní správy či protiraketových systémů. To, že v roce 1973 nebylo možné použít servisně orientovanou architekturu, bylo jednou z příčin zrušení tehdejších projektů protiraketové obrany. Příslušný software nebylo totiž možno vytvořit v potřebném čase a potřebné kvalitě.

Jistou obdobou servisně orientovaných systémů jsou gridy a jiné systémy pro masivně paralelní 12) výpočty. Nejmodernější klony Fortranu obsahují pro tyto výpočty různé nástroje. Je otázkou, do jaké míry je možné a výhodné sjednotit strategii gridů a servisně orientovaných systémů.

Perspektivy informatiky a informatiků
Mnohé peripetie vývoje programovacích jazyků byly důsledkem zanedbání faktu, že programovací jazyky jsou vlastně výrobky vstupující do tržních vztahů. Opomíjel se fakt, že jazyk má malou šanci uspět, pokud má nahradit jiný jazyk. 13)

Programovací jazyky byly ovlivňovány marketingovými zájmy firem, ale také nafoukaností autorů, kteří vymýšleli stále nové syntaktické varianty opakujících se konstruktů a málo se snažili poučit z jazyků již existujících. S takovým přístupem se lze setkat i dnes, například při standardizaci procesů byznysu. Docela to připomíná epigram: „Není nad originalitu, po té každý touží, lidé chodí přes most, tak já půjdu louží.“ I v tom se vlastně projevuje to, že softwarové systémy jsou technické výrobky. Konkurující si standardy existují i v jiných technických oborech.

Zhruba každých deset let museli informatici zvládat nová paradigmata a čelit novým výzvám. Dnes musí více spolupracovat s uživateli a být schopni porozumět jejich potřebám. Proto (a také v důsledku pokroku programovacích prostředků a metodik) potřeba úzce specializovaných znalců programování poněkud klesá. Velmi chybějí odborníci schopní zvládat vedle informatiky znalostní obory uživatelů (polyhistorové). To je výzva pro české informatiky, kteří vynikají jako programátoři. Nakonec to ale může být všechno jinak. V informatice se budoucnost obtížně předpovídá. Kdo by před lety předpokládal, že týmy nadšenců dokážou vytvořit Linux 14) a podobné kvalitní, zdarma dostupné operační systémy?

Poznámky

1) Od poloviny šedesátých let je problém spíše v tom, co má softwarový systém řešit (jaké požadavky má splňovat), než v tom, jak ho naprogramovat.
2) Obdobným způsobem zavádějí proměnné objektové a modulární jazyky. Ty se ale objevily až koncem sedmdesátých let.
3) Až do zavedení jazyka C.
4) S jistými výhradami, které souvisejí s problematikou zaokrouhlování a numerické stability.
5) Pozn. red.: Výpočetní grid je hardwarová a softwarová infrastruktura, která poskytuje spolehlivý, standardizovaný, všudypřítomný a levný přístup ke špičkovým výpočetním službám prostřednictvím volné sítě hardwarových a softwarových prostředků.
6) Adresa je dána obsahem zvláštního (bázovacího) registru zvětšeným o přírůstek zapsaný v adresní části instrukce.
7) Moderní jazyky vyžadují ještě složitější systém správy paměti, tzv. haldu.
8) SQL je zkratka Structured Query Language (strukturovaný dotazovací jazyk).
9) Řeší se práce s novými typy dat (např. multimédia, XML), dolování dat, vazby na objektový přístup atd.
10) XML je zkratka eXtensible Markup Language.
11) SOA je zkratka Service Oriented Architecture.
12) Pozn. red.: Masivně paralelní je počítač s mnoha procesory a distribuovanou pamětí, kdy každý procesor má přímý přístup jen ke své paměti a o jiná data, např. z paměti jiného procesoru, musí požádat, nejčastěji formou zprávy. V obecnější variantě může zprávou požádat i o kompletní výpočet.
13) Proto asi neuspěly jazyky Algol60, Algol68 a PL/1. Lépe se uplatňují jazyky pokrývající nové potřeby – v systémovém programování jazyky C a C++, ve webovských aplikacích Java, v databázích SQL a v umělé inteligenci Prolog (ten ale čelí konkurenci jazyků využívajících XML, jako je OWL).
14) Pozn. red.: Systém navrhl student Helsinské univerzity Linus Torvalds jako náhradu systému Minix. Název Linux (z Linusův Minix) vymysleli Torvaldsovi přátelé.

Soubory

článek ve formátu pdf: 200812_V843-845.pdf (292 kB)

Diskuse

Žádné příspěvky