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 - Jiří Havel

Stran: 1 ... 19 20 [21] 22
301
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 21:14:12 »
Co mě tu hlavně mate je, že v tomhle případě by se mohlo jak automaticky boxovat tak unboxovat. A ani přečtení dokumentace mi neobjasnilo, co by mělo mít přednost. Jak boxování tak unboxování se má dělat v případě, že se předává parametr nebo přiřazuje do proměnné. Na základě čeho se rozhodne, že se tady má zrovna unboxovat?
U aritmetických operátorů boxování nepřichází v úvahu, dostali bychom zase jen nepřeložitelný kód. No a u komparačních operátorů je za prvé rozumné dělat to stejně, a zda druhé by boxování bylo s prominutím padlé na hlavu, protože je čistě věcí kompilátoru, jakou referenci vám tam vrátí – a když ta reference mohla právě teď vzniknout, nedává smysl ji porovnávat na rovnost s jinou referencí. Porovnávat reference má smysl tam, kde už je máte z dřívějška uložené (třeba klasická zarážka při hledání v poli).
Takže je to speciální ad-hoc pravidlo jak porovnávat boxované a neboxované věci? Nevyplývá to z nějakého obecnějšího pravidla pro řešení podobných neurčitých situací? Dávalo by mi to smysl i pro výběr přetížených metod, ale tam to evidentně funguje jinak. Čím dál tím lepší...

Je to totiž Havel!
Nic mi nedokážete, všechno popřu. 8)

302
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 20:41:11 »
No auto-unboxing... to je podle me opravdu kontraintuitivni. To == mi nevadi, ale to krabickovani me fakt obcas rozciluje.
Co mě tu hlavně mate je, že v tomhle případě by se mohlo jak automaticky boxovat tak unboxovat. A ani přečtení dokumentace mi neobjasnilo, co by mělo mít přednost. Jak boxování tak unboxování se má dělat v případě, že se předává parametr nebo přiřazuje do proměnné. Na základě čeho se rozhodne, že se tady má zrovna unboxovat?

303
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 20:05:06 »
Každopádně ale musím uznat, že je to řachanda.

Kód: [Vybrat]
$ cat Main.java
public class Main {
    public static void main(String[] args) {
        Integer a = 1024;
        Integer b = 1024;
        System.out.println(a == b);
        System.out.println(a == 1024);
    }
}

$ javac Main.java

$ java -cp . Main
false
true

Doporučují čtyři ze tří psychoterapeutů.

Už zase nevím, která bije. :o Tohle bude nějaké další pravidlo toho jednoduchého a předvídatelného jazyka, které tu ještě nezaznělo.

304
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 18:20:02 »
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.
Proč by ten seznam musel vzniknout analýzou existujícího kódu? Stejně tak mohl vzniknout na základě pozorování bandy juniorů. Když začátečníci dělají pravidelně něco, kvůli čemu se jim kód nezkompiluje, tak to nejsou chyby? Co to teda je?

IMO, když to odchytí kompiler, tak to není zákeřná past. Ale chyba je to furt.


305
Vývoj / Re:Ideálny programovací jazyk
« 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.

306
Vývoj / Re:Ideálny programovací jazyk
« 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š? ::)

307
Vývoj / Re:Ideálny programovací jazyk
« 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.

308
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 16:53:26 »
Ono to nejde vyrobit ani v té Javě.
Ne? Já ten kus kódu zkusil v https://www.jdoodle.com/online-java-compiler a prošlo mi to.

309
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 15:49:19 »
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.
Pokud běžný Franta programátor očekává něco, co nesplňuje snad žádný programovací jazyk, není programátor. 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.
Žádný? ::) Třeba takový Haskell to umí porovnávání podle hodnoty generovat hodně pěkně. A i to pitomé C++ kód nezkompiluje, pokud autor knihovny ten operátor porovnání nevytvoří. Ano, mluvím o porovnávání podle hodnoty psaném programátorem. O porovnávání podle hodnoty ve vychozím nastavení tu totiž kromě vás nemluví vůbec nikdo.
Citace
Ž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í.
Už jsem to tu minimálně jednou psal, ale C++ to tak vážně nemá. Automaticky žádné operátory porovnávání negeneruje. Ten operátor porovnávání musí vždycky vytvořit autor knihovny.
Aby se v C++ vůbec dala porovnat identita objektů, musím na ně získat ukazatele a porovnat hodnoty těch ukazatelů. Tohle funguje úplně jinak než v Javě, kde objekt nemůže existovat bez ukazatele na něj. V C++ na spoustu objektů ukazatele nemám a nepotřebuju.
Slovo ukazatel místo slova reference jsem použil záměrně. Reference v C++ fungují o dost jinak než reference v Javě. Ty jazyky se liší dost fundamentálně.

