RSS
 

Archiwum dla kategorii ‘3. Języki programowania’

Metody realizacji języków programowania

12 paź

Program komputerowy może występować w dwóch postaciach: źródłowej i wykonywalnej (wynikowej). Programista tworzy, analizuje i rozbudowuje postać źródłową, która nie może być wykonana bezpośrednio przez system komputerowy. Aby wykonać program w postaci źródłowej, należy albo przetłumaczyć ją za pomocą kompilatora na postać wykonywalną (kod maszynowy), albo do jej wykonania posłużyć się interpreterem.

Kompilator to program, który tłumaczy kod napisany w języku wysokiego poziomu na równoważny kod w języku niższego poziomu.

Interpreter to program, który w przeciwieństwie do kompilatora nie generuje kodu wynikowego, lecz na bieżąco wykonuje kolejne instrukcje zawarte w kodzie źródłowym. Kolejność instrukcji wyznaczona jest przez przebieg wykonywania kodu źródłowego, a miejsce pierwszej instrukcji definiuje język źródłowy. Wykonanie instrukcji oznacza wywołanie wewnętrznej funkcji interpretera.

Model pracy prostego interpretera:
- pobierz kolejną instrukcję z kodu źródłowego,
- analizuj pobraną instrukcję,
- jeżeli instrukcja jest niepoprawna, przerwij interpretację, w przeciwnym wypadku wykonaj instrukcję,
- jeżeli istnieje kolejna instrukcja, przejdź do kroku 1, w przeciwnym wypadku zakończ interpretację.

ANALIZA PORÓWNAWCZA INTERPRETERÓW I KOMPILATORÓW
Analiza porównawcza interpreterów i kompilatorów

 
 

Paradygmaty programowania

11 paź

Paradygmat programowania to zespół ogólnych koncepcji, mechanizmów i konstrukcji programistycznych, determinujących styl tworzenia oprogramowania.

Paradygmaty podstawowe:
- imperatywne (sekwencyjne i strukturalne),
- obiektowe,
- deklaratywne (funkcyjne i logiczne).

Język programowania może wspierać kilka paradygmatów. Wsparcie przez język pewnego paradygmatu oznacza dostarczenie mechanizmów, które ułatwiają programowanie w tym paradygmacie.

Programowanie sekwencyjne – program nie miał struktury i składał się z sekwencji instrukcji wykonywanych zwykle w kolejności zapisu. Kolejność ta mogła być zmieniana poprzez instrukcje skoku warunkowego i bezwarunkowego, a także pętli. Wykonywanie kolejnych instrukcji prowadziło do modyfikacji stanu zmiennych, aż do uzyskania końcowego rezultatu.

Paradygmat strukturalny – usprawnienie technik programistycznych spowodowało ewolucję programowania sekwencyjnego, programowanie sekwencyjne i strukturalne to łącznie paradygmat imperatywny (ang. imperative programming). Usunięcie instrukcji GOTO, sterowanie w oparciu o kombinację konstrukcji:
- sekwencji – instrukcje wykonywane w kolejności zapisania,
- selekcji (wyboru) – wykonanie bloku instrukcji uzależnione od prawdziwości wyrażenia warunkowego,
- iteracji – wielokrotne wykonywanie bloku instrukcji, tak długo jak prawdziwy jest warunek iteracji.

Paradygmat strukturalny wykorzystuje dekompozycję funkcjonalną jako technikę radzenia sobie ze złożonością, czyli kolejne podziały programu, zgodnie ze strategią dziel i zwyciężaj (ang. divide and conquer), na coraz mniejsze, łatwiejsze do ogarnięcia i zarządzania modularne podprogramy.

Programowanie modularne – oddzielenie interfejsu od implementacji, zwane ukrywaniem informacji (ang. information hiding), program składa się z wyizolowanych podprogramów, o ściśle określonych interfejsach, podprogramy są luźno powiązane (ang. low coupling), każdy może być zrozumiały i modyfikowany bez analizowania całości, każda zmiana w implementacji zwykle jest lokalna i nie przenosi się na inne moduły.

Większość kompilatorów języków strukturalnych była stosunkowo prosta w implementacji oraz charakteryzowała się niskimi potrzebami sprzętowymi. Miało to istotny wpływ na popularyzację języków strukturalnych w dobie pierwszych komputerów osobistych.

Programowanie zorientowane obiegowo (OOP – Object-Oriented Programming) – język Simula, język Java w biznesie i ośrodkach akademickich. Odwzorowanie bytów występujących w danej dziedzinie przedmiotowej na kolekcję obiektów tworzących program komputerowy. Obiekt jest odpowiedzialny za pewien fragment rzeczywistości. Obiekt wykorzystuje swój stan (wartości atrybutów, funkcje operujące na danych) do realizacji powierzonych czynności. Może skorzystać z usług oferowanych przez inny obiekt.

Paradygmat deklaratywny – ukrywanie przed programistą szczegółów systemu komputerowego, skoncentrowany jest na wskazaniu tego co, należy obliczyć, oraz własności rozwiązania.

