FATALNE DLA KOMPUTERA

Ta ogromna sztywność oznacza, że programiści, którzy z natury nie myślą tak konse­kwentnie, często robią drobne błędy, pomijając znaki interpunkcyjne lub nawiasy, lub popełniają błędy w pisowni. Kiedy kompilator napotka polecenie, które się nie zgadza ze składnią, może próbować odgadnąć; co programista chciał napisać — czy opuścił przecinek, czy średnik. Ale zgadywanie takie jest ograniczone, ponieważ kompilator nigdy nie zechce wybierać mię­dzy operacyjnie różnymi znaczeniami. Ostatecznie kompilator musi po prostu pominąć kłopotliwe pole­cenie, a tym samym opuścić rozkazy maszynowe, ja­kie mogłoby ono utworzyć. Zwykle taki program w ogóle nie może być wykonany. Krótko mówiąc, wielo­znaczność, tak ważna > dla ludzkiego komunikowania się, jest dla komputera fatalna.

JĘZYK KOMPUTEROWY

Na­tomiast każde stwierdzenie napisane w języku kom­puterowym skupia pełną uwagę maszyny przez krótki moment jego właściwego wykonywania, a następnie przestaje mieć jakiekolwiek znaczenie, o ile (w przy­padku programu z pętlami) nie będzie z powrotem wywołane do wykonania.Co więcej, ponieważ język komputerowy ma zna­czenie tylko w działaniu, nie może tolerować jakiejkol­wiek wieloznaczności. Jeśli rozkaz w FORTRANie miałby dwie możliwe interpretacje, kompilator utwo­rzyłby dwa zbiory rozkazów maszynowych. Jednakże procesor centralny może wykonywać tylko jedną in­strukcję na raz i nie potrafi swobodnie wybierać mię­dzy dwoma zbiorami rozkazów. Język komputerowy jest zatem na każdym poziomie jednoznaczny: każde polecenie jest albo całkowicie jasne, albo po prostu złe; gwarancją jasności jest sztywna składnia jego moż­liwych wyrażeń.

PROCES TŁUMACZENIA

Kompilatory i asemblery są programami tłumaczą­cymi: jako wejście akceptują polecenia kodowane na jednym szczeblu hierarchii elektronicznej, następnie tworzą z nich wynikowe instrukcje na niższym szcze­blu. Proces tłumaczenia może być wielce skompliko­wany, lecz nie jest tajemniczy. Dokonuje się wedle algorytmu, nie potrzeba tu żadnej intuicji. Dla kompi­latora „rozumienie” polecenia w FORTRANie ozna­cza po prostu przetwarzanie krok po kroku tego pole­cenia w postać wykonalną. Od tej chwili polecenie nie wywiera żadnego dalszego wpływu na resztę progra­mu. W języku angielskim znaczenie zdania może się zmienić radykalnie w kontekście następnych zdań, gdyż zdanie to pozostaje aktywne i rezonuje w pamię­ci długo po jego przeczytaniu łub wypowiedzeniu.

MOŻLIWE POZIOMY

Właściwie możliwe są nawet wyższe poziomy. Na przy­kład, program napisany w PASCALu może przyjmo­wać niektóre naturalne wyrażenia angielskie, takie jak: „Pomnóż odległość przez prędkość”, i przetwarzać je w rozkazy maszynowe. W tym przypadku program w PASCALu sam jest kompilatorem języka angielskiego, który ma przetwarzać. Kompilator pośredniczy między poziomem wysokim a niższym. Terminy „wysoki” i „niski” wydają się nieco tendencyjne: język wysokiego poziomu jest bliższy użytkownikowi znającemu angielski, chociaż każdy język naturalny góruje złożo­nością i bogactwem nad wszystkim, có potrafi przetwa­rzać komputer. Z drugiej strony, język komputerowy nabiera znaczenia tylko w toku wykonywania rozka­zu. Wykonanie rozkazu FORTRANu pozwala uświado­mić sobie jego znaczenie w działaniu. Tak jak w każ­dej hierarchii, układy na górze wydają rozkazy, szcze­bel pośredni je przekazuje, a „doły” wykonują. Tylko najniższe rozkazy maszynowe wykonują obliczenia.

ZASADNICZA CECHA

Nikt nie może twierdzić, że zna francuski, jeśli potrafi tylko odróżniać w zdaniach francuskich podmiot od orzeczenia, lecz kompilator rozumie FORTRAN właśnie w tym sensie — potrafi zanalizować składnię zdań w FORTRANie. Z tego względu wyrażenia napisane w FORTRANie, albo w jakimkolwiek innym języku wysokiego poziomu, mu­szą być strukturalnie jednoznaczne. Kompilator nie może wybierać między alternatywnymi analizami; na mocy definicji brak mu ludzkiej umiejętności inter­pretacji. Tutaj zatem kryje się zasadnicza cecha języka kom­puterowego: w jego warstwowej albo hierarchicznej strukturze. Kody komputerowe klasyfikuje się w za­leżności od ich dystansu w stosunku do binarnego ję­zyka rozkazów maszynowych i bliskości w stosunku do tradycyjnych języków matematyki i logiki. Na naj­wyższym szczeblu znajdują się takie języki kompila- cyjne jak FORTRAN, poniżej nich są języki asemble­ra, a jeszcze niżej — rozkazy maszynowe .

