Je Rust jazyk budoucnosti?

Re:Je Rust jazyk budoucnosti?
« Odpověď #330 kdy: 06. 12. 2022, 10:56:18 »
Když to shrnu, veškeré typové parametry a konstruktory (lifetimy, reference…) jsou normálně součástí typového systému Rustu (tyto mu ale nijak nepřidávají na síle),
Takže bez nich by Rust type systém podle tebe byl stejně "sofistikovaný"? (Respektive dle tebe "primitivní".)

ale borrow checking/escape analýza jsou jen algoritmy, ty nemůžou být jeho součástí už z definice (quicksort taky není součástí pole nebo seznamu, ale umí ho seřadit).
Aha, takže se hádáme spíš o pojmy než o type systémy jazyků. Mně se to jeví tak, že když z funkce zkusim vrátim hodnotu se špatným lifetime a kompilátor tohle odmítne, je to principielně stejné jako když se pokusim z té funkce vrátit špatný typ.

Nicméně ptám se na runtime zachazející s těmi typovými parametry, o kterém jsi tvrdil, že je nutný. (...)
Sorry, ale když řekneš, že typové parametry potřebuji runtime pro boxing a já nevím co, a pak píšeš něco o matematických funkcích, tam to není dobrý argument.
Takže ještě jednou po X-té - tohle jsem napsal na základě tvého výroku, že ty typové parametry jsou komplet vymazány. Pokud vymazány nejsou, tak to potřeba není, ale podpora ze strany runtime stále potřeba je, runtime na to místo (do té funkce getCol) tu velikost matice zpropaguje.


Re:Je Rust jazyk budoucnosti?
« Odpověď #331 kdy: 06. 12. 2022, 10:59:35 »
Citace
ale podpora ze strany runtime stále potřeba je, runtime na to místo (do té funkce getCol) tu velikost matice zpropaguje.

Ještě upřesnění: V případě, že by se ten kód kompiloval do spustitelného kódu, bylo by možné to opravdu udělat bez runtime prostě zpropagováním toho parametru jako běžného parametru funkce.

Idris

  • *****
  • 2 271
    • Zobrazit profil
    • E-mail
Re:Je Rust jazyk budoucnosti?
« Odpověď #332 kdy: 06. 12. 2022, 11:05:41 »
Když to shrnu, veškeré typové parametry a konstruktory (lifetimy, reference…) jsou normálně součástí typového systému Rustu (tyto mu ale nijak nepřidávají na síle),
Takže bez nich by Rust type systém podle tebe byl stejně "sofistikovaný"?
Jistě, reference je normální typový konstruktor a lifetime je jen další typ pro typové parametry. Kdybych tam přidal typ “brambora”, mohl bych si ho přidat ke generické funkci, ale sofistikovanější to nebude.

Reference ostatně mají téměř všechny mainstreamové jazyky a lifetimy jsou implicitně v každém překladači provádějícím escape analýzu. Více či méně chytrý je ovšem ten algoritmus escape analýzy (Java nic moc, Go lepší, ale dost věcí mu unikne, Rust propracovaný).

Idris

  • *****
  • 2 271
    • Zobrazit profil
    • E-mail
Re:Je Rust jazyk budoucnosti?
« Odpověď #333 kdy: 06. 12. 2022, 11:09:10 »
bylo by možné to opravdu udělat bez runtime prostě zpropagováním toho parametru jako běžného parametru funkce.
To je přece princip těch tzv. implicitních parametrů (těch ve složených závorkách). Proto se může dělat type erasure (Vect nebo Matrix tam nikde není). Koukám, že už to začínáš chápat, to je fajn, diskuse nese ovoce.

Re:Je Rust jazyk budoucnosti?
« Odpověď #334 kdy: 06. 12. 2022, 11:30:18 »
Jistě, reference je normální typový konstruktor a lifetime je jen další typ pro typové parametry. Kdybych tam přidal typ “brambora”, mohl bych si ho přidat ke generické funkci, ale sofistikovanější to nebude.
No jo, jenže 'brambora' by nebyla relevantní/použitelná pro borrow checking.

To je přece princip těch tzv. implicitních parametrů (těch ve složených závorkách). Proto se může dělat type erasure (Vect nebo Matrix tam nikde není). Koukám, že už to začínáš chápat, to je fajn, diskuse nese ovoce.
Opravdu? Tobě připadá smysluplná a přínosná diskuse, kdy nejdřív prohlásíš, že typové parametry se komplet vymažou a vůbec ve výstupu nefigurují a pak čekáš, až zjistim, že ten parametr tam můžeme zpropagovat, pokud to potřebujeme, pomocí této fíčury ('implicit arguments'), a vskutu, tímto se zajišťuje ta dynamická funkčnost, o které jsme se bavili?


