Rozdział 1. Wprowadzenie

Adam Boduch

Wielu ludzi tak naprawdę ma mylne wyobrażenie o programowaniu. Branża ta przesiąknięta jest wieloma mitami, jakby było to zajęcie niezwykle trudne, którym trudnić się może jedynie geniusz matematyczny. Nic bardziej mylnego! Programowanie nie jest wcale trudne. W dobie języków programowania tzw. wysokiego poziomu należy opanować pewne podstawy, nauczyć się „myślenia programistycznego”, a poznawanie bardziej zaawansowanych technik jest kwestią czasu i dobrych chęci.

W tym rozdziale zaprezentuję kilka kluczowych pojęć, którymi posługują się programiści, a których Ty również będziesz używał często i po prostu musisz je znać. Czy zastanawiałeś się kiedyś, jak to się dzieje, że aplikacje są uruchamiane, wykonują jakieś czynności? Jak to się dzieje, że działają? Jak powstają programy? Jeżeli nie znasz odpowiedzi na te pytania, ten rozdział jest dla Ciebie obowiązkową lekturą przed przystąpieniem do faktycznej nauki języka.

1 Czym jest programowanie
     1.1 Mnogość języków programowania
     1.2 Edytory kodu
     1.3 Kompilatory
     1.4 Mity związane z programowaniem
          1.4.1 Nauka programowania zajmuje wiele lat
          1.4.2 Narzędzia programistyczne są drogie
          1.4.3 Wszystkie języki są podobne
2 Języki programowania
     2.5 Asembler
     2.6 Fortran
     2.7 C
     2.8 C++
     2.9 Perl
     2.10 PHP
     2.11 Turbo Pascal
     2.12 Java
3 Język maszynowy
4 Działanie kompilatorów
     4.13 Tworzenie kodu źródłowego
     4.14 Prekompilacja
     4.15 Kompilacja do kodu Asemblera
     4.16 Optymalizacja kodu
     4.17 Asemblacja
     4.18 Konsolidacja
5 Języki interpretowane
6 Język C#
7 Instalacja środowiska
8 Jak się uczyć
     8.19 Nie ucz się na pamięć!
     8.20 Początkowe trudności
     8.21 Pomoc systemowa
     8.22 Praktyka
9 Pierwsza aplikacja
     9.23 Kompilacja i uruchamianie
     9.24 Komponenty
          9.24.4 Właściwości komponentów
     9.25 Piszemy kod
     9.26 Zapisywanie projektu
10 Podsumowanie

Czym jest programowanie

Czym jest programowanie komputerowe? Na pewno spotkałeś się z tym określeniem nie raz — czy to podczas oglądania telewizji, czy przeglądając prasę, czy też w życiu codziennym. Z drugiej strony wiele osób w ogóle nie wie, co to pojęcie tak naprawdę oznacza. Przeciętny człowiek może nieco mylnie wyobrażać sobie programistę jako człowieka w grubych okularach, który całe dnie spędza przed komputerem obłożony fachową literaturą. Na pewno zdarzają się i tacy zapaleńcy, być może dlatego, że… programowanie jest ciekawe! Tak, jest ciekawe, ale z drugiej strony trzeba mieć predyspozycje do takiej pracy. Jeżeli ktoś zabiera się za programowanie z przymusu, to pewnie nie będzie miał z tego żadnej przyjemności. Jednak jeśli samodzielnie napisany program (choćby nie wiem jak był skromny) przyniesie swojemu twórcy poczucie satysfakcji i dumy — zapewne programowanie wciągnie go jeszcze bardziej.
Programowanie, ogólnie mówiąc, polega na rozwiązywaniu pewnych problemów. Jest to dziedzina zajmująca się tworzeniem oprogramowania. Niezłym przykładem jest liczydło. Liczydło służy do wspomagania człowieka w poważniejszych obliczeniach matematycznych. Celem programisty jest napisanie programu, który wspomoże człowieka przy wykonywaniu naprawdę trudnych obliczeń.

Programista, jeśli chce zrealizować zadanie, musi zapisać pewien algorytm, korzystając z ciągu instrukcji rozpoznawalnych przez komputer. Wszelkie polecenia w danym języku programowania są oczywiście wpisywane przy użyciu klawiatury.

Algorytm to zestaw instrukcji, czynności, które należy wykonać, aby zrealizować pewne zadanie w skończonej liczbie kroków.

Oczywiście nie mogą to być dowolne polecenia i instrukcje, lecz takie, które mogą być rozpoznane przez kompilator. Język programowania jest więc sposobem na przekazanie maszynie pewnych poleceń do wykonania. Kompilator natomiast jest narzędziem wspomagającym programistę w jego ciężkiej pracy. Tłumaczy on polecenia języka programowania na instrukcje procesora (szczegółowo o tym powiem w dalszej części rozdziału). Mówiąc ogólnie — na podstawie tych instrukcji tworzy aplikację wykonywalną.

