Suppose I want design and implement a a large and complex file format, like pdf or docx
Se sei da solo, vorrei provare a evitare uno sforzo di specifica così grande . In particolare, considera invece:
-
utilizzando formati testuali come JSON , YAML o forse XML o S-Expressions ; quindi devi ancora specificare come utilizzarli, ad es. definire i nomi degli attributi o dei tag (e specificare i loro ruoli e le regole per utilizzarli).
-
utilizzando esistenti motori di database , forse SQLite o server RDBMS originali come PostGreSQL (o server di database non relazionali à la MongoDB). A proposito, è spesso utile disporre di dati strutturati testuali (ad es. JSON) all'interno di database; ovviamente è ancora necessario specificare uno schema di database e il set di richieste utilizzate su di esso. In alcuni casi, file indicizzati a valori-chiave (à la GDBM o TokyoCabinet ) potrebbe essere sufficiente.
-
utilizzando ed estendendo esistenti interpreti incorporabili (alla Lua o Guile ) e il tuo file diventa uno script per quell'interprete
-
definizione di alcuni (preferibilmente testuali) lingua specifica per il dominio (che è abbastanza vicino per estendere alcuni interpreti ), ispirato a quelli esistenti.
How can they contain so many different data types like images, macros or graphics?
Queste sono solo sequenze di byte con alcuni metadati (forse alcuni tipo di contenuto ).
Se vuoi davvero progettare un formato di file ampio e complesso, pensa prima alla portabilità (tra architetture della macchina: dimensione della parola, endianness) ed estensibilità.
Specificare il formato su carta (ad esempio utilizzando una notazione EBNF) e farlo rivedere da altri. Scrivi una libreria di implementazione di esempio per analizzare e
generare quel formato (incrementalmente, mentre lo si specifica).
Rendi le tue specifiche pubblicamente disponibili per abilitare il feedback dall'esterno. Crea il tuo software gratuito di libreria di esempio o open source.
I dati spesso sopravvivono al software , quindi lavora duro per ottenere un formato ragionevole giusto.
Se definisci ancora il tuo formato, tieni presente che potrebbero essere necessari anni di lavoro per farlo bene.
Studia i formati di file esistenti prima di inventare i tuoi. Si noti che un formato di file ha successo solo quando le diverse applicazioni lo usano, quindi c'è un importante problema sociale (convincere gli altri ad usare il tuo formato), quindi dovresti provare a specificarlo con altre persone.
Edit: for structures I mean the ways for storing different data types, I don't think that a plain binary file is so viable
Leggi anche la serializzazione .
The file format that I want to design is like a Word page with various multimedia contents
Studia i formati esistenti, ad es. OpenDocument . Se possibile, adattalo. Altrimenti, budget una dozzina di anni di impegno a tempo pieno. Cerca di trovare diversi ingegneri senior per lavorare con te.
(molto probabilmente il tuo formato e il tuo software sarebbero ignorati , considera seriamente questa possibilità)
Ricorda che sui computer attuali l'I / O (rete o disco, anche SSD) è molto più lento della CPU (più di mille volte più lento), quindi l'analisi e la scrittura del tempo della CPU dei formati testuali è generalmente molto inferiore all'ora I / O. In altre parole, la rete o il disco o SSD è sempre il collo di bottiglia. E i formati testuali (à la JSON, ecc.) Sono molto più facili da eseguire il debug.
It's an word processor application for mobile platforms which needs a custom file format for its particular structure,
Consiglierei comunque di utilizzare un formato esistente o almeno un sottoinsieme rigoroso (e uno ben specificato) di alcuni formati esistenti. Perché non puoi usare EPUB, qualche sottoinsieme di OpenDocument o un sottoinsieme di HTML? Guarda anche i formati simili a HTML usati da GTK e Qt, almeno per ispirazione (e magari usando una tale libreria).
Il vantaggio di un simile approccio è che non dovrai codificare molti convertitori (dato che potresti riutilizzarne alcuni esistenti).
PS. Se vuoi semplicemente creare un documento dall'aspetto piacevole (ad esempio in PDF) da un certo codice, considera invece di generare del file testuale per nutrirlo di alcuni composizione come LaTeX o Lout , o trova quindi utilizzare una libreria per emettere file PDF.