Ideálny programovací jazyk

Re:Ideálny programovací jazyk
« Odpověď #300 kdy: 16. 05. 2019, 16:27:30 »
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 jste toho viděl dost málo...

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

A co když to kritizují všude? :D

Mimochodem, představte si, že v tom vašem příkladu a bude float a b bude double. A teď si ještě představte, že ten kód bude C. Nebo C++. To máme ale na světě nepoužitelných jazyků, že? A co je v nich napsáno aplikací…

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"?


Re:Ideálny programovací jazyk
« Odpověď #301 kdy: 16. 05. 2019, 16:29:30 »
If the value p being boxed is an integer literal of type int between -128 and 127 inclusive (§3.10.1), or the boolean literal true or false (§3.10.3), or a character literal between '\u0000' and '\u007f' inclusive (§3.10.4), then let a and b be the results of any two boxing conversions of p. It is always the case that a == b.
To je uz skoro jak == v JS :)))

Jinak ale diky za vecne upresneni. Konecne teda misto kecu overitelna fakta.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Ideálny programovací jazyk
« Odpověď #302 kdy: 16. 05. 2019, 16:29:47 »
Konecne jsem to pochopil, vy jste tady jediny programator a vsichni ostatni jsou...

asi lopaty, co?
Ale no tak...  ::)

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Ideálny programovací jazyk
« Odpověď #303 kdy: 16. 05. 2019, 16:42:26 »
operátor == se z definice nechová špatně. Špatně je, když jazyk dovolí napsat:
Citace
Integer a;
Integer b;

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

a = 1024;
b = 1024;
if(a == b){
    ...
}

Programátor vidící poslední 3 řádky na první pohled považuje proměnné a a b za primitivní číselné typy a očekává porovnávání hdnot a tedy shodu. Nemá šanci na pohled poznat, že jsou to ve skutečnosti objekty a že bude porovnávat reference a ne hodnoty.
Upozornění v IDE, že porovnává objekty ho může zachránit, ale ne každý editor kódu to umí.

K tomu přece vůbec není potřebné IDE. Když je někdo čuně...

nula

Re:Ideálny programovací jazyk
« Odpověď #304 kdy: 16. 05. 2019, 16:42:32 »
If the value p being boxed is an integer literal of type int between -128 and 127 inclusive (§3.10.1), or the boolean literal true or false (§3.10.3), or a character literal between '\u0000' and '\u007f' inclusive (§3.10.4), then let a and b be the results of any two boxing conversions of p. It is always the case that a == b.
To je uz skoro jak == v JS :)))
Presne :) A v dalsim zduvodneni vyslovene pisou ze zamer je aby sly boxovane hodnoty co nejvic porovnavat operatorem ==. Akorat se jim to zdalo moc narocne, tak dle normy staci jen cast oboru hodnot takhle porovnat.. .. mi to prijde jako docela komedie teda...


Ink

  • *****
  • 654
    • Zobrazit profil
    • E-mail
Re:Ideálny programovací jazyk
« Odpověď #305 kdy: 16. 05. 2019, 16:45:59 »
Presne :) A v dalsim zduvodneni vyslovene pisou ze zamer je aby sly boxovane hodnoty co nejvic porovnavat operatorem ==. Akorat se jim to zdalo moc narocne, tak dle normy staci jen cast oboru hodnot takhle porovnat.. .. mi to prijde jako docela komedie teda...

Řád zlatého šálku v akci. Když jsem psal ten úvodní vstup, chtěl jsem si text zcenzurovat jako příliš tvrdý.

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Ideálny programovací jazyk
« Odpověď #306 kdy: 16. 05. 2019, 16:47:08 »
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ě.

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

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

Kit

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

Však na té stránce je to dobře.

Re:Ideálny programovací jazyk
« Odpověď #310 kdy: 16. 05. 2019, 17:07:02 »
Teď jsem to celé pochopil, naše nedorozumění spočívalo v tom, že já jsem pojem programátor chápal v nějakém smyslu a Ty v jiném (programátor = spokojený javista). Tudíž nemá smysl se o to dál hádat, neb coby člověk, kterého živí hlavně Python (a předtím C++ a C), nemůžu účinně argumentovat.
Ne, zase jste to nepochopil. Por mne programátor je někdo, kdo ovládá alespoň základy jazyka, ve kterém chce programovat.

Akorát bazíruju na tom, že s tím Pythonem jsi nadále mimo.
Bazírovat na tom můžete, smutné je, že nemáte pravdu.

Kód: [Vybrat]
class Integer:
    def __init__(self, value):
        self.value = value

a = Integer(1024)
b = Integer(1024)
print(a == b) #False
Co jsem udělal? Vzal jsem ten původní kód, který rozpoutal celou debatu. Kód, který se údajně v Javě chová úplně nemožně. Napsal jsem to samé v Pythonu, který se prý chová úplně jinak. A výsledek je co? Výsledek je naprosto stejný. Python se chová přesně tak, jako se chová Java, dělá přesně to, co kritizujete.

