Autor: Oskar Klimkiewicz

Inżynier oprogramowania specjalizujący się w C++, absolwent Wydziału Elektroniki i Technik Informacyjnych Politechniki Warszawskiej. Od ponad 8 lat projektuje i rozwija systemy o wysokiej dostępności, głównie dla branży fintech i IoT. PS. Zdjęcie wyretuszowane przez AI :)

Wstęp do teorii kompilacji – główne etapy procesu Kompilacja stanowi fundamentalny proces w informatyce, przekształcający kod źródłowy napisany w języku wysokiego poziomu na postać wykonywalną przez maszynę. Proces ten obejmuje szereg ściśle powiązanych faz, których zrozumienie ma kluczowe znaczenie dla projektowania efektywnych kompilatorów oraz optymalizacji generowanego kodu. Podstawowe etapy kompilacji – od analizy leksykalnej po generowanie kodu maszynowego – tworzą kompleksowy mechanizm translacji, w którym każda faza dostarcza dane wejściowe dla kolejnej, tworząc spójny łańcuch przetwarzania. Teoria kompilacji rozwinęła się w ciągu ostatnich dziesięcioleci, łącząc zagadnienia lingwistyki matematycznej, teorii automatów i projektowania systemów niskopoziomowych, co zaowocowało wysoce zoptymalizowanymi metodami transformacji…

Read More

Przydatne opcje gcc wykraczające poza -wall i -wextra Flagi -Wall i -Wextra są powszechnie znane jako podstawowe narzędzia do generowania ostrzeżeń w GCC, jednak ekosystem kompilatora oferuje znacznie więcej zaawansowanych opcji diagnostycznych, debugujących i optymalizacyjnych. Te mniej znane flagi umożliwiają precyzyjną kontrolę nad kompilacją, wykrywanie subtelnych błędów, analizę zużycia zasobów oraz dostosowanie wynikowego kodu do specyficznych wymagań systemowych. Ich znajomość jest szczególnie cenna w kontekście rozwoju oprogramowania wbudowanego, systemów krytycznych bezpieczeństwa oraz projektów wymagających rygorystycznej optymalizacji. Rozszerzone opcje diagnostyczne GCC dostarcza szereg flag ostrzegawczych dedykowanych konkretnym klasom błędów, których nie obejmują domyślne ustawienia. Flaga -Wfloat-equal generuje ostrzeżenia w przypadku bezpośrednich…

Read More

Kompleksowa eksploracja Google Mock – cardinality, matchers i actions w praktyce Google Mock (gMock) to kluczowy komponent frameworka GoogleTest, umożliwiający zaawansowane testowanie jednostkowe przy użyciu obiektów pozornych. Artykuł ten stanowi pogłębioną analizę trzech podstawowych koncepcji gMock – cardinality, matchers i actions – prezentując praktyczne wskazówki implementacyjne. Bazując na oficjalnej dokumentacji oraz przykładach z rzeczywistych wdrożeń, analizujemy funkcjonalności każdego z elementów, ich wzajemne zależności oraz niuanse ich zastosowania. 1. Wprowadzenie do podstaw gMock gMock wspiera testowanie oparte na zachowaniu poprzez symulowanie zależności za pomocą obiektów mokowanych. Pozwala to programistom na: Definiowanie oczekiwań (np. liczba wywołań funkcji, wartości argumentów); Określanie zachowań (np.…

Read More

Porównanie wydajności języków C i C++ – wpływ abstrakcji o zerowym narzucie Relacja wydajnościowa między C a C++ to złożony temat, głęboko powiązany z koncepcją abstrakcji o zerowym narzucie – filozofią projektowania zapoczątkowaną przez Bjarne Stroustrupa z myślą o C++. Zasada ta zakłada, że wysokopoziomowe abstrakcje nie powinny generować narzutu czasowego względem równoważnych implementacji niskopoziomowych: „Za to, czego nie używasz, nie płacisz; za to, czego używasz, nie napisałbyś lepiej ręcznie”. C pozostał językiem proceduralnym z minimalnymi możliwościami abstrakcji, podczas gdy C++ obsługuje wiele paradygmatów (obiektowy, generyczny, funkcyjny) i dąży do optymalnej wydajności dzięki optymalizacjom kompilatora. Dane empiryczne pokazują, że: Idiomatyczny…

Read More

Wyszukiwanie testów w Google Test – metody i narzędzia Google Test (GTest) to zaawansowany framework do testowania jednostkowego w C++, oferujący mechanizmy dynamicznego wykrywania testów. Poniższy artykuł szczegółowo omawia metody i narzędzia wykorzystywane w procesie wyszukiwania testów, analizując zarówno aspekty techniczne, jak i praktyczne implementacje. Metody wykrywania testów Mechanizm gtest_discover_tests w CMake stanowi podstawową metodę wykrywania testów. Funkcja ta konfiguruje polecenie wykonywane po kompilacji (post-build), które uruchamia plik wykonywalny testów z argumentem –gtest_list_tests. To generuje listę testów poprzez analizę wyjścia programu. Przykładowo: gtest_discover_tests( lib_gtest TEST_LIST lib_test_list PROPERTIES ENVIRONMENT „MYCONFIG_PATH=${CMAKE_CURRENT_SOURCE_DIR}” ) Flaga –gtest_list_tests jest kluczowa – wymusza na programie wyświetlenie hierarchicznej…

Read More

Skrajnie niepotrzebne i ekstremalne przypadki w C++ – nawigacja po ciemnych zakamarkach złożonego języka C++ pozostaje jednym z najpotężniejszych i najczęściej używanych języków programowania, szczególnie w obszarach wymagających wysokiej wydajności i kontroli niskopoziomowej. Jego ewolucja z C oraz dekady dodawania nowych funkcji stworzyły środowisko pełne niejednoznacznej składni, nieintuicyjnych zachowań i ekstremalnych przypadków brzegowych. Obejmują one zarówno historyczne artefakty, takie jak urządzenie Duffa, jak i współczesne pułapki związane z niezdefiniowanym zachowaniem czy czasem życia tymczasowych obiektów. Zrozumienie tych przypadków ma praktyczne znaczenie dla bezpieczeństwa, wydajności i utrzymywalności kodu. Na przykład, niezdefiniowane zachowanie może prowadzić do krytycznych luk bezpieczeństwa, gdy kompilatory optymalizują…

Read More