15

Jak napisano pierwszy program, czyli „Kura czy jajko” świata IT

Współczesne komputery osobiste to zaawansowane maszyny pozwalające na wykonywanie złożonych operacji i uruchamianie rozbudowanych programów (system operacyjny również jest programem). Jak jednak powstał pierwszy program, jeśli jeszcze nie było programów?

Co było pierwsze, kura czy jajko? Wspomniane pytanie od lat nurtowało wielu uczonych i spędziło sen z powiek nie jednej osoby. Podobne zagwozdki pojawiają się również w kontekście IT. Współczesne oprogramowanie, które wszyscy świetnie znamy z komputerów PC, tabletów, smartfonów, inteligentnych zegarków, a nawet z lodówek powstaje w przeznaczonych do tego programach, np. Microsoft Visual Studio, Android Studio, Xcode, itp. Jednak jak napisano program komputerowy, kiedy jeszcze nie było programów komputerowych?

Szukając odpowiedzi na to podchwytliwe pytanie musimy cofnąć się wiele lat wstecz, aż do XIX wieku. Dokładnie 2 listopada 1815 r. urodził się słynny angielski matematyk i filozof, George Boole, którego osiągnięcia przyczyniły się do rozwoju systemów matematycznych. Otaczający nas świat jest złożony i skomplikowany, a wiele wręcz wykracza poza naszą wyobraźnię, np. nieskończoność wszechświata. Boole pokazał, że nie musi być to prawdą, a każdą, nawet bardzo złożoną informację, można zapisać za pomocą dwóch wartości (0 lub 1), co dało początek Algebrze Boole’a oraz stanowiło podłoże dla dzisiejszej informatyki.

W tym samym roku urodziła się Ada Lovelace, uznawana za matkę pierwszego programu. Żyła w czasach, gdy istniał projekt, tzw. maszyny analitycznej zdolnej do wykonania dowolnej sekwencji działań i obliczeń matematycznych w zależności od tego, jak zostanie zaprogramowana.

Źródło: Wikipedia

Choć maszyna nie została w pełni zbudowana, to – w oparciu o teorię – Ada napisała algorytm przeznaczony do wykonania na wspomnianej maszynie, co sprawia, iż uznaje się go za pierwszy program, a Adę za pierwszą programistkę w historii. Jednakże daleko temu do oprogramowania, z jakim mamy styczność obecnie. System zero-jedynkowy, języki niskiego i wysokiego poziomu, kompilatory i szeroki wachlarz innych rozwiązań pojawiły się znacznie, znacznie później.

Źródło: Wikipedia

Ich osiągnięcia zostały wykorzystane w rozwoju techniki, co stopniowo doprowadziło do powstania komputerów, jakie znamy obecnie. Wraz z rozwojem społeczeństwa oraz szeroko pojętej technologii zwiększała się również ilość danych, które należało przetworzyć. Był to proces czasochłonny, więc stale poszukiwano sposobów na jego usprawnienie. Problemy zaczęły nasilać się wraz z wybuchem I oraz II Wojny Światowej, a co za tym idzie z rozwojem broni palnej, artylerii oraz szeroko pojętych pojazdów mechanicznych (samochody, czołgi, samoloty) i statków, ponieważ dokładne obliczenie trajektorii lotu pocisków nie było prostym zadaniem, a wyliczenia różniły się w zależności od modelu broni.

Sztuka wojenna to również jedna z dziedzin, gdzie każda informacja jest na wagę złota i może przesądzić o losach bitwy, a nawet wojny. W związku tym na przestrzeni wieków narodziło się wiele sposobów na szyfrowanie danych tak, by nie można ich było odczytać, gdy wpadną w niepowołane ręce, czyli w szeregi wroga. W okresie II Wojny Światowej niemieccy żołnierze przekazywali informacje za pomocą dalekopisów, z których każda była zaszyfrowana za pomocą maszyny szyfrującej. A konkretnie za pomocą Maszyny Lorenza, której budowa nieco przypominała sławną Enigmę, lecz różniła się zasadą działania.

Mówi się, że potrzeba jest matką wynalazków. W tym przypadku potrzebą było odczytanie niemieckich komunikatów wojskowych, co przyczyniło się do powstania pierwszego programowalnego komputera zasilanego prądem elektrycznym. 14 kwietnia 1943 roku w brytyjskim ośrodku kryptograficznym Bletchley Park (80km na północ od Londynu) powstała maszyna o nazwie Colossus, której przeznaczeniem było łamanie szyfrów Maszyny Lorenza, co stanowiło istotną zaletę dla wojsk Aliantów.

