Wstęp do programowania

Komputer jaki jest, każdy widzi ;-)

Kiedyś, gdy byłem jeszcze małym zielonym lamerem :-D myślałem, że aby zmusić komputer do zrobienia czegoś, to trzeba do niego mówić :-P Znaczy nie dosłownie, tylko pisząc na klawiaturze. [Naoglądało się dziecko goopich filmów ;-D] Komputer wypisywał mi na ekran jakieś teksty po angielsku, więc ja także próbowałem wydawać mu polecenia po angielsku, z nadzieją że wreszcie coś sqma i wykona to, o co go tak ładnie proszę :-)

Pół dnia próbowałem, aż wreszcie przyszedł mój qzyn [właściciel komputra] i widząc moje męki postanowił pokazać mi, jak się programuje. Zaczął wpisywać jakieś dziwne "zaklęcia" i nagle ekran zasypały literki jak w Matrixie! :-) Już po chwili pojawiły się kolory, kreski, kółka, a ja patrzyłem na to wszystko z coraz większym podziwem.

Nieco później qzyn podarował mi swój stary komputer, wraz z książką o programowaniu. Książka ta wiele mi wyjaśniła. Zrozumiałem wtedy, że komputer to jest takie jakby szybkie liczydło na sterydach :-) Potrafi operować wyłącznie na liczbach. Przykładowo jeśli chcesz przy jego pomocy retuszować zdjęcie, musisz go najpierw zamienić na postać cyfrową, bo tylko w takiej postaci komputer go "rozumie" i może go przetwarzać. Podobnie jest z programami. Mikroprocesor w Twoim komputerze rozumie tylko cyfrowe kody różnych instrukcji, zwane kodem maszynowym lub kodem binarnym. Tak więc program komputerowy jest po prostu ciągiem cyfrowych rozkazów umieszczonym gdzieś w pamięci komputera.

Języki programowania

Dla człowieka ten gąszcz cyferek kodu binarnego jest mało zrozumiały i chyba tylko Neo mógłby się w tym połapać ;-D Człowiek wolałby wydawać polecenia w swoim własnym języku. Minie jeszcze wiele czasu zanim komputer zrozumie język ludzki, dlatego powstał kompromis - specjalne uproszczone języki zwane językami programowania. Zazwyczaj składają się one z małego zestawu słów [tak zwanych słów kluczowych] i mają raczej prostą składnię, by łatwo było je przetłumaczyć na cyfrowy kod maszynowy.

Dzięki językom programowania, programiści nie muszą już pamiętać adresów komórek pamięci ani cyfrowych kodów poszczególnych rozkazów procesora. Zamiast tego mogą posługiwać się nazwami, które łatwo jest zapamiętać. Większość tych nazw mogą wymyślać sami. Najprostszym językiem [choć niekoniecznie najłatwiejszym ;-J], który to umożliwia, jest Assembler, w którym każda instrukcja procesora ma swoją skrótową nazwę [mnemonik]. Z czasem powstały języki bardziej rozbudowane [tzw. wysokiego poziomu], w których jedna instrukcja może być tłumaczona na wiele instrukcji procesora. Takimi językami są np. Pascal, C ze swoim następcą C++, oraz wiele innych.

Tekst programu, napisany w języku programowania, nazywamy kodem źródłowym, lub po prostu kodem. Programiści mówią np. Pokaż mi swój kod, albo Znalazłem błąd w Twoim kodzie. Z tego też względu programistów nazywa się czasem koderami ;-) Taki kod można przechowywać w zwykłym pliku tekstowym, więc możesz go wklepywać w dowolnym edytorze czystego tekstu. Od biedy możesz użyć nawet systemowego notatnika ;-P jednak już wkrótce poznasz o wiele lepsze narzędzia :->

No dobra, ale jak te języki programowania są tłumaczone na kod maszynowy? Są dwa sposoby takiego tłumaczenia, a każdy ma swoje zady i walety ;-)

Kompilatory i interpretery

