Dědičnost dnes

SB

Re:Dědičnost dnes
« Odpověď #405 kdy: 26. 01. 2017, 13:12:51 »
...Stačí porušování podtržítkové konvence v projektu zakázat...

A to funguje na úrovni překladače nebo běhu?


SB

Re:Dědičnost dnes
« Odpověď #406 kdy: 26. 01. 2017, 13:18:38 »
...Umožňují jednoduchou implementaci nových vlastností jazyku a reflexivity, funkční polymorfismus na straně třídy, jednoduché ukládání do objektové DB... Přitom s nimi nemusí běžný vývojář přijít do styku.
Který jazyk to má?
ObjC :)

Tak samozřejmě, ale víme, proč jsem to napsal...  ;)

SB

Re:Dědičnost dnes
« Odpověď #407 kdy: 26. 01. 2017, 13:21:51 »

Java vznikla, aby céčkaři mohli začít používat vyšší abstrakci a "objekty" a neposrali se z toho. Nehledejte složitosti, kde nejsou.
Nebylo to spíše pro to, aby mohli psát fungující kód i necéčkaři? ;)
To by přece použili Smalltalk.  ;)

SB

Re:Dědičnost dnes
« Odpověď #408 kdy: 26. 01. 2017, 13:23:42 »
Tak se jim to moc nepovedlo. Java je v Guinessove knize. Na Hello World do terminal musite napsat nejvic radku kodu ze vsech jazyku.

To jako System.out.println("Nazdar."); ?

SB

Re:Dědičnost dnes
« Odpověď #409 kdy: 26. 01. 2017, 13:30:28 »
Ano v immutable je to jen z pohledu programatora. Pocitac samozrejme pamet fyzicky meni.
Toto je implementovano jako tail-call optimisation. Kdyz je volani sebe sama jako posledni a neni tam zadna hodnota, ktera se rekurzivne vraci (return 1+ callme(n) vs return callme(n+1)), tak neni nutne alokovat na stacku novou pamet. Lze pouzit stejny stack s jakym byl zavolan pro nove volani.

Tail-call je o optimizaci návratu po návratu. V uvedeném příkladu zavolání loop(něco) se odnikud nevrací, naopak buďto je to rekurze a zásobník roste, nebo je to skok a stejně je třeba vytvořit nový kontext, ale starý je zahoditelný.


gll

Re:Dědičnost dnes
« Odpověď #410 kdy: 26. 01. 2017, 13:31:47 »
...Také metatřídy v Pythonu to všechno jen dodělají...

Smalltalk je má taky https://en.wikipedia.org/wiki/Metaclass#In_Smalltalk-80. Umožňují jednoduchou implementaci nových vlastností jazyku a reflexivity, funkční polymorfismus na straně třídy, jednoduché ukládání do objektové DB... Přitom s nimi nemusí běžný vývojář přijít do styku.
Který jazyk to má?

V jiné diskuzi se řešila typová kontrola a vynucení implementace abstraktních metod. K tomu jsou metatřídy ideální.

Sten

Re:Dědičnost dnes
« Odpověď #411 kdy: 26. 01. 2017, 13:43:35 »
...Také metatřídy v Pythonu to všechno jen dodělají...

Smalltalk je má taky https://en.wikipedia.org/wiki/Metaclass#In_Smalltalk-80. Umožňují jednoduchou implementaci nových vlastností jazyku a reflexivity, funkční polymorfismus na straně třídy, jednoduché ukládání do objektové DB... Přitom s nimi nemusí běžný vývojář přijít do styku.
Který jazyk to má?

Java :)

gll

Re:Dědičnost dnes
« Odpověď #412 kdy: 26. 01. 2017, 13:56:38 »
...Také metatřídy v Pythonu to všechno jen dodělají...

Smalltalk je má taky https://en.wikipedia.org/wiki/Metaclass#In_Smalltalk-80. Umožňují jednoduchou implementaci nových vlastností jazyku a reflexivity, funkční polymorfismus na straně třídy, jednoduché ukládání do objektové DB... Přitom s nimi nemusí běžný vývojář přijít do styku.
Který jazyk to má?

Java :)

to je něco úplně jiného.

bob

Re:Dědičnost dnes
« Odpověď #413 kdy: 26. 01. 2017, 14:11:18 »
Ano v immutable je to jen z pohledu programatora. Pocitac samozrejme pamet fyzicky meni.
Toto je implementovano jako tail-call optimisation. Kdyz je volani sebe sama jako posledni a neni tam zadna hodnota, ktera se rekurzivne vraci (return 1+ callme(n) vs return callme(n+1)), tak neni nutne alokovat na stacku novou pamet. Lze pouzit stejny stack s jakym byl zavolan pro nove volani.

