Kam spěje dnešní svět programátorů

O co to tu vlastně jde?

V tomto článku se vyskytuje zamyšlení nad budoucností programování. Kam to vlastně celé spěje, co je podle mě špatně na oněch nových "moderních" programovacích jazycích, RAD, extrémních programováních a podobně.

Trocha historie

Aby člověk mohl mluvit o budoucnosti, je třeba znát i dostatečný kousek historie. Proto je tu tato menší sekce. Ti, kdož jsou znalí počítačové histori natolik, že si myslí, že toto nepotřebují, nechť přeskočí k další sekci.

ASM & friends

V temných dobách elektronických dinosaurů se psalo buť přímo na děrné štítky (s těmi se nesmělo zakopnout a rozsypat je) či pásky. Po nějaké době se vyvynul assembler, což byla velká výhoda, neboť si člověk již nemusel pamatovat čísla jednotlivých instrukcí. Všechny tyto metody ale měly několik vad. Jednak, když si chtěl člověk sepsat kalkulačku, pak musel přesně vědět, jak v daném stroji funguje koprocesor, na jaké adrese najde výstup na obrazovku, nehledě na to, že na sečtení dvou čísel potřeboval asi 100 příkazů a pokud si k tomu nenapsal, že je to sčítání, pak už to nikdy nikdo nepoznal a mohl si to splést kupříkladu s věštěním z pevného disku. Za další, pokud se něco nepovedlo, pak přestala třeba fungovat klávesnice, a člověk si opět užil. A poslední, přišel k jiné mašině a mohl to celé zahodit a začít znovu.

Samozřejmě, tento přístup měl i své výhody. Například naprostou kontrolu nad hardwarem, přímé řízení optimalizací a podobně. Assembler se stále v některých případech používá, např. MPlayer je díky němu schopen přehrávat filmy na strojích, které jsou pro ostatní přehrávače očividně slabé.

Vznik abstrakce a vyšších programovacích jazyků

Již v tehdejších dobách, kdy počítače běhaly na frekvencích několika HZ, byly mnohonásobně rychlejší a levnější než programátoři. Proto vznikly první vyšší programovací jazyky, z nichž některé se udržely dodnes. Z těch co se neudržely to je např. fortran, z těch co se udržely je to nejrozšířenější jazyk C, či nejstarší používaný jazyk lisp (pravda, ten v dnešní době žije v mnoha dialektech, z nichž mnohé jsou interpretované).

Výhody oněch jazyků v té době byly značné. Jednak umožňovaly přenositelnost na úrovni zdrojového kódu. Když někdo napsal kalkulačku, tak prostě vzal co napsal a přeložil ji někde jinde a tam fungovala také. Člověk nepotřeboval vědět nic o tom, jestli procesorem je PPC či Alpha, či něco jiného, příkazy se pohybovaly na úrovni modifikace paměti a komunikace s okolím přes standardní knihovnu.

Další, a to značnou výhodou, byly možnosti zápisu výrazů, pojmenovávání proměnných a podobně. Pro programátora to znamenalo značné zjednodušení práce, prostě psal co má program dělat. Vedlo to ke zkrácení kódu aplikací. Pro sečtení dvou čísel se prostě napsalo jedno +.

Za tento luxus se samozřejmě platilo, a to výkonem. Jak již ale bylo řečeno, ten je levnější. Navíc, překladače se vylepšily a dnes jsou natolik dobré, že výsledný nativní kód je většinou lepší a rychlejší, než to co dokáže napsat byť dobrý programátor.

Vznik skriptovacích jazyků

V té době také vznikly skriptovací jazyky, které nebyly překládány, ale příkazy se přímo prováděly. Výhoda je jasná, program lze měnit aniž by bylo třeba cokoliv znovu překládat. Je možné program dynamicky měnit za běhu velmi jednoduchým způsobem, vyhodnocovat proměnnou jako by to byl kód programu a podobně.

Napsat takový program bylo velmi jednoduché (na tehdejší dobu) a vyžadovalo jen malé úsilí. Pravdou je, že výkon programu poté býval ubohý, ale pro mnoho činností se prostě nic silnějšího použít nevyplatilo. Mnohé z těchto jazyků se taktéž udržely do dnešní doby, příkladem takového staršího skriptovacího jazyka je např. sh nebo perl, vyznačující se neuvěřitelnou stručností zápisu.

Moderní hybridi

Nyní se již dostávám k dnešnímu stavu. Jedna věc, která mi na moderních jazycích vadí je potřeba virtuální stroj. Tato věc vznikla jako kombinace skriptovacích a překládaných jazyků. Vypadá to tak, že programátor napíše kód a ten poté přeloží, jako u překládaných jazyků. Nepřekládá to však do nativního kódu, který by šel spustit na procesoru, ale do jakéhosi binárního skriptu.

Výhody postupu

Zastánci tohoto postupu mají mnoho výhod. Jedna z nich je, že daný kód lze spustit kdekoliv. Což samozřejmě není pravda, pokud by se to vzalo od podlahy, tento kód nelze spustit nikde. Tento kód je interpretovaný. (Teď se na mě sesype hromada nadávek, že to není pravda, že kód je přeložen do nativního kódu procesoru při načtení, ale to je také jen způsob interpretování) Pravdou je, že binární skript lze přeložit/interpretovat mnohem rychleji, než textový. Avšak, hlavní výhoda skriptovacích jazyků - že není třeba je překládat a že je možné program dynamicky měnit - odpadá. Tudíž, já žádné velké výhody oproti skriptům nevidím, proti překládaným aplikacím také ne.

Výhoda oproti překládaným jazykům je, že lze program vzít a pustit na jiném systému. Pustit jej lze, ale jen proto, že je znovu přeložen. Tímto způsobem lze jinde spouštět i programy v C či skriptovacích jazycích. Jediné, že zde se překlad provádí sám, což ale lze u jiných jazyků zařídit také.