Paradygmat funkcjonalny – podstawową konstrukcją budowy programów są funkcje matematyczne, funkcje złożone dekomponuje się na funkcje prostsze i przedstawia się ich złożenie, dekompozycja kończy się w momencie uzyskania funkcji na danych wejściowych programu. Nie występuje pojęcie zmienne ani przypisania. Języki funkcyjne oferują funkcje, których argumentem może być inna funkcja oraz które jako wynik mogą zwrócić inną funkcję. Nie występują instrukcje pętli, sposobem zapisu jest rekurencja.

Polimorfizm parametryczny – uogólnienie ze względu na typ danych zapisu algorytmu, wykorzystywany jest, gdy implementowany algorytm nie zależy od typu danych, na których operuje.

Język logiki – program składa się ze stwierdzeń opisujących daną dziedzinę przedmiotową, zapisanych w postaci klauzul Horna: fakty opisują relacje między obiektami, reguły sposób, w jakim można wyprowadzić nowe relacje na podstawie istniejących, zapytania umożliwiają sprawdzenie, czy między obiektami zachodzi pewna relacja. Zbadanie spełnialności zapytania, czyli znalezienia obiektów czyniących to zapytanie prawdziwym lub stwierdzeniu, że zapytanie jest fałszywe.

Paradygmaty uzupełniające:
- programowanie współbieżne
(ang. concurrent programming) – paradygmat zorientowany na zespół komunikujących się asynchronicznie procesów/wątków,
- programowanie sterowane zdarzeniami (ang. event-driven programming) – paradygmat, w którym przepływ sterowania jest kierowany zdarzeniami, tj. kliknięcie myszką, naciśnięcie przycisku, odczytanie zdalnego pliku, itp., programowanie jest zorientowane wokół obsługi generowanych zdarzeń,
- programowanie komponentowe (ang. component-oriented programming) – paradygmat zorientowany ma tworzenie oprogramowania poprzez składanie gotowych komponentów, komponent to moduł wielokrotnego użytku o charakterze czarnej skrzynki, oferujący logiczne spójne usługi w wąskiej specjalizacji.

Paradygmaty uzupełniające mogą być łączone z większością paradygmatów podstawowych, jednak najczęściej występuje łączenie ich z paradygmatem obiektowym.

 
 

Generacje języków programowania

10 paź

Dialog między programistą a komputerem jest możliwy dzięki zastosowaniu języków programowania. Język programowania umożliwia precyzyjne wyrażenie, w postaci kodu źródłowego, zadania przeznaczonego do wykonania przez system komputerowy.

Język programowania to język o składni i semantyce zrozumiałej dla pewnego systemu komputerowego.

Składnia to zbiór słów oraz reguł, według których słowa mogą być łączone, natomiast semantyka to znaczenie słów oraz ich połączeń, poprawnych składniowo.

Programowania sprzętowe, nazywane także programowaniem zewnętrznym, polegało na ręcznym ustawieniu setek przełączników oraz przekładaniu układów elektrycznych. Metoda ta była kosztowna, powolna i mało elastyczna.

Języki maszynowe, traktowane jako pierwsza generacja języków programowania (1GL) – instrukcje w języku maszynowym mają postać ciągu zer i jedynek, trudne do zapamiętania i analizowania, błędy niełatwe do zlokalizowania, dostępne zestawy instrukcji maszynowych różnią się w zależności od rodzaju procesora.

Języki symboliczne, zwane asemblerami, zaliczane do języków drugiej generacji (2GL) – dla każdej instrukcji maszynowej wprowadzono odpowiadający jej, łatwy do zapamiętania mnemonik, czyli kilkuliterowy skrót, oznaczający konkretną czynność procesora, program zapisany w języku symbolicznym musi być przetłumaczony na kod maszynowy przez program – asembler.

Ukrycie przed programistą szczegółów architektury sprzętowej, a tym samym przeniesienie programowania na wyższy poziom abstrakcji, zaowocowało powstaniem języków trzeciej generacji (3GL). Języki wysokiego poziomu (HLLs – ang. high level languages) umożliwiają programiście skoncentrowanie się na rozwiązywanym problemie. Pojedynczej instrukcji zapisanej w HLL opowiada wiele instrukcji maszynowych. W celu przetłumaczenia programu napisanego w HLL na kod maszynowy wykorzystuje się kompilatory.

Języki czwartej generacji (4GL) – specjalizacja w ramach ściśle określonego obszaru zastosowań. Specjalizacja polega na dostarczeniu gotowych do wykorzystania komponentów, które zwalniają programistę z potrzeb implementowania typowych fragmentów aplikacji. Kategorie języków 4GL:
- generatory aplikacji,
- generatory raportów oraz formularzy,
- języki powstałe na wewnętrzne potrzeby aplikacji.
Udogodnieniem języków 4GL jest graficzny interfejs dialogu z użytkownikiem.