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 02:11 | Nová verze

    Google Chrome 152 byl prohlášen za stabilní. Nejnovější stabilní verze 152.0.7977.64 přináší řadu novinek. Podrobný přehled v poznámkách k vydání. Opraveno bylo 327 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    dnes 01:11 | Komunita

    Před 35 lety, 25. srpna 1991, oznámil Linus Benedict Torvalds v diskusní skupině comp.os.minix, že vyvíjí (svobodný) operační systém (jako koníček, nebude tak velký a profesionální jako GNU) pro klony 386 (486), že začal v dubnu a během několika měsíců by mohl mít něco použitelného.

    Ladislav Hagara | Komentářů: 0
    včera 16:33 | IT novinky

    Apple představil čipy M6 a M5 Ultra, Mac mini s M6 nebo M5 Pro a Mac Studio s M5 Max nebo M5 Ultra. Fedora Asahi Remix zatím podporuje jenom M1 a M2.

    Ladislav Hagara | Komentářů: 5
    včera 14:11 | Komunita

    Firefox 157 přinese zapnutou podporu rastrového grafického formátu JPEG XL. Založena je na v Rustu napsané implementaci jxl-rs používané i v Chrome a Chromiu.

    Ladislav Hagara | Komentářů: 0
    včera 02:11 | Nová verze

    Vanilla OS 3 „Reunion“ byl vydán. Tato na Debianu „Sid“ založená desktopová distribuce s transakčními aktualizacemi „neměnného“ základního systému (ABRoot) nově podporuje architekturu arm64 (vedle x86-64), podporuje reprodukovatelné sestavení většiny balíčků a vylepšuje systémové nástroje. Vlastní meta-správce balíčků APX nyní používá Distrobox v2 a je dostupný i pro jiné distribuce.

    |🇵🇸 | Komentářů: 0
    24.8. 16:00 | IT novinky

    Řemínky pro Apple Watch, bezdrátová sluchátka nebo nabíjecí adaptéry. Takovou nabídku našli v uplynulých dnech příslušníci Celního úřadu v Liberci při kontrole kamenného obchodu na Náchodsku. Celkem zde zadrželi 3 035 kusů zboží podezřelého z porušování práv duševního vlastnictví. Pokud by se jednalo o originální výrobky, jejich hodnota by podle odhadu přesáhla 10,8 milionu korun.

    Ladislav Hagara | Komentářů: 11
    24.8. 14:11 | Nová verze

    Byla vydána verze 31.1 textového editoru GNU Emacs. Podrobný přehled novinek v souboru NEWS.

    Ladislav Hagara | Komentářů: 5
    24.8. 12:22 | Nová verze

    Webový prohlížeč Waterfox (Wikipedie), fork Firefoxu, byl vydán ve verzi 6.7.0. Postaven je na jádru Gecko ESR 153.

    Ladislav Hagara | Komentářů: 0
    24.8. 11:22 | Nová verze

    Multiplatformní open source voxelový herní engine Luanti byl vydán ve verzi 5.17.0. Podrobný přehled novinek v changelogu. Přidána byla základní podpora gamepadů. Opraveno bylo několik zranitelností. Původně se jedná o Minecraftem inspirovaný Minetest v říjnu loňského roku přejmenovaný na Luanti.

    Ladislav Hagara | Komentářů: 0
    24.8. 11:00 | IT novinky

    Americká technologická společnost Apple loni v Irsku na daních zaplatila 17 miliard dolarů (zhruba 350 miliard Kč). To představovalo 40 procent celkové částky, kterou firma odvedla na dani z příjmů po celém světě. Vyplývá to z účetních výkazů podniku. Platbu výrazně zvýšilo rozhodnutí Soudního dvora EU z roku 2024, podle něhož měl Apple doplatit Irsku na daních 13 miliard eur (313 miliard Kč).

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (10%)
     (7%)
     (2%)
     (19%)
     (29%)
     (7%)
     (6%)
     (2%)
     (15%)
     (22%)
    Celkem 2496 hlasů
     Komentářů: 31, poslední 13.8. 00:27
    Rozcestník

    Dotaz: Vlastný programovací jazyk - tail rekurzia

    hermes avatar 7.7.2019 06:16 hermes | skóre: 7 | blog: Elektro | BA
    Vlastný programovací jazyk - tail rekurzia
    Přečteno: 741×
    Robím si vlastný programovancí jazyk kompilovateľný do JS. Lexer som si napísal sám za pomoci pattern matchingu a rekurzie. Parser za pomoci nástroja FsYacc

    Je to primárne funkcionálny jazyk, takže sa snažím aby sa dalo všetko vyhodnotiť ako výraz. Jazyk zatiaľ obsahuje len jeden jediný príkaz a to je "let" inak je všetko výraz.

    Mám už hotové vetvenie, curried funkcie, impicitné vracanie hodnoty, funckionálne operátory ako forward a backward pipe ale aj forward a backward composition, štruktúry, zoznamy, pattern matching.

    No a teraz chcem do jazyka pridať opakovanie kódu. Ale keďže cyklus je príkaz chcem ho nahradiť čistejšie pomocou rekurzie (cykly v mojom jazyku asi nakoniec vôbec nebudú, nemajú tam zmysel), lenže ak chcem aby bola rekurzia použiteľná aj pre vačší počet iterácií musím vedieť na úrovni AST detekovať tail call a ten optimalizovať (na cyklus) (rovnako potom optimalizovať aj Call/CC). Ako na to?

    Trošku sa toho bojím ale aspoň sa niečo nové naučím. Viete mi poslať nejaký článok prípadne hotový zdroják na githube pre inšpiráciu?

    Viem že by som mohol vygenerovať JS kód pre babel a na to použiť nejaký plugin napr.: https://github.com/krzkaczor/babel-plugin-tailcall-optimization ale nechcem byť závislý na cudzích riešeniach - postavených na JS (chcem ten jazyk okrem JS neskôr targetovať aj na LLVM takže tail call optimalizácie musia byť priamo súčasťou môjho compilera).

    Odpovědi

    7.7.2019 12:11 debian+
    Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia
    7.7.2019 21:38 debian+
    Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia
    Toto som nepisal ja, ale nejaky menovec, ktora sa schovava za mna.
    7.7.2019 22:22 debian+
    Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia
    Robis novy HASKEL - cisto fukcionalny jazyk? Nemyslim GNU Haskel, v nom sa implementacne ku cisto fukcionalnemu HASKEL pridali aj proceduralne veci.

    Tu mas priklad ako funkcia definovana viacerymi prikazmi, implementuje opakovanie. Ukazka (ber to ako pseudo-kod):
    zobrazi_vykricnik = putchar('!')
    
    vypis_znak n funkcia = vypis_znak (n-1) funkcia
    vypis_znak 1 funkcia = funkcia
    
    # pouzitie
    vypis_znak 3 zobrazi_vykricnik
    A citacia teba:
    (cykly v mojom jazyku asi nakoniec vôbec nebudú, nemajú tam zmysel)
    Preco riesis nieco, co mozno zrejme potrebovat nebudes? To nepridavaj. Ked vydas alpha/beta, tak pockaj na reakcie ludi a uvidis. Aj na odborne reakcie. Ale nechaj si rezervu v navrhu, ked by si to mal pridat. A neminaj energiu, ked to mozno nebude potrebne.

    k prvemu komentu: Ja som nasiel toto: https://en.wikipedia.org/wiki/Call-with-current-continuation
    hermes avatar 8.7.2019 11:39 hermes | skóre: 7 | blog: Elektro | BA
    Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia

    Nebude to pure funkcionálny jazyk, ale preferujem jednoduchosť a ak mám tail rekurziu načo sú mi ďalšie zbytočné konštrukcie? Rekurzia mi príde jednoduchšia na pochopenie a je menej náchylná na chyby.

    Multiple dispatch ala haskell tam zatiaľ nemám, ale plánujem ho tam tiež pridať, ale najprv musím vyriešiť najpodstatnejšiu vec a tou je TCO lebo bez nej sa ďalej nepohnem.
    7.7.2019 22:29 Radovan
    Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia
    Je to "tail-call", takže ti stačí zjistit jestli je to poslední příkaz funkce. Prostě to nejde použít jako cyklus někde v kódu, ale jenom pro celou funkci.

    Když jsem si kdysi hrál s Karlem 85 pro ZX Spectrum, tak ten to jakýmsi způsobem umí také, nepodařilo se mi tam zaplnit zásobník ani po několikahodinovém vnořování.
    hermes avatar 8.7.2019 11:12 hermes | skóre: 7 | blog: Elektro | BA
    Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia

    Neni to až také jednoduché, skúsim to priblížiť. V mojom jazyku sa takáto funkcia (reprezentujúca cyklus):

    let loop = func i max -> (
        log ("Iteration: " + i)
        if i = max then ()
        else loop (i + 1) max
    )
    
    loop 0 5
    

    skompiluje na takéto AST: AST obrázok

    a z neho potom vygenerujem takýto JS kód:

    (() => {
        const loop = i => max => {
            console.log(`Iteration: ` + i);
            return (
                i === max
                    ? undefined
                    : loop(i + 1)(max)
            );
        };
        return loop(0)(5);
    })()
    
    takže medzi returnom a rekurzívnym volaním sa nachádza ešte vetvenie, ako teda detekujem koncové volanie keď rekurzívne volanie neni úplne na konci? Skúšal som aj on the fly TCO optimalizáciu cez takúto trampoline funkciu:
    function tco(f) {
        var value, active = false, accumulated = []
        return function accumulator() {
            accumulated.push(arguments)
            if (!active) {
                active = true
                while (accumulated.length) value = f.apply(this, accumulated.shift())
                active = false
                return value
            }
        }
    }
    ale tá bohužiaľ nefunguje s curried funkciami (funkcia poskladaná viacerých funkcií - čo argument to vnorená funkcia), ale ajtak riešenie až v run-time sa mi nepáči Takže ešte sa vrártim k pôvodným otázkam: 1. ako detekujem ten tail call. 2. ako ho nahradím Hľadám najjednoduchšie riešenie. Vôbec by mi nevadilo keby sa o TCO postaral nástroj tretej strany. Uvažujem nad tým že prepíšem generátor a nebudem generovať priamo js kód, ale to prevediem do LLVM IL a až LLC sa postará o optimalizáciu (LLVM to podporuje) a (z LLVM sa dá vraj generovať aj JS kód) otázka je ako si LLVM poradí s tými curried funkciami a či dokáže optimalizovať aj tie.
    8.7.2019 21:46 Radovan
    Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia
    Pokud rekurze není na konci, tak to není koncové volání a prostě to nedetekuješ. Ale můžeš použít goto.
    9.7.2019 18:13 debian+
    Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia
    Nemas pravdu. Na anglickej wikipedia su napisane podmienky, kedy sa jedna o tail funkciu.
    hermes avatar 14.7.2019 08:37 hermes | skóre: 7 | blog: Elektro | BA
    Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia

    Tak som to nakoniec vyriešil veľmi Šalamúnsky, keď pojde jazyk na github tak uvidíte ako. Prepísal som včera celý generátor už sa negeneruje priamo javascript, ale iný medzikód (zatiaľ chcem držať v tajnosti aký) a z toho medzikódu budem vedieť generovať jak natívne binárky (pre X86, X64 aj ARM; Linux, Windows, Mac OS), tak aj JS a WebAssembly a dokonca .NET CIL, LLVM IR, HLVM.

    Takže tým že som vyriešil tail rekurziu som prakticky zadarmo pre môj jazyk získal multiplatformovosť a kopu ďaších nových vlastností.

    Bystroushaak avatar 15.7.2019 11:41 Bystroushaak | skóre: 36 | blog: Bystroushaakův blog | Praha
    Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia
    A nechceš o tom napsat blog?
    15.7.2019 11:57 Xerces
    Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia
    Takže jako v životě. Teprve když to má ocas, tak to za něco stojí. :-)

    Založit nové vláknoNahoru

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

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