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 00:33 | Zajímavý projekt

Společnost MNT Research má v plánu na Crowd Supply spustit kampaň na podporu open source notebooku MNT Reform. Vývoj notebooku lze sledovat na Mastodonu.

Ladislav Hagara | Komentářů: 0
dnes 00:11 | Zajímavý software

Chcete si zahrát víceuživatelský tetris v terminálu? Stačí spustit ssh netris.rocketnine.space. Na straně serveru běží netris. Zdrojové kódy v programovacím jazyce Go jsou k dispozici pod licencí GPLv3.

Ladislav Hagara | Komentářů: 0
včera 19:44 | Nová verze

Po čtyřech měsících vývoje od vydání verze 4.10 byla vydána nová verze 4.11 svobodné náhrady proprietárních BIOSů a UEFI coreboot (Wikipedie). Na vývoji se podílelo 130 vývojářů. Provedli 1630 změn. Přidána byla podpora pro 25 mainboardů.

Ladislav Hagara | Komentářů: 0
včera 16:22 | Nová verze

Byla vydána verze 1.6.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
včera 14:22 | Komunita

Vydání verze 1.0 svobodného multiplatformního vektorového grafického editoru Inkscape se blíží. Registrovaní uživatelé mají možnost hlasovat o obrázku, který bude zobrazován v okně O Inkscapu. Vybírá se ze 124 návrhů.

Ladislav Hagara | Komentářů: 4
včera 10:55 | Nová verze

Byl aktualizován seznam 500 nejvýkonnějších superpočítačů na světě TOP500. V první desítce se nic nezměnilo. Nejvýkonnějším superpočítačem zůstává superpočítač Summit. Nejvíce superpočítačů v TOP500 má Čína (228). Český superpočítač Salomon klesl na 375. místo. Další přehledy a statistiky na stránkách projektu. V aktuálním žebříčku GREEN500 (GFlops/watts) superpočítač Summit klesl na 5. místo.

Ladislav Hagara | Komentářů: 3
včera 02:00 | Zajímavý článek

V novém příspěvku na blogu Purismu se můžete dočíst, jak pokračoval vývoj softwaru Librem 5 v říjnu. Vývojáři optimalizovali linuxové jádro a ovladače pro snížení spotřeby telefonu. Mezi další změny patří lepší integrace mezi aplikacemi pomocí knihovny libfolks, byly přidány nové funkce klávesnice, nastavení, shellu, kompozitoru a opraveno plno chyb.

okias | Komentářů: 3
včera 01:55 | Nová verze

Na Humble Bundle byla spuštěna akce Humble Book Bundle: Cybersecurity 2019 by Packt. Všech 22 videokurzů a elektronických knih věnovaných kybernetické bezpečnosti od nakladatelství Packt lze koupit za 15 dolarů. Peníze lze libovolně rozdělit mezi nakladatelství Packt, neziskovou organizaci Arthritis Foundation a Humble Bundle.

Ladislav Hagara | Komentářů: 0
18.11. 23:22 | Zajímavý článek

Ben Cox v článku Jak psát ovladače nepodporovaných USB zařízení pro uživatelský prostor ukazuje, jak reverzním inženýrstvím dospěl k vlastnímu ovladači userspace-vga2usb pro převodník a frame grabber Epiphan VGA2USB LR s již nepodporovaným linuxovým ovladačem od výrobce.

Fluttershy, yay! | Komentářů: 0
18.11. 22:44 | Zajímavý software

Multiplatformní nástroj Sourcetrail pro analýzu zdrojových kódů a jejich vizualizaci byl uvolněn jako open source. Představení nástroje na YouTube. Zdrojové kódy jsou k dispozici na GitHubu pod licencí GNU GPL 3.0. Další vývoj lze podpořit na Patreonu.

Ladislav Hagara | Komentářů: 0
Jaké hodinky nosíte (nejčastěji)?
 (24%)
 (5%)
 (16%)
 (55%)
Celkem 258 hlasů
 Komentářů: 24, poslední včera 20:25
Rozcestník

OctaForge - OctaSTD update, libcubescript a OctaBuild

5.9.2015 16:35 | Přečteno: 1370× | octaforge | Výběrový blog | poslední úprava: 5.9.2015 18:13

