Je to ošetřený a rozhodnutý v době překladu. To je to co mě zajímá.
Nevím, jestli jsme si tady rozuměli. V době překladu víš jenom to, že
1. z externího zdroje dostaneš posloupnost bajtů (vstup uživatele nebo síťový packet)
2. víš, že bys chtěl, aby ta posloupnost bajtů byl nějaký typ (např. integer zakódovaný jako string)
Jestli se tvoje "compile time přání" v run time splní nebo ne - to není nic jiného než dynamické typování.
To zase prrr. Máme 3 funkce, read_int(), print_int() a main(). Napíšu to v pseudokódu volně inspirovaném Rustem:
func read_int(s: stream) -> Result<int, str> {
buf = stream.read();
if len(buf) == 8
Ok(buf.to_integer())
else
Err("Invalid size, cannot convert to integer")
}
func print_int(i: int) {
print("Valid integer {}", i)
}
func main() {
s = open_stream();
match read_int(s) {
case Ok(i) print_int(i)
case Err(s) print("Error on input: {}", s)
}
}
Tam nikde žádný dynamický typ není - validace vstupu je ošetřena algebraickým datovým typem. S tímhle se dá pracovat donekonečna. Možnost invalidního/variabilního vstupu zesložiťuje logiku, ale pokud tam nemáme dynamickou deserializaci, která umožňuje načíst zcela libovolné typy ze streamu, statické typování není ohroženo.