No, kdoví, jestli rozčarování nad některými jazyky nepramení jenom z nejnovější módy funkcionálního programování. Ono totiž C/C++ je celkem konzervativní a taky ne každá změna je tam hned další měsíc. To ale pak zase vede k tomu, že ten jazyk pak není jako node.js, kde na každou volovinu je 50 knihoven a ofic jenom pár. Ale nejsem tak úplně denně v Node tak možný se mi to jenom zdá ....
Z módy možná jo. Jinak funkcionální programování je tu dlouho, a na rozdíl od C++, které bylo původně jen slepencem nějakého preprocesoru nad C (dnes už z něj začíná být celkem konzistentní jazyk), byly tyto jazyky často "čistší" a syntakticky jednodušší (viz třeba LISP, Na druhou stranu, pro mne je LISP docela nečitelný, trochu to vylepší "duhové závorky" v editoru.)
Pro mne je největším přínosem do C++ (rozuměj: stává se z toho pro mne docela pohodlný jazyk) klíčové slovo 'auto' a lambda. Bez toho se některé věci musí docela dlouze opisovat. A leckdy dlouhý opis sníží čitelnost programu - já si rozhodně nedokážu zapamatovat neomezeně velký kontext (na počet řádků a na dobu čtení) když nějaký program čtu.
Jj, asi jo, Jasně, vím že FP je tu dlouho, on je to jen jiný přístup, protože když se to vezme opravdu pragmaticky, tak je to pořád pointer do paměti, tam lib. datová struktura (int, func, whatever) na kterou pointer ukazuje a šup s tím do stack frame a hurá, už to rube processor z cache..... a jestli je to FP, OOP .... je z tohoto pohledu celkem jedno. Jako pouštět se do debaty jako moc je již C vyvinuté se nebudu, zas tolik moc do toho nevidím a neposoudím to, jen mi poslední dobou přijde, že se plive na, řekněme tradiční, jazyky, bez pořádného důvodu a kolikrát pisatelé ani nedokážou pořádně vysvětlit proč a nebo jenom dostatečně jazyk nepochopili
. Nehledě na to, že srovnávat třeba jazyk, který běží u klienta v browser a jazyk, který běží na server na virtuální mašině je už tak zcestné (jako že kvůli účelu musí jazyk obsahovat specifické konstrukce)
"já si rozhodně nedokážu zapamatovat neomezeně velký kontext (na počet řádků a na dobu čtení) když nějaký program čtu."
To mi připadne jako dvousečná zbraň, protože na jednu stranu jsou v tradičních jazycích dlouhé konstrukce, v FP jsou teď zase tisíce funkcí, které ale zase umí všechno :-) jen je to spíš jako naučit se framework, takže zase prostě si člověk musí pamatovat. A pak, jde o to, jak specifické operace člověk provádí, protože když budu sekat šablony do WP jak Baťa cvičky, tak je to pořád dokola o předpřipravených funkcích, vystačím si s 30ti. Ovšem pokud budu dělat nějaké operace specifické jen pro můj program, tak i v FP budu používat ty základní funkce a jejich četnost se bude blížit počtu operací, protože nikdo ni to dopředu nepředpřipraví, protože to nevěděl. Typicky třeba vlastní parser pro specifické XML. Nikde v FP není funkce naparsujMiZrovnaTohleMojeXML ...a tak tedy ať tak nebo tak, budu muset jít řádek po řádku .... a co do uložení v paměti, nevím jaký je rozdíl mezi listem a polem. .
No potom je potřeba "uměle" zvyšovat čitelnost rozekáním (i svého programu) do malých funkcí, z nichž každá dělá svou práci a má dobře zdokumentované rozhraní (někdy stačí správné jméno). Potom při čtení progamu stačí zkontrolovat tu funkci, že na _všechny_ možné vstupy udělá to co tvrdí její dokumentace bez studia vlastního programu a naopak zkontrolovat, že program využívá tu funkci v souladu s dokumentací (neposílá do ní vstupy, pro které nemá funkce definované chování), bez ohledu na implementaci. Dřive zmíněné konstrukce mi umožňují tyto malé celky někdy nepsat jako samostatné funkce, protože nezvýší objem kontextu na danném místě programu.
Proti PHP nic nemám. Asi to není zářný příklad nej nej skvělejšího jazyka, ale má širokou podporu ve všech směrech, v distribucích, serverech, standardech a na scriptování s podporou OOP je parádní. Má silné možnosti přístupu k souborům, k databázi, silně podporuje práci se stringy a má dobrou podporu pro přenosové protokoly. A to je na webu potřeba. Ano, je hodně benevolentní. takže si ho spousta lidí plete s jednoduchým jazykem. tak to ale není. PHP umožní velké přemety, o to ale lépe musí programátor vědět co dělá. Ale beru, je to taková klasika, nic exotického.
> třeba vlastní parser pro specifické XML. Nikde v FP není funkce naparsujMiZrovnaTohleMojeXML ...a tak tedy ať tak nebo tak, budu muset jít řádek po řádku
Ono záleží na tom, co člověk chce - ale já třeba nedávno potřeboval ani ne tak parsovat, jako spíš modifikovat existující XML. A najednou zjistíš, že existuje knihovna ve stylu "xpath", snadno rozšiřitelná o další "operátory", "filtry", a když to ještě zkombinuješ s nějakými knihovnami pro práci se stavy, tak najednou máš v podstatě něco, co má třeba funkcionalitu XSLT. Bez jakékoliv přímé podpory jazyka, je to jenom knihovna. A tohle jsou věci, které jsem nikdy pořádně v OOP neviděl a netuším, jestli vůbec něco takového je principiálně možné.
No, v OOP, to je spíš language specific. Třeba v PHP je několik takových rozšiřitelných parserů už přímo v jazyku, podle úrovně ve které pracují. Možná se pletu, ale v C nic takového přímo v jazyku není a musela by to být šílenost :-)
Ale já tím jen chtěl ukázat, že jakmile začne někdo dělat nějaké nestandardní operace a programy, tak ta výhoda FP že na všechno je funkce a vše je na jeden řádek, padá. Ale nezatracuji FP, je to jiný přístup na jiné úkoly ale proto bych ani ty poslední dobou "tradiční" jazyky nezatracoval.
Je to skutecne jiny pristup. Ve FP (dobre, napriklad v Clojure) existuji jen dve funkce pro praci s XML. Jedna XML naparsuje, druha z vysledku vytvori sekvenci. Takze z toho vlastne vyleze jen normalni sekvence, se kterou se pracuje, jako s jakoukoli jinou sekvenci (pod sekvenci si lze predstavit kolekci, takze treba list nebo vektor).
V OOP by z toho byl hodne rozsahlej kod pro DOM atd.
V Clojure nevím přesně, nepotkal jsem, beru co píšete. Ale vím bezpečně, že v PHP je SImpleXML, která to taky celé načte a rozseká, ale zkuste to udělat pro XML s 50 miliony hodnot, to se ani nebavím o atributtech v elementech atd. Ano, takové jsem měl, byla to odpověď serveru. Nesmím napsat odkud to bylo. Bylo to tom, že se to nevlezlo do paměti na serveru, takže proto bylo potřeba napsat parser, který to načítá dávkově ze souboru a pamatuje si zanoření v elementech samozřejmě, protože jinak s ohledem na pamět: nashledanou, sek a pád Vtip jev tom, že to množství prostě paměť najednou nedá.
Stejně ani nevím, jak se liší list(Clojure) a array(PHP) nebo array(C/C++/Java) v při uložení v operační paměti. TIpuji že to bude velmi podobná řada bytes za sebou s nějakou adresací podle dat. typu.
Ajo jasny, pokud je to nejaka obrovska silenost, tak to nema smysl natahovat do pameti (coz Clojure vlastne stejne nedela, protoze je 'line' :). Tady bych asi sel do klasickeho SAXu, zalezi na situaci. Btw jsem neco podobneho zazil, jedna statni firma mela pocit, ze XML je databaze :D
No C/Java ma pole jednoduche - prvky pekne za sebou, tazke u 1D pole je to jediny blok pameti se vsemi vyhodami (snadne indexovani) a nevyhodami (GC se muze zblaznit u velkych poli). V Clojure je list, coz je normalni jednosmerne vazany seznam (prvek ma ukazatel na dalsi prvek), takze nektere operace jsou se slozitosti O(1) a jine bohuzel O(n). Potom je tam vektor, coz uz je onacejsi struktura, je to interne strom, ale listy muzou mit az 32 prvku, takze hodne "siroky" strom. Vetsina operaci tim padem ma slozitost O(log_32 n), coz je skoro konstanta :)
Tak ony existují i streaming parsery a vůbec nemusí jenom o "SAX" parsery... a právě v těch FP jazycích mohou mít ty streaming parsery hodně zajímavou funkcionalitu. Třeba konkrétně není problém parsovat velký JSON soubor a pokud je možné tu operaci provést "jednoprůchodově" (nebo aspoň načíst podmnožinu dat, se kterou se bude pracovat), tak je to velmi triviální záležitost. Práce se streaming parsery v Javě pro složitější struktury není úplně příjemná...
> Ale já tím jen chtěl ukázat, že jakmile začne někdo dělat nějaké nestandardní operace a programy, tak ta výhoda FP že na všechno je funkce a vše je na jeden řádek, padá. Ale nezatracuji FP, je to jiný přístup na jiné úkoly ale proto bych ani ty poslední dobou "tradiční" jazyky nezatracoval.
Ale tak to není - vůbec nejde o "nestandardní" programy. V mnoha FP jazycích jsou možné abstrakce, které v imperativních jazycích v drtivé většině nejdou. Takže je vysoce pravděpodobné, že pokud ten problém není ve stylu "veškerá abstrakce nemožná", tak se to v FP podaří namodelovat mnohem jednodušeji.
Já vím, že tohle je zase debata ve stylu "a můj jazyk je lepší", ale zrovna teď jsem dělal "jednořádkovou" změnu v kódu a prostě v OOP by tohle snad vůbec nebylo možné - využívám polymorfismus v návratové hodnotě, typeclassy, monady... takže ve výsledku je to operace skutečně prakticky "na 1 řádku", akorát překladač se docela nadře. Ne, že by to v OOP úplně nešlo - šlo, ale člověk se docela nadře a fakt to nebude na 1 řádku...
Pouzivanie pointrov a referencii zaroven. Absencia reflexie. Pouzivanie vynimiek a goto naraz (vobec, pouzivanie goto je v strukturovanom jazyku peklo). Viacnasobna dedicnost s nejasnymi pravidlami. Templaty su peklo. Jedna vec sa da zapisat desiatimi roznymi sposobmi, podla toho, aky styl programovania dotycny prave preferuje. Najlepsie pokombinovat templaty, makra preprocesor, viacnasobnu dedicnost, potom uz ani diva svina sa v tom nevyzna.
Co som rozpraval s old-school developermi, take veci ako refaktoring, pekny citatelny kod, alebo navrhove vzory povazuju za nadavku.
Vela z tych veci co spominas je kvoli kompatibilite. Videl som jednu prednasku kde sa B. Stroustrup vyjadril v tom zmysle, ze o tom samozrejme vie, ale ked sa rozhodoval, ci ma "v zaujme cistoty jazyka" rozbit fungujuce programy, alebo to ponechat funkcne, tak jeho volba bola jasna.
Ked niekto napise v C++ zle citatelny kod, tak je to v prvom rade chyba toho programatora, nie chyba jazyka. Zle citatelny kod sa da napisat v uplne lubovolnom jazyku. Ked je programator idiot alebo asocial, tak ani najsamlepsi programovaci jazyk ho nedonuti napisat dobre citatelny kod.
Nech být, když jsem se prvně setkal s knihovnou setjmp, tak jsem na to koukal jak puk :D A to prý v C nejsou výjimky...
A i na tom Cčku bych nemusel nechat chlup suchý, třeba je krása, když potřebuju tabulku s několika paramery, indexovanou nějakým číslem:
- Indexování enumem. To je OK.
- Když v enumu nepřiřadím hodnoty, tak na konce dám další položku a mám počet. To je OK.
- Řádek z té tabulky se dá narvat do struktury. To je OK.
- Řádky se dají hodit do pole s velikostí z enumu. To je OK.
Ale když to chci náhodou všechno spojit, musím si hlídat pořadí a počty řádků na dvou místech, aby to korespondovalo, enum v .h, data musí být v .c a vytažený pomocí inline funkcí nebo zhovadilost typu external...
Áno, s tým sa dá samozrejme iba súhlasiť. Extrémne povedané, kód sa píše pre ľudí, nie pre počítače. Aspoň za predpokladu, že človek nie je osamelý vlk.
Potom je ale väčšina tejto diskusie zbytočná, pretože ak píše človek kód pre ľudí, vyhne sa neprehľadným technikám. :) Aj keď samozrejme platí, že s narastajúcimi znalosťami rastie schopnosť čítať cudzí kód. Takže treba nájsť sadu výrazových prostriedkov jazyka, ktorá je dostatočne výkonná a zároveň dostatočne pochopiteľná celému spektru ľudí, ktorí s kódom na danom projekte prídu do kontaktu.
"Ked niekto napise v C++ zle citatelny kod, tak je to v prvom rade chyba toho programatora, nie chyba jazyka" - to by som sa neodvazoval tvrdit o C++. Specialne casti kodu kde autor miluje templaty a dokaze kod s nimi doviest do neuveritelnej abstrakcie su vyzivne na patranie ked riesite nejaky subtilny problem. Pritom to naozaj nemusi byt prasa, skuste sa niekedy ponorit do Boostu a jeho zdrojakov.
Veľa častí boostu je takých aké sú nie preto, lebo C++ podporuje šablóny, ale preto, lebo C++ šablóny nepodporovalo dostatočne, teda napríklad neboli variadické šablóny a nie je ešte schválená podpora konceptov, takže tieto veci bolo nutné rozpísať v existujúcom šablónovom jazyku a navyše z toho vychádzajú komplikované chybové hlásenia. Je možné, že boost po schválení C++17 bude vyzerať oveľa jednoduchšie, dáva to celkom zmysel, kto by chcel udržiavať komplikovaný kód, keď ho môže zjednodušiť.
Keď sa ale odvolávame na to, čo je v boost-e, treba si uvedomiť, že boost je knižnica nie aplikácia, teda sa predpokladá, že ho píšu (a čítajú) "trochu pokročilejší" programátori. Koľko z nás tu do boost-u prispieva? Ja teda nie..
Suhlasim skoro zo vsetkym co pisete. Len som tym chcel prave ukazat, ze prave C++ v rukach "pokrocileho" programatora moze byt vdaka moznostiam C++ celkom tazko citatelne. Da sa namietnut (a aj s tym sihlasim), ze dokonala znalost C++ by pomohla ale realne by ma zaujimalo kolko ludi prestudovalo napr cely popis templatov a vsetky specialitky tam. Proste niekedy je tazke sa zorientovat v tom co sa deje nehovoriac o dementnom popise chyby v kompilatoroch, niekedy najst v tom popise co je zle je uloha hodna detektiva.
Možno to bude tým, že aj v reálnom živote je niečo za niečo. Ak chcem široké spektrum možností, musím mať široké spektrum znalostí, neviem, či to môže byť inak, aj keď by som si to naozaj veľmi prial.
Už som ale písal vyššie, že ak sa programuje v tíme, je potrebné vybrať podskupinu jazyka, ktorá má dostatočné vlastnosti a ktorej rozumie čo najviac členov tímu.
Podľa mojich skúseností väčšina chýb je šablónového charakteru a nastáva vtedy, keď niekam dám niečo, čo tam nepatrí. Kontrola konceptov to rieši a chybové hlásenia sa stanú zrozumiteľnými, pretože jednoducho hlásením bude, že niečo nezodpovedá očakávanému konceptu a nie tak ako je to teraz, že chyba je hlásená v tisícej vnorenej funkcii naoko vôbec nesúvisiacej s používateľským kódom.
Aby som to upresnil, existujú snahy o harmonizáciu znalostí, jedným z pokusov je kniha C++ Common Knowledge: Essential Intermediate Programming, Stephen C. Dewhurst, bola vydaná určite pred viac ako 10 rokmi, pretože osobne ju mám už minimálne 10 rokov, existuje veľa iných kníh, ktoré popisujú, čo je dobrá technika a čo nie je, takže kto chce, má možnosť nájsť si svoju cestu.
Prepáč, ale Tvoj príspevok mi pripadá ako klasický komentár niekoho, kto v C++ vôbec nepracuje a iba šíri nezmysly, ktoré si vypočul od niekoho, kto v C++ tiež nepracuje.
Uvedom si, je rok 2016, C++ prešlo niekoľnými kolami štandardizácie, ďalšie kolo je v plnom prúde, drvivá väčšina vecí, ktoré popisuješ je dávno vyriešená, prípadne sa nepoužívajú alebo sú veľmi dobre zdokumentované kolízne stavy a pokiaľ nie je človek ingorant, tak sa týmto kolíznym stavom, zvlášť keď sú zdokumentované, vyhne.
Pokiaľ máš nejaké negatívne skúsenosti zo svojho okolia, nemusí to znamenať, že jazyk ako taký je zlý, ale jednoducho že ľudia, ktorých poznáš ho nepoužívajú správnym spôsobom, to sa ale určite stáva v každom jazyku.
C++ Ti dáva možnosť rozhodnúť sa kde v spektre medzi pohodlím a úplnou kontrolou chceš byť. Samozrejme, pokiaľ chceš úplnú kontrolu, môžeš ju mať, ale musíš byť na to kompetentný a vedieť, čo robíš.