Mám pocit, že lidi co tu píšou pesimisticky o C++ v něm kdysi možná dělali, ale teď už nemají vůbec přehled. Nedávno byl v Praze schválen nový standard C++20 s největší účastí co kdy byla. Nová verze je každé 3 roky. Jak gcc, clang, tak Visual Studio adpotují nové věci už v průběhu návrhu nového standardu. Vývoj jde naopak rychleji než kdy předtím.
https://www.reddit.com/r/cpp/comments/f47x4o/202002_prague_iso_c_committee_trip_report_c20_is/
Nevypořádal ses s konkrétními připomínkami v diskusi, zejména:
1. Složitost C++, které si i přes další a další revize všechen ten balast z minula nese s sebou.
2. Absence lifetime analýzy, která vede k chybám i v moderním C++.
3. Problémy s parsováním deklarací funkcí vyřešené alternativní syntaxí s klíčovým slovem auto. A dodávám já - celkový syntaktický horor oproti různým konkurenčním jazykům, byť je vidět, že autoři C++ dělají co mohou.
Určitě máš pravdu, že nové verze jsou o něčem jiném a konkrétně třeba zavedení modulů (konečně!) je velký posun kupředu. Jak se ale v moderním C++ formátují řetězce? V Novákově repozitáři, který zde odkazuje, vidím třeba
var1 + " - " + var2 + ": " + var3
V jiném příkladu zde v diskusi vidím nechvalně známé
cout << "Hello world" << endl;
Dost hrůza. Už na tohle existuje něco rozumného nebo se to aspoň chystá?
26. 5. 2020, 12:29 editováno autorem komentáře
1) To je základní vlastnost jazyka se kterou musí člověk počítat. Zpětná kompatibilita je pro velkou část uživatelů C++ zásadní. Maximálně se uvažuje o nějakých epochách jako v Rustu.
2) Ano není součástí C++. Už jen kvůli bodu jedna to ani není možné. To by znamenalo udělat nový jazyk. Pro statickou i dynamickou analýzu je plno nástrojů součástí všech hlavních překladačů. A zrovna lifetime je něco co v moderním C++ člověk prakticky neřeší.
3) Nevím přesně o jaké problémy s parsováním se jedná. Nové verze je zejména pro automatickou detekci návratové hodnoty. Používá se zejména pro zjišťování
návratové hodnoty z šablonových parametrů. Pokud si tam dáte konkrétní typ, tak to už je na vás. C++ vás neomezuje.
4) Je dobře že se ptáte zrovna na formátování. V C++ 20 je nová knihovna format.
https://en.cppreference.com/w/cpp/utility/format
1) Nemyslím si, že k tomu v dohledné době dojde. Nikdo nikoho nenutí psát pro C++ překladač v C, a přitom to v podstatě jde. Je to v mnoha ohledech nevýhoda, ale v současné době, kdy se klidně programovací jazyk v nějaké verzi zažízne a hotovo, to je možná i výhoda. Dá se postupně psát nové věci v novém standardu, a není nutné hned vše přepisovat do nového.
2) Není zač.
3) Toto řešení se podle mě zvolilo, protože byla požadována nová vlastnost, která se starou syntaxí snad ani nešla udělat. Čili se muselo vytvořit něco nového. Navíc to stejně funguje u lambda funkcí, kde návratovou hodnotu ani jinak určit nelze.
Souhlasím, že toho syntaktického balastu je hodně, ale to by se muselo jinak zavádět ještě mnohem více klíčových slov, a nebo odříznout tu zpětnou kompatibilitu. V C++ 20 je např. nová syntaxe pro koncepty, takže velikost balastu se sice sníží, ale člověk aby se učil novou syntaxi :D. Ale nikdo vás nenutí k nové syntaxi, díky kompatibilitě člověk může dál psát ten balast :D.
V moderním C++ se řetězce formátují pomocí https://en.cppreference.com/w/cpp/utility/format
Pro starší c++ se dá použít takřka identická knihovna fmt.
a zase mám s tou novou vychytávkou trochu problémy. Já třeba používám referenci indexem při formátování.
logDebug("V domu je $1 stenata a $2 kotata", cstenat, ckotat)
Pokud někdo bude chtít hlášku přeložit a přehodit štěňata a koťata, určitě zvládne přehodit čísla u $
std::format("V domu je {} stenata a {} kotata", cstenat, ckotat)
(jen příklad, zapomeňme nyní na problémy s češtinou, číslovky a pády)
> Nová verze je každé 3 roky
Ještě je dobré dodat, že polovina novinek jsou rovnáky na vohejbáky, čímž je krásně ukázáno, jaký bordel v tom jazyku je (tedy spíš je to špatnou koncepcí) a kolik dalšího bordelu se s každou verzí přidává. Nemluvě o tom, že ty nové konstrukty nejsou ortogonální, čímž se programátorské peklo nezadržitelně prohřívá...
V každém dlouhodobě vyvíjeném jazyce časem přibývají rovnáky a ohýbáky na věci, které se v minulosti nenavrhly dobře.
Řešit to formou - naučím se nový jazyk - který časem stejně bude plný rovnáků a ohýbáků - není řešení.
(nebavme se o C++, vzpomenu si na Javu, nebo na Python, ale i ten módní Rust už má v sobě dost rovnáků, konečně celý Rust mi přijde jako jeden velký rovnák a ohýbák na C ve stylu "C++ je fuj, narovnejme C)