2012-01-20 10 views
15

Come tutti i programmatori Perl (si spera) di conoscere, il valore dell'anno da una chiamata alla funzione di Perl localtime è relativo al 1900. Chiedendo perché questo è stato, ho preso uno sguardo al perldoc for localtime, e ho trovato questo interessante pepita:Perché il valore dell'anno nella funzione localtime di Perl (e C's tm struct) rispetto al 1900?

Tutti gli elementi della lista sono numerici e escono direttamente da C `struct tm '.

Guardando poi al C++ reference for the tm struct, ho trovato che la variabile tm_year membro è dichiarato come int.

Domanda: Perché, quindi, è il valore dell'anno relativo al 1900 e non semplicemente l'anno completo a quattro cifre? C'è qualche ragione storica? Mi sembra che, anche con i primi limiti di memoria in informatica, un intero sia (ovviamente) più che sufficiente per archiviare l'intero anno. Ci deve essere stata una buona ragione; Sono curioso di sapere cosa potrebbe essere.

+7

Cronologia. Il bug Y2K non era evidente nei primi anni '70 quando lo standard di fatto era stato fissato. Dopodiché, era troppo tardi per cambiarlo senza rompere enormi quantità di codice. –

risposta

14

Stavo programmando nei primi anni '70, prima che C e Unix fossero inventati. Gli anni a due cifre sono stati usati per risparmiare spazio sul disco che era molto stretto, stavamo sempre cercando di capire trucchi del genere per salvarlo. La prima macchina su cui lavoravo aveva due dischi da 20 megabyte, ciascuno delle dimensioni di una lavatrice.

Ho lavorato in un ospedale che aveva un problema di Y2K nel 1975. L'età di un paziente è una cosa importante da sapere e la data di nascita aveva solo un anno a due cifre. Essendo un ospedale, abbiamo ovviamente avuto alcuni pazienti molto vecchi, nati nel 1800. Il sistema presupponeva che chiunque avesse un anno di nascita di 75 anni o più fosse nato nel 1800. Questo ha funzionato bene per le persone nate nel 1890, ma una volta che il 1 ° gennaio del 1975 colpì, tutti i diavoli si scatenarono perché i neonati erano considerati di 100 anni. (Era anche un importante ospedale per la maternità). Abbiamo cercato di risolvere il problema spostando la soglia da 75 a 80. Era anche la mia prima comprensione di quale sarebbe stato il problema Y2K, e ho capito che avrei fatto meglio a fare qualcos'altro entro l'anno 2000. Ho fallito.

Quelli che pensano che Y2K non sia stato un problema reale perché non è successo nulla non capiscono la quantità di lavoro che è andato a sistemare cose per i pochi anni precedenti.

+0

Come domanda successiva, qualche idea sul perché il valore 'tm_month' sia 0-relativo e non 1-relativo? Proprio come il valore dell'anno, è un po 'un problema dover ricordare di aggiungere 1 quando si crea una data ... –

+5

RE: 'tm_month', ho sempre sentito l'esplosione che' tm_month' è destinato a essere usato come un pedice, come in: '@months = qw (Gen Feb Mar ... Dic); stampa $ mesi [$ tm_month]; ' –

5

Quando i computer hanno iniziato a tenere traccia del tempo, l'anno è stato referenziato solo con 2 cifre. Per quanto riguarda la parte "perché", non ho sentito alcun motivo preciso, diverso da "Non dovrebbero preoccuparsi di ciò per altri 30 anni". Quando gli orologi si sono avvicinati pericolosamente al 2000 e le persone hanno capito che il loro codice doveva tenere traccia del tempo anche dopo il 1999, la maggior parte dei software utilizzava ancora gli anni a due cifre (dopotutto, avendo tutti scambiati a 4 cifre si rompeva molto codice a meno 100% scambiato). La soluzione alternativa per schivare il bug Y2K era quella di rendere l'anno un riferimento al 1900.

È uno di questi casi in cui, in primo luogo, sarebbe stato possibile farlo. (Il layout della tastiera QWERTY era stato originariamente progettato per essere inefficiente, inoltre la corrente in un circuito elettronico è dettata come da + a -, mentre in realtà gli elettroni si muovono effettivamente nella direzione opposta).

+2

Possiamo essere tutti d'accordo su una lista di cose da fare nel caso qualcuno inventi una macchina del tempo? Io per primo volevo sempre avvertire Benjamin Franklin di essere sulla strada giusta, ma la sua idea era sbagliata. – Jarmund

+0

E naturalmente non sono gli elettroni a muoversi da + a -, è potenziale che si muove da + a -. :-) –

+0

@R Hai ragione parzialmente. QWERTY è stato progettato per essere inefficiente. Per quanto riguarda la parte della leggenda urbana, alcune fonti affermano che dvorak non è più veloce di qwerty. Queste fonti sono per lo più basate su uno studio (di US Navy, iirc) che ha confrontato i dattilografi sia di qwerty che di dvorak, ma questo studio è scarsamente documentato quindi non è noto quale tipo di dattilografo i dattilografi usassero giorno per giorno . Tuttavia, QWERTY mostra di tanto in tanto la sua debolezza, ma questo è principalmente per la digitazione con una sola mano, e tutti gli altri vincoli non sono abbastanza grandi per permettermi di imparare a digitare di nuovo con un nuovo layout. – Jarmund

4

Questa è la speculazione.

Indietro quando fu inventato Unix c'erano macchine in uso che avevano parole a 36 bit, e un popolare disimballaggio di quelle parole era 4 caratteri a 9 bit. Se tm_year è impostato su anno - 1900, quindi tutti i singoli campi struct tm si inseriscono in caratteri senza segno a 9 bit. La memoria era molto stretta su quelle vecchie macchine, quindi l'imballaggio dei dati strettamente nelle strutture era una preoccupazione più grande di quanto lo sia oggi.

Problemi correlati