Czym są program, algorytm i kod źródłowy oraz jak kod staje się wykonywanymi instrukcjami. Kompilacja, interpretacja i programowanie strukturalne na krótkich przykładach. Lekcja 10.1 kursu INF.03.
Program to zapis instrukcji, które komputer wykonuje, aby zrealizować określone zadanie. Na egzaminie trzeba odróżnić program od algorytmu, rozpoznać język skryptowy i wskazać rolę kompilatora lub interpretera. Przy tworzeniu aplikacji te pojęcia pozwalają ustalić, gdzie wykonuje się kod i jak sprawdzić jego wynik.
Problem, algorytm i kod
Problem programistyczny opisuje, co należy otrzymać przy określonych danych. Przykładem jest wyliczenie ceny zamówienia na podstawie ceny jednej sztuki i liczby sztuk. Algorytm to jednoznaczny sposób rozwiązania takiego problemu. Kod źródłowy jest zapisem rozwiązania w wybranym języku programowania. Ten sam algorytm można zapisać w Pythonie, JavaScript i PHP, choć składnia będzie różna.
Specyfikacja określa dane wejściowe, oczekiwany wynik i warunki. Dla prostego zamówienia przyjmijmy cenę w całych złotych i nieujemną liczbę sztuk. Wynikiem ma być całkowita kwota. Jeżeli nie ustalimy, czy cena zawiera podatek i czy dopuszczamy rabat, dwa programy mogą policzyć różne wartości mimo poprawnego mnożenia. Najpierw ustala się znaczenie danych, potem wybiera instrukcje.
cena = 25
ilosc = 3
kwota = cena * ilosc
print(kwota)
Program wypisze 75. Znak równości przypisuje wartość nazwie, gwiazdka oznacza mnożenie, a print (WYPISZ) przekazuje wynik na wyjście. Nazwy cena, ilosc i kwota są zmiennymi, czyli nazwami powiązanymi z danymi. To kompletny przykład dla Pythona 3. Nie trzeba przetłumaczyć go ręcznie do kodu maszynowego, aby uruchomić go interpreterem.
Kod źródłowy nie jest tym samym co wynik programu. Plik zawiera instrukcje, natomiast liczba 75 jest rezultatem ich wykonania. Zapisanie pliku nie uruchamia obliczenia. Wyświetlenie kodu PHP jako tekstu w przeglądarce także nie dowodzi wykonania go przez serwer. O miejscu uruchomienia decyduje środowisko, a nie samo rozszerzenie widoczne w edytorze.
Kompilacja i interpretacja
Kompilator to program tłumaczący kod z jednego języka na inną postać. Często jest to kod maszynowy wykonywany przez procesor, ale może to być także kod pośredni albo inny język. Kompilacja może wykryć określone błędy przed uruchomieniem. Nie dowodzi jednak, że program poprawnie rozwiązuje zadanie. Źle dobrany wzór na rabat może dać poprawnie skompilowany program z błędnym wynikiem.
Interpreter to program wykonujący kod zgodnie z regułami języka, bez wymagania od użytkownika samodzielnego przygotowania osobnego pliku wykonywalnego. Popularne uproszczenie „czyta zawsze jedną linię i od razu ją wykonuje” nie opisuje wszystkich interpreterów. Kod może najpierw zostać przeanalizowany i przetłumaczony do postaci pośredniej. Na przykład implementacja CPython kompiluje kod Pythona do kodu bajtowego, który wykonuje jej maszyna wirtualna.
Kompilacja i interpretacja mogą współpracować. Silnik JavaScript może analizować kod, wykonywać go i kompilować wybrane fragmenty podczas działania. Podział na języki kompilowane i interpretowane opisuje typowy sposób użycia lub implementację, a nie niezmienną własność każdego możliwego wykonania. Dokumentacja Pythona wyjaśnia tę różnicę w słowniku pojęć. Dla egzaminu najważniejsze są role: kompilator tłumaczy, interpreter uczestniczy w wykonaniu, a edytor służy do pisania. Edytor może uruchamiać inne narzędzia, lecz sam kolorowy tekst nie oznacza, że kod został sprawdzony. Podkreślony błąd jest wskazówką; rzeczywisty wynik trzeba potwierdzić uruchomieniem w odpowiednim środowisku.
Język skryptowy i miejsce działania
Język skryptowy to język używany między innymi do automatyzacji i opisywania działań wykonywanych w określonym środowisku. JavaScript, PHP i Python są typowymi przykładami. Skrypt może obsługiwać formularz, przygotowywać odpowiedź serwera albo przetwarzać pliki. Słowo skrypt nie oznacza, że program musi być krótki lub nie może być częścią dużej aplikacji.
JavaScript w przeglądarce może reagować na kliknięcie i zmieniać treść dokumentu. PHP na serwerze może odczytać dane z bazy i przygotować odpowiedź. Python może działać jako część serwera albo jako lokalny program uruchamiany z konsoli. Miejsce wykonania wynika z użytego środowiska. JavaScript może także działać poza przeglądarką, więc utożsamienie języka z jednym miejscem jest zbyt wąskie.
HTML opisuje strukturę dokumentu, a CSS jego prezentację. Nie zastępują języka opisującego ogólne obliczenia i sterowanie programem. Przeglądarka korzysta z nich razem, ale każdy ma inne zadanie. Szczegóły JavaScript zawiera pierwsza lekcja działu JS, a drogę skryptu serwera wprowadzenie do PHP. Programowanie strukturalne
Programowanie strukturalne organizuje kod wokół sekwencji, wyboru i powtarzania oraz dzielenia zadania na mniejsze części. Sekwencja wykonuje instrukcje w kolejności. Wybór rozstrzyga, którą gałąź wykonać, zależnie od warunku. Pętla powtarza czynności. Te trzy konstrukcje wystarczają do zapisania wielu algorytmów bez chaotycznych skoków między dowolnymi miejscami kodu.
ilosc = 3
cena = 25
if ilosc >= 3:
cena = 20
kwota = cena * ilosc
print(kwota)
Program wypisze 60. Warunek if (JEŻELI) sprawdza, czy liczba sztuk wynosi przynajmniej trzy. Ponieważ tak jest, cena zostaje zmieniona na 20. Potem wykonuje się mnożenie i wypisanie. Wcięcie wskazuje instrukcje należące do warunku. Zmiana wcięcia mogłaby zmienić znaczenie programu, nawet jeśli użyte słowa pozostałyby te same.
Procedura lub funkcja pozwala nazwać wydzielone zadanie i wykorzystywać je w różnych miejscach. Parametry przekazują dane do funkcji, a wynik można przekazać z powrotem. Dobra nazwa opisuje czynność, na przykład oblicz_kwote. Podział pomaga sprawdzać fragmenty osobno i unikać powtarzania tej samej reguły. Sama duża liczba funkcji nie daje jeszcze poprawnej struktury; każda powinna mieć jasny cel.
Różne sposoby organizacji programu
Paradygmat programowania to ogólny sposób organizowania rozwiązania. W podejściu proceduralnym zapisuje się kolejne czynności i grupuje je w procedury lub funkcje. Podejście obiektowe łączy dane z operacjami w obiektach. Na przykład obiekt zamówienia może przechowywać pozycje i udostępniać operację obliczania sumy. Nie oznacza to, że każda zmienna jest osobnym rzeczywistym przedmiotem.
W podejściu deklaratywnym opisuje się oczekiwany wynik, pozostawiając wybór części szczegółów wykonania narzędziu. Zapytanie SQL określa potrzebne kolumny i warunki, a silnik bazy wybiera sposób uzyskania wyniku. Programowanie zdarzeniowe organizuje reakcje na zdarzenia, na przykład kliknięcie. Funkcja obsługująca przycisk może wewnątrz nadal używać zwykłego warunku i pętli.
Te sposoby nie muszą się wzajemnie wykluczać. Aplikacja może reagować na zdarzenia, używać obiektów i wykonywać procedury. W pytaniu o paradygmat trzeba rozpoznać wskazaną cechę, a nie przypisywać każdemu językowi jedną wyłączną etykietę. W tym kursie krótkie przykłady algorytmiczne pozostają strukturalne, aby dało się prześledzić ich przebieg bez dodatkowych pojęć.
Na egzaminie
Jeżeli pytanie dotyczy tłumaczenia kodu, szukaj kompilatora. Jeżeli opisuje zapis sposobu rozwiązania niezależny od języka, chodzi o algorytm. Przy programowaniu strukturalnym rozpoznaj kolejność, warunki i pętle. W analizie listingu zapisuj bieżące wartości zmiennych zamiast odgadywać wynik po nazwie programu.
Pułapka: poprawna składnia i możliwość uruchomienia nie dowodzą poprawności obliczenia. Program może konsekwentnie wykonywać niewłaściwy algorytm.
W zadaniu praktycznym oddaj kod źródłowy i sprawdź zachowanie w wymaganym środowisku. Zrzut poprawnego wyniku nie zastępuje pliku programu, a plik programu bez próby uruchomienia nie potwierdza wyniku. Te dwa dowody dotyczą różnych elementów pracy.
Ściąga
problem
cel oraz warunki
algorytm
jednoznaczny sposób rozwiązania
kod źródłowy
zapis rozwiązania w języku
kompilator
tłumaczenie kodu
interpreter
wykonanie w środowisku języka
sekwencja
czynności po kolei
wybór
gałąź zależna od warunku
pętla
powtarzanie czynności
paradygmat
sposób organizowania rozwiązania
Pobierz ściągę PDF