Obecnie istnieje wiele narzędzi, które wspomagają programistę podczas tworzenia aplikacji. Jak to wygląda w środowisku MS Windows? Przede wszystkim potrzebujemy edytora tekstu. Edytory wspomagające cały proces programowania przeważnie są podobne do typowych edytorów tekstu systemu Windows — programów z oknami, menu oraz ikonami. W owym edytorze wpisujemy jakieś polecenia — dajmy na to w języku C#. Oczywiście nie mogą to być byle jakie polecenia, lecz takie, które będą zrozumiałe dla kompilatora.

Kod źródłowy, potocznie zwanym źródłem, zazwyczaj jest tekstem zawierającym różne polecenia języka programowania. Kody źródłowe są czytelne dla człowieka, programisty, który może je w dowolny sposób modyfikować.

Kompilator może być zintegrowany z edytorem, ale może to też być zewnętrzna aplikacja.

Mnogość języków programowania

Istnieją setki różnych języków programowania (kilka z nich pokrótce omówię w dalszej części rozdziału), mniej lub bardziej popularnych. Niektóre z nich prawie w ogóle nie są używane, inne natomiast są tak znane i powszechne, że każdy szanujący się programista powinien znać przynajmniej ich podstawy.

Można zadać sobie pytanie, po co istnieje tyle języków programowania. W końcu byłoby znacznie łatwiej, gdyby istniał jeden język, którego używaliby wszyscy programiści. Ewolucja w świecie komputerów wymagała jednak nowych narzędzi — prostszych, szybszych i potężniejszych. Ludzie z natury są leniwi i lubią upraszczać sobie życie, tworząc coraz lepsze rozwiązania, w tym wypadku pozwalające łatwiej i szybciej programować.

Generalnie języki programowania można podzielić na kilka kategorii w zależności od stopnia trudności, możliwości czy przeznaczenia. Np. do tworzenia aplikacji na stronach WWW (tzw. skryptów) bardziej nadaje się język PHP, gdyż jest prosty, szybki i zapewnia dużo możliwości. Język Perl, pomimo że również się do tego nadaje, jest trudniejszy, programowanie w nim nie jest tak szybkie i przyjemne, aczkolwiek można go użyć do innych czynności. Język C natomiast daje większą możliwość manipulacji komputerem, jest bardziej zaawansowany. Nie wspominając już o Asemblerze, który daje nam niesamowite możliwości, lecz jest bardzo trudny. Jak widzisz, język jest tylko narzędziem w rękach programisty, który musi go odpowiednio wykorzystać zależnie od sytuacji.

Od razu uprzedzę Twoje pytanie. Nie ma najlepszego języka programowania, uniwersalnego, łatwego, szybkiego i potężnego. Zdolny programista wybierze odpowiedni język (narzędzie) w zależności od swoich potrzeb.

Edytory kodu

Edytorów kodu jest mnóstwo. Kod możesz pisać nawet w najprostszej wersji Notatnika z systemu Windows. Na rynku istnieje wiele aplikacji (zarówno darmowych, jak i komercyjnych) wspomagających proces powstawania programów, udostępniających wygodne funkcje przydatne przy edycji kodu.

Bardzo zaawansowany, umożliwiający pisanie i kompilowanie aplikacji w C# jest pakiet Borland Developer Studio firmy Borland (<url>www.borland.pl</url>). Jest to produkt komercyjny umożliwiający również pisanie aplikacji w języku Delphi oraz C++.

Innym środowiskiem popularnym wśród programistów C# jest narzędzie Visual Studio 2005. Umożliwia programowanie i kompilację aplikacji napisanych w językach C++, C# oraz J#. To narzędzie również jest komercyjne. Firma Microsoft udostępniła jednak wersje uboższe, lecz darmowe, które można ściągnąć za darmo ze strony firmy Microsoft (http://msdn.microsoft.com/vstudio/express/default.aspx).

Na rysunku 1.1 zaprezentowano środowisko Visual C# 2005 Express Edition, dzięki któremu z powodzeniem można pisać aplikacje w języku C#.

sharp1.1.jpg
Rysunek 1.1. Środowisko Visual C# Express Edition

Kompilatory

Obowiązkowym narzędziem programisty jest kompilator. To on umożliwia generowanie aplikacji wykonywalnych na podstawie kodu języka. Środowisko Visual C# Express Edition (ale również Borland Developer Studio) ma wbudowaną obsługę kompilatora języka C#. Napisałem „wbudowaną obsługę”, gdyż kompilator C# jest dostarczany za darmo wraz ze środowiskiem .NET Framework (o platformie .NET opowiem w kolejnym rozdziale). Jest to aplikacja o nazwie csc.exe, wykonywalna z linii poleceń, dlatego też dosyć niewygodna.

W związku z tym polecam środowisko Visual C# Express Edition, które umożliwia proste kompilowanie napisanej aplikacji. Jego także będę używał w trakcie prezentowania przykładów w niniejszej książce.

Mity związane z programowaniem

W ludzkiej świadomości istnieje wiele mitów i przekłamań związanych z programowaniem. Na samym początku nauki pragnę wyjaśnić pewne wątpliwości, które mogą zrodzić się w Twojej głowie.

Nauka programowania zajmuje wiele lat

Każdy z nas ma indywidualną zdolność do nauki. Zależy również, kiedy mogę powiedzieć, że znam dany język. Czy umiejętność pisania prostych programów wystarcza, abym mógł o sobie powiedzieć, że jestem programistą? To również sprawa indywidualna. Chociaż programuję wiele lat, wciąż się uczę, poznaję nowe techniki oraz technologie.