Pierwszy sposób wykorzystuje specjalny program, zwany interpreterem, który na bieżąco tłumaczy polecenia użytkownika na kod maszynowy. Z tej metody korzystał język BASIC, którego używał mój qzyn, a obecnie kilka języków skryptowych [np. PHP]. Języki interpretowane mają tę zaletę, że można nawet wpisywać polecenia prosto z klawiatury i one od razu się wykonują. Jednak program musi być zawsze "w locie" tłumaczony na kod maszynowy, przy każdym uruchomieniu od nowa, co zazwyczaj wprowadza niepotrzebne opóźnienia i program działa wolniej niż by mógł. Poza tym musisz mieć interpreter danego języka na każdym komputerze, na którym chcesz uruchomić swój program. To jak ciągnąć ze sobą tłumacza na wycieczkę zagraniczną ;-P

Ty chcesz programować gry, więc potrzebujesz wydajnego i szybkiego narzędzia. Nie chcesz przy tym rozprowadzać żadnych dodatkowych programów ze swoją grą. Potrzebujesz tego drugiego sposobu, który nazywa się kompilowaniem [nie mylić z "komplikowaniem" ;-P choć może się wydawać, że ta druga nazwa jest bardziej odpowiednia ;-J].

Kompilacja
Rys. 1: Kompilator tworzy plik z kodem binarnym na podstawie kodu źródłowego

Drugi sposób uwalnia Cię od wad, które miał interpreter. Można przecież wczytać kod źródłowy, przetłumaczyć go "raz a porządnie" i tak powstały kod binarny zapisać sobie w pliku. Tak właśnie robi specjalny program, zwany kompilatorem.

Takie tłumaczenie może trochę potrwać. Jeśli kodu źródłowego jest bardzo dużo, to nawet kilka godzin :-P Ale od tego momentu każde uruchomienie programu nie będzie już wymagać ciągłego "tłumaczenia w locie". Po skompilowaniu program jest już w postaci zrozumiałej dla komputera, więc może się wykonywać z prędkością elektronu :-D Oznacza to także, że do dalszego działania program nie będzie już potrzebował kompilatora.

Kompilator robi przy okazji coś jeszcze - sprawdza czy nie masz przypadkiem jakiegoś błędu w Twoim kodzie źródłowym. Jeśli się okaże że masz, od razu przerwie kompilację i powie Ci co jest nie tak. Jest to duża zaleta, bo zazwyczaj jeśli Twój kod poprawnie się skompiluje, to uda się go też od razu uruchomić.

Niektóre kompilatory tworzą gotowe pliki wykonywalne [zwane też żargonowo binarkami ;-)]. Są to takie pliki, które system może już załadować do pamięci i uruchomić. W systemie Windows mają one rozszerzenie exe [od ang. executable], a w systemie Linux i innych unixowych poznasz je po atrybucie "wykonywalny". Na pewno dobrze znasz takie pliki ;-) a programowanie, mówiąc w dużym skrócie, polega na ich tworzeniu ;-) Jednak najczęściej kompilator tworzy jedynie plik binarny, którego nie można jeszcze uruchomić. Nazywa się go zwykle plikiem obiektowym lub skompilowanym modułem. Dlaczego tak jest?

Moduły i biblioteki

Otóż z czasem programy zaczęły się stawać coraz większe. Im większy program, tym trudniej się w nim połapać, gdy wszystko jest zbukwione w jednym pliku z kodem źródłowym :-P Chyba nikt nie lubi przekopywać się przez hektary tekstu, żeby zmienić jeden wyraz! Programiści wymyślili więc, że będzie im łatwiej jeśli rozłożą sobie kod źródłowy na mniejsze pliki, czyli właśnie moduły. Ułatwia to pracę przy dużych projektach [np. grach], bo nad każdym modułem może pracować inny programista. Każdy taki moduł jest kompilowany osobno. Jeśli więc ktoś zmieni coś tylko w jednym pliku, to wystarczy że skompiluje ponownie tylko ten jeden moduł. Taka sztuczka może znacznie skrócić czas kompilacji.

Jeśli jeden programista oprogramuje np. korzystanie z plików, może umieścić ten kod w tak zwanej bibliotece. Biblioteka to moduł [lub cały zestaw modułów] napisany specjalnie po to, by inni programiści mogli z niego skorzystać, oszczędzając czas, robotę i co najważniejsze nerwy :-) Po co ponownie wymyślać koło jeśli ktoś już to zrobił przed nami? ;-J

