436
Vývoj / Re:Kotlin nebo Scala pro backend?
« kdy: 03. 11. 2020, 14:35:58 »Chapu co rikas, ale nejak nechapu souvislost s tim co citujes.
Co jsi tedy myslel timhle:
kontrolovat typy pri kompilaci je trochu pozde ze?
Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.
Chapu co rikas, ale nejak nechapu souvislost s tim co citujes.
kontrolovat typy pri kompilaci je trochu pozde ze?
S tim sem si nikdy nehral...
Pouzivam https://clojure.org/guides/spec obcas... a kdysi sem si hral s https://github.com/arohner/spectrum.
Ale hlavne RDD (repl driven development) prece jenom kontrolovat typy pri kompilaci je trochu pozde ze? (:-D)
Teď se Ti myslím povedla demonstrace jedné ze skutečných výhod výjimek, která ale může fungovat asi jenom v dynamických jazycích typu Pythonu - ten context manager pozná výjimku podle parametru, který ji identifikuje.
Jinak je to věc, která se dá řešit destruktorem při výstupu z rozsahu platnosti proměnné - třeba v Rustu se udělá drop v opačném pořadí (vzhledem k pořadí definice proměnné) automaticky a je vymalováno taky.
Obávám se, že rozhodně nemohu souhlasit. Už jsem tu toto téma někdy rozebíral, žel neúspěšně. Má aktuální úroveň poznání mi říká, že dynamické jazyky nepřináší nic co by principielně nešlo ve statických jazycích (a stáli bychom o to). Každopádně, asi zůstaňme u tématu.
Kód: [Vybrat]# Python
with open('dog_breeds.txt') as src, threading.Lock(), db.connection() as con:
con.insert(src.readlines())
(GoLang má defer, což je něco podobného ale hnusnějšího.)
Řekl bych, ty tak docela nepotřebuješ rozlišovat co může selhat a co ne. Jako spíše zajistit tu atomicitu.
Ten with řeší dvě věci, automaticky uzavřít zdroj, když něco selže, a rollback při chybě v bloku.
Tohle je zatím nejhezčí s čím jsem se setkal.
To “zahodit” znamená, že výpočet se v monádě dostane na vedlejší kolej. Ten kód oddělený není, jen pracuje v rámci složitějšího typového systému. BoneFlute má pravdu, že to je v podstatě zdarma.No podle mě zas tak ne. Třeba v Haskellu je kód s efekty oddělený od kódu bez efektů. Takže by, teoreticky, napřed došlo k výpočtu finálního stavu a pokud by výpočet prošel, došlo by k jeho zápisu. Že by ten zápis byl chráněn transakcí, je jasné, ale to už by si ta low level část systému musela pohlídat sama...Takže jsi myslel trasakčnost na úrovni jazyka a to včetně externích závislostí. Zajímavé.
Zajímavé je, jak by se něco takového provedlo v čistě funkcionálním kódu.
To mi moc zajímavé nepřijde. Funkcionální kód nemá efekty. Tudíž transakce je jednoduchá - zahodit ;-) (Tady trochu provokuju.)
Takže jsi myslel trasakčnost na úrovni jazyka a to včetně externích závislostí. Zajímavé.
Zajímavé je, jak by se něco takového provedlo v čistě funkcionálním kódu.
To mi moc zajímavé nepřijde. Funkcionální kód nemá efekty. Tudíž transakce je jednoduchá - zahodit ;-) (Tady trochu provokuju.)
Já dělal několik let ve Scale, a možná bych víc doporučil Kotlin, ve kterém jsem nedělal nikdy :-) Scala je dost složitý jazyk s featurami (hlavně implicity), u kterých není bez zkušeností moc jasné, jak je správně používat. Řekl bych že mi trvalo alespoň rok než jsem v ní začal dělat jakžtakž idiomaticky. A i to je dost relativní, protože má více táborů - lidi, co jí považují za lepší Javu (a těm bych opravdu doporučil Kotlin), a lidi co jedou hardcore FP (používají knihovny jako cats nebo scalaz, nebo nedejbože shapeless), a to FP je zas mnohem líp vidět a snáz a čistěji se naučí v jazycích jako je Haskell. Navíc se těžko shání spolupracovníci.
Ale jestli máš chuť, určitě ti Scala hodně dá. A jako staticky typovaný, rel. rozšířený FP jazyk nad JVM asi nejsou moc lepší volby.
No jo no, to už jsou ale zase ty monády. A ani to není moc hezký.
Možná, abych se lépe vyjádřil:
Rozhodně očekávám, že když mi kompilátor přeloží kód, tak že mi zajistí, že všechny chybové stavy jsou pokryty. Což pochopitelně Result splňuje.
Jenže stejně jako od jazyka očekávám, že si validitu vstupů nebudu hlídat sám, ale že mi to bude hlídat jazyk - třeba pomocí typů; tak stejnou logikou očekávám, že mi jazyk usnadní práci s chybami. A ne, že si to budu řešit sám pomocí jiných konstruktů jazyka.
Zde jsem možná nedovzdělán. Jak by si přepsal následující kód:Rust jsem uváděl jako příklad jazyka s hezkými chybovkami, ale výjimky nemá. A já jsem se z počátečního nadšením nad Maybe/Result vystřízlivěl zase zpět k výjimkám.
Asi jsi chtěl napsat Either/Result. Co přesně Tě vedlo k "vystřízlivění"? Na ergonomii práce s Result (Error) se udělal kus práce - viz třeba crate anohow.Kód: [Vybrat]if (((countOfFilesIn(dir1) + countOfFilesIn(dir2)) / countOfFilesIn(dir3)) == 0) { ... }
Dělení nulou, špatná cesta, odmítnuté právo pro čtení z adresáře.
use std::fs::read_dir;
use anyhow::{anyhow, Result, Context};
use std::path::Path;
fn count_of_files(path: &str) -> Result<usize> {
let dirs = read_dir(path)?;
Ok(dirs.count())
}
fn safe_divide(dividend: usize, divisor: usize) -> Result<usize> {
if divisor == 0 {
Err(anyhow!("Zero divisor, check it dude"))
} else {
Ok(dividend / divisor)
}
}
fn hausnumero(first: usize, second: usize, third: usize) -> Result<usize> {
safe_divide(first + second, third)
}
fn main() -> Result<()>{
let hausn: usize = hausnumero(count_of_files("AAA").context("First dir")?,
count_of_files("BBB").context("Second dir")?,
count_of_files("CCC").context("Third dir")?)?;
println!("Result: {}", hausn);
Ok(())
}
Rust jsem uváděl jako příklad jazyka s hezkými chybovkami, ale výjimky nemá. A já jsem se z počátečního nadšením nad Maybe/Result vystřízlivěl zase zpět k výjimkám.
Asi jsi chtěl napsat Either/Result. Co přesně Tě vedlo k "vystřízlivění"? Na ergonomii práce s Result (Error) se udělal kus práce - viz třeba crate anohow.
Rust jsem uváděl jako příklad jazyka s hezkými chybovkami, ale výjimky nemá. A já jsem se z počátečního nadšením nad Maybe/Result vystřízlivěl zase zpět k výjimkám.
Ahoj, díky za názory a odkazy na různé materiály. Jsem z toho právě takovej roztěkanej - čím víc možností tím se mi hůř rozhoduje, rád bych uměl všechno ale času na to tolik mít nebudu - můžu se tomu věnovat maximálně 2-3 hodiny denně.
Mám teď pár nápadů na jednoduché webové aplikace které bych chtěl zhmotnit.
Zkoušel jsem si například pár základních věcí v PHP a přišlo mi to takové jednoduché (třeba proti Jave) ovšem názory na internetu ohledně PHP jsou takové rozporuplné (možná spíš až negativní).
Vím že výběr jazyka není rozhodující ale pokud chci věnovat nečemu čas a usílí tak bych chtěl aby mě to někam posunulo, například a to mě opravte okud se pletu:
Když budu chtít vytvořit nějakou webovou aplikaci budu potřebovat HTML+CSS+JS+PHP - ale z tohohle hlediska mi přijde lepší využit node js místo PHP protože se tím naučím syntaxi JS pro vytváření front endu (rozumnější by to asi bylo spíš obráceně). Pak když nad tím přemýšlím tak backend jde udělat i v Javě tak proč ztrácet čas s PHP nebo node js a prostě se to vše naučit v Javě.
Omlouvám se asi to moc řeším, jen v tom chci nějak zorientovat a efektivně využít svůj čas.
ukaz mi konkretni chybu, kterou Rust detekuje a bezne pouzivane lintery/kompilery nedetekuji. Podle me se vsechny takove chyby tykaji spravy pameti a soubezneho pristupu do pameti v paralelnich programech. Takove chyby hrozi jen v urcitem typu aplikaci. Kdyz pouzivas model pararelismu zalozeny na posilani zprav/komunikaci pomoci front a jazyk s GC, nic takoveho nemuze nastat.