"640K ought to be enough"

640K je bilo dovoljno za 1981. — pitanje je samo zašto ti to još danas stoji na leđima.

poglavlje 4/2919 min čitanja1981 – 1990
ti@kronika:~$ ./sviraj K3_4_640.mp3

# da, poglavlje ima pjesmu. ne, nitko ne zna zašto.

Godina je bilo koja između 1985. i, budimo iskreni, 1994. Sjediš pred monitorom boje čađe, upravo si htio pokrenuti nešto — igru, tablicu, program za crtanje ljubičastih dinosaura — i ekran ti mirno, gotovo uvredljivo mirno, ispisuje: „Not enough memory.” Nema dovoljno memorije. Gledaš u tu poruku. Onda gledaš u kutiju računala pored stola, unutar koje, znaš to jer si sam kupio čip i sam ga ugurao u utor, sjede četiri cijela megabajta memorije. Kompjuter ima memoriju. Kompjuter kaže da nema memoriju. Nešto tu ne štima, i ti to osjetiš u trbuhu prije nego što uspiješ tu misao formulirati u glavi.

Pa dobro, misliš, valjda sam nešto krivo instalirao. Ideš u config.sys. Ideš u autoexec.bat — dvije datoteke koje DOS (Disk Operating System, operativni sustav koji se učitavao prije nego što bi vidio ikakav program; zamisli ga kao majstora koji ti otvori vrata prije nego što uđeš u stan) čita čim upališ računalo i po njima odlučuje što će i kako pokrenuti. Dodaješ redak, brišeš redak, netko na BBS-u — tim oglasnim pločama na koje se spajalo modemom da čitaš i pišeš poruke drugim entuzijastima, dok internet kakav danas znaš još nije postojao — kaže da treba HIMEM.SYS, netko drugi kaže da treba EMM386, treći tvrdi da to sve ovisi o rasporedu planeta. Prekucaš, restartaš, čekaš da se DOS opet učita — i ekran ti opet, mirno, ispisuje istu poruku. U tom trenu prvi put posumnjaš da problem nije u tebi. Da postoji negdje netko, davno, tko je ovo tako postavio — i da ti sad plaćaš ceh za njegovu odluku, s kamatama, u obliku sata i pol tvog slobodnog vremena i jedne prilično jake glavobolje.

Jer ovo nije priča o jednom bugu koji je netko zaboravio ugasiti. Ovo je priča o odluci donesenoj u žurbi, godinama prije nego što si ti ikad vidio taj monitor, koju su onda svi sljedeći inženjeri, cijelo desetljeće, morali poštovati kao svetu — ne zato što je bila pametna, nego zato što ju je već bilo prekasno mijenjati. A negdje na putu ta priča je pokupila i rečenicu koju čovjek koji ju je — vjerojatno — izgovorio, zapravo nikad nije izgovorio. Sjedni. Idemo redom, pitanje po pitanje, baš kao onda na BBS-u. Samo ovaj put, obećavam, netko ti stvarno znade odgovoriti.

Dobro, kaže laik, ti mi tu spominješ 640K kao da je to nešto sveto, ali objasni mi jedno — ja sam 1994. kupio računalo s 4 megabajta RAM-a, DOS mi je i dalje kukao da nema memorije, i ja sam sjedio pred ekranom i gledao u prazno pitajući se gdje mi je taj RAM nestao. Je li ga netko pojeo?

Nije ga pojeo. Bio je tu, cijelo vrijeme, samo nedostupan — kao da ti netko stavi tortu na stol, zaključa je u ormar ispred tebe i kaže: gladan si? Sjajno, evo ti pogled. Ta rupa u memoriji, ono što se poslije prozvalo »640K barijerom«, nije nastala ni kvarom ni pohlepom. Nastala je 1981. godine, u žurbi, iz posve konkretnog inženjerskog razloga — i baš zato je toliko iritantna. Nitko nije bio glup, samo nitko nije gledao dovoljno daleko unaprijed.

Krenimo od početka. Intel 8088, procesor koji je IBM ugradio u svoje prvo osobno računalo, ima onoliko adresnih linija — sitnih žica kojima čip broji lokacije u memoriji — da fizički može „vidjeti” točno jedan megabajt prostora. Ne dva, ne deset — jedan. To nije odluka nekog menadžera koji je štedio, to je tvrda fizička granica samog čipa, urezana u njegov dizajn. Zamisli da imaš stan s točno milijun kvadratnih centimetara prostora za sve što ikad kupiš — namještaj, hranu, knjige. Zvuči kao puno, a 1981. je to i bilo puno: gotovo nitko tada nije imao računalo s više od nekoliko desetaka kilobajta RAM-a, pa je milijun bajtova zvučao kao prostor bez dna.

Ali onda dolazi IBM-ov inženjerski tim i mora nekako podijeliti taj milijun. Ne može sve otići korisničkim programima, jer računalu treba prostora i za druge stvari — grafička kartica mora imati svoje mjesto u memoriji da bi procesor s njom mogao „razgovarati”, BIOS-u (onom tihom programčiću koji upali računalo prije nego ti i vidiš DOS) treba svoj kutak, a i budući dodaci — mreže, zvučne kartice, sve što tada još nije ni postojalo — moraju imati gdje stanovati. Pa su povukli crtu. Donjih 640 kilobajta — tvoje. Gornjih 384 — za sve to ostalo. Zbroj, gle čuda, točno jedan megabajt.

Zašto baš 640, a ne 512 ili 768? Nema tu nikakve mistične matematike, samo praktični kompromis — dovoljno za tadašnje programe, a dovoljno prostora ostavljeno i za hardver koji su znali da dolazi. I sad dolazimo do rečenice koja će te malo zaboljeti, ali mora se reći: to je bila potpuno razumna, čak pametna odluka. Za 1981. Za računalo koje je trebalo potrajati na tržištu možda tri, četiri godine, prije nego ga zamijeni nešto bolje.

Znaš onaj osjećaj kad iznajmiš stan na kratko, pa ga preuređuješ »privremeno«, a onda ostaneš deset godina i cijeli život ti se odvija oko provizorne pregrade koju si trebao srušiti prvi tjedan? Otprilike to. Samo umjesto tebe, u tom stanu je stanovala cijela industrija osobnih računala.

"Tko je rekao da je 640K dovoljno?"
§ 02

"Tko je rekao da je 640K dovoljno?"

Dobro, kaže laik, znam ja tu rečenicu. Svi je znaju. Bill Gates je 1981. rekao da će 640 kilobajta biti dovoljno zauvijek. Zvuči kao onaj tip iz ureda koji je uvjeren da mu neće trebati veći stan, pa onda za pet godina kupuje ormar u kojem živi drugi ormar. Ajde, gdje je taj citat? Pokaži mi ga.

E tu i nastaje problem, kažem mu. Nigdje. Ne postoji snimka, nema tiskane izjave, nema mejla, nema zapisnika sa sastanka, nema novinskog članka iz te godine u kojem to stoji. Ljudi su desetljećima tražili taj citat kao svetog grala i vraćali se praznih ruku. Najstariji trag koji se uopće približava toj rečenici pojavljuje se tek godinama kasnije, na online forumima devedesetih, gdje ga netko navodi »iz sjećanja«. A sjećanje je, kao što znamo, prilično nepouzdan svjedok na sudu.

Ali čekaj, kaže laik, možda je stvarno to rekao, samo ga nitko nije snimio? Moguće, kažem, ali malo vjerojatno iz jednog jednostavnog razloga: Gates je tu rečenicu javno i izravno demantirao, više puta, desetljećima unazad. Ne mrmljanjem, ne kroz glasnogovornika — osobno, u intervjuima, s onim tonom čovjeka kojem je već dozlogrdilo po deseti put objašnjavati isto sranje. Kaže da nikad nije rekao ništa slično, da mu ta rečenica zvuči glupo jer je on, kao inženjer koji je i sam pisao kod za te mašine, znao koliko brzo memorija nestaje. On je od svih ljudi na planeti posljednji koji bi vjerovao u »zauvijek« kad je riječ o kilobajtima.

Znaš što je tu zapravo zanimljivo, kažem mu — sam fenomen kako se lažni citat zalijepi za nekoga i ostane zalijepljen kao žvaka pod stolom. Prvo: rečenica je genijalno formulirana. Kratka, ironična, s brojem koji svi razumiju i predviđanjem koje je spektakularno pogriješilo — savršena za anegdotu uz kavu. Drugo: Gates je u to doba već bio najbogatiji štreber na planetu, pa mu ljudi rado vješaju megalomanske izjave, čak i kad ih nikad nije izrekao — priča je jednostavno zabavnija ako je baš „car tehnologije” taj koji je zabrljao. Treće, i najvažnije: citat je zvučao istinito jer je opisivao stvarnu odluku, samo netočno pripisanu osobi. Netko je jednom davno pojednostavio tehničku priču o granici od 640K u jednu rečenicu, stavio joj poznato ime na etiketu, i ta je etiketa počela putovati brže nego što je bilo koga zanimalo provjeriti je.

Dobro, kaže laik, ali je li stvarno rečeno nešto o granicama memorije, ili je sve izmišljeno od korice do korice? Jest, kažem, samo puno dosadnije i puno preciznije nego mit. Gates je 1985. u jednom intervjuu spomenuo granicu adresnog prostora kao tehnički fakt, ne kao proročanstvo — govorio je o tome zašto je 16-bitni sustav ograničen na megabajt adresnog prostora, dakle objašnjavao je arhitekturu, a ne obećavao vječnost. IBM-ovi inženjeri koji su stvarno donijeli odluku o podjeli na 640K za programe i preostalih 384K za sistemske potrebe pisali su o tome u internoj tehničkoj dokumentaciji, suhoparno, kao ljudi koji rješavaju konkretan problem s konkretnim brojem čipova na matičnoj ploči — ne kao ljudi koji pišu proročanstva za povijesne knjige.

I tu je poanta, kažem mu. Prava priča nije da je jedan čovjek bio slijep za budućnost. Prava priča je da je desetak ljudi u žurbi 1981. donijelo razumnu inženjersku odluku za tržište kakvo je tada postojalo — nitko od njih nije razmišljao o „zauvijek”, nego o „za sljedeći kvartal” — a onda je industrija tu privremenu odluku pojela, progutala i ugradila u temelje na kojima se sve dalje gradilo. Citat je izmišljen. Rupa u memoriji nije. I upravo ta rupa je razlog zašto će sljedeći dio ove priče biti puno manje zabavan, a puno više o tome kako su se ljudi cijelo desetljeće borili sa slamkama, trikovima i datotekama config.sys da tu rupu premoste.

"Zašto to nisu jednostavno popravili?"
§ 03

"Zašto to nisu jednostavno popravili?"

Dobro, kaže laik, sad me stvarno zbunio. Imate rupu u memoriji, znate da je glupa, znate otprilike i kako je nastala — pa zašto je jednostavno ne zatvorite? Sjednete, prepišete par linija koda, i eto, riješeno. Kako to da je ta stvar mučila ljude čitavu jednu deceniju?

Odgovor je jedna riječ, i ta riječ ti zapravo odgovara na pola pitanja iz ove knjige: kompatibilnost. Zamisli je kao betonsku čizmu koju si sam sebi navukao na nogu jer je u trenutku kupnje bila jeftina i baš ti je pristajala. Prva verzija PC-a se s tom rupom u memoriji prodala u milijunima komada, a firme su na njima napisale programe koji su, sasvim legitimno, računali na to da svijet iznad 640K jednostavno ne postoji. Kad bi IBM ili bilo tko drugi sutradan rekao „ukidamo rupu, evo vam ravnog megabajta memorije”, svaki bi se od tih programa ili srušio ili — gore — nastavio raditi, ali nasumično i pogrešno. Nitko normalan to ne riskira kad mu cijela industrija visi o vratu.