Za drugi komputer we współczesnym rozumowaniu, uważa się Atanasoff-Berry Computer (ABC), który do działania wykorzystywał 300 lamp elektronowych. Trzecie miejsce na podium zajmuje ENIAC (ang. Electronic Numerical Integrator And Computer – Elektroniczny, Numeryczny Integrator i Komputer) opracowany w 1945 roku przez naukowców z University of Pennsylvania’s Moore School of Electical Engineering. Było to ogromne urządzenie. ENIAC składał się z 42 szaf zajmujących powierzchnię 167 m2, z których każda mierzyła ponad 2,4 metra wysokości. Całość ważyła około 27 ton i pożerała 150 kW mocy, co doprowadziło do powstania pogłosek, jakoby każdy rozruch maszyny prowadził do przygaśnięcia świateł w Filadelfii. Ta monstrualna maszyna oferowała taktowanie na poziomie 0,1 MHz, a do jej obsługi wymagany był sztab wykwalifikowanych osób.

Na obecne komputery składa się wiele komponentów, w tym CPU, czyli procesor. Współczesne układy wykorzystują miliardy tranzystorów (Intel Core i7-6700K ma ich 1,75 mld), które mogą przyjmować jeden z dwóch stanów reprezentujących wartości 0 oraz 1.

Jednak, o ile współczesne komputery wykonują kolejne instrukcje i obliczenia bez ingerencji użytkownika, o tyle pierwsze komputery wymagały w pełni manualnego wprowadzania kolejnych poleceń i informacji. W przypadku komputera EINAC służyło do tego około 1,500 przekaźników oraz 6,000 ręcznych przełączników pełniących rolę tranzystorów. Każdy przekaźnik może przyjąć jeden z dwóch stanów:

  1. przez przekaźnik nie przepływa prąd
  2. przez przekaźnik przepływa prąc

Można przyrównać to do kranu z wodą. Zależnie od ustawienia kurka woda może się lać lub nie. Analogiczna sytuacja zachodzi w przełącznikach światła w domu. Włączając światła po prostu doprowadzamy do stykania się obwodu, co pozwala na przepływ prądu. Wyłączając światło, przepływ jest zatrzymywany. Każdy z tych stanów ma przypisaną wartość 0 lub 1. Początkowo wartości te wprowadzano poprzez przepinanie kabelków oraz przełączanie przełączników, co było procesem bardzo pracochłonnym.

 (1:14-2:35)

Skrócenie czasu potrzebnego na wprowadzenie instrukcji było możliwe dzięki zapisaniu instrukcji na fizycznym nośniku, do czego posłużyły taśmy perforowane (ang. Punch Cards). Były to prostokątne taśmy z kolumnami cyfr. Każda pozycja odpowiadała pojedynczemu bitowi informacji i przenosiła wartości 0 lub 1 (w zależności od tego, czy w danej pozycji była dziurka, czy też nie). Można powiedzieć, że to bardzo daleki przodek znanych obecnie dysków HDD, SSD oraz pamięci Flash.

Zdjęcie: Pete Birkinshaw

Rozwój komputerów prowadził do coraz to większych możliwości, a wprowadzanie kolejnych instrukcji bit za bitem stawało się coraz bardziej nieefektywne.

W związku z tym opracowano język symboliczny (ang. Symbolic Optimal Assembly Program), który pojawił się w 1949 roku i pozwolił na stopniowe przejście ze złożonego kodu maszynowego (zer i jedynek) na prostszy i zrozumiały dla człowieka zestaw poleceń, np. ADD (polecenie: dodaj) czy SUB (polecenie: odejmij). Za ich przełożenie na zestaw instrukcji zrozumiałych dla maszyny odpowiedzialny był asembler. Pozwoliło to na automatyczny rozruch komputera (ang. bootstrapping, choć obecnie funkcjonuje w skróconej formie ‚boot’), który mógł następnie wykonać zestaw poleceń zapisanych w asemblerze. Te zazwyczaj przechowywano na taśmach perforowanych lub magnetycznych. Przez wzgląd na niskopoziomowy charakter asemblera konieczne było pisanie programów przeznaczonych dla konkretnego zestawu podzespołów komputerowych, więc program działający na jednej maszynie, nie musiał działać na innej. Oczywiście proces pisania programów dla konkretnej maszyny by w pełni manualny.

 (3:35-do końca)

W podobnym czasie, bo w 1948 roku powstał pierwszy komputer z programem zapisanym w pamięci elektronicznej. Z czasem asembler oraz pamięć elektroniczna zdolna do przechowywania kodu (zamiast zapisywania go na taśmach perforowanych) stały się wystarczająco wyrafinowane, by znaleźć program znajdujący się pod konkretnym adresem i go uruchomić, co przyspieszyło rozwój kompilatorów (programów służących do tłumaczenia kodu napisanego w języku programowania na kod maszynowy) oraz języków wysokiego poziomu. Wraz z upływem lat i postępującym rozwojem informatyki pojawiły się pierwsze systemy oparte na tekstowym interfejsie użytkownika – w tym DOS, czyli pradziadek jednego z najpopularniejszych systemów na świecie, jakim bez wątpienia jest Windows (system operacyjny również jest zbiorem programów wymagających uruchomienia, za co – przynajmniej w przypadku Windowsa – odpowiada BIOS, który wczytuje MBR (Master Boot Record) zawierający lokalizację partycji systemowej)  – pozwalające na wprowadzanie określonych komend.