Ideálny programovací jazyk

Re:Ideálny programovací jazyk
« Odpověď #345 kdy: 16. 05. 2019, 19:39:10 »
Zase špatně: Výsledek není stejný. Python se nechová jako Java. https://gist.github.com/BoneFlute/6c9f56a6b4c164b2fc2f246662daa7a8
Je fajn, že jste si to sám vyzkoušel, a zjistil jste, že je to přesně tak, jak jsem napsal. Akorát pak svůj komentář nezačínejte „zase špatně“, vypadá to, jako když jsem to napsal špatně já. Málokdo pochopí, jak jste to doopravdy myslel – že jste se zase mýlil vy.


BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Ideálny programovací jazyk
« Odpověď #346 kdy: 16. 05. 2019, 19:45:15 »
Zase špatně: Výsledek není stejný. Python se nechová jako Java. https://gist.github.com/BoneFlute/6c9f56a6b4c164b2fc2f246662daa7a8
Je fajn, že jste si to sám vyzkoušel, a zjistil jste, že je to přesně tak, jak jsem napsal. Akorát pak svůj komentář nezačínejte „zase špatně“, vypadá to, jako když jsem to napsal špatně já. Málokdo pochopí, jak jste to doopravdy myslel – že jste se zase mýlil vy.

Hezkej pokus. Ale uvědomujete si, že si to každý nyní může prohlídnout a bude jim to jasné?  8)

Re:Ideálny programovací jazyk
« Odpověď #347 kdy: 16. 05. 2019, 19:47:27 »
Protože když v Javě porovnáváte reference pomocí ==, také dostanete varování. Takže v tom rozdíl nevidím.
Tak to mám asi nějaký zkažený vzduch já.

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

$ javac Main.java

$ java -cp . Main
false

Re:Ideálny programovací jazyk
« Odpověď #348 kdy: 16. 05. 2019, 19:59:39 »
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ů.

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


BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Ideálny programovací jazyk
« Odpověď #350 kdy: 16. 05. 2019, 20:13:21 »
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ů.

První problém: Nechceme použít přetěžování operátorů. Díky tomu nemůžeme chápat equals jako ==. To by problém řešilo.
Problém druhý: Je škoda nevyužít operátor ==, když už ho nemůžeme na objektech použít pro ekvivalenci. Tak ho použijeme na porovnání identity.

A je to :-) Myslím, že tak nějak to bylo.
« Poslední změna: 16. 05. 2019, 20:15:24 od BoneFlute »

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

No auto-unboxing... to je podle me opravdu kontraintuitivni. To == mi nevadi, ale to krabickovani me fakt obcas rozciluje.

Re:Ideálny programovací jazyk
« Odpověď #352 kdy: 16. 05. 2019, 20:21:18 »
Tak to mám asi nějaký zkažený vzduch já.
Buď zkažený vzduch a nebo používáte jiný nástroj. Já málokdy překládám Javu z příkazového řádku, použil jsem to, co pro výpis varování používám normálně – IntelliJ Idea.

Re:Ideálny programovací jazyk
« Odpověď #353 kdy: 16. 05. 2019, 20:23:00 »
Buď zkažený vzduch a nebo používáte jiný nástroj. Já málokdy překládám Javu z příkazového řádku, použil jsem to, co pro výpis varování používám normálně – IntelliJ Idea.
Jo, v tom to bude. Já jsem použil Neintelligent Idea.

A proto je Java tak populární.

Tak populární, že polovina lidí, kteří v ní dělají, by v ní raději nedělali :)

Re:Ideálny programovací jazyk
« Odpověď #354 kdy: 16. 05. 2019, 20:34:47 »
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.
Není to žádné další pravidlo. První porovnání – pokud jsou operandy operátoru == objektové typy, porovnávají se reference (ukazatele). Toto pravidlo už tu bylo zmíněné asi milionkrát. Druhé pravidlo, které už tu také bylo zmíněno, že když kompilátor narazí na aritmetický nebo porovnávací operátor který má takové operandy, že kód bez unboxingu nelze přeložit, zkusí provést unboxing. Opět je to velmi jednoduché pravidlo, zpětně kompatibilní změna – nová funkce (autounboxing) se použije pouze u kódu, který by dříve nebylo možné přeložit.

Mimochodem, řeší se tu pořád umělý příklad – myslím, že tahle diskuse zněkolikanásobila počet výskytů takovéhleho kódu v nám známém vesmíru.