I ovo nije prvi put da se to dogodilo, ni zadnji. Sjeti se čipa za prekide (interrupt controller) iz IBM-ovog prvog PC-a — Intel 8259 — one komponente koja procesoru dojavljuje „hej, tipkovnica je nešto pritisnula” ili „hej, disk je gotov s poslom”. Taj čip je imao bug u sebi, programeri su ga otkrili i, umjesto da ga prijave kao grešku, jednostavno su ga počeli koristiti kao značajku. Rezultat: taj bug se morao zauvijek replicirati u svakom sljedećem čipu, generaciju za generacijom, samo da stari programi nastave raditi. Ili raspored tipki QWERTY, dizajniran u devetnaestom stoljeću da spori daktilografe kako ne bi zaglavljivali mehaničke poluge, i koji je sto pedeset godina kasnije, na tipkovnici koja nema nikakve poluge za zaglaviti, još uvijek tu — jer je cijela generacija naučila kucati na njemu. Isti obrazac, uvijek iznova: privremeno rješenje postane kost u kičmi cijele industrije, i onda ga braniš do smrti, ne jer je dobro, nego jer ga je previše ljudi već naučilo.

OK, kaže laik, shvaćam da nisu mogli srušiti temelje. Ali onda su morali izmisliti neku foru da zaobiđu rupu, umjesto da je zatvore? I jesu. Sjećaš se te slamke koju smo spominjali — pa evo, ovo je ona, samo malo detaljnije.

Prisjeti se: procesor gleda samo 640K plus rezervirani dio do granice od 1 MB, i to je to — njegov cijeli svemir. Ali stroj fizički ima više memorije nabijene u kućištu; ona samo stoji tamo, nedodirnuta, kao soba iza zaključanih vrata za koju procesor ni ne zna da postoji. E sad, netko je smislio trik zvan EMS — Expanded Memory Specification. Ideja je bila glupo jednostavna: procesor ima mali prozorčić, otprilike 64K, kroz koji gleda u tu skrivenu sobu punu memorije. Kad zatreba neki drugi dio te memorije, prebaci koji komad se vidi kroz prozorčić — kao da imaš ogromno skladište, a jedini pristup mu je kroz jedno malo okno koje možeš okretati prema različitim policama. Sporo, nespretno, ali radi.

Kasnije je stigao XMS — Extended Memory Specification — malo elegantniji trik od EMS-a. On je iskoristio jednu tehničku rupicu u samom dizajnu procesora (nešto se zove unreal mode, ali to je već druga priča) da na kratke trenutke ukrade pogled iznad megabajta, kopira podatke i vrati se natrag prije nego što procesor primijeti da je izašao iz svoje sobe. A HIMEM.SYS je bio upravo taj vratar — driver koji je upravljao svim tim ulaskom i izlaskom, tako da ti kao korisnik ne moraš ručno hakirati procesor svaki put kad ti ponestane memorije za igru.

Zvuči kao ludilo, kaže laik. Pa i jest ludilo. Cijela je jedna industrija desetljeće provela pišući genijalne, elegantne, apsurdno komplicirane zaobilaznice za problem koji je u biti glasio: ovaj čip je kratkovidan, pa mu moramo praviti naočale od žice i ljepljive trake.

Znaš onu foru s Tetrisom, kad pokušavaš složiti blokove da ne ostane praznina? Zamisli da igraš Tetris, ali umjesto blokova imaš drivere, a umjesto praznog polja imaš 640 kilobajta — i ako ne složiš savršeno, cijela igra koju si čekao nekoliko minuta da se učita s diskete jednostavno odbije raditi. To je bio config.sys, mala tekstualna datoteka koja je govorila računalu koje drivere učitati i kojim redom, i s kojom si se, ako si htio da ti igra ili program stanu u tih 640K, morao petljati ručno, redak po redak, kao da rješavaš puzzle bez slike na kutiji. Nije bug. Nije ni feature. To je bila cijena koju je platila svaka osoba koja je htjela pokrenuti nešto malo ambicioznije od teksta na ekranu, jer je 1981. netko odlučio da 640K zvuči kao broj koji nikad neće biti premalen.

"Kad je noćna mora završila?"
§ 04

"Kad je noćna mora završila?"

Dobro, kaže laik, sve to zvuči kao mučenje. Kad je netko konačno rekao „dosta” i riješio to?

