Last modified: September 18, 2024

This article is written in: 🇵🇱

Programowanie

Co to jest program?

Program to precyzyjnie sformułowany zestaw instrukcji lub poleceń, które komputer wykonuje w celu rozwiązania konkretnego problemu lub realizacji określonego zadania. Instrukcje te są napisane w języku programowania, który jest zrozumiały dla programistów i może być przetworzony na język zrozumiały dla maszyny.

Programowanie jest procesem tworzenia tych instrukcji i wymaga od programisty umiejętności analitycznego myślenia, rozwiązywania problemów oraz znajomości składni i semantyki wybranego języka programowania. Kluczowym elementem jest zrozumienie algorytmów, czyli krok po kroku procedur prowadzących do rozwiązania problemu.

Zależnie od złożoności zadania, program może składać się z kilku linii kodu, realizujących proste operacje, lub z milionów linii skomplikowanego kodu, tworzących zaawansowane systemy operacyjne, aplikacje biznesowe czy gry komputerowe. Programy mogą być tworzone do różnych celów, takich jak automatyzacja zadań, przetwarzanie danych, komunikacja czy sterowanie urządzeniami.

Języki programowania

Języki programowania to formalne języki zaprojektowane do komunikowania instrukcji do maszyny, szczególnie komputera. Składają się z zestawu reguł składniowych i semantycznych, które określają, jak pisać programy. Wybór języka programowania zależy od wielu czynników, takich jak:

Przykłady popularnych języków programowania:

Każdy język programowania ma swoje unikalne cechy, zalety i obszary zastosowań. Wybór odpowiedniego języka jest kluczowy dla efektywnego i wydajnego tworzenia oprogramowania.

Proces działania programu

Wejście i wyjście z programu są podstawowymi elementami interakcji programu z otoczeniem. Programy przetwarzają dane wejściowe, wykonują na nich określone operacje i generują dane wyjściowe.

Wejście
      ⬇
     Kod
      ⬇
   Sprzęt
      ⬇
   Wyjście

Wejście i wyjście są kluczowymi elementami interfejsu programu, a ich prawidłowa obsługa jest niezbędna dla poprawnego funkcjonowania programu. Program musi być zaprojektowany tak, aby prawidłowo interpretować dane wejściowe i generować oczekiwane wyjście, nawet w przypadku nieprzewidzianych lub błędnych danych wejściowych.

Relacja między kodem a sprzętem

Kod programu jest zbiorem instrukcji, które muszą zostać przetworzone i wykonane przez sprzęt komputerowy. Ta relacja jest kluczowa dla zrozumienia, jak programy działają na poziomie maszyny.

Relacja między kodem a sprzętem opiera się na kilku istotnych aspektach:

Dlatego ważne jest, aby programiści mieli świadomość, jak ich kod zostanie przetworzony i wykonany przez sprzęt, co pozwala na tworzenie bardziej efektywnych i niezawodnych programów.

Kompilator i Interpreter

Kod napisany przez programistę jest zrozumiały dla człowieka, ale musi zostać przetłumaczony na język zrozumiały dla maszyny. Istnieją dwa główne sposoby tego tłumaczenia: kompilacja i interpretacja.

kod źródłowy => kompilacja/interpretacja => kod maszynowy

Kompilator

Kompilator to program, który przekształca kod źródłowy napisany w języku programowania wysokiego poziomu na kod maszynowy lub kod pośredni. Proces ten odbywa się przed uruchomieniem programu i składa się z kilku etapów:

Zalety kompilacji:

Wady kompilacji:

Interpreter

Interpreter to program, który analizuje i wykonuje kod źródłowy linia po linii w czasie rzeczywistym. Nie tworzy on oddzielnego pliku wykonywalnego.

Zalety interpretacji:

Wady interpretacji:

C

kod źródłowy C#.NET ---> kompilator C#.NET ---> CIL (.exe/.dll) ---> kompilator JIT (just-in-time) ---> kod maszynowy

  1. Kod źródłowy jest kompilowany do Common Intermediate Language (CIL), niezależnego od platformy.
  2. Podczas uruchomienia, kompilator JIT tłumaczy CIL na kod maszynowy specyficzny dla danej platformy.
  3. Kod maszynowy jest wykonywany przez sprzęt.

Ta hybryda kompilacji i interpretacji pozwala na optymalizację wydajności i przenośność kodu.

Język C z GCC

kod źródłowy C ---> kompilator GCC ---> kod wynikowy (plik wykonywalny) -> linker -> program

  1. Kod źródłowy jest przetwarzany przez GCC do kodu maszynowego.
  2. Łączenie z bibliotekami tworzy plik wykonywalny.
  3. Program jest uruchamiany bezpośrednio przez system operacyjny.

Ten proces tworzy wydajny kod, ale zależny od platformy.

Python

kod źródłowy Python ---> interpreter Python ---> wynik działania kodu

  1. Kod źródłowy jest przetwarzany przez interpreter.
  2. Interpreter kompiluje kod do bytecode (kod bajtowy).
  3. Bytecode jest wykonywany przez maszynę wirtualną Pythona.

