Ideálny programovací jazyk

Kit

  • *****
  • 853
    • Zobrazit profil
    • E-mail
Re:Ideálny programovací jazyk
« Odpověď #315 kdy: 16. 05. 2019, 17:20:26 »
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

Prošlo to testem? Neprošlo. Takže to nejde.


Re:Ideálny programovací jazyk
« Odpověď #316 kdy: 16. 05. 2019, 17:20:57 »
Představil jsem si to a.. kde je problém? Ono se to bude chovat jinak při hodnotách "dostatečně malých" a "dostatečně velkých"?
Co je to zase za demagogii? Nikdy tady nebyla řeč o něčem, co by se chovalo jinak při malých hodnotách a jinak při velkých. Celou dobu je řeč jenom o tom, že někdo udělal začátečnickou chybu při použití operátoru ==. Někdo tu uváděl příklad s dlouhým kódem, programátor uvidí jen přiřazení a podle toho si odvodí (chybný) typ proměnných a následně použije chybný operátor. Jenom jsem uvedl příklad, kdy úplně tu stejnou chybu udělá programátor v C++.

Re:Ideálny programovací jazyk
« Odpověď #317 kdy: 16. 05. 2019, 17:24:55 »
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

Prošlo to testem? Neprošlo. Takže to nejde.
Ehm... On tím, že to nejde vyrobit, myslel že se ten kód ani nezkompiluje.

Re:Ideálny programovací jazyk
« Odpověď #318 kdy: 16. 05. 2019, 17:25:47 »
Pekna. A mate rad i tu o Budulinkovi?



Šest údajných „chyb“, z toho dvě jsou opravdu chyby, další je, že jsou programátoři z něčeho zmatení, a zbývající polovina jsou věci, které nejdou ani přeložit. Ještě tam chybí překlepy v názvech klíčových slov. Tohle je pohádka.

Re:Ideálny programovací jazyk
« Odpověď #319 kdy: 16. 05. 2019, 17:37:31 »
další je, že jsou programátoři z něčeho zmatení
Coz je presne to, o cem se tady celou dobu bavime.


Re:Ideálny programovací jazyk
« Odpověď #320 kdy: 16. 05. 2019, 17:40:31 »
Šest údajných „chyb“, z toho dvě jsou opravdu chyby, další je, že jsou programátoři z něčeho zmatení, a zbývající polovina jsou věci, které nejdou ani přeložit. Ještě tam chybí překlepy v názvech klíčových slov. Tohle je pohádka.
Pohádka? Spíš absurdní komedie říznutá špatným tripem. Furt se tu opakuje, že je to častá chyba, protože je to pro programátory matoucí. A vy teď napíšete že to není opravdová chyba, že jsou jenom programátoři zmatení. Kde seženu ten matroš? ::)

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Ideálny programovací jazyk
« Odpověď #321 kdy: 16. 05. 2019, 17:41:01 »
další je, že jsou programátoři z něčeho zmatení
Coz je presne to, o cem se tady celou dobu bavime.
Jediný zmatený tady je, kolega Jirsák odpustí, kolega Jirsák.

Re:Ideálny programovací jazyk
« Odpověď #322 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í.

Re:Ideálny programovací jazyk
« Odpověď #323 kdy: 16. 05. 2019, 17:46:46 »
Ne, tohle neni nemusi byt zadna hruba chyba a doufam, ze tyhle nesmysly nevykladate juniorum. Je presne definovano, kdy se to rovnat musi a je to i zduvodnene. Naopak idealne by se chtelo, aby se to rovnalo, ale z performance duvodu to neni vyzadovane v celem oboru platnosti danych typu. Rikate to presne opacne nez to je.
Je to hrubá chyba. V Javě je opravdu přesně definováno, kdy operátor == při porovnání objektů vrací true – tehdy a jen tehdy, když se jedná o tytéž objekty (tj. stejné místo v paměti), nebo když jsou obě reference null.