Od posledního zápisu proběhlo mnoho změn v OctaSTD a vznikly dva další projekty.

OctaSTD změny

Seznam změn je v podstatě chronologický, jen pospojovaný tak, aby to dávalo smysl. Přidal jsem několik nových věcí a dost změnil.

Změny v infrastruktuře

OctaSTD teď používá ostd místo octa jako svůj namespace (a stejně tak adresář s moduly se jmenuje ostd). Header soubory používají příponu .hh a zdrojové soubory .cc.

Kompletní hash table

Asociativní mapy jsou teď funkčně kompletní. Podporují rehash, load factor balancing a většinu hlavních API. Kromě toho prošly optimalizací - buckets se alokují v kusech (od 32 to 128 buckets) a respektují alignment. Kromě toho kontejner podporuje vlastní alokátory. Kromě asociativní mapy Map existují i Set, Multimap a Multiset, a také Keyset a Multikeyset. Všechny používají stejný základ (sdílejí většinu implementace). Keyset je momentálně experimentální - je to v podstatě hybrid mezi Set a Map - indexovatelný jako Map, ale klíče jsou součástí hodnoty samotné.

Nové Stream API

OctaSTD teď podporuje streamy jakožto obecnou Stream class v souboru stream.hh. Streams jsou samozřejmě range-based. StreamRange je InputRange, která umožňuje číst ze streamu jakéhokoliv typu (a také do něj zapisovat, protože podporuje interface OutputRange). Spousta věcí se dá implementovat jako stream, nicméně OctaSTD zatím podporuje základní I/O, jako součást io.hh. Tento modul implementuje FileStream a několik dalších funkcí. Ukázka pár z nich:

#include <ostd/algorithm.hh>
#include <ostd/string.hh>
#include <ostd/io.hh>

using namespace ostd;

int main() {
    writeln("Zapisuji soubor..."); // z io.hh

    FileStream wtest("test.txt", StreamMode::write);
    String test = "Testovaci obsah souboru";
    copy(test.iter(), wtest.iter()); // obecne algoritmy se StreamRange, z algorithm.hh
    wtest.close();

    FileStream rtest("test.txt", StreamMode::read);
    writeln("read file");

    String cely_soubor(rtest.iter()); // range-based konstruktor se StreamRange
    rtest.seek(0);
    String cast_souboru(take(rtest.iter(), 5)); // max 5 znaku, pomoci TakeRange

    writefln("Soubor: %s", cely_soubor); // formatovani, z io.hh, popisu pozdeji
}

Jak je vidět, streams se kompletně integrují se všemi obecnými algoritmy pro vstupní a výstupní ranges. StreamRange bohužel nepodporuje ForwardRange a vyšší, a bohužel nemůže, takže multi-pass algoritmy nebudou fungovat. I tak je ale možné spoustu algoritmů se streamy použít. Například:

#include <ostd/algorithm.hh>
#include <ostd/functional.hh>
#include <ostd/io.hh>
#include <ostd/platform.hh>

using namespace ostd;

int main() {
    FileStream wtest("test.bin", StreamMode::write);
    // zapis se specifickym typem
    copy(iter({ 0xABCD1214, 0xBADC3264, 0xDEADBEEF, 0xBEEFDEAD }), wtest.iter<Uint32>());
    wtest.close();

    FileStream rtest("test.bin", StreamMode::read);
    writefln("velikost streamu: %d", rtest.size());

    for (Uint32 x: map(rtest.iter<Uint32>(), FromBigEndian<Uint32>()))
        writeln("hodnota: ", x);
}

S tímto příkladem by stálo za zmínku, že všechny I/O streamy v OctaSTD jsou binární - tzn. StreamMode::read se chová jako rb a to samé pro ostatní typy. Osobně mám za to, že textové streamy jsou špatný design a mají více nevýhod, než výhod. Z poslední ukázky je také vidět, že je možné číst a zapisovat se specifickým typem. Tento typ musí být POD. Výchozím typem je char.

Typově nezávislé formátování

Každý si je vědom problémů s funkcemi typu printf a obecně C varargs. OctaSTD proto teď podporuje formátování podobné printf, ale type-safe pomocí C++11 varargs, a s extra funkcemi. Modul format.hh implementuje funkci format(), která formátuje do obecné výstupní range. Základní ukázka:

