V dnešním povídání se dozvíme, jaké typy programovacích jazyků vlastně známe, hlavní zástupce
si blíže přiblížíme a také se dozvíme, jaké možnosti máme při jejich provozování na platformě GNU/Linux.
16.7.2004 08:00 | Josef "jose" Kadlec | přečteno 13086×
Možná jste si v dobách, kdy jste se toužili stát programátory kladli otázku "V čem tedy začít programovat?" Ale nemusíte být začátečník a můžete si klást podobnou otázku a to "Pomocí kterého programovacího jazyka danou aplikaci efektivně naprogramovat?" Je tím myšlen výběr programovacího jazyka, kterým lze danou aplikaci efektivně, pohodlně, výhodně vytvořit. Objasním na jednoduchém příkladu. Pokud budete chtít vytvořit např. anketu vystavenou na webovské stránce (tzn. formulář a samotné jádro programu), což je spíše menší webová aplikace, tak asi nesáhnete např. po programovacím jazyce C, který se na vytvoření podobné aplikace vysloveně nehodí. Asi byste nepoužili ani jazyk Java, který se hodí spíše na větší a velké webové aplikace, u kterých lze využít například výhody objektově orientovaného programování (OOP), které je v Javě implementováno velmi zdařilým způsobem. Na náš příklad byste zřejmě použili PHP, které se na podobné drobnější webové aplikace hodí asi nejvíce.
A protože se na portálu linuxsoft.cz bohatě rozmáhají seriály o programování, určitě přijde vhod článek, který nás do celé problematiky zasvětí a ucelí pohled na věc - pomůže při rozhodování, apod. Samozřejmě se v článku nezaměřím pouze na holý jazyk, ale budu se snažit lehce přiblížit nebo alespoň zmínit hlavní implementace jednotlivých programovacích jazyků v operačním systému GNU/Linux.
Kritérií podle kterých lze programovací jazyky rozdělit je mnoho, takže škatulkujeme. Asi to nejobecnější rozdělení je na jazyky nižší (nízkoúrovňové) a vyšší (vysokoúrovňové). Nižší programovací jazyky jsou primitivní jazyky, které využívají příkazy procesoru. Výhodou je to, že daný program lze maximálně optimalizovat (pro určitou platformu). Výsledkem je pak vyšší rychlost programu (popř. vykonaných instrukcí určitého segmentu programu). Další výhodou je také to, že programátor není ničím omezen a může využívat všechny funkčnosti zařízení (počítače). Nevýhodou je to, že programy jsou nepřenositelné na jiný druh procesoru. Také to, že programování opravdu není pohodlné - to co v jiném vyšším jazyce napíšete na 2 řádky kódu, může v nižším programovacím jazyce zabírat např. 10 řádků (pozn. jednotku řádek je samozřejmě nutno brát pouze obrazně). Mezi nižší programovací jazyky patří vlastně jen Assembler, pokud nepočítáme strojový kód. Druhá, mnohem početnější skupina vyšších programovacích jazyků zahrnuje jazyky, které se obecně vyznačují především, pro člověka, čitelnějším a logicky uspořádaným zdrojovým kódem. Tyto jazyky nejsou závislé na strojových principech počítače. Ovšem může se stát, že pomocí tohoto jazyka nebudete schopni všechno naprogramovat. Pak budete muset po Assembleru, jakožto nižším programovacím jazyce, stejně sáhnout. Nebudete muset samozřejmě psát (přepisovat) celý kód aplikace, ale nahradíte pouze části programu nebo využijete tzv. inline Assembleru, který lze vkládat přímo do zdrojových kódů vyššího programovacího jazyka (pokud to podporuje). Do této skupiny jazyků patří prakticky všechny jazyky kromě Assembleru (a strojového kódu), takže například C (a jeho odrůdy jako např. C++, C#), Java, JavaScript, PHP, Perl, Tcl/Tk, Python, Pascal, Basic, Lisp, Haskell, Scheme, Erlang, Miranda, Concurrent Clean, Fortran, Algol 60, Karel, Simula 67, Matlab M-file, Ada, Modula 2, SQL, Prolog, Snobol, Turbo PL, Eifell, SML, Ferite, Cobol, Sather, Rexx, LOGO, PowerD, PL/1 a všechny jejich varianty, atd. atd.
Dalším kritériem, podle kterého lze programovací jazyky dělit je to, jestli je interpretovaný nebo neinterpretovaný (kompilovaný). Interpretované jazyky potřebují ke svému spuštění tzv. interpret, kterým je kód překládaný za běhu samotného programu. Velkou výhodou je to, že v takovém programu není nutné deklarovat proměnné, velikost paměti, kterou mají proměnné zabírat, apod. Z čehož plyne jistá pohodlnost. Jako daň si takový program (přesněji skript) vybere na rychlosti programu, která je oproti kompilovaným jazykům o poznání nižší. Aby mohl být takový program na daném systému spustěn, potřebuje, aby na takovém systému byl přítomen interpret příslušného programovacího (skriptovacího) jazyka. Mezi takovéto jazyky patří například - PHP, Perl, Python, ASP, JavaScript, Java (interpret nepřekládá zdrojový kód přímo do strojového kódu, ale nejprve do tzv. byte kódu), některé verze Basicu, unixové shelly jako Bash, Ash, ksh, tcsh, zsh, csh atd. Kompilované jazyky jsou naopak rychlejší, po zkompilování (přeložení) mohou být spouštěny samostatně. Je u nich ovšem důležitá správná implementace programového kódu, jinak bude docházet k chybám (např. přetečení zásobníku). Do této skupiny řadíme např. programovací jazyk Pascal (jeho modifikace jako např. Delphi), C (jeho modifikace jako C++ ) a mnoho dalších.
Dalším, ovšem ne příliš známým rozdělením je dělba na jazyky procedurální a funkcionální (neprocedurální) (pozn. ve skutečnosti lze neprocedurální jazyky rozdělit ještě na funkcionální a relační). Zatímco jazyky procedurální využívají postupu, jak (první důležité slovíčko) se má daná úloha (vy)řešit (využívá tzv. algoritmu), tak ve funkcionálních jazycích nevyjadřujeme to, jak daný problém řešit, ale pouze co (druhé důležité slovíčko) se má řešit. V praxi to vypadá tak, že aplikace nemá příkazy. Dokonce nemusejí mít ani proměnné. Mezi procedurální jazyky bude patřit zřejmě většina jazyků, co znáte jako C, Java, PHP, Perl, atd. Méně známé funkcionální jazyky zastupuje především Haskell, Lisp a dále například Scheme, Miranda, Erlang, Concurrent Clean, atd. Pro upřesnění ještě dodám nějaký relační jazyk a tím je např. Goedel či Prolog.
Dále bychom mohli rozdělit programovací jazyky např. na zastaralé a používané. Mezi zastaralé a tudíž nepoužívané jazyky by patřil jistě např. Cobol, Fortran, Sather, LOGO, Ferite, Basic, atd. V kategorii současně používaných jazyků bychom určitě našli např. C (C++, C#, ...), Java, PHP, Perl, Tcl/Tk, atd.
Raději ještě zmíním, že jazyky jako HTML (HyperText Markup Language), XML (eXtensible Markup Language), apod. nejsou programovací jazyky, ale jsou to tzv. značkovací jazyky - více o nich se dozvíte například v článku Zaostřeno na XML. Dále raději upozorním také na to, že ani UML (Unified Modeling Language) není programovací jazyk, ale jedná se o tzv. modelovací jazyk, kterým lze, obrazně řečeno, na papíře vytvářet objektové, třídové i jiné modely (vztahy mezi třídami, objekty, use-case vztahy, apod.).
A nyní již konkrétně k jednotlivým programovacím jazykům. Zmíním zde především jazyky, které jsou v současné době používané, jejich vlastnosti a vztah ke GNU/Linuxu.
Jedná se o velmi populární skriptovací jazyk, který se hodí především pro vytváření webových aplikací. Lze však vytvářet i skripty spouštěné přes příkazovou řádku či shell (Using PHP As A Shell Scripting Language). Co více, pomocí nadstavby PHP-GTK (http://gtk.php.net/) lze vyvíjet i grafické aplikace využívající knihovnu GTK. Jak jsem již řekl, PHP je uzpůsobeno k vytváření internetových aplikací. Projeví se to například v pohodlném způsobu práce s databázemi, s formuláři nebo s regulárními výrazy. Hodí se jak na ty nejmenší projekty, tak i pro velké práce. Je to způsobeno tím, že PHP lze stejně snadno používat v klasickém strukturovaném programování, které se hodí především pro ty menší projekty, tak v programování objektově orientovaném (OOP), jehož výhody pocítíte především ve větších projektech. Poslední verze PHP5 je k OOP zvláště stavěno. Vzhledem k tomu, že je skriptovací jádro PHP kvalitně optimalizováno ve smyslu zkrácení odezvy webových aplikací a vzhledem k tomu, že lze PHP provozovat jako součást webového serveru, jeví se aplikace napsané v tomto skriptovacím jazyce jako velmi rychlé. Další z věcí, které hrají pro PHP je to, že je to Open Source. V dnešní době použitelný na mnoha platformách. Zhodnocení je takové, že svou úlohu, pro kterou byl stvořen, plní dokonale.
Perl, který má s PHP mnohé společné (například to, že mu vlastně vděčíme za vznik PHP), je také skriptovací jazyk, který ovšem nevznikl přímo pro potřeby webových aplikací. Než se posuneme dále, měl bych možná vyjasnit pojem "skriptovací jazyky". Těmto jazykům se také jinak říká interpretované jazyky, protože ke svému spouštění potřebují jakýsi programový interpret, bez kterého nelze takové aplikace (skripty) spouštět. V tom se zásadně liší od jazyků typu C/C++, Pascal, a jiných, které lze po zkompilování samostatně spouštět (samozřejmě na podporovaných platformách). Ale to už známe z úvodu. Někdy však lze ze skriptu vytvořit binární soubor. V případě Perlu lze využít utilitu perlcc, která převede "perlivý" skript do podoby binární. Výhodou není jen to, že ke spuštění nebude potřeba interpretu, ale také to, že nebude viditelný samotný kód. Perl nevznikl jako nástroj pro tvorbu webových aplikací, ale jako nástroj pro práci s texty. Z toho také vychází fakt, že mezi nejsilnější stránky Perlu patří regulární výrazy. Lze s ním snadno vytvářet běžné řádkové programy, ovšem pro větší projekty se nehodí, i když jistou podporu OOP obsahuje. Stejně jako v případě PHP, lze využít Gtk-Perl (http://www.gtkperl.org/) pro vytváření GTK aplikací. Tvorba webových aplikací (nebo také CGI skriptů) není již tak elegantní a pohodlná jako v případě PHP. Formuláře se nevytvářejí tak snadno a přehledně. Stejně je na tom podpora databází. Vývoj CGI skriptů v Perlu zajišťuje knihovna cgi-lib (http://cgi-lib.berkeley.edu/) nebo také modul CGI. Samotný Perl má velmi uvolněnou syntaxi - textové řetězce nemusejí být uvozeny uvozovkami, i když se to doporučuje, nedeklarování proměnných je samozřejmostí. Proto se nedoporučuje jako jazyk, na kterém byste se měli učit programovat. Je ovšem velmi rychlý - samozřejmě rychlý jako neinterpretované jazyky typu C nikdy nebude. Zdá se, že Perl je jazyk pro silnější povahy, což ho ale ovšem nevyřazuje a zvláště mezi drobnějšími webovými aplikacemi si najde své místo. Postavení mého nejoblíbenějšího programovacího jazyka si získal především díky svému, takřka dokonalému zpracování regulárních výrazů.
Předem je nutné říci, že najdeme více forem Javy - Java od Sun Microsystems, Kaffe, GCJ, atd. Obecně lze však považovat tu od Sunu za tu nejpropracovanější. Dá se říci, že Java se stala tématem dneška a to nejen v oblasti webových aplikací. Interpreter Javy se nazývá JRE (Java Runtime Environment). Ovšem ten nespouští aplikace přímo z kódu Javy, nýbrž z tzv. bytekódu, což je výstup kompilátoru Javy, který je součástí JDK (Java Development Kit). Vztah Javy a webových aplikací je takový, že tento jazyk se hodí především pro větší a velké projekty, kde se projeví všechny přednosti OOP. Takovou aplikací mám na mysli například už takový e-shop. Java nemusí sloužit pouze pro vytváření celých webů, ale využijeme ji při tvorbě appletů. S Javou lze ovšem jinak vytvářet i klasické programy - jak konzolové, tak aplikace s grafickým rozhraním (GUI). Největší výhodou všech těchto programů je prakticky nezávislost na platformě, takže tyto programy budou spustitelné stejně na GNU/Linuxu, *BSD, MS Windows, a jiných. Javu potkáme i na kapesních počítačích a mobilních telefonech. Nedostatkem, který se ještě v dnešní době celkem projeví, je rychlost těchto aplikací, která není vůbec zázračná. V porovnání s ostatními jazyky je Java opravdu pomalá. Tato nežádoucí vlastnost by se však postupem času s nárůstem výkonu počítačů měla změnit. Java má jistě velké předpoklady k tomu, aby si upevnila svoje postavení ve vývoji webových aplikací.
Jedná se o relativně mladý programovací jazyk, který by se dal v mnoha aspektech srovnat s Javou. Jedná se o objektový jazyk. Ovšem oproti Javě je velice výkonný. Interpretr Pythonu lze provozovat na mnoha platformách - i na Palm OS, což ho dělá stejně jako v případě Javy, použitelným na kapesních počítačích. To že se Python hodí především pro větší a velké projekty svědčí jeho reference, mezi které patří například Plone (http://plone.org/). Zajímavým projektem je Zope (http://www.zope.org/), který slouží pro tvorbu webových aplikací - obsahuje webový, aplikační i databázový server, session management, nebo podporu týmové spolupráce. Mocnou výhodou Pythonu je to, že ho lze rozšiřovat pomocí modulů napsaných v C/C++.
Možná se někteří diví, proč zde zmiňuji ASP. ASP je sice z dílny Microsoftu, ale lze ho provozovat i na systémech z rodiny Unixů - tzn. i na GNU/Linuxu. Projekt, který umožňuje provozovat ASP na webovém serveru Apache, se nazývá Apache::ASP (http://www.apache-asp.com/). Ti bystřejší již jistě tuší, že se jedná o modul Perlu, který je také nutný k provozu tohoto softwaru. Jedná se opět o objektový jazyk. Samotné ASP je ovšem v dnešní době nedostačující. Pochybná je také jeho rychlost zpracování skriptů. Dá se říci, že toto zpracování je velmi pomalé. V dnešní době je klasické ASP nahrazeno ASP.NET, které můžeme provozovat na GNU/Linuxu pomocí projektu Mono (http://www.go-mono.com/).
Troufnu si říci, že se jedná o programovací jazyk, který se v jistou dobu stal přímo fenomenálním a stále je v podobě jeho nástupců jako např. C++ jedním z nejpoužívanějších jazyků do dnes. C vzniklo jako nástupce programovacích jazyků Cobol nebo Fortran a programátoři si museli například zvykat na to, že musejí rozlišovat velká a malá písmena. Samotný jazyk je standardizován normou ANSI C, což je jakési "čistokrevné céčko." Jak jsme si řekli v úvodu, jedná se o kompilovaný programovací jazyk, takže k jeho spuštění není nutný žádný interpret, ale stačí ho zkompilovat. Z toho také vyplývají vlastnosti jako příznačná rychlost, ale také nutnost dodržet správnou implementaci programového kódu, aby nedocházelo k chybám. Asi nejmocnějším překladačem jazyka C v GNU/Linuxu je GCC (GNU Compiler Collection). Ale najdete i jiné implementace jako např. TCC (Tiny C Compiler), UPS, Cyclone, TenDRA C/C++ Compiler, atd. C se výborně hodí pro vývoj širokého rozsahu programů, ale přeci jen při programování větších a velkých aplikací začnete cítit jistou těžkopádnost - však byl původně vytvořen za účelem programování operačních systémů, takže je spíše nižší úrovně (nikoliv nízkoúrovňový). Tuto těžkopádnost se budete snažit vyřešit použitím OOP a sáhnete po C++, které si popíšeme dále (pozn. samotné C také obsahuje jistý objektový model Objective-C).
C++ je tedy objektové rozšíření jazyka C. Jsou konstrukce, které nejsou pro oba jazyky stejné, proto nelze říci, že C++ je prosté rozšíření, ale je to jistá modifikace. C++ tedy nabízí objektově orientovaný model, kterým již lze lehce přehledně a s možnou snadnou znovu použitelností kódu vytvářet složitější, rozsáhlejší aplikace. V GNU/Linuxu lze aplikace v C++ kompilovat opět pomocí GCC (zvládá ještě programovací jazyky Objective-C, Fortran, Ada a Java). Ale příkaz pro kompilování C++ aplikací je g++. Ještě připomenu další rozšíření C (či C++) a tím je C#, která celý jazyk posouvá ještě někam dál. Pro používání na GNU/Linuxu lze využít relativně mladý projekt Mono.
Samotný jazyk Pascal už se v dnešní době příliš nepoužívá. Často na něj narazíme jako na jazyk, na kterém se učí základy programování a algoritmizace. Jedná se opět o kompilovaný jazyk, který se vyznačuje svojí přehledností (např. proměnné musejí být deklarovány "na začátku" programu na rozdíl od C, kde můžete novou proměnnou nadeklarovat kdekoliv). Možná také proto se používá jako učební jazyk. Pokud budete chtít zkompilovat zdrojový kód v Pascalu na systému s linuxovým jádrem, použijete zřejmě Free Pascal.
A nyní trochu zabrousíme do vod nižších (nízkoúrovňových) programovacích jazyků a přiblížíme si stěžejního zástupce a tím je Assembler. Assembler (jinak také jazyk symbolických adres) byl ve své době revoluční především tím, že začal nazývat instrukce strojového kódu smysluplnými názvy - jako např. JMP, MOV, atd. Programátorům to samozřejmě ulehčilo práci, protože si nemuseli pamatovat spousty těžko zapamatovatelných znaků a tak bylo programování pohodlnější a efektivnější. Kdo říká, že Assembleru dávno odzvonilo, se mýlí. Ano, pravdou je, že většinu softwarových problémů lze řešit "inteligentnějšími" vysokoúrovňovými jazyky, ale jak už bylo nastíněno v úvodu, můžeme pomocí tohoto jazyka např. maximálně optimalizovat kód nebo využít funkcí počítače, které nám vysokoúrovňové jazyky nemohou nabídnout. Jedním z překladačů jazyka Assembler pro GNU/Linux je NASM (Netwide Assembler). Dále můžeme narazit na FASM (Flat Assembler) a některé další.
A nakonec se podíváme na zoubek jednoho z hlavních zástupců funkcionálních jazyků Haskellu - jazyku založeném na tzv. matematické teorii lambda kalkulu. Programy v tomto jazyce tedy nemají implicitní stav jako imperativní jazyky, kde je celý přístup, jak už bylo řečeno, založen na algoritmech (přesněji na architektuře počítače von Neumannova typu, protože funkcionální jazyky svým způsobem také využívají algoritmů). Na rozdíl od imperativních jazyků, pro které jsou typické cykly (iterace), je pro jazyky deklarativní (využívá explicitní stavové informace) typická rekurze. V praxi to pak vypadá tak, že programový kód je především výrazně kratší. Mocným nástrojem Haskellu je také dynamicky generovaná struktura seznam, kterou při programování v tomto jazyce budete využívat velmi často. Vidíme, že tento jazyk je velmi specifický. Asi to nebude jazyk, na kterým se budete učit programovat - i když tomu samozřejmě nic nebrání. Abych uvedl alespoň malou referenci funkcionálním jazyků, tak například legendární textový editor Emacs je naprogramován pomocí funkcionálního jazyka a to konkrétně Lispu.
Toto by se dalo počítat za výčet základních programovacích jazyků, které jsou v současné době na GNU/Linuxu používány (není zde zmíněn např. JavaScript, který má ovšem klientský interpret nebo zde nejsou zmíněny shellové interprety). Kdybychom zabrousili i mimo vody GNU/Linuxu zařadili bychom sem ještě např. Delphi (které vychází z Pascalu). Můžeme si také všimnout, že na linuxové platformě lze provozovat prakticky každý programovací jazyk.