C'era qualcosa in Cobol intrinsecamente rendendola sensibile Y2K problemi?

StackOverflow https://stackoverflow.com/questions/1463434

  •  13-09-2019
  •  | 
  •  

Domanda

Lo so che un sacco di Y2K sforzi / spavento è stato in qualche modo centrato su COBOL, meritatamente o no. (Diamine, ho visto minorenne Y2K bug in uno script Perl che ha rotto 1/1/2000)

Quello che mi interessa, c'era qualcosa di specifico per COBOL come linguaggio che ha reso suscettibile di Y2K problemi?

Cioè, al contrario di solo l'età della maggior parte dei programmi scritti in esso e conseguente necessità di lesinare sulla utilizzo della memoria / disco guidato da vecchio hardware e il fatto che nessuno ha anticipato quei programmi di sopravvivere per 30 anni?

Sono perfettamente felice se la risposta è "niente di specifico per COBOL diversa età" - semplici curiosi, senza sapere nulla di COBOL

.
È stato utile?

Soluzione

Sì e No. In COBOL si doveva dichiarare le variabili in modo tale che in realtà aveva da dire quante cifre ci sono stati in un certo numero cioè YEAR PIC 99 dichiarato il YEAR variabile tale da poter contenere solo due cifre decimali. Quindi sì, è stato più facile fare questo errore che in C stavi avrebbe int o short o char come l'anno e hanno ancora molto spazio per anni maggiori di 99. Naturalmente che non ti protegge da printfing 19%d in C e continua ad avere il problema nella vostra uscita, o fare altri calcoli interni sulla base di pensare l'anno sarebbe inferiore o uguale a 99.

Altri suggerimenti

E 'stato l'80% circa della capacità di stoccaggio, pura e semplice.

Le persone non si rendono conto che la capacità del proprio disco rigido portatile oggi avrebbe dei costi milioni nel 1980. Pensi che il salvataggio di due byte è stupido? Non quando si dispone di un 100.000 record dei clienti e un disco rigido delle dimensioni di un frigorifero tenuto 20 megabyte e richiedeva una stanza speciale per conservare al fresco.

E 'sembrava essere più un problema delle persone non sapendo quanto tempo sarebbe stato usato il loro codice, in modo che ha scelto di utilizzare 2 anni cifre.

Quindi, niente di specifico per COBOL, è solo che i programmi COBOL tendono ad essere critici e vecchio quindi erano più probabilità di essere colpiti.

  

C'era qualcosa in Cobol intrinsecamente rendendola sensibile Y2K problemi?

I programmatori 1 . E i sistemi in cui eseguire programmi COBOL 2 .


1: Non hanno la progettazione lungimirante 30 anni. Non posso biasimarli davvero. Se avessi vincoli di memoria, tra compressione 2 byte per data e farlo funzionare 30 anni ultimi, molto probabilmente avrei fatto la stessa decisione.

2: I sistemi avrebbe potuto avere lo stesso problema se l'hardware memorizzato l'anno in due cifre.

domanda affascinante. Qual è il problema Y2K, in sostanza? E 'il problema di non definire il vostro universo sufficientemente. Non c'era alcun serio tentativo di modellare tutte le date, perché lo spazio era più importante (e le applicazioni sarebbe stato sostituito da allora). Quindi, in Cobol a tutti i livelli, questo è importante:. Per essere efficiente e non overdeclare la memoria è necessario, sia al negozio e al livello di programma

Dove efficienza è importante, abbiamo commettere errori Y2Kish ... Lo facciamo ogni volta che abbiamo memorizzare una data nel DB senza un fuso orario. stoccaggio in modo moderno è sicuramente soggetto a Y2Kish errori, perché cerchiamo di essere efficienti con lo spazio utilizzato (anche se scommetto che è sovra-ottimizzazione, in molti casi, soprattutto a livello esagerare-tutto enterprise).

D'altra parte, abbiamo evitare errori Y2Kish sul livello di applicazione, perché ogni volta che si lavora con, diciamo, una data (in Java, diciamo) porta sempre in giro un sacco di bagagli (come fuso orario). Perché? Perché Data (e molti altri concetti) sono ormai parte del sistema operativo, in modo che i tizi intelligenti OS-making cercano di modellare un concetto in piena regola della data. Dal momento che ci affidiamo a loro concetto di data, non possiamo rovinare tutto ... ed è modulare e sostituibile!

lingue più recenti con tipi di dato built-in (e strutture) per molte cose, come data, così come la memoria enorme con cui giocare, contribuire ad evitare un sacco di potenziale problemi Y2Kish.

E 'stato due parti. 1- l'età / longevità del software Cobol, e 2- il limite di 80 caratteri di record di dati.

Nome maggior parte dei software di quell'età utilizzato solo 2 numeri a due cifre per la conservazione anno, dal momento che nessuno ha calcolato il loro software sarebbe durata così a lungo! COBOL era stato adottato dal settore bancario, che sono noti per non buttare via codice. altri software di più è stato gettato via, mentre le banche non hanno fatto!