Biblioteki rozszerzają możliwości języka. Istnieje wiele gotowych bibliotek przeznaczonych do różnych zadań, napisanych przez fachowych programistów :-J Ponadto niektóre biblioteki są dostępne w wersjach dla różnych systemów. Używając takich bibliotek możesz tworzyć programy działające na różnych platformach [np. Windows, Linux, MacOS]. Wystarczy że skompilujesz program dołączając wersje bibliotek dla danej platformy i sprawa załatwiona!

Biblioteki są przechowywane w postaci już skompilowanej [wedle zasady "Kompilujesz raz, używasz cały czas" ;-D], więc wszystko co musisz zrobić, to połączyć je z Twoim programem. Oczywiście używasz tylko tego, czego potrzebujesz, więc masz pewność, że w Twojej binarce nie znajdzie się np. kod do obsługi plików, jeśli Twój program z tego nie korzysta.

Łączenie do kupy

Jak widać, każdy moduł może być pisany przez innego programistę. Może być nawet tak, że każdy programista pisze w innym [swoim ulubionym] języku programowania i kompiluje swoim kompilatorem. Do tego dochodzą jeszcze biblioteki. Jak więc teraz poskładać te wszystkie pliki binarne do kupy?

Łączenie
Rys. 2: Linker łączy wszystkie moduły binarne i biblioteki, tworząc gotowy do uruchomienia program

Służy do tego kolejne narzędzie programistyczne, zwane linkerem. Jego zadaniem jest połączenie wszystkich modułów binarnych w jeden plik wykonywalny, który już będzie można uruchomić :-) Moduły są najczęściej jakoś ze sobą powiązane i korzystają z siebie nawzajem. Linker odpowiada więc także za poprawne połączenie modułów ze sobą, jak kawałków puzzli ;-) Kompilator nie mógłby tego zrobić, bo przerabia każdy plik z kodem źródłowym osobno, więc nie ma pojęcia co znajduje się w pozostałych modułach i mało go to obchodzi ;-J

Różne systemy operacyjne używają różnych formatów dla swoich binarek. Dobry linker potrafi tworzyć pliki wykonywalne o różnych formatach, uzyskując binarki dla różnych systemów :-) Możesz więc pisać programy na Linuxie, a binarki tworzyć dla Windowsów. Musisz tylko pamiętać, że współczesne systemy różnią się nie tylko formatem binarek, więc trzeba też użyć bibliotek właściwych dla danego systemu.

Jak uprościć sobie robotę

Jak widzisz, proces budowy gotowego programu składa się z kilku etapów. Najpierw dla każdego pliku źródłowego z osobna wywoływany jest kompilator, który kompiluje kod źródłowy do postaci pliku z kodem binarnym. Gdy już wszystko zostanie skompilowane, rozpoczyna pracę linker, który łączy wszystkie moduły binarne i wymagane biblioteki w gotowy plik wykonywalny. Wygląda na kupę żmudnej roboty! Zwłaszcza gdy plików z kodem źródłowym jest dużo.

I tutaj z pomocą przychodzą tak zwane zintegrowane środowiska programistyczne [ang. Integrated Development Environment, w skrócie IDE]. Czyli zestaw narzędzi takich jak: kompilator, linker, edytor kodu źródłowego, i wiele innych narzędzi, połączonych w jeden pakiet. Takie środowiska posiadają zwykle menedżer projektu, który pamięta jakie pliki składają się na gotowy projekt. Dzięki temu cały proces budowania programu można wykonać jednym kliknięciem.

Również edytory kodu źródłowego, wbudowane w takie środowiska, są dużo bardziej wypasione ;-) Dla poprawy czytelności oznaczają słowa kluczowe i różne elementy języka różnymi kolorami. Niektóre posiadają też funkcję zwijania bloków kodu lub automatyczne uzupełnianie nazw, co bardzo ułatwia pracę.

Od tej chwili znasz już wszystkie etapy powstawania gotowego programu. Czas więc przystąpić do nauki jakiegoś języka programowania ;-) Wybierz sobie język spełniający Twoje potrzeby i skołuj sobie jakieś dobre środowisko programistyczne. Każde środowisko programistyczne ma swój własny zestaw bajerów, więc dobrze się im przyjrzyj, zanim wybierzesz najbardziej odpowiednie dla siebie ;-)


Subskrybcja

Buttony
Button1 Button2 Button3 Button4 Button5 Button6 Button7 Dodaj swój button