Zobrazují se příspěvky se štítkemprogramovací jazyky. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemprogramovací jazyky. Zobrazit všechny příspěvky

pátek, srpna 31, 2007

Plus C++

Nedávno jsem teď četl tenhle text Bjarne Stroustrupa: Evolving a language in and for the real world: C++ 1991-2006. Ach, pro neznalé: Stroustrup je ten člověk, který rozšířil jazyk C o třídy a všechny ty další objektově orientované vymyšlenosti a další doplňky jako jsou šablony a tak dále. Tím způsobil malou revoluci v programování, protože z objektově orientovaných jazyků, které do té doby byly převážně záležitostí akademického světa (Smalltalk, Eiffel a další, které to nikam nedotáhly), udělal něco, co mohly vzít ty hordy zkormoucených programátorů v C a zanést díky tomu do svých programů o dva řády více složitosti (samozřejmě, že časem se i programátoři v C naučili co to vlastně znamená ten objektově orientovaný přístup, ale i tak: znám některé lidi, kteří nikdy v C++ nenapsali jinou než statickou metodu a atribut.)

Nuže, v tom textu Stroustrup shrnuje jak se vyvíjel jazyk C++, co byly jeho hlavní cíle při jeho návrhu, jak se zformovala standardizační skupina ISO, kdo přišel z nechutným bastardem Embedded C++, jak je těžké se na něčem dohodnout, že STL neznamená Standard Template Library, protože Stepanov na STL pracoval dávno před tím, než v C++ existovala věc, které se říká template (neboli šablona; v tomto směru doporučuji rozhovor s Alexem Stepanovem Al Stevens Interviews Alex Stepanov) a tak dále a tak podobně.

Je to vážně moc zajímavé čtení a pokud programujete (jedno v jakém jazyce), rozhodně si ten text přečtěte, abyste příště, až budete mít chuť pomlouvat C++ nevypadali jako... no, jako někdo, kdo o něm nic neví.

