Zobrazit příspěvky

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.


Příspěvky - MartinBeran

Stran: [1] 2 3 4
1
Studium a uplatnění / Re:Jak jste se naučili programovat?
« kdy: 15. 01. 2019, 16:42:08 »
Rozhodně bylo rychlejší to nadatlovat ručně. Nebyly žádné celostránkové editory, prostě jsi měl dole editační řádek, napsal jsi tam číslo řádku, kod a zmáčkl enter a program to zařadil na správné místo. Jak se to opravovalo, to už si fakt nepamatuju. Jak bys tam narval nějaký program na automatickou inkrementaci čísel řádku, to nechápu, ani nevím, k čemu by to bylo dobré. Možná na přečíslování hotového programu, ale to byl musel přečíslovat i skoky v programu a ZX tenkrát podporoval i takové prasárny, jako GOTO n, kde n byla proměnná.

Vestavěný BASIC ZX Spectra podporu automatického přečíslování neměl, opravovalo se to ručně. Nebo se dal použít nějaký vylepšený BASIC, např. Beta BASIC. Ten měl příkaz na přečíslování, který přečísloval i odkazy (GOTO, GOSUB, atd.). Ale zase se musel nahrávat z magnetofonu a zabíral místo v RAM...

2
Vývoj / Re:Co si myslíte o OOP?
« kdy: 07. 01. 2019, 21:46:49 »
Já mám takovou krásnou ukázku flexibility dynamického jazyka.
Spíš je to krásná ukázka toho, že "krása" je veskrze subjektivní pojem.

Ono by nejen této diskusi prospělo, kdyby každý diskutující rozlišoval věcné argumenty a subjektivní názory...

3
Vývoj / Re:Co si myslíte o OOP?
« kdy: 07. 01. 2019, 21:45:07 »
Jenže ideální by bylo se obejít zcela bez testů a správnost programu dokázat. To z mnoha důvodů většinou nejde. Proto se snažíme dokázat (rozhodnout na základě statické analýzy zdrojových textů, pro všechny možné vstupy a bez nutnosti program spouštět) aspoň něco. Statická typová analýza je jedním z nástrojů, jak dokázat aspoň některé vlastnosti programu. Jestliže nějaké tvrzení o programu dokážeme (v matematickém slova smyslu), tak si můžeme být jistí, že platí.

Také by mohlo být ideální obejít se bez statických typů. Bude to znamenat pouze určitou ztrátu výkonu, což v dnešní době není považováno za podstatné. Statická analýza může být (a také bývá) součástí testů.

Kupodivu i v dnešní době na výkonu často záleží. Jaký je rozdíl, když je statická analýza (nejspíš včetně typové analýzy, pokud k ní kód poskytuje dostatek informací) součástí testů a ne kompilátoru? Kromě toho, že je pak potřeba statickou analýzu v testech vůbec řešit a kompilátor tyto informace nemůže použít pro optimalizaci?

Na druhou stranu testy většinou žádné obecné tvrzení o programu nedokazují, protože je není možné napsat tak, aby pokryly úplně celý stavový prostor programu. Takže se spoléháme na to, že otestujeme některé speciální situace, v lepším případě zvolené "chytře", např. na základě znalosti kódu, v horším případě vybrané náhodně, v nejhorším případě vybrané systematicky špatně. Když testy neohlásí chybu, tak věříme, že je program dobře. Ale ve skutečnosti jsme jen ověřili, že nenastane chyba pro určitou (většinou malou) podmnožinu vstupů. A to ještě za předpokladu, že nějaká chyba v testu nezamaskuje přítomnost chyby v kódu.

Zpravidla testujeme pouze okrajové podmínky, kdy program má fungovat a kdy naopak musí vyhodit výjimku. Na znalost kódu se spoléhat nemůžeme, protože ho v době psaní testů ještě nemáme. Když testy neohlásí chybu, tak zpřesníme testy, to je základ. Nevěř testům, které projdou.

Testy není nutné psát dřív než kód. U některých je to dost nevhodné. Kdybych bral poslední dvě věty doslova, tak nevím, jak poznám, že je program připraven pro produkční nasazení.

Když mám k dispozici dva kontrolní mechanismy, které jsou do značné míry komplementární, tak se mi nezdá vhodné jeden z nich zahodit (a ještě ten s principiálně silnější vypovídací schopností) a tvářit se, že jsem zachoval stejnou úroveň kontroly.

Proto se tyto kontrolní mechanismy kombinují. Smalltalk šel cestou testování a možná proto se tolik nerozšířil. Haskell se vydal cestou statického typování, ale bez testů se také neobejde. Nejlépe jsou dnes na tom jazyky, které oba přístupy volně kombinují. Proto byly do PHP či Pythonu přidány volitelné statické typy a proto se staticky typované programy nejen dokazují, ale i testují.

Právě že se programy nedokazují, a proto se musí testovat. I staticky typované jazyky kombinují oba přístupy. Já jsem nebyl ten, kdo prosazoval, že nejsou potřeba statické typy, protože testy. A netvrdím ani to, že statická typová analýza je náhradou testů.

4
Vývoj / Re:Co si myslíte o OOP?
« kdy: 07. 01. 2019, 21:27:10 »
Při statickém typování se neobejdeš bez testů, používáš tedy dva kontrolní mechanismy. Cílem tvůrců Smalltalku bylo tyto dva mechanismy sloučit do jednoho, tedy do testů. U dynamicky typovaných jazyků jsou tedy v testech i kontroly typů.

Jenže ideální by bylo se obejít zcela bez testů a správnost programu dokázat.
To je samozřejmě hloupost a realita je přesně opačná, bez testů se neobejdeme, bez _statických_ typů ano. Statické typy mají jediné opodstatnění, výkon. Ve všem ostatním jsou nahraditelné.

Když v takovéto diskusi věta začíná: "To je samozřejmě", je to silná indikace, že následuje nepravda. Aspoň jeden věcný argument by nebyl?

Ano, bez testů se neobejdeme, protože neumíme správnost programu dokázat. Ano, bez statických typů se obejdeme, když se smířime se ztrátou výhod, které poskytují. Ne, jejich význam nespočívá jen ve zlepšení výkonu. Také nás zbavují nutnosti psát některé druhy testů a zároveň poskytují lepší záruku správnosti programu.

5
Vývoj / Re:Co si myslíte o OOP?
« kdy: 07. 01. 2019, 16:53:10 »
Při statickém typování se neobejdeš bez testů, používáš tedy dva kontrolní mechanismy. Cílem tvůrců Smalltalku bylo tyto dva mechanismy sloučit do jednoho, tedy do testů. U dynamicky typovaných jazyků jsou tedy v testech i kontroly typů.

Jenže ideální by bylo se obejít zcela bez testů a správnost programu dokázat. To z mnoha důvodů většinou nejde. Proto se snažíme dokázat (rozhodnout na základě statické analýzy zdrojových textů, pro všechny možné vstupy a bez nutnosti program spouštět) aspoň něco. Statická typová analýza je jedním z nástrojů, jak dokázat aspoň některé vlastnosti programu. Jestliže nějaké tvrzení o programu dokážeme (v matematickém slova smyslu), tak si můžeme být jistí, že platí.

Na druhou stranu testy většinou žádné obecné tvrzení o programu nedokazují, protože je není možné napsat tak, aby pokryly úplně celý stavový prostor programu. Takže se spoléháme na to, že otestujeme některé speciální situace, v lepším případě zvolené "chytře", např. na základě znalosti kódu, v horším případě vybrané náhodně, v nejhorším případě vybrané systematicky špatně. Když testy neohlásí chybu, tak věříme, že je program dobře. Ale ve skutečnosti jsme jen ověřili, že nenastane chyba pro určitou (většinou malou) podmnožinu vstupů. A to ještě za předpokladu, že nějaká chyba v testu nezamaskuje přítomnost chyby v kódu.

 Když mám k dispozici dva kontrolní mechanismy, které jsou do značné míry komplementární, tak se mi nezdá vhodné jeden z nich zahodit (a ještě ten s principiálně silnější vypovídací schopností) a tvářit se, že jsem zachoval stejnou úroveň kontroly.