310
Vývoj / Re:Ideálny programovací jazyk
« kdy: 16. 05. 2019, 13:42:33 »
To máš podloženo nějakým průzkumem? Klidně to může být tak, že běžný programátor od jednoduchého jazyka očekává, že == vezme to co má nejvíc po ruce a porovná to a nebude dělat žádnou magii. Když si uvědomíš, že reference je hodnota pointeru, tak to v obou případech dělá to samé - porovnává hodnoty. A možná je to přesně to, co od toho očekává běžný programátor.
"to co má nejvíc po ruce" je hodně neurčitý pojem. Může záviset na implementačních detailech o kterých by běžný programátor neměl ani vědět. Nebo by o nich minimálně neměl být nucený přemýšlet.
Má ten jazyk být jednoduchý na použití, nebo na implementaci? Tyhle dva požadavky jdou trochu proti sobě.

311
Vývoj / Re:Ideálny programovací jazyk
« kdy: 15. 05. 2019, 22:40:17 »
To by teprve byl zmatek, kdyby se objekty někdy porovnávaly podle reference a někdy podle hodnoty.
Neřešíme už tu několik stránek to, že přesně tohle se v Javě děje? Vestavěné typy se porovnávají podle hodnoty a naše podle reference. ::)

312
Vývoj / Re:Ideálny programovací jazyk
« kdy: 15. 05. 2019, 22:28:51 »
Hodnota není až takový problém.
Každý složený datový typ jde porovnat prvek po prvku. Invarianty na tom nic nezmění, ty jenom vyloučí některé možnosti. Navíc se takovéhle porovnání dá generovat i automaticky.
Co tím může zamíchat je zavedení nějakých tříd ekvivalence (zlomky, floaty). Nejjednodušší způsob, jak je zavést konzistentně je nějaká forma normalizace.
Problém je, že těch tříd ekvivalence často může být několik. Prostě někdy chcete, aby 1/2 byla to samé jako 2/4, a někdy to nechcete.
Pokud implementuju zlomky, pak je to stejné. Pokud implementuju dvojice čísel, pak je to různé. Rozliším to typovým systémem. Pokud se na to koukám jako na hodnoty, tak dává smysl i občasná konverze mezi tím zlomkem a dvojicí čísel.

Citace
Ostatně problém jsou i ty řetězce – jsou řetězce „č“ a „č“ stejné? Jsou? A neměly by stejné řetězce mít stejný počet znaků? První má jeden znak, druhý dva…
Jsou stejné. Liší se počet bytů, ne znaků. Našemu pojmu znak (ve významu používaném v běžném životě) spíš odpovídá pojem grapheme cluster, které mají oba řetězce po jednom. Zase je to o tom, jestli chci pracovat s textem, nebo polem bytů a tohle už můžu odlišit na úrovni typového systému.

313
Vývoj / Re:Ideálny programovací jazyk
« kdy: 15. 05. 2019, 22:11:35 »
Nebo kompilátoru vysvětlit, že pro konkrétní vestavěné objektové typy se == prostě automaticky používá na hodnoty a ne na reference. Protože nevím o žádném smysluplném důvodu porovnávat reference na dva objekty typu Integer.
Tohle už je flíkování, které jenom odsouvá problém dál. Ten problém vychází z toho, že jeden operátor dělá různé věci pro různé typy (jednou porovnává umístění, jindy co na tom místě leží). Systematické řešení by bylo vybrat jen jednu možnost.
V ideálním jazyce by nemělo jít poznat, jestli je nějaký typ vestavěný nebo implementovaný v knihovně.