Takže: chtěl jsem říct, že jsem pod dojmem tohoto textu tak trochu přemýšlel o C++. Jako ostatně každý soudný člověk, mám z C++ strach. C++ je krutý a syrový jazyk, který neodpouští chyby, a kdo není obdařen železnou disciplínou, která mu zabrání dělat cokoliv v rozporu s pravidly, toho rozdrtí, zašlape do země, poplive a nakonec se na jeho ostatky -- no, nechal jsem se unést, ale asi chápete co chci říct. Stroustrup přiznává, že jeho snahou nebylo znemožnit programátorů stát se svými vlastními oběťmi. (Oproti tomu designeři C# se vyznávají z opačného přístupu: C++ and the Pit Of Despair.) Stroustrup chtěl jazyk tak mocný, že umožní až bizarní úrověň abstrakce, ale přitom programy v něm napsané poběží stejně rychle, ne-li rychleji než ty v C.

Věru, to se mu povedlo. Nicméně cenou za to je, že spousta z nás, nedomrlých programátorských wannabes, si, jsme-li vyzbrojeni C++, dříve či později ustřelí nohu, nebo nějakou jinou, možná ještě důležitější, část těla.

Proto jsem si myslel, že čas C++ pomalu končí, že až vymře těch pár dědků s táákovýmihle fousy, kteří udržují v chodu existující aplikace, celý svět se prozáří, a všichni budeme rázem programovat jen a pouze pro garbage collected jazyky, které generují nějaký ten byte code pro virtuální stroje jako je Java Virtual Machine, nebo Common Language Runtime.

Samozřejmě, že to byla hloupá představa.

Problém je v tom, že nějaký ten mikroprocesor je součástí skoro každého zařízení, které koupíte ve vašem oblíbeném (internetovém) obchodě s elektronikou. A jelikož to zhusta jsou málo výkonné procesory, je potřeba psát pro ně v jazyce, který je hardwarovému modelu takového procesoru co nejblíže. A takovým jazykem je právě C++. C++ přistupuje k paměti se stejnou nenuceností jako C, ale přitom se v něm dá vyvíjet na rozumné úrovni abstrakce, takže výsledný program může být hotov rychle a dá se udržovat.

Samostatnou kapitolou pak jsou různé tyhle PDA, nebo chytré telefony. Čert vem PDA -- těm už vážně odzvonilo (jejich prodej opět poklesl o 40%), ale za pár let budou všechny telefony chytré, protože to bude lacinější, mít jen jednu základní desku (resp. její zapojení) pro celou modelovou řadu, a na každém telefonu poběží nějaký ten operační systém (ať už Symbian, nějaký ten klon Linuxu, nebo Windows Mobile, či jak se to vlastně bude za tři roky jmenovat), a pro ten bude potřeba vyvíjet aplikace v jazyce, který bude co nejblíže hardwaru.

Říkáte si: blbost, za pár let bude v každém telefonu Java, a po C++ nikdo ani nevzdechne. Myslím, že ne. Svůj odpor ke snobské společnosti Apple jsem tu vyjádřil tolikrát, že to už ani není zajímavé, ale přesto nemohu Apple upřít, že iPhone to bere v zásadě za správný konec. Mám na mysli tohle: co jsem tak četl, iPhone disponuje dlouhou výdrží baterie, což je jistě vlastnost, kterou každý rozumný člověk od podobného zařízení očekává, nicméně málokdy jsou jeho oprávněná očekávání naplněna.

Aby baterie vydržela dlouho, a přitom telefon mohl dělat všechny ty cool věci, které od něj očekáváme, má jeho výrobce v zásadě jedinou možnost: snížit spotřebu procesoru a pamětí (nebo displeje, ale displej je to, co dnes odlišuje jednotlivé třídy telefonů, takže pro high-end modely s ním nejde moc dělat). V tomto směru jsou tu dvě možnosti: zaprvé do telefonu strčit pro některé, na procesorový čas náročné operace, speciální obvod (jako je v iPhone hardwarový dekodér videa). To je ovšem drahé a pro low-end se to nehodí (na méně movité zákazníky s telefonem za 500USD dojem neuděláte), navíc speciální čip bude vysávat baterii. Nebo můžete do přístroje strčit pomalejší a úspornější procesor, který bude mít k dispozici méně paměti, a operační systém a aplikace napíšete tak, aby z takového hardware vyždímaly co se dá. A tady se zase vracíme k C++.

Čili, ať děláte co děláte, programování na úrovni (resp. rozsahu úrovní), kterou poskytuje C++ se nevyhneme ani v nejbližších několika letech.

Řikáte si: ale já kašlu na nějaký chytrý mobil. Mám své PC (od libovolného výrobce) a tam je výkonu taková přehršel, že se o nějakých pár usmolených wattů starat nemusím. Ohó, říkám já, to se tedy pletete.

Pomalu začíná docházet k tomu, po čem toužím už několik let: aby PC žraly (nedá se to říct jinak) méně. Počítače se zvolna začínají učit šetřit energií, a jak její cena poroste, a jak se na trhu budou stále více prosazovat mobilní PC (notebooky a to, v co se časem přemění TabletPC nebo UMPC), bude zase potřeba být s to využít výkon který je k dispozici co nejúčelněji.

.NET sice umí předkompilovat strojový kód svého virtuálního stroje do nativního kódu procesoru na kterém běží, a asi v tom je i docela dobrý, ale poctivá kompilace C++ programu nastavená na rychlost (nebo na velikost) je něco, s čím se dá asi při Just In Time kompilaci jen těžko bojovat.

Jsem první, kdo řekne: čert vem 15% výkonu, hlavně že tu aplikaci napíšu rychle, půjde udržovat, a využije konzistentního frameworku, ale firmy, které vyrábějí výpočetně a paměťově intenzivní software (třeba ty navigační programy, o kterých jsem tu tuhle mluvil), ví své. Každých pár kilobytů paměti se počítá, každé procento na rychlosti běhu se u zákazníků počítá.

Závěrem: Tak se stalo, že jsem se z odmítače C++ stal ostražitým sledovačem, který bude vývoj tohoto jazyka, který jsem už považoval za mrtvý (v smyslu, v jakém je mrtvá Latina), bude pečlivě sledovat. Protože jak tuhle řekl BVer: správný programátor udržuje svou bedničku s nářadím vybavenou a připravenou.

pátek, července 13, 2007

Bábel

Jak jsem tu už zmiňoval, drželi jsme s BVerem řeč na letošním Festivalu Fantazie (matně si vybavuji nějaké rčení o tom, že čím méně něčemu rozumíte, tím spíše o tom budete druhé poučovat...). V rámci přípravy jsem si napsal tyhle guidelines, kterých jsem se nakonec ani moc nedržel, protože tak už to na takových neformálních přednáškách chodí. Nicméně myslím, že publikum jsme pobavili (zejména jazyk WhiteSpace sklidil velký úspěch), nadhodili několik vcelku podmětných poznámek o DSL (ty zmatené obličeje, když jsem ukázal na pár odstavců anglicky psaného textu a řekl, že tohle je kód Inform7 stály za to) a tak dále a tak podobně.

Občas bylo potřeba trochu tlačit na pilu, aby mezi mnou a BVerem při přednášce vznikly nějaké třecí plochy, které pobaví posluchače, takže pokud se vám některé pasáže budou zdát příliš... erm... no prostě na několika místech jsem schválně přeháněl, protože to zkrátka bylo potřeba. Text asi obsahuje nějaké překlepy a tak podobně, ale vzhledem k jeho délce nemám sílu to znova celé číst a korigovat.

Jak já to vidím, přístup k programovacím jazykům se v posledních, řekněme destíti letech, tedy s nástupem Internetu, podstatně změnil.

Dříve se člověk seznámil s více programovacími jazyky maximálně tak na univerzitě, kde z didaktických důvodů přičichl ke Smalltalku, a tak trochu k Lispu, a samozřejmě k Pascalu, který, ze mně ne zcela zřejmých důvodů, bývá považován za vhodný jazyk k výuce programování. Když programátoři dospěli, skončili jaksi samozřejmě u C++, nebo ti progresivnější u Javy. (Nemluvíme tu o BASICu a assembleru, protože to jsou záležitosti pro nás staré dědky.)

Dnes je situace naprosto jiná. Mladí programátoři se začínají učit programovat v Javě nebo PHP (to je snad ještě děsivější než začínat s Pascalem), pak do sebe nacucnou celou škálu skriptovacích jazyků jako je Perl, Python nebo Ruby, pak se třeba podívají na Lisp a vrkají si spolu o tom, jak skvělý je typový systém v Haskellu, a že kdo to myslí s paralelizací vážně, nemůže než použít Erlang, k tomu nějaký ten C# pro nás Microsoftí poskoky, nebo, pokud máte silná zápěstí, třeba VisualBasic (s i bez Option strict, což je nastavení, které udělá z VisualBasicu úplně jiný jazyk se stejnými klíčovými slovy), a základem je určitě i SQL, a tak dále a tak podobně.

Prostě: tam, kde dříve programátoři konvergovali k jedinému jazyku (kterým bylo C nebo C++) a s tím vystačili na větší část své kariéry, se dnes mladí vlčáci naučí pět až šest diametrálně odlišných jazyků ještě než jim naskáčou na čele uhry.

Čím to je? Domnívám se, že rozdíl je v té šíři aplikací, pro které se dnes počítače používají. Jak již řekl můj fundovanější kolega, programovací jazyk vybíráme podle aplikační domény, tedy podle toho co se chystáme dělat. Jistě nemá smysl programovat webové aplikace v C++, a na druhou stranu, je zřejmé, že i když napsat kompilátor PHP do nativního kódu by asi nebyl takový problém, nikdo to neudělá jen proto, aby mohl pro své PDA vyvíjet ve stejném jazyce jaký používá 90% programátorů s klamnými představami o svých schopnostech.

Tedy: jak se rozšiřuje množství aplikací, rozšiřuje se i počet jazyků, kterými tyto aplikace píšeme. Na programování klademe v různých oblastech různé nároky (třeba: náročnost na zdroje, ověřitelnost správnosti, rychlost, přehlednost, rychlost implementace atd.), a tomu se uzpůsobují i jazyky, které používáme.

Problém s programovacími jazyky je tento: programovací jazyky, stejně jako Olomoucké tvarůžky, potřebují čas, aby dozrály. Už nějaký čas sleduji vývoj jednoho programovacího jazyka, na kterém pracuje řekněme deset dvacet lidí tak čtyři roky. Je to skvělý jazyk? Ó, to nepochybně. Boo je jeden z nejvíce sexy jazyků na které jsem narazil (jakožto milovník staticky typovaných jazyků se příliš nevzhlížím v Ruby nebo Pythonu). Použil bych ho pro psaní nějaké aplikace, u níž předpokládám vývoj delší než řekněme dva měsíce? To nikdy.

Programovací jazyky jsou založeny na kompilátorech a interpreterech. A kompilátory a interpretery jsou software jako každý jiný. A software obsahuje chyby. A dovedete si představit něco více frustrujícího než používat programovací jazyk, jehož kompilátor (nebo interpreter) je plný chyb?

Můj volnomyšlenkářský kolega tu prezentoval svou antipatii k jazykům vlastněným firmám. Vážený příteli, velké firmy jsou jediné instituce, které dokáží uřídit vývoj něčeho tak delikátního jako je programovací jazyk s dostatečnou kvalitou. Skutečnost, že stovky tisíc open-source dobrovolníků dokázaly vyvinout za více než dvacet let existence open-source hnutí tři použitelné skriptovací jazyky (Perl, Python a Ruby), mluví samo za sebe. Všechny ostatní jazyky "vlastní" buď nějaká soukromá společnost, nebo univerzita, nebo se brzy po svém vzniku rozštěpily do tolika větví a jsou tak nespolehlivé, že je nikdo seriózně nepoužívá (viz třeba Lisp, který má asi tři sta dvacet sedm vzájemně nekompatibilních dialektů a nepoužitelné knihovny). To, že vlastníci těchto jazyků maskují za licenci GPL vůbec nic neznamená.

Tím jsem se dostal k další záležitosti, kterou tady pan doktor nakousl: knihovny. Knihovny jsou dneska stejně důležité, ne-li důležitejší, než samotný jazyk. Bez knihoven, na úrovni abstrakce, na které se musíte dneska pohybovat, abyste v konečném čase stvořili něco smysluplného, bez pořádného balíku knihoven, nejlépe celého frameworku, nesvedete nic. Potřebujete knihovny na práci s unicode řetězci (což je oblast, jejíž složitost si většina jedinců ani nedokáže představit), s implementací TCP/IP socketů, nějaké to šifrování, zobrazování, XML, formátování výstupu a zpracování vstupů v závislosti na národním nastavení, prostředky pro komunikaci a synchronizaci u vícevláknových aplikací, přístup na disky se všemi těmi zabezpečovacími serepetičkami, izolovaná úložiště dat, a tak dále a tak podobně. A to jsme ještě nezabrousili do oblastí řízení bezpečnosti aplikací a přidělování oprávnění k přístupu k různým částem operačního systému.

Chci říct: napsat programovací jazyk je jedna věc, ale učinit ho užitečným je věc úplně jiná. A sílu učinit jazyk užitečným mají podle mého jen společnosti, které jsou dost bohaté a schopné na to, aby vývoj tohole všeho zvládly v čase kratším než geologickém.

Aha, vidím nespokojenost na tváři tady mého veleváženého kolegy. Inu, má pravdu. Existuje způsob jak vyvinout dobrý jazyk a dobrými knihovnami a nestrávit tím celý život: použijete existující framework s virtuálním strojem, a pro ten svůj skvělý jazyk napíšete. Dnes máme na výběr ze dvou variant: jednak je tu Java Virtual Machine od Sun Microsystems, na kterém běží Java, dvak Common Language Runtime od Microsoftu, který využívá široká paleta .NET jazyků. Samozřejmě, že přítomné zrdojanarchisty nemůže uklidnit to, že je jejich jazyk plně open-source, když běží na virtuálním stroji soukromé společnosti, ale výhody pro nás ostatní jsou zřejmé: zaprvé od úplného začátku existuje celý balík velmi dobrých knihoven, které lze použít, a zadruhé: všechny tyhle optimalizační a portační kejkle za vás udělá někdo jiný. Vy si jen poklidně kompilujete do nějakého toho bytekódu, který pak virtuální stroj překládá do instrukcí procesoru který právě používáte.

Proto: pokud dneska opravdu chcete napsat programovací jazyk, piště jej pro některý z těchto virtuálních strojů. Jinak se sice naučíte spoustu zajímavých věcí o kompilátorech a procesorech a všech ostatních cool věcech, kterými neuděláte dojem na slečny dole u baru, ale bude to práce, kterou nikdo neocení.

Existuje ještě jedna skupina jazyků, o kterých jsme se tu ani já, ani můj vzdělanější kolega nezmínili. Jde o tzv. DSL, neboli domain specific languages, tedy jazyků určených pro jednu konkrétní aplikační doménu. Tento druh jazyků se dneska většinou píše v programovacích jazycích které vládnou syntaktickými makry, tedy takovou vypečenou věcičkou, která vám umožní do jakési meta-funkce předat jako parametr kus kódu, který se pak při kompilaci (nebo interpretaci) přeloží do skutečného kódu toho kterého jazyka. Příhodnou ukázkou může být třeba generování XML (nebo HTML), kdy místo používání ordinérních prostředků pro zapisování tagů použijete virtuálně vytvořená klíčová slova vašeho DSL, čímž celou věc krásně zpřehledníte a zjednodušíte.

DSL je dneska progresivní oblast programovacích jazyků (asi jako začátkem devadesátých let OOP), která pomocí dostatečně mocných obecných jazyků umožňuje napsat speciální jazyk pro každou aplikaci tak, že z kódu je hned zřejmé nejen jak věci děláte, ale také co děláte a leckdy i proč.

Nejzářnějším příkladem DSL je Inform7, tedy programovací jazyk určený k vývoji interaktivních fikcí (tedy textových adventur), který se snaží předstírat, že programujete v angličtině. V I7 napíšete něco jako "Miska s vodou stojí na stole v kuchyni," a překladač z toho sám odvodí, že miska je kontejner, stůl je objekt, na kterém mohou ležet jiné objekty a že kuchyň je místnost ve hře. Problém je v tom, že a) to funguje jen v angličtině, b) když se dostanete za hranice takto jednoduchých vztahů, musíte tvořit další pravidla pomocí syntaxe, která není ani zdaleka tak přehledná. Nehledě na to, že v takovémto jazyce se prakticky nedá ladit.

