Haskell vs. Racket, statická vs. dynamická kontrola, eval Flashcards
(eq? v1 v2) vracia #t ak
v1 a v2 odkazujú na ten istý objekt,
inak vracia #f.
(eq? “Ahoj” “Ahoj”) #t
(eq? “ab” (string-append “a” “b”)) #f
(eq? (cons 1 2) (cons 1 2)) #f
(equal? v1 v2) pre typy ako reťazce, páry, meniteľné páry, a iné porovnáva …
podľa obsahu. Pre páry je rovnosť rekurzívna.
(equal? “Ahoj” “Ahoj”) #t
(equal? “ab” (string-append “a” “b”)) #t
(equal? 2 2.0) #f
(= v1 v2) vracia #t práve vtedy ak
v1 =v2. Akv1 av2 niesú
čísla, vráti chybu
Co je to symbol?
atomická hodnota, ktorá sa vypisuje ako identifikátor so symbolom ’ na začiatku.
Ako vieme zistit ci je nieco symbol?
(symbol? ’a) #t
Co robi string->symbol?
konvertuje reťazec s na symbol ’s.
Ake zlozite je porvnanie symbolov podla eq? a equal?
O(1)
Co robi eval?
umožňuje vytvoriť za behu nové dáta a potom tieto dáta zmeniť na program a vykonať ho
(eval ’(print “Ahoj”))
Co je to quote?
(quote v) je to isté ako ’v
quote zabráni interpretácii symbolov ako identifikátorov a zoznamov ako volaní funkcií
* (quote apple) ’apple
* (quote (1 2 . (3))) (1 2 3)
* (quote 42) 42
Co je to quasiquote a unquote?
(quasiquote v) je to isté ako ‘v
(unquote v) je to isté ako ,v
quasiquote pracuje podobne ako quote, ale pokiaľ narazí na (unquote v), tak vyhodnotí v a nahradí ním (unquote v).
Co vyuzivame v JS? podobne ako quasiquote?
string interpolation
* var n = 42;
* “foo${n}bar” “foo${n}bar”
* ‘foo${n}bar‘ “foo42bar”
Haskell vs Racket
Haskell je akoby podmnožina Racketu. Existujú programy, ktoré Haskell neskompiluje ale Racket áno, ale obsahujú chyby
V haskelli nepotrebujeme funkcie ako number?
v rackete vieme vracať rôzne typy
Aký je Racket z pohľadu Haskell programátora?
Racket akoby mal jeden veľký dátový typ RT. Všetky hodnoty sú práve tohto typu RT:
Co je to staticka kontrola?
akákoľvek činnosť, ktorej úlohou je zamietnuť zlý program po tom, ako sa úspešne sparsoval (vytvoril sa AST), ale ešte pred tým, než sa spustí.
AKé sú nástroje pre dodatočnú statickú kontrolu?
napr. lint
Čo kontroluje statická typová kontrola?
- nájsť chyby ako nesprávne typy argumentov 4/”2”, f v, a f nie je funkcia, if za ktorým nie je bool. výraz, . . .
- vynútenie abstrakcie
- vyhnúť sa kontrole za behu
Ako mozu dynamicky typované jazyky môžu robiť určité stat. kontroly?
použitie nedefinovanej premennej
v jazyku Haskell stat. kontrola nedeteguje nasledovné chyby:
- zavolanie head na prázdnom zozname
- delenie nulou
žiadna statická kontrola nemôže detegovať logické chyby:
- preklep v názve premennej: x namiesto y
- nesprávna podmienka v if
- nesprávny algoritmus
toto si musíme vyriešiť sami :)
Co je ulohou statickej kontroly?
diagnostikovať, či má program chorobu X . Program má chorobu X, ak existuje vstup, na ktorom spraví X.
kedy je staticka kontrola korektna (sound) vzhladom na X?
ak deteguje každý program chorý na X a neprepustí ho
* žiadne falošne negatívne výsledky testov
stat. kontrola je úplná (complete) vzhľadom na X , ak …
každý program, ktorý netrpí X, prejde kontrolou bez nálezu X * žiadne falošne pozitívne výsledky testov
Co je problem s nerozhodnutelnostou pre staticku typovu kontrolu?
Statická kontrola pre skoro každé netriviálne X nemôže súčasne spĺňať nasledovné podmienky:
* je korektná (sound) vzhľadom na X
* je úplná (complete) vzhľadom na X
* na každom programe skončí v konečnom čase
Inak povedané, to, či program trpí X je nerozhodnuteľný problém skoro pre každé netriviálne X.
Kedze chceme aby kompilator vzdy skoncil, od coho upustime?
musíme upustiť od korektnosti alebo úplnosti. Upustime teda od korektnosti
Co spravime ked upustime od korektnosti?
- Vložíme dyn. kontrolu, ktorá bude za behu kontrolovať, či sa nejde udiať X. Ak áno, program zastavíme a vyhlásime chybu.
- Povolíme, aby sa stalo X, aj keď v niektorých prípadoch tomu vieme zabrániť. (Napr. delenie nulou vráti ∞.)
Co je vacsinou zachrana pred nedefinovanym spravanim, alebo chybami po statickej kontrole?
Dynamicka kontrola
Prečo niektoré jazyky nerobia ani statickú, ani dynamickú kontrolu?
- zjednodušuje to implementáciu kompilátora/interpretera
- vynechanie dynamických kontrol zvyšuje rýchlosť
- kompilátor negeneruje do kódu informácie potrebné (napr. veľkosť poľa) pre dyn. kontrolu (šetrí sa priestor a výkon)
Preco ale treba robit kontroly?
Ludia vacsinou chybuju castejsie ako pocitace
Opis kontrolu v jazyku racket
slide 14
Opis kontrolu v javascripte
slide 15
Co je vyhoda dynamickej kontroly?
Je praktickejsia
štandardne dovoľuje heterogénne zoznamy, funkcie vracajúce String alebo Integer
statická kontrola: viac práce, musíme zaviesť vlastný typ
dataT= I Int | S String
Co je vyhoda statickej kontroly?
Je praktickejsia :D
Pri statickej kontrole môžeme predpokladať, že argumenty majú správny typ.
Pri dynamickej kontrole musíme ručne kontrolovať typ argumentu na začiatku funkcie
Co ma racket kvoli absencii statickej typovej kontroly?
systém kontraktov (nespomínali sme)
Co je nevyhoda statickej kontroly?
Každá zložitejšia korektná statická kontrola nie je úplná, t.j. odmieta niektoré rozumné programy.
Co umoznuje staticka kontrola?
značkovanie (tagging)
tagging všetkých hodnôt pri dynamickej kontrole stojí čas, priestor a prináša neskorú detekciu chýb.
mozeme si vytvorit vlastny typ a znackovat (napr aj ten typ RT)
Aká kontrola generuje rýchlejší kód? Prečo?
Statická kontrola
podpora za behu (runtime):
* nemusí ukladať značky (tags)
* nemusí kontrolovať značky
Ako vieme zrýchliť dynamickú kontrolu?
implementácia jazyka:
* môže využívať rôzne optimalizácie k odstráneniu
zbytočných dynamických kontrol.
vlastný zdrojový kód:
* nemusí ručne obchádzať obmedzenia typového systému
Ako ulahcuje dynamicka kontrola znovupozitelnost kodu?
Bez obmedzujúceho statického typového systému sa dá viac kódu znovupoužiť s iným typom dát.
Ako ulahcuje staticka kontrola znovupozitelnost kodu?
generics, ad-hoc polymorfizmus, hierarchie tried,…
statická typová kontrola umožňuje:
* použiť rôzne typy pre rôzne koncepty
* zabrániť nesprávnemu použitiu knižníc
Ako je dynamicka kontrola lepsia pre prototypovanie?
dynamická kontrola umožňuje spustiť aj nekompletný program, ktorý neošetruje všetky prípady
statická kontrola vyžaduje ošetrenie všetkých prípadov
Ako je staticka typova kontrola lepsia pre prototypovanie?
Statický typový systém pomáha pri prototypovaní:
* dokumentovať dátové štruktúry a kontrolovať ich správne použitie
* uistiť sa, že sa na nič nezabudlo (case)
* či sa omylom v novom kóde nespoliehame na nesprávne predpoklady
Co ak nemame nieco implementovane, co vlozime?
_ -> error “Not implemented”
Ako je dynamicka kontrola lepsia pre udrzbu?
Môžeme kód spraviť všeobecnejší bez ovplyvnenia všetkých existujúcich volajúcich miest.
Ako je staticka kontrola lepsia pre udrzbu?
Keď sa zmení dátový typ alebo časť programu, tak statická kontrola typov vráti zoznam miest, na ktorých treba niečo opraviť.
* predchádza zaneseniu chýb