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 17:22 | Nová verze

    Byl vydán Linux Mint 22.2 s kódovým jménem Zara. Podrobnosti v přehledu novinek a poznámkách k vydání. Vypíchnout lze novou XApp aplikaci Fingwit pro autentizaci pomocí otisků prstů nebo vlastní fork knihovny libAdwaita s názvem libAdapta podporující grafická témata. Linux Mint 22.2 bude podporován do roku 2029.

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

    Čínská společnost Tencent uvolnila svůj AI model HunyuanWorld-Voyager pro generování videí 3D světů z jednoho obrázku a určené trajektorie kamery. Licence ale nedovoluje jeho používání na území Evropské unie, Spojeného království a Jižní Koreje.

    Ladislav Hagara | Komentářů: 1
    dnes 12:11 | Komunita

    Blender Studio se spojilo s kapelou OK Go a výsledkem je videoklip k písni Impulse Purchase. Stejně jako samotný 3D software Blender je i ve videoklipu použitý animovaný chlápek open source. Kdokoli si jej může stáhnout a upravovat.

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

    Zig Software Foundation stojící za programovacím jazykem Zig publikovala finanční zprávu za rok 2024. Současně s prosbou o finanční příspěvek.

    Ladislav Hagara | Komentářů: 0
    dnes 00:22 | Nová verze

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za srpen (YouTube). Vypíchnuta je podpora Tabulek Google, implementace Gamepad API a Cookie Store API nebo také podpora WebGL na Linuxu.

    Ladislav Hagara | Komentářů: 0
    včera 20:44 | Komunita

    openSUSE Leap 16, včetně Leap Micra 6.2+, nově nabízí 24 měsíců podpory pro každé vydání. To je dva roky aktualizací a stability, což z něj činí nejdéle podporovanou komunitní distribuci vůbec. Leap se tak stává ideální platformou pro všechny, kdo hledají moderní, stabilní a dlouhodobě podporovanou komunitní Linux distribuci.

    lkocman | Komentářů: 0
    včera 16:33 | Bezpečnostní upozornění

    Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) vydal dne 3. 9. 2025 VAROVÁNÍ před hrozbou v oblasti kybernetické bezpečnosti spočívající v předávání systémových a uživatelských dat do Čínské lidové republiky a ve vzdálené správě technických aktiv vykonávané z území Čínské lidové republiky. Varováním se musí zabývat povinné osoby podle zákona o kybernetické bezpečnosti.

    Ladislav Hagara | Komentářů: 27
    včera 11:55 | IT novinky

    Americká internetová společnost Google nemusí prodat svůj prohlížeč Chrome ani operační systém Android. Rozhodl o tom soud ve Washingtonu, který tak zamítl požadavek amerického ministerstva spravedlnosti. Soud ale firmě nařídil sdílet data s jinými podniky v zájmu posílení konkurence v oblasti internetového vyhledávání. Zároveň Googlu zakázal uzavírat dohody s výrobci mobilních a dalších zařízení, které by znemožňovaly

    … více »
    Ladislav Hagara | Komentářů: 3
    včera 11:33 | Humor

    Prvního září ozbrojení policisté zatkli na na londýnském letišti Heathrow scénáristu a režiséra Grahama Linehana, známého především komediálními seriály Ajťáci, Otec Ted nebo Black Books. Během výslechu měl 57letý Graham nebezpečně zvýšený krevní tlak až na samou hranici mrtvice a proto byl z policejní stanice převezen do nemocnice. Důvodem zatčení bylo údajné podněcování násilí v jeho 'vtipných' příspěvcích na sociální síti

    … více »
    Gréta | Komentářů: 104
    včera 10:22 | Pozvánky

    Studentská dílna Macgyver zve na další Virtuální Bastlírnu - pravidelné online setkání všech, kdo mají blízko k bastlení, elektronice, IT, vědě a technice. Letní prázdniny jsou za námi a je čas probrat novinky, které se přes srpen nahromadily. Tentokrát jich je více než 50! Těšit se můžete mimo jiné na:

    Hardware – Bus Pirate na ESP32, reverse engineering Raspberry Pi, pseudo-ZX-80 na RISC-V, PicoCalc, organizéry na nářadí z pěny nebo … více »
    bkralik | Komentářů: 0
    Pro otevření více webových stránek ve webovém prohlížečí používám
     (82%)
     (8%)
     (2%)
     (3%)
     (4%)
     (1%)
    Celkem 142 hlasů
     Komentářů: 11, poslední dnes 16:12
    Rozcestník

    Kompilátor jazyka BC pro Parrot VM

    27.11.2007 17:09 | Přečteno: 1092× | Perl 6 a Parrot | Výběrový blog | poslední úprava: 27.11.2007 17:22

    BC je taková složitější kalkulačka. Od včerejška je napsání kompilátoru jazyka bc pro virtuální stroj Parrot maličkost. Stačí napsat: Stáhneme aktuální revizi Parrotu a přidáme abc do adresáře s jazyky, doladíme Makefiles a spustíme kompilaci.

    Vytvoříme test jazyka:

    abc> cat in.abc
    
    (1 + 3) * 2
    

    Překontrolujeme syntaktický strom:

    abc>../../parrot abc.pbc --target=parse in.abc 
    
    "parse" => PMC 'ABC::Grammar' => "(1 + 3) * 2" @ 0 {
        <statement_list> => PMC 'ABC::Grammar' => "(1 + 3) * 2" @ 0 {
            <statement> => ResizablePMCArray (size:1) [
                PMC 'ABC::Grammar' => "(1 + 3) * 2" @ 0 {
                    <expression> => PMC 'ABC::Grammar' => "(1 + 3) * 2" @ 0 {
                        <expr> => PMC 'PGE::Match' => "*" @ 8 {
                            <type> => "infix:*"
                            <top> => Hash {
                                "arity" => 2,
                                "assoc" => "left",
                                "expect" => 258,
                                "looser" => "infix:^",
                                "match" => "PGE::Match",
                                "name" => "infix:*",
                                "pirop" => "n_mul",
                                "precclose" => "<<<<=",
                                "precedence" => \parse[0]["precclose"],
                                "syncat" => 96
                            }
                            [0] => PMC 'PGE::Match' => "(" @ 0 {
                                <type> => "circumfix:( )"
                                <top> => Hash {
                                    "arity" => 1,
                                    "assoc" => "left",
                                    "equiv" => "term:",
                                    "expect" => 257,
                                    "keyclose" => ")",
                                    "match" => "PGE::Match",
                                    "name" => "circumfix:( )",
                                    "pirop" => "set",
                                    "precclose" => "=",
                                    "precedence" => \parse[0]["precclose"],
                                    "syncat" => 144
                                }
                                [0] => PMC 'PGE::Match' => "+" @ 3 {
                                    <type> => "infix:+"
                                    <top> => Hash {
                                        "arity" => 2,
                                        "assoc" => "left",
                                        "expect" => 258,
                                        "looser" => "infix:*",
                                        "match" => "PGE::Match",
                                        "name" => "infix:+",
                                        "pirop" => "n_add",
                                        "precclose" => "<<<<<=",
                                        "precedence" => \parse[0]["precclose"],
                                        "syncat" => 96
                                    }
                                    [0] => PMC 'ABC::Grammar' => "1" @ 1 {
                                        <integer> => PMC 'ABC::Grammar' => "1" @ 1
                                        <type> => "term:"
                                        <top> => Hash {
                                            "assoc" => "left",
                                            "expect" => 513,
                                            "match" => "PGE::Match",
                                            "name" => "term:",
                                            "parsed" => PMC 'Sub' { ... },
                                            "precclose" => "=",
                                            "precedence" => \parse[0]["precclose"],
                                            "syncat" => 16
                                        }
                                    }
                                    [1] => PMC 'ABC::Grammar' => "3" @ 5 {
                                        <integer> => PMC 'ABC::Grammar' => "3" @ 5
                                        <type> => "term:"
                                        <top> => \parse[0]
                                    }
                                }
                            }
                            [1] => PMC 'ABC::Grammar' => "2" @ 10 {
                                <integer> => PMC 'ABC::Grammar' => "2" @ 10
                                <type> => "term:"
                                <top> => \parse[0]
                            }
                        }
                    }
                }
            ]
        }
    }
    

    Překontrolujeme AST:

    abc>../../parrot abc.pbc --target=past in.abc 
    
    "past" => PMC 'PAST::Stmts'  {
        <source> => "(1 + 3) * 2"
        <pos> => 0
        [0] => PMC 'PAST::Op'  {
            <name> => "saynum"
            <pasttype> => "call"
            [0] => PMC 'PAST::Op'  {
                <pasttype> => "bind"
                [0] => PMC 'PAST::Var'  {
                    <name> => "last"
                    <scope> => "package"
                    <lvalue> => 1
                }
                [1] => PMC 'PAST::Op'  {
                    <name> => "infix:*"
                    <pasttype> => undef
                    <pirop> => "n_mul"
                    <lvalue> => undef
                    <source> => "*"
                    <pos> => 8
                    [0] => PMC 'PAST::Op'  {
                        <name> => "circumfix:( )"
                        <pasttype> => undef
                        <pirop> => "set"
                        <lvalue> => undef
                        <source> => "("
                        <pos> => 0
                        [0] => PMC 'PAST::Op'  {
                            <name> => "infix:+"
                            <pasttype> => undef
                            <pirop> => "n_add"
                            <lvalue> => undef
                            <source> => "+"
                            <pos> => 3
                            [0] => PMC 'PAST::Val'  {
                                <value> => "1"
                                <returns> => "Integer"
                                <source> => "1"
                                <pos> => 1
                            }
                            [1] => PMC 'PAST::Val'  {
                                <value> => "3"
                                <returns> => "Integer"
                                <source> => "3"
                                <pos> => 5
                            }
                        }
                    }
                    [1] => PMC 'PAST::Val'  {
                        <value> => "2"
                        <returns> => "Integer"
                        <source> => "2"
                        <pos> => 10
                    }
                }
            }
        }
    }
    

    Případně překontrolujeme i POST:

    abc>../../parrot abc.pbc --target=post in.abc 
    
    "post" => PMC 'POST::Ops'  {
        <source> => "(1 + 3) * 2"
        <pos> => 0
        <result> => PMC 'POST::Ops'  {
            <source> => null
            <pos> => \post
            <result> => "$P14"
            [0] => PMC 'POST::Ops'  {
                <source> => \post
                <pos> => \post
                <result> => PMC 'POST::Op'  {
                    <pirop> => "set_global"
                    <result> => PMC 'POST::Ops'  {
                        <source> => "*"
                        <pos> => 8
                        <result> => "$P13"
                        [0] => PMC 'POST::Ops'  {
                            <source> => "("
                            <pos> => 0
                            <result> => "$P12"
                            [0] => PMC 'POST::Ops'  {
                                <source> => "+"
                                <pos> => 3
                                <result> => "$P11"
                                [0] => PMC 'POST::Ops'  {
                                    <source> => "1"
                                    <pos> => 1
                                    <result> => "$P10"
                                    [0] => PMC 'POST::Op'  {
                                        <pirop> => "new"
                                        [0] => "$P10"
                                        [1] => "\"Integer\""
                                    }
                                    [1] => PMC 'POST::Op'  {
                                        <pirop> => "assign"
                                        [0] => "$P10"
                                        [1] => "1"
                                    }
                                }
                                [1] => PMC 'POST::Ops'  {
                                    <source> => "3"
                                    <pos> => 5
                                    <result> => "3"
                                }
                                [2] => PMC 'POST::Op'  {
                                    <pirop> => "n_add"
                                    [0] => "$P11"
                                    [1] => \post
                                    [2] => \post
                                }
                            }
                            [1] => PMC 'POST::Op'  {
                                <pirop> => "set"
                                [0] => "$P12"
                                [1] => \post
                            }
                        }
                        [1] => PMC 'POST::Ops'  {
                            <source> => "2"
                            <pos> => 10
                            <result> => "2"
                        }
                        [2] => PMC 'POST::Op'  {
                            <pirop> => "n_mul"
                            [0] => "$P13"
                            [1] => \post
                            [2] => \post
                        }
                    }
                    [0] => "\"last\""
                    [1] => \post
                }
                [0] => \post
                [1] => \post
            }
            [1] => PMC 'POST::Op'  {
                <result> => "$P14"
                <pirop> => "call"
                [0] => "\"saynum\""
                [1] => "$P13"
            }
        }
        [0] => \post
    }
    

    Koukneme na "výsledný" PIR pro Parrot VM:

    abc>../../parrot abc.pbc --target=pir in.abc 
    
    .sub "anon"
        new $P10, "Integer"
        assign $P10, 1
        n_add $P11, $P10, 3
        set $P12, $P11
        n_mul $P13, $P12, 2
        set_global "last", $P13
        $P14 = "saynum"($P13)
    .end
    

    A spustíme test:

    abc>../../parrot abc.pbc in.abc
    8
    

    A to je vše, přátelé. Funguje to. Tádí dádí da.

    Nyní se můžeme vrhnout na kompilátor dalšího jazyka, dodělat něco z TODO pro abc nebo jen sledovat další pokrok Patricka R. Michauda a dalších na cestě k Perlu 6.

           

    Hodnocení: 82 %

            špatnédobré        

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

    Komentáře

    Vložit další komentář

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