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

lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #45 kdy: 01. 11. 2017, 12:14:45 »
Nahore jsem navrhoval GO. GO bude mit occa 30% slabsi singlecore vykon nez hole C.

Bohužel je to víc než 30%, Go bude průměrně tak 3x pomalejší než čisté C (záleží samozřejmě na typu úlohy). Nějaké srovnání zde: http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=go&lang2=gcc

Když srovnáš Go s Rustem, tak je výtěz myslím celkem jasný: https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=rust&lang2=go

Rust navíc garantuje, že v programu nebude žádný data race, tohle v Go garantované nemáš a data races si musíš hlídat sám.

Nicméně nechci aby to vyznělo tak, že je Go špatné, není. Go je výborná volba hlavně na microservices a podobné úlohy, gorutiny jsou fakt dobré. Ale když někdo řeší, kam od C utéct, tak je první volba Rust, protože je C mnohem blíže a nabízí vyšší výkon než Go.


Re:C-čko a zápis mimo proměnnou
« Odpověď #46 kdy: 01. 11. 2017, 12:29:37 »
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.

V C++ se ten problém redukuje už kvůli tomu, že tam se dá projekt rozdělit na objekty, které se z principu každý stará o svůj svět. Pokud je každý objekt odladěn a otestován, problémy známe z C se v C++ prostě projevit nemohou.

Jo a samozřejmě, lidi nechtěji používat C++ protože ho neumí. A neumí ho proto, že se C++ u nás, ale i kdekoliv na světe blbe vyučuje

https://www.youtube.com/watch?v=YnWhqhNdYyk

lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #47 kdy: 01. 11. 2017, 12:43:01 »
V C++ se ten problém redukuje už kvůli tomu, že tam se dá projekt rozdělit na objekty, které se z principu každý stará o svůj svět. Pokud je každý objekt odladěn a otestován, problémy známe z C se v C++ prostě projevit nemohou.

Ale mohou se objevit a objevují se. C++ nabízí vyšší míru abstrakce a odstiňuje od low level správy paměti, ale negarantuje navíc vůbec nic. V C++ se dá střelit do nohy stejně snadno jako v C (dokonce k tomu je více příležitostí). C++ nehlídá žádné chyby přístupu do paměti, všechno musí programátor pohlídat ručně. No a lidi dělají chyby. Pokud něco lze zkontrolovat strojově, je to lepší nechat zkontrolovat stojově. Překladač Rustu chybu neudělá, neunaví se, protože dělá na projektu, který je ve skluzu už 10 hodin v kuse a všichni se ho ptají, jakto že to ještě nemá hotové.

Youda

Re:C-čko a zápis mimo proměnnou
« Odpověď #48 kdy: 01. 11. 2017, 12:46:59 »
Nahore jsem navrhoval GO. GO bude mit occa 30% slabsi singlecore vykon nez hole C.

Bohužel je to víc než 30%, Go bude průměrně tak 3x pomalejší než čisté C (záleží samozřejmě na typu úlohy). Nějaké srovnání zde: http://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=go&lang2=gcc

Když srovnáš Go s Rustem, tak je výtěz myslím celkem jasný: https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=rust&lang2=go

Rust navíc garantuje, že v programu nebude žádný data race, tohle v Go garantované nemáš a data races si musíš hlídat sám.

Nicméně nechci aby to vyznělo tak, že je Go špatné, není. Go je výborná volba hlavně na microservices a podobné úlohy, gorutiny jsou fakt dobré. Ale když někdo řeší, kam od C utéct, tak je první volba Rust, protože je C mnohem blíže a nabízí vyšší výkon než Go.

Go jsem zminoval hlavne proto, ze bezny program obsahuje bajvoko 90% business kodu, kde na rychlosti nesejde a cca 10% horkeho kodu, ktery ma smysl optimalizovat. A na tythle kousky jde v GO bezproblemove embeddovat C.
GO ma i prvky z vyssich jazyku, je to takova Java pro chude, pak mas k dispozici vic moznosti. Rust je jenom nahrada C.