Nevýhody

Člověk musí mít nainstalované běhové prostředí - onen interpreter. Taktéž, nelze program spustit přímo, ale musí se spouštět onen interpreter a z něj ten program. Což je ještě horší řešení než u skriptů, kdy se do začátku skriptu vložilo, čím má být spuštěn a zařídilo se to samo. Taktéž, v seznamu procesů je vidět jméno interpretru a ne jméno programu.

Důvody vzniku, jak je vidím já

Proč se vlastně nepoužívá nějaký skriptovací jazyk, když to co se distribuuje je vlastně jen taky skript? Ona rychlost v tom nebude, protože by nebyl problém někde v systému automaticky cachovat předparsované skripty a načítání by bylo ještě rychlejší. Problémem bude něčí výmysl a zlozvyk obchodníků, že se snaží před člověkem, který daný program spouští na svém počítači, skrýt, co že se to vlastně spouští. Tudíž jediná "výhoda" je, programátor může být prase a nikdo to o něm nepozná. A to není zrovna dobrá vlastnost jazyka.

Pravdou je, že to není na moderních jazycích to nejhorší.

Příliš ukecané

Co považuji za moderních jazycích za nejhorší není snaha skrývat, ani vyšší míra abstrakce. Je to jejich neskutečná ukecanost. Zatímco starší jazyky byly stručné a programátor musel sice přemýšlet, co že to chce udělat, dnešní "moderní" jazyky jsou čím dál tím ukecanější. Prý to má vést k zpřehledenění. To je samozřejmě nesmysl. Jednak, pokud před vámi je 4* více textu, jak to může být přehlednější? A jednak, tato ukecanost a zaručená přehlednost vede k tomu, že programátor na přehlednost nedbá, stejně tak nedbá tolik na expresivnost kódu a na dobrý záměr. Dříve si programátor rozmyslel, jestli tohle opravdu potřebuje a napsal to nejjednudušším možným způsobem. Nynější způsob programování vede k obalování, nabalování mezivrstev, abstrakcí a po několika měsících k mnoha megabajtům kódu, které přehledné být nemohou, protože se každý bojí se do nich jen podívat.

Proč si nenechat kód nagenerovat/doplnit/automaticky opravit?

Pro tyto nové ukecané jazyky existuje mnoho nástrojů, které spoustu kódu nagenerují za programátora, či mu pomohou doplnit dlouhé názvy, opraví chyby a podobně. To je ale z nouze ctnost. Jednak, proč nepoužít tyto generující nástroje pro stručný jazyk? Jednak, proč se mám hrabat v několika stovkách řádků kódu co mi byly nagenerovány?

Nekonzistentní a komplikovaná syntaxe

Nevím, čím je to způsobené, ale čím novější jazyk, tím složitější má syntaxi. Zatímco lisp má několik jednoduchých pravidel, které se dají napsat na pár stránek a C má specifikace na asi 1000 stránek i se standardní knihovnou, takové C++ už má specifikace na 5000 stránek bez knihoven a vedou se nekonečné spory o tom, jak že to vlastně je správně. Taková Java má několik desítek klíčových slov. A to mi někdo chce tvrdit, že je potom Java jednoduchá?

Možná, že je již C staré a chybí mu například výjimky či garbage collector, na což tenkrát nebyl výkon. Ale proč tedy nevymyslet jazyk, který by byl moderní, měl tyto funkce a přesto byl jednoduchý, postavený na několika principech a ty dodržoval? Java je sice neskutečně bohatá co se týče knihoven, ale její syntaxe je bastl, rozlišuje mezi interface, což je vlastně jen třída co má všechny funkce abstraktní, a třídou. Rozlišuje mezi null a 0, přestože je to zcela totéž. Má neskutečně složité systémy opravnění položek třídy, zatímco by stačilo napsat k položce, která nemá být používána, tuto skutečnost do dokumentace. Stejně si každý musí dokumentaci přečíst, jinak neví, jak to funguje, přestože veškerá jména Javích knihoven jsou ve formátu VýjimkaNeplatnéOperaceSeSouborem.JménoSouboru.

Můj cíl

Již delší dobu se snažím najít nějaký hezký jazyk. Zatím neúspěšně. C postrádá garbage collector, postrádá objektovou podporu a postrádá výjimky. C++ postrádá jednoduchost a garbage collector, přestože při správném použití C++ se bez něj dá dobře obejít. Python je jednoduchý, má podporu výjímek objektů. Ale zase postrádá stručnost jazyka C či lispu. Pravdou je, že daným požadavkům je nejblíže. Ale některé věci se v něm dělají oklikou a jsou na to knihovny, přičemž v C se to dá napsat jedním hezky zkonstruovaným cyklem for. O OOP pascalu, či javě ani nemluvě, oboje jsou bastly, které nemají ani kousek elegance. Číst kód v nich napsaný není radost, ale mučení. Dobrému návrhu jazyka se celkem blíží jazyk D, ale je omezující, nese mírné náznaky nekonzistence a hlavně, nemá ani překladač ani knihovny.

Jak to tak nakonec vypadá, buť budu muset někde najít něco jako obohacené C, nebo budu muset vymyslet něco jako pročištěně C++, které nemá definici šablon na 450 stránek a dochází v nich k nejednoznačnostem. Taktéž by se dalo něco postavit na jazyku D, ale potřeboval by napsat něco jako automatický import C nebo C++ knihoven.

Jinými slovy, hledám něco jako nový jazyk C, který nemá neduhy moderních jazyků. V moderních jazycích nelze dost dobře napsat zjednodušený web server na 30 řádků, zatímco v C jsem to viděl.