Tail-call je o optimizaci návratu po návratu. V uvedeném příkladu zavolání loop(něco) se odnikud nevrací, naopak buďto je to rekurze a zásobník roste, nebo je to skok a stejně je třeba vytvořit nový kontext, ale starý je zahoditelný.

def loop(neco) do   je definice funkce.
zavolani loop(neco) je rekurzivni volani funkce a zaroven se vraci i jeji vysledek. Tam neni napsano return, ale jde si ho tam predstavit. Vysledek posledniho prikazu se automaticky vraci, neni nutne tam psat vsude return.

To, ze se nezvetsuje zasobnik a nepretece, je diky tail-call optimizaci. Protoze fce vraci vyhradne vysledek dalsiho volani a nevraci zadnou svou lokalni promennou (cela rekurze ma strejny vysledek jako posledni volani, neni nutne si pamatovat cokoliv mezi tim), je vrsek stacku zahozen a stejne misto se pouzije pro dalsi volani fce loop(neco).

Naproti tomu napr. v C++, by se vrsek stacku nezahodil a pro nove volani by se nad tim alokovala nova pamet a brzy by dosla.

Zadny ze soucasnych nefunkcionalnich jazyku tail call neumi (c++,java, c#, atp..), krom JavaScript (ES6).

noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #414 kdy: 26. 01. 2017, 15:01:10 »
Zadny ze soucasnych nefunkcionalnich jazyku tail call neumi (c++,java, c#, atp..), krom JavaScript (ES6).

To jako ze JS neni funkcionalni? Jiste, neni ciste (pure) funkcionalni, ale funkcionalni IMO je. Podobne Scala, ta ma v urcitych pripadech tail-call optimalizaci a take neni ciste funckionalnim jazykem.

Sten

Re:Dědičnost dnes
« Odpověď #415 kdy: 26. 01. 2017, 15:06:39 »
to je něco úplně jiného.

Je to stejný výsledek bez metatříd. Tohle jsou tedy jen rozšiřující metody, ukládání do DB dělá třeba Hibernate, třídy lze měnit za běhu JVM přes ClassLoader. Nemá to tedy všechny schopnosti metatříd (třeba nejdou měnit již instancované objekty bez jejich znovuvytvoření, což jde přes ten Hibernate), ale ty zmíněné to umí.

Naproti tomu napr. v C++, by se vrsek stacku nezahodil a pro nove volani by se nad tim alokovala nova pamet a brzy by dosla.

MSVC++, GCC i LLVM dělají tail-call optimizace a takovouto rekurzi předvedou na for loop, a to dokonce i nepřímou (pokud jsou definice obou funkcí dostupné ve stejném kontextu).

bob

Re:Dědičnost dnes
« Odpověď #416 kdy: 26. 01. 2017, 15:15:15 »
Zadny ze soucasnych nefunkcionalnich jazyku tail call neumi (c++,java, c#, atp..), krom JavaScript (ES6).

To jako ze JS neni funkcionalni? Jiste, neni ciste (pure) funkcionalni, ale funkcionalni IMO je. Podobne Scala, ta ma v urcitych pripadech tail-call optimalizaci a take neni ciste funckionalnim jazykem.

Jo je :). Ja tam mel puvodne beznych jazyku, pak to prepsal.

gll

Re:Dědičnost dnes
« Odpověď #417 kdy: 26. 01. 2017, 15:52:15 »
to je něco úplně jiného.

Je to stejný výsledek bez metatříd. Tohle jsou tedy jen rozšiřující metody, ukládání do DB dělá třeba Hibernate, třídy lze měnit za běhu JVM přes ClassLoader. Nemá to tedy všechny schopnosti metatříd (třeba nejdou měnit již instancované objekty bez jejich znovuvytvoření, což jde přes ten Hibernate), ale ty zmíněné to umí.

k tomuhle nejsou metaclassy vůbec potřeba. To je v dynamických jazycích trivialita.

gll

Re:Dědičnost dnes
« Odpověď #418 kdy: 26. 01. 2017, 16:35:46 »
...Stačí porušování podtržítkové konvence v projektu zakázat...

A to funguje na úrovni překladače nebo běhu?

Linter na to upozorní.

Na úrovni běhu by to šlo zakázat třeba právě tou metaclassou.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Dědičnost dnes
« Odpověď #419 kdy: 26. 01. 2017, 18:16:13 »

Java vznikla, aby céčkaři mohli začít používat vyšší abstrakci a "objekty" a neposrali se z toho. Nehledejte složitosti, kde nejsou.
Nebylo to spíše pro to, aby mohli psát fungující kód i necéčkaři? ;)
To by přece použili Smalltalk.  ;)
Nebo spíše ObjC, to kombinuje rychlost Smalltalku a paměťovou bezpečnost céčka ;)