6
Vývoj / Re:Co si myslíte o OOP?
« kdy: 07. 01. 2019, 15:41:42 »
K tomu mě napadá akademická otázka: Dá se pro libovolný program napsat testovací sada, která nalezne všechny chyby, jež by nalezla statická typová kontrola, a přitom nebude zahrnovat (jakkoliv zakamuflovanou) statickou typovou kontrolu?

Přeloženo: Dá se mechanismus statické kontroly nahradit jiným mechanismem statické kontroly, aniž by byl tomu prvnímu podobný? (Jestli jsem to správně pochopil, předpokládá se formální kontrola zdrojáku, ne běhová.)

Jaký má daná snaha smysl?

Reagoval jsem na tvrzení, že místo statické typové kontroly mohu použít dynamickou typovou kontrolu a testy. Statická typová kontrola zabrání určité třídě chyb v programu, protože nepovolí použití neočekávaných typů. Pokud mají být testy plnohodnotnou náhradou, měly by všechny tyto chyby odchytit taky (nepřu se o to, že testy mohou zachytit i spoustu jiných chyb, na které naopak nestačí typová kontrola). Je mi celkem jedno, jak budou testy vypadat, ale aby odpověď nebyla triviální, neměly by zahrnovat nic, co je jen převlečená statická typová kontrola přesunutá z kompilátoru do testovacího prostředí (tedy žádná statická analýza zdrojáků s použitím typových anotací).

7
Vývoj / Re:Co si myslíte o OOP?
« kdy: 07. 01. 2019, 15:32:54 »
Funkce get_peer_address() je buď metoda třídy network_socket bez parametrů, nebo je to samostatná funkce (nebo klidně metoda třídy address_extractor) s jedním parametrem typu network_socket.

Jak dostane ta "samostatná funkce", nebo třída address_extractor z toho socketu tu adresu???

Původně jsem reagoval na návrh, že výpis informací o objektu nemá dělat metoda print(), ale samostatná třída Printer. Ta se taky musí nějak dostat k informacím, které má vypsat. Třída address_extractor funguje v principu stejně.

Návratová hodnota je typu socket_address, což je polymorfní typ zahrnující IPv4, IPv6 i řetězce (používané jako jména UNIX domain socketů).

Co je to "polymorfní typ"?

https://en.cppreference.com/w/cpp/language/object#Polymorphic_objects

Testy už píšu jen na ověření chování této funkce se smysluplnými typy parametrů.

Jasně, když je to jen pro smysluplné typy parametrů, tak to vlastně testy ani nejsou.

I když vím, že get_peer_address dostane socket, musím otestovat, že ze socketu extrahuje a vrátí správnou adresu a ne nějaká náhodná data. Jenom se nemusím zabývat testováním reakce na situaci, kdy dostane něco jiného než socket, protože statická typová kontrola zajistí, že to nemůže nastat.

8
Vývoj / Re:Co si myslíte o OOP?
« kdy: 06. 01. 2019, 20:08:47 »
Takových typů je nekonečno.
Ano, takových typů je nekonečně mnoho, ale dynamické jazyky takové typy nemají, protože je nepotřebují. Statické jazyky je mají, protože potřebují nějak označit, co "z pole vyleze". Proto pokud potřebuju v dynamickém jazyce nějak reagovat na "všechny typy", není jich zas tak moc.

