====== (PSiW) Wstęp ====== W tym temacie zapoznamy się z podstawami programowania aplikacjiwykorzystując API (ang. //Application Programming Interface//), w naszym przypadku będzie to API POSIX, wspólne dla systemów Uniksowych. Programy będziemy pisać w języku //C++//, jednak interfejs POSIX zadziała także w programach napisanych w czystym //C//. Zanim zaczniemy pisać programy wykorzystujące bezpośrednie funkcje systemu operacyjnego, przypomnimy sobie podstawy //C++// oraz poznamy metodę sprawnego kompilowania naszych projektów. ===== Kompilacja programów w C++ ===== Wszystkie kody w tym repozytorium zostały sprawdzone na systemie //Ubuntu 22.04// oraz kompilatorze //gcc 11.4.0// oraz //glibc 2.35.0//. Kody w C++ są zgodne ze standardem C++20. Aby skompilować program wystarczy wywołać polecenie: g++ program.cpp W ten sposób kompilator //g++// skompiluje kod z pliku ''program.cpp'' i zapisze plik binarny programu do pliku ''a.out''. Wykorzystana zostanie też starsza wersja standardu C++. Dlatego, lepszą opcją będzie wykorzystanie takiego wywołania: g++ -std=c++20 -Wall -o program program.cpp Przełącznik ''-std=c++20'' włącza obsługę standardu C++20, najnowszego stablinego wydania dostępnego w chwili ostatniej edycji tego opisu. Opcja ''-Wall'' powoduje, że kompilator będzie ostrzegał o wszystkich wyrażeniach, które mogą potencjalnie powodować problemy, bądź nie są zgodzne z tzw. //dobrymi praktykami//. ''-o program'' spowoduje, że wynik kompilacji zostanie zapisany do pliku ''program'', zamiast domyślnego ''a.out''. W trakcie tworzenia programu można też rozważyć dodanie opcji ''-O0 -g'', które wyłączają optymalizacje kodu oraz dodają do wynikowego pliku //symbole debuggera//. Są to informacje, które powodują, że //debugger// może dokładnie wskazywać nazwy funkcji i zmiennych podczas pracy. ===== CMake ===== Proces budowania aplikacji można zautomatyzować korzystając z narzędzi typu //make// lub //CMake//. Program //make// jest klasycznym programem użytkowym systemu Unix, który potrafi automatycznie określac, które kody źródłowe należy przekompilować. Wykorzystuje przy tym definiowalny zestaw reguł oraz opcji, definiowany w plikach ''Makefile''. Dzięki temu, kompilowanie całego projektu możemy skrócić do wywołania jednej komendy ''make''. Tworzenie i zarządzanie plików ''Makefile'' jest uzależnione od platformy, na której chcemy kompilować programy, dlatego też powstały aplikacje upraszczające ten proces. Program //CMake// służy jako niezależny od platformy generator plików dla programów budujących. Początkowo były to różne dialekty ''Makefile'', ale aktualnie //CMake// potrafi generować też pliki projektów dla rozbudowanych narzędzi IDE, np. //Visual Studio//, czy //XCode//. Aby program //CMake// mógł przygotować przygotować proces budowania, trzeba przygotować plik konfiguracyjny ''CMakeLists.txt''. Dla naszych potrzeb wystarczy tylko prosta konfiguracja, podobna do pokazanej poniżej. Możliwości tego programu są zdecydowanie większe i najlepiej w tym miejscu odesłać do [[https://cmake.org/cmake/help/latest/index.html|dokumentacji CMake]]. cmake_minimum_required(VERSION 3.20) project(psiw_intro) set(CMAKE_CXX_STANDARD 20) add_executable(example example.cpp) Aby skompilować projekt opisany powyższym plikiem konfiguracyjnym, wystarczy wywołać polecenie ''cmake .'' i potem ''make'', stworzy to dodatkowe pliki w bieżącym folderze, dlatego lepiej poprosić program o wygenerowanie plików np. do folderu ''build''. W takim przypadku, pierwsze budowanie projektu będzie wyglądało w ten sposób: cmake -B build/ cd build make Późniejsze kompilacje, o ile nie dodamy nowego pliku z kodem źródłowym, wykonujemy komendą ''make''. W omawianym przykładzie, skompilowany program znajdziemy w folderze ''build''. ==== Zadania ==== - Napisz w C++ prosty program pytający użytkownika o imię i wypisujący je na ekran. (''cout'', ''cin'', ''string''). - Stwórz plik ''CMakeLists.txt'', który pozwoli na zbudowanie wcześniej napisanego programu do pliku wykonywalnego. ===== Dodatek C++ dla Visual Studio Code ===== Visual Studio Code jest zaawansowanym edytorem, który dobrze sprawdzi się w roli IDE (ang. //Integrated Development Environment// - Zintegrowane Środowisko Programistyczne). Podstawowe funkcje dostępne są zaraz po zainstalowaniu //VSCode//, ale dla ułatwienia pracy, warto zainstalować sobie pakiet [[https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools-extension-pack|C/C++ Extension Pack]]. Ta paczka rozszerzeń poprawi autouzupełnianie kodu oraz doda obsługę dla //CMake// w //VSCode//. Podpowiedzi zaczną być lepsze praktycznie natychmiast, lecz w przypadku //CMake//, trzeba dokonać drobnej konfiguracji rozszerzenia. Obsługa //CMake// ma aktualnie jedną wadę, nie działa, gdy w otwartej przestrzeni roboczej (folderze) jest więcej niż jeden plik ''CMakeLists.txt''. Za każdym razem trzeba więc otwierać folder zawierający jeden projekt //CMake//. W przypadku, gdy posiadamy już projekt //CMake//, wystarczy otworzyć folder w //VSCode//, a następnie wykonać wstępną konfigurację. Bardzo prawdopodobne jest, że program sam to zaproponuje, gdyby jednak tak się nie stało, wystarczy wywołać //Paletę poleceń// skrótem ''Ctrl+Shift+P'', a następnie wpisać polecenie ''CMake: Configure''. {{ :students:psiw:vscode-cmake-config.png |}} Kompilowanie projektu można uruchomić za pomocą klawisza ''F5'' lub klikając napis ''Build'' na pasku statusu. Uruchomienie programu to skrót ''Shift+F5'' (wariant bez debuggera) lub ''Ctrl+F5'' (dodatkowo uruchamia debugger). Dodatek //CMake// pozwala też automatyczne generowanie pliku ''CMakeLists.txt'' dla nowego projektu. Tworzy on, co prawda, nieco inny szablon, niż używany przez nas, ale warto wiedzieć, że i taka opcja istnieje. Dla nowego projektu wywołujemy ''Ctrl+Shift+P'' i wybieramy polecenie ''CMake: Quick Start''. Poźniej musimy zdefiniować nazwę projektu, wybrać język i typ projektu (aplikacja lub biblioteka). Na koniec dostajemy gotowy szablon projektu, gotowy do użycia. ===== Dodatkowa literatura ===== Temat programowania w języku C++ jest bardzo obszerny, w trakcie naszych zajęć wykorzystamy tylko ułamek tego, co można osiągnąć pisząc programy. Dla zainteresowanych tematyką C++ mogę polecić następujące pozycje. Książki dostępne są do wypożyczenia w bibliotece PP. - Grębosz Jerzy, //Opus Magnum C++11//, Wydanie II, 2020 - Grębosz Jerzy, //Misja w nadprzestrzeń C++14/17//, 2020 - Farbaniec Dawid, //C++20 Laboratorium//, 2022 - [[https://cpp0x.pl/kursy/|Darmowe kursy C++ ze strony cpp0x.pl]] - [[https://www.youtube.com/@cppweekly|Kanał C++ Weekly With Jason Turner na YouTube (w języku angielskim)]]