Re:Je Rust jazyk budoucnosti?
« Odpověď #335 kdy: 06. 12. 2022, 11:41:13 »
Reference ostatně mají téměř všechny mainstreamové jazyky a lifetimy jsou implicitně v každém překladači provádějícím escape analýzu.

Implicitní ano, každý překladač si hlídá co kde má a jestli to ještě žije. Jenže u referencí to nejde. Objekt na který reference ukazuje může teoreticky žít nekonečně dlouho a nebo taky ne. Takže se používá buď runtime RC, GC nebo statické lifetimes. Případně immutable sémantika z hlediska jazyka, ale ta také interně tu paměť musí uvolňovat, protože prakticky nemáme neomezené množství..

Idris

  • *****
  • 2 271
    • Zobrazit profil
    • E-mail
Re:Je Rust jazyk budoucnosti?
« Odpověď #336 kdy: 06. 12. 2022, 11:43:46 »
parametr tam můžeme zpropagovat, pokud to potřebujeme, pomocí této fíčury ('implicit arguments')
Je rozdíl mezi type erasure a type parameter erasure ;)
Ale už to uzavřeme, myslím, že teď už je všem jasné, jak to funguje. V čem má smysl pokračovat je ten příklad s GADT pro IsEven. Tam bude zajímavější i ten vygenerovaný kód, protože s typem Nat se pojí zajímavé optimalizace.

Re:Je Rust jazyk budoucnosti?
« Odpověď #337 kdy: 06. 12. 2022, 11:51:54 »
Tam bude zajímavější i ten vygenerovaný kód, protože s typem Nat se pojí zajímavé optimalizace.
Hořím zvědavostí...

Idris

  • *****
  • 2 271
    • Zobrazit profil
    • E-mail
Re:Je Rust jazyk budoucnosti?
« Odpověď #338 kdy: 06. 12. 2022, 12:00:08 »
Tam bude zajímavější i ten vygenerovaný kód, protože s typem Nat se pojí zajímavé optimalizace.
Hořím zvědavostí...
Však si to přelož.

Re:Je Rust jazyk budoucnosti?
« Odpověď #339 kdy: 06. 12. 2022, 12:08:38 »
@Králík: Obdivuju tvoji trpělivost...
@Idris: S tímhle přístupem "udělám ze všech debily" moc nových zájemců o funkcionální programování asi nevytvoříš - co přesně je tvůj cíl?

Re:Je Rust jazyk budoucnosti?
« Odpověď #340 kdy: 06. 12. 2022, 14:59:49 »
Ještě pro zajímavost přidám odkaz na jazyk Carp - staticky typovaný lisp-like jazyk s memory management á la Rust (lineární typy / move semantics / borrowing, i když omezenější).

Na stránce o memory managementu mají hezkou ukázku, jak move semantics v jazyce bez GC potřebují od typového systému, jak jsem naznačoval, ještě jednu informaci - tj. vlastnost "má destruktor".

Idris

  • *****
  • 2 271
    • Zobrazit profil
    • E-mail
Re:Je Rust jazyk budoucnosti?
« Odpověď #341 kdy: 06. 12. 2022, 15:18:56 »
Na stránce o memory managementu mají hezkou ukázku, jak move semantics v jazyce bez GC potřebují od typového systému
Jako v Mercury. Jo, mít u typů multiplicitu se hodí.


BoneFlute

  • *****
  • 1 960
    • Zobrazit profil
Re:Je Rust jazyk budoucnosti?
« Odpověď #342 kdy: 06. 12. 2022, 15:35:59 »
Ten typový parametr rozměru se tam prostě zpropaguje jak v C tak i v JS kódu, žádný type-erasure, neměl jsem na ten výrok o type-erasure v první řadě vůbec skočit.
Jak zněl ten výrok?
->
kontrola toho typového parametru pro délku se provádí při překladu a pak se provede type erasure, v době běhu programu tam ten typový parametr vůbec není. Například Idris nebo Lean umí transpilaci do C, kde není runtime pro typy ani GC, veškerou kontrolu oddře překladač a když usoudí, že je kód typově správně, vyplivne výstup bez typových parametrů, ty právě slouží pouze ke statické kontrole.

JS kód vygenerovaný Idrisem:

Kód: [Vybrat]
function Main_getCol($0, $1, $2) {
 const $3 = Data_Nat_isLTE($0, 1000n);
 switch($3.h) {
  case 0: /* Yes */ return Main_getCol1($1, $2);
  default: return Main_getCol2($1, $2);
 }
}

