Seria felietonów o historii informatyki, ukazujących się tu pod zbiorczym tytułem „Jak nauczyliśmy maszyny liczyć i myśleć za nas?", do tej pory dotyczyła tego, co widać, czego można dotknąć, do czego można przykleić kartkę z numerem inwentarzowym – czyli sprzętu. Komputerów jako coraz doskonalszych elektronicznych maszyn oraz tzw. urządzeń peryferyjnych, które są do nich w różnych celach dołączane. Wszystkiego, co Amerykanie na początku rozwoju informatyki nazwali „żelastwem" (hardware). Ta nazwa jest w użyciu do dziś, chociaż w nowoczesnym laptopie czy smartfonie żelaza jest niewiele.

Dzisiejszym felietonem rozpocznę opowiadanie o tym, jak powstało, formowało się i rozwijało oprogramowanie, nazywane zbiorczo software (w symetrii do wspomnianego wyżej hardware).

Oprogramowanie to dusza komputera

Oprogramowania nie widać, nie da się go dotknąć, a jednak jest niezbędne, żeby komputer mógł nam oddawać konkretne przysługi. Jest to – mówiąc metaforycznie – „duch tchnięty w elektroniczne ciało komputera". A ponieważ „duch" to po łacinie „spiritus", a wizyta w sklepie upewni nas, że spirytus jest drogi – nie powinno więc dziwić, że także oprogramowanie komputerów jest drogie. Dlatego obecnie najlepiej zarabiające firmy informatyczne to są właśnie producenci oprogramowania (np. Microsoft), a nie wytwórcy elektroniki (komputerów).

Czytaj więcej

Jak nauczyliśmy maszyny liczyć i myśleć za nas?

Owa niematerialna postać oprogramowania sprawiała początkowo sporo trudności przy zakupach do instytucji prowadzących ewidencję posiadanych zasobów. Gdy kupowałem do mojej katedry krzesło, to przyklejano na nim kartkę z numerem inwentarzowym i wpisywano do ewidencji. Jak kupiłem komputer, to także pojawiła się na nim taka kartka. Ale jak kupiłem program, to pojawił się problem: gdzie do tego niematerialnego składnika inwentarza przyczepić ową kartkę?

Przytaczam tę anegdotę (autentyczną!) z okresu, który bym zaliczył do prehistorii współczesnej informatyki, żeby przypomnieć, iż z traktowaniem oprogramowania jako towaru, który trzeba kupić, początkowo były duże trudności. Wynikało to m.in. z faktu, że w początkowej fazie rozwoju informatyki użytkownicy sami sobie pisali potrzebne programy. Ja też tak przez wiele lat pracowałem i wszystkie programy, które wykorzystywałem m.in. do przygotowania doktoratu, pisałem własnoręcznie. Przypomnę teraz w skrócie, jak to programowanie w tamtych czasach wyglądało.

Kartka z odległej przeszłości

Sposób programowania, który tutaj chcę opisać (jako ciekawostkę historyczną), dotyczy sytuacji z przełomu lat 50. i 60. ubiegłego wieku. Jednak sięgając do bardziej odległej przeszłości, warto przypomnieć, że pierwszy program został napisany w roku 1840. Napisała go Ada Augusta Lovelace, córka poety Byrona i admiratorka prac (nieukończonych) Charlesa Babbage'a nad programowalną maszyną matematyczną, którą powszechnie uważa się za pierwszy komputer. Program obliczania kolejnych tak zwanych liczb Bernoulliego Ada napisała w uzupełnieniu do tłumaczonego przez nią zapisu wykładu Babbage'a wygłoszonego na Uniwersytecie w Turynie i zanotowanego przez Luigiego Federica Menabreę. Więcej na ten temat można przeczytać w „Rzeczy o Historii" z dnia 25 czerwca 2021 r.

Jak zatem programowano komputery w początkowych latach rozwoju informatyki? Pierwsze komputery programowano z użyciem języka maszynowego. Program składał się z rozkazów, które elektronika komputera mogła bezpośrednio wykonywać. W odniesieniu do tych najdawniejszych programów używane były także określenia „kod binarny" albo „postać wykonywalna". Taki sposób programowania teoretycznie był w użyciu tylko do początku lat 60. XX wieku, ale ja sam używałem języka maszynowego do programowania komputerów jeszcze na początku lat 70. Nie byłem w tym odosobniony, bo w tym okresie funkcjonowały jeszcze sprawne technicznie komputery poprzedniej generacji (w moim przypadku była to Odra 1013), dla których nie było jednak translatorów języków algorytmicznych. Zaraz wyjaśnię, co to jest język algorytmiczny i do czego potrzebny jest translator, ale najpierw domknę wątek programowania w języku maszynowym.

Otóż mając do wyboru natychmiastowy dostęp do komputera, który akceptował tylko język maszynowy, albo czekanie w długiej kolejce do komputera nowej generacji, którym w latach 70. na AGH była Odra 1304, wybierałem użycie tej starszej maszyny. Dodam, że kolejka brała się stąd, że ówczesna AGH, ogromna uczelnia techniczna, miała jeden (!) komputer nowej generacji, był on więc obciążony przez całą dobę. Ja sam niektóre obliczenia prowadziłem na nim w zdobytym z trudem „okienku czasowym" od godziny 4 do 6 rano w niedzielę!

Autopromocja
ORZEŁ INNOWACJI

Konkurs dla startupów i innowacyjnych firm

WEŹ UDZIAŁ

