C-čko a zápis mimo proměnnou

gll

Re:C-čko a zápis mimo proměnnou
« Odpověď #60 kdy: 01. 11. 2017, 15:10:26 »
Rust si hlavně pomáhá tím, že má všechno imutabilní.

To není pravda.

Já taky v programech mám většinu věcí imutabulní právě proto, abych co nejméně řešil data races.

ve vašem příkladu mutable counteru z jiné diskuze jste musel používat zámky. Kdybyste v tom udělal chybu, tak to překladač narozdíl od Rustu přeloží.


Re:C-čko a zápis mimo proměnnou
« Odpověď #61 kdy: 01. 11. 2017, 15:21:59 »
Unsafe je v C++ prakticky všechno např.:
Kód: [Vybrat]
*pointer;
pointer += neco; *pointer;
pole[index];
*iterator;
iterator += neco; *iterator;
if (pointer) *pointer; // pointer neni null, ale objekt uz neexistuje
objekt->metoda();

Krása, ale chtěl jsem C++. Ne C.

Aha, takže v C++ se nepřistupuje do pole nebo se nevolají metody objektu? To už je opravdu velká demagogie. Znovu opakuji, v C++ není safe prakticky nic, protože C++ neřeší životnost objektů.

V C++ nejsou pole! V C++ máte std::vector<>! Že můžete v C++ udělat pole je proto, že C++ sebou taha C. Ale při code review pokud někdo někde vytváří pole, tak kód letí na přepsání, pokud to nemá nějaký závažný výkonostní důvod. To se pozná na první pohled

Jak C++ neřeší životnost objektu? C++ má RAII!!! A opět, pokud míníte pointery, tak zase už nejste v C++. C++ má přece std::shared_ptr nebo std::unique_ptr!

Mám ještě demonstrovat že o C++ nevíte vůbec nic?
[/quote]

Garance v Rustu jsou založené na tom, že může být buď libobolný počet imutabilních objektů, nebo pouze jeden objekt mutabilní.

Vím jak fungují imutabilní objekty. Mám na tomhle principu postavenou celou knihovnu.

https://github.com/ondra-novak/imtjson

. Rust nemá žádný runtime overhead navíc a přitom garantuje, že v programu není data race. Zjistí to už během kompilace.
No jasně, stačí jen ověřit imutabilitu. Najít race v systémech, kde se sdílí stav, třeba taková sdílená mapa s nutností do ní zapisovat, to už taková sranda není. A není to věc jazyka.

Jste naivní a zaslepený svou vírou.

Re:C-čko a zápis mimo proměnnou
« Odpověď #62 kdy: 01. 11. 2017, 15:26:31 »
ve vašem příkladu mutable counteru z jiné diskuze jste musel používat zámky. Kdybyste v tom udělal chybu, tak to překladač narozdíl od Rustu přeloží.

No ono se to jinak implementovat nedá! V žádném jazyce.

(ach ta slepá víra ve své božstvo)

A právě z jiné diskuze se ukázalo, že na jednom místě všichni hlásili chybějící zámek, ale po promyšlení se ukázalo, že tam chybí správně (že je zbytečný). Rust by asi řval (zbytečně)

gll

Re:C-čko a zápis mimo proměnnou
« Odpověď #63 kdy: 01. 11. 2017, 16:36:44 »
ve vašem příkladu mutable counteru z jiné diskuze jste musel používat zámky. Kdybyste v tom udělal chybu, tak to překladač narozdíl od Rustu přeloží.

No ono se to jinak implementovat nedá! V žádném jazyce.

(ach ta slepá víra ve své božstvo)

A právě z jiné diskuze se ukázalo, že na jednom místě všichni hlásili chybějící zámek, ale po promyšlení se ukázalo, že tam chybí správně (že je zbytečný). Rust by asi řval (zbytečně)

Já jsem nepsal, že jste tam měl chybu. Měl jsem na mysli zamykání při inkrementac/dekrementaci.


lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #64 kdy: 01. 11. 2017, 16:42:20 »
V C++ nejsou pole! V C++ máte std::vector<>! Že můžete v C++ udělat pole je proto, že C++ sebou taha C. Ale při code review pokud někdo někde vytváří pole, tak kód letí na přepsání, pokud to nemá nějaký závažný výkonostní důvod. To se pozná na první pohled
vector nic neřeší, všechno je unsafe:
Kód: [Vybrat]
std::vector<int> v(10);
std::cout << *(v.begin() + 11);

Jak C++ neřeší životnost objektu? C++ má RAII!!! A opět, pokud míníte pointery, tak zase už nejste v C++. C++ má přece std::shared_ptr nebo std::unique_ptr!
smart pointery nic neřeší, překladač nemá informaci o životnosti objektu, všechno je unsafe:
Kód: [Vybrat]
auto ptr = std::make_unique<Objekt>();
ptr->metoda();
ptr.reset();
ptr->metoda();

Mám ještě demonstrovat že o C++ nevíte vůbec nic?
Vy už jste dostatečně demonstroval, že nemáte vůbec ponění, co znamená bezpečný kód jak jdou věci dělat lépe než v C++.

Vím jak fungují imutabilní objekty. Mám na tomhle principu postavenou celou knihovnu.

https://github.com/ondra-novak/imtjson
No to je hezké, ale ta knihovna nic negarantuje. Když v ní budete mít chybu nebo ji blbě použiju, tak to v lepším případě segfaulne. V horším se to bude chovat naprosto nedefinovaně.

No jasně, stačí jen ověřit imutabilitu. Najít race v systémech, kde se sdílí stav, třeba taková sdílená mapa s nutností do ní zapisovat, to už taková sranda není. A není to věc jazyka.
Tak znovu. V Rustu nejde data race vyrobit. Chytí to překladač během kompilace. Není co hledat. Data race nejsou.

Jste naivní a zaslepený svou vírou.
Jste beznadějně uzavřený ve světě C++ bez dostatečného rozhledu jinam. Vaše chyba.


lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #65 kdy: 01. 11. 2017, 16:54:44 »
A právě z jiné diskuze se ukázalo, že na jednom místě všichni hlásili chybějící zámek, ale po promyšlení se ukázalo, že tam chybí správně (že je zbytečný). Rust by asi řval (zbytečně)
Ten zámek tam chybí. Je to public metoda, která vytváří data race. Takový prasokód by nepřešel přes code review. Sorry.

jx

Re:C-čko a zápis mimo proměnnou
« Odpověď #66 kdy: 01. 11. 2017, 18:39:18 »
Pani, uplne zbytocne hadky, C treba pouzit na to, na co je urcene, a to na systemove a embedded programovanie.

lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #67 kdy: 01. 11. 2017, 19:04:56 »
Pani, uplne zbytocne hadky, C treba pouzit na to, na co je urcene, a to na systemove a embedded programovanie.
Na což lze stejně dobře použít i Rust s mnoha výhodami ;). V embedded teda Rust ještě moc rozšířený není, protože je příliš nový a svět embedded dost konzervativní, nicméně potenciál má velký, v embedded se bezpečnost řeší hodně.

n

Re:C-čko a zápis mimo proměnnou
« Odpověď #68 kdy: 01. 11. 2017, 20:29:02 »
Lámání chleba je co? Nějaká hardcore optimalizace něčeho? To se dělá obvykle v assembleru, nebo pokud bych fakt chtěl, tak je v Rustu unsafe, ale nikdy jsem ale neměl potřebu unsafe přímo použít. C++ je oproti tomu unsafe by default, nelze si vybrat, že teď to chci safe. C++ safe režim jaksi neumí...
Safe rezim jako co? staci pouzivat shared/unique pointry a pamet mate osefovanou. RAII a mate osefovane i jine resourcy. Dokonce vite kdy presne se co bude uvolnovat, narozdil od GC-backed jazyku, coz je hlavne extremni problem u javy a opravdu velkych projektu - stravite 10x vice casu na ladeni GC a "world stop", nez ladeni celeho c++.
Chtel bych videt, jak budete rucne v asembleru optimalizovat psat ty vektorizovane zpracovani dat.  google -> compiler explorer -> vybrat -O2/-O3 u kompilatoru a uvidice, co vam dneska zvladnou kompilatory zoptimalizovat.


