( utpKabel | 2014. 07. 20., v – 13:36 )

Ha általánosságban fogalmazok meg kritikát a C++-szal kapcsolatban, akkor a konkrétumok hiánya a baj, ha konkrétumot említek, azon elkezdünk vitatkozni, és akkor meg azt érzitek, hogy ráfókuszáltam egy apróságra.

Tisztázzunk pár dolgot:

1.
Hogy a C++ viccnyelv, azt nem én mondtam.

2.
Te viszont azt mondtad, hogy a C++ mennyire jól végiggondolt nyelv, amivel mélységesen nem értek egyet. Az egyes C++ feature-öket csak lokálisan gondolták át, abban a kontextusban, ahol először felmerültek. A nyelv globálisan viszont egy átgondolatlan katyvasz, 90%-os feature-ök sorozata, ahol az egyik 90%-os feature az előző 90%-os feature-ből fennmaradó 10%-ot igyekszik javítani.

Ezzel persze nem azt akartam mondani, hogy a Java tökéletes, annak a nyelvnek is megvannak a maga hülyeségei; talán nem annyi, mint a C++-nak. Példaként a C vagy a Go olyan nyelv szerintem, amiben a C++-nál sokkal kevesebb átgondolatlanság van.

3.
A tervezési trade-off-ok létét nem tagadom, mint ahogy azt sem, hogy létezhet olyan szűk alkalmazási területet, ahol a C++ a legjobb választás. Ami viszont roppant zavar, és ami elsődlegesen motivál ezen vitába való bekapcsolódásra, az az olyan üres, bullshit buzzwordök puffogtatása, mint a "determinisztikus erőforrás-kezelés". Feltételezem akik ezt így használják, azok azt akarják kifejezni, hogy milyen jó a C++, a többi nyelv meg milyen már. Ehelyett azt fejezik ki, hogy mennyire nem értik a C++-nál magasabb szintű programozási nyelveket (ez alatt azt értem, ami memory safe, azzal pedig együtt jár a GC is), sőt, félreértik, azaz azt hiszik, hogy értik, miközben egyáltalán nem.

Mert állandóan hangsúlyozni a determinisztikusságot csak akkor van értelme, hogy van olyan, hogy nem-determinisztikus, márpedig a GC-s nyelvekben alkalmazott try-finally vagy try-with-resources (C#: using, Python: with) teljesen determinisztikus. Ezekben a nyelvekben a memória nem tekinthető erőforrásnak, mivel a nyelv absztrakciós szintje magasabb, és a memória nem kezelhető közvetlenül, pontosan úgy, mint ahogyan C-ben el vannak rejtve a regiszterek. Pontosan ezért abszurd a gondolat, hogy program működését kössük a nyelv absztrakciós szintje alatti, run-time által végrehajtott eseményekhez (értsd: finalizerek használata takarításra). Így amikor valaki azt mondja, hogy milyen rossz destruktor a finalizer, mert a GC nem determinisztikus, akkor ebből nekem az jön le, hogy az imént taglaltakkal az illető egyáltalán nincs tisztában, ezért törekszem - kevés sikerrel - az ilyen embereket felvilágosítani a helyzetről.