Python łączy interpretację z kompilacją do bytecode, co przyspiesza działanie programu w porównaniu z czystą interpretacją.

Podsumowanie

Różne języki programowania wykorzystują różne metody tłumaczenia kodu źródłowego na kod wykonywalny. Wybór między kompilacją a interpretacją wpływa na wydajność, przenośność i interaktywność języka. Niektóre języki, takie jak Java czy C#, używają podejścia hybrydowego, łącząc zalety obu metod.

Syntaktyka (reguły) i semantyka (znaczenie)

Podczas programowania ważne jest zrozumienie zarówno składni (syntaktyki), jak i znaczenia (semantyki) kodu. Błędy w jednym lub drugim mogą prowadzić do nieprawidłowego działania programu lub uniemożliwić jego uruchomienie.

Syntaktyka

Syntaktyka dotyczy reguł składniowych języka programowania. Obejmuje ona zasady dotyczące struktury kodu, takie jak użycie nawiasów, średników, poprawnej kolejności instrukcji. Błędy syntaktyczne są zazwyczaj wykrywane przez kompilator lub interpreter i uniemożliwiają uruchomienie programu.

Przykłady błędów syntaktycznych:

I. Brak nawiasu zamykającego:

def funkcja():
    print("Hello World!"

Błąd: "SyntaxError: unexpected EOF while parsing".

II. Brak dwukropka po instrukcji warunkowej:

if x > 5
    print("x jest większe od 5")

Błąd: "SyntaxError: invalid syntax".

III. Nieprawidłowa identacja (wcięcie) w Pythonie:

def funkcja():
print("Hello World!")

Błąd: "IndentationError: expected an indented block".

Poprawna składnia jest niezbędna, aby kompilator lub interpreter mógł poprawnie zrozumieć i przetworzyć kod.

Semantyka

Semantyka odnosi się do znaczenia instrukcji w kodzie. Dotyczy tego, co kod faktycznie robi podczas wykonania. Błędy semantyczne występują, gdy kod jest poprawny składniowo, ale nie działa zgodnie z zamierzeniami programisty.

Przykłady błędów semantycznych:

I. Użycie nieistniejącej zmiennej:

x = 10
print(y)

Błąd: "NameError: name 'y' is not defined".

II. Błędna logika warunku:

x = 10
if x < 5:
    print("x jest większe od 5")

Kod działa, ale nie wyświetli komunikatu, mimo że x jest większe od 5.

III. Nieprawidłowe operacje na typach danych:

a = "5"
b = 10
c = a + b

Błąd: "TypeError: can only concatenate str (not 'int') to str".

Błędy semantyczne są często trudniejsze do wykrycia, ponieważ nie zawsze prowadzą do natychmiastowych błędów. Mogą powodować nieprawidłowe wyniki lub zachowanie programu.

Różnica między błędami syntaktycznymi a semantycznymi

Znaczenie testowania i debugowania

Aby zapewnić poprawne działanie programu, programiści muszą:

Poprawne zrozumienie syntaktyki i semantyki jest kluczowe dla tworzenia niezawodnego i efektywnego oprogramowania.

Typowanie

Typowanie odnosi się do systemu typów używanego w języku programowania, który definiuje rodzaje danych, jakie mogą być przechowywane i manipulowane w programie. System typów wpływa na sposób, w jaki programiści piszą kod i jak kompilator lub interpreter przetwarza ten kod.

Typowanie statyczne

W językach z typowaniem statycznym typy zmiennych są określane w czasie kompilacji. Programista musi zadeklarować typ zmiennej przed jej użyciem, a raz zadeklarowany typ nie może być zmieniony.

Zalety:

Przykłady języków o statycznym typowaniu:

Typowanie dynamiczne

W językach z typowaniem dynamicznym typy zmiennych są określane w czasie wykonania. Zmienna może przechowywać wartości różnych typów w trakcie działania programu.

Zalety:

Wady:

Przykłady języków o dynamicznym typowaniu:

Wskazówki dotyczące typów

Chociaż Python jest językiem o dynamicznym typowaniu, w wersji 3.5 wprowadzono "type hints" (wskazówki dotyczące typów), które pozwalają na określenie oczekiwanych typów zmiennych, argumentów funkcji i wartości zwracanych.

Przykład użycia type hints:

def greet(name: str) -> str:
    return "Hello, " + name

Zalety użycia type hints:

Ograniczenia:

Spis Treści

  1. Co to jest program?
    1. Języki programowania
    2. Proces działania programu
    3. Relacja między kodem a sprzętem
  2. Kompilator i Interpreter
    1. Kompilator
    2. Interpreter
      1. C
      2. Język C z GCC
      3. Python
    3. Podsumowanie
  3. Syntaktyka (reguły) i semantyka (znaczenie)
    1. Syntaktyka
    2. Semantyka
    3. Różnica między błędami syntaktycznymi a semantycznymi
    4. Znaczenie testowania i debugowania
  4. Typowanie
    1. Typowanie statyczne
    2. Typowanie dynamiczne
    3. Wskazówki dotyczące typów