abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 0
    dnes 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    dnes 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    dnes 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    dnes 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    dnes 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    včera 22:44 | IT novinky

    IBM kupuje společnost HashiCorp (Terraform, Packer, Vault, Boundary, Consul, Nomad, Waypoint, Vagrant, …) za 6,4 miliardy dolarů, tj. 35 dolarů za akcii.

    Ladislav Hagara | Komentářů: 12
    včera 15:55 | Nová verze

    Byl vydán TrueNAS SCALE 24.04 “Dragonfish”. Přehled novinek této open source storage platformy postavené na Debianu v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 13:44 | IT novinky

    Oznámeny byly nové Raspberry Pi Compute Module 4S. Vedle původní 1 GB varianty jsou nově k dispozici také varianty s 2 GB, 4 GB a 8 GB paměti. Compute Modules 4S mají na rozdíl od Compute Module 4 tvar a velikost Compute Module 3+ a předchozích. Lze tak provést snadný upgrade.

    Ladislav Hagara | Komentářů: 0
    včera 04:44 | Nová verze

    Po roce vývoje od vydání verze 1.24.0 byla vydána nová stabilní verze 1.26.0 webového serveru a reverzní proxy nginx (Wikipedie). Nová verze přináší řadu novinek. Podrobný přehled v souboru CHANGES-1.26.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (72%)
     (9%)
     (2%)
     (17%)
    Celkem 749 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Co nás ph naučil 1: C a CLASS

    21.10.2016 22:13 | Přečteno: 2499× | Jen tak | Výběrový blog | poslední úprava: 23.10.2016 07:35

    Od minulého blogu o Pieterovi uplynul nějaký čas. Ten zápisek byl spíše obraz mých myšlenek v tu chvíli, ale i tak by bylo dobré se podělit o to, co nás Pieter naučil, když žil.

    Proč CLASS

    První poznatek o Pieterovi. Jakožto editor verze 0.9 amqp měl potřebu svoje poznatky vtělovat do podoby RFC, čili specifikací. Stejně je tomu tak i v případě CLASS, neboli C language style for scalability.

    A protože je jazyk C starý a jeho standardní knihovnu a posixová rozhraní tvořilo mnoho nezávislých týmů. Tohle všechno společně s tendencí C programátorů pro mikrooptimalizace a existence preprocesoru vede k tomu, že průměrný C kód je velmi špatně čitelný.

    Základní poznatek je

    If the code isn't readable on a grey Monday morning before coffee, chuck it out and start again
    Ten rules of good code @hintjens

    CLASS

    Tak nejprve příklad na "standardní" C. Berkley socket API (z Beej's socket guide).
    struct addrinfo hints, *res;
    int sockfd;
    
    // first, load up address structs with getaddrinfo():
    
    memset(&hints, 0, sizeof hints);
    hints.ai_family = AF_UNSPEC;  // use IPv4 or IPv6, whichever
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_flags = AI_PASSIVE;     // fill in my IP for me
    
    getaddrinfo(NULL, "3490", &hints, &res);
    
    // make a socket:
    
    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    
    // bind it to the port we passed in to getaddrinfo():
    
    bind(sockfd, res->ai_addr, res->ai_addrlen);
    
    A podobný kód v czmq
    zsock_t *socket = zsock_new_router ("tcp://*:3490");
    ...
    zsock_destroy (&socket);
    
    Pochopitelně se nejedná o ekvivalentní kód, kdy v jednom případě tvoříme klasický socket a ve druhém jeho zeromq abstrakci. Ale ilustruje to princip čitelnosti kódu, o kterém CLASS je. Mimochodem všechne kód je jak je, s přesvědčením, že půjde i zkompilovat.

    Základní metody

    Každá třída poskytuje alespoň jeden konstruktor s názvem třída_new. Ten je zodpovědný za alokaci paměti a nastavení členů.
    #include <czmq.h>
    
    struct _globdom_t {
      size_t counter;
      bool kaboom;
      char *name;
    };
    
    typedef struct _globdom_t globdom_t;
    
    Nutno podotknout, že globdom je neprůhledná (opaque) struktura, která není deklarována v hlavičkovém souboru.
    globdom_t * globdom_new () {
        globdom_t *self = (globdom_t*) zmalloc (sizeof (globdom_t));
        assert (self);
    
        self->counter = 0;
        self->kaboom = false;
        self->name = strdup ("");
        assert (self->name);
        return self;
    }
    
    Konstruktor je zodpovědný za alokaci paměti a nastavení výchozích hodnot.
    void globdom_print (globdom_t *self) {
        assert (self);
    
        zsys_debug ("globdom:\n\tcounter=%zu\n\tkaboom=%s\n\tname=%s",
            self->counter,
            self->kaboom ? "true" : "false",
            self->name);
    }
    
    Print metoda není přesně vzato potřeba, ale velice usnadňuje ladění programu. Jelikož se czmq (a CLASS) obvykle používá na psaní asynchroního serverového kódu, ladění pomocí metody print je jediný použitelný způsob.
    void globdom_destroy (globdom_t **self_p) {
        assert (self_p);
    
        if (*self_p) {
            globdom_t *self = *self_p;
            zstr_free (&self->name);
            free (self);
            *self_p = NULL;
        }
    }
    
    Destruktor je specifický tím, že očekává ukazatel na ukazatel. To proto, že zavolání destroy vyNULLuje ukazatel v nadřazeném kontextu. A díky tomu je možné jej volat vícekrát aniž by kód spadnul na double free chyby. Srovnejte s libc funkcí free a nechvalně známou double free error.
    const char* globdom_name (globdom_t *self) {
        assert (self);
        return (const char*) self->name;
    }
    
    char* globdom_get_name (globdom_t *self) {
        assert (self);
        return strdup (self->name);
    }
    
    Metody pro přístup k položkám. Obvykle se vrací ukazatel zevnitř struktury. Klíčové slovo const se používá ke zdůraznění faktu, že se nepředává vlastnictví objektu. Nicméně existuje i druhá možnost a to vracet nový objekt. Dokumentace potom musí zmiňovat, že je volající zodpovědný za zrušení vráceného objektu.
    void globdom_set_name (globdom_t *self, const char* name) {
        assert (self);
        assert (name);
    
        zstr_free (&self->name);
        self->name = strdup (name);
    }
    
    Nastavení nové hodnoty je triviální. Obvykle chceme daný objekt vlastnit, na což je ideální funkce strdup. A ano, v položce mohou být nějaká data, takže je vhodné je zrušit.
    void globdom_test (bool verbose) {
        printf (" * myp_myclass: ");
        //  Conduct tests of every method
    
        globdom_t *self = globdom_new ();
        assert (self);
    
        assert (streq (globdom_name (self), ""));
        globdom_set_name (self, "NAME");
        assert (streq (globdom_name (self), "NAME"));
    
        globdom_destroy (&self);
        globdom_destroy (&self);
    
        printf ("OK\n");
    }
    
    A nakonec by každá třída měla mít unit test. Vzhledem k tomu, že se jedná o C, je vhodné unit test pustit i pod valgrind.

    Shrnutí

    CLASS je styl C, který klade důrat na čitelnost a uniformní API. Naopak závislot na haldě může být pro některé aplikace problém. Ostatně nevýhody tohoto stylu jsou v RFC popsány. Nicméně z osobní zkušenosti můžu říct, že používání CLASS knihoven jako czmq, nebo malamute dělá z C poměrně rozumný a snadno použitelný jazyk.

    Grey Monday a strdup

    Pozorní čtenáři si jistě všimli zvláštní konstrukce strdup ("") v konstruktoru. Typický C programátor nechce zbytečně plýtvat cykly CPU, takže by napsal self->name = NULL. Což je možné, ale potom je potřeba to všech metod třídy naprogramovat kód pro obsluhu NULL. Použití strdup vede na jednodušší kód bez zbytečných podmínek. A jednodušší kód je lepší, než ten komplikovaný.

    Příště se podíváme na generování kódu a zproject.

    Edit: jenom dodatek k C++ dole. Sice je mi trapné postoval "slovo" Boží, nicméně velkou Pietrovou předností bylo to, jak dokáže formulovat myšlenky.

    7. Technology is a tool, not a tribal affiliation.
    Never turn pragmatic choice of tools into a belief system. I have written editors and code generators in COBOL 74. The language matters little.
    Ten habits of good programmer @hintjens
    Cheap is important. Learn to use Linux, and a cheap or second-hand PC. Learn the command line. Stick with small languages like C, instead of massive languages like C++. Learning a larger language does not make you a better programmer. Ten Tips for Young Programmers @hintjens
           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    Bedňa avatar 21.10.2016 23:56 Bedňa | skóre: 34 | blog: Žumpa | Horňany
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Mimo tému, ale keď som si 0MQ pozeral, tak som narazil na CurveZMQ. V akom štádiu je posielaie zašifrovaných správ vlastne dnes. Nikdy som to neskúšal, len keď tu o ňom niečo padne preklikám si to a pozriem video.
    KERNEL ULTRAS video channel >>>
    22.10.2016 07:58 sad
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Já se snad to objektové programování naučím, i když vypadá úplně šíleně, ale zřejmě by ho měl běžný programátor ovládat. Ale raději začnu s nějakým skutečně objektovým jazykem, asi C++.

    A nebyla to zbytečná práce přepisovat unixové knihovny z procedurálního stylu do objektového?
    22.10.2016 08:26 Radovan
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    "s nějakým skutečně objektovým jazykem, asi C++"

    Tak tomuhle jsem se v sobotu po ránu opravdu dobře zasmál :-D

    Tohle znáš? O objektu, struktuře a gotu.
    22.10.2016 12:28 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Tohle znáš? O objektu, struktuře a gotu.
    Ehh, to je zas ptákovina. Zas se někdo potřebuje cítit na výši nad ostatními. Někteří k tomuto účelu využívají svou znalost dizajn paternů a entrprajs Javy, jiní zase zalost embedded přístupu. U někoho, kdo pracuje s embedded mě tenhle postoj trochu zamrzel, čekal bych u těhle lidí větší nadhled...
    Bystroushaak avatar 22.10.2016 18:57 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    +1, taky jsem to chtěl napsat (autor se v tom doslova vyžívá i v ostatních článcích), ale pak se mi to nechtělo vysvětlovat.
    23.10.2016 09:59 Radovan
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Už se ti někdy stalo že se ti nevešel program do Arduina? ;-)
    23.10.2016 10:29 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    To, že se nevejde na zásobník, se člověku snadno stane i na x86_64.
    23.10.2016 12:21 Radovan
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Ne proměnné, ale kód!
    23.10.2016 14:24 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Není to jedno? Vlastně není: když se nevejde program (binárka) do paměti, přijdu na to nejpozději při pokusu spustit ho; když se nevejde na zásobník, stane se to v nějakém pseudonáhodném okamžiku za běhu, což je horší.
    Bystroushaak avatar 23.10.2016 15:17 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Už se ti někdy stalo že se ti nevešel program do Arduina? ;-)
    Stalo a nikdy za to nemohlo použití objektů. Jinak tohle je argument jako prase. Už se ti někdy stalo že se ti nevešel program do arduina? Tak bys měl používat všude assembler, i když píšeš na desktopu, protože všechno je zlo a všichni jsou neschopní, jen já vím jak na to.
    23.10.2016 23:21 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Už se ti někdy stalo že se ti nevešel program do Arduina? ;-)
    To, že někdo nerozumí objektům, resp. jak fungují pod kapotou, a v důsledku toho je nemůže úspěšně použít pro embedded, není úplně důvod, proč by na tom ostatní museli být nutně stejně.
    pavlix avatar 23.10.2016 23:24 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Bavíme se ještě pořád o místu v paměti pro uložení datové struktury nebo její části?
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    27.10.2016 04:13 hypvofxy | skóre: 5 | blog: hypvofxy | Brno
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Martin Maly je kapitola sama o sobe. Jaky je v realu netusim, ale ve svych postech ma tendence lidi kategorizovat a povysovat se nad ne. Ma docela siroky rozhled mezi obory, ale vesmes mi prijde, ze krome psani, programovani starych pocitacu a trochu webu, toho ani moc neumi a spis jen tak do kde koho rype. Sam o sobe tvrdi, ze neni programator, a dnesni programovani mu pripada zcela nezajimave, na coz si pak kladu otazku, jestli je to jeho neznalosti (a vlastne vubec nevi, co se v dnesnim programovani taky da resit), nebo celkovym nezajmem o obor jako takovy (protoze mezi konickem a praci samozrejme existuji znacne rozdily). Ty jeho caste zmeny zamestnani muzou na urcitou nestalost trochu poukazovat...
    vlk avatar 23.10.2016 22:37 vlk | skóre: 23 | blog: u_vlka
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    programujem jednocipy a niektore z mojich pravidiel su:
    - pisem v c++11 (alebo novsie) a vsetko v objektoch
    - ziadne globalne premenne (len vynimocne aby som sa dostal k objektu z preruseni)
    - ziadny heap, aloc, free, new, delete (pripadne len vynimocne na prvotnu alokaciu objektov - bez nutnosti delete, alebo nad memory poolom)
    - ziadne vynimky
    - nepouzivam #define, #if, ..., nahrazujem ich templejtami, inline funkciami a static const
    - prerusenia len v casovo kritickych situaciach, inak sa dotazujem v hlavnej smycke pripadne vyuzivam DMA
    - vyhybam sa jednocipom, ktore neumoznuju nastavit stack cez celu RAM a nemaju spolocny adresny priestor cez RAM, FLASH a vsetky registre periferii, idealne ak maju 32bit zbernicu nad adresami aj datami, takze ziadne AVR to asi nebudu
    .....

    dalej, assembler je vhodny len na casovo kriticke operacie, pisat v assembleri cely program je na hlavu a hlavne takto napisany program bude podstane menej optimalny nez kod prelozeny z vyssieho jazyka.
    You don't exist, Go away !
    22.10.2016 12:27 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Ale raději začnu s nějakým skutečně objektovým jazykem, asi C++.

    Chtěl jsem napsat, že jste si naběhl na vidle, protože za tohle vás místní vyznavači zásady "žádný jazyk, který používá víc než deset lidí, nemůže být dost cool" rozcupují na kousky. Ale jak vidím, už je pozdě. Tak příjemnou zábavu… :-)

    Bystroushaak avatar 22.10.2016 18:58 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Chtěl jsem napsat, že jste si naběhl na vidle, protože za tohle vás místní vyznavači zásady "žádný jazyk, který používá víc než deset lidí, nemůže být dost cool" rozcupují na kousky. Ale jak vidím, už je pozdě. Tak příjemnou zábavu… :-)
    Ono hlavně C++ není skutečně objektový jazyk ani omylem. Objekty jsou tam naroubované jak rakovina na C.
    22.10.2016 21:00 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    A už je to tady…
    23.10.2016 07:30 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    "žádný jazyk, který používá víc než deset lidí, nemůže být dost cool"
    Hlavně žádný jazyk není skutečně objektový :-). Možná tak Self, nebo Javascript*

    * smajlík-vyjadřující-dobrovolné-naběhnutí-si-na-vidle
    When your hammer is C++, everything begins to look like a thumb.
    Bystroushaak avatar 23.10.2016 15:22 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Smalltalk je afaik taky kompletně objektový.

    Self potom určitě, ale tam to brzí implementace v C++ a momentálně miniaturní komunita, která postupuje šnečím tempem po desíti letech v podstatě nulového posunu. Kdyby se podařilo dopsat Klein (Self v Selfu), tak je to o dost dál.

    Javascript mi přijde zprasený, sice se Selfem inspiroval, ale ten prototype based přístup převzali tak nějak úplně blbě. Například tam chybí parent sloty a teď to tak různě mutuje, že to skoro dospívá k nějakému class based OOP.
    23.10.2016 07:26 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Nikdo nic nepřepisuje, czmq je naprosto nová knihovna :-) Navíc tento pattern není nový, například libmagic, nebo libabc, nebo hormada dalšího kódu.
    Ale raději začnu s nějakým skutečně objektovým jazykem, asi C++
    C++ má svoje výhody, zejména práce s kolekcemi (až na odporné STL API). Na druhou stranu i spoustu nevýhod, jako komplexní pravidla (rule of five), pomalá kompilace, nutnost dávat implementaci do hlavičkových souborů, neexistující ABI, ... Obvykle je to tak, že než já vyšperkuju třídu v C++, tak v C už mám dávno implementaci hotovou :-)
    When your hammer is C++, everything begins to look like a thumb.
    Tomáš Bžatek avatar 22.10.2016 10:19 Tomáš Bžatek | skóre: 29 | Brno
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS

    Hele on zije :-)

    Koupim litajiciho tucnaka
    23.10.2016 19:05 Kvakor
    Rozbalit Rozbalit vše Re: Co nás ph naučil 1: C a CLASS
    Pozorní čtenáři si jistě všimli zvláštní konstrukce strdup ("") v konstruktoru. Typický C programátor nechce zbytečně plýtvat cykly CPU, takže by napsal self->name = NULL. Což je možné, ale potom je potřeba to všech metod třídy naprogramovat kód pro obsluhu NULL. Použití strdup vede na jednodušší kód bez zbytečných podmínek. A jednodušší kód je lepší, než ten komplikovaný.
    No, je pravda, že použít strdup("") na inicializace řetězce dělá věci jedodušší, nicméně osobně bych raději udělal nějaký chytrý wrapper (možná by stačilo i makro), který obsahuje test na NULL (něco jako realloc(), ale pro řetězce), protože mít na haldě spousty pidiřetězců velkých jeden byte mi případá jako velmi neelegantní řešení.

    A i když test na NULL je podmínka a tudíž skok, ve výsledku se přeloži jako jedna instrukce, zatímco ten kód, který následuje při dealokaci objektu z haldy, bude určitě obsahovat mnohem více skoků (například kvůli implementaci scelování) a navíc sahání do paměti, která nemusí být zrovna nacachované.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.