Jak validovat DTO v dynamicky typovaném jazyce?

BoneFlute

  • *****
  • 1 823
    • Zobrazit profil
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #30 kdy: 24. 01. 2022, 04:09:39 »
Vycházím z, možná nesprávného předpokladu, že když budu mít následující dvě proměnné:
Kód: [Vybrat]
a = "string"
b = 42
test(x) {
  print("typ: {x.type}")
}
test(a) // typ: string
test(b) // typ: number

Tak se budou chovat stejně bez ohledu na to zda je jazyk silně nebo slabě typovaný.
Jenže typeof je jen v silných typových systémech. To je právě ten problém.
Měl jsem za to, že Javascript je slabě typovaný. Stejně tak PHP, VisualBasic.
Uveď příklad jazyka, který tedy nemá typeof (slabě typovaného dle tvé definice)?

Ale to jsme dost odbočili, jen jsem chtěl říct, že dynamičnost a síla typového systému jsou dvě různé dimenze, které slouží dvěma nezávislým cílům, zajistit typovou bezpečnost a efektivní překlad či interpretaci. Pokud je jazyk staticky nebo silně typovaný, je obojího dosaženo, i když splňuje jen jednu z těch podmínek.
V Javě se to dělá tak, že VM oficiální typy zahodí, a odvozuje si svoje.

Každopádně uznávám, že problematice jak typy zlepší efektivitu překladu jsem se nikdy moc nevěnoval. Pro mě jsou jazyky bez statické kontroly nedostatečné obecně (rozuměj, fakt nemám náladu honit chyby v run time).

Typová bezpečnost u dynamického jazyka znamená co konkrétně?

Pokud je jazyk staticky nebo silně typovaný, je obojího dosaženo, i když splňuje jen jednu z těch podmínek.
V tomto se žel neshodnem. Je-li jazyk staticky typovaný, přináší to jasné a měřitelné bezpečnostní výhody. Je-li jazyk dynamicky silně typovaný, nejsem si vědom žádných výhod (co se té silně typovanosti týče) které by stály za řeč.
Ale rád se nechám přesvědčit.

Poznámka na závěr: Jak jsem si ověřoval zdroje, zda snad nekecám blbosti, tak jsem nabyl dojem, že zásadní problém je v tom, že slabě typovaný jazyk (= ve smyslu jazyka, kde by prostředí v daném okamžiku nevědělo jakého je ten který prvek typu, a nemohlo by vesele optimalizovat jak jsi mě poučil) možná ani neexistuje. Tudíž klauzule, že jazyk XY je silně typovaný je jen tak pro parádu.


Idris

  • *****
  • 1 878
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #31 kdy: 24. 01. 2022, 05:02:30 »
Každopádně uznávám, že problematice jak typy zlepší efektivitu překladu jsem se nikdy moc nevěnoval.
To je škoda, je to zajímavé a aktuální téma. Proč je asi v průměru Julia rychlejší než Rust (nápověda: multidispatch)?
Typová bezpečnost u dynamického jazyka znamená co konkrétně?
To samé jako u staticky typovaného, že kód jde otypovat tak (ručně nebo inferencí), že v době běhu není nutné zkoumat typy objektů pro hladký běh. V teorii překladačů se pracuje v souvislosti s typy s několika pojmy, kód může být typově stabilní (to pomáhá optimalizaci, ale nezajišťuje bezpečnost) nebo typově ukotvený (to zajištuje bezpečnost). Ovšem čím silnější typový systém, tím horší vyčíslitelnost (u hodně silných typových systémů z principu nefunguje inference typů, ale i v Haskellu stačí napsat jednoduchou polymorfní rekurzi a překladači jebne). Je to něco za něco, já třeba osobně taky upřednostňuju silný typový systém se zevrubnou kontrolou v době překladu, ale dobře se mi psalo i v ObjC (tom starém, předswiftím). Navíc od určité síly typového systému se už nedá v kódu přesně rozlišovat mezi dobou překladu a běhu, protože na typové úrovni můžu pracovat s hodnotami při překladu a na úrovni exekuce kódu s typy. Přidej GADT a je z toho dokonalý guláš, kde typová kontrola není o přiřazování/ověřování typů, ale převedení celého programu do formální logiky a prozkoumání, zda je v teorii spor (proto taky jdou vracet z funkcí instance typu Vect n T vytvořené za běhu na základě nekonstantní hodnoty n).
Je-li jazyk staticky typovaný, přináší to jasné a měřitelné bezpečnostní výhody.
Jasně, výhoda je, že se více chyb odhalí již při překladu. Proto ostatně vznikly Typescript nebo Dart, ty jsou sice v jádru dynamické, ale typy při překladu umí kontrolovat.

