giovedì 18 agosto 2011

BSDiff, Courgette: due software per ridurre i trasferimenti degli aggiornamenti

Ciao,


ho scoperto questi due software (in realtà BSDiff c'è da un pezzo) che consentono di ridurre pesantemente la dimensione dei file di aggiornamento dei software.
Come funziona? 
Se ho rilasciato una versione del mio software in forma binaria di 10MB (lo chiamiamo OLD) e la nuova versione è 10.2MB mi piacerebbe poter distribuire solo le differenze e non tutti e 10.2MB.


BSDiff è nato per questo! 


Courgette fa anche di meglio! 
Consideriamo che una piccola modifica al sorgente genera un numero elevato di modifiche a livello di byte.
Il codice compilato è pieno di riferimenti interni, dove qualche istruzione o dato contiene l'indirizzo (o offset) di un altro istruzione o dato.
Il codice sorgente non ha questo problema, perché tutte le entità nella sorgente sono simboliche.
Se avessimo modo di poter tornare indietro dal binario e ritornare ad avere i puntatori interni di nuovo link simbolici occuperemmo sicuramente molto meno.


Courgette utilizza un disassemblatore primitivo per trovare i puntatori interni.
Poi suddivide il programma in tre parti:

  • un elenco di indirizzi destinazione del puntatore interno
  • tutti i byte
  • una sequenza di 'istruzioni' che determina come i semplici byte e i puntatori devono essere collegati e sistemati per riottenere l'input originale . 
Siamo in grado di eseguire un 'assemblatore' su queste istruzioni ed ottenere una sequenza di byte che ci consente di riavere il file originale.

Se consideriamo che la parte "non-pointer" è circa l'80% della dimensione di un programma originale e poichè non ha puntari mescolati al suo interno bsdiff lavora molto bene, il risultato però è in linea con i cambiamenti nel codice sorgente (la patch binaria occuperà molto spazio perchè conterrà anche il codice replicato che in forma sorgente è sottoforma di link).

Mentre se portiamo il binario a livello di codice assembly, la diff prodottà è circa il 30% di quella con bsdiff.

Nessun commento: