• ú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
    /* Toto je klub především pro lidi, pro které je programování jednou z mnoha massive multiplayer online počítačových her, které lze hrát.
        V tomto klubu hrozí sémantická hereze a nezdravě vysoký obsah syntaktického cukru. Nevhodné pro algoritmické diabetiky.
        Od účastníků debaty se předpokládá automaticky přístup k instalovanému GNU C: sudo apt-get install build-essential
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    C (programovací jazyk)#C99 Heslo na české Wikipedii
    Jazyk C - Základy praktického programování V Praze 2oo7 pro SSPŠ Tomáš Harvie Mudruňka a kolektiv - jak si programování v C představuje většina lidí
    http://stevenkobes.com/ctest.html C Programming Puzzlers - nepouštějte se do flamewars v tomhle klubu, pokud neuhodnete aspoň polovinu správně!
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    http://en.wikipedia.org/wiki/C99 C99 is a modern dialect of the C programming language.
    http://cprogramminglanguage.net/ C programming language
    http://cprogramminglanguage.net/c-programming-language-tutorial.aspx C programming language - úvod
    http://en.wikipedia.org/wiki/Criticism_of_the_C_programming_language C makes it easy to shoot yourself in the foot. (ještě že ne do hlavy...)
    http://en.wikipedia.org/wiki/C_preprocessor
    http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html C99 makra s proměnným počtem argumentů - __VA_ARGS__
    http://gcc.gnu.org/onlinedocs/gcc/ GNU C Compiler
    http://gcc.gnu.org/onlinedocs/gcc-4.2.2/gcc/Optimize-Options.html
    http://bellard.org/tcc/ Tiny C Compiler - prý C99 compliant (min. umí __VA_ARGS__) - vhodný pro skriptování v C - umí #!/usr/bin/tcc -run
    http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest - pokud jste neviděli tohle, tak jste ještě neviděli opravdu nečitelný C zdroják
    http://bellard.org/otcc/ Obfuscated Tiny C Compiler - z tohohle vtípku vznikl Tiny C compiler
    http://en.wikipedia.org/wiki/ANSI_C Jak se střelit do nohy standardizovaným způsobem.
    http://eli-project.sourceforge.net/c_html/c.html ANSI C Specification
    http://www.lysator.liu.se/c/ Různý ANSI C bordel
    http://www.cs.rit.edu/~ats/books/ooc.pdf Object Oriented Programming with ANSI-C - a pak že to nejde
    http://en.wikipedia.org/wiki/Longjmp co jsou to setjmp()/longjmp() knihovní funkce (pro všechny, podle kterých to bez C++ try { } catch() ... nejde)
    http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/dcdc710c27f47c72 C neumí správně počítat (?)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    http://www.fastcgi.com/ FastCGI is simple because it is actually CGI with only a few extensions.
    http://www.metalshell.com/source_code/18/Mysql_Select.html How to do a simple connection and select with mysql
    http://xmlsoft.org/ The XML C parser and toolkit of Gnome
    http://curl.haxx.se/libcurl/ libcurl - the multiprotocol file transfer library
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    https://dev.arachne.cz/svn/cll1h SVN/Trac jazyka C<<1 (user-friendly nadstavba nad ANSI C99 - ve stylu JQuery vs. JavaScript)
    Benchmark iterace a serializace stringů v různých jazycích vs. v C
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        moderátor se velice zhruba řídí zvyklostmi moderace, která kdysi platila v řadě konferencí sítě FidoNet ... C != 0xdead */
    rozbalit záhlaví
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    XCHAOS: Procesor vetsinou nedokaze prirazeni/indexovani jednou operaci na registrech ani v cistem C.

    XCHAOS: Na pole fixni velikosti zapomen :-D
    Jenak je to uplne burta, kdyz uz to mas na heapu (a na stack se to nevejde ani omylem), a druhak by to predpokladalo ze aplikace bezi v prave jednom rozliseni, coz nebezi.
    XCHAOS
    XCHAOS --- ---
    WILD_A: no, obávám se, že v éře, kdy myší už ani nemusíš klikat, aby nastal nějaký ten onMouseOver() event, budeme mít problém vysvětlil většině, proč se nám nelíbí, že věci jako přiřazení nebo indexování pole neměly dělat nic, co by procesor nedokázal provést jedinou instrukcí zpracovávající hodnoty v registrech...
    WILD_A
    WILD_A --- ---
    ANT_39: No pokud se tam dejou brikule, tak mi to na miste neprijde, jelikoz to budi dojem, ze to je jen index a ocekavam tam maximalne nejakej strom nebo hash a ono je to pak cely slozitejsi. Ja mam rad kdyz kod ukazuje co dela, takze pokud delam brikule tak dam kontejner.brikule(x) at je to videt.

    Ale je to jen muj postoj vzhledem ke zkusenostem, ktery jsem udelal, mluvim teda ted konkretne o C++.
    REDGUY
    REDGUY --- ---
    XCHAOS: Ne pro uspech, pro nesmysl, stejne jako minus na zprave na kterou ted odpovidam. To jsi moc nepochopil smysl minusu 8)
    XCHAOS
    XCHAOS --- ---
    (-1 od id REDGUY, pro velký úspěch...)

    ANT_39: ... to znamená, že má pocit, že se to děje magicky samo a nic to nestojí :-)
    ANT_39
    ANT_39 --- ---
    WILD_A: Zrovna pretezovani [] u kontejneru, * a -> u chytrejch ukazatelu, atp. dava taky dobrej smysl. Jestli se kvuli tomu musi delat brikule, tak holt musi. Stejne by se delaly, at to nazves at nebo operator[], akorat ted ma klient pristup do toho kontejneru pomoci intuitivni syntaxe.
    XCHAOS
    XCHAOS --- ---
    WILD_A: jenže ono nejde dát do jazyka nějakou feature jen k tomu, aby si matematici mohli definovat vektory a matice a doufat, že jí někdo nezneužije jinak...

    takže purismus a minimalismus C je svazující a omezující (pro mě je C ideální jazyk, kdybych zase někdy programoval panáčka, co běhá po místnostech se souřadnicemi x a y a sbírá konečný předem známý počet předmětů, apod. :-), jenže jakýkoliv jiný vyšší jazyk umožní, aby "cokoliv znamenalo cokoliv"

    + a += v Pythonu je lepší než drátem do oka. Sjednocení (řetězení) a aritmetické sčítání ale není to samé. stejně tak ale PHP/Perl tečka koliduje min. s desetinou tečkou a voláním metody objektu. konkatenace si zaslouží vlastní operátor, který matematici nemají

    (a jestli nebudu líný, tak vám předvedu brzo svoje řešení :-) sice trochu gcc only, ale elegantní :-)
    WILD_A
    WILD_A --- ---
    DAVIDOWITCH: No nekde mozna pretezovani dava smysl a je to peknej syntaktickej cukr, ale obecne je to spis k zlosti, sam uvadis priklad. Ja mam zase zkusenost s tim, ze kod co vypada super jednoduse a optimalne v realu dela za operatorem '=' a '[]' takovy brikule, ze jeden neveri ... takze mozna bych to za sebe shrnul, pretezovani u jednoznacnych matematickych operaci je ok, ale jinde bych se tomu vyhnul.
    XCHAOS
    XCHAOS --- ---
    DAVIDOWITCH: a tady jsme u otázky, jaká část programování dnes vlastně zahrnuje vyšší matematiku.

    spousta jsou jen "kupecké počty", nemluvě o rostoucím významu práce s textem (už SQL je plné textových operátorů, nejen LIKE, ale i MATCH AGAINST... a to pořád ještě nestačí pro specifika jazyků, které mísí diakritiku se zápisem bez diakritiky, apod.)

    programování 2D či 3D grafiky v nějakém konečném prostoru či rozlišení viewportu je přesně to, na co se hodí i pole fixní velikosti, apod... jenže tohle dneska není nejčastější abstrace, když člověk neprogramuje počítačové hry. dovedu si ale představit, že přetěžování je dobré pro tu matiku, problém je, že ne všichni programují jen matiku.

    při zpracování nějakých datových souborů je nejčastější operací iterování buď přes všechny prvky seznamu, nebo přes nějakou podmnožinu seznamu.

    pokud se +, += přetíží pro nějaké řetězení seznamů či přidávání prvků, tak mi prostě intuitivní nepřijde (i když je to elegantní C záznam)... (a podle mě to není intuitivní ani pro někoho, kdo tím chce sčítat ty vektory či matice)
    a=(1,)
    b=(2,)
    a+=b
    a
    (1, 2)
    DAVIDOWITCH
    DAVIDOWITCH --- ---
    Ja mam pretezovani operatoru rad, ted sem videl neco grafickyho psanyho v Jave, a to ze vektorovy operace (tj. secist bod a vektor) se musi delat po slozkach, nebo pres .Add() je hrozny.
    (Zato interne vedu mensi valku o tom ze pretezovat pro vektory 3 cisel < je spatnej napad, protoze neni jasny jestli to je "any lt" nebo "all lt" a melo by to bejt explicitne.. a clovek co zkusil udelat z ~ operator pro normalizaci vektoru to sel domu prepisovat)
    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.
    Kliknutím sem můžete změnit nastavení reklam