Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - linuxak

Stran: 1 ... 3 4 [5]
61
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 19:01:52 »
Ano, Java opravdu porovnává podle kontextu. Když dostane hodnoty, porovnává hodnoty. Když dostane reference, porovnává reference. Stejně jako C, které když dostane hodnoty, porovnává hodnoty, když dostane pointery, porovnává pointery, a když dostane hodnotu a pointer, klidně je také porovná. Když Java dostane hodnotu a referenci, kompilátor zařve. Pravda, poslední věc se změnila s i implementaci autoboxingu/unboxingu, kdy kompilátor nejprve zkusí provést autoboxing/unboxing a zařve teprve, když to není možné.

Takže je chyba v autoboxingu/unboxingu? Než se zavedl, byly diskuse plné komentářů o tom, jak je Java zastaralá a ukecaná a jako příklad se často objevovalo právě převádění mezi „malými“ a „velkými“ typy. Takže se zavedl autoboxing a autounboxing. Jak byste to řešili vy? Zakázali boxing u operátoru ==? Rozbili zpětnou kompatibilitu a zakázali úplně operátor == pro reference? Nebo jinak?
Je potřeba dívat se na to v historickém kontextu. Java vypadá tak, jak vypadá, kvůli rozhodnutím z minulosti (primitivní typy, boxing/unboxing...) a držení zpětné kompatibility. To není kritika, byl to prostě historický výjoj. Kdyby se dělala Java znovu od nuly, určitě by vypadala jinak než teď. Stejně jako by vypadalo jinak i C, kdyby se dělalo znovu od nuly. Ale obojí je nereálné, Java i C jsou etablované jazyky a nová Java ani nové C nebude, existující kód nikdo přepisovat nechce.

Jenomže ten historický vývoj nutně vedl ke kompromisům v designu jazyka, Java (stejně jako C(++)) si s sebou táhne spoustu špatných věcí z minulosti. A tahkle je to taky potřeba vnímat, operátor == je v Javě neintuitivní a špatně použitelný, snadno vznikne chyba. Takže je potřeba každému nováčkovi říct "Hele, dávej si pozor na operátor ==, protože nefunguje tak, jak bys čekal, dělají se v tom často chyby. Někdy to porovnává hodnoty, jindy reference, záleží na kontextu, pravidla jsou složitá. Radši to vůbec nepoužívej, když nebudeš muset". No a to je všechno, není potřeba to nějak víc řešit.

62
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 18:21:33 »
V tom příkladu bylo uvedeno, že dlouhý kód může způsobit, že programátor použije chybný operátor a kompilátor mu v tom nezabrání.
Já souhlasím, že je to problém. C++ umožnuje porovnávat float a double a přiřazovat do nich integery. Je to špatný design, C++ je zastaralé. Java je v tom špatném designu ještě dál než C++ a operátor ==  v Javě někdy porovnává hodnoty a jindy reference podle kontextu. Je to prostě blbě. Jak by to mělo vypadat správně?
Kód: [Vybrat]
    let a : f32  = 2147483647;
    let b : f64 = 2147483647;
    println!("{}", a == b);
Rust mi řekně hned 3x, že dělám 3 prasárny a opravdu to není dobrý nápad:
Kód: [Vybrat]
error[E0308]: mismatched types
 --> src/main.rs:2:20
  |
2 |     let a : f32  = 2147483647;
  |                    ^^^^^^^^^^ expected f32, found integral variable
  |
  = note: expected type `f32`
             found type `{integer}`

error[E0308]: mismatched types
 --> src/main.rs:3:19
  |
3 |     let b : f64 = 2147483647;
  |                   ^^^^^^^^^^ expected f64, found integral variable
  |
  = note: expected type `f64`
             found type `{integer}`

error[E0308]: mismatched types
 --> src/main.rs:4:25
  |
4 |     println!("{}", a == b);
  |                         ^ expected f32, found f64

63
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 17:57:38 »
Tu chybu s dlouhým kódem v C++ nelze vyrobit.

Kód: [Vybrat]
float a = 2147483647;
double b = 2147483647;

// dlouhý kód
std::cout << (a == b);
Což ale dělá úplně něco jiného než porovnání referencí. To je typový problém. Hrušky a jabka.

64
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 17:45:37 »
Už tomu rozumím. Stačí prohlásit, že Java porovnává hodnoty referencí, a vše je v naprostém pořádku.

Můžete kličkovat jak chcete, ale z toho, že v C a C++ se u pointerů porovnávají přímo ty adresy, se nevykroutíte. A Javovské reference jsou jenom bezpečně udělané pointery, nic jiného.
Mě nějaké demagogické slovíčkaření nebere. V C++ funguje porovnání referencí naprosto intuitivně, porovnává to objekty:
Kód: [Vybrat]
    const int& a = 1024;
    const int& b = 1024;

    std::cout << (a == b); // true
Tu chybu s dlouhým kódem v C++ nelze vyrobit. Ale nechci řešit C++, je to zastaralý jazyk, ale i tak má operátor porovnání vyřešený kosmicky lépe než Java. Co třeba Rust, k tomu ses nevyjádřil? Ve srovnání s Rustem je teprve vidět, jak je design operátoru porovnání v Javě zastaralý, vedoucí k chybám v kódu a celkově neobhajitelný. Ale chápu, že lidé, kteří pořádně neumí nic jiného než Javu, to tak vnímat nemusí.

