29 sierpnia 2019

C# - samouczek, część II - “Witaj Świecie!” czyli omówienie składni na podstawie najprostszego programu

Jakoś tak przyjęło się, że ucząc się nowego języka wypada stworzyć na nim jakiś program. Tradycyjnie jest to aplikacja, której jedynym zadaniem jest przywitać w imieniu użyszkodnika świat. Ponieważ tradycja ta jest nieszkodliwa - i ponieważ tak twierdzi tytuł tego wpisu - także i ja nie zamierzam porzucić tego zwyczaju.


Zacznijmy więc coś kodzić - w poprzednim wpisie poleciłem IDE Microsoftu znane szerszej publiczności jako Visual Studio (wersja dla użytkowników prywatnych ma swojej nazwie słowo Community i jest wystarczająca dla zdecydowanej większości zastosowań). Aby stworzyć program, który umożliwi nam powitanie ze światem musimy w pierwszej kolejności stworzyć sobie nowy projekt (screeny są z VS 2017, ale dla innych wersji zasada jest podobna):


i wybrać jego typ:


Warto od razu wyrobić sobie nawyk porządnego nazywania swoich aplikacji i biblioteki - inaczej szybko grozić nam będzie organizacyjny burdel, który może być szczególnie bolesny, gdy będziemy chcieli znaleźć kawałek kodu do ponownego wykorzystania. Po kilku miesiącach w morzu katalogów ConsoleApp (lub podobnych) jest to nieco trudniejsze niż się człowiek spodziewa. Idąc więc za swoją radą nazwę swój program HelloWorld. 


Po kliknięciu OK naszym pełnym samozadowolenia oczom ukaże się kod prawie gotowego programu. Należy go uzupełnić o dosłownie jedną linijkę by dotrzeć do celu. Aby tego dokonać musimy wiedzieć nie tylko co napisać, ale też i gdzie. Przyjrzyjmy się więc temu, co już mamy:


using System;
using System.Collections.Generic;
using System.Text;
4  
5  namespace HelloWorld
6  {
7      class Program
8      {
9          static void Main(string[] args)
10         {
11         }
12     }
13 }


A jak widać trochę się tutaj dzieje. Na początek na warsztat bierzemy pięć pierwszych linijek:


using System;
using System.Collections.Generic;
using System.Text;
4  
5  namespace HelloWorld


Pierwsze co rzuca się w oczy to słowo kluczowe “using”. Oznacza ono, że posiłkować się będziemy instrukcjami zawartymi klasach, bądź bibliotekach poza przestrzenią nazw zdefiniowaną w piątej linijce naszego programu. Czym są klasy i biblioteki zajmiemy się ciut później. Na tą chwilę wystarczyć powinna wiedza, że ułatwiają one współdzielenie kodu pomiędzy wieloma aplikacjami, a biblioteki dodatkowo mogą być napisane w innym języku niż ten w którym piszemy. Przestrzeń nazw, to takie ustrojstwo, które ułatwia nam trochę smarowanie kodu rozpisanego w kilku klasach. Możemy wtedy trochę mniej szczegółowo opisywać gdzie dokładnie znajduje się instrukcja, której chcemy użyć. Żeby było śmieszniej tak naprawdę już w tych pierwszych linijkach odwołujemy się nie tylko do biblioteki “System”, ale też i do zdefiniowanych w niej przestrzeni nazw “Text” oraz “Collections” i zawartej w niej podprzestrzeni “Generic”. O tym, że schodzimy w dół po zależnościach świadczą użyte w nazwie kropki. 


Jeśli cały powyższy akapit brzmi dla Ciebie jak bełkot możesz to sobie póki co w głowie przedstawić jako różne grupy instrukcji, które nie są normalnie zdefiniowane w czystej wersji języka i nie zagłębiać się w szczegóły. 