BoneFlute

  • *****
  • 1 823
    • Zobrazit profil
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #32 kdy: 24. 01. 2022, 05:29:53 »
Typová bezpečnost u dynamického jazyka znamená co konkrétně?
To samé jako u staticky typovaného, že kód jde otypovat tak (ručně nebo inferencí), že v době běhu není nutné zkoumat typy objektů pro hladký běh.
To máš se mnou těžké, když já si představuju, že poté, co kompilátor vyplivne program, tak v něm jsou všechny typy odstraněný jako zbytečný, a jsou ponechaný jen ty nutný pro dynamic dispatch, a to ještě jenom v případě věcí jako je kolekce podtypů...
Zatímco u dynamického jazyka všechny typy musí zůstat, protože je třeba umožnit, aby to ve čtvrtek na produkci zbuchlo až tam Franta zapíše int věk="starej". (Ano, slyšel jsem o JIT.)

Ink

  • ****
  • 494
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #33 kdy: 24. 01. 2022, 07:22:44 »
To je škoda, je to zajímavé a aktuální téma. Proč je asi v průměru Julia rychlejší než Rust (nápověda: multidispatch)?

Jakým způsobem multidispatch urychluje běh programu? Už jsi to psal dřív, ale mně to úplně smysl nedává...

Idris

  • *****
  • 1 878
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #34 kdy: 24. 01. 2022, 09:11:14 »
Typová bezpečnost u dynamického jazyka znamená co konkrétně?
To samé jako u staticky typovaného, že kód jde otypovat tak (ručně nebo inferencí), že v době běhu není nutné zkoumat typy objektů pro hladký běh.
To máš se mnou těžké, když já si představuju, že poté, co kompilátor vyplivne program, tak v něm jsou všechny typy odstraněný jako zbytečný, a jsou ponechaný jen ty nutný pro dynamic dispatch, a to ještě jenom v případě věcí jako je kolekce podtypů...
Zatímco u dynamického jazyka všechny typy musí zůstat, protože je třeba umožnit, aby to ve čtvrtek na produkci zbuchlo až tam Franta zapíše int věk="starej". (Ano, slyšel jsem o JIT.)
Tak ono to tak zhruba bývá, ten rozdíl je, že ten rozbíjející let donutí JIT znovu přeložit kód a jelikož program není typově správně, vyplivne nějaký pomalý hnus. Na webu jsou příklady, jak změny v typových anotacích enormně ovlivňují generovaný stroják (sám jsem se setkal s více než desetinásobným zpomalením kvůli jednomu špatně uvedenému typovému parametru). Všichni mají zažité, že dynamické jazyky musí být pomalé, protože Python, Ruby nebo JS jsou šneci, ale když všechny typové anotace sedí, překladač může generovat rychlý kód (teď už máme empirický důkaz), ale stejně je IMHO v obecném případě lepší použít třeba Rust nebo Go se statickým typováním, Julia je navržená jako v podstatě DSL nahrazující Matlab, R a Python pro ML apod., na nasazení v jiné oblasti to moc není. Jen je prostě zajímavé pochopit, jak v tomto podivném jazyce funguje typový systém a díky němu překladač.


Idris

  • *****
  • 1 878
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #35 kdy: 24. 01. 2022, 09:14:33 »
Jakým způsobem multidispatch urychluje běh programu? Už jsi to psal dřív, ale mně to úplně smysl nedává...
To jsem nikdy nepsal, ani teď, jen to, že umožňuje velice efektivní optimalizaci výsledného kódu, pokud je program správně otypovaný (o tom je řada článků na konferencích jako POPL, co to je typově ukotvený program a jak ovlivňuje výsledný stroják).

