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 11:22 | Zajímavý článek

Článek Cheat: když je manpage příliš dlouhá na MojeFedora.cz představuje v Pythonu napsaný nástroj cheat pracující s cheatsheety aneb tím nejdůležitějším z manuálových stránek. Příkaz cheat místo dlouhé manuálové stránky zobrazí krátký seznam příkladů použití daného příkazu.

Ladislav Hagara | Komentářů: 1
včera 02:22 | Nová verze

Byla vydána verze 1.5.0 emulátoru terminálu Terminology (GitHub) postaveného nad EFL (Enlightenment Foundation Libraries). Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
20.7. 21:55 | Nová verze

Byla vydána verze 0.72 populárního telnet a ssh klienta PuTTY. Podrobnosti v přehledu změn. Řešeno je také několik bezpečnostních chyb. Jejich nalezení bylo sponzorováno Evropskou komisí.

Ladislav Hagara | Komentářů: 0
19.7. 21:44 | Zajímavý článek

DataSpii Report podrobně rozebírá únik citlivých dat skrze osm rozšíření webových prohlížečů (Hover Zoom, SpeakIt!, SuperZoom, SaveFrom.net Helper, FairShare Unlock, PanelMeasurement, Branded Surveys, Panel Community Surveys) a jejich téměř okamžitý prodej.

Ladislav Hagara | Komentářů: 0
19.7. 11:44 | Zajímavý článek

Článek na Fedora Magazine rozebírá možnosti modifikace lokálních účtů Windows, například resetování hesla, pomocí Fedory nebo libovolné jiné linuxové distribuce a nástroje chntpw.

Ladislav Hagara | Komentářů: 5
19.7. 00:11 | Nová verze

Po více než dvou měsících od vydání Red Hat Enterprise Linuxu 8 byl ve verzi 8 vydán také jeho klon Oracle Linux (Wikipedie). Podrobnosti v příspěvku na blogu.

Ladislav Hagara | Komentářů: 11
18.7. 12:11 | Komunita

Na YouTube byly zveřejněny videozáznamy přednášek z konference a setkání vývojářů a uživatelů svobodných grafických softwarů Libre Graphics Meeting 2019.

Ladislav Hagara | Komentářů: 1
17.7. 20:00 | Komunita

Tým Fedory pro diverzitu a inkluzi organizuje Fedora Women’s Day (FWD) 2019. Oslavy žen přispívajících do open source projektů včetně Fedory budou probíhat po celém světě v měsících září a říjen. Návrhy akcí lze předkládat do pátku 23. srpna 2019.

Ladislav Hagara | Komentářů: 151
17.7. 19:22 | Zajímavý článek

Společnost Intezer zabývající se počítačovou bezpečností publikovala na svém blogu analýzu malwaru pojmenovaného EvilGnome, poněvadž se malware tváří jako rozšíření GNOME Shellu. Výzkumníci spojují EvilGnome s hackerskou skupinou Gamaredon.

Ladislav Hagara | Komentářů: 9
17.7. 15:00 | Nová verze

Byla vydána nová verze 19.7 open source firewallové a routovací platformy OPNsense (Wikipedie). Jedná se o fork pfSense postavený na HardenedBSD. Kódový název OPNsense 19.7 je Jazzy Jaguar. Přehled novinek v příspěvku na blogu.

Ladislav Hagara | Komentářů: 0
Používáte ještě 32bitový software na PC?
 (18%)
 (14%)
 (19%)
 (47%)
 (7%)
 (29%)
Celkem 170 hlasů
 Komentářů: 11, poslední 19.7. 21:05
Rozcestník

Dotaz: Vlastný programovací jazyk - tail rekurzia

7.7. 06:16 hermes
Vlastný programovací jazyk - tail rekurzia
Přečteno: 414×
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. 12:11 debian+
Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia
7.7. 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. 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
8.7. 11:39 hermes
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. 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í.
8.7. 11:12 hermes
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. 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. 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.
14.7. 08:37 hermes
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. 11:41 Bystroushaak | skóre: 35 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: Vlastný programovací jazyk - tail rekurzia
A nechceš o tom napsat blog?
15.7. 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.