Re:C-čko a zápis mimo proměnnou
« Odpověď #49 kdy: 01. 11. 2017, 12:50:41 »
Ale mohou se objevit a objevují se. C++ nabízí vyšší míru abstrakce a odstiňuje od low level správy paměti, ale negarantuje navíc vůbec nic. V C++ se dá střelit do nohy stejně snadno jako v C (dokonce k tomu je více příležitostí). C++ nehlídá žádné chyby přístupu do paměti, všechno musí programátor pohlídat ručně. No a lidi dělají chyby. Pokud něco lze zkontrolovat strojově, je to lepší nechat zkontrolovat stojově. Překladač Rustu chybu neudělá, neunaví se, protože dělá na projektu, který je ve skluzu už 10 hodin v kuse a všichni se ho ptají, jakto že to ještě nemá hotové.

No protože to nejsou C++ programátoři. Protože současná generace programátorů umí z C základy a používá k tomu C++ syntaxi a nazývají se C++ programátoři. Spoléhat se, že nějaký stroj udělá code review nejde. Vždycky to bude něco za něco. Jazyky s GC za programátora řeší správu paměti, jejich nevýhodou je, že správu paměti už nemůže dělat programátor a navíc ta správa paměti není 100%. Totéž v Rustu. Něco za Vás Rust hlída, ale zároveň omezuje. A když dojde na lámání chleba, začnu Rust obcházet a vymýšlet prasárny.


lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #50 kdy: 01. 11. 2017, 12:53:18 »
Go jsem zminoval hlavne proto, ze bezny program obsahuje bajvoko 90% business kodu, kde na rychlosti nesejde a cca 10% horkeho kodu, ktery ma smysl optimalizovat. A na tythle kousky jde v GO bezproblemove embeddovat C.
GO ma i prvky z vyssich jazyku, je to takova Java pro chude, pak mas k dispozici vic moznosti. Rust je jenom nahrada C.

Rust fakt není náhrada C, Rust nabízí vyšší míru abstrakce než C i Go. Chceš generika? V Rustu není problém, v Go si o tom můžeš nechat akorát tak zdát...

lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #51 kdy: 01. 11. 2017, 12:57:24 »
No protože to nejsou C++ programátoři. Protože současná generace programátorů umí z C základy a používá k tomu C++ syntaxi a nazývají se C++ programátoři. Spoléhat se, že nějaký stroj udělá code review nejde. Vždycky to bude něco za něco. Jazyky s GC za programátora řeší správu paměti, jejich nevýhodou je, že správu paměti už nemůže dělat programátor a navíc ta správa paměti není 100%. Totéž v Rustu. Něco za Vás Rust hlída, ale zároveň omezuje. A když dojde na lámání chleba, začnu Rust obcházet a vymýšlet prasárny.

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í...

Jose

Re:C-čko a zápis mimo proměnnou
« Odpověď #52 kdy: 01. 11. 2017, 13:04:40 »
Střelné zbraně, zápalky a překladač C nepatří do rukou amatérů  8)

Daniel Kozak

Re:C-čko a zápis mimo proměnnou
« Odpověď #53 kdy: 01. 11. 2017, 13:19:36 »
Ale mohou se objevit a objevují se. C++ nabízí vyšší míru abstrakce a odstiňuje od low level správy paměti, ale negarantuje navíc vůbec nic. V C++ se dá střelit do nohy stejně snadno jako v C (dokonce k tomu je více příležitostí). C++ nehlídá žádné chyby přístupu do paměti, všechno musí programátor pohlídat ručně. No a lidi dělají chyby. Pokud něco lze zkontrolovat strojově, je to lepší nechat zkontrolovat stojově. Překladač Rustu chybu neudělá, neunaví se, protože dělá na projektu, který je ve skluzu už 10 hodin v kuse a všichni se ho ptají, jakto že to ještě nemá hotové.

No protože to nejsou C++ programátoři. Protože současná generace programátorů umí z C základy a používá k tomu C++ syntaxi a nazývají se C++ programátoři.

A to je prave ono. Jelikoz sehnat  (a zaplatit) kvalitni C++ programatori, kteri si vse ohlidaji, nedava dnes casto smysl. A je mnohem lepsi to nechat to na prekladaci a programatory at se venuji tomu za co jsou placeni :P.

Re:C-čko a zápis mimo proměnnou
« Odpověď #54 kdy: 01. 11. 2017, 14:00:32 »

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í...

