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

    O víkendu probíhá konference OpenAlt 2025. Na programu je spousta zajímavých přednášek. Pokud jste v Brně, stavte se. Vstup zdarma.

    Ladislav Hagara | Komentářů: 0
    dnes 00:55 | IT novinky

    Josef Průša představil novou velkoformátovou uzavřenou CoreXY 3D tiskárnu Prusa CORE One L a nový open source standard chytrých cívek OpenPrintTag i s novou přepracovanou špulkou.

    Ladislav Hagara | Komentářů: 3
    včera 18:33 | IT novinky

    Na GOG.com běží Autumn Sale. Při té příležitosti je zdarma hororová počítačová hra STASIS (ProtonDB: Platinum).

    Ladislav Hagara | Komentářů: 0
    včera 13:22 | Komunita

    Ubuntu 25.10 má nově balíčky sestavené také pro úroveň mikroarchitektury x86-64-v3 (amd64v3).

    Ladislav Hagara | Komentářů: 8
    včera 01:22 | Nová verze

    Byla vydána verze 1.91.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    včera 00:11 | IT novinky

    Ministerstvo průmyslu a obchodu vyhlásilo druhou veřejnou soutěž v programu TWIST, který podporuje výzkum, vývoj a využití umělé inteligence v podnikání. Firmy mohou získat až 30 milionů korun na jeden projekt zaměřený na nové produkty či inovaci podnikových procesů. Návrhy projektů lze podávat od 31. října do 17. prosince 2025. Celková alokace výzvy činí 800 milionů korun.

    Ladislav Hagara | Komentářů: 5
    30.10. 23:44 | Komunita

    Google v srpnu oznámil, že na „certifikovaných“ zařízeních s Androidem omezí instalaci aplikací (včetně „sideloadingu“) tak, že bude vyžadovat, aby aplikace byly podepsány centrálně registrovanými vývojáři s ověřenou identitou. Iniciativa Keep Android Open se to snaží zvrátit. Podepsat lze otevřený dopis adresovaný Googlu nebo petici na Change.org.

    Ladislav Hagara | Komentářů: 0
    30.10. 15:22 | Nová verze

    Byla vydána nová verze 18 integrovaného vývojového prostředí (IDE) Qt Creator. S podporou Development Containers. Podrobný přehled novinek v changelogu.

    Ladislav Hagara | Komentářů: 2
    30.10. 12:55 | Nová verze

    Cursor (Wikipedie) od společnosti Anysphere byl vydán ve verzi 2.0. Jedná se o multiplatformní proprietární editor kódů s podporou AI (vibe coding).

    Ladislav Hagara | Komentářů: 1
    30.10. 02:55 | Nová verze

    Google Chrome 142 byl prohlášen za stabilní. Nejnovější stabilní verze 142.0.7444.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 20 bezpečnostních chyb. Za nejvážnější z nich bylo vyplaceno 50 000 dolarů. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    Jaké řešení používáte k vývoji / práci?
     (35%)
     (48%)
     (19%)
     (18%)
     (23%)
     (16%)
     (21%)
     (16%)
     (17%)
    Celkem 292 hlasů
     Komentářů: 14, poslední 14.10. 09:04
    Rozcestník
    Štítky: není přiřazen žádný štítek

    Tail rekurze v erlangu

    14.4.2007 10:06 | Přečteno: 1225× | erlang | Výběrový blog

    Ve funkcionálních jazycích se spousta (většina?) algorimů zapisuje jako rekurze. Nejinak je tomu i u erlangu. Jenže rekurze je pro normální dnešní CPU fuj a tak se to řeší (a nejen ve funkcionálních jazycích) tzv. tail rekurzí. Prakticky jde o nahrazení rekurze cyklem a nealokuje se kvůli tomu další paměť na zásobníku, ale různé jazyky se s tím umí vyrovnat různě.

    Například výpočet faktoriálu:

    -module(fact).
    -export([fact/1, fact2/1]).
    
    fact(N) when N>0 -> N*fact(N-1);
    fact(0) -> 1.
    
    fact2(0) -> 1;
    fact2(N) when N>0 -> fact2(N-1, N).
    
    fact2(0, Res) -> Res;
    fact2(N, Res) -> fact2(N-1, N*Res).
    Varianta fact bohužel v erlangu skončí skutečnou rekurzí, kdežto fact2 udělá cyklus kolem fact2/2 kódu. Například Haskel se tuším vypořádá dokonce i s ekvivalentem zápisu fact. Pokud si to chcete vyzkoušet, tak si zkuste vypočítat fact2(50000) a pak fact(50000). To druhé začne velmi záhy swapovat a následně to shodí BEAN pod nímž to spustíte (pokud máte opravdu hodně swapu a paměti, tak si zvolte ještě větší číslo :-))

           

    Hodnocení: 86 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

    14.4.2007 18:03 Messa | skóre: 39 | blog: Messa
    Rozbalit Rozbalit vše Re: Tail rekurze v erlangu
    Tohle umí gcc -O2 taky. (Možná pro někoho samozřejmost, ale mě to překvapilo.)
    14.4.2007 20:49 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Tail rekurze v erlangu
    Na úrovni haskelu nebo erlangu? Předpokládám, že spíš to druhé, ne?
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    14.4.2007 21:03 Messa | skóre: 39 | blog: Messa
    Rozbalit Rozbalit vše Re: Tail rekurze v erlangu
    Konkrétně u tohoto příkladu na úrovni Haskelu.
    int fact (int n) {
    	if (n == 0) return 1;
    	return n * fact (n-1); }
    a v assembleru je vidět krásná smyčka, žádný call.

    Snad nikoho neurážím, že vám sem do funkcionálního programování tahám C :-)
    14.4.2007 21:48 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
    Rozbalit Rozbalit vše Re: Tail rekurze v erlangu
    Snad nikoho neurážím, že vám sem do funkcionálního programování tahám C :-)
    Nene, dík za informaci. To se hodí vědět.
    XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
    14.4.2007 23:26 Tom.š Ze.le.in | skóre: 21 | blog: tz
    Rozbalit Rozbalit vše Re: Tail rekurze v erlangu
    Otázka je, jak toho dosahuje. Zkusil jsem rekurzi mezi dvěma funkcemi, a zdá se, že nedělá tail call vždy:
    int foo (int a, int b);
    int bar (int c, int a, int b)
    {
            return (0==b) ? a : foo(a, --b);
    }
    
    int foo (int a, int b)
    {
            return bar(1, a, b);
    }
    
    gcc -S -O2 --omit-frame-pointer test.c
    
    foo:
            subl    $12, %esp
            movl    20(%esp), %eax
            movl    $1, 8(%esp)
            movl    %eax, 4(%esp)
            movl    16(%esp), %eax
            movl    %eax, (%esp)
            call    bar
            addl    $12, %esp
            ret
    
    bar:
            movl    8(%esp), %eax
            movl    4(%esp), %edx
            testl   %eax, %eax
            jne     .L8
            movl    %edx, %eax
            ret
    .L8:
            subl    $1, %eax
            movl    %eax, 8(%esp)
            jmp     foo
    
    Jinými slovy, je to hezká optimalizace, ale plně bych se na ní při rekurzivním psaní programu nespoléhal (ostatně, norma C nic takového nepožaduje).
    14.4.2007 23:44 deda.jabko | skóre: 23 | blog: blog co se jmenuje "každý den jinak" | za new york city dvakrát doleva a pak už se doptáte
    Rozbalit Rozbalit vše Re: Tail rekurze v erlangu
    v jake verzi to je? v gcc 3.4.6 to nejde ani s -O2 ani s -O3... porad pouziva call...
    Asi před rokem se dostali hackeři na servry Debianu a ukradli jim zdrojové kódy.
    15.4.2007 00:02 Tom.š Ze.le.in | skóre: 21 | blog: tz
    Rozbalit Rozbalit vše Re: Tail rekurze v erlangu
    Mně to funguje v 4.1.1, ale podle changelogu to bylo už v 3.0.1.
    15.4.2007 01:17 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: Tail rekurze v erlangu
    Chm, chmm, ten patch poslal už v květnu 2000 Jan Hubička a objevilo se to už v tom úchylném „GCC 2.96“. ;-)

    Založit nové vláknoNahoru

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