Nicméně si myslím, že podobně formované DSL budou v nejbližší budoucnosti poměrně populární, a že otevřou programování mnohem šiřší skupině než lidí, než by starému von Neumanovi bylo milé (ten dokonce považoval i assembler za zatemňování smyslu programu; ale co byste čekali od člověka, který sčítal nekonečné řady z hlavy).

Takže: i když, jak tu můj esotericky zaměřený kolega prezentoval, lze napsat programovací jazyk o jediné instrukci a přesto bude Turing-kompletní, volba správného programovacího jazyka je a bude zatraceně důležitá. Správný programovací jazyk vás zbaví potřeby znát polovinu návrhových vzorů z té provařené knihy gangu 4 (z hlavy si vzpomenu třeba na iterator, strategii a visitor), ty správné (funkcionální) jazyky budou potřeba pro rozvoj opravdu paralelního programování, příhodné jazykové konstrukce vás dokáží zbavit potřeby šmudlit složité SQL dotazy, nebo opakovat jeden skoro stejný kód dvacetkrát.

Zkrátka: pokud jste se rozhodli následovat osud dinosaurů, držte se svého jazyka a o nic dalšího se nezajímejte. Vy ostatní: vítejte v Babylonu!

A abych nezapomněl: stav je zdrojem všeho zla!