Transkrypcja
Wstęp i errata
Cześć Michał.
Cześć Wojtek.
Ostatnim razem porozmawialiśmy sobie troszkę o innym świecie – świecie C++, ale chyba jeszcze nie skończyliśmy tej opowieści. Pewnie jeszcze masz parę…
Ja mogę tak godzinami.
Ciekawe, to się dobrze składa, bo mamy godzinę.
No to dobra.
I pewnie jeszcze masz parę rzeczy do opowiedzenia, doświadczeń, więc… Nawet sobie posłuchałem tego, co tam mówiliśmy. Wyszła mi taka errata mała. Najmocniej przepraszam, bo tam w jednym miejscu powiedziałem, że biblioteka… Ten, jak ją to nazwałem, po prostu STD nazwałem, a ona się nazywa STL, bo to jest Standard Template Library, czyli standardowa biblioteka szablonów, i ona właśnie z tego się składa – z tych standardowych szablonów. A ja użyłem tam trochę omyłkowo nazwy STD, czyli namespace tej biblioteki. No ale to chodziło tak czy siak o bibliotekę standardową, więc myślę, że wszyscy się domyślili, co tu się…
Zwłaszcza wszyscy z Javy.
Zwłaszcza ci…
Natomiast druga errata to wprawdzie tam już nie będzie taka całkiem errata, bo to było tak ledwo, ledwo wzmiankowane przy okazji tego przeciążania operatora – tam gdzieś tam się wymsknęło, że wypada też przeciążyć operator delete. I to moim zdaniem było trochę za słabo zaakcentowane, bo to jest konieczność. Bo jak już przeciążymy, zrobimy swoje własne new, dostarczymy operację alokowania czegokolwiek z jakiejkolwiek naszej struktury danych, to musimy się na pewno upewnić, że oddaliśmy to, co zaalokowaliśmy. Tym bardziej, że jeżeli na przykład takie new się przeciąży…
No.
Nie do mechanizmu RAII to chyba nie za bardzo będzie, bo ta myśl raczej w konstruktorze robi rzeczy. To new jest przed konstruktorem jeszcze, także to tutaj przy alokacjach ma znaczenie. I to w kwestii erraty. Tyle.
Wzorce projektowe i zastosowania C++
Tam o wzorcach mówiliśmy. Największy nacisk był na wzorzec iterator. I właściwie na takie wsparcie – to połączenie operatora wywołania tworzące z operatorem wywołania paradygmat funkcyjny w języku C++. Nie atom. To są chyba takie najistotniejsze rzeczy, przynajmniej takie, które mi się rzuciły w oczy i to już od kiedy się tam językiem C++ interesuję. Bo zanim się Javą zainteresowałem, to już chyba z 20 książek kupiłem. Nie to, żeby wszystkie przeczytał, wiadomo, ale większość przeczytałem. Nie, no dobra, wszystkie te co mam z C++. I tam właśnie tam są takie ciekawostki. I właśnie z tych ciekawostek, no to wychodzi, że takie przeciążanie operatorów sensowne, plus te rzeczy, których nie ma w innych językach, głównie w zarządzanych, czyli zabawy z pamięcią, niskopoziomowe z alokacją – to są… to jest taka siła tego języka i pewnie to też może decydować o jakichś jego zastosowaniach czasami.
A tak jak już mówiliśmy o tych zastosowaniach i kontrasty zastosowań… Bo to, że akurat mam to szczęście być w projekcie, gdzie aplikację biznesową de facto się rzeźbi w C++, to niekoniecznie musi znaczyć, że C++ jest stworzony do aplikacji biznesowych. To tutaj widać to rozróżnienie, że jednak języki, nazwijmy je zarządzane, jak Java czy C#, one są bardziej do takich spraw.
Druga możliwość, natomiast te języki od strony C – te poniżej z C#… Bo jeszcze jest taki fajny język Objective-C, o którym nie wspomnieliśmy. On się też wywodzi z rodziny języków C, jest wzorowany na języku C. Naturalnie, bo jest kompatybilny z nim, czyli można nawet wstawki w nim robić. I jeszcze dodatkowo – nie chciałbym tutaj oszukiwać, ale nie wiem, czy nie ma jakichś tam naleciałości z takich tych archaicznych języków obiektowych jak Smalltalk na przykład. Czy tam się ktoś nie inspirował tym kiedyś? To tylko gdzieś tam jakiś malutki epizod miałem z tym związany, więc tutaj się nie będę jakoś strasznie rozwodził. Dziwacznie to wygląda w kodzie.
No ale z takich języków C-podobnych to właśnie C i C++ są używane do tych, na tych polach, gdzie jest wymagana duża wydajność – czy to w silnikach, czy to w sterownikach, czy gdzieś tam w jakiś takich wydajnościowo krytycznych miejscach, gdzieś w silnikach przy ograniczonych, ograniczonych zasobach. Muszą to być zasoby. To jakie byśmy nie mieli, one będą ograniczone zawsze, bo zawsze możemy docisnąć.
Oczywiście, że mamy jakiś limit wydajności, zarządzania embedded, tego typu…
O tak, tak, tak, to tam, to tam. Chociaż wspominaliśmy przy okazji czkawki o tych… To się zdaje się nazywa Diesel. Przynajmniej jedna z implementacji. Nie wiem czy jest więcej, ale o takiej kiedyś czytałem. To jest to właśnie maszyna wirtualna sprzętowa, tylko nie pamiętam, na której wersji, jak ona, na której wersji standardu ona operuje. Ale to gdzieś dawno było temu, więc to może być jakaś piątka czy coś. Pewnie jakaś starsza.
To często starsze są bardzo starsze.
Porównanie narzędzi programistycznych: C++ vs. Java
No to coś tam trochę o paradygmatach w C++ powiedzieliśmy. W ogóle o teorii tej niskopoziomowej i ciekawszych mechanizmach. To teraz można by było zacząć porównywać może te nasze światy? Nie, czyli porównać, a który lepszy?
No to tyle.
Oczekuję odpowiedzi. Oczywiście nie wiadomo, co tam od razu lepsze i… jak się tak patrzy w kodzik pisany na Linuksie, to od razu widać ten… Ale tak już na Windowsie, to to ciężko, ciężko. Głównie jakby tak się zabrać za porównanie narzędzi, to wychodzi na to, że nas, Javowców, wybitnie rozpieszcza duet Brain i IntelliJ IDEA.
No tak, to jest coś, co jest po prostu narzędziem niesamowitym i ja nie spotkałem się z lepszym narzędziem. A jeszcze pamiętam, nie tak dawno, bo z 15 lat temu, broniłem się przed tym jak przed ogniem, bo miałem dobrego Eclipse’a i mówiłem: „na co to komu?”. Kolega próbował mnie tu zachęcić. Nota bene 15 to może nie, ale 13 żeby było. I tak się stało, że wziął mnie i zachęcił do IntelliJ IDEA i od tamtej pory już nie mogę się zniechęcić, mimo że bezpłatny jest bezpłatny. Jednak za IDEA trzeba trochę zapłacić, ale to są dobrze wydane, dobrze wydane pieniądze. Jest to zdecydowanie to.
Nie wiem, co do tego można porównać. Tooling to jest ważna sprawa, bo to w tym tworzymy nasze aplikacje, więc musimy mieć to coś, jako narzędzia, których programiści używają na co dzień. To musi dobrze działać, bo to zresztą podobnie jak w testach jednostkowych, głównie w automatycznych w ogólności, ale w jednostkowych jest ważne, żeby te narzędzia śmigały dobrze. Bo inaczej ludzie nie chcą testów pisać.
Myślę, że są inne powody, też zresztą równie ważne, to dlaczego nie chcą tych testów pisać.
No, może jakiś jeden by się znalazł, ale takie narzędzie programistyczne to może być powód zniechęcenia do kodowania w niejednym fajnym języku. Jednak tutaj trzeba mieć na uwadze, że… że narzędzia, no przynajmniej te narzędzia, z którymi miałem okazję się zetknąć – bo mogę tylko z własnego doświadczenia powiedzieć – do języka C++ niestety ustępują Javie i jej duet Brain i Deutz, mimo że mamy na przykład też od JetBrains narzędzie CLion. To jest też taka IDE jakby tylko do C++.
No właśnie, to czemu miałaby być gorsza?
Otóż IntelliJ IDEA, IntelliJ Sense, czy jak on tam się nazywa, w IntelliJ IDEA już jest lepsze. To znaczy, w Pythonie podpowiadanie składni działa całkiem, całkiem zgrabnie. Jak się to porówna do Visual Studio w wersjach nawet najnowszych, to mimo wszystko jednak ludzie do Visual Studio instalują jeszcze ReSharper, czyli też narzędzie od JetBrains, które właśnie podmienia między innymi podpowiadanie składni. Można takie fajniejsze…
Jeszcze tak, nie wiem, z 20 lat temu krążyły legendy o tym, jak Visual Studio w wersji 6.0, jakież on ma wsparcie. Ale to wtedy było na tle Vima, który miał wsparcie słabsze. Ewentualnie Borland C++ albo…
Borland C++, który nie wiem, czy miał wsparcie jakieś tam. No chyba że jak tam co to musi zbudować…
No ale teraz właśnie mamy, możemy z tej samej stajni narzędzia porównać i IDEA mimo wszystko, zwłaszcza w tych najświeższych wersjach, wychodzi lepiej. Wiem, bo porównywałem to nie dalej jak wczoraj. Także mimo, że CLion jest porządnym IDE do C++, to jednak… no tak, tak wybornie jak w Javie IDEA sobie nie radzi. A i tak bywają projekty, gdzie po prostu trzeba siedzieć w Visual Studio i koniec. I wtedy Visual Studio mamy tak jak wspomniałem ReSharper, który jest jako plugin instalowany. Tylko, że Visual Studio jest na tyle uprzejme, że czasem na przykład informuje nas, że wykryto ograniczenie wydajności pluginu ReSharper, więc go wyłączę.
I wtedy najlepszym sposobem na włączenie go z powrotem jest wyłączenie Visual Studio i włączenie go z powrotem.
Nie.
No i tam się zetknęliśmy wielokrotnie z tym paskiem od garbage collector, w ogóle od zajęcia pamięci w tym Visual Studio. Może ten pasek jest i go się tam klika i tam coś tam zwraca. I bardzo przezabawny. Najlepsza zabawa.
Ale nawet mimo wszystko po godzinach użytkowania Visual Studio i klikania w ten pasek, zmuszanie narzędzia jest i tak o kilka stopni łagodniejsze niż tak posiedzenie kilka godzin na takim Visual Studio projekcie, który ma na przykład – nie powiem, że 300 czy 8 modułów załadowanych – ale już przy kilkunastu potrafi doskwierać.
Może to był ten pasek do klikania, to by… przypomnę, po prostu wychodzi poza ekran.
No nie wiem, jak tam jest w Visual Studio, architektonicznie. Jaką tam ma pod maską, ale nie zdziwiłbym się, jakby był jednak w C# pisany. Ten nowy, przynajmniej ten nowy. Ja mam przyjemność lub nie siedzieć na Visual Studio 2019 i 2022, to w większości na 2019. Także ta 2019… Jak się odpali 2022, to widać już taki jakościowy, jakościową różnicę po prostu. Nawet na podstawie wyglądu. Czy cały ten UI jest taki bardziej…
IDEA po prostu tak jakby to wszystko zmierzało w jedną stronę, jak zresztą wszystkie ostatnio.
Chyba C# bardziej w tą stronę zmierza. Może zgodnie z nową wersją layoutu, który teraz stał się bardzo flat?
Najświeższy, taki najświeższy, że słyszałem ostatnio jak Visual Studio… tylko nie wiem, co jest jak co, bo jeszcze długa, bo obejrzę jakiś serial, który ma Origins w nazwie czy coś. Moja musi zobaczyć, jak to było. Przychylam się do tego, że skoro i IDEA miała swój jakiś tam styl i teraz idzie w stronę kanonu…
Tak, bo teraz bardziej i IDEA idzie w stronę chyba Visual Studio z tym spolszczeniem i jednak z ograniczaniem głosu. Tak, nie będę się sprzeczał, bo jakoś tak założyłem, że po prostu wszystkie one zmierzają w stronę jakiegoś takiego dark mode’a.
No chyba, że to się jakoś próbują dostosować do tego, żeby jak najbardziej tutaj o czytelność chodzi, nie? Tak, żeby to wszystko było jak najbardziej czytelne. Bo jak jest dobry kontrast i dobrze kolorki dobrane, oczu nie męczy, nie trzeba się bawić w nocne światło nocne, to wtedy się nawet lepiej o trzeciej w nocy pracuje.
Tak?
A może lepiej nie kodować o trzeciej w nocy, żeby nie trzeba było. Ale jak już trzeba, to… To się lepiej koduje!
No dobrze…
No tak, że ten Visual Studio ciutkę starszy, on tak trochę przypomina te starsze IDE. Nawet w tę stronę patrząc. Natomiast jeśli chodzi o samo oprzyrządowanie, to wiadomo, jakiś tam toolchain jest i tutaj i tam. Po stronie C++ ten toolchain Visual Studio jest taki bardzo mocno zintegrowany z Visual Studio, co jest jego i z IDE i z Violettą. Bo na pewno z poziomu Visual Studio EXE to odpala. Co to jest? Jest łatwo, beznadziejnie łatwo, bo się tylko ładuje te moduły do tego, do tam się to nazywa solution, do solucji, odpala się i się ma. Tak jak wielkim zielonym przyciskiem „Uruchom”.
Tak, jakby on taki zielony i wielki to strasznie nie jest. Ale okej, tak mniej więcej obrazowo. Natomiast jak to chcecie skryptować, to już gorzej, bo wtedy trzeba jakieś build cursors w odpowiedniej wersji, zgodnie z tym Visual Studio, bo… Ale wiadomo, ma swój kompilator, ma swój linker, stąd to takie beznadziejne błędy wyskakują bardzo często. Na stacku jest mniej, no bo mimo wszystko jakoś ludzie w takich chyba lepszych środowiskach kodują sobie.
No jeśli więc chodzi o skrypty, to po stronie Jawki spotkałem się z lepszymi wynalazkami, bo na przykład Gradle bajecznie to ułatwia. Tutaj mamy pełną potęgę języka, żeby to skryptować. To już nawet nie są czasy tamto.
Co do tego typu efektów, to jak już się wyzwolili z tych mrocznych narzędzi, to już teraz jest bardzo dobrze.
W świetle Jawki nawet czasami aż za bardzo można skomplikować ten proces, bo jednak nakodujemy tam drugie tyle co w właściwym projekcie. To już co kto tam mówi, nie mnie tam wnikać. Ale, ale skryptowe, takie na zasadzie – jak to się nazywa – wykonywalna konfiguracja. Bo tak to chyba nazywają. Ma swoje na pewno takie… no to taką swoją kuszącą stronę, że wiadomo, że jeżeli czegoś brakuje, to człowiek nierzadko zamiast tam szukać po jakichś tych różnych dziwnych miejscach pluginów do Gradle’a już gotowych, po prostu ubierze się tego paska i się go samemu zrobi. Nowe możliwości konfiguracyjne jest trochę trudniej. Natomiast tutaj pozostaje skrypt. W sensie, jeżeli takiego brzydala mamy, i pozostaje skrypt zgrupowania, przygotowania zgrupowania. I jeżeli jesteśmy na Windowsie, to powodzenia, bo to są skrypty takie osoby czy jakiś tam…
Nie no, przepraszam najmocniej, teraz to są te z PowerShell. Może PowerShell to dalej losowe, tylko że takie bardziej jakby chyba składnią nawiązują troszkę do… Przynajmniej czerpią troszkę z komend POSIX-owych. Oczywiście mogę uciec też do Git Basha na Windowsie i mieć C taką jedną, prawie, prawie gotowego Basha w prawie działającego Basha, co tam też może coś troszkę pomóc, bo skrypty shalowe po prostu tam pójdą te, które są zgodne z tym. No jak jesteśmy poza Windowsem, no to już hulaj dusza. No to już można sobie zgrupować w Shellu i pewnie też można skorzystać z narzędzi pokroju CMake, które już całkowicie zmieniają konfigurację, no i dają wtedy możliwość skorzystania z tego właśnie CLiona. W pełni to się ładnie integruje. Zresztą Visual Studio też się integruje z…
Zresztą już nawet to chyba fajnie pokazuje, że mamy taki troszkę dualizm, nawet jeśli chodzi o środowiska. Jeśli teraz mamy, chcielibyśmy mieć deweloperów na Windowsie i na Linuksie, to się okazuje, że nawet zwykłe budowanie już nie jest takie, takie proste, bo nie mamy jednego systemu.
Kiedyś był maks rozdział micro, ale to zawsze można do tego wrócić, ale chyba CMake wydaje mi się wykorzystywać w taki sposób. Zdziwiłbym się, gdyby nie było można.
Tylko, że mimo wszystko nawet toolchainy same w sobie to też jednak są platformo-specyficzne mimo wszystko, więc siłą rzeczy jednak jeśli język jest i artefakt, który chcemy wyprodukować, jest platformo-specyficzny, to i toolchain też będą musiały. Tam się roi od ifdefów i tak mimowolnie, czy to na poziomie, czy na poziomie języka jako takiego. Czyli jednak programowanie multiplatformowe…
To zdecydowanie na korzyść Jawki. No bo taka swoboda deweloperska, że możemy sobie tworzyć ten projekt na takim systemie, czy na takim. Tutaj nawet tego aż tak łatwo nie mamy nieosiągalnego. I te biblioteki, które są tak marketingowo przenośne, to one są przenośne na takiej zasadzie, że mają kod specyficzny dla platformy, po prostu pisany dla platformy. Ale żeby nie było, to kiedyś byliśmy też w takim projekcie, gdzie mieliśmy tą samą historię w C# po stronie C#, tylko że tam była… tam znowu było etnicznie. Tak, to może stąd wynikało, bo tam był trochę inny wynalazek. To może jeszcze uda nam się jakoś też porównać w stosownym momencie.
W każdym razie środowisko tak czy siak, z mniejszymi lub większymi bólami tu i ówdzie, można skonfigurować sobie i na jednym i drugim środowisku z jednym i drugim systemie, i z tym, z tym czy tamtym językiem, więc jakoś to, to będzie hulać. Da się to wszystko skryptować, też to wszystko pobudować gdzieś na jakiś CI. Jak więc tutaj, to już jakiś kolosalnych różnic nie będzie.
Różnice, które są zauważalne, to są na poziomie kompilacji i linkowania, bo tutaj to, że się coś w C czy w C++ skompilowało, to jeszcze o niczym nie świadczy, bo żeby to można było odpalić, jeszcze to trzeba zlinkować.
Java to już robi wszystko. Ma też te operacje podzielone, bo kompiluje klasę osobno, a linkuje frontami, więc też nie jest za różowo. I niekiedy się dowiemy, że coś, gdzieś, czegoś zabrakło.
Bez wyjątku.
No, class not found. No tak. Czy tam naprawdę są?
Tak, tak i w świecie C++ dowiemy się, że oczekiwano symbolu, ale się nie doczekano.
Chociaż bardzo symboliczne, bardzo symboliczne.
Chodzi o symbole…
Symbol i tam oczekiwano symbolu, ale go nie dostarczono, a czasem, jak oczekiwano, dostarczono dwa. To też niedobrze. Najlepiej jak oczekuje ktoś i ktoś inny mu dostarcza raz i wtedy już jest. Idea jest.
Albo się okaże, że ten symbol jest jakiś krzywy, bo tam gdzieś jakieś flagi się pomieszały i nam się biblioteka gdzieś tam skompilowana z jakimiś ustawieniami się po prostu nie linkuje z inną. I tyle.
Różnice w konfiguracji i testowaniu
Co do tego, że się tam kompiluje w konfiguracjach debug i release na przykład w Visual Studio, to już jest chyba powszechnie wiadome. Więc tam może się też okazać, że taka konfiguracja release’owa, co też mi się okazywało ze dwa razy w ostatnich miesiącach, po prostu nie działa tak jak debugowanie, czyli że na przykład różni się, różni się na poziomie zarządzania pamięcią. Nawet taka ciekawostka – nie miałem takiego buga, który nie występował w debug, a jak poszedł build release’owy, to od razu testy takie smoke test puszczony na gotowym artefakcie od razu wykrzyczał aplikacji. A u mnie śmigało bajecznie, bo u mnie w trybie debug w tych testach, które miałem, nie dochodziło nigdy do jakiegoś zwalniania pamięci. Być może nie znam. Być może to tutaj gdzieś tam… Już nie pamiętam dokładnie, o co chodziło. Chodziło na pewno o coś z pamięcią i ten, i po prostu obiekty się nie czyściły odpowiednio na release albo czyściły się za wcześnie. I wydaje mi się, że to był ten przypadek z tym czyszczeniem za wcześnie, bo ten, bo u mnie w debugu się mogły nie przeczyścić i wszystko śmigało i mi apka działała. A jak wyszły już flagi z kompilacji produkcyjne, to już niestety tam jest bardziej strict i wszystko się wtedy, kiedy miało się czyścić, się oczyściło. Zwłaszcza jak nam było gdzieś po drodze, to już nie ma przeproś. No i apka zaliczała crashe i trzeba było tam też pokombinować, żeby to tego wyszło.
Ostrożności zalecam dużo w testowaniu w trybie debug i release.
No tak, to są takie drobne różnice, ale robiące…
Różnicę. Jednak robią różnicę. I jeszcze jest jedna różnica robiąca różnicę. Też drobna, ale wkurzająca między Visual Studio a IDEą na przykład. To się w ogóle zdziwiłem, bo zapomniałem, że tak było od czasu tego projektu, w którym jestem od niecałego roku. To wcześniej katowałem w Visual Studio 6 gdzieś tak? Dwadzieścia lat temu? Niecałe, niech osiemnaście. Ale dwadzieścia naliczył. I nie pamiętam, czy tak było. Ale rzecz tyczy się takich wirtualnych folderów gdzieś tam w spisie, czyli w solution. I ten, i jak jest projekt odpowiednio duży, to to potrafi być wkurzające, kiedy się na przykład widzi, że gdzieś tam jest jakiś podkatalog w tym module, w którym coś tam teraz rzeźbię i chcę sobie znaleźć ten plik coś tam. Chociażby go skopiować gdzieś tam, ale ścieżka do niego jest całkiem inna, bo to dopiero w Properties. Jak widać, Visual Studio ma takie fajne XML-owe, XML-owy format do zapisu projektu. I on tam zapisuje w jakim wirtualnym katalogu siedzi. Co on totalnie oszukuje. Jak można mieć projekt skonfigurowany tak, że źródła leżą gdzieś tam w katalogu common gdzieś tam wysoko, a ten sam pliczek jest wielokrotnie dołączony? Zwłaszcza to nagłówków się tyczy, do modułów, w których jest wykorzystywany, bo czemuż by nie. Powodzenia z pływaniem takich zależności, jakby ktoś chciał kiedyś coś przenieść gdzieś. Albo nie wiem, coś gdzieś ukryć, cokolwiek. Jakby chciał zmienić po prostu rozłożenie klocków w takim dużym czymś. Nie, bo jak jest 300 modułów, to już rzecz nie jest najmniejsza. To struktura sama z siebie jest skomplikowana. Tam dołożymy jakieś, dołożymy warstwę abstrakcji, już warstwę, już mamy w ogóle pozamiatane. No i zetknąłem się z czymś takim właśnie, jak próbowałem to rozwikłać, bo albo mnie wkurzało, że tam coś się źle koduje, nie w tą stronę, co bym chciał. Jak sobie pożyczyłem jakiś moduł gdzieś tam do innego modułu, gdzie jest zależność cykliczna, to z miejsca pojawiła nie wiadomo skąd. Więc zacząłem tam szukać dziury w całym. I wtedy, wtedy jak grom z jasnego nieba spadła ta bolesna prawda, że to wcale nie jest tak, jak wygląda.
No tak.
No i zaprzestałem. Najlepiej już nie drażnić Visual Studio w takiej sytuacji.
I można by tam długo opowiadać o tych anegdotach, ale to kogo by to tam ciekawiło. Najważniejsze chyba już mamy, że IDEA lepsza i taka wersja lepsza. Chociaż tutaj muszę przyznać, że ani w CLion nie miałem za bardzo okazji teraz pokopać. Kiedyś tam przy okazji tematów dodatkowych wspominałem, że załadowałem smakowo projekt źródełka maszyny dawane w wersji 12. Udało mi się odpalić zlinkować, znaczy skompilować, zlinkować, odpalić i tam nawet coś podobnego. Tam właśnie szukałem tych pozostałości po klasie Object i to z poziomu CLiona. Więc tutaj to można było poczuć, jak to narzędzie się zachowuje w pełni. I właśnie wtedy było widać, że przynajmniej na tamte czasy – to było parę ładnych lat temu – że ten CLion jednak od ówczesnej IDEi odstaje. Zgaduję, że z tego powodu, że troszkę reguły między tymi językami się różnią. Tutaj chodzi głównie o deklaracje w C++.
Jak wiadomo, mamy deklaracje i implementacje, czyli to co siedzi w nagłówkach w plikach z rozszerzeniem .h albo jakieś pochodne. To jest to, gdzie deklarujemy jakieś rzeczy o widoczności takiej, jakiej byśmy chcieli. Natomiast to, co deklarujemy albo implementujemy w plikach implementacji innych, czyli C++ dla C będzie to C i .cxx, .cpp. Czasem to są .cpp, częściej na Windowsie. C++ to chyba bardziej takie źródełka linuksowe lubią. To są rzeczy prywatne dla jednostki kompilacji, czyli i dla danego, dla danej jakiejś tam klasy czy zbioru klas. Zależy co tam upchane w ten nagłówek i z czego to jednostkę kompilacji skonstruujemy. To właśnie tam trafiają takie rzeczy i nimi się interesuje głównie linker, więc jeżeli sobie coś zdefiniujemy w takim miejscu gdzieś tam jakimś spisie, to będzie to widoczne w obrębie tej jednostki kompilacji i linkowania. Więc tutaj zgaduję, że po prostu algorytm wyszukiwania dyrdymałów do podpowiadania jest troszkę inny niż w Javie i tu mogą być jakieś tam różnice, jeśli chodzi o to, nie, o łatwość tego podpowiadania.
Czasami wszystko na miejscu.
Pewnie jest trochę inne, ale z drugiej strony jest dość dobrze zdefiniowane. To nie jest przypadek drzewa skryptów, gdzie generalnie ciężko zrobić podpowiadanie składni, bo wyskakuje na początku jakiekolwiek podpowiadanie 1000 różnych znalezionych fragmentów takich samych.
To jest ciekawe rzeczywiście, czy to jest chociaż… No ale teraz to bazuje na tym z takich doświadczeń sprzed kilku lat. Nie wiem, jak teraz ten obecny CLion się zachowuje. A nie mogłem tego sprawdzić z racji tego, że projekt się buduje tylko i wyłącznie na Visual Studio. Więc może musiałbym spędzić najpierw kilka dni, konfigurując go, żeby po prostu się zbudował w pełni. Natomiast taki niebudujący się projekt będzie miał trudności z znajdowaniem symboli, bo na przykład to, co mi Visual Studio napisze – zresztą nie jest takie trudne – to nie jest tajemnica. Co innego poindeksować pliki, a co innego zbudować ich faktyczne zależności.
Tak, w zależności od.
Tak, tak, tak, tak.
Więc tutaj, tutaj nie mogę do najnowszego CLiona się odnieść. Ale biedak i tak na surowych źródłach, bo używałem go. Ciekawostka. Właśnie do takich pomocniczych zagadnień jak wyszukiwanie chociażby full textowe. Bo jak w Visual Studio zacząłem coś wyszukiwać, to czasem się to kończyło przeładowaniem Visual Studio.
Kolejna rzecz to Find Usage. Działa bardzo dobrze, bardzo szybko. Rzeczywiście tak jest, bo i bardzo dobry mechanizm indeksowania. Oni musieli to wcześniej zrobić. To co ja zrobiłem z tym słownikiem po indeksować wszystkie morfemów w klasach nie zabrakło pamięci roboczej.
Za to nie trzeba tak wszystko robić na raz i to…
Dokładnie.
Poza tym klikali po potem pasków indeksów. Łatwiej było niż nie miałem paska. No ale ten Visual Studio na przykład potrafi zatkać wyszukiwanie albo to, co CLion w tle mając Visual Studio kompiluje haszcze, potrafi mi znaleźć i wyświetlić to. Visual Studio nawet nie potrafi zacząć wyszukiwać, jak i skąd skompilować. Zdaje się na dzień dobry.
No poza tym zauważyłem, że może mam źle ustawione jakieś parametry pamięciowe, ale bym go nie podejrzewał, bo raczej powinien być dopasowany i w większości przypadków działa, ale jak mi wskazuje, bo ma też ten pasek, tylko nieklikalny, jak dochodzi do 1/4 gigabajta, to wtedy lubi klęknąć sobie. Wtedy to już nie polecam wyszukiwać w nim po całości całej solution, bo to już na pewno się nie powiedzie, nie? No i wtedy odcina ReSharper, bo stwierdza, że ograniczono mu wydajność, bo to jest największy problem na największy.
Bo jeszcze ReSharper coś…
Jeszcze mówi, że wróbel taki biedny.
No dokładnie.
Takich tam pogłówkować, chłopaki w tym Microsofcie zrobili dobrze. Trzeba go parę razy wyłączyć na dzień, ale da się coś tam zrobić ostatecznie. To trochę taki syndrom Eclipse.
Jak są teraz.
Tak, dawało dokładnie to takie same wrażenia przez te wycieki. Zawsze trzeba było go tam parę razy dziennie przeczyścić, bo inaczej to… i tam na przykład niektóre jakieś properties się nie ładują. Może tylko ja mam taką przypadłość, bo ja to przeważnie mam takie przypadłości: ze wszystkim działa, a u mnie nagle nie. I klikam gdzieś tam na jakieś takie, taki wynalazek jak property pages. I tam się poszczególne strony ustawień tam nazywają tymi property page. Niby słusznie. I nie wiem, skąd on je bierze, bo mi czasem renderuje w ogóle w innym rozmiarze niż niż reszta i widzi na przykład lekko pomniejszone, tak jakby po prostu brał viewport gdzieś go tam przeskalował i wciskał w to normalne IDE. Jak on to robi, ale wygląda to czasem ostro i mrocznie.
Takiego ifame’a to oni za pierwszym razem mieli wyświetla pustego, bo się nie załadował, nie malował się, więc muszę mu kliknąć obok i z powrotem i już wtedy jest.
Aha, no i jeszcze muszę się poskarżyć na jedną, bo jak się tam… Bo to jest taki projekt w takiej fajnej bibliotece do GUI, co się nazywa biblioteka i też ma swoje lata. W więcej ma tych lat niż ten w żyłach. Chociaż niebo, bo patrząc po kolei wersjami, to chyba jakoś tak powstawały równolegle i w którymś momencie mam wrażenie, że nawet było, że Visual Studio był w tym pisane, ale tutaj nie chcę nic zmyślać. No i tam ta biblioteka operuje na windowsowych plikach tych zasobów, w których się opisuje taką sobie, mniej lub bardziej śmieszną składnię, co zawierają kolejne okna. I na przykład jak się tworzy taki plik, on się .rc nazywa, czy ma rozszerzenie .rc w Visual Studio, i gdzieś tam się go nie dotknie, czy coś tam, wystarczy go otworzyć i zamknąć, i za drugim razem się go nie uda otworzyć przeważnie, bo Visual Studio mówi, że jest otwarty w innym edytorze. Więc nie ma konieczności otwierania go w innym edytorze.
Visual Studio otworzywszy go samemu, stwierdził, że otwartych Nowhere nie uznaje siebie jako siebie samego.
Widocznie ma jakieś rozdwojenia edytorów czy coś w ten deseń. No dobra, ale nie pastwię się już na nich, bo tego jeszcze im się zrobi przykro. Robi biedak.
Co? Może jeszcze mamy do porównania narzędzia do testowania? Ja też znowuż mogę porównać te narzędzia, z którymi ja miałem styczność. Miałem z kilkoma bibliotekami JUnit testów po stronie C++, no i wiadomo, że w C# z NUnit i XUnit, no to tutaj nie ma co oszukiwać to, żeby nawet Boost.Test czy Google Test czy cokolwiek, co test ma w nazwie, stawało na rzęsach, to nie pobije Spocka. To już nawet JUnit chyba…
Chyba niewiele rzeczy pobije szybkość pisania testu, no i łatwość konfiguracji.
Spock i Groovy. Tutaj to trzeba przyznać, że to jest de facto DNA, bo nie ma, nie ma zawodnika na to. Nie ma tak. Mimo że na przykład Boost.Test udostępnia wszystkie rodzaje asercji, jakie tam sobie jakieś, jakich potrzebujemy na co dzień. Ostatnio nawet porównywałem zawartość kolekcji, także coś takiego też da się, da się bezproblemowo zrobić. No i ma, ma wsparcie do testów parametrycznych. To jako że to są jedne z moich ulubionych i bardzo się opłaca wszystkie przypadki prześwietlić. W sensie cały ten kodzik legacy, jaki się testuje, dobrze jest zaorać wszystkimi możliwościami, jakie tylko przyjdą na myśl.
Zwłaszcza, że taki kod zawsze dużo przypadków ma przypadków.
Jak dołączają do projektu to i to chyba w tym akurat obszarze, w którym ja wbiłem, było z 250 czy coś. Teraz jest 600 coś. Także tam trochę dopisałem, ale tylko troszeczkę. Ale właśnie to, to za co można tego Boost.Testa pochwalić, to jest właśnie ten wynalazek do testów parametrycznych. To to, że w miarę dobrze się je pisze. I tam wiadomo są, są takie, są różnice głębokie na pierwszy rzut oka między Javą, C++-owym światem, czy tam między Spockiem w ogóle. No, Spock.
Tabelka jest po prostu oczywiście, ale zrobiłem tabelki w C++, tylko musiałem sobie strukturki na przypadki testowe podefiniować i czasami jakieś takie in place mutatory do różnych tam stanów wyjściowych obiektów, więc to się wszystko da zrobić. To, to zresztą w C# to podobnie by się robiło, bo jakbym na przykład pisał testy, które porównują i czytam, wywołują ileś tam możliwych akcji na jakimś tam obiekcie biznesowym, to muszę zastopować. To też bym zrobił jakiś wzorcowy obiekt, który ma stan invalid na samym początku i w tę tabelkę wrzucałbym te valid i ich jakieś funkcje, które mi modyfikują do takiego stanu, w jakim setup muszę mieć w tym teście. Także to by bardzo podobnie wyglądało i de facto porobiłem sobie takie tabelki tutaj, także nie muszę też narzekać na to.
Narzędzia do mokowania też istnieją w C++ w tych testach i w boostowych i dobrych. Akurat używamy w projekcie GMocka. To jest od Google’a wynalazek, więc on najlepiej z testem sobie się spina, ale też można mokować poza Google Testem. Jako, że nie lubię mokować, to nie muszę go używać. Ponadto jest prosty. Jest, bo jest i to by się przydał ze dwa razy, jak już nie było wyjścia. Ale nie jest tak łatwo jak Spock.
No na pewno nie dla mnie.
Przyjemność kodowania i ewolucja języków
Także tutaj porównanie na korzyść zdecydowanie świata Javowego. I nie będę tu owijał w bawełnę, jakkolwiek lubię właśnie w C++ się popisać. Zresztą ja to chyba lubię i w Javie, w Javie się chyba jest kwestia genialnych narzędzi. Ostatnimi czasy się po prostu bajecznie prosto składa z klocków w C++. Jak się narzędzie ma pokonfigurowane też znośnie, to też w miarę idzie. Kompilacja może trwa troszkę dłużej – znowuż to jest kwestia pewnie narzędzi, bo od strony Visual Studio patrząc, to może troszkę dłużej zajmować niż takie odpalanie kodu na żywca, oklepanego i podpowiadanego przez IDE. Ale mimo, że C++ ma pilota, ja to nie używałem. Ja to jednak wolę tak sobie sam napisać.
Chyba jeszcze nie masz zbiorowej inteligencji internetu.
To samo. Jak się czyta takie internetowe mądrości, to włos się jeży na głowie.
To nie w modzie, to nie na tych mądrościach się uczył.
Musielibyśmy go zapytać, ale czy się przyzna?
Skłamie po wysłaniu, a później przeprosin… I przeprosin, zawsze przeprasza.
Jakbym miał to teraz porównać pod względem przyjemności kodowania, to mi jest bardzo ciężko wybrać, bo w Javie przekazałem większość swojego zawodowego życia i Javę po prostu uwielbiam.
No i też.
Jawki koleżanki to jakieś jej firmowe języki i kolegów.
Natomiast C++ ma ten swój urok, że tam zawsze ma strzelić gola.
Więcej emocji.
No i ma tą wieloparadygmatowość i w ogóle fajnie taki kodzik wygląda. Napisany w C++ wygląda troszkę inaczej niż w Javie, mimo że są składnie podobne.
Od razu widać profesjonalizm.
Wszystko jak jest profesjonalnie napisane, oczywiście. To tak, bo jak jest tak „na fb na kolanie”, to to też plus. Ale na pewno jak się tak pokoduje w C++, zwłaszcza po kodowaniu w Javie długo, to widać geniusz twórców. Jednego i drugiego, właściwie nie ma, ale w C++ są takie konstrukcje naprawdę dobrze przemyślane, językowe.
No takie…
Geniusz twórców jednych i drugich. Na pewno duża dawka czerpała właśnie z tych, z tych problemów, które C++ miał i tutaj widać trochę tę ewolucję. To nawet tego jak widać na ograniczeniu ficzerów, jakie zarejestrowano, nie musiała tego wszystkiego, co je do stosunku Java, Java…
James Gosling.
Nie mylić z Ryanem Goslingiem.
Właśnie miałem pytać.
To chyba nie jest rodzina.
Bardzo często podkreśla w wywiadach czy ogólnie rzeczach, które pisze, że jednak nie rodzina, że jednak jej rodzina to, to jedną rzecz podkreśla, a drugą rzecz taką mniej ważną, to właśnie podkreśla to, że przy tworzeniu Javy bardzo mocno brali pod uwagę to bezpieczeństwo w kontekście właśnie czy to wskaźników, czy tego typu rzeczy, żeby tego się absolutnie nie dało zrobić, bo w tamtych czasach, czyli…
To prawie jak z Kapitanem Bubu.
Przełom lat 80. i 90. Masa błędów, masa bugów pochodziła ze zbędnego użycia wskaźników i zazwyczaj 70–80% bugów pochodziło z tego jednego źródła wskaźników, ogólnie złego użycia wskaźników albo jakiegoś obchodzenia tych wskaźników tam, gdzie wszystko potrafiono, wszystko. I właśnie przez to są to błędy. I właśnie do tego twórcy do Adobe właśnie i Gosling tutaj dojrzeli. A takiego powiedzieliście, się nie powinno tak se dać, żeby ci deweloperzy raz, że nie mogli tego robić, nawet jeśli chcieliby. A dwa, że ci co nie wiedzą, a robią błędy, żeby tego nie mogli. Ładnie. I to na bardzo na celu postawili.
Dlatego trzeba im przyznać, że osiągnęli to aż do Mango.
Bo rzeczy, które można było zrobić, dopiero niedawno można robić.
No tak, ale z drugiej strony przez wiele lat nie zrobiliśmy milionów błędów, które można, ale można to zrobić, nawet nie wiedząc na czasie. Te miliony gwiazd, które…
C++ jest naturalną koleją, bo oni popełniali błędy. No, a my zaczęliśmy, my zaczęliśmy później. Uczyliśmy się na błędach. Na naszych błędach będą się uczyć nasze wnuki, nasze wnuki, którzy będą, którzy będą programować jako piloci już bez rozróżnienia na język, tylko w dowolną stronę. Napisz mi tu, proszę, szybko coś z tym AI kolejnym albo czat wypity, to już będzie to.
Błędy popełnia, bo to już naprawdę fajny baner. Taki ten budynek, taki wielki blok, taka wielka płachta na nim. „Hej, czat czy GPT, finish this building?”
Może i do tego. Czasem jak już będzie, to wiesz co teraz?
Wybór języka i Legacy Code
No tak, każdy język ma swoje takie za i przeciw. Jak ktoś lubi faktycznie, jak ktoś lubi bezpieczeństwo składni, niemożność zrobienia sobie krzywdy, to zdecydowanie Javę też polubi. Tym bardziej, że współczesna Java już nawet generics ma dużo bliżej do templates niż ta miała wcześniej w wersji 5, na przykład, gdzie na brownie czy co tam jeszcze było takiego w tej piątce? Coś tam dali. A dali enum klasy. Tak, ale nie mogły być generyczne. Dobra, nie będę tutaj sobie przypominał na siłę, ale coś takiego było, że tam się zachłysnął świat Javowy, że „Uff, nareszcie mamy to, co w C++ już mieli dawno, tylko dostali to w takiej wersji, nic poniżej. Nic się nie dało z tym zrobić sensownego, za bardzo.” Oczywiście ja tutaj troszkę konfabuluję, wyolbrzymiam celowo, oczywiście przedstawienia…
Naturalny kontrast.
No ale jak ktoś z kolei lubi powiew adrenaliny, to polecam mu C++, bo tam na pewno tego nie brakuje. Ale z drugiej strony, to też już o tym mówiliśmy. Mimo że od czasu poprawnego użycia tych możliwości C++, za które sam język daje właśnie w oparciu o struktury i o mechanizm RAII, wszystkie konstrukcje związane ze smart kontenerami albo smart jakimiś zasobami, nie wyłączając sekcji krytycznych, w oparciu o takie mutexy czy jakieś smart locki, to nie da się ukryć, że język C++ jest bardzo nowoczesny i już. Zresztą jego nowoczesność widać możliwości stosowania domknięć na funktorach w roku… Wiem, dwutysięcznych, gdzie takie to się dopiero obiekty robiło. Pierwsze nieśmiało pytanie, czy można było operator nie przeciążyć tak, żeby nam ten jeden obiekt funkcyjny zablokował gdzieś tam?
No tak, obydwa języki są fajne. A jako że mieliśmy kiedyś projekt Legacy w Jawce i ja teraz siedzę w takim projekcie w C++, to możemy się pokusić o jakieś porównanie, które Legacy jest lepsze.
No, Legacy C++ jest lepsze. Wiadomo.
Który Legacy jest lepszy? Legacy C++ jest lepsze o tyle, że tam jest większy bałagan, łatwiej tam o bałagan. No dobra, żartuję. Ten taki sam bałagan widzieliśmy i w tej naszej IDEi. Chyba dla kasy chorych kasy chyba nie ma, bo krzemień nie zawsze robi się w technologiach legacy. Częściej powstaje jednak ze zmiennej domeny i tak naprawdę. Takie biznesowe Legacy jest chyba też większym problemem tak naprawdę.
No bo tutaj Legacy…
Model Legacy, model Technical Legacy oczywiście też istnieje. Pewnie, ale chyba jeśli to jest tylko techniczne, to są pewne ścieżki, jak to naprawić i jak podejść do tego problemu? Bo to jest jasna droga A do punktu B na wersji takiej do wersji takiej. Więc to tak…
Tak to w książkach ładnie piszą.
Tak, to dlatego tak mówię. Nie wiadomo też i od tego punktu A do B zmierzaliśmy. I właśnie często to się kończyło o trzeciej w nocy.
Nikt nie mówił, że to jest prosta droga, taka łamana albo…
Bo to między wzgórzami, fields i wzgórzami.
I te przepaście są co chwilę, nie tak jak mówisz. Największym problemem jest zapewne właśnie przez to żałość modelu i… no i fakt, że tam wszystko było przez lata takie przyrostowe. To wciąż biznesowo…
Nieprzemyślany biznes. To dobra. On mógł być przemyślany w sobie, lokalnie, ale później nagle ewoluuje.
Cały czas taki doklejamy. Tak naprawdę nie mają tego sedna dobrze zdefiniowanego i cały czas doliczamy do LE plamy, aż to wszystko w końcu się troszkę, troszkę obsypuje. Troszkę już klejenie nie pomaga, no ale te same konstrukcje albo przynajmniej zbliżone, które stosowaliśmy w Jawce, można też zastosować w C++ do radzenia sobie z tym. I czy to będą jakieś de facto… Wprawdzie nie mamy takiego wsparcia genialnego, chyba żeby zmusić do tego, jednak do takich de facto linków jak IDE, co nam daje? Ale można to robić tak po części na piechotę i tam wiadomo wspierać się testami. Testy są też cięższe do pisania dla mnie przynajmniej po stronie C++-owej, ale też się da to zrobić. No i można ich naklepać tyle, żeby się upewnić, że ficzer działający.
Frameworki GUI i specyfika Windowsa w C++
Zaś do frameworków GUI to mam wrażenie, że ten z Jawki był fajniejszy. W sensie, że mniej tam było można strzelić sobie w stopę, a to dlatego, że on po prostu… Mimo, że obydwa projekty były na Windowsie, bo i tamten dodatkowy też mieliśmy.
Ściemnia się, ściemnia się. To chyba powinno się robić.
Trzeba kończyć.
No to już kończę, także ten. Tamten był też Javowy, pisany i uruchamiany pod Windowsem, ale z racji tego, że to była Jawka, to ta biblioteka GUI-owa akurat przykrywała całego Windowsa. A tutaj mamy Windowsa na wyciągnięcie ręki.
Czy teoretycznie jesteśmy bliżej, ale…
Jesteśmy bliżej, bliżej metalu. Ale co nie znaczy, że to jest lepiej, bo… bo tutaj na przykład ze wszystkich przypadłości Windowsa można sobie zechcieć skorzystać. No i jak to w projekcie Legacy skorzystano. I ten, na przykład, jak się siada od takiego kodu, to dobrze jest dowiedzieć się, a ja się dowiedziałem, zawsze było za późno, że nie należy wywoływać funkcji SendMessage
w momencie, kiedy już taka funkcja się wykonuje dla innego okna. De facto widać, że wszystko jest ok. Nie każdy element GUI-za to jest jakieś tam okno i dlatego to się nazywa. I taki SendMessage
to po prostu, dopóki się nie doczyta w dokumentacji, można mieć wrażenie, że on wysyła wiadomość przez coś, że mamy wiadomość, coś. I on robi SENT
, czyli wysyła. Otóż nie, bo on po prostu woła o funkcję obsługi tego komunikatu w tym komponencie, do którego te wiadomości wysyła. Więc może być deadlock, jeżeli już mamy, jesteśmy w tej samej funkcji. I jeszcze raz wołamy coś i na przykład nam się zrobi pętelka, bo ktoś do nas też coś wyśle z takiego swojego handlera, który my zawołaliśmy, on nas zawoła i tak w kółeczko. Także tutaj może się coś stać mniej przyjemnego niż w Javie. A poza tym to chyba podobnie.
Podsumowanie i pożegnanie
Tak mi się wydaje. I tu, i tu krzaki, czyli wrażenia ogólnie podobne. Wrażenia ogólnie podobne. Tak jak powiedziałem, ja tam C++ lubię praktycznie na równi z Jawą.
Vegasa też lubisz, ale ja w ogóle wszystko lubię.
Proszę Państwa, programista idealny.
No i to.
Nie dla nas kryptowaluty.
Niespecjalnie.
A to jeszcze pewne są braki.
Tutaj trzeba szukać. Nigdy nie wiem, czy tamte trzy równa się dać, czy dwa.
No właśnie. No właśnie nie wiem. Nie nauczę się tego chyba. Na szczęście Visual Studio to robi.
Chyba ona chce te trzy dodać.
Bo jeśli chcesz też porównać typy, to poprosimy o trzy. Ale jeśli zakładasz, że nie musisz typów porównywać, tylko jak ci przyjdzie string, to mogą być też dwa.
No to tak samo możesz sobie zrobić w C++, tylko nie wiesz, jaki operator porównania wywołany, bo przecież użyłeś przy tym to jeszcze, jeszcze. Ale tam twoi koledzy operator też go na pewno przeciążają. I fajne jest to, jak na przykład porównuje taki łańcuch znaków char*
z na przykład z jakimś tam c-stringiem. Można to zrobić? Czemu niby nie? No bo jest po prostu operator porównania przeciążony czasami, a czasem bywa tak, że jest operator porównania przeciążony w kilku typach i on kaskadowo, bo kompilator dojdzie do wniosku, że ten typ się rzutuje na ten, jest automatyczna konwersja, więc z tego czego się robi w locie, to później coś tam i z tego ostatniego wysypuje się operator.
No tak. Jesteśmy dopiero dziedziczenia, a jeszcze tak ciężko wtedy dojść. Wtedy trzeba poprzedzić tam pewną ścieżką. Operator nie może wygląda inaczej.
Na szczęście takie rzeczy się nie robi, bo po co?
Jeśli jest to możliwe, na pewno ktoś to, ktoś to zrobi.
Ja to nawet zrobiłem kiedyś. Dlatego musi się tym pochwalić, że próbowałem wyłuskać z takiego diamentu milczenia właśnie to, co chciałem i trzeba się tam było odwoływać po wszystkich, wszystkich klasach po kolei.
No tak, czyli jednak nie ma jasnej odpowiedzi. Albo przynajmniej nie podasz nam tutaj.
Nie zaryzykuję. Szwecja.
Sorry.
No dobrze, czyli chyba zostaniemy. Zostaniemy z tą konkluzją, że do każdego zastosowania trzeba dobrać odpowiedni tooling.
Język. Dokładnie.
Lis, jak z tym młotkiem i gwoździami?
No właśnie.
Nie wszystko byśmy chcieli młotkiem załatwić. Każdy problem młotka.
No cóż, nadal fajnie. Fajnie też wiedzieć, jak to wygląda po drugiej stronie barykady. Zwłaszcza jeśli, jeśli, jeśli mamy okazję gdzieś tam faktycznie pogrzebać i coś tam sprawdzić, to już chyba dobrze też zobaczyć, jak robi się rzeczy w innych miejscach i językach.
Dobrze jest w ogóle samemu porobić to, jak się ma okazję.
Można sobie coś zaradzić.
Może Ty docenisz swoje własne podwórko?
No dokładnie, bo chociażby właśnie dotykając tych innych narzędzi, można stwierdzić, że jednak, jednak u mnie – tu wstaw nazwę języka – nie jest tak źle jak w grafice.
Dokładnie tak.
No dobra, to chyba na ten moment w kwestii takiego szybkiego porównania C++ z Javą i światów, to chyba dobrnęliśmy do końca.
Wydaje mi się. Chyba tak, przynajmniej to takie wstępne porównanie. Może temat powróci jeszcze.
Może powróci tak o jakimś gdzieś tam w odcinkach debowych.
Zapożyczeniem, a może tematach? Może powrócić? Coś na pewno z tym związanego. To miejmy nadzieję, że do następnego odcinka to też Michał by już miał okazję popisać jakieś porządne gry w stylu typu: „Ej, żebyśmy teraz porównali, jak się używa C++, C++ w branży gier”.
Co to za wałki?
Dobra, dobra, dzięki.
Dzięki. Do następnego. Następnego.