Spis treści Poprzednia strona: Ludzie Następna strona: Inne paradygmaty
Paradygmat programowania to podstawowy sposób tworzenia programów, sposób patrzenia na przepływ danych i przepływ sterowania w kodzie. Programista wykonując swoją pracę stosuje – świadomie lub nie – tzw. paradygmat programowania. Albo ogranicza się tylko do jednego paradygmatu, albo korzysta z wielu, ale rzadko jednocześnie. Określone paradygmaty lepiej lub gorzej nadają się do rozwiązywania określonych problemów. Programista zwykle przyzwyczaja się do jednego paradygmatu ponieważ dobrze go zna i rozumie. Czasem jednak wystarczy zmiana paradygmatu, aby rozwiązać dany problem znacznie efektywniej. Wybór paradygmatu albo jest pierwotny, albo wtórny w stosunku do wyboru języka programowania, gdyż określone języki wspierają określone paradygmaty (choć często więcej niż jeden).
Język programowania to język formalny, służący do pełnego sterowania pracą komputera. Kod w języku programowania to tzw. kod źródłowy i musi on zostać najpierw przetłumaczony na kod maszynowy aby mógł być wykonany przez komputer.
Podstawowym paradygmatem jest programowanie imperatywne, gdyż bezpośrednio odzwierciedla sposób działania sprzętu komputerowego. Oparte jest na trzech abstrakcjach: pamięć danych, pamięć programów i jednostka sterująca (procesor). Procesor pobiera instrukcje kodu maszynowego z pamięci programów, wykonuje te instrukcje przy użyciu danych pobranych z pamięci danych i umieszcza wyniki z powrotem w pamięci danych w celu dalszego przetwarzania innymi instrukcjami. Procesor może warunkowo lub bezwarunkowo przenosić sterowanie do innych instrukcji, dzięki czemu możliwa staje się realizacja algorytmów (patrz maszyna Turinga). Dzięki takim rozwiązaniom jak stos i przerwania możliwe jest tymczasowe przenoszenie sterowania do innych instrukcji o wyższym priorytecie i powrót do poprzednio wykonywanych instrukcji o zwykłym priorytecie.
Zbiory instrukcji rozwiązujące konkretne problemy nazywamy programami. Wykonaniem programów sterują systemy operacyjne. Efektem pracy programisty jest właśnie program. Programiści korzystają w swojej pracy z określonych narzędzi [ang. tools], którymi często są także inne programy. Zalicza się do nich na przykład edytory (do pisania kodu źródłowego), kompilatory (do tłumaczenia kodu źródłowego na kod maszynowy), interpretery (do kompilacji pojedynczych instrukcji i natychmiastowego ich wykonywania), debugery (do wykonywania kodu maszynowego lub źródłowego krok po kroku w celu sprawdzenia jego poprawności) i profilery (do badania szybkości i poprawności wykonania programów i ich poszczególnych funkcji).
Podstawowym językiem programowania jest asembler [ang. assembler]. Każdy procesor ma swój zestaw instrukcji kodu maszynowego (zwanych też rozkazami), a te mają swoje bezpośrednie odpowiedniki w instrukcjach asemblera (zwanych też mnemonikami). Jest kilka asemblerów dla kilku platform. Platforma to określony rodzaj sprzętu komputerowego, głównie procesora, np. IA-32 oraz IA-64 dla procesorów firmy Intel i kompatybilnych.
Kolejnym historycznie etapem w rozwoju programowania było makroprogramowanie, czyli pisanie tzw. makr lub makropoleceń, pozwalające na łatwe wykorzystywanie powtarzających się fragmentów kodu.
Rozwinęło się ono w programowanie strukturalne, które dodaje kilka nowych abstrakcji: typy, zmienne, wskaźniki, struktury danych, struktury kontrolne (warunki i pętle) oraz wyrażenia. Usuwa natomiast możliwość stosowania instrukcji GOTO (bezwarunkowego przekazania sterowania), gdyż jest ona traktowana jako niestrukturalna. Przy okazji: polecenie, komenda, instrukcja i rzadko konstrukcja (kalka językowa od angielskiego construct) to zwykle to samo: ciąg określonych wyrazów języka programowania w określonej kolejności i wykonujących jedną rzecz.
Programowanie proceduralne dodaje do tego procedury (rozwinięcie idei przerwań) i funkcje (procedury przyjmujące argumenty i zwracające wartości – tak jak w matematyce). Przy okazji: argumenty i parametry to w tym kontekście zwykle to samo.
Programowanie modularne dodaje moduły i biblioteki oraz narzędzie linkera – programu łączącego. Ułatwia korzystanie z kodu napisanego wcześniej przez odwołanie się do niego. Program nie potrafi działać, jeżeli nie wie jak zrozumieć i wykorzystać te odwołania. Tym zajmuje się linker (dynamiczny w trakcie działania programu albo statyczny jako ostatnia faza kompilacji lub bezpośrednio przed uruchomieniem programu).
Programowanie generyczne wprowadza szablony i pewną niezależność od typów. To w pewnym sensie powrót do makr, ale w nowym, lepszym ujęciu. W języku C# to nie jest dokładnie to samo, co w języku C++ pomimo, że wygląda podobnie w kodzie źródłowym.
I wreszcie programowanie obiektowe dodaje wiele nowych abstrakcji, jak: klasy (pola, metody, właściwości), konstruktory i destruktory, dziedziczenie, metody wirtualne, polimorfizm, klasy abstrakcyjne, interfejsy. Programowanie obiektowe to na dzień dzisiejszy trend powszechnie obowiązujący i zaryzykowałbym nawet stwierdzenie, że dzisiaj jest w zasadzie synonimem programowania w ogóle.
Nie jest ono (programowanie obiektowe) wolne od wad, dlatego wymaga często szeregu rozszerzeń (np. programowanie aspektowe wyodrębnia kwestie przecinające wskroś 🙂 [cross-cutting concerns]).
Programowanie dynamiczne to pełna niezależność od typów i pozwala na tworzenie klas oraz obiektów (prototypowanie) w trakcie działania programu, a nie tylko deklarowanie ich na stałe przed kompilacją. Ten paradygmat nie jest popularny, bo długo cierpiał na problemy z wydajnością, ale odeszły one już w przeszłość i przeżywa on ostatnio wielki powrót.
Programowanie wirtualne pozwala kompilować programy do kodu pośredniego wykonywanego na tzw. maszynie wirtualnej i dzięki temu pozwala uniezależnić się od procesora i jego kodu maszynowego. To stało się ważne wraz z wejściem urządzeń mobilnych, które z racji swej natury mają inną architekturę, a dzięki maszynie wirtualnej mogą być oprogramowane w podobny sposób. Język C# korzysta z .NET Framework, który ma swoją maszynę wirtualną, podobnie jak Java.
Programowanie zdarzeniowe pozwala uniezależnić się od jednego ciągu kolejno wykonywanych instrukcji i definiuje nowy rodzaj algorytmów – algorytmy rozproszone.
Programowanie równoległe lub wielowątkowe pozwala konstruować algorytmy wykonujące wiele instrukcji jednocześnie poprzez użycie wielu procesorów lub przez podział czasu na jednym procesorze, a także stanowi naturalną podstawę dla programowania zdarzeniowego.
Spis treści Poprzednia strona: Ludzie Następna strona: Inne paradygmaty