65
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 17:02:19 »
I to zastaralé C++, které má k dokonalosti hodně daleko, to má udělané líp než Java. Reference porovnávají hodnoty, pointery taky porovnávají hodnoty pointerů. Takový zmatečný kód, jako v Javě:
Kód: [Vybrat]
Integer a;
Integer b;

.... hodně kódu...

a = 1024;
b = 1024;
if(a == b){
    ...
}
nejde v C++ vyrobit, přiřazení konstanty do pointeru skončí chybou při kompilaci.

Ono to nejde vyrobit ani v té Javě.
Cože? https://onlinegdb.com/rJiGixihN

66
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 15:44:05 »
Nebo mi ukažte jazyk, který (alespoň ve výchozím nastavení, tj. bez přetěžování operátorů) porovnává vše podle hodnoty.
Rust. Reference porovnávat nelze, vždy se porovnávájí hodnoty. Pokud chci porovnat reference, musím je explicitně přetypovat na raw pointer.

Nikoli, programátoři z toho zmatení nejsou a chyby v tom nedělají. Programováním se živím už spoustu let, a že se někdo pokusil v Javě porovnat Stringy pomocí == jsem viděl jednou, v kódu, který ještě ani nebyl commitnutý.
Tak to jsi toho asi ještě viděl málo. Namátkou: https://github.com/swagger-api/swagger-codegen/commit/0d14496bd6fbdbd763844f239b34e198459fe4d9

Že neprogramátorům vadí chování operátoru == je mi celkem jedno, moc nechápu, proč to řeší. Že to kritizují jenom u Javy, i když úplně stejně to má C, C++, JavaScript, Python a mnoho dalších jazyků (přičemž jen některé umožňují operátor přetížit), to jenom ilustruje úroveň znalostí.
I to zastaralé C++, které má k dokonalosti hodně daleko, to má udělané líp než Java. Reference porovnávají hodnoty, pointery taky porovnávají hodnoty pointerů. Takový zmatečný kód, jako v Javě:
Kód: [Vybrat]
Integer a;
Integer b;

.... hodně kódu...

a = 1024;
b = 1024;
if(a == b){
    ...
}
nejde v C++ vyrobit, přiřazení konstanty do pointeru skončí chybou při kompilaci.

67
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 12:22:49 »
V této diskusi ovšem máme jiný problém – někomu něco vyhovuje, a myslí si, že to tedy musí být jediné správně řešení a vše ostatní je špatně. Všimněte si na rozdíl v našich argumentech. Vy argumentujete „je to špatně, protože já mám radši něco jiného“. Já argumentuju „tenhle přístup má tyhle výhody a tyhle nevýhody, výhodné je to pro tyhle případy; opačný přístup má tyhle výhody a tyhle nevýhody, výhodné je to pro tyhle případy“. Podle mne ten, kdo zabedněně lpí jenom na svém přístupu a považuje ho za jediný správný, jste tu vy.

Takdy ale vůbec nejde o to, co preferuje Filip Jirsák nebo někdo jiný. Důležité je, co očekává běžný Franta programátor od operátoru ==. Bežný Franta programátor očekává, že to bude porovnávat hodnoty a ne reference a už vůbec neočekává, že se to bude chovat pokaždé jinak podle kontextu. Proto je design operátoru == v Javě špatný, jednou to porovnává hodnoty, podruhé reference a běžný Franta programátor je z toho zmatený. Je úplně jedno, že Filipu Jirsákovi je křišťálově jasné, co to kdy dělá. Běžný Franta programátor v tom má hokej a dělá kvůli tomu zbytečné chyby.

V oborech, kde se pracuje s vážně s bezpečností, existuje pojem lidský činitel. Člověk je totiž ten nejslabší článek řetězu, který způsobuje nejvíce chyb. Když chceme chyby minimalizovat, musíme přizpůsobit design okolních systémů tak, aby s nimi člověk dokázal co nejlépe a nejintuitivněji pracovat. Chování operátoru == v Javě je podobné, jako kdyby někdo vyrobil letadlo, kde bude výškoměr v první polovině stupnice cejchovaný v metrech a v druhé polovině ve stopách. Samozřejmě by s tím šlo létat (a jsem si jistý, že Filip Jirsák bych to bravurně zvládal), ale u normálních pilotů by to způsobovalo zmatek a zbytečné chyby.

Tady docela hezké počtení k zamyšlení, proč by se měl design systému (programovacího jazyka) přizpůsobit člověku a ne opačně: http://projekt150.ha-vel.cz/node/117

68
Vývoj / Re:Ideálny programovací jazyk
« kdy: 11. 05. 2019, 23:05:40 »
Optimalizované počítání referencí bývá efektivnější, jednak se nic nepočítá, když čítač nepřekročí 1 (objekty s krátkou životností, obdoba nejnižší generace v tracing GC), a za druhé statická analýza odhalí případy, kdy není nutné čítač upravovat, i když by to dávalo smysl, například při návratu z funkce, kde se typicky dělá retain a následný (auto)release hned po sobě, což překladač odhalí a vyhodí. Kupříkladu Swift takto funguje a je to efektivnější než tracing GC. C++ má úplně jiný přístup s move sémantikou, ale to už tu psali jiní.

Velkou režii má shared_ptr v C++ kvůli thread-safe control bloku, to vyžaduje synchronizaci mezi jádry při každé změně čítače. Přitom je to úplně zbytečné dělat, pokud instanci shared_ptr používá jen jeden thread. Thread-unsafe shared_ptr s nižší režií ve standardní knihovně C++ není. Myslím, že je to škoda a měla by být možnost volby, třeba Rust má obě varianty, Rc a Arc.

Stran: 1 ... 3 4 [5]