Pytania pomocnicze - INF.04

Projektowanie, programowanie i testowanie aplikacji

Pytania pomocnicze rozwijające tematy z pytań egzaminacyjnych. Każde pytanie ma krótką odpowiedź, która pomaga utrwalić wiedzę i przygotować się do egzaminu. Łącznie: 3704.
Strona 41 z 50.

Czym jest kompilator?

Kompilator to narzędzie, które przekształca kod źródłowy programu na postać możliwą do wykonania przez komputer, najczęściej plik wykonywalny lub kod pośredni.

Czym różni się kompilator od interpretera?

Kompilator tłumaczy program przed uruchomieniem, zwykle tworząc plik wykonywalny. Interpreter wykonuje kod instrukcja po instrukcji w czasie działania programu.

Co oznacza termin kod źródłowy?

Kod źródłowy to program zapisany przez programistę w języku programowania, np. C++, C#, Java lub Python.

Czym jest plik wykonywalny?

Plik wykonywalny to plik, który można uruchomić w systemie operacyjnym jako program, np. plik `.exe` w Windows.

Jaką rolę pełni linker w procesie tworzenia programu?

Linker łączy skompilowane części programu oraz potrzebne biblioteki w jeden wynikowy program lub przygotowuje odwołania do bibliotek dynamicznych.

Dlaczego odpowiedź o monitorowaniu zmian w kodzie nie definiuje kompilatora?

Monitorowanie zmian w kodzie to zadanie systemów kontroli wersji, takich jak Git. Kompilator nie śledzi historii zmian, tylko tłumaczy kod programu.

Czy kompilator analizuje kod?

Tak, kompilator analizuje kod m.in. pod kątem składni i typów, ale jego głównym zadaniem jest przekształcenie kodu źródłowego do postaci wykonywalnej lub pośredniej.

Czym różni się interpreter od kompilatora?

Interpreter tłumaczy i wykonuje program w trakcie jego działania. Kompilator tłumaczy kod źródłowy wcześniej, zwykle tworząc plik wynikowy lub pośredni.

Dlaczego odpowiedź o generowaniu pliku wykonywalnego nie opisuje interpretera?

Generowanie pliku wykonywalnego jest typowe dla kompilatora i procesu kompilacji. Interpreter zwykle uruchamia program bez tworzenia osobnego pliku wykonywalnego dla systemu operacyjnego.

Co oznacza, że interpreter działa w trakcie wykonywania programu?

Oznacza to, że kod jest analizowany i wykonywany na bieżąco podczas uruchomienia aplikacji. Program nie musi być wcześniej w całości skompilowany do pliku wykonywalnego.

Jakie języki często kojarzy się z interpretacją?

Często podaje się Python, JavaScript, PHP lub Ruby. W praktyce wiele współczesnych środowisk łączy interpretację, kod pośredni i kompilację JIT.

Czy interpreter zawsze tłumaczy kod źródłowy bezpośrednio na kod maszynowy?

W uproszczeniu egzaminacyjnym tak się to opisuje. Technicznie interpreter może wykonywać kod źródłowy, kod pośredni lub współpracować z maszyną wirtualną.

Jaką rolę pełni linker w procesie budowania programu?

Linker łączy skompilowane moduły programu oraz potrzebne biblioteki. Nie wykonuje kodu linia po linii, więc nie jest interpreterem.

Jakie są zalety programów interpretowanych?

Zwykle łatwiej je szybko uruchamiać, testować i przenosić między systemami. Często są wygodne w nauce, automatyzacji i tworzeniu skryptów.

Jakie są wady interpretacji w porównaniu z kompilacją?

Program interpretowany może działać wolniej, ponieważ część pracy związanej z analizą kodu odbywa się podczas uruchomienia. Wymaga też obecności odpowiedniego interpretera lub środowiska uruchomieniowego.

Czym jest biblioteka dynamiczna?

Biblioteka dynamiczna to gotowy moduł z kodem, który może być dołączany do programu w czasie jego uruchamiania lub działania. Przykładami są pliki DLL w Windows oraz SO w systemach Linux.

Czym biblioteka dynamiczna różni się od biblioteki statycznej?