Ink

  • ****
  • 494
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #36 kdy: 24. 01. 2022, 10:39:50 »
Jakým způsobem multidispatch urychluje běh programu? Už jsi to psal dřív, ale mně to úplně smysl nedává...
To jsem nikdy nepsal, ani teď, jen to, že umožňuje velice efektivní optimalizaci výsledného kódu, pokud je program správně otypovaný (o tom je řada článků na konferencích jako POPL, co to je typově ukotvený program a jak ovlivňuje výsledný stroják).

Vždyť jsem ale citoval tuhle Tvoji větu:

Proč je asi v průměru Julia rychlejší než Rust (nápověda: multidispatch)?

Ta nápověda teda měla říct něco jiného, než že MD pomáhá výkonu?

Každopádně mě teda to Tvoje tvrzení o rychlejší Julii nadále dráždí, asi si to někdy prozkoumám.

Idris

  • *****
  • 1 878
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #37 kdy: 24. 01. 2022, 10:55:13 »
Jakým způsobem multidispatch urychluje běh programu? Už jsi to psal dřív, ale mně to úplně smysl nedává...
To jsem nikdy nepsal, ani teď, jen to, že umožňuje velice efektivní optimalizaci výsledného kódu, pokud je program správně otypovaný (o tom je řada článků na konferencích jako POPL, co to je typově ukotvený program a jak ovlivňuje výsledný stroják).
Každopádně mě teda to Tvoje tvrzení o rychlejší Julii nadále dráždí, asi si to někdy prozkoumám.
To je vidět :) Ale taky tě dráždí, že je Porsche rychlejší než kombajn? Je to prostě empiricky podložený fakt, mě to taky překvapuje a sám to “prozkoumávám”, což jde celkem lehce, protože oba překladače používají LLVM. Určitě znáš rustí Egg, který, pamatuji-li se dobře, vyhrál (resp. jeho design) i nějaké ceny na akademických konferencích. Tak stejný algoritmus pro e-grafy je v Julii rychlejší ;)

Ink

  • ****
  • 494
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #38 kdy: 24. 01. 2022, 11:23:17 »
Každopádně mě teda to Tvoje tvrzení o rychlejší Julii nadále dráždí, asi si to někdy prozkoumám.
To je vidět :) Ale taky tě dráždí, že je Porsche rychlejší než kombajn? Je to prostě empiricky podložený fakt, mě to taky překvapuje a sám to “prozkoumávám”, což jde celkem lehce, protože oba překladače používají LLVM. Určitě znáš rustí Egg, který, pamatuji-li se dobře, vyhrál (resp. jeho design) i nějaké ceny na akademických konferencích. Tak stejný algoritmus pro e-grafy je v Julii rychlejší ;)

1. Rust není kombajn, Rust je jazyk, který by z principu měl být jeden z nejrychlejších, co se běhu týče. Pokud někdy není, je někde prostor pro zlepšení. Je samozřejmě otázka, o kolik ten konkrétní use case je rychlejší.

2. Tu Tvoji empirii nevyvracím, ale když to zkouším googlit, moc vodítek nebo důkazů nenacházím.

3. Egg neznám, natož abych mohl konkrétní implementaci toho algoritmu rychle srovnat s implementací v Julii a něco z toho vyvodit. Ale dík aspoň za tenhle hint. Pokud máš něco dalšího, čeho se chytit, byl bych docela rád.

