• ú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
    XCHAOS
    XCHAOS --- ---
    WILD_A: no hele, v tý debatě bylo, že C je vlastně subset asemblerů minipočítačů 60-tých let, na kterých pak vznikl Unix. většina původních C instrukcí se přepisovala přesně na jednu strojovou instrukci tehdejších procesorů (na pozdějším hardwaru se to taky implementovalo jednoduše, ale někdy už to vyšlo na víc strojových instrukcí)

    no a jde o to: nějaký subset základních abstrakcí, které jsou víc, než jen základní assembler, ale zase jsou k dispozici fakt všude a nevyžadují instalaci speciálních knihoven. a to je kámen úrazu: základní libc (téma tohohle klubu) v sobě neobsahuje nic zásadně použitelnýho. problém je, že základní kontejnerové typy jazyků jako javascript nebo python (nebo i to dementní PHP) se v C typicky rozepíší na 100 řádek kódu...
    WILD_A
    WILD_A --- ---
    XCHAOS: Je pravda ze C je v mnoha ohledech pracny, abstrakce nejsou out of box a tudiz jak rikas naberu furu knihoven, nicmene outsourcovat slozitosti je imo dobrej napad. Je pravda ze treba STL je na rychly sekani konceptu dobry, neresim pomerne komplexnejsi veci na druhou stranu je to code bloat jak cyp a kdyz to pak realne chci pouzivat tak na to kaslu a tyhle casti prepisu a tak mi pak prijde, ze uz kombinace C a neco vyssiho je lepsi.

    Ad Python - ja ho mam rad, ale pretezovani operatoru je problem vzdycky a v Pythonu jeste vic, vzhledem k dynamickymu typovani, to uz pak jeden nevi vubec nic a jen doufa ze tu runtimu chybu dostane rychle pokud tam je :)

    D jsem nijak nezkousel, ale koketuju a experimentuju s Go a musim rict, ze se mi dost libi, rozhodne lepsi nez C++
    XCHAOS
    XCHAOS --- ---
    WILD_A: tak v tomhle klubu se asi rok diskutovalo o realokacích polí v C: on to není triviální úkol, takže jakmile chceš pole dynamicky zvětšovat nebo do něj vsunovat nějaký prvek doprostřed, tak na limity omezené abstrakce v C narazíš dost rychle (já osobně to obcházím svými vlastními nástroji pro práci se spojovými seznamy, ale to má taky svoje pro a proti).

    takže rychle provést něco konkrétního, kdy už víš, kolik toho bude (typický příklad: grafická knihovna - ve chvíli, kdy už ví, jak velký v plxlech ten načítaný obrázek je), je v C určitě nejvýhodnější a i relativně jednoduché (protože třeba matematické operace se v C dají popsat velmi exaktně - např. proti takové Javě, kde třeba i malá celá čísla skončí jako jiný typ objektu, než velká celá čísla - "integer cache" - apod.)

    mě v té debatě pobavil diskutér, který podotknul, že výrok "C++ je daleko více, než jen C s objekty" mluví sám za sebe a přesně popisuje, co je hlavní problém :-) (a to říkám ve chvíli, kdy mi začíná docházet, že "něco jako templaty" by se mi dost možná hodilo...)

    Python samozřejmě propaguju (myšleno oproti věcem jako např. PHP, Java, apod.) ale ani tam se mi pár věcí moc nelíbí: např. přetěžování operátorů je u dynamicky typovaného jazyka ještě pochybnější, než u toho C++ ... proč proboha lidi mají pocit, že stringy je třeba "sčítat" pomocí + ... dtto seznamy, prostě operace s množinami jsou jiný typ operací, než aritmetika (kupecké počty) a pokud člověk nezná přesně typ objektu, tak pohled na kód naprosto neprozradí, co kód dělá (a to u dynamicky typovaného jazyka platí dvojnásob).

    zvlášť pro open source je podle mě dost důležité, aby člověk který dělá review kódu na první pohled chápal, co a proč se tam děje - i to je podle mě důvod přetrvávající popularity C v open source komunitě, resp. důvod sporů mezi celými projekty zaměřenými na C a C++ ... no ale chybějící abstrakce v C pak vede ke komplexitě systému, kdy vývojář jakoukoliv abstrakci radši outsourcuje externí knihovně či dokonce aplikaci (databáze)

    docela by mi zajímalo narazit na někoho, kdo fakt seriózně používá D a umí v tom něco napsat... vše, co jsem viděl, bylo zatím jen pár elegantních příkladů..
    WILD_A
    WILD_A --- ---
    XCHAOS: Celkem zajimava diskuze, ja osobne to vidim tak, ze C dava smysl jako doplnek k necemu vic high-level, ja osobne preferuju podle mne ultimatni kombo Python a C. Napisu v pythonu a pripadny uzky hrdla prepisu v C.
    No a pokud chci poradnou abstrakci tak nahodim Scheme/Lisp, tam muzu cokoli a neresim nic :)
    XCHAOS
    XCHAOS --- ---
    The Underhanded C Contest
    http://www.underhanded-c.org/
    XCHAOS
    XCHAOS --- ---
    já myslím, že systemd je tu ontopic... je to pěkný příklad, jak nenahradit shellové skripty jediným monolitickým molochem v C (mě to tuhne při startu notebook na baterie a občas i při vypnutí nebo po probuzení z uspání, apod.)
    WILD_A
    WILD_A --- ---
    Varianta nastavit core_pattern v /proc/sys je az to posledni co bych udelal.
    WILD_A
    WILD_A --- ---
    Tohle asi neni spravny misto, ale treba ma nekdo zkusenost ... podelanej systemd ... jak se da vycistit systemd-journal od starych coredumpu? A taky neda se nejak systemd donutit aby mi dump hazel rovnou do aktualniho adresare a ja nemusel furt dokola psat coredumpctl .. smeruju otazku hlavne na vyvojare z redhatu,. pac tam uz systemd jede ne, alespon fedora urcite? :)
    XCHAOS
    XCHAOS --- ---
    WILD_A: no, jde o interface nad dynamickými objekty v čistém C, kdy voláš:
    (objekt->interface->metoda *)(objekt, parametry)
    jde s tím dělat různé srandičky, jako polymorfismus mezi objekty se stejným typem interfacu. v C ale narazíš na to, že nemůžeš přetížit aritmetické operátory, apod. na druhou stranu, různá podivná chování při např. matematickými operacemi mezi čísly a stringem jsou nejčastější příčiny divných překvapení ve většině dynamicky typovaných skriptovacích jazyků. takže nevím, jestli se o soutěže o ještě větší zmatení zapojovat, a neponechat prostě matematické operátory primitivním číselným typům a nepracovat s objekty zásadně jinak)

    (stejně mám vymyšlené makro, které to, co jsem popsal výše, zvládne expandovat bez "double evaluation" problému, kterým C preprocesor trpí... takže tím bude možné zavolat metodu objektu vráceného jinou metodou... samozřejmě, hezké to není, ale ani vygenerovaný C kód by to stejně moc jinak dělat nemohl)

    např. call(metoda2, call(metoda1, objekt, parametry), parametry) - za předpokladu, že oproti tomu, co je zvykem v jiných objektových jazycích, je tam pořadí typu "metoda , objekt" místo "objekt.metoda" ... ale to je právě v duchu C, kde se struktury předávají jako parametry funkcím.

    jen nevím, jestli tomu makru říkat "call()" nebo stručněji "go()" - logické je imho call, protože to není žádné goto (JMP) ale klasické volání funkce s returnem.

    no ale dokud nereleasnu něco použitelného, tak jsem na tom trochu jako Rossi s tou studenou funkcí :-) každopádně ten pocit, že v C "vím, co vygenerovaný kód přesně dělá" (min. teda v paměti) je hrozně návykový a člověku se nechce to opouštět, když to jednou zná.
    WILD_A
    WILD_A --- ---
    WILD_A: tj staci lex/yacc a vyrabet clang AST a je to v podstate hotovy.
    WILD_A
    WILD_A --- ---
    XCHAOS: pokud bys vzal ten clang, libtooling nebo jak se jmenuje ta knihovna a vyrabel to AST parsovanim vlastniho jazyka a pak jen vypliv C kod tak by to mohlo vyhovovat ne? Nevim jak ten C kod teda vypada, ale rekl bych, ze by to mohlo byt docela srozumitelny, je to preci jen furt C.
    XCHAOS
    XCHAOS --- ---
    Jinak naprosto šokující je pro mě tenhle způsob zneužití preprocessoru:
    99 Bottles of Beer | Language C/C++ Preprocessor
    http://www.99-bottles-of-beer.net/language-c-c++-preprocessor-996.html
    já sám se naučil s preprocesorem pár triků (dejme tomu žonglovat s proměnným počtem míčků a vybrat z nich vždy ten první řadě). tenhle člověk ale umí vytáhnout z klobouku slona (s využitím 8slonů, v průběhu procesu)
    XCHAOS
    XCHAOS --- ---
    DANIELSOFT: jéééé :-)
    (jak jinak by taky šlo přeložit http://www.99-bottles-of-beer.net/language-c-c++-preprocessor-115.html ... )
    DANIELSOFT
    DANIELSOFT --- ---
    DANIELSOFT: a teďka ještě vidím v man gcc

    -E Stop after the preprocessing stage; do not run the compiler proper. The output is in the form of preprocessed source code, which
    is sent to the standard output.

    Input files which don’t require preprocessing are ignored.
    DANIELSOFT
    DANIELSOFT --- ---
    XCHAOS: v GCC je C preprocessor binárka jménem "cpp", která lze volat i zvlášť (já ji mám třeba v /usr/bin/cpp)
    XCHAOS
    XCHAOS --- ---
    já popravdě pořád ještě bojuju s pokušením místo generování C kódu vymyslet nějakou sadu C99 maker a funkcí a typedefů, která mi umožní psát pro mě příjemný kód, který se přímo přeloží jako C zdroják :-) ale pohybuju se s tím dost v kruhu, přiznám se - když člověk jednou přičichne k jednoduchosti pythonu, tak pro něj C začne být najednou pracné :)

    (jinak parserů textu jsem v životě napsal už několik, a nepokládám to za extra složité - ostatně kontextové gramatiky a zásobníkové automaty jsou jedna z věcí, ze kterých jsem na VŠ zrovna nepropadl ...a může být pro mě jednodušší nějaký vlastní napsat, než se učit nějaký cizí... jde v podstatě jen o to, aby se tam nemuselo volání metody objektu "číselná konstanta" psát 0..něco nebo (0).něco - jako v Javě - protože 0.něco je chybný zápis plovoucí desetinné čárky :-))

    jedna z věcí, na kterých trvám, je ale rozhodně to, aby pro mě vygenerovaný C mezi-kód byl srozumitelný (ať už ho vygeneruju parserem, nebo makry)

    BTW, lze zavolat gcc v režimu "pouze C preprocesor"? to by mi pro debugování čehosi, v čem se vrtám, docela dost pomohlo .-)
    WILD_A
    WILD_A --- ---
    ANT_39: Myslel jsem si to, nikdy jsem na to totiz nenarazil.
    V tomhle je ten clang dobrej, prace s AST je tam snadna.
    ANT_39
    ANT_39 --- ---
    WILD_A: Ne, GCC generovat C neumi.
    WILD_A
    WILD_A --- ---
    XCHAOS: Pokud chces jen generovat C kod z neceho jinyho tak bych na to sel mozna pres clang, sice je to c++ ale celkem smysluplny a clang AST je masivni a da se v nem vyjadrit spousta veci a navic umi plivat z AST zase zpet C. (Coz u gcc nevim jestli jde). Ja clang pouzil jen na statickou analyzu teda, ale prislo mi to snadny a jasny.
    Kliknutím sem můžete změnit nastavení reklam