Hystrix


Il mondo è la totalità dei fatti non delle cose.
Archivio Posts
Anno 2018

Anno 2016

Anno 2015

Anno 2009

Anno 2008

Anno 2007

Anno 2006
Statistiche
  • Views Home Page: 56.014
  • Views Posts: 105.677
  • Views Gallerie: 0
  • n° Posts: 41
  • n° Commenti: 84

L'int resterà per sempre a 4 byte?

In VB6 l'integer, se non ricordo male, era un tipo dato a 16 bit [2 byte], in .Net è stato promosso a 32 bit [4 byte], in SQL Server 2000 il corrispondente Int è pure a 4 byte, nelle varie imlementazioni del C si trovano compilatori che intendono la parola int a 4 byte e altri a 2 byte.
Perchè sono diversi? e l'int resterà per sempre a 4 byte?

La domanda è oziosa e inutile, ma ci ho pensato un bel po' in autostrada tra Bergamo e Asti e butto lì la mia risposta: E' colpa di Von Newman!

Premetto che non sono uno storico dell'informatica e quindi potrei dire qualche sciocchezza, siate magnanimi.

Come è noto Alan Turing stava riflettendo sul problema di Hilbert relativo alla soluzione delle equazioni diofantee e si è trovato tra le mani una roba che permetteva in linea mica tanto teorica di costruire una macchina in grado di svolgere qualunque compito che potesse essere riscritto come algoritmo. Per la precisione Turing si accorse che è possibile ideare una macchina [una Macchina di Turing, per l'appunto] per ogni possibile algoritmo e, soprattutto, ebbe la trovata geniale di ipotizzare e dimostrare che è possibile scrivere una macchina analoga alle precedenti ma in grado di emulare qualunque Macchina di Turing pensabile. Questo tipo speciale di macchina è detta Macchina Universale di Turing.
Una macchina di Turing accetta un input, lo analizza e produce un output. Una Macchina Universale di Turing fa la stessa cosa [e infatti è una Macchin di Turing] ma in questo caso l'input è in parte una serie di istruzione su come trattare la parte di dati dell'imput stesso!

Avvicinandoci ai nostri int è possibile costruire una macchina di Turing che accetti in input due numeri interi e ne faccia la somma [una calcolatrice], una macchina Universale di Turing invece accetta in input i due valori e le specifiche che fan si che la Macchina si comporti come la calcolatrice e quindi è in grado di produrre il medesimo output.

Turing poi si mette a costruire realizzazioni pratiche delle sue macchine, e in ambito pratico una Macchina di Turing e una Macchina Universale differiscono soprattutto per il fatto che in un caso l'operazione di somma sarà comunque comlessa e richiederà comunque l'elaborazione di un programma mentre nel caso della mera calcolatrice potrà essere ottimizzata per effettuare in modo superefficiente la sola somma di interi. Turing credeva tuttavia fortemente alla linea Macchina Universale pura e costruirà solo macchine di quel tipo.

Von Newman si butta a costruire macchine pure lui. Ma poiché tali macchine erano dedicate moltissimo al calcolo affianca alla Macchina Universale, Macchine in grado di svolgere specifici compiti senza bisogno di alcun programma [calcolatrici super efficienti]. Nella differente visione Turing-Von Newman prevale la seconda.

Le macchine con cui oggi scriviamo e leggiamo questi blog sono, senza alcuna rilevante variazione teorica, delle Macchine Universali di Turing ma ancora oggi affiancate da processori dedicati di cui oggi non si fa più menzione ma che fino a qualche anno fa avevano una definizione propria [ricordate il 486 con cooprocessore matematico? Quel cooprocessore è una macchina di Turing non universale, alla maniera di Von Newman].

Un processore moderno è quindi una Macchina Universale ma, quando gli si chiede di sommare  interi usa circuiti dedicati e non svolge alcun algoritmo per ottenere il risultato.

Le Macchine di Turing accettavano in input un carattere alla volta, questa cosa è rimasta inalterata con la novità che in un processore moderno un carattere è una sequenza di N bit, e questa quantità N cresce nel tempo. Prima c'erano processori a 16 bit poi a 32, ora i nuovissimi a 64.

Questa storia degli N bit di input e il dominio della linea Von Newman nella costruzione dei processori dovrebbe rendere palese il fatto che un processore a N bit è ultraefficiente nell'eseguira la somma di due interi a N bit.

Il resto è ormai facilmente intuibile. 'Int' identifica il tipo dato numerico più naturale in ogni linguaggio di programmazione e non può avere una dimensione fissa poichè il dato numerico più efficiente e naturale a basso livello [quello che non richiede l'esecuzione di programmi] dipende dal numero di bit di input del processore. Per i vecchi sistemi tale valore era di 16bit, oggi di 32bit e presto di 64bit. Quindi c'è da aspettarsi che prossimamente l'Int sarà a 64bit? Boh, forse si, forse in una prossima versione di SQL avremo:

- Bit 0 byte-1 bit
- Tinyint 1 byte=8 bit
- Smallint  2 byte=16 bit
- ?? 4 byte=32 bit
- int 8 byte=64 bit
- bigint 16 byte=128 bit

e i dba di tutto il mondo faranno i capricci per il fatto che la maggior parte dei programmatori userà un int spropositamente grande per tabelline contenute.
Se infatti è chiaro che per un processore a 64 bit sommare due tinyint o due smallint è identico il discorso non vale lato memoria in cui uno smallint occupa il doppia dello spazio.

Ecco, sono arrivato a Asti, c'è il sole e son pronte le costine.
Aspetto il mio int a 8byte ma intanto mangio.

marc.
Categoria: SQL Server
lunedì, 31 lug 2006 Ore. 19.22
Calendario
agosto 2019
lmmgvsd
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678
Ora e Data
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003