#include <ostd/format.hh>
#include <ostd/string.hh>
#include <ostd/range.hh>
#include <ostd/io.hh>

using namespace ostd;

int main() {
     auto app = appender<String>();
     format(app, "hello %s", "world");
     writeln(app.get());
}

Rozdíl od printf je v tom, že formátovací značka %s podporuje jakýkoliv typ. Ostatní značky existují pro další runtime ověření - např. %d vypíše jakýkoliv celočíselný typ, ale selže na ostatních. Díky tomu, že modul je type-safe, už nejsou potřeba další značky pro velikost typu - %d vypíše jak int, tak třeba long long. Kromě toho modul podporuje výpis kompletních ranges, takže se dá snadno vypsat obsah jakéhokoliv kontejneru. A aby toho nebylo málo, tak podporuje i formátování uživatelských typů BEZ extra alokací.

Pár ukázek použítí je zde. Modul toho podporuje ještě mnohem víc, bohužel dokumentace momentálně chybí - ještě jsem ji nestihl napsat.

Modul io.hh podporuje funkce write, writeln, writef a writefln. Ty první dvě jsou také typově obecné, tzn. podporují neomezené množství argumentů jakéhokoliv typu, ty poslední dvě fungují jak printf s tím, že používají format.hh. Koncovka ln znamená, že na konci řetězce bude nový řádek. Tyto čtyři metody jsou podporovány i jako metody na jakémkoliv Streamu.

Signals-slots

Nový modul event.hh přidává funkcionalitu pro signals-slots. Ukázka je zde. Tento systém není asynchronní - byl by potřeba event loop. Asynchronní funkcionalita bude potřebovat jinou implementaci. Stejně jako zbytek OctaSTD je tento systém typově bezpečný.

Zero-overhead string slicing a další změny práce s řetězci

Toto je asi nejvýraznější kus funkcionality, který odděluje OctaSTD od ostatních C++ knihoven. V C a C++, řetězce jsou obecně zakončené nulou. Slicing pak vyžaduje alokaci nového řetězce. OctaSTD se snaží tento systém změnit.

Už od začátku existuje systém ranges. Řetězce mají také svůj vlastní typ ranges, resp. dva - CharRange a ConstCharRange. Oba typy reprezentují vlastně dva pointery. Vtip je v tom, že ConstCharRange má takový set konstruktorů, že se dá vytvořit implicitně jak z C řetězců (char * a const char *), tak OctaSTD řetězců a CharRange. To znamená, že ConstCharRange je vlastně univerzálním read-only řetězcem bez vlastní paměti. Protože je to range s náhodným přístupem, podporuje slicing.

Všechna OctaSTD API, která pouze čtou řetězce, mají ConstCharRange jako argument. Díky tomu vědí o délce tohoto řetězce a nepotřebují nulové zakončení. Tím pádem je 100% bezpečné řetězce řezat pomocí ranges a potom je poskytnout jakémukoliv API.

#include <ostd/string.hh>
#include <ostd/io.hh>

using namespace ostd;

void print_test(ConstCharRange test) {
    writeln(test);
}

int main() {
    print_test("foo"); // C literal
    print_test((const char *)"foo");
    print_test(String("foo"));

    ConstCharRange stest = "hello world";
    print_test(stest.slice(0, 5)); // hello
}

ConstCharRange používá template metaprogramming tak, aby délky literálů byly známé už při kompilaci, tzn. první volání print_test ví, že délka je 3. U druhého volání máme pouze pointer, takže délka není známá - takže se použíje strlen. Toto sice znamená overhead, nicméně tato délka by stejně byla potřeba v jiném volání jinde - takže ve většině případů to není problém. Co se týče nulového zakončení - typ String vnitřně stále nulové zakončení používá, pro kompatibilitu s C. Takže datový pointer Stringu je bezpečné předat C funkci.

Filesystem modul

Nově jsem přidal modul filesystem.hh, který umožňuje iterovat adresáře a pracovat se soubory. Tento modul jsem přidal včera a bude ještě trvat, než se stabilizuje. Zatím ukázka:

#include <ostd/filesystem.hh>
#include <ostd/io.hh>

using namespace ostd;