Kratki odgovor: 1985. Duži odgovor: 1985. je bila godina kad je rješenje stiglo, a onda je trebalo još desetak godina da ga svijet stvarno počne koristiti. Jer, sjećaš se, kompatibilnost je betonska čizma — svi su htjeli novi procesor, ali nitko nije htio da mu stari programi prestanu raditi. Intel je 1982. izbacio 286, a onda 1985. i 386, i oba su procesora imala nešto što je zvučalo kao izlazna dozvola iz zatvora: zaštićeni način rada, protected mode.

Što je to točno?

Zamisli da 8088, taj prvi čip iz cijele priče, radi u onom starom modu — real modeu — kao netko tko smije hodati samo unutar kruga iscrtanog na podu, a taj krug je velik samo 1 MB. Zaštićeni način rada je isti procesor, samo s ukinutim krugom: 286 je u tom modu mogao adresirati 16 MB, 386 čak 4 GB — brojka koja je 1985. zvučala kao znanstvena fantastika, a danas je tvoj mobitel prijeđe dok učita jedan Instagram story.

Pa super, riješeno? Kupiš 386, isključiš krug, i gotovo?

Ovdje dolazi ono što izluđuje svakog laika kad prvi put čuje ovu priču: ne, nije bilo riješeno. DOS je pokretao devedeset i nešto posto svih tih strojeva, a jednostavno nije znao da zaštićeni način rada postoji. Pisan je za real mode i u real modeu je ostao zaključan, kao čovjek koji je cijeli život živio u jednoj sobi, a sad mu kažeš da je zgrada dobila još deset katova — samo, on ne zna gdje su stepenice.

I tu na scenu stupaju DOS extenderi — programi koji su, grubo rečeno, znali na trenutak guštnuti procesor u zaštićeni način rada, pustiti aplikaciju da se razmahne u toj velikoj sobi, a onda ga vratiti u real mode kad je DOS-u trebalo obaviti nešto posve obično, tipa pročitati datoteku s diska. Zvuči kao apsurdna gimnastika, i jest bila apsurdna gimnastika. Igre poput Dooma koristile su DOS/4GW, extender koji je programerima praktički rekao: piši kao da rupe nema, ja ću se pobrinuti za majstoriju ispod haube.

Dobro, a Windows? Windows je trebao to riješiti, ne?

Windows 3.0, iz 1990., prvi je masovno pokrenuo strojeve u zaštićenom načinu rada i konačno ponudio memoriju bez tetriranja s EMS karticama — onim dodatnim pločicama koje si utaknuo u računalo samo da bi prevario DOS i ubacio mu još pokoji kilobajt preko one čuvene granice od 640K. Windows 95 je to skrio još dublje: korisnik je vidio ikonice i Start meni, a rupa od 640K je za njega postala arheologija, nešto o čemu čuješ od starijeg kolege kao o benzinskim automobilima s ručnim mjenjačem. Windows NT, pa XP, konačno su DOS izbacili iz temelja umjesto da ga samo prekriju tapetom.

Znači, gotovo je, rupa je zatrpana, možemo je zaboraviti?

Ovo je dio koji laika najviše zaboli, pa ga volim čuvati za kraj. Rupa nikad nije nestala. Ona je samo pokopana ispod slojeva. Tvoj laptop, danas, dok pritisneš tipku za uključivanje, prvih djelić sekunde procesor se probudi — pogodi — u real modeu. Točno u onom istom krugu od 1 MB iz 1979. UEFI firmware to odmah prebaci u zaštićeni, a zatim u long mode — tako se zove način rada modernih 64-bitnih procesora, nasljednik zaštićenog moda, samo puno prostraniji — sve se dogodi prebrzo da bi ijedan ekran to pokazao, ali arheološki slog je tu, ispod betona, ispod tapete, ispod dvadeset generacija hardvera koje si kupio vjerujući da kupuješ nešto potpuno novo.

"Što smo naučili?" (ništa)
§ 05

"Što smo naučili?" (ništa)

Dobro, pita laik, zaključno pitanje: sad kad znamo cijelu priču o 640K, o Gatesu koji to nikad nije izgovorio, o ratovima oko config.sys datoteke i EMS čarolijama — što smo iz svega toga naučili?

Ništa.

