Macho programeri, memorija bubnja i forenzička analiza strojnog koda iz 1960-ih

Pravi programeri ne koriste PASCAL

Programeri danas grade distribuirane aplikacije i umjetne neuronske mreže. Koriste funkcionalno reaktivno programiranje, mrežne okvire otvorenog koda i okruženja bez poslužitelja. Ipak, sindrom varalice je stvaran, a programeri još uvijek kritiziraju jedni druge da nisu "pravi programeri".

Godinama sam radio kao docent u Muzeju povijesti računala. Snaga "pravog programera" postoji od početka softvera. A to mogu dokazati pričom.

Priča započinje pismom iz 1983. godine, Pravi programeri ne koriste PASCAL, koji je napisao Ed Post. Pismo je objavljeno u Datamationu i govori o "macho" strani programiranja. Potreban je onima koji omalovažavaju korisnike jezika više razine kao da nisu "pravi programeri".

Priča o Melu mrežni je odgovor na to pismo. Na Usenet ju je objavio 21. svibnja 1983. Ed Nather.

Mel i Ed bili su kolege u tvrtki za pisaće strojeve koja se razgranala u izgradnju računala. Njihov uspjeh bio je LGP-30: bubnjevno memorijsko računalo s Flexowriter tipkovnicom i čitačem papirnate vrpce. (Slika zaglavlja u ovom članku je nadzorna ploča LGP-30.) Mel je dobila zadatak da prepiše popularni program za računalo nasljednika, RPC-4000.

Luka? Što to znači?

Nakon što je Mel napustila tvrtku, Ed je dobio zadatak da prepiše dio ovog programa. U priči otkriva beskonačnu petlju u kodu, što nekako ne sprječava program da funkcionira:

Možda je moj najveći šok nastao kad sam pronašao nevinu petlju u kojoj nije bilo testa.

Nema testa. Nijedna.

Zdravi razum rekao je da to mora biti zatvorena petlja, gdje će program kružiti, zauvijek, beskrajno.

Kontrola programa prošla je kroz nju, međutim, i sigurno s druge strane.

Ed je otkrio da zatvorena petlja uzrokuje preljev, koji je prepisao kôd upute. Ishod preljeva bila je uputa za skok , premještajući kontrolu nad programom na drugo memorijsko mjesto.

To je sjajna priča. Ali provjerava li?

Analiza forenzičkog koda: Provjerava li priču?

Naš prvi korak je traženje tehničkih detalja o stroju za koji je program napisan. Iako se u priči opsežno spominje LGP-30, program se zapravo izvodio na RPC-4000. (Zapamtite, za ovaj novi stroj trebalo ga je prepisati.)

Oba stroja koristila su memoriju bubnja za pohranu programa. (Zabavna činjenica: grubi ekvivalent vašeg modernog tvrdog diska bila je memorija bubnja, papirna traka, bušilice ili magnetska traka!) Jedna linija elektromagnetskih glava čitala bi / upisivala podatke dok se bubanj vrtio konstantnom brzinom ispod njih. Evo vizualne reference:

Podaci su pohranjeni i preuzimani iz različitih sektora i tragova bubnja. Da bismo saznali više o formatu podataka, možemo potražiti priručnik za programiranje RPC-4000, koji je archive.org skenirao i sačuvao na mreži.

Na stranici 20 priručnika nalazimo sljedeći dijagram riječi podataka:

Riječ naredbe raščlanjuje se na:

  • 5 bitova za naredbu
  • 13 bita za mjesto staze / sektora operanda
  • 13 bitova za trag / sektor adrese sljedeće naredbe

Bit 31 je indeksna oznaka koja je, kada je postavljena, aktivirala indeksni registar:

[Indeksni registar] omogućio je programeru da napiše programsku petlju koja je unutra koristila indeksirane upute; svaki put je na adresu te upute dodan broj u indeksnom registru, tako da se odnosi na sljedeći datum u nizu.

U priči se spominje da je "indeksni bit" " bit koji se nalazio između adrese i operacijskog koda u riječi s uputama ". Ipak, gornji dijagram pokazuje da je bit oznake indeksa zapravo na bitu 31, iza naredbe i adresa. Osobno, to krečem do pogrešnog prisjećanja autora u godinama između pregledavanja koda i snimanja priče.

Srećom, to ne utječe na aspekt prelijevanja priče. Budući da je nastava riječ je se povukao u memoriju i poveća indeks malo bi i dalje trebaju biti postavljena na , kako za povećanje do prelijevanja Next adresa .

Da bismo ponovno stvorili riječi s uputama u petlji, moramo znati više o tome kako je program funkcionirao. Evo citata iz kritičnog dijela priče:

Locirao je podatke na kojima je radio pri vrhu memorije -

najveća mjesta na koja bi se upute mogle obratiti -

pa bi, nakon obrade zadnjeg datuma, povećanjem adrese naredbe došlo do prelijevanja.

Prijenos će dodati operacijskom kodu jedan, mijenjajući ga u sljedeći u skupu uputa: naredbu skoka.

Svakako, sljedeća programska uputa bila je na adresi nula i program je sretno krenuo svojim putem.

Hipotetička primjena: "Pokaži mi dijelove!"

Evo potencijalne upute koja može biti uputa za skok navedena u priči:

Vidimo da su naredbeni bitovi 10111 . Ako je isključenje kontrole grana isključeno, "sljedeća je uputa navedena u polju Sljedeća adresa." Dakle, jedna od hipotetičkih situacija bila bi da nakon preljeva registar (pomoću cijevi za označavanje razdvajanja između bitnih polja) glasi:

10111 | 0000000 | 0000000 | 0

Ekstrapolirajući natrag, prije povećanja i preljeva, registar bi glasio:

10110 | 1111111 | 1111111 | 1

Jedna zanimljiva nuspojava rada s ovom implementacijom jest da upotrijebljene upute zapravo nisu važne. Svaka uputa u RPC-4000 uključuje adresu sljedeće upute. Preljev u indeksnom bitu u sljedeće polje adrese rezultirat će skokom na tu adresu bez obzira na naredbene bitove.

Epilog

Mel Kaye (na slici stoji, kraj desnice) nastavila je raditi i na kraju se povukla. Obožavatelj po imenu Anthony Cuozzo objavio je 2014. da je pokušao stupiti u kontakt s Mel:

Na kraju sam uspio stupiti u kontakt s Melom, ali sam ga, nažalost, prestrašio. To je priča za neki drugi dan ...: - / (izvor)

Iz poštovanja Meline privatnosti, neću objavljivati ​​nikakve osobne podatke i držati se programa i priče. Ako netko zna kako se Mel osjeća prema svojoj internetskoj slavi, volio bih čuti vaše mišljenje.

Nisam održavao kontakt s Melom, pa ne znam je li ikad popustio pred poplavom promjena koja je isprala tehnike programiranja od tih davno prohujalih dana. Volim misliti da nije. - Ed Nather

Daljnji izvori:

  • Stranica Wikipedije o Priči o Melu
  • Melin priručnik za igru ​​RPC-4000 blackjack
  • Istina nikada ne smeta dobroj priči Jana Howarda Brunvanda

Dave radi na poslovima odnosa s programerima u IBM-u. Iz nekog razloga, IBM nema SDK za RPC-4000.