n

Re:C-čko a zápis mimo proměnnou
« Odpověď #69 kdy: 01. 11. 2017, 20:31:27 »

Aha, takže v C++ se nepřistupuje do pole nebo se nevolají metody objektu? To už je opravdu velká demagogie. Znovu opakuji, v C++ není safe prakticky nic, protože C++ neřeší životnost objektů.


C++ naopak zivotnost objetku resi a zivotnost objektu je take narozdil od Javy a jinych GC-backed jazyku presne definovana.

Kiwi

Re:C-čko a zápis mimo proměnnou
« Odpověď #70 kdy: 01. 11. 2017, 21:01:08 »
To je ale přesně co říkám. Na motorce se oproti autu taky snadno vysekáš, stačí štěrk v zatáčce nebo prudce puštěná spojka a už letíš. To se ti v autu (nebo pokud máš pomocná kolečka) nestane. Ne že by se nešlo v autě vybourat. Jde to, ale je třeba vyvinout trochu víc úsilí než jen zprudka pustit spojku. To ale není důvod snažit se zavrhnout motorku nebo ji znásilňovat pomocnými kolečky. Tak jako se mi už dávno nestává, že bych měl na motorce ty výše zmíněné problémy, tak ani v C se mi nestane, co se stává vám s pamětí. Už po těch letech máte vyvinutý určitý podvědomý cvik, jak s takovými objekty zacházet, člověk už ví, že dělá něco potenciálně nebezpečného a podle toho k tomu přistupuje. Ale to je otázka cviku, letité praxe. To se prostě musí zažít. Stejně jako na té motorce. Pokud vám to nejde, není to chyba motorky ani C. Prostě nemáte praxi nebo vám k tomu chybějí vlohy. Můžete furt dobře řídit to auto, ale jsou prostě chvíle, kdy ta motorka je efektivnější a když ji nezvládáte, musíte vzít za vděk méně efektivním řešením.

No já mám v C nacouváno možná víc, než co máš ty odježděno dopředu :). Jenomže narozdíl od tebe znám i Rust. Oproti C nabízí mnohem vyšší míru abstrakce a bezpečnosti při srovnatelném výkonu. Nemá smysl začínat nový projekt v C, když místo C můžeš použít Rust.

Jakmile někdo začně stylem "já nemám v C problém, jenom patlalům se stávají segfaulty", tak je mi jasné, že nemá žádnou zkušenost s větším projektem v C/C++. Chybám při práci s pamětí nejde v C zabránit, už jenom kvůli tomu, že na projektu pracuje více lidí a stačí, aby se nedomluvili nebo nepochopili. Děje se to bohužel úplně běžně v každém projektu jenom trochu složitějším než Hello World.
Chyby dělá každý. Liší se v tom, jaké chyby kdo dělá. Ale chyby, na něž tu narážíte vy, jsem v C dělal někdy tak před 25 lety, když jsem s C začínal. Dnes dělám úplně jiný typ chyb. Použiju tedy jiný příměr - je to podobné, jako byste mi vyzdvihovali nějaký textový editor, který za mě opravuje pravopisné chyby. To je nejspíš užitečná vlastnost pro ty, kdo dělají pravopisné chyby. A protože je to velmi častý jev, tak spousta lidí nejspíš usoudí, že s pravopisem má problém každý. Ale tak tomu není. S pravopisem dávno problémy nemám, spíše udělám nějakou chybu ve větné vazbě nebo v nějaké nešikovnosti typu nadměrného užití nějakého slova v krátkém rozsahu textu. Ale od toho mi žádný editor s opravou pravopisu nepomůže.