Biblioteka statyczna jest dołączana do pliku wykonywalnego podczas linkowania, przez co zwiększa jego rozmiar. Biblioteka dynamiczna pozostaje osobnym plikiem i jest ładowana w trakcie działania programu.

Dlaczego biblioteki dynamiczne zmniejszają rozmiar pliku wykonywalnego?

Kod biblioteki nie jest kopiowany bezpośrednio do programu, tylko przechowywany w osobnym pliku. Program zawiera jedynie odwołania do funkcji lub zasobów z tej biblioteki.

Jakie rozszerzenia mają typowe biblioteki dynamiczne?

W systemie Windows biblioteki dynamiczne mają najczęściej rozszerzenie .dll. W Linuksie używa się plików .so, a w macOS .dylib.

Jaką rolę pełni linker przy korzystaniu z bibliotek?

Linker łączy kod programu z bibliotekami lub przygotowuje odwołania do nich. Przy bibliotekach statycznych dołącza kod biblioteki do programu, a przy dynamicznych zwykle zapisuje informacje potrzebne do ich późniejszego załadowania.

Jakie są zalety stosowania bibliotek dynamicznych?

Pozwalają współdzielić ten sam kod przez wiele programów, zmniejszają rozmiar aplikacji i ułatwiają aktualizację biblioteki bez przebudowy całego programu.

Jakie problemy mogą wystąpić przy używaniu bibliotek dynamicznych?

Program może się nie uruchomić, jeśli wymagana biblioteka nie istnieje, ma niezgodną wersję albo znajduje się w niewłaściwej lokalizacji. Może też dojść do konfliktów wersji bibliotek.

Na czym polega kompilacja kodu źródłowego?

Kompilacja polega na przetłumaczeniu całego kodu źródłowego na kod wynikowy przed uruchomieniem programu. Taki program można potem wykonywać bez ponownego tłumaczenia całego źródła.

Na czym polega interpretacja kodu?

Interpretacja polega na tłumaczeniu i wykonywaniu kodu instrukcja po instrukcji w czasie działania programu. Odpowiada za to interpreter.

Dlaczego programy kompilowane często działają szybciej od interpretowanych?

Program kompilowany jest wcześniej przetłumaczony do postaci łatwiejszej do wykonania przez komputer. W interpretacji część pracy tłumaczenia odbywa się dopiero podczas uruchamiania programu.

Czy debugger jest wymagany do kompilacji?

Nie. Debugger służy do śledzenia i diagnozowania działania programu, a nie do samego procesu kompilacji.

Czy język programowania może łączyć cechy kompilacji i interpretacji?

Tak. Przykładem jest Java lub C#, gdzie kod jest najpierw kompilowany do formy pośredniej, a następnie uruchamiany przez środowisko wykonawcze.

Jaka jest rola kompilatora w procesie tworzenia programu?

Kompilator analizuje kod źródłowy i przekształca go w kod wynikowy. Może też wykrywać błędy składniowe przed uruchomieniem programu.

Jaka jest główna różnica między błędami wykrywanymi przy kompilacji a błędami podczas interpretacji?

Przy kompilacji wiele błędów można wykryć przed uruchomieniem programu. Przy interpretacji część błędów może ujawnić się dopiero podczas wykonywania konkretnej instrukcji.

Dlaczego funkcje ułatwiają debugowanie programu?

Funkcje dzielą program na mniejsze fragmenty, więc łatwiej ustalić, w której części występuje błąd. Można testować pojedynczą funkcję bez analizowania całego programu.

Na czym polega ponowne wykorzystanie kodu dzięki funkcjom?

Kod umieszczony w funkcji można wywołać wiele razy z różnymi argumentami. Dzięki temu nie trzeba kopiować tych samych instrukcji w wielu miejscach programu.

Jaka jest różnica między funkcją a metodą?

Funkcja jest samodzielnym fragmentem kodu wykonującym zadanie. Metoda to funkcja należąca do klasy lub obiektu.

Czy podział programu na funkcje automatycznie poprawia działanie programu?

Nie zawsze. Funkcje poprawiają organizację kodu, ale nie gwarantują braku błędów, poprawnej kompilacji ani większej wydajności.

Dlaczego funkcje zwiększają czytelność kodu?

Dobrze nazwane funkcje pokazują, za co odpowiada dany fragment programu. Program staje się bardziej uporządkowany i łatwiejszy do zrozumienia.