$0 je velikost matice.

V Céčku je kód cca to samý, akorát mnohem výřečnější, protože úplně všechny hodnoty (i funkce) jsou boxovány do typu Value, které pak ten rozhodně-ne-interpretr, no, jaksi interpretuje :D

Tak buďme na Idrise krutí, a řekněme, že to nebylo úplně nejlépe formulováno. Ale:

Znamená to tedy, že ve výsledném kódu musí být tagy, typy, qqch? Že neprobíhá type erasure, tak nějak z principu? Že ve výsledném kódu musí být nějaké runtime, protože něco?

1/ Cítím určitý rozdíl mezi tím, když Python nebo Java jakožto dynamický jazyk narve spousta kontrol do runtime, protože nemá instrumenty na to, jak jinak. A mezi tím, že Idris by spousta typů do výsledného zdrojáku dávat nemusel, protože ty instrumenty má, ale také je ve verzi v0.6.0, a na optimalizace kašle.

2/ Také vidím určitý rozdíl mezi tím, když Idris při kompilaci oznámí, že kód je nekorektní, zatímco Java/Python by to oznámila až v runtime - a mezi tím, že Idris neprovádí optimalizace.

Jak jsem uváděl příklad s Amuletem, tam jsem se bavil tím, že opravdu optimalizoval. Z toho jsem čerpal já. Takže jsem pochopil, že to jde.

Pokud bylo tvým cílem dokázat, že Idris (jazyk) má před sebou ještě dlouhou cestu, protože neoptimalizuje kód jak by mohl - ok, máš boda.

Pokud bylo tvým cílem vysvětlit co je to type erasure, nebo jak probíhá optimalizace, nebo jaké jsou možnosti silných statických jazyků - tak to se ti nepovedlo.

Pokud bylo tvým cílem vysvětlit, že Rust je předvídatelnější (časově, paměťově) než Idris - ok, s tím nemám problém.

Dále jsem se ztratil v tom, co jsi chtěl vlastně dokazovat, promiň :-)

BoneFlute

  • *****
  • 1 960
    • Zobrazit profil
Re:Je Rust jazyk budoucnosti?
« Odpověď #343 kdy: 06. 12. 2022, 15:50:25 »
Popravdě mám dojem, že se v té teorii typů dost vyžíváte a děláte jí spíš medvědí službu.

Ano, indukční definice typu sudá čísla je pěkná ukázka. A v dalším kódu už pak opravdu můžeme mít jenom krásné garantované sudé číslo a optimalizátor tu informaci může pěkně využít.

Jenže co se stane, když načtete uživatelský vstup a bude tam číslo liché? Nějaký implicitní nebo explicitní parser musí rozhodnout, jestli ta hodnota je v pořádku nebo není a nějak zareagovat. A to je část, co se z ukázek síly funkcionálního programování typicky vypouští.
Naopak!
To je na tom právě to kouzelné, že staticky typované jazyky tě přinutí, aby si zohlednil situaci když je to číslo liché. To je právě ta smetana, po které toužíme. Garance.

Vysokoúrovňové informace pro optimalizátor nejsou navíc nezbytně omezeny jen na funkcionální jazyky. Ada a Eiffel mají třeba design by contract (= vstupní podmínky pro parametry), ostatní jazyky budou mít nějaký interface pro next, stream, iterátory nebo cokoliv podobného. (Lazy generátor v Haskellu interně stejně nic jiného nedělá). Dneska s LLVM a LTO se navíc optimalizace často dělají až nad mezikódem.
compile time?

Idris

  • *****
  • 2 271
    • Zobrazit profil
    • E-mail
Re:Je Rust jazyk budoucnosti?
« Odpověď #344 kdy: 06. 12. 2022, 15:54:01 »
Ano, indukční definice typu sudá čísla je pěkná ukázka. A v dalším kódu už pak opravdu můžeme mít jenom krásné garantované sudé číslo a optimalizátor tu informaci může pěkně využít.

Jenže co se stane, když načtete uživatelský vstup a bude tam číslo liché? Nějaký implicitní nebo explicitní parser musí rozhodnout, jestli ta hodnota je v pořádku nebo není a nějak zareagovat. A to je část, co se z ukázek síly funkcionálního programování typicky vypouští.
Naopak!
To je na tom právě to kouzelné, že staticky typované jazyky tě přinutí, aby si zohlednil situaci když je to číslo liché. To je právě ta smetana, po které toužíme. Garance.
Přesně tak.