isd (interactive systemd) je TUI (Text User Interface) nadstavba nad systemd. Videoukázky možností v dokumentaci. Zdrojové kódy jsou k dispozici na GitHubu pod GPLv3.
I QR kód může být nejednoznačný. Záleží na úhlu pohledu. Zkuste pootočit telefon. Pokud chce někdo zkoušet, Zachary Reese vytvořil webovou aplikaci. Zdrojové kódy jsou k dispozici na GitHubu [Hacker News].
Před 40 lety, v roce 1985, začala hráče počítačových her na tehdy 8bitových počítačích vytáčet protipirátská ochrana LENSLOK (Wikipedie). Hru jste mohli zkopírovat, bez LENSLOKu jste ji ale nemohli spustit. Při spouštění hry se na obrazovce zobrazil "rozsypaný čaj" a pro pokračování jej uživatel musel dekódovat, tj. musel se na něj podívat přes čočky LENSLOKu, přečíst dvě písmena a ty napsat na klávesnici.
Byla vydána alfa verze GNOME 48. S novým přehrávačem zvukových souborů Decibely. Vyzkoušet lze instalační ISO GNOME OS. Vydání GNOME 48 je plánováno na březen.
Společnost OpenAI představila Operator, tj. agenta, který k provádění úkolů (najdi a rezervuj ubytování, kup ingredience potřebné pro uvaření tohoto jídla, …) používá vlastní webový prohlížeč. K tomu využívá Computer-Using Agenta (CUA). Operator je zatím dostupný pouze pro uživatele ChatGPT Pro ve Spojených státech.
SoftBank, OpenAI, Oracle a MGX představili projekt Stargate, do kterého v příštích čtyřech letech investují 500 miliard dolarů. Cílem projektu je vybudovat ve Spojených státech novou infrastrukturu pro umělou inteligenci (AI).
Bun (Wikipedie), tj. běhové prostředí (runtime) a toolkit pro JavaScript a TypeScript, alternativa k Node.js a Deno, byl vydán ve verzi 1.2. Představení novinek také na YouTube. Bun je naprogramován v programovacím jazyce Zig.
V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Forgejo byla vydána ve verzi 10.0 (Mastodon). Forgejo je fork Gitei.
Byla vydána nová stabilní verze 7.1 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 132. Přehled novinek i s náhledy v příspěvku na blogu.
Vývojáři Debianu oznámili, že v březnu bude zahájeno zmrazování Debianu 13 s kódovým názvem Trixie. Současně bylo oznámeno, že kódový název Debianu 15 bude Duke. Debian 14 bude Forky.
Zamyšlení/úvaha nad rozmanitostí C++, jednoduchostí a čitelností kódu, novými verzemi C++, lidskými vlastnostmi a zkušenostmi, ... a vůbec o tom, jak je těžké se dohodnout na tom, který kus dortu je dobré jíst a co je lepší nechat na stole.
Programování je jako umění - začínáme pár čmouhami na papíře a končíme u různých stylů - někdo směřuje k fotorealismu, jiný kreslí komixy, jiná zase přidává čmouhy a nazve to "abstraktním uměním", ... no a pak je tu Picasso. Stejně tak někdo má raději vysoce přehledný, co nejjednodušší kód (Python), někdo jiný se zase vyžívá v abstrakci (Java), někomu je to jedno (hlavně, když to jede rychle), někdo má speciální úchylky (raději bez příkladu ), apod.
Tím se snažím naznačit, že - bohužel či bohudík - jsou mezi námi programovací jazyky, kde je vše dovoleno a je pouze na vůli programátora, které prvky použije. Jazyky, kde jeden program může vypadat jako obraz od Moneta a druhý jako kubistická kompozice od Picassa, oba 100% v mezích stejného jazyka. Jazyky jako C++.
Já osobně vždy spadal do zastánců KISS principu - malé krátké jednoduché programy (či funkce), tedy Bash, Python, místy Perl, C, a vyhýbal se jazykům jako C++ či (hlavně) Java. I já si prošel akademickým egoismem a snažil se svůj názor vnutit ostatním, ale pak jsem zmoudřel a uznal, že i těch 9 úrovní abstrakce namespaců a templaty templatů (nenáviďte mě ), používaných v některých větších C++ projektech, má svůj smysl. A taky jsem se pořádně začetl do C standardu a zjistil, že neznám všechny případy nedefinovaného chování, začal pochybovat o tom, že někdy budu umět C, a k C++ se prakticky nevrátil - ne proto, že by to byl jazyk složitý na použití, ale protože je to kuchařka ve stylu "vytvoř si svůj jazyk" a bez výběru konkrétního receptu může snadno vzniknout nechutná splácanina.
Takový Python má jako součást PEP20 (PEP = Python Enhancement Proposal) i následující prohlášení:
There should be one-- and preferably only one --obvious way to do it.
Přičemž zároveň existuje proslavený PEP8, "Style Guide for Python Code", poskytujíc doporučené (nikoli však vynucené) zásady psaní kódu. Oboje samozřejmě může být na škodu (dle individuálních názorů) - např. neexistence switch
statementu v Pythonu, "protože můžete přece použít if-else". Také lze tvrdit, že tvůrci jazyka by se neměli "míchat" do jeho používání a že centrální autorita na to, co je syntakticky a sémanticky dobré/špatné, je na škodu. Obecně je ale daleko jednodušší mít jen jeden způsob "jak to dělat", protože ten může být objektivně správný - bez dohadů o tom, zda způsob A je umělecky lepší, než způsob B. Jenomže existují situace, kdy použití A je tak nechutně ohavné, že se všichni rozhodnou pro B, .. ale když ono B v tomto jazyce neexistuje.
Volně tím narážím na rčení typu "použít nejvhodnější nástroj pro daný úkol" a jak naopak složitý a rozmanitý jazyk, kde lze jednu věc vyjádřit více způsoby, může být neuvěřitelně osvobozující. Pěkně to znázorňuje jistý xkcd.com komiks - méně není vždy lépe a nazývat věci pravými přesnými jmény není daleko od přehledné specifikace datových typů v hashmapě á la C++ (unordered_map <string,int>
), v porovnání s jednoduššími, univerzálnějšími, avšak méně přehlednými void pointery á la C.
Protiargumentem budiž ona přehlednost a determinismus - v C je velmi snadné určit, co i++
dělá, v C++ to může být přetíženo na system("rm -rf /*")
- nemůžeme tak samotnému jazyku věřit "nos mezi očima" - musíme spoléhat na to, že ho nikdo neuřízl nebo že ho nahradil něčím, co se chová jako nos. Jak jen to je .. "s velkou silou přichází velká zodpovědnost"? Proč mi to jen připomíná komplexní složitý vim
v porovnání s jednoduchým a jednoúčelným nano
?
V rámci rozuzlení se asi můžeme shodnout, že KISS do extrému není nejlepší řešení - jistá míra komplexity a redundance přidává pomyslné nástroje do virtuální brašny, ale možná přehršel nástrojů s nástroji, které opravují další nástroje (auto
jako lék na dlouhé typy iterátorů?) už je příliš a do brašny se nevleze. Jenomže co když má jazyk přehršel nástrojů, jeden se pokazí a vy nemáte ve své brašně ten správný fixion? Je řešením koupit si větší brašnu, omezit množství nástrojů v projektu, nebo zvolit jiný jazyk?
Podobné problémy jsme tady měli vždy i v C - psát závorky u return
? sizeof
? Co mezeru za jménem funkce? Před operátorem? Limit 80 znaků / řádek? Jak zalamovat { }
? Typedef pro struct
nebo ne? ... Nicméně tyto se jeví naprosto banálně v porovnání s některými vlastnostmi C++ a zda je použít či ne - např. zmíněné auto
- existuje milión a jeden názor, od použití všude (a přidání decltype(auto)
jako návrat z každé funkce / C++14), až po kompletní zákaz. "Pravda" asi bude někde uprostřed, .. ale kde? Opravdu - jako např. skalní zastánce explicitního typování - odmítnete patch, který implementuje 90% funkcionality pomocí generických auto
funkcí, mumlajíc něco o skrývání bugů při změně datového typu a špatné debuggovatelnosti? Co napsat do směrnic stylu kódu ("style guide")? Podobně třeba s iterací, budete akceptovat pouze for (int &i : v)
a tvrdě odmítat "staré" ::iterator
y? Nebo obráceně? Co třeba chytré pointery? Budete vynucovat make_unique
namísto new
? Nebo naopak "staré" *pointery
? Od jakého bodu je ten kód příliš odlišný od vaší představy? Od jakého bodu je "prasácký"?
Zde přesně leží můj problém a podstata tohoto zápisku - nemám problém přispívat do cizích projektů (přizpůsobím se stylu daného projektu), ale mám strach vést svoje projekty jako maintainer, obzvláště menší projekty, kde se cení pomoc každého dobrovolníka. Protože dříve nebo později se najde nějaký Franta, který rozdělí velké číslo apostrofy, a já nebudu mít dobrou výmluvu, proč tomu říkám "prasárna", protože nebudu mít žádné směrnice stylu kódu, protože pro ~10 kLOC projekt se mi nevyplatí je sepisovat. Chybí mi PEP8 pro C++.
Je více způsobů, jak z toho ven, ale žádný není ideální. Limitace na C++03 by mi zabránila použít C++11 způsob iterace (který mi osobně přijde daleko přehlednější), nehledě na spoustu dalších užitečných věcí. Taky k tomu lze přistupovat jako v C, kde se podobné věci vyskytly s příchodem C99 (a C11), např. for (int i = 0; i < x; i++)
a já je víceméně ignoroval - v porovnání jsou ale nové vlastnosti i staré možnosti C++ výrazně dalekosáhlejší.
Velkými problémy paradoxně zůstanou i staré věci - patche nahrazující i++
za ++i
(kde i
je int
) "protože je to rychlejší", správné použití size_t
namísto int
pro iteraci cyklem a podobné věci, kde není "dobré" a "špatné" řešení, pouze zvyk a moje odpověď "ono se vždy psalo i++" stojící za houby. Velmi podobně i to, na co narážel Linus - C++ je prvním jazykem spousty programátorů, kteří tak "sežrali všechen rozum" a nedají si vymluvit, že zpětné lomítko v #include
není dobrý nápad, přestože C++11 jej definuje "with implementation-defined semantics" namísto "the behavior is undefined" (C++03) a v MSVS jim to přece funguje.
Summa summarum, po dlouhých rozvahách a mnohahodinovém přemýšlení o tom, kolik "šedých oblastí" by C++ přineslo, se rozhodnu pro C a spolknu těch pár řádků vlastní implementace linked listu. Nebo skočím do Pythonu a zapláču nad výkonem. Před pár dny se to opakovalo asi po čtvrté a já si řekl, že přece musí existovat cesta ven z tohoto začarovaného kruhu - tak prosím poraďte. Jak použít C++ v malém projektu více lidí a neztratit při tom nervy? Mám 100 chutí udělat směrnici ve stylu "C + těchto pár C++ vlastností", ale s tou by mě všichni poslali do temných míst.
Díky.
Tiskni
Sdílej:
patche nahrazující i++ za ++i (kde i je int) "protože je to rychlejší"To někdo dělá? Čekal bych, že tohle zrovna může krásně ošetřit kompilátor bez zásahu programátora a takový patch bych ignoroval. Stejně jako patche odporující stanovenému stylu, snad mám jako maintainer nějaké koule, ne?
index++
za ++index
, tak se zaprvé přeskočí první položka či znak, zadruhé se v posledním kroku sáhne za hranici řetězce/pole, což by minimálně u řetězce mohlo mít kastastrofické následky (protože se přeskočí ukončovací '\0'
).
PS: Podobný názor jsem viděl kdysi u konstrkuce do {...} while(x)
versus while(x) {...}
, kdy se dotyčným ten první nelíbil (nejspíš kvůli osaměléímu while
na konci) a navrhovali jeho zavržení Ano, dělá. Je to samozřejmě blbost (pokud se to nepoužije jako rvalue), protože ve většině asm jazyků (které znám) je nějaká obdoba "inc" (a příslušná instrukce), takže i neoptimalizující překladač oboje přeloží stejně (pro int). Může to mít smysl pro netriviální datové typy (iterátor v C++), ale právě tohle použití "infikuje" (
) mozkové buňky některých jedinců, kteří pak
++i
používají všude nehledě na datový typ a hádají se za to.
Taky můžeš použít nějakou knihovnu, třeba libucw, která obsahuje těch pár funkcí a maker, bez kterých se vůbec nedá programovat, a u kterých nechápu, že už dávno nejsou v C standardně.Je to asi fajn knihovna, ale v téhle podobě by do C standardu IMHO nemohla. Jednak je zjevně orientovaná na UNIX a jednak mi to přijde jako taková všehochuť, co se zrovna hodilo. Algoritmy a datový struktury - super, to by klidně v stdlib mohlo být. Hashing imho patří spíše do crypto knihovny. A build systém a generování dokumentace bych tam vůbec nemusel, na to imho už existují dobré nástroje...
třeba libucwvelka nevyhoda je to silene mnozstvi prikladu, jak tu knihovnu pouzivat. V tom se normalni clovek proste ztraci....
Díky za tip, ale nevidím to ani v repozitáři Debianu, ani na RHELu, nevidím, že by to mělo nějakou větší popularitu, ... to už rovnou můžu použít CCAN a mít výhodu modularity.
Zkoušel jsem se jednu dobu ponořit do glibu, ale zamotal se do toho jejich C pre-preprocessoru (už nevím, jak se jmenoval), který "zjednoduššoval" kód tak, že vůbec byl čitelný. Protože bez něj to bylo jako psát kód s permanentně zapnutým capslockem. Divil bych se, kdyby už jenom výčet "základních" typů neodradil polovinu populace.
A jakékoliv přidávání (třeba) datových struktur do standardní knihovny znamená rozbití existujících programů, protože neexistuje žádná striktní konvence v pojmenovávání standardních a nestandardních typů.Některé věci v C11 mají pojmenování
_Foobar
, protože jména s podtržítkem následovaným velkým písmenem jsou vyhrazena pro implementaci.
"Namespacy" v C jsou hlavičkové soubory - právě proto máme stdbool.h
. Starší programy jej nemusí includovat a jejich definice bool
zůstanou beze změny.
co i++ dělá, v C++ to může být přetíženo na system("rm -rf /*")není problém C++. Je to jako napsat funkci increment(), která bude mazat systém. Jinak v C se tomu taky nevyhneš - pokud je i++ float, chování bude v určitých případech jiné kvůli zaokrouhlování. Kritérium je jen jedno: kód musí být čitelný.
Opravdu - jako např. skalní zastánce explicitního typování - odmítnete patch, který implementuje 90% funkcionality pomocí generických auto funkcí, mumlajíc něco o skrývání bugů při změně datového typu a špatné debuggovatelnosti?Tohle brutálně závisí na použití. Viděl jsem kód, který byl kvůli použití auto špatně čitelný. Viděl jsem kód (vlastně jsem ho napsal), kde auto nebylo (před zavedením C++11), misto toho byly kvůli zkrácení definované typedefy. Problém byl, že v každé třídě jinak (třídy vznikaly s časovým odstupem).
Co napsat do směrnic stylu kódu ("style guide")?Nic, nějaké si najdi a nevymýšlej svoje. Na formátování nezáleží, jen musíte mít všichni stejné. Co se kódu týče, doporučuju první a druhý díl "Effective C++" od Scotta Meyerse.
Podobně třeba s iterací, budete akceptovat pouze for (int &i : v) a tvrdě odmítat "staré" ::iteratory? Nebo obráceně?Ne. Podle toho, co s tím chceš dělat. Potřebuješ v cyklu zpracovávat hodnoty? První případ. Potřebuješ iterátory? Druhý případ. Pracuješ nad více poli? Indexy. Ano, v supermoderním C++ pořád někde používám indexy, protože je to čitelnější.
Co třeba chytré pointery? Budete vynucovat make_unique namísto new? Nebo naopak "staré" *pointery?Ano, ne, ne! Vždycky se uchechtávám, když si nějaký javista stěžuje, že musí všecko uvolňovat sám. Zaprvé nemusí, zadruhé to stejně nedokáže. Proč? Pokud je v konstruktoru objektu vržená výjimka, nevolá se jeho destruktor (objekt není v definovaném stavu). Volají se jenom destruktory jednotlivých členů. Ošetřit tohle ručně je hrůza. Takže
unique_ptr
a shared_ptr
je naprostá nutnost. Pokud bude v patchi použito delete tam, kde to není nutné, patch s vysvětlením odmítni.
make_*
tu máme proto, abys mohl napsat:
auto var = std::make_unique<Type>(...)
místo
std::unique_ptr<Type> var(new Type(...))
make_shared
je to samé, jen přidá mikrooptimalizaci v podobě alokace objektu a počitadla referencí dohromady.
Od jakého bodu je ten kód příliš odlišný od vaší představy? Od jakého bodu je "prasácký"?Když se nedá číst, je to prasárna. Co se týče vynucování nějakých konvencí, dopoučuju What was the strangest coding standard rule that you were forced to follow? na StackOverflow.
using namespace X
. Přísný zákaz používání using namespace X
v hlavičkách.std::shared_ptr<Type> var(new Type(...))
může projít alokace objektu a selhat alokace kontrolního bloku pro shared_ptr. make_shared tohle hlídá a případně smaže i ten vytvořený objekt.
shared_ptr
předaný ukazatel také smaže, pokud cokoliv v těle toho konstruktoru vyhodí výjimku.
Asi to není jen o penězích, protože i v open source projektech člověk narazí na takovéhle úkazy:
/************************************************************ Function: wait_for_reply ************************************************************* Inputs: void (none) Returns: int Description: ************************************************************/ #ifdef _NO_PROTO int wait_for_reply() #else int wait_for_reply( void ) #endif {
Další problém s výjimkami je v tom, že např. parametry funkce můžou být vyhodnocené v jiném pořadí než jsou napsané v kódu a tak vznikají memory leaky, které ani na první pohled nejsou vidět. např.Co třeba chytré pointery? Budete vynucovat make_unique namísto new? Nebo naopak "staré" *pointery?Ano, ne, ne! Vždycky se uchechtávám, když si nějaký javista stěžuje, že musí všecko uvolňovat sám. Zaprvé nemusí, zadruhé to stejně nedokáže. Proč? Pokud je v konstruktoru objektu vržená výjimka, nevolá se jeho destruktor (objekt není v definovaném stavu). Volají se jenom destruktory jednotlivých členů. Ošetřit tohle ručně je hrůza. Takžeunique_ptr
ashared_ptr
je naprostá nutnost. Pokud bude v patchi použito delete tam, kde to není nutné, patch s vysvětlením odmítni.
int a = x(will_throw(), new X()); // překladač může nejdřív zavolat new X() a pak ho nikdo neuvolníDalší problém nastane v případě asynchroního kódu, kdy ti nepomůžou ani smart pointery. Např. v callbacku z objektu si zrušíš smartpointer, takže se vyvolá destruktor. Jenže v tuhle chvíli jseš pořád v metodě objektu, který jsi právě zrušil. Tady už ti pomůže jenom redesign projektu, garbage collector nebo implementace lifetimů jako v rustu.
Např. v callbacku z objektu si zrušíš smartpointer, takže se vyvolá destruktor.To mi přijde jako docela hrůza v návrhu. Ale smart pointery ti pomoct můžou, jen si říkám, zda to není prasárna ještě větší. Ve svém kódu jsem techniku ještě nezkoušel.
this->bla
psal self->bla
.
Pokud se nedá asynchronnímu peklu vyhnout, pak mi tohle přijde jako rozumné řešení.
Např. v callbacku z objektu si zrušíš smartpointer, takže se vyvolá destruktor. Jenže v tuhle chvíli jseš pořád v metodě objektu, který jsi právě zrušil. Tady už ti pomůže jenom redesign projektu, garbage collector nebo implementace lifetimů jako v rustu.Předpokládám, že ten callback vynulovává shared_ptr (v případě jiných chytrých pointerů to bude na méně řádek). V takovém případě nejprve obsah toho chytrého pointeru ulož do lokálního shared_ptr pointeru, pak vynyluj ten, který jsi chtěl vynulovat ("zrušit"), a na konci té funkce ten lokální shared_ptr vynulu... pardon, nedělej nic, nech ho zdestruovat.
Ako človek z prostredia C++ sa rôznym malým dependency bránim. Áno tiež si myslím, že balíčkovač pre C++ nemá zmysel.
Či je C++ blbo navrhnutý jazyk nemá zmysel diskutovať. Hlavný problém je v chýbajúcich konvenciách, takže raz nejaký modul používa shared pointre iný modul napríklad vracia surové pointre ktoré si treba upratať po sebe, iný zase používa surové pointre, ale upratuje si ich sám. V takom prostredí je použitie cudzieho modulu často rizikové ak nedodržiava rovnakú konvenciu ako zvyšok (treba dávať obzvlášť pozor čo sa volá, alebo celú knižnicu ak je to možné obaliť do vlastného rozhrania).
Python 2.x obsahuje dost nepěkných failů,stejně tak C++, viz. třeba
std::vector<bool>
které stojí za to vymýtitNad tímhle bych se pozastavil. Na jedné straně tady máme python, který faily vyháže za cenu ztráty zpětné kompatibility. Na druhé straně C++, které je plně zpětně kompatibilní za cenu ponechání nepěkných failů. A teď můžeme strávit zbytek času světa hádáním se o tom, který přístup je lepší
Alebo si napísať vlastný jazyk s vlastnými obľúbrnými failmi.
A teď můžeme strávit zbytek času světa hádáním se o tom, který přístup je lepšíAno, tohle je přesně ta nejdůležitější otázka. Mě osobně vůbec nezajímá odpověď, ale zajímá mě kdo na tuto otázku odpoví. Pokud na ní odpoví vývojáři daného jazyka, kteří mu velice dobře rozumí (a tedy vytvoří novou zpětně nekompatibilní větev), tak uživatelé nemusí nic řešit (když uživatel zvolí novou větev, tak má garantováno, že v ní nejsou faily). Naopak, když se tato zodpovědnost přenese na uživatele, kteří o jazyku ví houby v porovnání s autory (např. C++), tak co projektík, ba dokonce co řádek kódu, to zcela odlišný názor (prosím netahat za slovíčko, že zcela odlišný názor mohu mít na jakýkoliv řádek kódu v jakémkoliv jazyce bez ohledu na faily vyřešené ve zpětně nekompatibilní verzi). Mně osobně přijde pro svět jednoznačně výhodnější když na tuto otázku odpoví tvůrci jazyka, než odpověď přenechat na miliónech z definice neznalých uživatelů. Ale proti gustu žádný dišputát.
std::auto_ptr
. Nebo aspoň zadokumentovat, že se tahle fíčura nemá používat.
A hlavně tak trochu prakticky nepoužitelné - vysvětluje to velmi vysokoúrovňové koncepty na neexistujících typech ("GSL", Guideline support library), odkazujíc se na možné budoucí vlastnosti jazyka. Přijde mi to jako vhodný doplněk standardu, takový "wishlist" / "rationale" některých vlastností, případně jako seznam věcí k zamyšlení se (právě pomocí vysoké úrovně), jako inspirace pro tvořitele sad pravidel, ne pro "uživatele".
To tě neschopnost pochopit C++ fakt dostalo, že kvůli němu bulíš při každé příležitosti,C++ jsem pochopil, složil jsem z něho (dvě) zkoušky (za jedna), přečetl o něm několik knih, napsal několik projektů a řešil jeden komerční projekt (a nedořešil, kvůli stěhování na druhý konec republiky). Nepovažuji se v něm za nějak fluentního a těžko můžu říct, že jsem ho někdy ovládal plně. Přesto (a nebo možná právě proto) jsem dospěl k názoru, že je to velmi špatná technologie, okolo které všichni hodí jak kolem císařovo neviditelných šatů. Potřebu uvést svůj názor pod tématicky stejné blogy cítím proto, že jednak může být špatný a pak by bylo dobře, kdyby byl vyvrácen, ale také jako varování pro lidi, kteří přemýšlejí, že s ním začnou, ale nejsou si zcela jisti.
tohle o tebe čtu asi po padesátéTo bude tím, že je to můj názor a je konzistentní napříč časem, resp. zatím se nenaskytlo nic, co by ho změnilo. Možná ti to přijde divné, ale chyba je imho v tobě, ne ve mě.
Přesto (a nebo možná právě proto) jsem dospěl k názoru, že je to velmi špatná technologie, okolo které všichni hodí jak kolem císařovo neviditelných šatů.Naprostý souhlas.
C++ jsem pochopil, složil jsem z něho (dvě) zkoušky (za jedna)ROFL
To je přeci naprosto individuální.A proto to nic neznamená
Přesto (a nebo možná právě proto) jsem dospěl k názoru, že je to velmi špatná technologie, okolo které všichni hodí jak kolem císařovo neviditelných šatů.Otázka je, jestli je C++ špatné, protože je špatně navrženo, nebo protože je velmi náročné dobrý jazyk s tímhle zaměřením vytvořit. IMHO to druhé. Nasvědčují tomu zkušenosti z pokusů vytvořit alternativu/náhradu C++, viz např. fiasko jménem D a podobně. Nejnovějším pokusem v tomhle směru je Rust a přes imho dobrou výchozí pozici se také potýká s velkými problémy...
Otázka je, jestli je C++ špatné, protože je špatně navrženo, nebo protože je velmi náročné dobrý jazyk s tímhle zaměřením vytvořit.Imho to není binární otázka a špatně je to z obou důvodů. Ale zrovna ten první imho taky, protože historie toho jak to vznikla je více/méně omyl a původně nikdo neplánoval, že z toho bude jeden z nejpoužívanějších jazyků.
Nasvědčují tomu zkušenosti z pokusů vytvořit alternativu/náhradu C++, viz např. fiasko jménem D a podobně.D mi přijde jako fiasko tak možná politicky, ne technicky. A zrovna poslední dobou mi přijde, že se spíš docela rozmáhá. I když už v něm nedělám, tak pořád vidím nějaké nové články v /r/programming. Kdybych hledal něco dneska, tak asi zkusím Rust, protože má lepší sociální trakci.
JJ presne tak Jazyk D zdaleka neni fiasko, ano ma trochu pochmurnou historii, ale zda se ze se s toho v posledni dobe docela otrepava.
D mi přijde jako fiasko tak možná politicky, ne technicky.Technicky to fiasko určitě není, v zásadě obdivuju autory, že to dokázali technicky dotáhnout tak daleko. Nicméně oni si IMHO vybrali hrozně těžkou výchozí pozici - museli zvládnout víceméně vše, co C++ a ktomu ještě přidat věci navíc, které C++ nemá a které zaujmou. No a v tomhle bodě právě úplně nevím, co to vlastně mělo být...
Kdybych hledal něco dneska, tak asi zkusím Rust, protože má lepší sociální trakci.Hm, asi jo, ale přijde mi, že poslední dobou to trochu kleslo...
museli zvládnout víceméně vše, co C++ a ktomu ještě přidat věci navíc, které C++ nemá a které zaujmou. No a v tomhle bodě právě úplně nevím, co to vlastně mělo být...Tak třeba jednoduchost, čistá syntaxe, kvalitní chybové hlášky, mixiny, jednoduchý paralelismus, poměrně široká knihovna ve stylu pythonu (batteries included). Ostatně D nezačal tvořit někdo náhodný, ale jedni z nejlepších programátorů kompilátorů C++ (Walter Bright a Andrei Alexandrescu), protože jim z toho málem hráblo. Kniha The D Programming Language mi přišla skvělá právě z důvodu, že Andrei tam často vysvětluje co se jim na C++ nelíbilo a proč to udělali v D jinak. Tahle kniha by imho o C++ napsat ani nešla, protože C++ je prostě více méně náhodné a žádná myšlenka ve stylu „proč takhle?“ za většinou featur nebyla.
C++ je prostě více méně náhodné a žádná myšlenka ve stylu „proč takhle?“ za většinou featur nebyla
To, že ji tam vy nevidíte, nebo ve své averzi vidět nechcete, neznamená, že tam není.
moc
). A jde také o určitý styl psaní. Ve výsledku to však je dobře čitelné a přehledné.
protože je velmi náročné dobrý jazyk s tímhle zaměřením vytvořitA jake by vlastne C++ melo mit zamereni? Ted si trochu hraju s Haskellem a musim dat zase po nejake dobe matematikum za pravdu. Dobra teorie je zaklad. I Lisp se da na Haskellu postavit, ale obracene, sotva. Prijde mi, ze jeden z pozadavku je moznost vysoke urovne abstrakce (narozdil od C); jenze to funguje dobre jen pokud ten jazyk stoji na dobre teorii. Na druhou stranu, je pozadavek na pristup k HW a menitelnost struktur, proste ma to byt imperativni jazyk. Jenze to jde dost proti sobe - mel by vubec nekdo chtit imperativni jazyk s vysokou urovni abstrakce? Leda snad, ze by se to misto lambda kalkulu postavilo na nejake zvlastni logice, napriklad. To by mozna slo, ale je to dekada vyzkumu.
Čo tak Rust? Výkon podobný C++ a celkom dobre definované konvencie.
To bohužel není ani POSIX, takže to u mě nenajde moc využití. .. Ale stejně dík.
Našel jsem díky tomu pěkné schovaniny jako insque(3)
(POSIX.1-2001).
Summa summarum, po dlouhých rozvahách a mnohahodinovém přemýšlení o tom, kolik "šedých oblastí" by C++ přineslo, se rozhodnu pro C a spolknu těch pár řádků vlastní implementace linked listu. Nebo skočím do Pythonu a zapláču nad výkonem. Před pár dny se to opakovalo asi po čtvrté a já si řekl, že přece musí existovat cesta ven z tohoto začarovaného kruhu - tak prosím poraďte.Když rada, tak bych zcela jistě volil cestu experimentování s dalšími jazyky. Začal bych jazyky Dao, Go, Rust, Scala (zhruba v tomto pořadí - všechny tyto mají nativní podporu paralelismu v nějaké formě) a případně dále - Lua, Terra, Ceylon, ECMAScript 6 (aka ECMAScript 2015), C#. Pokud jste velký zastánce KISS, Cckař a navrch nechcete mít moderní jazyk s paralelismem, tak bych pořadí jazyků přeskládal a na první místo dal Terra.
Podopora GUI je vec, čo ma na ruste dosť serie. Bindingy na kompletné Qt nie sú až tak jednoduché a QML ... to rieši dokopy jeden človek (alebo skôr riešil, repozitár vyzerá byť dosť mŕtvy).
takže pokud zkoušíte aktuální upstream, tak na nějaké chybky narazíte. Ale samozřejmě je možná i chyba mezi klávesnicí a židlíJj, skúšal som najnovší upstream, je možné že je to tak 50 na 50 :)
paradoxne Scott Meyers nedavno oznamil, ze uz ho C++ nebavi a bude delat neco jineho.To se asi nevylučuje.
Díky, zajímavý pohled. Mě víc pobavila jeho předchozí přednáška z DConfu 2014.
(Ale na Daniela nemá, cha!)
Přitom i java to má ošetřené snad úplně od začátku, tak absolutně nechápu proč do standardu nevynutili detekci při překladu, zvlášť když je to triviální.Protože to na rozdíl od Javy triviální není, v C++ metody (ani konstruktory) nemusí být definované inline, dokonce nemusí být ani ve stejném souboru. Překladač pak bude mít vážné problémy rekurzi vůbec poznat.
Překladač pak bude mít vážné problémy rekurzi vůbec poznat.Proč? Při linkování je přeci vše k dispozici, ne?
Díky všem za odpovědi.
Nečekal jsem magické řešení, nepotřeboval jsem přímé odpovědi na otázky v zápisku (byly spíše reprezentativní), pouze jsem chtěl asi nadhodit volnější otázku typu "jak řešit různorodost přístupů přispěvatelů do projektu, umocněnou složitostí C++, bez bikesheddingu a podobného odrazování od přispívání do projektu".
Jedním z takových faktorů by právě byl i vyčerpávající 100-stránkový dokument toho, co se může a nemůže používat, co je přijatelné a co ne, apod. - než aby to schopný kolemjdoucí programátor četl, tak se mi na patch vybodne. Ostatně něco velmi podobného nedávno řešil Python:
The one-off nature of the CPython toolchain and workflow means that any new contributor is going to need spend time learning the tools and workflow before they can start contributing to CPython. Once a new contributor goes through the process of learning the CPython workflow they also are unlikely to be able to take that knowledge and apply it to future projects they wish to contribute to. This acts as a barrier to contribution which will scare off potential new contributors.
"Malým projektem" jsem pak myslel spíše "já něco napíšu, otevřu zdroják a rád bych, aby mi s tím občas někdo pomohl" spíše než "máme úzkou skupinu 5 lidí, kteří spolu neustále komunikují" - to jsem nevysvětlil, mea culpa.
Trochu mě přitom překvapila současná popularita C - měl jsem za to, že dnes už je to jen jazyk pro jaderné vývojáře a jiné vousaté dědky a trochu se vyděsil, kam se to řadím. Ale vono fakt ne.
Možná jsem taky trochu doufal, že bude existovat nějaká "databáze" stylů psaní / používání vlastností C++, podobná stylům indentu s chytlavými jmény. Pokud neexistuje, škoda.
Každopádně díky za diskuzi.
indent
u.
Já sám psal code style jednou a vešlo se to v pohodě na jednu stránku i s návodem na používání gettextu.