Jistě budete argumentovat tím, že v Pythonu to můžete dál vylepšovat. Můžete do třídy dopsat přetížení operátoru:
Kód: [Vybrat]
def __eq__(self, other):
    return self.value == other.value
Ano, můžete. V Javě to také můžete dál upravovat, můžete přetížit metodu equals() (resp. ve třídě java.lang.Integer už ta metoda dávno přetížená je).

Předpokládám, že budete argumentovat i tím, že žádný soudný Python programátor by nenapsal třídu Integer bez toho přetíženého operátoru. Jenže stejně tak by žádný soudný programátor v Javě neporovnával objekty pomocí ==, když chce porovnávat hodnoty.

Takže se zase dostáváme zpět k tomu, že jediný rozdíl mezi Javou a Pythonem v tomto případě je ten, že Java drží minimum funkcí samotného jazyka a proto nedovoluje přetěžovat operátory. Každý Java programátor to ví, takže ho ani nenapadne porovnávat objekty pomocí == a bude shánět metodu, která porovnání dělá. Zároveň každý Java programátor ví, že když dává smysl u jeho třídy zjišťovat ekvivalenci s jiným objektem, musí přetížit metodu equals(). Python naproti tomu chce mít bohatší jazyk, takže umožňuje přetěžovat operátory – a každý Python programátor ví, že když dává smysl porovnávat na ekvivalenci jeho třídu, musí přetížit metodu __eq__.

Jsou to dva různé přístupy, každý má svá pro a proti – a přístup, který vyhovuje vám osobně, proto ještě není obecně lepší.

akorát dodám, že JavaScriptem bych se fakt neoháněl, protože to je bastl z definice (už jenom ta jejich vnitřní reprezentace čísel - tfuj!).
To je právě ten problém, že vy se na to pořád díváte tak, že co vyhovuje vám, musí vyhovovat všem, a co vám nevyhovuje, nemůže vyhovovat nikomu. JavaScript vznikla za nějakým účelem, a pro daný účel je vnitřní reprezentace čísel úplně nezajímavá.

Re:Ideálny programovací jazyk
« Odpověď #311 kdy: 16. 05. 2019, 17:12:53 »
To je právě ten problém, že vy se na to pořád díváte tak, že co vyhovuje vám, musí vyhovovat všem, a co vám nevyhovuje, nemůže vyhovovat nikomu. JavaScript vznikla za nějakým účelem, a pro daný účel je vnitřní reprezentace čísel úplně nezajímavá.
Marxismus-leninismus taky vznikl v nejake dobe za nejakym ucelem a v te dobe a pro ten ucel to mohlo nekomu pripadat jako docela dobry napad.

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

Ink

  • *****
  • 654
    • Zobrazit profil
    • E-mail
Re:Ideálny programovací jazyk
« Odpověď #313 kdy: 16. 05. 2019, 17:18:29 »
Předpokládám, že budete argumentovat i tím, že žádný soudný Python programátor by nenapsal třídu Integer bez toho přetíženého operátoru. Jenže stejně tak by žádný soudný programátor v Javě neporovnával objekty pomocí ==, když chce porovnávat hodnoty.

Žádný soudný programátor v Pythonu tohle implementovat nemusí, protože Python umí libovolně velký integer vytvořit a příčetně porovnávat s jiným integerem. A samozřejmě pokud by to dělal a neimplementoval základní operace, bylo by to ... divné. Zbytek jsou debaty o ... zlatém šálku ... a to, s prominutím, nemám zapotřebí.

Re:Ideálny programovací jazyk
« Odpověď #314 kdy: 16. 05. 2019, 17:19:24 »
Jen jsem si cvičně zkusl totéž v c# (Web app, nechci si otvírat nový projekt) - pro mě se to tam chová logicky - když je něco číslo (i když vlastně vestavěný objekt), tak pomocí == porovnávám hodnoty:
Citace
    Int32 a = new Int32();
    Decimal b = new Decimal();
    a = 999999999;
    b = 999999999;
    Response.Write("a &lt;" + a.GetType() + "&gt; = " + a.ToString() + "< br>");
    Response.Write("b &lt;" + b.GetType() + "&gt; = " + b.ToString() + "< br>");
    if (a == b)
    {        Response.Write("operátor == : Shoda!< br>");    }
    else
    {        Response.Write("operátor == : Neshoda!< br>");    }
    if (a.Equals(b))
    {        Response.Write("metoda equals() : Shoda!< br>");    }
    else
    {        Response.Write("metoda equals() : Neshoda!< br>");    }
Výstup:
Citace
a <System.Int32> = 999999999
b <System.Decimal> = 999999999
operátor == : Shoda!
metoda equals() : Neshoda!
« Poslední změna: 16. 05. 2019, 17:21:29 od Tomas-T »