Jeżeli mówimy o umiejętności pisania aplikacji na własne potrzeby, to to nieprawda, że nauka programowania zajmuje wiele lat. Obecne języki programowania są tak skonstruowane, aby można było jak najszybciej wykorzystać ich możliwości.

Jeżeli mówimy o doświadczeniu, które należy nabyć poprzez ciągłe pisanie aplikacji, to tak — nauka trwa długo. Dobrym programistą zostaje się po kilku latach doświadczenia.

Narzędzia programistyczne są drogie

Fakt — są drogie, lecz istnieją darmowe alternatywy. Np. bardzo popularny zestaw kompilatorów GCC jest zupełnie darmowy, również do zastosowań komercyjnych. Niektóre firmy, takie jak Microsoft czy Borland, mają zaawansowane, drogie narzędzia programistyczne, lecz udostępniają również ich uboższe wersje darmowe (nie do zastosowań komercyjnych).

Wszystkie języki są podobne

To nieprawda. Sama idea programowania jest taka sama, w wielu językach stosuje się podobne mechanizmy, ale stwierdzenie, że wszystkie są podobne, jest dużym uogólnieniem. Jeżeli pytasz, czy łatwiej nauczyć się programowania, mając już doświadczenie w innym języku, to tak — jest to prawda. Szczególnie języki Java, JavaScript, C, C++ oraz C# są do siebie na tyle podobne, że nauka drugiego, kiedy znamy już jeden, nie powinna stanowić problemu.

Języki programowania

