Rekurze v Javě (i jinde)

Re:Rekurze v Javě (i jinde)
« Odpověď #15 kdy: 20. 11. 2020, 11:19:32 »
Technická poznámka pro zajímavost: nepokračování bloku kódu může způsobit nejen výjimka, ale i nekonečná rekurze. Např. Scala má typ `Nothing`, který se typicky používá jako typ výsledku funkce, která nikdy neskončí.
Znamená to, že to Scala překládá do jiného bajtkódu, než je volání funkce? Tj. neukládá se volání na zásobník a může to být skutečná nekonečná rekurze?


Re:Rekurze v Javě (i jinde)
« Odpověď #16 kdy: 20. 11. 2020, 18:21:39 »
Technická poznámka pro zajímavost: nepokračování bloku kódu může způsobit nejen výjimka, ale i nekonečná rekurze. Např. Scala má typ `Nothing`, který se typicky používá jako typ výsledku funkce, která nikdy neskončí.
Znamená to, že to Scala překládá do jiného bajtkódu, než je volání funkce? Tj. neukládá se volání na zásobník a může to být skutečná nekonečná rekurze?

Asi narážíš na

def x: Nothing = x

Do bajtkódu jsem se nedíval. Zkusil jsem to pustit a zásobník nepřetéká. Scala v omezené míře (https://www.scala-exercises.org/scala_tutorial/tail_recursion) převádí tail rekurzi na smyčku (dokonce je možné funkci přidat anotaci @tailrec, která říká, že u funkce se očekává, že je tail rekurzivní, a pokud by nebyla, je to compile error). V tomhle  případě je ale překladač asi ještě chytřejší, protože při spuštění to ani nežere CPU, možná (ale opravdu jen spekuluju) prostě to vlákno zaparkuje a hotovo.
« Poslední změna: 20. 11. 2020, 18:25:13 od registrovany_ava »

Re:Rekurze v Javě (i jinde)
« Odpověď #17 kdy: 20. 11. 2020, 18:22:26 »
def notImplemented: Nothing = throw new RuntimeException("Not implemented")
Kód: [Vybrat]
???

Jasně, rozepsal jsem to jen z didaktických důvodů.

Re:Rekurze v Javě (i jinde)
« Odpověď #18 kdy: 20. 11. 2020, 18:36:53 »
Technická poznámka pro zajímavost: nepokračování bloku kódu může způsobit nejen výjimka, ale i nekonečná rekurze. Např. Scala má typ `Nothing`, který se typicky používá jako typ výsledku funkce, která nikdy neskončí.
Znamená to, že to Scala překládá do jiného bajtkódu, než je volání funkce? Tj. neukládá se volání na zásobník a může to být skutečná nekonečná rekurze?


Tak jsem z toho ten bajtkód dostal:

public scala.runtime.Nothing$ x();
  Code:
     0: goto          0

A CPU to žere, předtím jsem to nějak blbě pustil.

Re:Rekurze v Javě (i jinde)
« Odpověď #19 kdy: 20. 11. 2020, 19:59:59 »
Tak jsem z toho ten bajtkód dostal:

public scala.runtime.Nothing$ x();
  Code:
     0: goto          0

A CPU to žere, předtím jsem to nějak blbě pustil.
Díky.


Ink

  • *****
  • 674
    • Zobrazit profil
    • E-mail
Re:Rekurze v Javě (i jinde)
« Odpověď #20 kdy: 21. 11. 2020, 17:00:21 »
Technická poznámka pro zajímavost: nepokračování bloku kódu může způsobit nejen výjimka, ale i nekonečná rekurze. Např. Scala má typ `Nothing`, který se typicky používá jako typ výsledku funkce, která nikdy neskončí.
Znamená to, že to Scala překládá do jiného bajtkódu, než je volání funkce? Tj. neukládá se volání na zásobník a může to být skutečná nekonečná rekurze?

Scala to obchází pomocí tzv. trampolíny: https://free.cofree.io/2017/08/24/trampoline/

Re:Rekurze v Javě (i jinde)
« Odpověď #21 kdy: 21. 11. 2020, 18:53:38 »
Technická poznámka pro zajímavost: nepokračování bloku kódu může způsobit nejen výjimka, ale i nekonečná rekurze. Např. Scala má typ `Nothing`, který se typicky používá jako typ výsledku funkce, která nikdy neskončí.
Znamená to, že to Scala překládá do jiného bajtkódu, než je volání funkce? Tj. neukládá se volání na zásobník a může to být skutečná nekonečná rekurze?

Scala to obchází pomocí tzv. trampolíny: https://free.cofree.io/2017/08/24/trampoline/

Trampolína není nic Scala-specifického, Scala žádnou automatickou trampolínozaci AFAIK nedělá, článek co odkazuješ vypráví o tom jak si rekurzivní funkci ztrampolínovat ručně. Tail rekurzivní funkce (tedy i tu co jsem uvedl já) Scala převádí sama na obyčejnou smyčku (jak je vidět i z bajtkódu co jsem postnul), obecné rekurzivní funkce se volají obyčejně přes zásobník.

Ink

  • *****
  • 674
    • Zobrazit profil
    • E-mail
Re:Rekurze v Javě (i jinde)
« Odpověď #22 kdy: 21. 11. 2020, 19:27:27 »
Scala to obchází pomocí tzv. trampolíny: https://free.cofree.io/2017/08/24/trampoline/

Trampolína není nic Scala-specifického, Scala žádnou automatickou trampolínozaci AFAIK nedělá, článek co odkazuješ vypráví o tom jak si rekurzivní funkci ztrampolínovat ručně. Tail rekurzivní funkce (tedy i tu co jsem uvedl já) Scala převádí sama na obyčejnou smyčku (jak je vidět i z bajtkódu co jsem postnul), obecné rekurzivní funkce se volají obyčejně přes zásobník.

No to je zajímavé, matně jsem si pamatoval, že to dělá automaticky (a netvrdil jsem, že to je specifické pro Scalu). Třeba tady píšou: However, to support TCO, Scala uses a well-known technique called a trampoline. Z čeho jsem tu informaci kdysi čerpal a jak to tam formulovali, už si nepamatuju.

Možná šlo fakt o tohle.
« Poslední změna: 21. 11. 2020, 19:30:11 od Ink »

Re:Rekurze v Javě (i jinde)
« Odpověď #23 kdy: 22. 11. 2020, 06:16:06 »
Scala to obchází pomocí tzv. trampolíny: https://free.cofree.io/2017/08/24/trampoline/

Trampolína není nic Scala-specifického, Scala žádnou automatickou trampolínozaci AFAIK nedělá, článek co odkazuješ vypráví o tom jak si rekurzivní funkci ztrampolínovat ručně. Tail rekurzivní funkce (tedy i tu co jsem uvedl já) Scala převádí sama na obyčejnou smyčku (jak je vidět i z bajtkódu co jsem postnul), obecné rekurzivní funkce se volají obyčejně přes zásobník.

No to je zajímavé, matně jsem si pamatoval, že to dělá automaticky (a netvrdil jsem, že to je specifické pro Scalu). Třeba tady píšou: However, to support TCO, Scala uses a well-known technique called a trampoline. Z čeho jsem tu informaci kdysi čerpal a jak to tam formulovali, už si nepamatuju.

Možná šlo fakt o tohle.

No úplně pro jistotu jsem to ještě zkusil, https://scalafiddle.io/sf/J2aN2OT/0:

def a(x: Int): Int = if (x == 0) {x} else {1 + a(x - 1)}
println("Finished")

a(100000)

přeteče (volání `a` není v tail pozici).

Tak možná se o tom ve Scale kdysi uvažovalo, nebo tam mají chybu, nevím. Každopádně díky za zajímavé odkazy. scala.util.control.TailCalls jsem ani neznal.

Re:Rekurze v Javě (i jinde)
« Odpověď #24 kdy: 22. 11. 2020, 06:42:05 »
Scala to obchází pomocí tzv. trampolíny: https://free.cofree.io/2017/08/24/trampoline/

Trampolína není nic Scala-specifického, Scala žádnou automatickou trampolínozaci AFAIK nedělá, článek co odkazuješ vypráví o tom jak si rekurzivní funkci ztrampolínovat ručně. Tail rekurzivní funkce (tedy i tu co jsem uvedl já) Scala převádí sama na obyčejnou smyčku (jak je vidět i z bajtkódu co jsem postnul), obecné rekurzivní funkce se volají obyčejně přes zásobník.

No to je zajímavé, matně jsem si pamatoval, že to dělá automaticky (a netvrdil jsem, že to je specifické pro Scalu). Třeba tady píšou: However, to support TCO, Scala uses a well-known technique called a trampoline. Z čeho jsem tu informaci kdysi čerpal a jak to tam formulovali, už si nepamatuju.

Možná šlo fakt o tohle.

Jo, on ten článek asi myslí tu "podporu ve Scale" právě tak, že je ve standardní knihovně implementace trampolíny, která je m****a (nemusí se tu to slovo vyskytnout v každé druhé diskuzi :-), tudíž ji lze ve Scale narozdíl od většiny mainstreamových jazyků vyjádřit, a ještě má syntaktickou podporu pro snadné vytváření díky for comprehension.

Ink

  • *****
  • 674
    • Zobrazit profil
    • E-mail
Re:Rekurze v Javě (i jinde)
« Odpověď #25 kdy: 22. 11. 2020, 09:38:18 »
Jo, on ten článek asi myslí tu "podporu ve Scale" právě tak, že je ve standardní knihovně implementace trampolíny, která je m****a (nemusí se tu to slovo vyskytnout v každé druhé diskuzi :-), tudíž ji lze ve Scale narozdíl od většiny mainstreamových jazyků vyjádřit, a ještě má syntaktickou podporu pro snadné vytváření díky for comprehension.

Já jsem se Scalou koketoval už před nevím kolika lety, tak jsem teď googloval. Ovšem s tou Monikou jsi mě dostal, přemýšlel jsem, co za sprosté slovo jsi přiřadil trampolíně.