String ani Integer nikdy nebyly v Javě definovány jako singletony, v žádném oboru hodnot. To, že mají vedle klasického konstruktoru také statické metody, které dělají jistou optimalizaci při vytváření instancí, na to nemá vliv.

To, co jste citoval, je popis toho, že pro určité hodnoty, u kterých se očekává časté použití, je udělaná optimalizace, aby se nevytvářely stále nové instance. Je to tedy čistě z výkonnostních důvodů, a ve specifikaci je to proto, aby bylo možné se na to spolehnout a někdo si neimplementoval vlastní pool instancí. V tom popisu ale není nic o tom, že se ty hodnoty mají porovnávat operátorem ==. Je tam jenom přesná specifikace, že v takových případech budou instance identické tehdy a jen tedy, pokud jsou identické i hodnoty. Vám to jistě připadá samozřejmé, ale specifikace má být přesná a popisovat i to, co se zdá samozřejmé.

Re:Ideálny programovací jazyk
« Odpověď #324 kdy: 16. 05. 2019, 17:52:09 »
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);

Re:Ideálny programovací jazyk
« Odpověď #325 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.

Re:Ideálny programovací jazyk
« Odpověď #326 kdy: 16. 05. 2019, 18:04:01 »
Pohádka? Spíš absurdní komedie říznutá špatným tripem. Furt se tu opakuje, že je to častá chyba, protože je to pro programátory matoucí. A vy teď napíšete že to není opravdová chyba, že jsou jenom programátoři zmatení. Kde seženu ten matroš? ::)
Aby to bylo pro čtenáře jednodušší, vzal jsem ty body v tom pořadí, jak jsou na obrázku. 1. bod – skutečná chyba. 2. bod – programátoři jsou z něčeho zmatení. 3. bod – skutečná chyba a  zároveň věc, kterou tu řešíme. Nic o zmatení u třetího bodu, který tu řešíme, jsem nepsal. Zpochybnil jsem ten seznam „nejčastějších chyb“ – když půlka věcí je něco, co ani nejde zkompilovat, těžko to vzniklo analýzou existujícího kódu. Takže to není žádný seznam získaný měřením, je to jen něčí dojem.

Re:Ideálny programovací jazyk
« Odpověď #327 kdy: 16. 05. 2019, 18:06:17 »
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.
A hlavně tady ta chyba není vůbec v tom porovnání. Hodnota toho čísla se změní už při tom přiřazení. Zásadní rozdíl vidím hlavně v tom, že pokud si bude začátečník krokovat tenhle kód v debuggeru, nebo si ty proměnné vypíše, tak ho to trkne.

Re:Ideálny programovací jazyk
« Odpověď #328 kdy: 16. 05. 2019, 18:13:15 »
Což ale dělá úplně něco jiného než porovnání referencí. To je typový problém. Hrušky a jabka.
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í. Tohle je přesně ten případ. Proč je použití toho operátoru chybné je jedno. Navíc oba dva případy jsou o tom, že programátor si myslel, že porovnává jeden typ (int), ale ve skutečnosti porovnával jiný typ. To je podstat toho příkladu. Jestli místo intu porovnává reference, float nebo double je úplně jedno, protože ve všech třech případech nelze pro porovnání hodnoty použít operátor == (i když v prvním případě z jiného důvodu než ve druhých dvou).

Obávám se, že jsem právě odstartoval další diskusi na 200 příspěvků, kde mne budou všichni přesvědčovat, že porovnávat floaty na rovnost je přece úplně normální.

Re:Ideálny programovací jazyk
« Odpověď #329 kdy: 16. 05. 2019, 18:14:33 »
V tom popisu ale není nic o tom, že se ty hodnoty mají porovnávat operátorem ==.
Mně už zbývá v hlavě jediná otázka: připomíná mi tohle spíš Havla nebo Goebbelse? Nějak se nemůžu rozhodnout.