Statické jazyky mají typy "record", protože v mnoha situacích je to přirozený způsob reprezentace dat (osoba = {jméno, příjmení, datum_narození}). Taková reprezentace dat je v dynamických jazycích potřeba úplně stejně. A i v dynamickém jazyce potřebuju zareagovat na to, když místo hodnoty typu osoba dostanu hodnotu typu osoba = {jméno, příjmení, přezdívka, adresa}). Např. v Perlu pro tohle existuje částečná podpora, protože můžu fixovat množinu přípustných klíčů pro konkrétní hodnotu typu hash, což se ale pořád kontroluje za běhu programu.

9
Vývoj / Re:Co si myslíte o OOP?
« kdy: 06. 01. 2019, 19:36:26 »
Ale už když se přidají struktury (v C), třídy (v C++ nebo Javě), nebo se jako struktura použije hash (v Perlu) nebo dictionary (v Pythonu), tak těch typů je nekonečně (spočetně).
C, C++ ani Java nejsou dynamické jazyky. A zcela záměrně jsem řekl Python. Python nemá parametrizovaný typ dictionary<K,V>, má jeden typ dictionary. Perl (zcela vědomě a záměrně) vůbec neznám.

Skoro bych tipoval, že většina dynamických jazyků bude mít spíš konečný počet typů, protože tam pro parametrizaci není tak silný důvod jako u statických jazyků.

Myslel jsem to tak, že často používaný typ je "record", tedy množina pojmenovaných položek, kde počet, jména a typy položek jsou součástí definice typu. V C to je struct, v C++ nebo v Javě to je class. V jazycích, které mají asociativní pole (dictionary v Pythonu, hash v Perlu) se typ record implementuje pomocí asociativního pole, které má konstatní množinu klíčů (ať už lze prostředky jazyka tuto konstantnost vynutit, nebo ne). Takových typů je nekonečno. Statická typová kontrola mi umožňuje definovat, že v konkrétním místě programu se smí vyskytovat pouze konkrétní (konečná nebo nekonečná) podmnožina všech možných typů. Při dynamickém typování se musím být schopen v každém místě umět vypořádat s kterýmkoliv z celé nekonečné množiny všech možných typů.

10
Vývoj / Re:Co si myslíte o OOP?
« kdy: 06. 01. 2019, 18:40:11 »
Kecy. Sebedokonalejší typový systém za tebe kvalitní kód nevyrobí, prasit se dá v čemkoli. Mnohem více záleží na znalostech, zkušenosti a disciplíně(!) programátora. Sám jsem sice ve své víc než dvacetileté profesní praxi vždy pracoval převážně se staticky typovanými jazyky, ale nevidím ve statickém typování nijak velký přínos, co se týká bezpečnosti a vůbec kvality kódu. Způsob typování představuje jen jeden střípek ve škále vlastností jazyka a v praxi je to nakonec stejně hlavně o člověku, jeho schopnostech a přístupu, ne o nástroji. Nástroj je jen tak dobrý, jak dobrý je jeho uživatel. Kromě toho je zjevné, že dynamické a dynamicky typované jazyky si našly svou niku, ve které se prosadily, a je známkou arogance (nebo hlouposti či nezkušenosti) je jen tak spatra shazovat jako jazyky pro fušery. Ale když černobílé uvažování je tak pohodlné, že?

Počuli ste slovo Božie... Všetci čo tu vediete tie jalové debaty o typoch si toto vytlačte a zarámujte. V deň v ktorý tento text pochopíte, sa aj vy stanete programátormi. Dovtedy ste lopaty s plnou hubou rádoby odborných kecov.

Výše uvedený text je směs subjektivních názorů autora (já naopak po třicetiletých zkušenostech s vývojem softwaru vidím ve staticky typovaných jazycích velký přínos ke kvalitě kódu), částečně tvrzení s nízkou informační hodnotou (jak kvaltifikovat "mnohem vice", používání dynamických jazyků neimplikuje, jestli jsou lepší nebo horší než statické) a částečně obecné pravdy, které my hloupé lopaty máme už desítky let pochopené a zpracované a nemusíme je pořád omílat. Místo toho se můžeme soustředit na odbornou debatu (i když tahle je trochu moc dojmologická a dost ztrácí smysl). Ale když vidím tu slušnost schovanou v těchto dvou příspěvcích, chtě nechtě se mi na jazyk dere sousloví "pseudomanažerské kecy"  :)