No auto-unboxing... to je podle me opravdu kontraintuitivni. To == mi nevadi, ale to krabickovani me fakt obcas rozciluje.
Ano, někdy je otravný, ale lid si to žádal, prý v zájmu pokroku. Já to používám jedině u parametrů metod nebo při přiřazení návratové hodnoty metody do proměnné. Jakmile by k tomu auto- mělo dojít někde jinde, než přímo u deklarace proměnné nebo předání parametru do metody, dělám tam un/boxing ručně, aby to bylo na první pohled vidět a bylo zřejmé, že to dělám záměrně.

Re:Ideálny programovací jazyk
« Odpověď #355 kdy: 16. 05. 2019, 20:36:08 »
Tak to mám asi nějaký zkažený vzduch já.
Buď zkažený vzduch a nebo používáte jiný nástroj. Já málokdy překládám Javu z příkazového řádku, použil jsem to, co pro výpis varování používám normálně – IntelliJ Idea.

 ::) ::) ::) ::) ::)

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

Re:Ideálny programovací jazyk
« Odpověď #357 kdy: 16. 05. 2019, 20:48:51 »
Hezkej pokus. Ale uvědomujete si, že si to každý nyní může prohlídnout a bude jim to jasné?  8)
Mně to jasné je. Bavili jsme se o chování operátoru ==, takže jsem porovnal dva následující příklady (v historii diskuse to lze najít):
Kód: [Vybrat]
public class HelloWorld
{
  public static void main(String[] args)
  {
    Integer a = 1024;
    Integer b = 1024;
    System.out.print(a == b); // false
  }
}

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

a = Integer(1024)
b = Integer(1024)
print(a == b) #False

Vy jste si v Javě vyrobil vlastní typ Cislo a vyšlo vám to (jaké překvapení) stejně. Pro Python jste tenhle příklad vůbec nenapsal.

Dále jsem psal, že v Pythonu můžete přetížit operátor ==, Java přetěžování operátorů záměrně nepodporuje, ale pro porovnání hodnot objektů používá metodu equals(), kterou přetížit můžete. Psal jsem, že když to přetížení naimplementujete stejně v Pythonu i Javě, opět dostanete stejný výsledek. Kód pro Javu jsem tedy neuvedl, stačilo použít stávající implementaci v java.lang.Integer.equals()

Tuhle variantu už jste vy naimplementoval pro oba jazyky, a – světe div se – je to jak jsem psal, vychází to v obou jazycích stejně. Dovolte, abych z vašeho kódu ty dva řádky vypíchl:

Kód: [Vybrat]
System.out.println(a.equals(b)); // true
print (a == b) # True – používá se zde přetížený operátor ==

Předpokládám, že teď budou následovat vaše klasické nářky, že jsem sice psal operátor ==, ale určitě jsem tím myslel identitu…

Re:Ideálny programovací jazyk
« Odpověď #358 kdy: 16. 05. 2019, 20:54:57 »
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ě, za 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).
« Poslední změna: 16. 05. 2019, 20:58:58 od Filip Jirsák »

Re:Ideálny programovací jazyk
« Odpověď #359 kdy: 16. 05. 2019, 21:02:44 »
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ě, za 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 už to konečně chápu naprosto kompletně!







Je to totiž Havel!










No tak ze začátku byl ten spor zajímavý, pak se ale trochu zvrhl, že?

Jistě, už od začátku měl takový nesprávný osobní tón, i když až do konce šlo o zajímavý a aktuální problém, ne?

Já vím, lze se na to dívat z různých úhlů, stran i pozic, vždycky je však nutné zvážit všechna pro i proti, nemám pravdu?

Oni vlastně oba měli tak trochu pravdu a oba se tak trochu mýlili – nebo vlastně naopak: oba se mýlili a oba měli pravdu, ne? Asi ano, ne?

Ano, také si myslím, že ne, i když si nemyslím, že ano. Oba totiž tak nějak zapomněli, že v budoucnosti se bude umění s technikou tak nějak harmonicky doplňovat – lyrickoepické verše pomohou při chemizaci likvidační praxe – periodická soustava prvků pomůže rozvoji impresionismu – na každém technickém výrobku bude zvláštní ploška, vyhrazená pro účinný estetický vjem – komíny atomových elektráren budou pomalovány našimi nejlepšími krajináři – dvacet tisíc mil pod mořem budou čítárny přístupné všem – diferenciální rovnice se budou psát ve verších – na střechách cyklotronů budou divadla malých forem – a v nich se budou recitovat diferenciální rovnice – tak nějak lidsky, ne?



Takže za mě: problem solved, mír s vámi, volové!