Każdy wiersz “Using” kończy się średnikiem, który oznacza koniec instrukcji. Chociaż wydawałoby się, że instrukcję kończyć powinien znak końca linii (czyli tzw. ENTER), to jednak tak nie jest. wielokrotne spacje, tabulatory, czy “entery” właśnie są przez język właściwie ignorowane w większości przypadków. Jak to się więc przekłada na pisanie kodu? Otóż tak, że zarówno taki zapis:


using System; using System.Collections.Generic; using System.Text;


jak i taki zapis:


using 
    System;
using 
    System.Collections.Generic;
using 
    System.Text;


Będą poprawne. Na pierwszy rzut oka może się to wydawać zbędnym utrudnieniem, ale w tym szaleństwie jest metoda - dzięki niej można tak przedstawić kod, aby jego czytanie było w miarę wygodne. Osobiście dość często korzystam z możliwości zapisania wywołania funkcji w kilku wierszach w sytuacji, gdy pokazanie całego kodu wymagałoby przesuwania widoku w oknie na boki.


Następnie mamy mały, ale dość istotny znak:
6         {
oraz jego nieodłączny braciszek:
13        }


Oznaczają one blok kodu. Nie ważne jaki blok - jakiś. To może być zawartość klasy, funkcji, czy zestaw instrukcji do wykonania po spełnieniu jakiegoś warunku. Każdy otwierający nawias musi mieć zamknięcie, każdy zamykający - najpierw musi być otwarty. Od tej zasady nie ma wyjątków, ale na szczęście ani IDE, ani tym bardziej kompilator nam tego nie przepuści. Trzeba zwracać naprawdę dużą uwagę gdzie i jak umieszcza się nawiasy klamrowe - beztroskie ich rozrzucanie tu i tam skończyć się może kilkugodzinną sesją grzebania w kodzie z hasłem “bo mi tu nie działa!”. Aby się nie zagubić w tym bałaganie bardzo pomocne są wcięcia - bloki kodu będące na tym samym poziomie mają identyczną głębokość wcięcia. IDE Visual Studio będzie się starało w tym pomóc, ale nie zawsze sobie samo poradzi.


Wreszcie dochodzimy do:


7      class Program


C# jest językiem obiektowym i naprawdę wszystko jest w nim obiektem. Aby powstał taki obiekt, potrzebna jest instrukcja jego wykonania i tą instrukcją jest właśnie klasa. W tej linii definiujemy więc klasę program, która jest przepisem na wykonanie obiektu. Tak jak w życiu - jeden przepis możemy wykorzystywać wiele razy i tak samo jest w programowaniu obiektowym - jedna klasa może “dać życie” wielu obiektom. Do tego co można zrobić z klasami (i po co) jeszcze wrócimy. Na tą chwilę wiemy już jak ją zadeklarować.


Na koniec zostaje to co najważniejsze:


9          static void Main(string[] args)
10         {
11         }


Deklaracja funkcji. Dzieje się tu naprawdę dużo. Najpierw mamy tutaj słowo kluczowe “static” oznacza ono, że funkcja którą deklarujemy może być wywołana bez tworzenia jakiegoś konkretnego obiektu z naszej klasy. Drugie słowo kluczowe “void”. Normalnie w tym miejscu deklaracji funkcji powinien stać typ zmiennej jaki zwróci nam funkcja. Ponieważ jednak typów zmiennych jeszcze nie znamy (niektórzy być może jeszcze nie wiedzą co to jest zmienna - spokojnie, będzie wyłożone później) nie chcemy, aby nasza funkcja zwracała cokolwiek, albo aby dosłownie zwróciła nam nic - “void” to w angielskim “pustka”, czyli nasze upragnione nic. Następne słowo “Main” to nazwa naszej funkcji. W językach z rodziny C, czy też C-podobnych jest to funkcja wywoływana zawsze na starcie programu. Następnie “(string[] args)”. Tutaj naprawdę dużo się dzieje i bez zahaczenia o typy zmiennych (i to złożone) ciężko będzie dokładnie wytłumaczyć co się dzieje. Wytłumaczę więc rzecz póki co po łebkach, a z czasem wszystko stanie się jaśniejsze. Otóż w tym nawiasie definiujemy co ma być wejściem dla naszej funkcji (najczęściej dane, choć nie zawsze), ale dla nas póki co najwazniejsze, że ten nawias może być też pusty. W tym konkretnym wypadku będą to argumenty jakie można wpisać po wywołaniu programu w linii poleceń.