In secondo luogo, COBOL è stato costretto a 80 caratteri per record di dati (a causa delle dimensioni delle schede perforate!), Gli sviluppatori erano a una pressione ancora maggiore per limitare le dimensioni dei campi. Perché hanno capito "L'anno 2000 non sarà qui finchè non sarò lungo e in pensione!" i 2 caratteri di dati salvati erano enormi!

E 'stato molto più legata alla memorizzazione l'anno in elementi di dati che potrebbe contenere solo valori da 0 a 99 (due caratteri o due cifre decimali, o un singolo byte). Questo, e calcoli che hanno fatto ipotesi simili sui valori dell'anno.

Non era certo una cosa specifica-Cobol. hanno risentito un sacco di programmi.

C'erano delle cose su COBOL che aggravati la situazione.

  • è vecchio, quindi meno uso di codice della libreria, più homegrown tutto
  • è vecchio, quindi pre-internet, pre-social-networking, più NIH, un minor numero di quadri, cose più personalizzato
  • è vecchio, quindi, meno astratto, più probabilità di avere soluzioni aperte con codice
  • è vecchio, quindi, tornare abbastanza indietro e salvare 2 byte potrebbe avere, una sorta di, stato importante
  • è vecchio, così, in modo che precede SQL. software operativo Legacy anche aveva indicizzati i file su disco di record-oriented per rendere rolling-your-own-Database-in-ogni-programma un po 'più facile.
  • stringhe di formato "printf" e dichiarazione del tipo di dati fossero la stessa cosa, tutto doveva n cifre

Ho visto giganti programmi Fortran senza subroutine attuali. In realtà, un programma principale 3.000-line, non una sola subroutine non biblioteca, che è stato. Suppongo che questo potrebbe essere accaduto nel mondo COBOL, così ora si deve leggere ogni linea per trovare la maneggevolezza data.

COBOL non è venuto con qualsiasi libreria maneggevolezza data standard.

Così ognuno codificato la propria soluzione.

Alcune soluzioni erano molto male vis-a-vis del millennio. La maggior parte di queste soluzioni cattivi non importa come le applicazioni non vivevano 40 anni. Il non-così piccola minoranza di soluzioni cattiva causa il ben noto problema Y2K nel mondo degli affari.

(Alcune soluzioni erano migliori che conosco di sistemi COBOL codificati nel 1950 con un formato di data buona fino al 2027 - deve essere sembrata sempre in quel momento;. E ho progettato sistemi nel 1970 che sono buoni fino a 2079) <. / p>

Tuttavia, aveva COBOL aveva un tipo data standard ....

03 ORDER-DATE     PIC DATE.

.... soluzioni ampie del settore sarebbero stati disponibili a livello di compilatore, tagliando la complessità di una bonifica necessaria.

Morale:. Utilizzare lingue con librerie standard

COBOL 85 (lo standard 1985) e le versioni precedenti non hanno alcun modo di ottenere il secolo corrente **, che è stato un fattore intrinseco al COBOL che scoraggiato l'uso di anni 4 cifre anche dopo 2 byte di spazio di archiviazione aggiuntivo non era più un problema.

** implementazioni specifiche possono aver avuto le estensioni non standard per questo scopo.

L'unico problema intrinseco con Cobol era è originale (fine del 1960) dichiarazione standard per recuperare la data di sistema attuale, che è stato:

ACCEPT todays-date FROM DATE

Questo ha restituito un numero di 6 cifre, con la data in formato AAMMGG.

Tuttavia, anche questo non era necessariamente un problema, come abbiamo scritto il codice negli anni '90 con questa dichiarazione che ha appena controllato se la porzione dell'anno è stato inferiore a 70 e presume che la data era 20YY, che avrebbe reso un problema Y2K070. : -)

Lo standard è stato esteso in seguito (COBOL-85, credo) in modo che si può chiedere la data in diversi formati, come:

ACCEPT todays-date FROM CENTURY-DATE

Il che ti ha dato un numero di 8 cifre con la data come CCYYMMDD.

Come te, e altri hanno sottolineato, molti altri linguaggi di programmazione ammessi per la rappresentazione 'lossy' delle date / anni.

Il problema era davvero di memoria e storage vincoli alla fine degli anni '70 primi anni '80.

Quando il quarto di un computer milione di dollari aveva 128K e 4 dischi per un totale di circa 6 megabyte si potrebbe o chiedete al vostro gestione per un altro mulino quarto per una macchina 256K con 12 mega di spazio su disco o di essere molto, molto efficace per lo spazio <. / p>

Quindi ogni sorta di trucchi risparmio di spazio sono stati usered. Il mio preferito è stato quello di memorizzare la data AAMMGG come 991.231 in un ricco campo decimale x'9912310C' poi battere dell'ultimo byte e conservarla come '991.231'. Così, invece di 6 byte avete preso solo fino 3 byte.

Altri trucchi inclusi alcuni finti tipo encodeing Hooky per i prezzi - Codice 12 -> $ 19.99.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top