Dr inż. Robert Wójcik Wprowadzenie do inżynierii przetwarzania informacji 1. Maszyny i systemy cyfrowe 1.1. Historia komputerów i główne kierunki ich rozwoju 1.2. Reprezentacja informacji w elektronicznych maszynach cyfrowych 1.3. Budowa i zasada działania komputerów 1.4. Metodologia przetwarzania informacji Literatura [1] Skorupski A., Podstawy techniki cyfrowej, WKŁ, Warszawa, 2001. [2] Kaliś A., Podstawy teorii układów logicznych, Wydawnictwo Politechniki Wrocławskiej, Wrocław, 1989. [3] Pieńkos J., Turczyński J., Układy scalone TTL w systemach cyfrowych, WKŁ, Warszawa, 1986. [4] Kącki E., Elektroniczna technika obliczeniowa, PWN, Warszawa, 1986.
1. Maszyny i systemy cyfrowe Współcześnie przetwarzanie informacji jest realizowane w oparciu o elektroniczne maszyny cyfrowe komputery. W systemach cyfrowych informacja jest przechowywana w postaci dwuwartościowych sygnałów dyskretnych, nazywanych sygnałami zerojedynkowymi lub binarnymi. Sekwencje wartości binarnych umożliwiają kodowanie liczb w układzie dwójkowym. Przetwarzanie danych na poziomie układów cyfrowych komputera sprowadza się więc do wykonywania operacji na liczbach binarnych. Najmniejszą jednostką informacji w elektronicznych układach cyfrowych jest bit. Za pomocą pojedynczego bitu można zakodować jeden z dwóch alternatywnych stanów prawdę lub fałsz, 1 albo 0. 1.1. Historia komputerów i główne kierunki ich rozwoju Zdalne przekazywanie dwuwartościowych wiadomości było znane od dawna, np. jako zakrywanie i odkrywanie ogniska lub przesyłanie błysków światła. Za jedną z pierwszych form maszyn liczących można uważać liczydła (np. abakus deska pokryta piaskiem z wyznaczonymi liniami, na których znajdowały się kamienie służące do liczenia). Pierwsze mechaniczne urządzenia do liczenia pojawiły się w XVII wieku. Od tej pory, aż do dzisiaj, wraz z rozwojem nowych technologii następuje ciągły rozwój maszyn liczących. W roku 1623 Wilhelm Schickald skonstruował maszynę umożliwiającą sumowanie liczb kilkucyfrowych; wszystkie mechanizmy urządzenia były zrobione z drewna. W roku 1642 Blaise Pascal zbudował maszynę realizującą operacje dodawania i odejmowania liczb. W roku 1694 G. W. Leibniz opracował maszynę liczącą, która wykonywała cztery działania arytmetyczne; od tej pory datuje się powstanie pierwszego arytmometru; maszyny tego typu były pierwszymi maszynami cyfrowymi produkowanymi seryjnie; w latach 1821-1878 wyprodukowano ich ponad tysiąc. W kolejnych latach wprowadzono szereg ulepszeń arytmometrów. Około roku 1920 wyeliminowano ręczny napęd arytmometru przez zastosowanie silników elektrycznych.
Znaczny rozwój zastosowań cyfrowych maszyn liczących datuje się od 1889 roku, kiedy to H. Hollerith zbudował pierwsze maszyny analityczne, pozwalające na mechanizację prac statystycznych i obrachunkowych. Maszyny te pracowały na zasadzie wykorzystania kart dziurkowanych jako nośników informacji. Wynalazek ten umożliwił zmechanizowanie odczytywania informacji, wykonywania obliczeń w formie wielokrotnych działań i wyprowadzania wyników. Dalszy rozwój maszyn cyfrowych można sklasyfikować z punktu widzenia rozwoju ich konstrukcji. Były to maszyny programowalne w specjalnych językach. Generacje maszyn cyfrowych Generacja zerowa: maszyny cyfrowe zbudowane na przekaźnikach (połączenie szeregowe AND; połączenie równoległe OR); lata 1937-1944 pod kierunkiem H. Aikena powstała pierwsza maszyna cyfrowa, w pełni zautomatyzowana, o nazwie Mark I. Generacja pierwsza: maszyny zbudowane na lampach elektronicznych; w 1942 roku powstała pierwsza na świecie maszyna cyfrowa oparta na technice elektronicznej; maszyna o nazwie ENIAC była wyposażona w 18000 lamp elektronowych; została zaprojektowana przez J.W. Mauchly ego i J. P. Eckerta. Generacja druga: maszyny zbudowane na tranzystorach; pojawienie się pierwszych maszyn tego typu w 1958 roku zapoczątkowało dynamiczny rozwój elektronicznych maszyn cyfrowych, urządzeń peryferyjnych ułatwiających komunikację użytkownika z maszyną oraz algorytmicznych języków programowania. Generacja trzecia: maszyny cyfrowe zbudowane na układach scalonych średniej skali integracji układy MSI (ang. Medium Scale Integration) oraz wielkiej skali integracji układy LSI (ang. Large Scale Integration), będących elementami mikroelektronicznymi; pierwsze maszyny tego typu powstały w 1964 roku. Generacja czwarta: maszyny cyfrowe budowane w oparciu o układy bardzo wysokiej skali integracji VLSI (ang. Very Large Scale Integration); pierwsze maszyny tego typu zaczęły powstawać pod koniec lat 80-tych; współczesne komputery PC są budowane w tej technologii.
Obecnie trwają przygotowania do budowy maszyn piątej generacji, których działanie ma być oparte na zjawiskach elektroniki molekularnej i efektach kwantowo-mechanicznych oraz budowy maszyn biologicznych, wykorzystujących cząsteczki kodu DNA do wykonywania obliczeń. Technologie te umożliwiają w naturalny sposób wprowadzenie obliczeń równoległych oraz zwiększenie pojemności pamięci operacyjnej komputerów. Wpłynie to na zwiększenie efektywności obliczeń. 1.2. Reprezentacja informacji w elektronicznych maszynach cyfrowych W elektronicznych maszynach cyfrowych informacje są przekazywane za pomocą dwóch stanów elektrycznych: brak napięcia (stan niski) i jest napięcie (stan wysoki). Taki dwuwartościowy sposób przedstawiania informacji znany jest jako logika binarna. W praktyce stan niski i stan wysoki są reprezentowane przez pewne zakresy napięć różniące się poziomami (np. w układach TTL stan niski reprezentują wartości napięcia z zakresu 0..0.7 V, natomiast stan wysoki napięcia z zakresu 2.4..5 V). W konwencji logiki dodatniej stanowi wysokiemu odpowiada logiczna jedynka a stanowi niskiemu logiczne 0. Pojedyncza linia przesyłania danych reprezentuje 1 bit informacji, który pozwala zakodować tylko dwa alternatywne stany: stan logiczny 0 i stan logiczny 1. Za pomocą odpowiedniej liczby bitów można zakodować w dwójkowym układzie pozycyjnym dowolną liczbę rzeczywistą. Na przykład liczba rzeczywista R może być zapisana w postaci: R = ±a n-1 a n-2... a 1 a 0. a -1 a -2 a -3..., gdzie a k {0,1} są cyframi w układzie binarnym, n numer pozycji o największej wadze. Wartość R jest obliczana ze wzoru: R = ±(a n-1 2 n-1 + a n-2 2 n-2 +... + a 1 2 1 + a 0 2 0 + a -1 2-1 + a -2 2-2 + a -3 2-3 +...). Na przykład liczba 10.5 w układzie dziesiętnym jest reprezentowana w układzie binarnym w postaci: 10.5 (10) = 1 2 3 + 0 2 2 + 1 2 1 + 0 2 0 + 1 2-1 = 8 + 2 + 0.5 = 1010.1 (2).
W praktyce wszelkie informacje są przedstawiane w maszynach cyfrowych jako ciągi zer i jedynek. Ciąg taki można traktować jako liczbę zapisaną w pozycyjnym systemie dwójkowym. Naturalne jest więc, wykorzystywanie w komputerach reguł arytmetyki binarnej. Również stan dyskretnego systemu sterowania w maszynie cyfrowej daje się w każdej chwili opisać za pomocą skończonych ciągów zer i jedynek. Fakt ten pozwolił konstruktorom na wykorzystanie teorii funkcji boolowskich do opisu systemu sterowania i każdej operacji przetwarzania informacji, zarówno logicznych, jak i arytmetycznych. Realizacja pozycyjnego systemu dwójkowego do przedstawiania liczb oraz dowolnej informacji w maszynie cyfrowej, zapewnia z technicznego punktu widzenia: dużą niezawodność, możliwość przetwarzania danych w układach prostej konstrukcji przy małym prawdopodobieństwie występowania błędów; możliwość miniaturyzacji maszyn cyfrowych dzięki zastosowaniu układów cyfrowych bardzo wysokiej skali integracji VLSI.
1.3. Budowa i zasada działania komputerów Z punktu widzenia organizacji pracy każda uniwersalna elektroniczna maszyna cyfrowa może być rozpatrywana jako urządzenie (system komputerowy) składające się z następujących zasadniczych elementów: jednostki arytmetyczno-logicznej ALU (arytmometr); pamięci operacyjnej wewnętrznej (RAM); pamięci zewnętrznej (np. dyskowej, taśmowej); urządzenia sterującego (US) i pamięci stałej (ROM); układów wejścia / wyjścia. US ALU Pamięć zewnętrzna Pamięć operacyjna (RAM) ROM Wejście Wyjście Przetwarzanie informacji przez maszynę cyfrową sprowadza się do wykonywania podstawowych działań arytmetycznych oraz logicznych na wyrażeniach reprezentujących informację zakodowaną w postaci binarnej. Kolejność wykonywania tych prostych działań jest narzucona maszynie przez tzw. program, który stanowi odpowiednio zakodowany algorytm przetwarzania informacji.
Zasada działania systemu komputerowego Program przetwarzania informacji zostaje wprowadzony do pamięci operacyjnej komputera za pomocą odpowiedniego urządzenia wejścia, np. klawiatury lub wprowadzony do pamięci operacyjnej bezpośrednio z pamięci zewnętrznej (dyskowej), w której wcześniej został zapisany. Program zawarty w pamięci operacyjnej ma zasadniczy wpływ na układ sterowania, który musi tak sterować działaniem maszyny cyfrowej, by zadany algorytm przetwarzania informacji został prawidłowo zrealizowany. Do podejmowania decyzji sterujących są wykorzystywane dane zawarte w pamięci stałej komputera. Jednostka arytmetyczno-logiczna jest urządzeniem wykonującym cztery podstawowe działania arytmetyczne (+,-,*,/) oraz elementarne działania logiczne (suma i iloczyn). Wyniki operacji, realizowanych przez arytmometr zgodnie z programem zapisanym w pamięci operacyjnej, są ponownie zapisywane w pamięci operacyjnej. Wyniki końcowe przetwarzania są wyprowadzane na urządzenie wyjścia w postaci monitora ekranowego lub zapisywane w pamięci dyskowej.
1.4. Metodologia przetwarzania informacji Problem zadanie do rozwiązania. Specyfikacja zadania określenie danych wejściowych oraz wyników, które powinny być uzyskane, a także warunków jakie powinny one spełniać; może zawierać również związki pomiędzy danymi a wynikami; definiuje abstrakcyjny model rzeczywistego problemu. Algorytm jest skończonym ciągiem czynności, które prowadzą do rozwiązania zadania lub osiągnięcia określonego celu. Komputer urządzenie elektroniczne służące do automatycznego przetwarzania danych według zadanego algorytmu. Algorytm sposób przetwarzania danych wejściowych na dane wyjściowe (wyniki) w skończonej liczbie kroków. Algorytm definiuje: abstrakcyjne obiekty, na których wykonywane są działania, reprezentowane przez odpowiednie struktury danych; operacje realizujące cel algorytmu; kolejność wykonywania działań. Program komputerowy algorytm zapisany w odpowiednim języku programowania zrozumiałym przez komputer (np. w języku maszynowym procesora ciąg liczb stanowiących rozkazy i dane dla procesora). Język maszynowy jest trudno przyswajalny przez człowieka, gdyż składa się z liczb reprezentujących instrukcje procesora (programy maszynowe są przechowywane w pamięci komputera w kodzie binarnym). W praktyce algorytmy są zapisywane za pomocą instrukcji języków programowania wyższego poziomu, które udostępniają podstawowe elementy programowania strukturalnego (np. Pascal, C, Java, Fortran, Cobol, Modula). Kod źródłowy kod programu zapisany w języku algorytmicznym, który jest czytelny dla programisty (np. Pascal, C).
Przed wykonaniem program źródłowy należy przetłumaczyć na postać zrozumiałą dla komputera czyli na kod wynikowy. Kod wynikowy - kod pośredni w języku maszynowym, który jest zrozumiały dla komputera; ciąg rozkazów i danych procesora, zapisanych w pamięci komputera w kodzie binarnym. Kod wynikowy jest przekształcany przez program linkera do postaci wykonywalnej. Linker program łączący kody wynikowe odpowiednich modułów programu w kod wykonywalny, który może być wielokrotnie uruchamiany w komputerze. W praktyce linker łączy w jeden plik wykonywalny następujące elementy: pliki wynikowe (obiektowe), otrzymane w wyniku kompilacji modułów programu; standardowy kod startowy programu dla danego systemu operacyjnego; kody wynikowe funkcji, wykorzystywanych w programie, zapisane w odpowiednich bibliotekach. Kod wykonywalny - zawiera liczby, które są pobierane z pamięci komputera przez procesor i interpretowane jako rozkazy podlegające wykonaniu lub jako dane stanowiące argumenty rozkazów. Translator realizuje przekształcenie programu z postaci źródłowej na postać wynikową. Rodzaje translatorów: kompilatory, interpretatory. Kompilator program przetwarzający kod źródłowy na kod wynikowy (kod pośredni w języku maszynowym, który jest zrozumiały dla komputera). Interpretator realizuje translację instrukcji naprzemiennie z ich wykonywaniem; przy zastosowaniu interpretatora każde wykonanie programu jest związane z jego ponowną translacją (np. Basic, SQL).
Plik wydzielony fragment pamięci (najczęściej dyskowej) posiadający nazwę. Z punktu widzenia języków programowania plik jest ciągiem danych o odpowiedniej strukturze (w najprostszym przypadku ciągiem bajtów). Każdy plik posiada rozmiar określony w bajtach. 1 Bajt [B] = 1 znak, 1 KB = 1024 B, 1MB = 1024 KB, 1 GB = 1024 MB. Etapy rozwiązywania problemów z wykorzystaniem komputera Rozwiązywanie problemów z wykorzystaniem komputerów składa się z następujących etapów: specyfikacja problemu, określenie danych wejściowych, określenie celu (wyniku końcowego), analiza problemu i wybór modelu, synteza algorytmu prowadzącego do rozwiązania, przedstawienie algorytmu: - w postaci opisu słownego, - w postaci listy kroków, - w postaci schematu blokowego (postać graficzna algorytmu), - za pomocą jednego z języków formalnych (np. UML). analiza poprawności rozwiązania, ocena efektywności algorytmu (złożoności obliczeniowej), kodowanie algorytmu w postaci instrukcji języka programowania (projekt programu komputerowego), zapis programu do pliku, kompilacja i usuwanie usterek, utworzenie wersji wykonywalnej, automatyczne wykonanie programu w komputerze, analiza wyników. Problem Algorytm Program Komputer Model Kodowanie Plik
Etapy programowania 1. Utworzenie za pomocą edytora tekstu pliku źródłowego zawierającego algorytm zapisany w wybranym języku programowania, np. program.pas (program w języku Pascal), program.cpp (program w języku C++). 2. Kompilacja programu za pomocą kompilatora i utworzenie pliku wynikowego (obiektowego), np. program.obj. 3. Połączenie za pomocą linkera kodu wynikowego programu, kodów wynikowych funkcji bibliotecznych oraz kodu startowego w jeden plik wykonywalny, np. program.exe. DANE Programy (algorytmy) WYNIKI Kod źródłowy programu Kompilacja Kod wynikowy programu Łączenie Kod wykonywalny programu Kod startowy Kod wynikowy z bibliotek System operacyjny komputera zbiór programów sterujących pracą urządzeń wchodzących w skład systemu komputerowego i nadzorujących wykonywanie programów użytkowników. Oprogramowanie użytkowe programy uruchamiane pod kontrolą systemu operacyjnego.
Podczas projektowania algorytmów należy pamiętać, aby opracowywane algorytmy posiadały niską złożoność obliczeniową. Czasowa złożoność obliczeniowa określa liczbę elementarnych kroków obliczeniowych (tzw. operacji elementarnych, np. porównań, sumowań, itp.). Pamięciowa złożoność obliczeniowa określa rozmiar pamięci niezbędnej do wykonania programu. W praktyce złożoność obliczeniową określa się za pomocą funkcji ograniczających z góry ponoszony nakład obliczeniowy, np. O(n), O(nlogn). Algorytmy efektywne posiadają wielomianową lub logarytmiczną złożoność obliczeniową. Przetwarzanie sekwencyjne wykonywanie instrukcji programów kolejno jedna za drugą. Przetwarzanie współbieżne wykonywanie instrukcji programów równocześnie na tym samym procesorze (z podziałem czasu procesora). Przetwarzanie równoległe wykonywanie instrukcji programów równocześnie na różnych procesorach.