• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    XCHAOSANSI C/C99 (specifikace), GNU C (gcc, glibc), Tiny C (tcc) a POSIX - ne nutně C++,g++,libstdc++ nebo Win32 API
    JANFROG
    JANFROG --- ---
    XCHAOS: Ted jsem mirne ztracen. Jak to souvisi s vyjimkami?
    KOJA: Taky se ztracim...
    KOJA
    KOJA --- ---
    JANFROG: Kdyz bych se to pro sebe pokusil oskatulkovat jako "spise mensi" projekty s enormni mirou znovupouziti davalo by ti to smysl?

    * "spise mensi" jsem si dovolil na zaklade toho, ze mi cloc tvrdi, ze libstdc++ 5.4.0 pro amd64 je cca 100kLOC.
    XCHAOS
    XCHAOS --- ---
    JANFROG: v C se dá ale obstojný try{}except{} implementovat pomocí setjmp/longjmp :-) ale samozřejmě u jazyka bez automatického volání destruktorů na konci scope nebudou věci tak sluníčkové jen proto, že navenek to bude vypadat "moderně".

    myslím, že v C++ zavedli to try právě proto, aby tam vždy byl scope, na jehož konci se zavolají příslušné destruktury - protože tradiční goto by je prostě nezavolalo (nejde jen o paměť, ale třeba i pozavírání otevřených souborů a uvolnění podobných zdrojů)

    jako je fakt, že čím víc jsem se snažil obejít bez C++, tím víc jsem z jiných programovacích jazyků (např. Python) okoukal, proč ten vývoj od C k C++ probíhal. dokud člověk píše jednoduché prográmky a ne náročné aplikace, tak nad problematikou uvolňování zdrojů většinou vůbec nepřemýšlí a přijde mu ok, že se vše uvolní až když program skončí...

    každopádně do věcí, co jsem chtěl nad C udělat, jsem se za posledních pár let pěkně zamotal. v podstatě ale každá posedlost použitými prostředky místo dosaženými cíli (které jsou v podstatě vždy dočasné, iluzorní a zbytečné) povede k něčemu podobnému (nejen u C, nejen u programování...)
    JANFROG
    JANFROG --- ---
    KOJA: Myslim ze ano. Je to videt vsude kolem (me :-) To si ale nutne neprotireci s tim
    <i>ze na hromadu problemu staci rozumny navrh na urovni architektury a (pardon) "mikrooptimalizace" nejsou potreba</i>. Samozrejme, pokud mas O(n^3) algoritmus a existuje O(nlogn), pak nema cenu "mikrooptimalizovat" ten n^3. O tom zadna.

    Zalezi na tom co delas. Pokud delas nejakou aplikaci, rekneme nejaky IS nebo tak, pak asi opravdu jedine, co ma smysl je pouziti dobrych algoritmu a rozumne cacheovani.
    Pokud ale delas vis low-level - zakladni knihovny, runtime, prekladace - pak je dost citit jestli neco udelas na ~1 cachemiss nebo na ~10 cachemiss, prestoze slozitost obou je O(1), rekneme. Nebo je dost rozdil, jestli
    napises

    if (error) {
    handle_error();
    return;
    } else {
    ...
    }

    nebo

    if (!error) {
    ....
    return;
    } else {
    handle_error();
    }

    pripadne

    if (error) goto handle_error;
    fixed: ...
    return
    fix_error();
    goto fixed;


    pokud je to low-level kod, provadi se opravdu casto a muze to bolet (vlastni zkusenost :-)

    On i ten REDGUYem vysmivany benchmark ukaze zajimave veci - ono to neni tak ze <i>podstate testuje jednu jedinou funkci v dost trivialnich podminkach<i>. On spis testuje, jak dobry je optimalizator a jak se chova - obzvlaste na jit systemech se spekulativnim inlinovanim (dokaze tu funkci nainlinovat? Kdy to udela? Od kdy se vyplati zpomaleni zpusobene rekompilaci, OSR, a naslednym restartem? Kdy deoptimalizuje?). Kdyby tyhle veci nemeli velky vyznam, nedelalo by se to - je to _dost_ prace to odladit :-)
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: ASIC na řetězení stringů? jako alternativa akcelerované grafárny pro webservery? :-))
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    KOJA: ASICy muzou bejt zajimavy kvuli spotrebe. Obecne, dedikovanej HW je zajimavej kvuli spotrebe.
    KOJA
    KOJA --- ---
    JANFROG: Zajimavy. Chapu spravne, ze ocekavas, ze vyznam optimalizace kodu poroste? Kdybys chtel rozvest svoji perspektivu, rad si poctu. Sam o tom obcas popremyslim a zaver zadny nemam - na jedne strane si google vyrabi asicy (proc?), na strane druhe mam obcas pocit, ze na hromadu problemu staci rozumny navrh na urovni architektury a (pardon) "mikrooptimalizace" nejsou potreba (nanejvys tak jeste poresit cachovani vsude kde to dava smysl).
    KOJA
    KOJA --- ---
    REDGUY: Jo, sorry, tak jsem to i myslel a prislo mi, ze to tak myslite oba. Ten linkovany benchmark uz jsem v myslenkach uplne opustil.
    REDGUY
    REDGUY --- ---
    KOJA: Kdyz rikam nanobenchmark tak myslim to, co tady bylo nalinkovany, cili opravdu nano vec, ktera v podstate testuje jednu jedinou funkci v dost trivialnich podminkach. V okamziku, kdy mluvis o "skladani benchmarku", tak uz to imho je neco jineho a k tomu jsem se nevyjadroval.
    KOJA
    KOJA --- ---
    REDGUY, JANFROG: Myslim, ze to "podobne" asi implicitne myslite oba. Problem syntetickych benchmarku mi prijde dost slozity na to aby byl zajimavy sam o sobe. Nektere "low hanging fruit" jde asi pocesat obecne - napr. knihovna facebook folly ktera "nikdy neni pomalejsi a obvykle je rychlejsi" nez STL implementace v libstdc++. Ale namixovat synteticky benchmark tak, aby byl relevantni a pomohl zvolit statisticky vyhodny kompromis bude asi dost zajimave. Skladat treba benchmark na kterem se otestuji ruzne branch prediction algoritmy pri vyvoji noveho desktopoveho CPU muze byt dost dobra zabava.
    JANFROG
    JANFROG --- ---
    XCHAOS: staci -m32
    XCHAOS
    XCHAOS --- ---
    JANFROG: no, můžu se mrknout, co to dělá na noťasu :-)
    JANFROG
    JANFROG --- ---
    XCHAOS: na jakou cílovou platformu to kompiluješ: to je dobra poznamka...i386.
    XCHAOS
    XCHAOS --- ---
    JANFROG: tak tím switchem to nebude:
    xchaos@hyperion:~$ gcc pokus-compare.c -o pokus-compare -ggdb3 -O0
    xchaos@hyperion:~$ ./pokus-compare
    ===
    long a = -1;
    unsigned int b = 1;
    a == b // -> false
    a < b // -> true
    a > b // -> false
    ===
    unsigned int a = 1;
    long b = 1;
    a == b // -> true
    a < b // -> false
    a > b // -> false

    pořád si neuvedl, na jakou cílovou platformu to kompiluješ... ale oceňuju, že tenhle klub _konečně_ začíná zvolna fungovat k tomu, k čemu byl založen :-)

    (jo a dík, že si mi nasměřoval na to #makro (evidentně vložení tokenu do úvozovek, jako stringový literál) - konkrétně tohle využití preprocesoru jsem neznal, a napadá mi okamžitě spousta ďábelských věcí, jak to využít - hlavně třeba v konstruktorech objektů, resp. ještě spíš jejich interfejsů, které se alokují typicky v jediné instanci za celou dobu běhu programu - objekt za běhu takhle může například jednoduše vědět, jak se jmenuje jeho interface ... což je zhruba stejné, jako vědět, do jaké patří třídy...)
    JANFROG
    JANFROG --- ---
    XCHAOS:
    XCHAOS: Se svetem to jde z kopce, ale z jinych duvodu :-)
    Tohle neni dukaz zkazenosti sveta, to je jen ta nejjednodussi demonstrace toho, ze myslet si ze o programu v C vis co se deje uvnitr je - rekneme - velmi naivni. Pro uplnost, prekladano s -ggdb3 -O0

    A ne, neni to tim ze by veci byli v roce 2014 a 2016 jinak. Pokud pouziji 4.9.x dopadne to stejne...
    XCHAOS
    XCHAOS --- ---
    Takže v roce 2014 ještě záporné číslo v Céčku bylo menší, než kladné.. a v roce 2016 už není? no to je jen další důkaz, že se světem to jde z kopce a end is near (unless declared far).
    XCHAOS
    XCHAOS --- ---
    JANFROG: divný, použil jsem make bez jakýchkoliv optimalizací a extravuřtů, na téhle archaické platformě:

    xchaos@hyperion:~$ cat /proc/cpuinfo
    processor : 0
    vendor_id : AuthenticAMD
    cpu family : 15
    model : 67
    model name : AMD Athlon(tm) 64 X2 Dual Core Processor 5000+
    stepping : 2
    cpu MHz : 2611.979
    cache size : 512 KB
    physical id : 0
    siblings : 2
    core id : 0
    cpu cores : 2
    apicid : 0
    initial apicid : 0
    fpu : yes
    fpu_exception : yes
    cpuid level : 1
    wp : yes
    flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 3dnowext 3dnow rep_good nopl pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy
    bogomips : 5223.95
    TLB size : 1024 4K pages
    clflush size : 64
    cache_alignment : 64
    address sizes : 40 bits physical, 48 bits virtual
    power management: ts fid vid ttp tm stc

    sice porovnávání různých typů integerů, aniž člověk použije implicitní přetypování, je v C poněkud sázka do loterie (já právě implicitní přetypování čísel, než s nima vůbec začnu něco dělat, celkem i používám...), ale přeci jen: kdyby porovnání longu a unsigned intu nějak často dopadalo tak, jako u tebe, tak mi to přijde celkem nebezpečné (zvlášť pokud má být v céčku napsán třeba firmware pro samořídící auta :-))
    JANFROG
    JANFROG --- ---
    XCHAOS: No vidis, me to pise zase tohle:
    ===
    long a = -1;
    unsigned int b = 1;
       a == b // -> false
       a < b  // -> false
       a > b  // -> true
    ...
    

    jv@sao:~/Projects/jv-knowledgebase/C$ gcc --version
    gcc (Debian 6.1.1-11) 6.1.1 20160802
    Copyright (C) 2016 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

    Jak je to jen mozne v tak transparentnim jazyku, kde je videt co se vevnitr deje :-)
    (omlouvam se za trochu sarkasmu, nekdy si nemuzu pomoci...)
    XCHAOS
    XCHAOS --- ---
    K předchozímu:

    xchaos@hyperion:~$ gcc --version
    gcc (Debian 4.9.2-10) 4.9.2
    Copyright (C) 2014 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    XCHAOS
    XCHAOS --- ---
    JANFROG: mě to vypsalo tohle:
    xchaos@hyperion:~$ ./pokus-compare
    ===
    long a = -1;
    unsigned int b = 1;
    a == b // -> false
    a < b // -> true
    a > b // -> false
    ===
    unsigned int a = 1;
    long b = 1;
    a == b // -> true
    a < b // -> false
    a > b // -> false

    ... což, ať se na to koukám z jakéhokoliv úhlu, je asi to, co bych intuitivně čekal, ne? :-)
    XCHAOS
    XCHAOS --- ---
    JANFROG: jako v podstatě ano - přirovnání ke koloběžkám, skateboardům, apod. uznávám. speciálně se mi líbí tahle verze
    Onewheel: The World is Your Playground
    https://www.youtube.com/watch?v=XNqOU4jx62I

    ...sežere fakt málo benzínu :-)
    JANFROG
    JANFROG --- ---
    REDGUY: Jo. sice ne ve vsem myslitelnem ale na (v danem kontextu) relevantnim vzorku. Dneska je dost rozdil mezi tim co napises v kodu a co se doopravdy pousti a je dobre vedet, co kdo dela aby to urychlil...a poucit se z chyb jinych :-)
    REDGUY
    REDGUY --- ---
    JANFROG: Garantuji Ti, ze vetsina vyvojari runtimu tehle syntetickych nanobenchmarku pisou, pousti a ladi mraky. - ehm. Takovejch, ve kterejch pousti jednu funkci ve vsem od tcl/tk po c? Urcite?

    Sam jsem meril dva systemy, dost podobne - myslim, ze klicove slovo je to "podobne".
    JANFROG
    JANFROG --- ---
    REDGUY: Podivej, podobny synteticky nanobenchmarky maji jen mizivou hodnotu....

    S tim zasadne nesouhlasim. Ty benchmarky maji zasadni vyznam a nedelat je velka chyba, byt delat zavery ktery system je lepsi je trosku na hlavu (ale to je na hlavu na zaklade jakychkoliv "dat") Garantuji Ti, ze vetsina vyvojari runtimu tehle syntetickych nanobenchmarku pisou, pousti a ladi mraky. Minimalne Oracle, Google a ja :-)

    Je to jak rika XCHAOS - trik je v tom, ze tyhle "stupidni" operace se provadeji casto. Sam jsem meril dva systemy, dost podobne a jeden byl v rade bechmarku o pulky rychlejsi. GC velmi podobny, JIT velmiu podobny, rozdil byl v knihovne. Takove blbost jako inteligentni implementace String.indexOf() a podobnych veci muze udelat 30% celkem v klidu...

    cim dal tim min podstatny meritko
    No ja citim celkem presne opak. Jak v oblasti "velkych" pocitacu kdy SW je stale komplexnejsi a je nutne ho delat za kratsi dobu. Kodu co musi bezet je hodne. Naklady na datova centra a elektrinu jsou vysoke, efektivnejsi system snizuje naklady nebot umozni vetsi hustotu aplikaci.
    Na strane druhe, v oblastim "malych"pocitacu je to podobne, but z jinych duvodu. S penetraci pocitacu temer do vseho a nastupem IOT bude cim dal vic SW bezet na chrastitkach co nemaji moc vykonu (ruzna Arduina, RPi, male ARMy). Ne kazda lednicka pobezi na T7.
    KILLUA
    KILLUA --- ---
    Jan, pokud něco jde 30x rychlejc můžeš udělat xkrát víc chyb použít xkrát pomalejší framework a stejně bude výsledné řešení 10x rychlejší a udělané za stejnou dobu.
    JANFROG
    JANFROG --- ---
    KILLUA: Vždy mě právě fascinuje... :-) Za vsimnuti take stoji, ze nejvice do krve se hadaji ti programatori, kteri nikdy zadny production-ready jazyk (=compiler+runtime+zakladni knihovna) neimplementovali...mam dojem, ze tady je rovnez pekne videt...

    Prostě když je něco 30x pomalejší tak to lepší není a nikdy nebude.
    Opravdu?
    JANFROG
    JANFROG --- ---
    XCHAOS: existuje samozřejmě obecné povědomí, že Java je pomalé monstrum, ale takovéhle srovnání a tedy i míra toho, jak je to v té Javě asi udělané špatně, stejně zovu překvapí...
    To "povedomi" je dane spise po generace tradujici se famou nez ze by bylo zalozene na pravde. Fakt je, ze dneska je malo co, jestli neco, rychlejsi nez Java (bavime se o Hostpot VM ve srovnani s jinymi systemy sh s garbage collectorem a podporou nativnich threadu - srovnavat to s C je nesmysl. To je jako rici ze kolobezka je lepsi, protoze sezere min benzinu nez skodovka a otoci se na place)
    KOJA
    KOJA --- ---
    KILLUA: Zajimavy :-) Prijde mi, ze firmy co nevi kam s penezma (google, facebook, microsoft, ibm) si uz vsechny alespon par nejakych ultraschopnych lidi vydrzuji (Carmack, Lamport, Alexandrescu, ...) Skoro mi to pripada jako otazka prestize, takova voliera s kanarkama :-) Nektere firmy, rekl bych, maji celkove strategii zamestnat co nejschopnejsi lidi sezenou a muzou zaplatit (google, spacex, ...).

    Imho je jadro pudla prave v tom, ze abys zamestnaval ty nejschopnejsi, tak musis sam byt co k cemu abys chapal proc to delas a ty spravne rozlisil. Takze se musi nejakym zpusobem vytvorit "podhoubi" aby se schopnych lidi nahromadilo kriticke mnozstvi (zakladatele firmy, slozite problemy v popisu prace, nejaka fluktuace...) a to asi bude tezke a hlavne dost narocne na "zdroje".

    TO ALL: Jeslti jsme tu uz moc offtopic, tak nas prosim vyzente.
    JANFROG
    JANFROG --- ---
    XCHAOS: Každý string tam určitá vzniká nejspíš jako další obecně rozšířitelný meta-objekt...což musí nutně mít nějakou reži
    To jiste ma rezii, jako vsechno. Ta rezie je ale dost presne stejna jako v pripade tridnich systemu. Typicky se jedna o pointer bump + vyplneni hlavicky (obvykle 1/2 slova). Dopocujuji precist klasicky paper

    Craig Chambers, David Ungar, and Elgin Lee: An Efficient Implementation of SELF, a Dynamically-Typed Object-Oriented Language Based on Prototypes.

    u které vím, co se uvnitř ní děje
    Domnivam se, ze C toto nesplnuje. Jednoduchy priklad. Mejme nasledujici kod:
    #include <stdio.h>
    #define BOOLVAL(x) ((x) ? "true" : "false")
    #define COMPARE(type1, value1, type2, value2)           \
        {                                                   \
            type1 a = value1;                               \
            type2 b = value2;                               \
            printf("===\n"                                  \
                   "%s a = %s;\n"                           \
                   "%s b = %s;\n",                          \
                   #type1, #value1, #type2, #value2);       \
    	printf("   a == b // -> %s\n"                   \
                   "   a < b  // -> %s\n"                   \
                   "   a > b  // -> %s\n",                  \
                   BOOLVAL(a == b),                         \
                   BOOLVAL(a < b),                          \
                   BOOLVAL(a > b));                         \
        }
    int main() {
        COMPARE(long, -1, unsigned int, 1);
        COMPARE(unsigned int, 1, long,  1);
    }
    


    Co vypise?
    KILLUA
    KILLUA --- ---
    Koja: Díky za odkaz, aspoň vím, že nevymýšlím nesmysly :)

    No můj přístup je takový, že "geniální" programátor dokáže jednou za čas přijít s něčím s čím by nepřišlo ani 1000 těch průměrných, a díky tomu, že nemusí čas věnovat generickým věcem se toto může přihodit častěji. A pak už podobné zlepšení mohou opakovaně užívat všichni.

    Prostě prvoplánové škatulkování lidí, kteří převyšují svou specifickou inteligencí tu vaši (třeba nějakého midlemanagera) je pošetilé, ale protože všechno "musí" být ve stejných boxíkách a excelovejch tabulkách většina společností to tak dělá.
    Kliknutím sem můžete změnit nastavení reklam