int main(int, char **argv) {
    DirectoryStream ds(argv[1]);
    writeln("pocet souboru: ", ds.size());
    for (FileInfo i: ds.iter()) {
        writeln("cesta: ", i.path());
        writeln("soubor: ", i.filename());
        writeln("cas modifikace: ", i.mtime());
    }
}

Další změny

Funkcionální knihovna teď podporuje functory pro práci s endianess. Ranges podporují novou kategorii ContiguousRange, která přídává další záruky do FiniteRandomAccessRange - musí reprezentovat jednotnou sekvenci jako pár pointerů, podobně jako C++14 ContiguousIterator. Nový modul platform.hh umožňuje detekci platforem, endianess cílové architektury a kompilátoru (podporuje detekci GCC, Clang a MSVC). Spousta funkcí byla přejmenována nebo dále změněna. A přidal jsem spoustu nových algoritmů, functorů a další.

OctaBuild a libcubescript

Už nějakou dobu jsem měl v plánu pro OctaForge napsat build systém. Proto jsem vytvořil nový projekt, OctaBuild. OctaBuild je v základu inspirovaný klasickým Make, ale se spoustou změn a vylepšení.

Problémem byl skriptovací jazyk. "Velké" skriptovací jazyky se na toto nehodí, protože místo obecného skriptování je prioritou jednoduchá práce s řetězci a makry. Proto jsem se rozhodl použít jazyk Cubescript, který už OctaForge používá v enginu samotném - pochází z Cube 2: Sauerbraten. Cubescript je jednoduchý, dynamický jazyk založený na principu, že všechno je řetězec. Vleze se do přibližně 4000 řádků C++, nemá garbage collector, ale má automatickou správu paměti, používá dynamic scope, a má jednoduchou syntaxi podobnou Lispu.

Problém byl v tom, že Cubescript byl do enginu v podstatě zabudovaný. Proto jsem vytvořil ještě jeden nový projekt, libcubescript. To je samostatná distribuce Cubescriptu přepsaná tak, aby se dala jedndouše zabudovat do jiných projektů - nepoužívá globální proměnné a moderní high level API.

OctaBuild je dostupný zde a libcubescript zde. Momentálně dostupné featury jsou:

Bohužel ještě spousta práce zbývá:

Momentálně ukázka souboru build definicí:

rule all test

OBJ = (strreplace (glob "*.c") ".c" ".o")

rule test $OBJ [
    echo " LD" $target
    shell cc -o $target $sources
]

rule %.o %.c [
    echo " CC" $target
    shell cc -c -o $target $source
]

rule clean [] [
    echo " CLEAN" $OBJ test
    shell rm -f $OBJ test
]

// zavislosti

rule foo.o foo.h
rule bar.o bar.h
rule test.o [foo.h bar.h]

Cílem je také udělat z OctaBuildu knihovnu - tak, aby ji bylo možné použít uvnitř samotného enginu. To umožní dynamické sestavení herních modulů enginu přímo zevnitř enginu.

Závěr

To je zatím vše. Pro jakékoliv připomínky nebo otázky je tu sekce komentářů.

       

Hodnocení: 100 %

        špatnédobré        

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

Komentáře

Vložit další komentář

Bedňa avatar 5.9.2015 18:03 Bedňa | skóre: 34 | blog: Žumpa | Horňany
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
Tak konečne nebojuješ proti namespace :-)
./client_linux_x64 
Using home directory: /home/mario/.octaforge/
<<< setting loglevel to WARNING >>>
[[INIT]] - sdl
[[INIT]] - net
[[INIT]] - game
[[INIT]] - lua
[[INIT]] - video
[[INIT]] - gl
Renderer: GeForce 7025 / nForce 630a/integrated/SSE2 (NVIDIA Corporation)
Driver: 2.1.2 NVIDIA 304.125
GLSL: 1.20 NVIDIA via Cg compiler
[[INIT]] - console
[[INIT]] - world
[[INIT]] - sound
[[INIT]] - cfg
OF defaults
[[INIT]] - render
[[INIT]] - mainloop
[[ERROR]] - variable hidechanges already exists
failed allocating radiance hints buffer!
Nejak to skapalo.
KERNEL ULTRAS video channel >>>
q66 avatar 5.9.2015 18:10 q66 | skóre: 33 | blog: Q's CZ devblog
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
na 7025 to nepojede, moc slabá karta.