Jak już powiedziałem, kod programu musi być zapisany w określonym języku programowania (np. w tej książce prezentuję programy w utworzone w C#). Istnieją dziesiątki języków programowania — bardziej lub mniej popularne oraz bardziej lub mniej skomplikowane. Każdy z tych języków wyróżnia się inną składnią i innym sposobem działania. W swojej „karierze” możesz się spotkać z następującymi językami:

*Ada,
*Asembler,
*Algol,
*Basic,
*QBasic,
*QuickBasic,
*Turbo Basic,
*Visual Basic,
*C,
*C#,
*C++,
*Clipper,
*COBOL,
*Fortran,
*Haskel,
*Java,
*JavaScript,
*LISP,
*Logo,
*PHP,
*Pascal,
*Perl,
*Python,
*Prolog,
*Smalltalk,
*Tcl.

To jest tylko przykładowa lista dostępnych języków programowania. Pokrótce omówię te z nich, które miały duży wpływ na rozwój informatyki.

Asembler

Asembler jest niskopoziomowym językiem programowania zaprojektowanym w latach 1947 – 1952 przez Grace Hopper. Asembler był w gruncie rzeczy rewolucyjny — uwalniał programistę od konieczności zapisywania programów w formie binarnej. W tym języku jedno polecenie praktycznie odpowiada jednemu rozkazowi procesora. Obecnie Asembler jest uważany za trudny język programowania (w porównaniu np. z Delphi czy C#), ale wciąż bywa używany. Podstawową zaletą Asemblera jest to, że daje niesamowite możliwości w manipulowaniu komputerem. Większość języków wysokiego poziomu pozwala na włączanie wstawek Asemblera do swojego kodu. W praktyce wygląda to tak, że podczas pisania kodu — np. w Pascalu — możemy do tworzonego programu dołączyć fragment kodu Asemblera. W ten sposób większość obecnych programów nie jest pisana w całości w Asemblerze (ze względu na dość skomplikowaną składnię), ale zawiera wstawki tego języka. Przykładowo, system operacyjny Linux był pisany w języku C, mimo to nie obeszło się bez zastosowania fragmentów kodu Asemblera.

W powyższym opisie znajdują się dwa pojęcia — język wysokiego oraz niskiego poziomu. W praktyce czynnikiem rozróżniającym język poziomu wysokiego od niskiego jest złożoność. Przykładowo, Pascal jest językiem wysokiego poziomu, bo zawiera gotowe funkcje i procedury (np. do wyświetlania tekstu na ekranie służy komenda writeln) i dzięki temu jest łatwy do nauczenia się. Również projektowanie aplikacji w językach wysokiego poziomu jest o wiele szybsze niż w Asemblerze. W Asemblerze w celu wyświetlenia tekstu na ekranie nie obejdziemy się bez obsługi odpowiedniego przerwania.

Pojęcie przerwania związane jest z systemem operacyjnym, a konkretnie z procesorem. Przerwanie powoduje wstrzymanie aktualnie wykonywanego programu i wykonanie przez procesor kodu procedury obsługi. Jest to pojęcie związane z bardziej zaawansowanymi aspektami programowania, nie musisz teraz się tym przejmować.

Fortran

Nazwa Fortran jest utworzona od angielskich słów Formula Translator. Fortran jest uważany za pierwszy język wysokiego poziomu. Został zaprojektowany w latach 50. XX wieku przez Johna Backusa i zespół IBM. Fortran jest wykorzystywany przede wszystkim do pisania programów służących do analizy numerycznej i do wykonywania skomplikowanych obliczeń naukowych. Język ten zyskał niesamowitą popularność i jest używany do dzisiaj (jako nowy, ulepszony język programowania — Fortran 90, Fortran 95 oraz Fortran 2000).

C

Rok 1969 był rewolucyjny w informatyce. Wszystko za sprawą dwóch osób — Kena Thompsona oraz Dennisa Ritchiego. Zaczęli oni pracę nad nowym systemem operacyjnym — UNIX. Przy tej okazji Dennis Ritchie na bazie języka B opracował język C, który miał ułatwić pisanie tego systemu operacyjnego. W 1973 w języku C utworzono jądro systemu UNIX, co było wielkim sukcesem. Języka C używano na początku jedynie w firmie Bell Labs (gdzie powstał), jednak wkrótce stał się dominującym językiem programowania, wykorzystywanym na całym świecie — i tak jest do dzisiaj. Język C charakteryzuje się wysoką wydajnością, jest stosunkowo prosty (o wiele prostszy od Asemblera), a jednocześnie niezwykle elastyczny.

C++

W roku 1983 Bjarne Stroustrup zmodyfikował język C, dodając do niego nowe funkcje. Przede wszystkim rewolucyjną zmianą w porównaniu z C jest możliwość programowania obiektowego. To zagadnienie zostanie dokładniej omówione w dalszej części książki. C++ (na początku miał nosić nazwę „C z klasami”) jest również niezwykle popularnym językiem programowania, często stosowanym przez programistów na całym świecie. Języki C oraz C++ są do siebie bardzo podobne, więc jeśli znamy jeden z nich, łatwiej przyjdzie nam nauka drugiego.

Perl

Perl (ang. Practical Extraction and Report Language) jest interpretowanym językiem programowania autorstwa Larrego Walla, bardzo często wykorzystywanym jako język skryptowy na stronach WWW. W zamyśle autora język Perl miał pomóc w rozwiązywaniu trudnych zadań oraz przyspieszać pracę nad programem.

Perl nie jest kompilowanym językiem programowania. Oznacza to, że nie następuje kompilacja programu, czyli przekształcanie kodu napisanego przez programistę do postaci pliku wykonywalnego. Zamiast tego w komputerze musi być zainstalowany tzw. interpreter, który będzie odczytywał instrukcje języka i odpowiednio na nie reagował.

Naturalnym środowiskiem Perla jest system UNIX, aczkolwiek język ten jest także dostępny w wersjach przeznaczonych na inne platformy. Bardzo często jest wykorzystywany podczas tworzenia skryptów CGI przeznaczonych dla stron WWW. Obecnie Perl jest wypierany przez młodszy i prostszy język PHP, choć świetnie się nadaje się do pisania skryptów manipulujących plikami tekstowymi.

Obecnie najnowszą, wciąż rozwijaną wersją tego języka jest Perl 6.

CGI, czyli Common Gateway Interface, jest obecny praktycznie od początku istnienia internetu i stron WWW. CGI umożliwia dynamiczne generowanie stron WWW, czyli w praktyce pisanie tak różnych skryptów jak księgi gości, fora dyskusyjne itp.

PHP

PHP (angielski akronim rekurencyjny PHP Hypertext Preprocessor) jest językiem programowania, który w ostatnich latach robi oszałamiającą karierę. Autorem tego języka jest Rasmus Lerdorf, który napisał pierwszą jego wersję w roku 1995. PHP — podobnie jak Perl — jest interpretowanym językiem programowania, wykorzystywanym głównie do generowania dynamicznych stron WWW. Jego zaletą jest niezwykła prostota i jednocześnie duże możliwości. Ogólnie rzecz biorąc, PHP jest jednym z najprostszych języków programowania.

PHP jest darmowy, oparty na licencji GPL (ang. GNU Public License) i rozwijany w dalszym ciągu przez setki programistów z całego świata.

Turbo Pascal

Początki Pascala jako języka programowania sięgają początku lat 70. XX wieku. Opracowano go specjalnie do nauki programowania. Jest to bardzo prosty język, dający jednocześnie duże możliwości. W roku 1983 firma Borland wypuściła na rynek komercyjny produkt o nazwie Turbo Pascal i ta data jest uważana za przełomową. Turbo Pascal natychmiast zyskał popularność, którą w dalszym ciągu utrzymuje.

Także dzisiaj Turbo Pascal jest zalecany do nauki programowania dla początkujących: uczy myślenia programistycznego. Jest wykorzystywany również na różnych szczeblach nauczania: na studiach czy w szkołach średnich do rozwiązywania problemów i tworzenia algorytmów.

Java

Język Java został opracowany przez firmę Sun Microsystems. Każdy z pewnością nieraz słyszał o tym języku, gdyż ostatnio stał się on bardzo popularny, głównie dzięki niezależności od systemu operacyjnego. Z reguły programy napisane i skompilowane dla platformy Windows nie będą działały w innych systemach, np. w Linuksie. W przypadku Javy jest inaczej, ponieważ kod źródłowy nie jest kompilowany na kod maszynowy, tak jak to ma miejsce w innych językach programowania, ale zostaje poddany procesowi translacji na kod pośredni. Ten z kolei zostaje poddany procesowi interpretacji przez tzw. maszynę wirtualną, która musi być zainstalowana w systemie.

Można powiedzieć, że maszyna wirtualna jest programem, który wykonuje inne programy. W przypadku Javy maszyna wirtualna interpretuje kod pośredni.

Maszyna wirtualna Javy została zaimplementowana dla większości systemów operacyjnych i dzięki temu ten język programowania jest tak uniwersalny.

O maszynach wirtualnych opowiem w kolejnych rozdziałach tej książki.

Język maszynowy

Na ostatnich stronach padło wiele nowych pojęć, takich jak kompilator, kompilacja, translacja czy język interpretowany. Aby nieco usystematyzować tę wiedzę, powiem kilka słów o tym, jak właściwie działają aplikacje i czym jest język maszynowy.

Typowy program przeznaczony na platformę Windows ma rozszerzenie .exe i zwykło się o nim mówić plik wykonywalny. Jest to plik w formacie PE (ang. Portable Executable) zawierający m.in. skompilowaną wersję kodu źródłowego, tzw. kod maszynowy. Kod maszynowy jest postacią gotową do bezpośredniego (lub pośredniego) wykonania przez procesor. Oprócz kodu maszynowego plik wykonywalny zawiera również informacje charakterystyczne dla systemu, stąd niemożliwe jest uruchomienie takiej aplikacji na innych systemach operacyjnych.

Typowym żądaniem uruchomienia aplikacji jest podwójne kliknięcie ikony reprezentującej dany program. Wówczas system operacyjny ładuje taką aplikację do pamięci, skąd jest wykonywana przez procesor.

W każdym bądź razie najważniejsze jest, abyś zapamiętał, iż kod maszynowy to skompilowana wersja kodu źródłowego gotowa do wykonania. Istnieje również pojęcie języka maszynowego. Jest to również język programowania polegający na zapisywaniu instrukcji jako liczb, które są rozkazami pobieranymi przez procesor. Teoretycznie rzecz biorąc, istnieje możliwość operowania na skompilowanym kodzie maszynowym. W taki sposób powstawały pierwsze aplikacje, gdy nie istniały kompilatory (pierwszy kompilator musiał zostać napisany w kodzie maszynowym). Dawniej więc programowanie było profesją, którą zajmowali się najlepsi, gdyż była to czynność niesamowicie trudna. Taka technika nie jest już wykorzystywana (lub szczególnie rzadko), nie będziemy już do niej wracać w dalszej części książki.

Działanie kompilatorów

Wiesz już, czym są kompilatory. Ważne dla zrozumienia dalszej części książki jest poznanie zasad ich działania.

Obecnie kompilatory są niezwykle szybkie — pozwalają na skompilowanie programu nawet w kilka milisekund (w zależności od rozmiarów kodu). Jednym z najpopularniejszych na świecie darmowych kompilatorów jest GCC (ang. GNU Compiler Collection), czyli darmowa kolekcja kompilatorów.

Popularność GCC jest na pewno związana z kilkoma czynnikami:

*ceną (kompilator jest darmowy),
*niezawodnością (kompilator jest tworzony od ponad 10 lat przez rzeszę programistów),
*dostępnością dla różnych platform (Windows, Linux, DOS, UNIX),
*możliwością kompilacji kodu napisanego w różnych językach (Java, C, C++ i inne).

Pierwsza wersja GCC, napisana przez Richarda Stallmana, ukazała się w 1987 roku. Obecna wersja, oznaczona jako 3.3.2, jest udostępniona do pobrania ze strony http://gcc.gnu.org/.

Można by zapytać, w jakim celu piszę o GCC czy o języku C — przecież nie jest to tematem niniejszej książki. To prawda, wspominam o tym tylko dlatego, że działanie kompilatora języka C# jest nieco inne, ale o tym opowiem w dalszej części książki.

Tworzenie kodu źródłowego

To jest praca, która należy do programisty. Przed kompilacją programu trzeba napisać jego kod, używając danego języka programowania. Trzeba przy tym używać poleceń, które zostaną rozpoznane przez kompilator. Przed faktycznym momentem skompilowania programu kompilator sprawdza jego składnię — jeżeli napotka na nieznane mu polecenie, wyświetli błąd i zakończy działanie.

Składnia to dział gramatyki. Bada zasady łączenia poszczególnych wyrazów w zdania. Programiści pod tym pojęciem rozumieją kod źródłowy aplikacji, poszczególne elementy, instrukcje, które łączą się w jedną całość.

Prekompilacja

Ten proces polega na usuwaniu komentarzy z kodu źródłowego. Teraz następuje również odczytanie makrodefinicji języka C, które zaczynają się od słowa #define. Nie jest to jednak tematem tej książki i nie będziemy się tym szczegółowo zajmować.

Czytelnik, który miał wcześniej styczność z językiem C, zapewne wie, czym są komentarze czy makrodefinicje. Tematem komentarzy w językach programowania zajmiemy się w dalszej części książki.

Kompilacja do kodu Asemblera

Proces ten polega na wyszukiwaniu słów kluczowych dla danego języka programowania. Potem następuje przekształcenie tego kodu na instrukcje Asemblera. W tym czasie, jeżeli kompilator wykryje jakieś błędy związane z kodem źródłowym, wstrzyma działanie i zasygnalizuje błąd.

Optymalizacja kodu

Następnie kompilator analizuje kod Asemblera i poddaje go optymalizacji. Jest to opcjonalna funkcja w kompilatorach GCC, lecz warto ją wykorzystywać, gdyż często jest przydatna. Należy też wspomnieć, że możliwość optymalizacji kodu jest dość zaawansowaną funkcją kompilatora.

Optymalizacja jest procesem poprawiania kodu programu, tak aby jego wykonywanie było jak najbardziej efektywne, a sam program zajmował możliwie jak najmniej pamięci. Optymalizacja powinna należeć do programisty jako wyrobiony nawyk pisania efektywnych programów, lecz w obecnych czasach maszyna znacznie ułatwia tę część pracy.

Asemblacja

Zoptymalizowany kod Asemblera może zostać poddany asemblacji. Proces asemblacji jest związany z przekształcaniem kodu Asemblera na kod maszynowy.

Konsolidacja

Konsolidator, nazywany też często linkerem, tworzy aplikację wykonywalną, którą można uruchomić w sposób niezależny od kompilatora i — przykładowo — przetestować jej działanie. Innymi słowy, linker tworzy plik .exe gotowy do użycia.

Języki interpretowane

Istnieją języki, do których nie ma kompilatorów. Takie aplikacje nie są kompilowane do pliku .exe. Program jest cały czas „przechowywany” w postaci kodu źródłowego. Na maszynie, na której taka aplikacja ma zostać uruchomiona, musi być zainstalowany tzw. interpreter. Każdorazowo sprawdza on składnię programu i na bieżąco wykonuje instrukcje zapisane w kodzie źródłowym. Przykładem języków interpretowanych jest PHP i Perl.

Język C#

Język C# [#]_ (czytaj: si szarp) jest nowym językiem programowania zaprojektowanym przez firmę Microsoft i ściśle związanym z platformą .NET. Łączy w sobie zalety języków C++ oraz Java, jest do nich bardzo podobny, co ułatwia jego naukę osobom, które wcześniej miały do czynienia ze wspomnianymi językami.

Głównym architektem języka jest Anders Hejlsberg, duński programista. Wcześniej pracował on dla firmy Borland, gdzie uczestniczył w tworzeniu środowiska Turbo Pascal oraz Delphi.

C# jest dość specyficznym językiem, jak wspomniałem — ściśle związanym z platformą .NET. Aplikacje pisane w tym języku wymagają środowiska uruchomieniowego CLR, które zostanie omówione w dalszej części książki.

Instalacja środowiska

W trakcie pisania przykładów do tej książki będę korzystał z darmowego środowiska Visual C# 2005 Express Edition, które możesz pobrać ze strony http://msdn.microsoft.com/vstudio/express/visualcsharp/download/.

Po pobraniu i uruchomieniu pliku instalacyjnego (o rozmiarach kilku MB) nasz system zostanie przygotowany do ściągnięcia środowiska .NET Framework 2.0 i Visual C# Express Edition oraz systemu pomocy. W sumie będzie to nieco ponad 300 MB. Po ściągnięciu wszystkich potrzebnych plików uruchomiony zostanie instalator, który powinien bezproblemowo zainstalować wszelkie aplikacje potrzebne do tego, aby zacząć programować.

Jak się uczyć

Jak się uczyć programowania? Każdy ma inne sposoby, mniej lub bardziej skuteczne. Wziąłeś tę książkę do ręki zapewne dlatego, że interesujesz się przedstawioną w niej tematyką i dzięki temu nauka będzie przychodziła Ci łatwiej. Gorzej, jeżeli musisz nauczyć się programowania w C#, ponieważ tak nakazał Ci szef — w takich przypadkach nauka będzie trudniejsza. To naturalne — oswojenie się z tym, co się lubi, co sprawia przyjemność, jest w gruncie rzeczy łatwe. Tak samo jest z C#. Jeżeli interesujesz się programowaniem, to nauka tego języka będzie przyjemnym doświadczeniem.

Nie ucz się na pamięć!

Na pewno nie należy wkuwać wszystkiego i lepiej nie starać się zapamiętać całego prezentowanego tu materiału — w każdym momencie można przecież cofnąć się do poprzedniego rozdziału!

Początkowe trudności

Jeżeli jesteś naprawdę początkujący w tej dziedzinie, to przez jakiś czas może Ci być ciężko. Nie mówię tego, aby kogokolwiek zniechęcać, lecz raczej aby pocieszyć — tak jest w wielu przypadkach, więc nie ma się czym przejmować. Z czasem wiele kwestii stanie się bardziej czytelnych i łatwiejszych. Może się bowiem zdarzyć, iż na początku tej książki będę wspominał o sprawach, które zostaną omówione dopiero w dalszych rozdziałach (aczkolwiek będę się starał unikać niezrozumiałych pojęć), tak więc nie należy się przejmować, jeśli coś wydaje się niejasne — dalej znajdą się odpowiedzi.

Pomoc systemowa

Zawsze można skorzystać z systemu pomocy! Najważniejszym klawiszem skrótu jest F1, który powoduje uruchomienie systemu pomocy. Niestety, pomoc jest w całości napisana w języku angielskim, tak więc jest niezbędna jest przynajmniej podstawowa umiejętność czytania w tym języku.

Praktyka

Praktyka czyni mistrza! Każdy na pewno nieraz słyszał to przysłowie. Warto się do niego stosować. Po zapoznaniu się z jakąś nową funkcją warto sprawdzić jej działanie w praktyce — jest to dobry sposób na opanowanie nowego materiału.

Pierwsza aplikacja

Nasz pierwszy program nie będzie realizował żadnych konkretnych zadań. Będzie to typowe okno systemu Windows z przyciskiem. Po naciśnięciu przycisku wyświetlone zostanie nowe okno z napisem Hello World.

Uruchom środowisko Visual C# 2005 Express Edition (jeżeli chcesz, możesz skorzystać z bardziej zaawansowanych wersji Visual Studio).

#Z menu File wybierz New Project.
#Zaznacz ikonę Windows Application.
#W polu Name wpisz HelloApp.
#Naciśnij OK.

W tym momencie został utworzony nowy projekt typu Windows Forms. Okno o nazwie Form1 to okno naszej aplikacji. W trakcie projektowania programu mamy możliwość obserwacji, jak taka aplikacja będzie wyglądała w trakcie działania.

Po lewej stronie ekranu znajduje się pozycja Toolbox. Gdy naprowadzimy na nią myszkę, rozwinie się okno Toolbox zawierające spis tzw. komponentów (rysunek 1.2) lub kontrolek (takie określenie również jest często stosowane).

sharp1.2.jpg
Rysunek 1.2. Lista komponentów

Odnajdź, a następnie kliknij raz pozycję Button, aby ją podświetlić. Teraz wystarczy raz kliknąć obszar formularza (Form1), aby umieścić w naszej aplikacji przycisk (rysunek 1.3).

sharp1.3.jpg
Rysunek 1.3. Przycisk umieszczony na formularzu

Komponent (owy przycisk) można przesuwać oraz zmieniać jego rozmiar, chwytając za jego narożniki.

Z menu Format wybierz pozycję Center in Form, a następnie Horizontally, co spowoduje umieszczenie przycisku centralnie po środku formularza.

Kompilacja i uruchamianie

Na razie nasz program składa się jedynie z przycisku. Poza tym nic nie robi, bo naciśnięcie przycisku nie powoduje żadnej reakcji. Jednak już teraz możesz uruchomić nasz projekt i sprawdzić jego działanie.

Jest to bardzo proste. Wystarczy z menu Debug wybrać Start Debugging lub nacisnąć przycisk F5. Środowisko Visual C# Express Edition oprócz edytora kodu i edytora formularzy zawiera również debuger oraz kompilator. Naciśnięcie klawisza F5 spowoduje skompilowanie programu, a następnie jego uruchomienie. Po chwili nasza aplikacja w postaci okna z przyciskiem powinna zostać uruchomiona. Naturalnie jest to bardzo prosty program, który nie realizuje żadnego zadania. Zwróć uwagę, że zaprojektowaliśmy (stworzyliśmy) program, nie pisząc ani jednej linii kodu!

Komponenty

W zaprezentowanym przykładzie skorzystaliśmy z komponentu Button. W tym miejscu należą Ci się wyjaśnienia, czym właściwie jest komponent. Typ aplikacji, który przed chwilą stworzyliśmy, nazywany jest aplikacją typu Windows Forms. Więcej na ten temat dowiesz się z lektury rozdziału 2. oraz 10. Istotne jest to, że projektowanie aplikacji tego typu umożliwia stosowanie podstawowych kontrolek systemu Windows, takich jak przyciski, listy rozwijane, pola edycyjne, panele itp. Umożliwia to projektowanie interfejsu aplikacji. Można więc powiedzieć, że komponenty są klockami umożliwiającymi szybkie projektowanie aplikacji.

Właściwości komponentów

Każda kontrolka (komponent) posiada właściwości, które umożliwiają ustalenie jej specyficznych cech, takich jak położenie, kolor, czcionka itp. Spis właściwości komponentów znajduje się w oknie Properties (rysunek 1.4), które standardowo umiejscowione jest w prawym dolnym rogu środowiska Visual C# Express Edition.

sharp1.4.jpg
Rysunek 1.4. Spis właściwości z zaznaczoną cechą Text

Okno Properties podzielone jest na dwie kolumny. Kolumna po lewej zawiera nazwę właściwości, a ta po prawej — jej wartość.

Wykonajmy proste ćwiczenie polegające na zmianie wartości właściwości Text komponentu Button.

#Zaznacz komponent Button (pojedynczym kliknięciem), który w poprzednim ćwiczeniu umieściłeś na formularzu.
#Na liście właściwości odszukaj Text, która określa tekst wyświetlany na przycisku.
#Kliknij podwójnie nazwę właściwości. Spowoduje to zaznaczenie kolumny po prawej, która umożliwia wprowadzenie nowej wartości.
#Wpisz w polu tekst Kliknij mnie i naciśnij Enter.

Jeżeli wszystko wykonałeś zgodnie z opisem, tekst znajdujący się na przycisku został zmieniony.

Piszemy kod

Mamy już formularz, przycisk, lecz brakuje nam reakcji na naciśnięcie go. Musimy wobec tego oprogramować odpowiednie zdarzenie (reakcje) na wciśnięcie kontrolki. Kliknij dwukrotnie komponent Button. Zostaniesz przeniesiony do edytora kodu, gdzie należy wpisać kod, który zostanie wykonany, w momencie gdy użytkownik naciśnie przycisk. My chcemy, aby wyświetlone zostało okienko, co realizuje poniższy kod:

MessageBox.Show("Hello World");

Cały kod źródłowy naszego programu prezentuje listing 1.1.

Listing 1.1. Kod źródłowy pierwszej aplikacji

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace HelloApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello World");
        }
    }
}