Mimochodem, PC mě nijak zvlášť nezajímá, zabývám se většinu života embedded oblastí, zejména systémařinou a low-level vývojem. Nechci žádnou vyšší míru abstrakce! Ta, co nabízí C, je pro dané věci přesně akorát. Srovnatelné by byly snad jedině PL/M či Oberon, popř. Forth. Tak nevím, proč mi cpeš Rust nebo dokonce Go. K čemu? Když náhodou potřebuji vyšší míru abstrakce na PC, sáhnu např. po Pythonu. Jazyky typu Rust řadím do kategorie ani ryba, ani rak. Pro low-level příliš náročné, pro high-level nedostatečné.

lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #71 kdy: 01. 11. 2017, 21:17:42 »
Safe rezim jako co? staci pouzivat shared/unique pointry a pamet mate osefovanou.
Ne to opravdu nestačí. Jeden příklad už jsem dával, tak přidám i další pro ty, kteří to stále nepochopili. Tento kód nefunguje a je úplně bez pointerů:
Kód: [Vybrat]
std::vector<int> v(1);
auto& a = v.front();
v.push_back(0);
std::cout << a;

lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #72 kdy: 01. 11. 2017, 21:23:13 »
C++ naopak zivotnost objetku resi a zivotnost objektu je take narozdil od Javy a jinych GC-backed jazyku presne definovana.
Překladač C++ neví nic o tom, jestli pointer ukazuje na validní objekt, nebo ne. Kdyby věděl, tak by takovou prasárnu nepřeložil:
Kód: [Vybrat]
auto ptr = std::make_unique<Objekt>();
ptr.reset();
ptr->foo();

lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #73 kdy: 01. 11. 2017, 21:31:42 »
Chyby dělá každý. Liší se v tom, jaké chyby kdo dělá. Ale chyby, na něž tu narážíte vy, jsem v C dělal někdy tak před 25 lety, když jsem s C začínal.
V pořádku, beru na vědomí, že jsi superman a chyby při práci s pamětí v C už vůbec neděláš. Může být. Ale na projektu nepracují jen samí supermani, pracuje na něm dalších 50 lidí. A ti bohužel chyby dělají. Proto potřebují něco, co za ně bude chyby hlídat.

Mimochodem, PC mě nijak zvlášť nezajímá, zabývám se většinu života embedded oblastí, zejména systémařinou a low-level vývojem. Nechci žádnou vyšší míru abstrakce! Ta, co nabízí C, je pro dané věci přesně akorát. Srovnatelné by byly snad jedině PL/M či Oberon, popř. Forth. Tak nevím, proč mi cpeš Rust nebo dokonce Go. K čemu? Když náhodou potřebuji vyšší míru abstrakce na PC, sáhnu např. po Pythonu. Jazyky typu Rust řadím do kategorie ani ryba, ani rak. Pro low-level příliš náročné, pro high-level nedostatečné.
Tak tady se obrovsky mýlíš, Rust je na embedded mnohem lepší než C. Malá ochutnávka: http://blog.japaric.io/quickstart/
Podívej se na ten výsledný assembler, z bezpečného high level kódu v Rustu se vygeneruje prakticky optimální kód bez žádných režií navíc.

Kiwi

Re:C-čko a zápis mimo proměnnou
« Odpověď #74 kdy: 02. 11. 2017, 10:09:54 »
Tak tady se obrovsky mýlíš, Rust je na embedded mnohem lepší než C. Malá ochutnávka: http://blog.japaric.io/quickstart/
Podívej se na ten výsledný assembler, z bezpečného high level kódu v Rustu se vygeneruje prakticky optimální kód bez žádných režií navíc.
Dík za odkaz, mrknu se na to. Na první pohled to vypadá slibně.