11
Vývoj / Re:Co si myslíte o OOP?
« kdy: 06. 01. 2019, 18:22:52 »
Ano. Ale rozdíl mezi tím, kdy nevím, jestli je to jeden ze dvou typů nebo jeden za čtyř nebo jeden z dvaceti sedmi (kolik jich je v Pythonu?), je kvantitaivní, ne kvalitativní.

Konečný je možná počet primitivních typů. Ale už když se přidají struktury (v C), třídy (v C++ nebo Javě), nebo se jako struktura použije hash (v Perlu) nebo dictionary (v Pythonu), tak těch typů je nekonečně (spočetně). Jestli to je kvantitativní nebo kvalitativní rozdíl je námět na dlouhou neplodnou filozofickou diskusi. Z pragmatického pohledu je to rozdíl docela důležitý. Ale souhlasím, že mezi dynamickým a statickým přístupem k typům existuje plynulý přechod.

12
Vývoj / Re:Co si myslíte o OOP?
« kdy: 06. 01. 2019, 17:33:10 »
dávám překladači najevo, že vím, že v tomhle místě programu se za běhu objeví buď integer nebo string. Dynamický jazyk vlastně říká totéž: v tomhle (každém) místě programu nevím, co za běhu bude: int, string, list, ...

Je docela rozdíl mezi "vím, že tady je string nebo int" a "vím, že tady je nějaká hodnota libovolného typu".

13
Vývoj / Re:Co si myslíte o OOP?
« kdy: 05. 01. 2019, 23:55:08 »
Dá se pro libovolný program napsat testovací sada, která nalezne všechny chyby, jež by nalezla statická typová kontrola, a přitom nebude zahrnovat (jakkoliv zakamuflovanou) statickou typovou kontrolu?
Ne

Já si to myslím taky, ale na akademickou otázku by mě zajímala akademická odpověď, tedy přeformulování otázky do formální podoby a matematický důkaz...

14
Vývoj / Re:Co si myslíte o OOP?
« kdy: 05. 01. 2019, 23:49:18 »

A já se přitom nemusím bát, že se z nějakého podivného důvodu do nějaké pomocné funkce, která normálně dostává řetězce a volá na ně clear(), dostane jako parametr handle k databázi :)

Jestli potřebuješ staticky typovaný jazyk, aby sis byl jistý, že tvůj kód omylem nepromázne databázi, tak bys měl změnit obor. Nebo si alespoň pořídit hodně kvalitní pojistku na blbost.

Já už jsem ve svém programátorském životě viděl příliš mnoho chyb, které jsem buď sám udělal, nebo jsem je musel opravit, o nichž jsem byl přesvědčený, že nemohou nastat... :)

S trochou nadsázky - programátoři se dělí do několika podmnožin:
  • Ti, kteří dělají chyby, a nevědí, co s tím.
  • Ti, kteří dělají chyby, ale snaží se z nich poučit a snaží se používat nástroje, které jim pomohou chyby lépe odhalovat a odstraňovat.
  • Ti, kteří nedělají chyby.

Programátoři z první podmnožiny potřebují nabrat zkušenosti nebo, když toho nejsou schopni, najít si jiný obor. Programátoři z druhé podmnožiny dávají přednost staticky typovaným jazykům, protože jim pomáhají diagnostikovat chyby. Pro programátory ze třetí podmnožiny jsou lepší dynamicky typované jazyky, protože je nebrzdí v tvůrčím rozletu. Drobný problém je, že třetí podmnožina je prázdná.

15
Vývoj / Re:Co si myslíte o OOP?
« kdy: 05. 01. 2019, 23:36:19 »
Co jsou to "pomocné funkce"? Když mají vedlejší efekt, tak to jsou procedury, ne?

Používám terminologii mého oblíbeného C++.

Stran: [1] 2 3 4