Teraz możesz już uruchomić program klawiszem F5 i przetestować jego działanie. Rysunek 1.5 prezentuje aplikację w trakcie działania.

sharp1.5.jpg
Rysunek 1.5. Pierwsza aplikacja Windows Forms

Zapisywanie projektu

Moje gratulacje! Właśnie napisałeś swój pierwszy program w C#. Myślę, że warto by było zapisać go na pamiątkę. Aby zapisać projekt, z menu File wybierz Save All. W tym momencie musisz wybrać katalog, w którym zapisane zostaną pliki projektu (przycisk Browse). Zapisanie projektu nastąpi po naciśnięciu przycisku Save. W tym momencie w wybranym katalogu zostanie utworzony szereg plików i folderów. Ich zawartość w tym momencie jest nieistotna. Najważniejsze są pliki z rozszerzeniem *.cs, które zawierają rzeczywisty kod źródłowy naszego programu.

Podsumowanie

Po przeczytaniu tego rozdziału powinieneś mieć podstawową wiedzę na temat programowania. Najważniejsze jest, abyś wiedział już, czym jest kompilator, kod źródłowy czy proces kompilacji. Powinieneś mieć zarys tego, jak działają kompilatory. W tym rozdziale zarysowałem jedynie tematykę programowania oraz poruszyłem podstawowe pojęcia, które będę rozwijał w dalszej części książki.