Idris

  • *****
  • 1 878
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #39 kdy: 24. 01. 2022, 11:23:32 »
Ta nápověda teda měla říct něco jiného, než že MD pomáhá výkonu?
Ne, ale neříká celou pravdu, “tajemství úspěchu” tkví v typovém systému, který má (omezenou) dědičnost, varianci typů a HKT, takže ve spojení s dynamickým dispatchem umožňuje překladači extrémní optimalizace. Jaký je přínos sofistikovaného typového systému v porovnání s MD nedokážu říct (a ani nevím, jestli to vůbec jde kvantifikovat, jsou dost propletené). Druhým faktorem jsou ad hoc optimalizace, které překladač dělá hlavně nad typy v době překladu, například u Union apod. Překladač Rustu neznám tak podrobně, ale mám za to, že většinu optimalizací nechává na LLVM (bylo by fajn, kdyby to někdo potvrdil nebo vyvrátil), kde nejsou tak ad hoc, což je v tomto případě nevýhodou.

Idris

  • *****
  • 1 878
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #40 kdy: 24. 01. 2022, 11:33:23 »
Rust je jazyk, který by z principu měl být jeden z nejrychlejších, co se běhu týče.

Tu Tvoji empirii nevyvracím, ale když to zkouším googlit, moc vodítek nebo důkazů nenacházím.

Egg neznám, natož abych mohl konkrétní implementaci toho algoritmu rychle srovnat s implementací v Julii a něco z toho vyvodit. Ale dík aspoň za tenhle hint.
Tak Rust je jeden z nejrychlejších, ale má svoje limity dané designem jazyka.

Ta “empirie” je zákonitě omezená na vyzkoušené algoritmy, já třeba hodně používám různé symbolické a logické (proto ten Egg, ten se skutečně povedl). K tomu googlení — jsou nějakého starší články o designu MD a pak novější z oblasti HPC například. Na stránkách Julia computing jsou odkazy na všechny relevantní.

Jinak na to avizované “prozkoumání” je IMHO nejlepší napsat si prostě nějaký netriviální algoritmus v obou jazycích (+třeba i C++, Swiftu a Go), změřit jej na větších výstupech a u WTF rozdílů kouknout na generovaný kód. Tohle jsem dělal u toho Eggu (kromě C++, ale to doženu) a je to celkem přínosné.

Idris

  • *****
  • 1 878
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #41 kdy: 24. 01. 2022, 11:47:18 »

BTW možná to zapadlo, ale Rustu ten jazyk nijak nekonkuruje, je náhradou za R, Matlab a Python, těžko v něm někdo bude psát třeba mikroslužby nebo dokonce něco systémového (ani neumí vytvářet pořádné samostatné binárky). Mě osobně zajímají jen čistě technické aspekty překladu a optimalizace kódu. S Rustem se oblasti nasazení prolínají třeba u věci jako je Egg a dost často bude lepší napsat prostě všechno v Rustu kvůli například kontejnerizaci apod. Ale v oblasti tzv. vědeckých výpočtů jsou priority, proč si to nepřiznat, úplně jinde (kdysi kdosi se tam snažil prosadit Swift, ale asi se moc neuchytil).

Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #42 kdy: 24. 01. 2022, 11:59:08 »
Proboha... uz je tu zas BoneFlute, a zaslechl staticke typovani. Tato diskuze je timto mrtva.

Ink

  • ****
  • 494
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #43 kdy: 24. 01. 2022, 12:06:25 »

BTW možná to zapadlo, ale Rustu ten jazyk nijak nekonkuruje, je náhradou za R, Matlab a Python, těžko v něm někdo bude psát třeba mikroslužby nebo dokonce něco systémového (ani neumí vytvářet pořádné samostatné binárky). Mě osobně zajímají jen čistě technické aspekty překladu a optimalizace kódu. S Rustem se oblasti nasazení prolínají třeba u věci jako je Egg a dost často bude lepší napsat prostě všechno v Rustu kvůli například kontejnerizaci apod. Ale v oblasti tzv. vědeckých výpočtů jsou priority, proč si to nepřiznat, úplně jinde (kdysi kdosi se tam snažil prosadit Swift, ale asi se moc neuchytil).

Jasně, message received. A dík i za předchozí příspěvek.

Idris

  • *****
  • 1 878
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #44 kdy: 24. 01. 2022, 12:10:09 »
Proboha... uz je tu zas BoneFlute, a zaslechl staticke typovani. Tato diskuze je timto mrtva.
:D