Ne, stvarno, ništa. I to nije cinizam radi cinizma, to je statistički nalaz. Pogledaj IPv4. Isti obrazac, druga desetljeća: netko je 1981. sjeo i odlučio da je 32-bitna adresa dovoljna za sve računala na svijetu, zauvijek. 4,3 milijarde adresa. Zvučalo je apsurdno velikodušno — kome bi trebalo toliko računala? Danas imaš više uređaja na svom stolu nego što je 1981. bilo ljudi u tvom gradu, i internet cijelo posljednje desetljeće preživljava na NAT-u — tehnici kojom se hrpa uređaja gura kroz jednu jedinu javnu IP adresu, kao kad cijela zgrada zove s jednog telefonskog broja — provizornim zakrpama i molitvi, dok IPv6 čeka u kutu kao rješenje koje nitko ne žuri implementirati jer, gle čuda, provizorno rješenje opet radi dovoljno dobro da ga se ne dira.

Pa dobro, kaže na to laik, to je bila jedna generacija programera. Možda su svi bili isti tip ljudi — malo lijeni, malo kratkovidni?

Nisu. To je najbolji dio. Godine su prolazile, ljudi su se penzionirali, cijele su škole programiranja izumrle i nove se rodile — a obrazac je identičan. Uzmi datume. Desetljećima su programi čuvali godinu kao dvije znamenke, ’81 umjesto 1981, jer je memorija bila skupa i tko će, zaboga, još raditi ovaj kod 2000. godine. E pa hoće, cijeli svijet, i onda 1999. u prosincu odjednom svi ti isti argumenti — kompatibilnost, cijena migracije, tko će to sve pretestirati — ponovno na stolu, samo s dodatnom nulom u proračunu za paniku. Y2K nije bio hardverski kolaps civilizacije kako su tabloidi sanjali, ali jest bio dokaz da je čovječanstvo dva puta u jednom stoljeću sjelo za istu klupu i reklo istu rečenicu: „tko će to još koristiti tad”.

I sad dolazi ono najslasnije, jer ovo se još nije dogodilo, pa možeš unaprijed gledati kako se sprema. Unix je vrijeme počeo brojati od 1. siječnja 1970., u sekundama, kao 32-bitni broj. Praktično, elegantno, i taj broj će 19. siječnja 2038. u 03:14:07 UTC prekoračiti svoj kapacitet i prekrenuti se — na 1901. godinu. Ne u nekom muzejskom mainframeu iza stakla, nego u naplatnim uređajima, u industrijskim kontrolerima, u satelitima, u bilo kojem embedded sustavu koji je netko 1998. napisao i mislio „pa tko će ovo još koristiti za četrdeset godina”. Isti citat. Isti Gates koji ga nikad nije rekao, samo u drugoj kostimografiji.

Napravio sam ti računicu, jer volim kad brojevi rade posao umjesto pridjeva. 640K → problem vidljiv oko 1990. (devet godina). Dvoznamenkaste godine → problem 2000. (negdje između dvadeset i trideset godina, ovisno kad je kod pisan). Iscrpljenje IPv4 adresa → ozbiljno od sredine 2010-ih, prva alarmna zvona već krajem devedesetih (petnaest do dvadeset godina). Problem 2038., ako brojiš od 1970., to je šezdeset osam godina — ali kod koji ga uzrokuje pisan je uglavnom devedesetih i dvijetisućitih, što opet vraća prosjek negdje na petnaest do dvadeset godina života prije nego što odluka postane problem. Zaokruži to i dobiješ pravilo koje bi trebalo stajati urezano na zidu svake inženjerske učionice: „dovoljno zauvijek” u praksi znači, u prosjeku, petnaestak godina.

Nije to jer su inženjeri glupi. Upravo suprotno — svi ti ljudi su bili racionalni, brzi, pod pritiskom rokova i budžeta koji postoje danas, a ne 2038. Problem nije neznanje. Problem je da nitko nema poticaj optimizirati za desetljeće koje neće platiti njegov račun za struju. Zato 640K nije priča o jednoj lošoj odluci iz 1981. Ona je priča o tome da će netko, negdje, upravo dok ti čitaš ovu rečenicu, pisati kod koji će 2040-ih izgledati jednako smiješno kao rupa u tvom RAM-u danas. I bit će isto tako razuman, u trenutku kad ga je pisao.