Skoro więc jesteśmy w głównej (“Main”) funkcji naszego programu, to właśnie tutaj napiszemy linijkę kodu , która pozwoli przywitać nam świat. Wpychamy się więc pomiędzy nasze nawiasy klamrowe i piszemy:


Console.WriteLine(“Hello World”);


Zacznijmy od tego, że wielkość liter jest ważna w większości języków programowania i C# niej jest tutaj wyjątkiem. Czasem może to prowadzić do pomyłek w kodzie, bo łatwiej nam zapamiętać tekst tak jak on brzmi, a nie jak jest napisany. Na szczęście tutaj też IDE okaże się nam wielce pomocne podpowiadając, które nazwy są dostępne z uwzględnieniem wielkości liter. W przypadku VS najważniejszym wg mnie skrótem klawiszowym jest Ctrl+spacja. Włącza on podpowiedzi, które pozwalają szybko ogarnąć jak jeszcze można pomęczyć nasz kod. Dobra, tyle naskrobałem, a ani słowem nie wytłumaczyłem o co chodzi w linii kodu jaką każę wam wpisać.No to jedziemy. “Console” jest to klasa statyczna (czyli zawierająca same funkcje statyczne - a co to jest już wiemy), która pozwala nam pastwić się nad konsolą, czy jak kto woli wierszem poleceń. “WriteLine” dosłownie znaczy “PiszLinię” i dokładnie to robi - wypisuje linię tekstu na konsoli, natomiast jako argument naszej funkcji wpisujemy w nawiasach “Hello World” (razem z cudzysłowami, a dlaczego - o tym przy okazji typów zmiennych).


Możemy teraz radośnie kliknąć ikonkę:
lub wcisnąć klawisz F5.


Zachurkocze, zafurkocze coś tam mignie jakieś czarne okienko i natychmiast zniknie, a w okienku pod kodem przeczytacie coś w stylu:


(kod 0 oznacza, że nasz program skończył się prawidłowo).


Niektórzy z was - ci nie mający okazji dobrze poznać specyfiki systemu Windows - mogą poczuć się oszukani, no bo jak to?! Program się skończył, a nic nie było widać. Otóż było widać - przez ułamek sekundy w czarnym okienku, które nam mignęło na ekranie. Nie trzymając nikogo dłużej w niepewności podpowiem jak się dobrać do tego wyniku. Przesuwamy wzrok na prawą część ekranu i klikamy prawym przyciskiem myszy “Rozwiązanie XXX” (gdzie XXX to nazwa naszego projektu), a następnie wybieramy:


Co otworzy nam okienko eksploratora w lokalizacji, gdzie znajduje się nasz projekt. Musimy jednak dostać się do folderu “Debug” który można odnaleźć według schematu poniżej (lądujemy w folderze zaznaczonym niebieskim tłem, a chcemy się dostać do folderu zaznaczonym niebieską, nieregularną figurą, która miała być piękną elipsą.
Gdy już tam będziemy trzymając klawisz SHIFT klikamy prawym przyciskiem myszy gdzieś w polu naszego okna i otrzymujemy (w zależności od zainstalowanych programów zawartość okienka może się różnić od trochę do bardzo, bardzo):


I klikamy “Otwórz tutaj okno programu PowerShell” - w Windows 7 będzie to coś bardziej w stylu “Otwórz wiersz poleceń tutaj”, ale jako, że siódemki już jakiś czas nie używam, to dokładnie nie pamiętam (ósemki nie używałem wcale, więc kompletnie nie wiem co tam wypisuje). Jeśli wyskoczy nam niebieskie okienko wpisujemy:
.\helloworld 
(wielkość liter nie ma znaczenia), a jeśli czarne to możemy radośnie pominąć dwa pierwsze znaki (przy założeniu, że komputer ma standardową konfigurację).


Jeśli nic nie wybuchło i kod został prawidłowo przeklejony (bo nie wierzę, żeby ktoś go przepisał - a warto, bo wtedy IDE fajnie siecze podpowiedziami) to wtedy nasz program się z nami przywita.


Gratulacje - omówiliśmy Twój pierwszy program (mój jakoś nie - ja jakoś zaczynam naukę nowych języków od napisania symulatora oddziaływań grawitacyjnych, ale ja to w ogóle dziwny jestem).

17 sierpnia 2019

C# - samouczek, część I - wprowadzenie.

C# to (za wikipedią) obiektowy język programowania opracowany przez firmę Microsoft pod koniec XX wieku. Symbol krzyżyka użyty w nazwie ma nawiązywać do przejścia jakościowego podobnego jak pomiędzy C a C++ (gdzie znak krzyżyka ma jest jakby czterema plusami).

Przyznam szczerze, że mając w pamięci upierdliwość programowania w czystym C objawiającym się takimi kwiatkami jak działanie (lub nie) programu w zależności od liczby linii w kodzie (w tym linii zawierających tylko komentarz, bądź tylko znak końca linii) bardzo długo odrzucałem C++ i C# jako języki, których chciałbym się nauczyć. O ile jednak C++ jakoś do tej pory nie stał mi się specjalnie bliski o tyle C# w swojej czystej formie jest dość prosty, lekki, łatwy i przyjemny, więc nauczenie się go było niejako czystą przyjemnością.

C# jest językiem bardzo uniwersalnym. Umożliwia pisanie programów konsolowych (czyli takich, które komunikują się z użytkownikiem za pomocą komunikatów wyświetlanych w linii poleceń), łatwe pisanie programów zawierających elementy graficzne systemu windows (standardowe przyciski, okna dialogowe etc.), oraz niestandardowe elementy interfejsu (ponieważ wszystko jest obiektem do wszystkiego można przypisać odpowiednie zdarzenia i je obsługiwać, w ten sposób np. obrazek może funkcjonalnie stać się przyciskiem). Ponadto język ten umożliwia pisanie aplikacji webowych, obejmując zarówno frontend (to co widać), jak i backend (czyli silnik pod spodem). Ponadto dość łatwo w C# zaimplementować wielowątkowość.

Z ciekawostek - C# jest jednym z języków w którym można pisać skrypty w środowisku do tworzenia gier Unity. C# ma też składnię bardzo podobną (jeśli nie identyczną) do języka JAVA, jednakże jest pozbawiony kilku z jej upierdliwości - m.in. maszyny wirtualnej, która zżera zasoby jak opętana, czy ręcznego zarządzania pamięcią. Zresztą w początkach istnienia tego języka uznawany był za “kolejny, głupi klon JAVY”. C# jest też językiem który nie jest kompilowany do kody wykonywalnego. Jest on kompilowany do kodu pośredniego, który następnie jest wykonywany przez środowisko .NET. Daje to pewną bardzo fajną właściwość, jaką jest możliwość zmiany kodu w trakcie jego wykonywania. Bardzo ułatwia to poszukiwanie błędów w kodzie i ich poprawę.

Na koniec warto by było wspomnieć o tym czego używać do pisania programów w C#. Teoretycznie do pisania kodu używać można jakiegokolwiek edytora tekstu zapisującego pliki w formacie czysto tekstowym. Wygoda takiego rozwiązania pozostawia jednak sporo do życzenia, dlatego moim zdaniem najlepiej korzystać z rozwiązań zwanych IDE (Integrated Developing Environment), czyli zintegrowanych środowisk programistycznych, które oprócz edytora kodu i kompilatora zawierają wiele narzędzi do debugowania (“odpluskwiania”, czyli usuwania błędów) zawierają też dokumentację języka, bądź umożliwiają łatwy dostęp do niej online. Dla C# obecnie najpopularniejsze IDE to Visual Studio (istnieje darmowa, nieźle rozbudowana wersja dla zastosowań edukacyjnych, dla małych przedsiębiorstw i dużych projektów open source) do pobrania ze stron Microsoftu.

W kolejnej części (o ile kiedyś powstanie) - trochę o składni języka na podstawie słynnego “Hello World”.

P.S.
“Prętem po jajach”

10 sierpnia 2019

Bo na zachodzie to…

Ze śmierdzącego śmietnika, nad którym latają muchy wysypują się śmieci. Rzecz dzieje się prawie że w centrum dużego miasta. Założę się, że niejeden by pomyślał - na zachodzie to by się nie zdarzyło, tam dbają o porządek. Inne miasto, tym razem takie niewielkie. Już z daleka słychać idiotę bez tłumika, który najpierw siedzi jakiemuś dziadkowi na zderzaku, a potem z głośnym rykiem silnika i umcy-umcy wydobywającym się przez okno wyprzedza, bo za chwilę z piskiem opon i pasażerów poślizgiem przejechać skrzyżowanie. Na zachodzie - nie do pomyślenia. Kolejne duże miasto. Duże skrzyżowanie poza centrum. Zapala się zielone światło, ktoś zamula ze startem i zostaje natychmiast otrąbiony przez pozostałych. Dzicz, nie to co zachód. 

A jednak zachód. Taki śmietnik i wiele innych identycznych widziałem w Atenach, idiotę w dresowozie widziałem w Reading (pod Londynem), a niecierpliwych kierowców w Hamburgu. Przykłady można mnożyć. Przez wiele lat wierzyliśmy, że Europa Zachodnia to takie nasze Shangri-La - mityczna kraina szczęśliwości, tudzież Eldorado - miasto ze złota. Ale zachód to tacy sami ludzie jak my, z bardzo podobną kulturą pozbawioną po prostu wymuszonych, radzieckich wpływów (u nas też jest ich coraz mniej).

Myślę, że mentalnie już dogoniliśmy, albo prawie dogoniliśmy kraje Europy Zachodniej, żyje się tutaj nie najgorzej, zarabia wreszcie całkiem znośnie, nawet problemy mamy już te z których słynie raczej pierwszy świat. Nie mamy się więc czego wstydzić, nie mamy po co “wstawać z kolan”, ani po co deprecjonować własnych osiągnięć naukowych. Nawet ostatnie badania odnośnie uczciwości wykazały, że nie tylko w niczym nie ustępujemy, ale też przewyższamy naszych kolegów z wydawałoby się uczciwszych krajów starej UE.

Oczywiście nie w każdej dziedzinie jest różowo - ciągle nie potrafimy zrobić porządnego filmu, który byłby w stanie odnieść światowy, komercyjny sukces. Nie mamy swojego przemysłu samochodowego, bardzo mało projektujemy i wytwarzamy produktów z branży zaawansowanych technologii (mimo iż - przynajmniej w teorii - odpowiednią wiedzę mamy).

Podsumowując - nie mamy się czego wstydzić - no może poza turystami napędzanymi 500+, którzy zaczynają nam zdobywać niechcianą sławę na miarę turystów brytyjskich, czy niemieckich. Nie możemy jednak póki co usiąść na dupie i nic więcej nie robić, bo mamy jeszcze sporo do zrobienia w tej materii.

P.S. Jak to wyczytałem w nagłówku jednego z portali “Tylko w Polsce zwykły poseł może odwołać marszałka sejmu”.

„Obrażać też trzeba umieć!”

W zasadzie ten jeden cytat wystarczyłby za cały wpis. Nie wiem, czy w tym ukopanym kraju uchował się jeszcze ktokolwiek powyżej 25 roku życi...