Czy funkcje mogą ograniczyć powtarzanie kodu?

Tak. Jeśli ten sam zestaw instrukcji jest potrzebny w wielu miejscach, można umieścić go w funkcji i wywoływać ją tam, gdzie jest potrzebna.

Czy stosowanie funkcji eliminuje potrzebę używania zmiennych globalnych?

Nie eliminuje jej automatycznie. Funkcje mogą pomóc ograniczyć zmienne globalne przez używanie parametrów i wartości zwracanych, ale zależy to od projektu programu.

Dlaczego rekurencja pasuje do problemów dzielonych na mniejsze podproblemy?

Bo każdy mniejszy podproblem można rozwiązać tą samą funkcją. Dzięki temu kod często jest krótszy i bardziej zgodny z opisem algorytmu.

Czym rekurencja różni się od iteracji?

Rekurencja polega na wywoływaniu funkcji przez samą siebie, a iteracja na wielokrotnym wykonywaniu instrukcji w pętli. Obie techniki mogą rozwiązywać podobne problemy, ale różnią się sposobem zapisu i użyciem pamięci.

Co to jest przypadek bazowy w rekurencji?

Przypadek bazowy to warunek, przy którym funkcja przestaje wywoływać samą siebie. Chroni program przed nieskończoną rekurencją.

Jakie są przykłady algorytmów, w których rekurencja jest naturalnym wyborem?

Typowe przykłady to sortowanie szybkie, sortowanie przez scalanie, przeszukiwanie drzew oraz obliczanie silni. W tych problemach łatwo wydzielić mniejsze zadania tego samego typu.

Czy rekurencja zawsze jest lepsza od iteracji?

Nie. Rekurencja może być czytelniejsza, ale zwykle zużywa więcej pamięci i może być wolniejsza przez narzut wywołań funkcji.

Co może się stać, gdy rekurencja nie ma poprawnego warunku zakończenia?

Funkcja będzie wywoływać samą siebie bez końca. Może to doprowadzić do błędu przepełnienia stosu.

Dlaczego środowisko wielowątkowe nie jest samo w sobie powodem do użycia rekurencji?

Wielowątkowość dotyczy równoległego wykonywania zadań, a rekurencja sposobu rozwiązania problemu przez samo wywołania funkcji. Są to niezależne zagadnienia.

Na czym polega rekurencja w programowaniu?

Rekurencja polega na tym, że funkcja wywołuje samą siebie. Musi mieć warunek zakończenia, czyli przypadek bazowy.

Dlaczego obliczanie liczb Fibonacciego często pokazuje się jako przykład rekurencji?

Ponieważ każdy wyraz ciągu Fibonacciego zależy od dwóch wcześniejszych wyrazów. Tę zależność łatwo zapisać jako funkcję wywołującą samą siebie.

Czym różni się rekurencja od iteracji?

Rekurencja używa wywołań tej samej funkcji, a iteracja używa pętli, np. `for` lub `while`. Oba podejścia mogą rozwiązywać podobne problemy.

Dlaczego sortowanie bąbelkowe zwykle nie jest kojarzone z rekurencją?

Sortowanie bąbelkowe najczęściej realizuje się za pomocą zagnieżdżonych pętli. Jest to typowy przykład algorytmu iteracyjnego.

Co to jest przypadek bazowy w funkcji rekurencyjnej?

Przypadek bazowy to warunek, przy którym funkcja przestaje wywoływać samą siebie. Chroni program przed nieskończoną rekurencją.

Czy algorytm rekurencyjny zawsze jest lepszy od iteracyjnego?

Nie. Rekurencja bywa czytelniejsza, ale może być mniej wydajna i zużywać więcej pamięci niż rozwiązanie z pętlą.

Jaki problem ma prosta rekurencyjna wersja algorytmu Fibonacciego?

Wielokrotnie oblicza te same wartości, przez co jest wolna dla większych argumentów. Można to poprawić przez memoizację lub wersję iteracyjną.

Czym jest warunek zakończenia w funkcji rekurencyjnej?

To warunek, przy którym funkcja przestaje wywoływać samą siebie. Bez niego rekurencja może trwać bez końca.