Která konkrétní část C++ je unsafe? To že můžete použít věci z C? Že to nemusím uvozovat nějakým klíčovým slovem? Je to problém? Analyzátory C++ kódu existují a umí docela dobře upozornit na unsafe techniky v C++ kódu. To že si něco vynucuje syntaxe je jen syntax sugar.

Co se runtime týče, jakákoliv bezpečí hlídající technika jde proti výkonu. V tomto místě chci mít svobodu, jestli zajištění bezpečnosti nebo výkon.

lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #55 kdy: 01. 11. 2017, 14:13:16 »
Která konkrétní část C++ je unsafe? To že můžete použít věci z C? Že to nemusím uvozovat nějakým klíčovým slovem? Je to problém? Analyzátory C++ kódu existují a umí docela dobře upozornit na unsafe techniky v C++ kódu. To že si něco vynucuje syntaxe je jen syntax sugar.

Co se runtime týče, jakákoliv bezpečí hlídající technika jde proti výkonu. V tomto místě chci mít svobodu, jestli zajištění bezpečnosti nebo výkon.

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();

Rust v runtime navíc oproti C hlídá jen velikost pole při náhodném přístupu přes index. To musí dělat, toho se nejde zbavit. Při sekvenčním přistupu není třeba index hlídat, stačí porovnat s mezí pole, tam není žádná výkonová penalizace.

Výkonově je Rust a C++ prakticky nastejno: https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=rust&lang2=gpp

Rust navíc dává garanci, že v programu není žádný data race, tohle v C++ zaručit nelze.

Kit

Re:C-čko a zápis mimo proměnnou
« Odpověď #56 kdy: 01. 11. 2017, 14:16:24 »
Co se runtime týče, jakákoliv bezpečí hlídající technika jde proti výkonu. V tomto místě chci mít svobodu, jestli zajištění bezpečnosti nebo výkon.

Tyto techniky hlídající bezpečí by měly být defaultně zapnuté. Kdo chce výkon, může si je po odladění vypnout.

gll

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

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í...

Která konkrétní část C++ je unsafe? To že můžete použít věci z C? Že to nemusím uvozovat nějakým klíčovým slovem? Je to problém? Analyzátory C++ kódu existují a umí docela dobře upozornit na unsafe techniky v C++ kódu. To že si něco vynucuje syntaxe je jen syntax sugar.

Co se runtime týče, jakákoliv bezpečí hlídající technika jde proti výkonu. V tomto místě chci mít svobodu, jestli zajištění bezpečnosti nebo výkon.

to už vám bylo vyvráceno v této diskuzi

https://www.root.cz/clanky/ukazatele-v-rustu-aneb-temna-strana-sily/nazory/

Re:C-čko a zápis mimo proměnnou
« Odpověď #58 kdy: 01. 11. 2017, 14:49:14 »
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.

Rust navíc dává garanci, že v programu není žádný data race, tohle v C++ zaručit nelze.

Rust si hlavně pomáhá tím, že má všechno imutabilní. Já taky v programech mám většinu věcí imutabulní právě proto, abych co nejméně řešil data races. C++ vám nebrání mít imutabilní objekty. To není vlastnost jazyka. A pokud v runtime automaticky zamyká přístup k neimutabilním objektům, ... tak pak je to o tom výkonu ... rozhodně to nebude žádný modrý přízrak.


lopata

Re:C-čko a zápis mimo proměnnou
« Odpověď #59 kdy: 01. 11. 2017, 15:07:51 »
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ů.

Rust si hlavně pomáhá tím, že má všechno imutabilní. Já taky v programech mám většinu věcí imutabulní právě proto, abych co nejméně řešil data races. C++ vám nebrání mít imutabilní objekty. To není vlastnost jazyka. A pokud v runtime automaticky zamyká přístup k neimutabilním objektům, ... tak pak je to o tom výkonu ... rozhodně to nebude žádný modrý přízrak.

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 runtime Rust nic nezamyká, řeší se to během kompilace. Prosím nepište nesmysly, když o tom nic nevíte. Jediný runtime overhead navíc v Rustu je při kontrole mezí polí při náhodném přístupu. Proto je taky rychlost Rustu a C++ srovnatelná. Rust nemá žádný runtime overhead navíc a přitom garantuje, že v programu není data race. Zjistí to už během kompilace.