XBUP - Dokumentace: Organizace proudu datTento dokument je součástí dokumentace projektu eXtensible Binary Universal Protocol. Obsahuje popis organizace proudu dat jako posloupnosti bloků.
1. Organizace proudu dat
1.1. Stanovené podmínky
1.2. Posloupnost dat
1.3. Bloková struktura
1.4. Stromová struktura
1.4.1. Terminální blok
1.4.2. Datový blok
1.4.3. Uzlový blok
1.4.4. Listový blok
1.5. Argumentace správnosti
1.6. Gramatika protokolu
1.6.1. Zjednodušená gramatika
1.6.2. Gramatika s terminálními bloky
1.6.3. Gramatika parsování dokumentu
1.7. Správná utvořenost
1.8. Zavedení úrovní
V případě specifikace struktury datového proudu byl postup návrhu ještě méně přímočarý než u kódování čísel. Doposud nebyla stanovena konečná varianta a jsou zvažovány alternativní řešení. Základem zůstává blokově-stromová struktura.
Z cílů, stanovených pro tento projekt, se struktury datového proudu týká většina. Především by měla být realizována kompatibilita a rozšiřitelnost.
Stanovené požadavky:
Jistě bude potřeba ukládat posloupnost hodnot v kódování UBNumber. Tuto posloupnost je potřeba nějak omezit. V úvahu připadají například tyto možnosti:
První přístup by znamenal například to, že by blok začínal například jednou či dvěma položkami definujícími typ a jednou položkou určující délku následného datového blobu. Tato velice jednoduchá koncepce je například používána v EBML. Nevýhodou a zároveň výhodou je, že každá hodnota by musela být obalena samostatným blokem. Mezi nevýhody tohoto jinak plnohodnotného řešení patří:
Ačkoliv proti tomuto konceptu nejsou momentálně k dispozici žádná podložené argumenty, přesto byl odložen pro pozdější přehodnocení.
Nevýhodou druhého přístupu je nutnost přečtení všech položek i v případě, že je chceme pouze přeskočit. Zřejmě nejvhodnější bude třetí z uvedených variant, která umožňuje snadné přeskočení celé posloupnosti, pokud nemáme o její přečtení zájem. Zabraný prostor je nejlépe uvést jako počet obsazených shluků dat. Zarážka je v tomto případě nepoužitelná, neboť jsou využity všechny kódy a bylo by nutné je nějak omezit. Věřím, že nekonečná posloupnost těchto hodnot půjde řešit i jiným způsobem.
Pro ukládání dat potřebujeme i posloupnost bitů obecně libovolné délky. Tuto posloupnost můžeme určit pomocí jedné hodnoty, určující délku, nebo použít zarážku. Nakonec jsem zvolil určení délky posloupnosti pomocí hodnoty typu UBENatural, kde konstanta pro nekonečno značí ukončení zarážkou. Tuto možnost je vhodné využívat především v případě, kdy neznáme budoucí délku bitové posloupnosti. Jiný způsob by mohlo být použití hodnoty nula pro data ukončeny zarážkou. Prázdný blok by pak tvořila samotná zarážka.
Posloupnosti hodnot je vhodné organizovat do bloků. Kromě vztahu "býti podblokem", můžou mezi bloky existovat i jiné druhy vztahů. Tyto vztahy je možné opět vyjádřit několika způsoby:
Zřejmě musí existovat blok umožňující ukládat obecně libovolnou posloupnost bitů, která může být případně interpretována jako podblok, nebo lépe posloupnost podbloků. Pokud by takový blok neexistoval, musela by být vždy dopředu známa velikost všech podbloků, což znemožňuje proudové generování dokumentu.
Blok tedy začíná posloupností hodnot typu UBNumber, nazývaných atributy bloku a následovat bude datová část bloku, která bude případně interpretována jako posloupnost podbloků. Na začátku je tedy hodnota:
UBNatural - AttribPartLength
Což je délka posloupnosti hodnot v kódování UBNumber
To, že daná hodnota je typu UBNatural znamená, že v proudu dat je dopředu znám nejen počet, ale i prostor zabíraný atributy. To může působit problémy pro velké posloupnosti atributů. Cílem však je, aby počet atributů byl co nejmenší a všechny podstatné hodnoty byly realizovány jako samostatné bloky. Také je potřeba nějakým způsobem určit, jaký je typ bloku.
Struktura dokumentu kódovaného pomocí protokolu XBUP má následující strukturu:
| Hlavička souboru | ||||
| ||||
| Rozšiřující oblast |
Hodnota AttribPartLength = 0 znamená, že dále nenásledují žádné další hodnoty UBNumber a tento blok je terminální. V kombinaci s uzlovým blokem umožňuje omezit nekonečnou posloupnost podbloků.
Kdy datovou část bloku interpretovat jako další bloky a kdy jako prostá data je možné volit několika způsoby:
Datový blok nemusí obsahovat žádné další atributy, které mohou být uvedeny v nadřazených blocích a zatím se tato varianta jeví jako dostačující. V atributové části je pak pouze jediný atribut:
UBENatural - DataPartLength
Tento atribut určuje délku posloupnosti shluků bitů, která následuje. Tato posloupnost je interpretována jako bitová posloupnost bez dalšího významu. I zde je podporována hodnota nekonečno pro signalizaci neomezené velikosti tohoto bloku, která umožňuje generovat proud dat bez znalosti množství dat. S tím vyvstává problém ukončení tohoto typu bloku:
Ukončení nulovým shlukem sebou přináší problém, jak v bitové posloupnosti vyjádřit posloupnost nul:
Pokud je uveden více než jeden atribut, je blok považován za uzlový blok nebo listový blok. První hodnota je v obou případech:
UBENatural - SubPartLength
Nenulová hodnota určuje délku posloupnosti shluků bitů, která následuje. Ta je pak interpretována jako posloupnost bloků.
Speciálním případem uzlového bloku je blok s DataPartLength = 0, což znamená, že daný blok nemá žádné podbloky. Tento blok nese informaci pouze v podobě atributů.
Podobně jako u kódování čísel, i zde bych rád uvedl argumenty podporující zvolený způsob realizace stromové struktury.
Protokol tvoří jazyk nad abecedou {0,1}, který je obecně typu 0. Nicméně je možné uvést pro orientaci výskyt jednotlivých struktur jako gramatiku protokolu, bez nutnosti zavádět přímý vztah k jejich binárnímu vyjádření.
Pro vyjádření a pochopení základní blokové struktury protokolu by mohla posloužit následující gramatika. Slova psané malými písmeny jsou terminály.
Document ::= filehead + Block
Block ::= Attributes + Blocks | datablock
Attributes ::= Attributes + attribute | epsilon
Blocks ::= Blocks + Block | epsilon
Tato bezkontextová gramatika vyjadřuje to, že celý dokument tvoří jediný blok, každý blok je buď datový blok, nebo má dvě oddělené části, libovolný počet atributů a podbloků. Atributy jsou v bloku uváděny jako první a bloky jsou definovány rekurzivně. Tuto gramatiku je možné rozšířit tak, aby vyjadřovala další vlastnosti.
Tato gramatika popisuje navíc možnost použití terminátoru.
Document ::= filehead + Block
Block ::= Stdblock | Stdtermblock | Datablock | Datatermblock
Stdblock ::= Attributes + Blocks
Stdtermblock ::= Attributes + Blocks + terminator
Datablock ::= datablob
Datatermblock ::= datablob + terminator
Blocks ::= Block + Blocks | epsilon
Attributes ::= attribute + Attributes | epsilon
Obzvláště při parsování se bloky vyskytují v daném omezeném pořadí, které je možné taktéž omezit gramatikou, která je bezkontextová.
Document ::= Block
Block ::= blockBegin + Attributes + Blocks + blockEnd | blockBegin + blockData + blockEnd
Blocks ::= Block + Blocks | epsilon
Attributes ::= blockAttribute + Attributes | epsilon
Následující graf vyjadřuje základní graf výskytu událostí při postupném parsování dokumentu.
Vysvětlivky:
a - atribut bloku (blockAttribute)
b - začátek bloku (blockBegin)
d - datová část bloku (blockData)
e - konec bloku (blockEnd)