.. [#] Powszechnie nazwę języka zapisuje się jako C#, czyli używa się znaku # (ang. hash), a nie znaku krzyżyka (ang. sharp) używanego w notacji muzycznej. Spowodowane jest to brakiem znaku sharp w wielu czcionkach.

[[C_Sharp/Wprowadzenie|Spis treści]]

[[C_Sharp/Wprowadzenie/Prawa autorskie|©]] Helion 2006. Autor: Adam Boduch. Zabrania się rozpowszechniania tego tekstu bez zgody autora.

3 komentarzy

Zwróć uwagę na sam początek kodu:
U ciebie jest:

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

A w przykładzie mamy:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

To właśnie z tego powodu musisz dodawać prefiksy typu System:: i Twój kod wygląda tak:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
{
   //kod który ma się wykonać (w tym przypadku MessageBox z "Hello World")
}

Zamiast tak:

private void button1_Click(Object sender, EventArgs e)
{
        //kod który ma się wykonać (w tym przypadku MessageBox z "Hello World")
}

ogólnie po pewnym czasie udało mi się zrobić to zadanie.. ale ;d

otwierając komponent ukazuje mi sie wygenerowany kod który wygląda tak

#pragma once

namespace Hello {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	/// <summary>
	/// Summary for Form1
	///
	/// WARNING: If you change the name of this class, you will need to change the
	///          'Resource File Name' property for the managed resource compiler tool
	///          associated with all .resx files this class depends on.  Otherwise,
	///          the designers will not be able to interact properly with localized
	///          resources associated with this form.
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
			InitializeComponent();
			//
			//TODO: Add the constructor code here
			//
		}

	protected:
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::Button^  button1;
	protected: 

	private:
		/// <summary>
		/// Required designer variable.
		/// </summary>
		System::ComponentModel::Container ^components;

         #pragma region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		void InitializeComponent(void)
		{
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->SuspendLayout();
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(105, 113);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(75, 23);
			this->button1->TabIndex = 0;
			this->button1->Text = L"button1";
			this->button1->UseVisualStyleBackColor = true;
			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(284, 261);
			this->Controls->Add(this->button1);
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->ResumeLayout(false);

		}
       #pragma endregion
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
			 }
	};
  }

kod jest trochę nie podobny do tego z listing 1.1

i wstawienie samego MessageBox.Show("Hello World"); w odpowiednie miejsce nie wystarcza przez co wyskakiwał błąd

error C2143: syntax error : missing ';' before '.' (błąd wyskakiwał w linijce z MessageBox)

stosując metodę prób i błędów w końcu udało się i finalnie wyszło to tak

     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
			 {
				 MessageBox::Show("Hello World");
			 }

między Box a Show musiałem wstawić :: (dopiero teraz zwróciłem uwagę że niemal wszędzie zamiast "." występuje "::")

chciałem zapytać czym jest spowodowana taka różnica w kodzie?
wersje programu pobrałem taką jak w książce