Portál AbcLinuxu, 30. dubna 2025 12:44
vector
,naopak zpoždění implementace v překladačích se s každým novým vydáním lineárně zvyšuje (C++03 už tu máme 5 let a žádný překladač jej AFAIK plně nepodporuje).Jo, to je pěkně na*****, co vlastně c++3 přináší?
For some years after the official release of the standard, the committee processed defect reports, and published a corrected version of the C++ standard in 2003.
C++03 už tu máme 5 let a žádný překladač jej AFAIK plně nepodporujeSice nevím, co c++03 přináší, ale aspoň Comeau a EDG frontendy o sobě tvrdí, že ho podporují celý.
Ona totiž krása a elegance ještě neříká nic o praktické použitelnosti toho jazyka - to je to.A proč by jazyky jako Haskell a Scheme neměly být prakticky použitelné? Ona totiž nízká rozšířenost a elegance neimplikuje praktickou nepoužitelnost.
Dokažte nějak seriózně, že haskell je úspěšný.A co byste si představoval?
Jo a mimochodem, KDE de facto není v c++O KDE jsem nic nepsal, tak nevím proč reagujete na můj příspěvek.
A nakonec: Na co je sebeelegantnější jazyk, když ho nikdo nepoužívá a nic se v něm nepíše?V Haskellu lidi píšou a používají ho. Kdybyste se porozhlédl po té domovské stránce Haskellu, tak byste našel odkazy na projekty, které jsou v něm napsané, je jich tam dost. Jazyky jako Haskell a spol. jsou dobré k tomu, že obsahují mnoho zajímavých myšlenek, které se pak třeba dostávají i do běžných jazyků. Lepší by bylo, kdybyste ho třeba zkusil, než psal, že je k ničemu.
Lepší by bylo, kdybyste ho třeba zkusil, než psal, že je k ničemu.Já neříkám, že je k ničemu.
Darcs - version control system, který je ovšem neskutečně pomalýTo je již minulost
Pokiaľ ma pamäť neklame, Haskell si zvolili preto, lebo syntax perl6 pár rokov dolaďovali a nikoho netrápila pomalosť výsledku.
Nicméně žádný teoreticky hezký jazyk neprorazil. Neprosadil se v praxi - protože byl zkrátka příliš dřevěný a toporný v praxi a narážel na značná omezení. Případně jako druhou variantu vyžadoval IQ nad 150, a být ve střehu. Tudíž až akademici vymyslí něco prakticky použitelného za programovací jazyk, tak mi to nahlašte, ale myslím, že v tomto životě mě to asi nepotká.
Teoreticky hezké a čisté jazyky, které je snadné se naučit a jsou zárověň prakticky orientované, existují a minimálně s jedním jste se už během své kariéry setkal.
Smalltalk IMHO není jednoduché se naučit (syntaxi ano, ale naučit se něco praktického vytvořit ne).Jak se říká - člověk se naučí být v C++ produktivní za rok, ve Smalltalku jen za 365 dnů
Když jsem si pročítal Školičky, tak se tam na Smalltalk dost nadávalo, že to je nepovedený LispTa školička je tady. Je to obdoba toho, jako by někdo hodnotil uživatelskou přívětivost OpenOffice podle rozbalených ODF souborů. Většina výtek na gramatiku totiž směřuje na exportní formát pro zdrojové kódy, se kterým se běžně programátor vůbec nesetká (autor psal o Smalltalku na základě seznámení s ořezanou implementací, která vznikla především pro scriptování a od plnohodnotného smalltalkovského systému byla v té době na míle vzdálená). On se snažil ve Smalltalku hledat Lisp a přitom zcela opomenul jeho základní a unikátní vlastnosti, které ho od Lispu odlišují. Pokud chcete objektivnější porovnání s Lispem, obraťte se třeba na Kyosukeho, který rozhodně netrpí tunelovým viděním (pokud se nenachází zrovna v nějakém tunelu)
Stejně tak se prakticky nikdo neučí XML tím, že si přečte normu, nikdo se neučí programovat sítě tak, že začne číst normy, nikdo se nezačne učit SQL tím, že si přečte normu SQLTak já jsem podle Vás "nikdo"?
O tom, jak těžké je parsovat C++ kód mě nezajímá, protože to udělá jednou výrobce kompilátoru a mě spíš zajímá, zda mi syntaxe pomůže.Tuhle větu si vystříhněte a přečtěte znovu, až budete luštit nějaký cizí složitý program
Ono ve skutečnosti parser C++ není nic extra těžkého, je to v zásadě dost jednoduchý problém.Jasně, syntaktická analýza je v zásadě velmi jednoduchý problém. A třeba u té Ady se i velmi jednoduše řečí, protože ta má rozumně navrženou gramatiku. Ale fakt by mne zajímalo, jak může soudný člověk při plném vědomí navrhnout takový humus plný konfliktů, jako je C/C++ (a další to prezentovat jako nic komplikovaného). Je samozřejmě pravda, že parsery C++ píše pár lidí na světě, ale to na skutečnosti nic nemění.
A upřímně si myslím, že bych daleko rychleji implementoval dobrý C++ parser, než dobrou knihovnu regulárních výrazů.A to já bych teda zkoušet nechtěl. Dobrý parser pro mě znamená kvalitní detekci a zotavení se ze syntaktických chyb, a to musí být u C++ pěkný masochismus. Jenom zběžně jsem teď prolítnul C++ parser v ANTLR a není to nic hezkýho (a pochybuju, že to bude nějaký hi-fi, co se rozumně vypořádá s vadným vstupem). Když jsem před časem četl učebnici C++, říkal jsem si, že takový překladač C++ musí mít minimálně devět průchodů jako u PL/1
Až nějaký čistý a nehumusoidní jazyk dokáže řešit praktické problémy, které řeší C++, C++ se stane zbytečným.Vidíte, a spousta lidí je ještě stále přesvědčena, takový jazyk existuje už dávno a jmenuje se C
Jinak určitě je praktičtější udělat složitější syntaxi, kde se deset lidí zapotí při návrhu dobrého parseru s detekcí chyb, a desítkám miliónu programátorů to ulehčí práci, než vymyslet jazyk, kde deset lidí v pohodě udělá parser a desítky miliónů programátorů se bude prát s méně praktickou syntaxí.To je pravda, ale je to argument spíš pro Haskell
Ano, typický přístup Javistů - oni jsou zvyklí na tom, že co nechtějí používat je potřeba zakázat. Napadlo Vás taky někdy, že když se Vám nelíbí featura F, že jí nemusíte používat?Mně spíš přijde, že zrovna tato featura je v C++ značně nedotažená: přetěžovat operátory sice jde, ale definovat vlastní už nikoliv. Přirozený důsledek je, že když chcete definovat nějaký nový operátor, musíte použít jméno stávajícího naprosto neintuitivním způsobem. Typický případ je
<<
a >>
zneužité pro I/O.
Jako Javista ... Mě se na C++ nelíbí věci jako je předefinování operátorů, vícenásobná dědičnost, apod. Ano, typický přístup Javistů - oni jsou zvyklí na tom, že co nechtějí používat je potřeba zakázat. Napadlo Vás taky někdy, že když se Vám nelíbí featura F, že jí nemusíte používat?Moment, kdo mluvil o zakazování? Já jenom říkám, že se mi ta vlastnost nelíbí a proto jsem rád, že v ObjC ani v Javě není. V C++ ji nemám rád a proto, když jsem v něm chvilku programoval ve škole, tak jsem to nevyužíval.
A není trochu uhozené na hlavu, jestliže 64-bitový MaCOS si předepisuje programovací jazyk, ve kterém se musí psát programy? Mě se třeba na Linux, Windows, a asi tak miliónu dalších OS líbí, že si mohu zvolit jazyk podle svého, ať už to bude cokoli - a řekl bych, že tato možnost volby je plusem i z obchodního hlediska pro výrobce OS.Mac nepředepisuje jazyk, který musíte používat. Carbon API je již od svého vzniku označeno jako "deprecated" a sloužilo pouze pro přechod mezi Mac OS classic a Mac OS X. Apple chce, aby se už konečně přestalo používat, proto vynechává podporou pro 64-bit. Krom toho, kdo vám přikazuje používat na Macu Objective-C? Naopak, je tam přímo v XCode podpora pro kupu dalších programovacích jazyků: Ruby, Python, Java a samozřejmě i C a C++. Kde vidíte ten zákaz? Pokud chci programovat aplikaci pro více systémů, zvolím Javu nebo C++. Jestliže chci naplno využívat API, které mi Mac poskytuje, zvolím Objective-C a Cocoa. Krom toho, spousta frameworků umožňuje používat čisté C. Příkladem budiž AddressBook.framework, který má binding přímo na C. Nevím přesně, co porodními bolestmi s 64-bitovým systémem na Macu myslíte, ale slyšel jste někdy o Universal Binary? To je totiž to, co Linux a Windows nemají. Naopak tyto systémy bych nazval těmi, kteří si své porodní bolesti s 64-bitem teprve prožívají. Protože spouštění 32-bitových binárek na 64-bitových Windows je prý zajímavé dobrodružství. Pokud lžu, vyvraťte prosím.
Namísto universal binary je prostě možné mít několik binárek, výsledek je tentýž. Jinak vyvracet nic nemohu, protože moje zkušenosti s 64 bitovým Linuxem a Windows jsou tak mizivé, že nevím o tom vůbec nic.Programoval jste někdy v Javě s pomocí JNI? Pak by se vám tento přístup velmi znechutil. Promiňte, ale proč bych měl nutit uživatele, aby si vybíral, pro jakou verzi svého systému si má stáhnout program. Díky Universal Binary mám všechny 4 architektury v jedné binárce a je hotovo. Pro JNI naprosto ideální situace. Načte se jeden soubor .dylib a mám vystaráno. Naopak na Windows a na Linuxu se s tím musím zvlášť kompilovat pro každou architekturu, kterou chci podpořit. Teď si představte, že chci zároveň podporovat PowerPC, zároveň Intel a pro každý z těchto ještě 32-bit i 64-bit. Bavilo by vás kompilovat 4 různé verze a pak vyrábět 4 různé balíčky, mezi kterými by si uživatel musel vybírat? Mě ne. K té plné podpoře API. Na Windows pokud vím máte pouze C# a C++. Na Macu je hlavní C a Objective-C. Co je na tom špatné? Nebo hodláte podporovat 20 frameworků pro každý jazyk zvlášť? To my přijde s prominutím trochu přehnané. Já když napíšu, že jsem rád že tam nějaká vlastnost není, tak to neznamená že to někomu zakazuji. Nejsem diktátor. Proto pokud existuje jazyk jako C++, který obsahuje vlastnosti, které nemám rád, tak jej nepoužívám. To jenom vy máte pocit, že to chci zakázat. Díky tomuto pocitu bych v tom případě zakazoval i Linux a Windows, protože je nepoužívám a jsou v nich vlastnosti, které se mi nelíbí. Je to tak?
A v C++ se dají stvořit ve zcela standarním C++ na každém kompilátoru - nepotřebujete žádná rozšíření.Jak? Tím (s prominutím) hnusem, který nabízí Boost? (Jinak na ostatní vaše rádobyargumenty si dovolím neodpovídat a raději v duchu přesně opačném než titulek tohoto článku tvořit více kódu, zato však méně keců.) Pokud chcete seriózní argumenty, raději se předveďte s nějakým kusem kódu v C++, který by podle vašeho názoru nešel elegantněji napsat v jiném jazyce.
K věci - asi si to chce vyzkoušet větší týmový projekt v C a pak v C++. A ideálně za vlastní peníze, kdy ten vývoj budete platit z vlastní kapsy.Větších týmových projektů v C jsem už pár vedl (a vývoj aspoň v některých dobách platil), kupříkladu takový Holmes. V C++ jsem napsal jen řádově 10k řádků, ale měl jsem to potěšení vývoj několika velkých projektů sledovat. Vím tedy svoje
A není Váš dojem daný spíše tím, že se nepohybujete v C++ kruzích?Nikoliv, je dán jednak sledováním vývoje překladačů (jeden by čekal, že lidé, kteří překladače programují, jsou jedněmi z nejlepších znalců jazyka), jednak velmi častými příklady programů, které nejdou novou verzí překladače přeložit, ač s tím starší (či jiný) překladač nemá sebemenší problémy. Jistě, jsou to konstrukce, o kterých se nakonec ukáže, že je nejnovější verze normy zakazuje, alespoň když ji čtete dostatečně pozorně, ale samotný fakt, že překladačům (a tvůrcům normy) trvalo několik let, než zkonvergovaly k tomu, že taková konstrukce není korektní, vypovídá o mnohém.
A jste si tím jist co píšete? Když třeba předáte pole, tam vidíte v C kulové ohledně změny, či nezměny. [...] Takže nemusíte poznat nic.Jistě, jsou situace, kdy nepoznám nic ani v Céčku. Ale v mnoha případech poznám, zatímco v C++ prakticky jen tehdy, když předávám konstantu
A důvod proč si to myslíte?Inu, máloco donutí člověka rozmyslet si i ty nejtemnější zákoutí jazyka, jako psaní překladače.
V C++ existuje jenom jedna jediná norma.Ano, oficiální norma existuje jenom jedna, leč 10 let stará a prakticky žádný překladač se podle ní neřídí. Obvykle se snaží řídit spíš podle nejnovějšího draftu normy nové...
Nepoznáte nic, například Linus prosazuje tento prototyp:A co má být? Jedním protipříkladem kvantifikátor "skoro vždycky" nepopřete
double sin(double x);
. C++ není složitější. Zajímavé je, jak spousta lidí má paniku a hrůzu, pokud dostanou do ruky nástroj o velkými možnostmi - přičemž - a to je podstatné - je nikdo nenutí využívat všechny možnosti naráz. V podtextu říkáte, že prostě C++ je příliš mocné, možností má moc a Vy se neumíte vybrat, a proto chcete radjěi omezenější nástroj. Vždyť je to jednoduché: Proč nepoužíváte jen ty možnosti, které chcete?
No já nevím. Totéž by se dalo říct třeba o Lispu, proč se spousta lidí tak strašně bojí, že dostane do ruky mocný nástroj? (Přičemž jsem to opravdu slyšel jako argument proti používání Lispu ve firmách - "představte si průměrné javisty, co by v tom začali dělat, buďme rádi, že takhle aspoň nenapáchají škodu".)
Jako mnohem podstatnější problém vidím, že většina komplexity C++ je zbytečná - zcela shodně mocný jazyk lze založit i na mnohem jednodušší gramatice a sémantice. A zbytečnou složitost bych viděl jako mnohem větší problém, než zbytečnou sílu jazyka - zatímco za vyjadřovací schopnost jsem rád i za cenu toho, že přečíst něco po některých lidech může chvilku trvat (případ Lispu), při zbytečné složitosti mi to čtení občas může trvat ještě déle, ale nezískám tím zhola nic (případ C++).
Od možností inline funkcí a možnosti optimalizací pomocí šablon plus řadu dalších možností, které v C nejsou tu ani nezmiňuji.Možná jste si toho nevšiml, ale standardní C má inline funkce taky.
A v C++ se dají stvořit ve zcela standarním C++ na každém kompilátoru - nepotřebujete žádná rozšíření.A jak se chovají jejich volné proměnné?
Ok, další ironie z Vaší strany, beru. ... Opět ironie.Myslím, že to myslí vážně.
Většina komplexity v C++ není proto, že to nelze udělat jednodušeji, ale proto, že komplexita podstatně zvyšuje možnost rychlostních optimalizací. C++ je dělaný na max. rychlost a nízkou spotřebu zdrojů a tomu je podřízeno naprosto vše.Zvláštní, že spousta tvůrců jiných programovacích jazyků to vidí přesně naopak.
Z C++ LISP neuděláte Pokud tedy nenapíšete v něm LISP executor.Nemusí se jednat zrovna o Lisp (BTW, už dekády se to píše s malými písmenky.
je to jazyk, který si vystačí sám se sebou, teoreticky v něm napíšete naprosto všechno i hodně low level a C++ nepotřebuje podporu žádného jiného jazyka.A už umí standardní C++ něco tak triviálního, jako bitová rotace, nebo je to pořád ještě vylepšená PDP-11ka?
Asi mi něco ušlo, ale nechápu. Já se pouze pozastavil nad tím, že údajně zcela samospasitelný dokonalý jazyk C++ (samospasitelný včetně systémového programování) nepodporuje triviální operaci, která je dnes v podstatě všude v hardwaru. Přitom mi přijde, že implementovat ji by bylo snadné, ale přesto se s tím nikdo ani v moderních normách C a C++ neobtěžoval (aspoň jsem si toho nevšiml), proto třeba kompilátor SBCL (Common Lisp trpí obdobným problémem) extra poskytuje rozříšení ROTATE-BYTE, hlavně kvůli kryptografickým algoritmům a podobně - nemá cenu psát je zbytečně pomalé, když procesor tu instrukci prostě má.
Closure conversion je zajímavý problém. Udělat ji efektivně je určitě mnohem složitější, než jen přidat operátor pro jednu operaci a dopsat pár řádků do generátoru kódu. Nicméně já tuhle vlastnost jazyka považuju za vlastnost pro vyšší jazyk natolik výhodnou - a především, natolik fundamentální - že kdybych si měl vybrat mezi efektivní implementací closure conversion a přítomností či nepřítomností bitové rotace v jazyku, ve kterém budu psát 80 % kódu nebo víc, radši beru kvalitní closure conversion.
U Cčka jsem smířený s tím, že tam takové věci mít nikdy nebudu, a tak se soustředím na to, co mít můžu, a chvílemi by se rotace mohla hodit, tedy hlavně v té třídě přoblémů, pro kterou se Cčko nejvíc používá (chroustání čísel a bitů). U vyšších jazyků (než C, které je samo o sobě celkem slušně vysoko, když se to tak vezme) by mi zase vadila absence funkcí, jako jsou zcela plnohodnotné closures, protože když už rezignuju na výkon za všech okolností, chci někde aspoň ty základní fíčury. Kde přesně mám tedy tu nekonzistenci?
Ale fakt by mne zajímalo, jak může soudný člověk při plném vědomí navrhnout takový humus plný konfliktů, jako je C/C++ (a další to prezentovat jako nic komplikovaného).Ono by tky možná stačilo nahradit jenom ten parser...
spíš hrozí návyk otřesných konstrukcí, nebezpečný příkaz goto je stále po ruceNebezpečnost goto se IMO přeceňuje.
najdi_zarizeni, if nejalezeno goto konec alokuj porty, if sehlalo goto konec otestuj_pritomnost, if selhalo goto uvolni_porty namapuj pamet, if selhalo goto uvolni_porty inicializuj, if selhalo goto uvolni_pamet vytvor_zarizeni atd... uvolni_pamet: odmapuj pamet uvolni_porty: dealokuji porty konec:Je pravda, ze je mozne to same udelat i bez goto, ale tohle elegantnejsi, obzvlast u veci, kde toho muze pri inicializaci spoustu selhat.
try: najdi_zarizeni, if nenalezeno throw konec alokuj porty, if selhalo throw konec otestuj_pritomnost, if selhalo throw uvolni_porty namapuj pamet, if selhalo throw uvolni_porty inicializuj, if selhalo throw uvolni_pamet vytvor_zarizeni atd... except: uvolni_pamet: odmapuj pamet continue uvolni_porty: dealokuji porty continue konec:
continue
jako analogii pro nutnost psát break
v každé části klauzule switch
v Céčku. Výjimky jsou ve většině jazyků navrženy tak, že se nečeká, že bude víc handlerů spuštěno v téže době. Naopak ve switchi se musí explicitně psát break, asi se tehdy očekávalo, že většinou se bude pokračovat dále. continue
v tomhle případě tedy funguje opačně, říká "nezastavuj se, pokračuj dál".
Jestli to v některých jazycích nejde takto hezky či analogicky udělat, tak je to chyba těch jazyků, že některý use case takhle zazdí.
Jestli to v některých jazycích nejde takto hezky či analogicky udělat, tak je to chyba těch jazyků, že některý use case takhle zazdí.Na začátku vlákna se mluví o jádře, C/C++ a o tom, jak v něm použít výjimky, aby to bylo lepší, než goto...
Nemuzu se ubranit dojmu, ze takto pouzite vyjimky nejsou nic jineho nez maskovane goto.Nápodobně. Je to proto, že Martin Böhm a trekker.dk jsou prasata (viz třeba tohle nebo tohle). RAII na ně
goto
je něco jako ty vole
, dokážete tím říci cokoli.
try { najdi zařízení; if nenalezeno throw Enenalezeno; alokuj porty; if selhalo throw Enenalezeno; try { namapuj paměť; if selhalo throw Euvolniporty; try { inicializuj; if selhalo throw Einit; } catch Einit: { uvolni paměť; throw Euvolniporty;} } catch Euvolniporty : { dealokuj porty; throw Enenalezeno; } } catch EnenalezenoTo se ve výsledku přeloží na kód, který pravděpodobně bude vypadat takhle:
... uvolni paměť; goto uvolni_porty; ... uvolni_porty: uvolni porty; goto nenalezeno; ... nenalezeno:Problém je v tom, že většina programátoruů v C++ a v Javě si neuvědomuje, že žádné objekty a žádné výjimky v CPU neexistují (teda co se výjimek týče, tak existují, ale jde o trochu jiné výjimky). Veškerý kód výjimek se stejně přeloží na nějaký ekvivalent goto, tedy na nepodmíněný skok.
Narozdíl od C ale v tomto případě nemá programátor žádnou kontrolu nad vygenerovaným kódem, takže z jedné výjimky musí vyhazovat jinou místo toho, aby prostě nechal program běžet stylem mám úklidový kód a skočím do něj tak, aby se uklidilo jenom to, co je potřeba uklidit.
goto
(a třeba i Knuth, i když on se k nim nehlásí) by jej nerušili proto, že by ho sami neuměli používat. Spíš by rádi jazyk, který nováčkům vštípí ty základní "správné" postupy, a sám by zabraňoval neelegantním konstrukcím. Jinými slovy, aby neelegantní konstrukce v praxi skutečně vypadaly neelegantně i na papíře, aby to člověka "trklo". Proto se bavíme o základní specifikaci jazyka. Prasárničky ať si do jazyka chrogramátor dopíše sám, třeba tak, jak navrhuješ. :o)
A přitom by na stavový automat stačily pořídné tail cally. Osobně bych na cokoli složitějšího asi použil spíš Ragel, abych měl jistotu, že se v tom pak nezamotám, až to po sobě budu číst. Z ukázky hned na hlavní stránce toho nástroje je ovšem hned zřejmé, do čeho že se to vlastně kompiluje.
Teď mluvím o céčkovitých jazycích – například v Perlu je výskok přes několik úrovní vnoření elegantně řešen tím, že lze cykly pojmenovat a pak říci, ze kterého se vyskakuje.
Připočti si tam Common Lisp a jeho BLOCK a RETURN-FROM.
Kde jsou třídy pro práci s časem, pro síťování, XML, multithreading?No a proč asi existuje Qt? To je přibližně to, jak by měla dobrá standardní knihovna jazyka vypadat.
Tudíž jakákoli standardní knihovna, která se stane součástí normy C++ určitě se nebude podobat C++.To bude asi další z důvodů, proč se C++ vyhnout, že?
Uvítal bych v C++ možnost síťování - čímž by bylo možné psát přenositelné síťové programy na každé (i neposixové) platformě.Není spíš lepší implementovat POSIXové síťové funkce na těch několika málo platformách, kde ještě nejsou? Co by takový C++ komfort obnášel? Zabalení socketů do objektů?
[...] třídy pro práci s datumem [...]Co to vlastně je, ono datumum? Nebo ten datumus?
Actually I made up the term "object-oriented", and I can tell you I did not have C++ in mind.
Java velmi rychle a příjemně. Člověk se nemusí starat o paměť (to má své pro i proti)Ano, proto některé aplikace vypadají tak, jak vypadají. Protože se nikdo o paměť nestará :'(
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.