minimum je tak intel HD3000 nebo nvidia 9600gt. Pak to už pojede, na nižší detaily.
Václav 5.9.2015 18:16 Václav "Darm" Novák | skóre: 26 | blog: Darmovy_kecy | Bechyně / Praha
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
Ah… Teď jsem přemýšlel že to opět zkusím, ale GMA X3100 asi smůla :/
Cross my heart and hope to fly, stick a cupcake in my eye!
q66 avatar 5.9.2015 19:20 q66 | skóre: 33 | blog: Q's CZ devblog
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
asi ne... chce to aspoň sandy bridge, ale nejlíp lepší.
Václav 5.9.2015 19:33 Václav "Darm" Novák | skóre: 26 | blog: Darmovy_kecy | Bechyně / Praha
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
Jo, no… Tohle byla poslední katastrofa od Intelu, pak už začali dělat slušné integrované grafiky.
Cross my heart and hope to fly, stick a cupcake in my eye!
Václav 5.9.2015 20:45 Václav "Darm" Novák | skóre: 26 | blog: Darmovy_kecy | Bechyně / Praha
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
terminated by signal SIGSEGV (Address boundary error)
Cross my heart and hope to fly, stick a cupcake in my eye!
Bedňa avatar 5.9.2015 19:16 Bedňa | skóre: 34 | blog: Žumpa | Horňany
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
Mám aj GeForce GTX 275, ale musel som ju vybrať, pretože mi zhorel zdroj a ten čo som tam dal má problém ju utiahnuť. Tak to testnem neskôr.
KERNEL ULTRAS video channel >>>
q66 avatar 5.9.2015 19:20 q66 | skóre: 33 | blog: Q's CZ devblog
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
jo, GTX 275 by to měla zvládnout.
Bedňa avatar 5.9.2015 19:30 Bedňa | skóre: 34 | blog: Žumpa | Horňany
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
Tá karta to dá ľavou zadnou na rozdiel od tých marketingových táto utiahne hravo hocijaký engine.
Memory Interface GDDR3
Memory Interface Width 448-bit
Memory Bandwidth (GB/sec) 127.0
KERNEL ULTRAS video channel >>>
q66 avatar 5.9.2015 19:34 q66 | skóre: 33 | blog: Q's CZ devblog
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
275 by měla být jen o trochu slabší, než gtx 460, takže to zvládne tak akorát...nicméně dnešní karty budou o dost výkonnější (třeba gtx 950, nebo i 750)
Bystroushaak avatar 5.9.2015 20:45 Bystroushaak | skóre: 35 | blog: Bystroushaakův blog | Praha
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
5.9.2015 21:59 KS | skóre: 10 | blog: blg | Horní polní u západní dolní
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
Dobrá práce!
Pochybnost, nejistota - základ poznání
7.9.2015 23:22 dumblob | skóre: 10 | blog: dumblog
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
Moc hezke, jen tak dal!

Mimochodem, mrknul jsem na libcubescript a protoze ten jazyk vypada na tech necelych 5000 SLOC docela obstojne, zajimalo by me, zdali se ti jiz nekdo ozval s pozadavkem prepsat libcubescript do C99, aby byla knihovna pouzitelna i z C. Podle hodne letmeho pohledu nebude uplna brnkacka prepsat libcubescript do C :-(
Refundace za Windows 7 od Lenovo obchodníka - soud rozhodl, že je zákazník v právu!
q66 avatar 8.9.2015 00:00 q66 | skóre: 33 | blog: Q's CZ devblog
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
jo, to by bylo docela těžký... a vyžadovalo by to o dost rozdílný styl API.
8.9.2015 17:47 Jardík
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
struct SignalTest {
    // ...
    Signal<const SignalTest, int, const char *> on_simple = this;
    Signal<      SignalTest, float            > on_param  = this;
    // ...
};
Mně se to vůbec nelíbí. Proč? Protože každý signál zabírá místo v každé instanci objektu. Tento signál pak zase obsahuje ukazatel zpět na objekt.
q66 avatar 8.9.2015 20:36 q66 | skóre: 33 | blog: Q's CZ devblog
Rozbalit Rozbalit vše Re: OctaForge - OctaSTD update, libcubescript a OctaBuild
nějaká data v tom objektu stejně být musí, pro uložení connected callbacks.

Založit nové vláknoNahoru

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