KAŻDE POLECENIE

Od tego czasu powstały ich dziesiątki. W FOR­TRANie .programista pisze rozkazy, które wyglądają jak algebra: przykładowo, C = A + B. W innych ję­zykach rozkaz może wyglądać jak zdanie logiki sym­bolicznej albo nawet jak proste zdanie angielskie. Każde polecenie FORTRANu wzywa procesor central­ny do wykonania pewnej liczby elementarnych opera­cji, tak więc każde musi być przetworzone w stosow­ną liczbę rozkazów w języku maszynowym. To właśnie zadanie ma kompilator przyjmujący stwierdzenia FORTRANu za swe dane wyjściowe, rozkładający je na części składowe i tworzący polecenia maszynowe jako wynik. Tak jak tłumacz, kompilator słucha jed­nego języka, a mówi w innym. W odróżnieniu jednak od tłumacza, który w swym przekładzie wykorzystuje wiedzę o znaczeniach słów, a także o prawdopodob­nych intencjach mówcy lub pisarza, kompilator nie wie nic o szerszym celu programu FORTRANu ani o    intencjach programisty.

WYSOKI POZIOM

Zazwyczaj programista nadal pisze w języku asemblera jedno po­lecenie dla każdego rozkazu, który ma być wykonany przez maszynę. Jest nadal mocno związany logiczną strukturą maszyny, której używa, chociaż pisze wów­czas program o jeden stopień powyżej języka maszy­nowego. Następnym krokiem było rozwinięcie kodów, które odsuwają programistę jeszcze dalej od maszyny, po­zwalając mu pisać programy w języku bardziej zma­tematyzowanym. Kody te zwane są’ „językami wy­sokiego poziomu” i tłumaczone na rozkazy maszynowe nie przez relatywnie proste języki asemblerowe, ale przez skomplikowane programy zwane kompilatora­mi. Pierwszym takim językiem, który się szeroko roz­powszechnił, był w końcu lat pięćdziesiątych FOR­TRAN.

NOWE KODY

Te nowe kody zostały nazwane językami asemblera, asem­blerami, i nadal są w użyciu.Języki asemblera opierają się na zasadzie, że pro­gramista łatwiej zapamięta nazwy niż liczby. Krótko mówiąc, wszystkim rozkazom maszynowym, dane są nazwy stałe (takie jak ADD, SUB, MUL), a ponadto programiści mogą nadawać własne nazwy (takie jak Al, SZYBKOŚĆ, SUMA) miejscom w pamięci, to zna­czy zmiennym w sensie matematycznym. Komputer nadal wykonuje rozkazy wyłącznie w języku maszyny, ale z pomocą napisanego poprzednio programu sam te­raz dokonuje przekładu z języka asemblera na język maszynowy, by go następnie wykonać. Znaczy to, iż program napisany z użyciem nazw przekształca w dłu­gie ciągi cyfr dwójkowych, zrozumiałe dla procesora. Ten program translacyjny (sam zwany asemblerem) oszczędza programiście kłopotu wyszukiwania w tabeli kodów dwójkowych i ich wypisywania.

HIERARCHIA JĘZYKÓW KOMPUTEROWYCH

To w istocie jedyny kod rozkazów, który kom­puter rozumie, kod wbudowany w jego strukturę sprzętową, hardware. Składający się, jak wszystko w komputerze, z zer i jedynek, język maszynowy jest całkowicie nieporęczny. Jeśli, przykładowo, programi­sta pragnie napisać rozkaz dodający w pamięci za­wartość jednego słowa do drugiego, musi wyszukać w tablicy ośmiocyfrowy symbol tej operacji, jak również adresy tych dwóch słów. Wynikiem jest ciąg trzydzie­stu dwóch cyfr, które można łatwo pomylić podczas przepisywania programu. Program złożony z kilkuna­stu tuzinów takich rozkazów byłby koszmarem do na­pisania, sprawdzenia i korekty. Niemniej, w pierw­szych latach komputerowych obliczeń inżynierowie pracowali bezpośrednio w języku maszynowym. Na­stępnie, korzystając z prostych sposobów mnemotech­nicznych, zaczęli rozwijać kody bardziej czytelne.

ZACHOWANIE TAJEMNICZOŚCI

Komputer zachowuje wiele ze swej tajemniczości właśnie dlatego, że porozumie­wamy się z nim z pomocą kodu, trudnego do odcyfro- wania i jeszcze trudniejszego do zapamiętania. Pro­gramy komputerowe, pisane przez jednego specjalistę, zwykle są nieczytelne dla innego bez częstych i obszer­nych komentarzy w języku naturalnym. Każdy pro­gramista przeżył frustrujące uczucie niemożności od- cyfrowania kodu, który sam napisał kilka tygodni lub miesięcy wcześniej.Aby pokonać przepaść między tymi dwoma typami czytelników, maszyną i programistą, język kompute­rowy zaprojektowano hierarchicznie. Przypomnijmy, że procesor centralny komputera reaguje na zbiór kil­kuset rozkazów, nazwanych właśnie językiem maszy­nowym.