Zdrojový soubor grafu graph-1.graphml
Případně je možné použít následující přechodový systém konečného automatu, tedy regulární gramatiky, jejíž jazyk je blízkou nadmnožinou předchozího jazyka:

Zdrojový soubor grafu graph-2.graphml
V případě velkých datových bloků může být jejich zpracování v paměti problematické. Z tohoto důvodu je možné a většinou i vhodné použít jemnější dělení na jednotlivé bajty. Mezi oběma typy gramatik je možné převádět události na odpovídající význam.
Vysvětlivky:
a - atribut bloku (blockAttribute)
b - začátek bloku (blockBegin)
d - jeden bajt datové části bloku (blockData)
e - konec bloku (blockEnd)

Zdrojový soubor grafu graph-3.graphml
Jelikož datová událost zde představuje přesně jeden bajt, bylo nutné zavést přímý přechod na konec datového bloku s prázdnou datovou částí.
Rozdělit atributy na jednotlivé bajty se nejeví být příliš smysluplné, stejně jako rozčlenění dat na bity.
Naopak je také možné některé události sloučit, například atributy a data dát jako součást události začátku bloku.
Vysvětlivky:
b - začátek bloku s atributy (blockBegin)
d - datový blok s daty (blockData)
e - konec bloku (blockEnd)

Zdrojový soubor grafu graph-4.graphml
Proud je správně utvořen (well-formed) pokud platí následující podmínky. Jsou uvedeny pojmenování chybových stavů v případě, že uvedená podmínka není splněna.
Během vytváření návrhu struktury se ukázalo, že bude vhodné zavést více úrovní realizace dat. Důvodem je možnost zpracovávat dokument na různých úrovních jeho složitosti a především provádět kontrolu platnosti na různé podmínky, podle dostupnosti specifikací.
Kódování a základní bloková struktura je označována jako úroveň 0. Není to totiž plnohodnotná varianta protokolu, protože pouze specifikuje způsob stromové organizace dat bez způsobů realizace přenosu informací. Zobrazuje jednotlivé bloky bez interpretace jejich obsahu, pouze jako bloky 4 základních typů. Je možné validovat dodržení blokové struktury (syntaktická kontrola).
Další úrovně rozšiřují interpretaci bloků o jejich typ. Dále stanovují způsob specifikace typu a základní bloky. Další rozšíření by mělo umožnit určit povolené rozsahy hodnot atributů, povolené podbloky a případně i jejich pořadí, způsob transformace a definici významu. Na vyšších úrovních bude možné validovat dokument podle úrovně požadovaných rozšíření.
Možné úrovně jsou popsány v samostatné části dokumentace zaměřené na úrovně.
Homepage: http://xbup.sf.net
License: GNU Free Documentation License (FDL)
Latest update: 2009-02-01