Naprosto. Až budeme mít geniální strictness analýzu a optimalizátory, tak to nebude potřeba.
Až budeme mít růžové slony schopné psát dokonalý kód v assembleru, nebou žádné optimalizátory potřeba.
Přesně. A do té doby je docela rozumné mít možnost vysvětlit kompilátoru JAK chceš daný kód vykonávat. What's the problem?
Ale podobné "prasárny" z jiných jazyků - unboxed values v Javě (int, double, float, short...).
Máš v tom trochu hokej, prasárna je spíš boxování.
Aha... jasně. Tak si zkus udělat Nějaké generikum s unboxovaným číslem. Nejde to. Proč? Protože unboxované čísla tam máme z toho důvodu, protože jinak by to bylo tragicky pomalý. Tak trochu to likviduje čistotu jazyka...ale co se dá dělat....
Používání objektů na stacku v C++
Tady ses úplně odkopal, objekty na stacku jsou skvělá věc. Jiné jazyky včetně Haskellu se taky snaží co nejvíc objektů alokovat na stacku, používají na to escape analysis (která samozřejmě není dokonalá), v C++ si můžeš explicitně zvolit, jestli objekt vytvoříč na stacku nebo na heapu.
Ale ten problém je, že to já jako uživatel musím vůbec řešit. Ty si stěžuješ, že haskellu musíš říct, jestli má použít foldl nebo foldl', a třeba v C++ tohle musíš pořád řešit taky - kde použít smart pointry, různý to opičárny v operátorech, aby se odkazovalo, kde se odkazovat má, nekopírovalo, kde se nekopírovat nemá... a najednou říct překladači, že má použít strict je problém? Máš psa a chceš ho bít?
, opičárny s dereferencema a příšerný pravidla, aby se zbytečně nealokovaly/nekopírovaly objekty (kdo TOHLE vymyslel...?). Pointer aritmetika v C. Různé bytearray/buffer apod. v pythonu.
Jasně, tohle nejde proti "čistotě filosofie", protože tyhle jazyky žádnou filosofii nemaj...
Je potřeba podívat se na věci v historickém konceptu. Pointery vznikly kdysi dávno ještě před C, v podstatě už na úrovni strojového kódu. Ví se, že pointery a poiterová aritmetika jsou nebezpečná věc. Většina jazyků se s tím snaží v průběhu času něco dělat a situaci zlepšovat (reference, smart pointery...). V Rustu na raw pointer mimo unsafe kód nenarazíš, v C++ byla docela přelomová verze C++11. Od C++11 raw pointery prakticky nemusíš používat. Vývoj jde tak nějak správnou cestou dopředu. Haskell do dělá opačně, na začátku to udělali správně (lazy evaluation i když s vyšším overheadem), ale pak si řekli: "Je sice moc hezké, ale moc pomalé, trochu to doprasíme. Doděláme strict evaluation.".
[/quote]
Je strašně hezké, že máme objekty v Javě, ale je to moc pomalé. Trochu to doprasíme, uděláme unboxed čísla. Je strašně hezké všude dělat kopie v C++, ale trochu to doprasíme, uděláme odkazy..... Ale pokračujme dál: volatile. Různé bariéry v multithreadovaných programech.
Všechny tyhle jazyky ti evidentně umožňují ovlivnit způsob vykonávání kódu - a to jsou založeny na tom, že to, co napíšeš, se v podstatě přesně vykoná. A i tak v tom málu, kde ten kompiler může improvizovat, ti to umožňují. Haskell je založen na úplně jiných principech, kompiler může improvizovat na mnohem vyšší úrovni - a najednou je "špatně", že můžeš ovlivnit způsob vykonávání kódu? Protože haskell má - na rozdíl od ostatních - "čistou filosofii", a lopata řekla, že by to byl hřích porušit?