314
Vývoj / Re:Ideálny programovací jazyk
« kdy: 15. 05. 2019, 21:40:18 »
Je to problém, protože u spousty struktur nedokážete určit ani co je to ta identita, o hodnotě ani nemluvě.
Hodnota není až takový problém.
Každý složený datový typ jde porovnat prvek po prvku. Invarianty na tom nic nezmění, ty jenom vyloučí některé možnosti. Navíc se takovéhle porovnání dá generovat i automaticky.
Co tím může zamíchat je zavedení nějakých tříd ekvivalence (zlomky, floaty). Nejjednodušší způsob, jak je zavést konzistentně je nějaká forma normalizace.
Pokud nějaký objekt nemá jít porovnat hodnotou, tak je to spíš proto, že to má být neprůhledný blackbox, než že by ani interně žádnou hodnotu neměl.

315
Vývoj / Re:Ideálny programovací jazyk
« kdy: 15. 05. 2019, 16:58:02 »
Tak tady bych silně nesouhlasil. Jsem C++ programátor a od operátorů očekávám, že čertoviny dělat nebudou. A taky ve všech knihovnách, které používám, žádné čertoviny nedělají.
Třeba to, že se operátor > používal pro zápis do streamu (což je blokující operace, navíc může vyhodit výjimku), tu už se v C++ nedělá?
Zrovna iostreamy jsou obecně jedna z nejhůř navržených (a taky nejstarších) částí standardní knihovny obecně. Na druhou stranu zrovna tady je z kontextu dost jasné, že tenhle operator<< opravdu nedělá nic jako bitový posun. Naproti tomu se potkávám se spoustou matematických knihoven, kde operátory dělají přesně to, co od nich intuitivně čekám.
Citace
Úplně stejně očekávám od metod, že budou dělat to, co vyplývá z jejich jména.
To já také. Jenže u spousty typů je tolik různých variant, co může dělat add() nebo equals()… Třeba máte dvě instance reprezentující v DOM následující dva XML elementy:

Kód: [Vybrat]
<f:element xmlns:f="http://example.com/namespace" />
<x:element xmlns:x="http://example.com/namespace" />

equals() vracet true nebo false?
No ale tohle je přesně to, na co narážím. Funkce equals nebo operátor== můžou být úplně stejně neintuitivní a matoucí. Zákaz přetěžování operátorů nevyřeší vůbec nic. Když autor knihovny pojmenuje funkci blbě, tak je vlastně úplně jedno jaké přesné ascii znaky to jsou.
Citace
Opravdu Javisti automaticky počítají s tím, že uživatelsky implementovaný kód může dělat cokoliv? Na takovéhle prasení vážně nejsem zvyklý a celkem mě překvapuje.
S tím počítají všichni dobří programátoři. Nejde o to, že by ten kód dělal něco nepředvídatelného (i když i to se stává). Ale když mám třeba kolekci, za kterou mám lokální nebo dokonce síťovou databázi, počítám s tím, že volání add() může trvat dlouho nebo může skončit třeba síťovou výjimkou. Když volám equals() na databázové entitě, ověřím si, zda se identita zjišťuje podle primárního klíče, podle hodnot nebo podle čeho. A tak dále. U operátoru ale čekám, že budou jednoduché, nebudou blokovat, nebudou vyhazovat výjimky, budou mít jednoznačný význam.
No když mám objekt, co se tváří třeba jako matice, tak od + i od add budu čekat sčítání matic. Ani v jednom případě nebudu očekávat komunikaci se vzdálenou databází. Naopak kolekce, která potichu komunikuje s nějakou vzdálenou databází je dost zákeřná, pokud se tváří jako nějaká obyčejná. Tohle zase nemá s operátory společné prakticky nic.
Citace
V tom je operátor == v Javě opravdu trochu nešťastný, protože tam je potřeba vědět, že porovnává reference. Ale zrovna C++ to má stejně, nemýlím-li se.
V C++ se operátor== obvykle přetěžuje tak, aby porovnával hodnoty. Obecně je v C++ zvykem, pokud to jenom trochu jde, aby se všechno chovalo jako vestavěné typy. Ale c++ rozlišuje samotný objekt od ukazatele na něj. Takže nemusím vůbec řešit, jak porovnávat identitu dvou objektů. Porovnávám jejich adresy resp. hodnoty dvou ukazatelů.

Stran: 1 ... 19 20 [21] 22