030 OPROGRAMOWANIE Prof. dr hab. Marek Wisła
Oprogramowanie Oprogramowanie (software) to całość informacji w postaci zestawu instrukcji, zaimplementowanych interfejsów i zintegrowanych danych przeznaczonych dla komputera do realizacji wyznaczonych celów. Celem oprogramowania jest przetwarzanie danych w określonym zakresie. Oprogramowanie jest synonimem terminów program komputerowy oraz aplikacja, przy czym stosuje się je zazwyczaj do określania większych programów oraz ich zbiorów.
Oprogramowanie Oprogramowanie tworzą programiści w procesie programowania. Oprogramowanie jako przejaw twórczości jest chronione prawem autorskim, twórcy zezwalają na korzystanie z niego na warunkach określanych w licencji. Oprogramowanie pisane jest zazwyczaj przy użyciu różnych języków programowania z wykorzystaniem algorytmów.
Podział oprogramowania Podstawowy podział oprogramowania wyróżnia: oprogramowanie systemowe - zestaw programów, które pozwalają zrealizować podstawowe zadania za pomocą komputera, pozwalają zarządzać zasobami systemu komputerowego oraz umożliwiają pracę użytkowników (duża część tego oprogramowania dostarczana jest wraz ze sprzętem) oprogramowanie narzędziowe i użytkowe - programy ułatwiające pracę i poruszanie się użytkownika w systemie komputerowym oprogramowanie aplikacyjne - zestawy programów lub pakietów programowych realizujących konkretne zadania merytoryczne i spełniających określone potrzeby użytkowników komputerów
Oprogramowanie systemowe Oprogramowanie systemowe systemy operacyjne, programy i systemy diagnostyki sprzętu, systemy programowania (translatory), pakiety programów obsługi wielodostępu i sieci komputerowych, pomocnicze programy i pakiety usługowe: programy do kompresji zbiorów, programy antywirusowe, programy archiwizujące.
Oprogramowanie narzędziowe Oprogramowanie narzędziowe i użytkowe edytory tekstów, arkusze kalkulacyjne, narzędzia wspomagające programowanie, bazy danych, programy do tworzenia grafiki komputerowej, programy do tworzenia multimediów (dźwięki, wideo), pakiety organizacji prac biurowych.
Oprogramowanie aplikacyjne Oprogramowanie aplikacyjne obszar użytkowania: indywidualne - wykonane na potrzeby pojedynczego użytkownika, standardowe, powszechne - rozpowszechniane w ramach grupy użytkowników o jednorodnych potrzebach, poziom specjalizacji: pakiety ogólnego przeznaczenia, pakiety specjalizowane - do ściśle określonych celów.
Miejsce oprogramowania w systemie komputerowym
System operacyjny System operacyjny (operating system) to zbiór programów: umożliwiających uruchamianie programów użytkownika, przeznaczonych do dynamicznego zarządzania zasobami komputera i umożliwiających wykorzystanie tych zasobów, umożliwiających wszechstronne wykorzystanie samego sprzętu komputerowego. Gdy użytkownik końcowy uruchamia aplikację, na jej potrzeby przydzielane są zasoby systemu komputerowego. Przydziałem tym zarządza system operacyjny, dzięki czemu można uzyskać stosunkowo duży stopień niezależności programów od konkretnego sprzętu oraz odpowiedni poziom bezpieczeństwa i sprawności działania.
System operacyjny - definicje Per Brinch Hansen: System operacyjny jest zbiorem automatycznych i ręcznych procedur, które pozwalają grupie osób na efektywne współdzielenie urządzeń maszyny cyfrowej. Alan Shaw: System operacyjny (nadzorczy, nadrzędny, sterujący) jest to zorganizowany zespół programów pośredniczących między sprzętem a użytkownikami, dostarczając użytkownikom zestawu środków ułatwiających projektowanie, kodowanie, uruchamianie i eksploatację programów oraz w tym samym czasie sterują przydziałem zasobów dla zapewnienia efektywnego działania.
System operacyjny - definicje Abraham Silberschatz: System operacyjny jest programem, który działa jako pośrednik między użytkownikiem komputera, a sprzętem komputerowym. Zadaniem systemu operacyjnego jest tworzenie środowiska, w którym użytkownik może wykonywać programy w sposób wygodny i wydajny. Andrew Tanenbaum: System operacyjny jest warstwą oprogramowania operującą bezpośrednio na sprzęcie, której celem jest zarządzanie zasobami systemu komputerowego i stworzenie użytkownikowi środowiska łatwiejszego do zrozumienia i wykorzystania.
Zasoby (resources) Zasób systemu komputerowego (resource) to każdy środek, niekoniecznie fizyczny, o który mogą ubiegać się użytkownicy i ich programy, zwykle niezbędny do wykonania przez komputer postawionego mu zadania. Zasoby zarządzane przez system operacyjny: procesor przydział czasu procesora, pamięć alokacja przestrzeni adresowej dla procesów, urządzenia zewnętrzne: alokacja przestrzeni dyskowej, udostępnianie i sterowanie pamięciami zewnętrznymi, udostępnianie i sterowanie urządzeniami zewnętrznymi. informacja (system plików) organizacja i udostępnianie informacji, ochrona i autoryzacja dostępu do informacji.
Procesy Proces to obiekt opisujący pracę systemu komputerowego, któremu przydzielony został czas procesora, własny obszar pamięci operacyjnej oraz zbiór innych, potrzebnych zasobów. Proces określany jest przez kod programu wykonywanego w trakcie swego istnienia: kod programu użytkownika (proces użytkownika), kod systemowy (proces systemowy). Proces może posiadać wiele podobiektów wątków. Wątek to część programu (procesu), która może być wykonywana asynchronicznie, podczas gdy główny kod programu zajmuje się innymi zadaniami. Wątek jest podstawową jednostką, której przydzielony jest czas pracy procesora. Wątki są wykonywane we wspólnej przestrzeni adresowej i współdzielą zasoby.
Sterta Sterta (ang. heap) to obszar pamięci, udostępniony przez system operacyjny na wyłączność uruchomionemu programowi (procesowi) służący do przechowywania zmiennych dynamicznych.
Struktura systemu operacyjnego jądro systemu wykonuje główne zadania systemu powłoka pośredniczy w komunikacji użytkownika z systemem operacyjnym i sprzętem system plików określa sposób zapisu danych na nośnikach
Jądro systemu Jądro systemu (kernel) podstawowa część systemu operacyjnego, wykonuje główne zadania systemu, ukrywa szczegóły sprzętowej realizacji systemu komputerowego: jądro monolityczne wszystkie zadania są wykonywane przez jądro, będące jednym, dużym programem działającym w trybie jądra (Linux), mikrojądro z monolitycznego jądra zostaje tylko jego podstawowa część, części odpowiedzialne za bardziej wyrafinowane funkcje są wydzielone do funkcjonalnych bloków albo realizowane jako zwykłe procesy (Windows), jądro hybrydowe kompromis między architekturą jądra monolitycznego i mikrojądra (Windows).
Powłoka (shell) Powłoka (shell) pośredniczy w komunikacji użytkownika z systemem operacyjnym i sprzętem tworzą ją: interpreter poleceń komunikujący użytkownika z systemem, który: pobiera polecenia od użytkownika. interpretuje polecenia. wykonuje polecenia. przekazuje użytkownikowi wyniki wykonania poleceń oraz informuje o problemach lub błędach. programy systemowe do obsługi poleceń. Przykłady: cmd.exe (Windows), sh (UNIX), KDE (Linux)
Translacja Komputer bez dodatkowego oprogramowania potrafi jedynie wykonywać programy napisane w języku maszynowym. Wszystkie inne programy wymagają przetłumaczenia na język maszynowy. Służą do tego specjalne programy zwane translatorami. Proces tłumaczenia programu z jednego języka na inny nazywa się translacją. Danymi dla tego rodzaju programów jest program źródłowy napisany w języku wysokiego poziomu, a wynikiem jest program w języku maszynowym. Translacja uniezależnia programistę od komputera, procesora i jego języka maszynowego. Dwa główne rodzaje translacji to: kompilacja (z linkowaniem) i interpretacja.
Kompilacja Kompilacja ma miejsce, gdy program zwany kompilatorem tłumaczy (automatycznie) program źródłowy na inny język (język maszynowy lub kod pośredni, np. kod bajtowy), poddając go ewentualnej optymalizacji. Efektem pracy kompilatora jest kod wynikowy.
Linkowanie Po kompilacji następuje tzw. linkowanie (konsolidacja), dołączające do kodu wynikowego niezbędne biblioteki i inne elementy już skompilowane, aby otrzymać wynik końcowy w postaci programu wykonywalnego (.EXE). Kompilator operuje na całym tekście programu źródłowego i generuje tekst przekładu jako całość. Do wykonania programu możemy przystąpić dopiero po zakończeniu procesu kompilacji i linkowania.
Interpretacja Interpretacja ma miejsce, gdy interpreter na bieżąco tłumaczy i wykonuje każdą instrukcję (lub ich bloki) osobno nie czekając na zakończenie całości translacji. Z tego powodu nie jest możliwa optymalizacja kodu i nie uzyskuje się pełnego kodu wynikowego. Ponadto język musi mieć specjalną budowę, aby dał się interpretować. Interpreter jest translatorem, który operuje na poszczególnych jednostkach syntaktycznych programu źródłowego i generuje ich przekłady. Wprowadzony podział na kompilatory i interpretery nie jest sztywny, buduje się bowiem translatory mające cechy zarówno kompilatorów, jak i interpreterów.
Narzędzia wspomagające programowanie Współcześni programiści korzystają z wielu specjalistycznych narzędzi wspomagających tworzenie i zarządzanie złożonymi aplikacjami. Najczęściej stosowane narzędzia to: podświetlanie składni, debugowanie, framework, interfejsy programowania aplikacji, CASE, UML, zintegrowane środowiska programistyczne (IDE).
Podświetlanie, debugowanie Podświetlanie (kolorowanie) składni to wyróżnianie elementów składni kodu źródłowego programu (np. słów kluczowych,) w edytorze tekstu za pomocą koloru oraz atrybutów (funkcja dostępna w większości edytorów programów). Podświetlanie składni znakomicie poprawia czytelność tekstu. Debugowanie to proces systematycznego redukowania liczby błędów w oprogramowaniu, który zazwyczaj polega na kontrolowanym wykonaniu programu pod nadzorem debuggera.
Debugger Debugger to program komputerowy służący do dynamicznej analizy innych programów, w celu odnalezienia i identyfikacji zawartych w nich błędów. Debugger umożliwia: wykonywanie programu w trybie pracy krokowej lub z zastawianiem tzw. pułapek (breakpoints), podglądanie i ewentualną zmianę zawartości rejestrów i komórek pamięci, zlokalizowanie instrukcji odpowiedzialnych za wadliwe działanie programu. Debugger jest standardowym wyposażeniem większości współczesnych środowisk programistycznych.
Framework Framework to struktura wspomagająca tworzenie, rozwój i testowanie powstającej aplikacji. Na framework składają się programy wspomagające, biblioteki kodu źródłowego i inne przydatne narzędzia. Framework to szkielet działania aplikacji, który zapewnia podstawowe mechanizmy i może być wypełniany właściwą treścią programu. ASP.NET (Microsoft) framework służący do budowania dynamicznych stron internetowych, aplikacji internetowych i XML-owych usług sieciowych, część platformy.net Eclipse (IBM) - framework napisany w Javie do tworzenia aplikacji typu Rich Client, zintegrowane środowisko programistyczne do tworzenia programów w Javie.
API Interfejs programowania aplikacji (Application Programming Interface, API) - interfejs programu użytkownika to specyfikacja procedur, funkcji lub interfejsów umożliwiających tworzonej aplikacji komunikację z biblioteką programów, systemem operacyjnym itp. Interfejs API ułatwia proces tworzenia oprogramowania poprzez ukrycie szczegółów implementacyjnych oraz gwarantuje podobny interfejs dla wszystkich opartych na nim aplikacji. Popularne API: Win32 API dla Windows, DirectX - zestaw funkcji API dla generowanie grafiki i dźwięku, OpenGL (Open Graphics Library) - uniwersalne API do generowania grafiki.
CASE CASE (Computer-Aided Software Engineering, Computer- Aided Systems Engineering) to oprogramowanie używane do komputerowego wspomagania projektowania oprogramowania. Funkcje CASE: analiza, projektowanie i programowanie. Narzędzia CASE: automatyzują metody projektowania, dokumentacji oraz tworzenia struktury kodu programu w wybranym języku programowania. Typowe narzędzia CASE: narzędzia do modelowania w języku UML, narzędzia do zarządzania konfiguracją programu zawierające system kontroli wersji służący do śledzenia zmian w kodzie źródłowym oraz pomocy w łączeniu i modyfikacji zmian dokonanych przez wiele osób, narzędzia do wprowadzania zmian w programie.
UML UML (Unified Modeling Language) (Object Management Group) to język formalny służący do opisu świata obiektów w analizie obiektowej oraz programowaniu obiektowym. Służy do opisywania i modelowania fragmentu istniejącej rzeczywistości np. modelowania tego, czym zajmuje się jakiś dział w firmie oraz do modelowania rzeczywistości, która ma dopiero powstać tworzy się w nim głównie modele systemów informatycznych. UML stał się standardowym językiem do tworzenia planów oprogramowania, używanym przez analityków, projektantów i programistów. UML jest używany wraz z jego reprezentacją graficzną jego elementom przypisane są symbole, które wiązane są ze sobą na diagramach UML.
Diagramy UML Modele składają się z obiektów, które wchodzą w interakcje, przesyłając sobie nawzajem komunikaty. Klasy to wzorce obiektów. diagramy przypadków użycia - opisują, co robi system z punktu widzenia zewnętrznego obserwatora diagramy klas - przedstawiają ogólnie klasy i ich wzajemne relacje diagramy obiektów - zamiast klas pokazują ich instancje - obiekty diagramy sekwencji - opisują, jak obiekty ze sobą współpracują diagramy współpracy - skupiają się na rolach obiektów diagramy stanów - pokazują możliwe stany obiektu oraz przejścia, które powodują zmianę stanu diagramy aktywności - pokazują wzajemne zależności między obiektem przechodzącym pewien proces i operacjach związanych z tym procesem diagramy komponentów - są fizycznymi odpowiednikami diagramów klas diagramy wdrożenia - pokazują fizyczną konfigurację oprogramowania i sprzętu
Diagramy UML http://pl.wikipedia.org/wiki/plik:uml_diagrams.jpg
IDE Zintegrowane środowisko programistyczne (Integrated Development Environment, IDE) to aplikacja lub zespół aplikacji (środowisko) służących do tworzenia, modyfikowania, testowania i konserwacji oprogramowania: edycja kodu źródłowego, kompilacja kodu źródłowego, tworzenie zasobów programu (formatek, ekranów, okien dialogowych, menu, raportów, elementów graficznych - ikon itp.), tworzenie baz danych, komponentów i innych.
RAD Narzędzia RAD (Rapid Application Development) są rozwinięciem pomysłu IDE. Wygląd aplikacji projektuje się ustawiając kontrolki w obszarze okna projektowanego programu (np. przy użyciu myszy - przeciągnij i upuść). Przykładowe narzędzia RAD to: Dev-C++ dla języków C i C++, Delphi, Visual Studio i.net dla Windows Kylix dla Linux.
Programowanie zdarzeniowe Programowanie sterowane zdarzeniami (Programowanie zdarzeniowe) jest to metodologia tworzenia programów komputerowych, która określa sposób ich pisania z punktu widzenia procesu przekazywania sterowania między poszczególnymi modułami tej samej aplikacji. Programowanie sterowane zdarzeniami jest mocno powiązane ze środowiskami wieloprocesowymi, z graficznymi środowiskami systemów operacyjnych oraz z programowaniem obiektowym. Jest to odpowiedź na paradygmat programowania, według którego program jest cały czas bombardowany zdarzeniami (events), na które musi odpowiedzieć, i że przepływ sterowania w programie jest całkowicie niemożliwy do przewidzenia z góry.
Programowanie zdarzeniowe Programowanie zdarzeniowe jest dominującym typem programowania GUI zdarzenia to naciśnięcia myszy, klawiszy, żądania odświeżenia przez system okienkowy, różne zdarzenia sieciowe i inne. W starych systemach operacyjnych (np. DOS), w jednej chwili mogła pracować tylko jedna aplikacja. Sterowanie jej działaniem odbywało się bądź poprzez jawne zadeklarowanie kolejności wykonania kodu (w programie jednoprzebiegowym), bądź poprzez pętlę obsługi wyboru opcji (w programie interaktywnym).
Błędy Błąd oprogramowania (bug) usterka programu komputerowego powodująca jego nieprawidłowe działanie, wynikająca z błędu człowieka na jednym z etapów tworzenia oprogramowania - zwykle podczas tworzenia kodu źródłowego, lecz niekiedy także na etapie projektowania. Wyróżnia się dwa główne typy błędów: Błędy składniowe nie pozwalają na kompilację programu np. literówka w nazwie zmiennej. Są one najczęściej dość łatwe do usunięcia. Błędy logiczne nie przerywają kompilacji, lecz powodują niewłaściwe działanie warstwy logicznej. Ten typ błędów jest znacznie trudniejszy do wykrycia i usunięcia.
Wyjątki Wyjątek (ang. exception) jest mechanizmem przepływu sterowania używanym w mikroprocesorach oraz współczesnych językach programowania do obsługi zdarzeń wyjątkowych, a w szczególności błędów, których wystąpienie zmienia prawidłowy przebieg wykonywania programu. W momencie zajścia niespodziewanego zdarzenia generowany jest wyjątek, który musi zostać obsłużony poprzez zapamiętanie bieżącego stanu programu i przejście do procedury jego obsługi. W niektórych sytuacjach po obsłużeniu wyjątku można powrócić do wykonywania przerwanego kodu, korzystając z zapamiętanych informacji stanu. Na przykład obsługa błędu braku strony pamięci polega najczęściej na pobraniu brakującej strony z pliku wymiany, co umożliwia kontynuowanie pracy programu, natomiast błąd dzielenia przez zero powoduje przerwanie wykonania programu.
Poziomy bezpieczeństwa Mówimy, że kod jest bezpieczny dla wyjątków (ang. exception-safe), jeśli rzucenie wyjątku w jego obrębie nie powoduje niepożądanych skutków ubocznych takich, jak wycieki pamięci, generowanie nieprawidłowego wyniku czy pozostawienie systemu w stanie niespójnym. Wyróżniamy kilka poziomów bezpieczeństwa: Przezroczystość awarii gwarantowane jest, że dana operacja zakończy się sukcesem i wyprodukuje poprawny wynik nawet wtedy, jeśli w trakcie wykonywania pojawiła się sytuacja wyjątkowa. Operacja potrafi we własnym zakresie obsłużyć wszystkie wyjątki nigdy nie są one przekazywane do kodu ją wywołującego. Jest to najwyższy stopień bezpieczeństwa kodu.
Poziomy bezpieczeństwa Atomowość operacji (także silne bezpieczeństwo dla wątków) operacja albo wykona się w całości poprawnie, albo w przypadku awarii pozostawi system w stanie niezmienionym (lub przywraca go do stanu początkowego), nie powodując żadnych skutków ubocznych. Podstawowe bezpieczeństwo dla wątków w przypadku awarii operacja może mieć efekty uboczne, jednak pomimo, że wartości w obrębie struktur danych mogą ulec zmianie, ale w dalszym ciągu będą one poprawne z punktu widzenia systemu. Minimalne bezpieczeństwo dla wątków awaria lub wyjątek w trakcie wykonywania operacji nie powoduje wycieków pamięci, ani błędów krytycznych, lecz może produkować nieprawidłowe dane. Brak bezpieczeństwa dla wątków brak jakichkolwiek gwarancji. Najgorszy poziom bezpieczeństwa
Stos, kolejka Stos (ang. Stack) liniowa struktura danych, w której dane dokładane są na wierzch stosu i z wierzchołka stosu są pobierane (bufor typu LIFO, Last In, First Out; ostatni na wejściu, pierwszy na wyjściu). Stos jest stosowany w systemach komputerowych na wszystkich poziomach funkcjonowania systemów informatycznych. Używany jest przez procesory do chwilowego zapamiętywania rejestrów procesora, do przechowywania zmiennych lokalnych, a także w programowaniu wysokopoziomowym. Przeciwieństwem sposobu pobierania danych wykorzystywanego w przypadku stosu jest kolejka (bufor) typu FIFO (ang. First In, First Out; pierwszy na wejściu, pierwszy na wyjściu), w którym dane obsługiwane są w takiej kolejności, w jakiej zostały dostarczone (jak w kolejce do kasy).
Zmienne Zmienna - konstrukcja programistyczna posiadająca trzy podstawowe atrybuty: Identyfikator (symboliczną nazwę), miejsce przechowywania (adres w pamięci i długość danych), wartość, typ danej (opcjonalnie), pozwalająca w kodzie źródłowym odwoływać się przy pomocy nazwy do wartości lub miejsca przechowywania. W programie dwa pierwsze atrybuty (nazwa i miejsce przechowywania) nie zmieniają się w trakcie istnienia zmiennej. Natomiast wartość jest zmienna i - w zależności od rodzaju języka programowania również typ zmiennej może zmienny. Podobną konstrukcją lecz nie pozwalającą na modyfikowanie wartości jest stała.
Kontekst (scope) W językach ze statycznym typowaniem każda zmienna ma z góry określony (deklarowany) typ danych jakie może przechowywać. Jest on wykorzystywany do określenia reprezentacji wartości w pamięci (ilości zajmowanego miejsca), kontrolowania poprawności operacji wykonywanych na zmiennej (kontrola typów) oraz konwersji danych jednego typu na inny. W językach z typowaniem dynamicznym typ nie jest atrybutem zmiennej lecz wartości w niej przechowywanej. Zmienna może wtedy w różnych momentach pracy programu a więc zależnie od kontekstu - przechowywać dane różnych typów.