Wracając do programowania w języku maszynowym, warto wspomnieć, że program w takim języku składał się z rozkazów, które w komputerze zapisywane były jako łańcuchy binarne (złożone wyłącznie z zer i jedynek). Na szczęście programista mógł te rozkazy zapisywać w wygodniejszym systemie oktalnym (ósemkowym), ale i tak była to straszna mordęga. Każdy rozkaz zawierał kod operacji, to znaczy zestaw bitów nakazujący procesorowi wykonanie jakichś operacji (np. dodania albo porównania dwóch liczb), a dodatkowo trzeba było podać w rozkazie informację, gdzie są te liczby (podając adresy komórek w pamięci, gdzie były one umieszczone) oraz gdzie umieścić wynik. Było to skrajnie niewygodne, ale ja sam jestem żywym (jeszcze...) przykładem, że było to możliwe.

Koncepcja translatora

Niewygoda programowania w języku maszynowym (w dodatku na każdym komputerze innym!) spowodowała odruch zdrowego buntu u pionierów informatyki, którzy doszli do następującej konkluzji: „Dlaczego to ja mam się uczyć języka komputera? Niech komputer nauczy się mojego języka!".

I tu jest pora, żeby zaprezentować kolejną damę, której z przyjemnością nadaję miano pioniera programowania. Pierwszą damą była wspomniana wyżej Ada Augusta Lovelace, ale drugą z pewnością była młodsza o ponad sto lat Grace Murray Hopper. Kobieta, która została admirałem floty Stanów Zjednoczonych!

Grace Hopper w latach 40. programowała pierwsze amerykańskie komputery i to ona wprowadziła pojęcie „bug" (po polsku mówimy „pluskwa") jako nazwę uciążliwego błędu w programie. Wiązało się z tym zabawne zdarzenie, ale to jest temat do oddzielnej anegdoty, na którą tu nie mam miejsca. Natomiast właśnie tu, w tym felietonie, muszę wskazać, że to Grace Hopper wymyśliła translator.

Jest to program, który odczytuje program zapisany przez człowieka w języku maksymalnie dla niego wygodnym, a potem potrafi wszystkie polecenia zawarte w tym programie przetłumaczyć do równoważnej postaci w języku maszynowym. Podział pracy jest więc taki: człowiek wymyśla i opisuje algorytm (czyli sposób działania programu), a translator buduje na tej podstawie wykonywalny program wyrażony w języku maszynowym. Komputer wykonuje ten program (bo go rozumie), a człowiek dostaje potrzebne mu wyniki. Co więcej – przetłumaczony program w języku maszynowym może być wykonywany wielokrotnie, a nawet może być sprzedany jako produkt innym użytkownikom komputera. Tak to wymyśliła Grace Hopper w 1951 r. i tak to działa do dziś w informatyce.

Pierwszy translator zbudowany przez Grace nazywał się A-0 i działał na komputerze UNIVAC I. To była rewelacja i rewolucja!

Pierwsze języki algorytmiczne

Koncepcją zainicjowaną przez Grace Hopper zainteresowała się firma IBM. Pisałem o tej firmie wielokrotnie w tej serii felietonów, bo wniosła ona wyjątkowo dużo do rozwoju informatyki, często na podstawie własnych nowatorskich opracowań, ale równie często podejmując cudze pomysły – dopracowując je w szczegółach i wprowadzając do powszechnego użytku. Tak właśnie było z koncepcją translatora. Grace Hopper wymyśliła rzecz najważniejszą: że komputer będzie sam tłumaczył algorytmy na swój język maszynowy, dzięki czemu będzie mógł je wykonywać. Natomiast nie „postawiła kropki nad i" w sprawie tego, jak człowiek ma te algorytmy opisać, żeby to było dla niego wygodne i dla komputera całkiem jednoznaczne. Z translatorem A-0 był skojarzony jakiś język, w którym programista zapisywał swoje wymagania co do działania przyszłego programu, ale mało o tym języku wiadomo, bo się nie przyjął.

Natomiast w firmie IBM pracował John Backus, który podszedł do problemu właśnie od strony potrzeb programującego człowieka. Jak powinien on wyrazić swój pomysł na algorytm rozwiązujący rozważany problem? W efekcie tych rozważań Backus wprowadził pojęcie języka algorytmicznego, czyli języka służącego do zapisu algorytmów. Nie powinien on nadmiernie zbliżać się do języka naturalnego (np. angielskiego), bo nie miał służyć do pisania powieści czy poezji. Jednak w momencie wydawania komputerowi poleceń powinien używać słów potocznych i powszechnie znanych, np. WRITE, IF, GO TO, żeby inny człowiek mógł prześledzić, jakie czynności chciał nakazać autor programu.

Tworząc swój język algorytmiczny, Backus zastanowił się, do czego głównie używane są komputery? Doszedł do wniosku, że do obliczeń. A jak wyrazić to, jakie obliczenia trzeba wykonać? Pisząc wzór matematyczny! Dlatego Backus swój język nazwał FORTRAN. Nazwa pochodziła od słów FORmula TRANslator, czyli tłumacz wzorów. To był genialny wybór, bo wzorami matematycznymi musieli posługiwać się inżynierowe, ekonomiści, wojskowi i naukowcy, czyli w istocie wszyscy, którzy w latach 50. używali komputerów.

Opierając się na tych założeniach, Backus w latach 1954–1957 stworzył język FORTRAN, który początkowo udostępniono na komputerach serii IBM 704, ale bardzo szybko znalazł wielu zwolenników. O dalszym rozwoju metod programowania komputerów napiszę w następnym felietonie – za dwa tygodnie.

Autor jest profesorem AGH w Krakowie