Dlaczego brak warunku zakończenia jest błędem?

Powoduje nieskończone wywoływanie funkcji. Program może wtedy zakończyć się błędem przepełnienia stosu.

Czym różni się rekurencja od iteracji?

Rekurencja polega na wywoływaniu funkcji przez samą siebie, a iteracja na powtarzaniu instrukcji za pomocą pętli. Obie techniki mogą rozwiązywać podobne problemy.

Czy zamiana rekurencji na iterację zawsze jest konieczna?

Nie. Rekurencja jest poprawna, jeśli ma warunek zakończenia i zmierza do niego w kolejnych wywołaniach.

Co oznacza, że funkcja rekurencyjna musi zbliżać się do przypadku bazowego?

Każde kolejne wywołanie powinno zmieniać dane tak, aby w końcu spełnić warunek zakończenia, np. zmniejszać licznik.

Jaki błąd może wystąpić przy zbyt głębokiej rekurencji?

Może wystąpić przepełnienie stosu wywołań. Oznacza to, że program wykonał zbyt wiele zagnieżdżonych wywołań funkcji.

Dlaczego wyszukiwanie binarne można zapisać zarówno iteracyjnie, jak i rekurencyjnie?

Ponieważ w każdym kroku wykonuje się ten sam schemat: sprawdzenie środka i zawężenie przedziału wyszukiwania. Można to powtarzać pętlą albo przez kolejne wywołania funkcji.

Jaki warunek musi spełniać tablica, aby można było zastosować wyszukiwanie binarne?

Tablica musi być posortowana. Bez uporządkowania danych porównanie ze środkowym elementem nie pozwala poprawnie odrzucić połowy zbioru.

Czym różni się wersja iteracyjna algorytmu od rekurencyjnej?

Wersja iteracyjna używa pętli, np. `while` lub `for`. Wersja rekurencyjna polega na tym, że funkcja wywołuje samą siebie dla mniejszego problemu.

Jaki jest warunek stopu w rekurencyjnym wyszukiwaniu binarnym?

Warunkiem stopu jest znalezienie szukanego elementu albo sytuacja, gdy lewy indeks przekroczy prawy indeks. Oznacza to, że przeszukiwany przedział jest pusty.

Jaka jest złożoność czasowa wyszukiwania binarnego?

Złożoność czasowa wynosi O(log n), ponieważ w każdym kroku algorytm odrzuca połowę pozostałych elementów.

Dlaczego wyszukiwanie binarne jest przykładem metody dziel i zwyciężaj?

Algorytm dzieli problem na mniejszą część, wybierając tylko lewą albo prawą połowę danych. Następnie rozwiązuje ten sam problem dla zawężonego zakresu.

Czy każdy algorytm warto zapisywać rekurencyjnie?

Nie. Rekurencja może być czytelna, ale zwykle zużywa dodatkową pamięć stosu. Jeśli rozwiązanie iteracyjne jest proste i wydajne, często jest praktyczniejszym wyborem.

Czym różni się deklaracja zmiennej od przypisania wartości?

Deklaracja określa nazwę i zwykle typ zmiennej, np. `int x;`. Przypisanie nadaje jej konkretną wartość, np. `x = 5;`.

Czym jest inicjalizacja zmiennej?

Inicjalizacja to nadanie zmiennej wartości początkowej w momencie jej tworzenia, np. `int x = 10;`.

Dlaczego typ zmiennej jest ważny?

Typ określa, jakie dane można przechowywać w zmiennej i jakie operacje można na niej wykonywać. Na przykład na liczbach można wykonywać działania arytmetyczne.

Czy każda deklaracja zmiennej automatycznie nadaje jej wartość?

Nie zawsze. W wielu językach zmienna może być zadeklarowana bez wartości, a jej użycie przed przypisaniem wartości może prowadzić do błędu.

Jak wygląda deklaracja zmiennej w językach statycznie typowanych?

Zwykle zawiera typ i nazwę zmiennej, np. `int liczba;` w C++, C# lub Javie.

Czy deklaracja zmiennej zawsze oznacza zapis nowej wartości do bazy danych?

Nie. Deklaracja zmiennej dotyczy kodu programu, a nie bezpośrednio bazy danych. Baza danych jest osobnym miejscem przechowywania danych.