Ucz się programowania, nie języków programowania - część 2

W poprzedniej części naszego cyklu przedstawiliśmy kilka aspektów architektury komputera. Stwierdziliśmy, że zarówno do sprzętu jak i do działających na nim aplikacji podchodzimy warstwowo. Warto zaakcentować jednak pewną różnicę: sprzęt jest czymś, co poznajemy natomiast aplikacje chcemy, jako programiści, budować.


Czytaj inne artykuły z cyklu:

Oznacza to pewną pokusę: stawianie lepianki jest łatwiejsze od budowy wieżowca - na tej samej zasadzie szybciej widzimy efekty tworzenia aplikacji jeżeli w mniejszym stopniu używamy abstrakcji dostarczanych przez języki programowania.

Myślenie warstwowe, które ułatwia analizę, przy konstruowaniu wydaje się balastem. Należy pamiętać, że oprogramowanie zazwyczaj stanowi model lub odpowiednik rzeczywistych zjawisk np. obiegu dokumentów. Korzystając z narzędzi, których dostarczają języki programowania, lepiej odwzorowujemy z życia wzięte algorytmy.

Innym aspektem, który poruszyliśmy w poprzednim odcinku jest fakt, że głównym zadaniem programisty jest opisywanie komunikacji procesor-pamięć. Przedstawiliśmy także dwa sposoby takiej komunikacji: harwardzki i princetoński (Von Neumanna).

Jak myśli komputer - ciąg dalszy

Wiemy więc, że procesor pobiera z pamięci dane i operujące na nich polecenia. Niezależnie od architektury procesor operuje na danych "natychmiastowych", czyli wartościach liczbowych, danych przechowywanych w wewnętrznych komórkach pamięci procesora (rejestrach) oraz na danych z pamięci operacyjnej.

Należy zwrócić uwagę na to, że procesor używa kilku "poziomów" pamięci: rejestry, pamięć cache, pamięć komputera i pamięć dyskowa (tzw. plik wymiany). Im "bliższa" pamięć tym szybszy dostęp.

Oznacza to, że warto tak zarządzać dostępem do danych w kodzie by najważniejsze informacje były umieszczone "jak najbliżej" procesora. O tym jak to zrobić powiemy w odcinku, który będzie poświęcony podprogramom.

Pod właściwy adres

Z punktu widzenia programisty, wbrew pozorom także programisty wysokopoziomowego, czyli takiego, który nie pisze bezpośrednio "w języku procesora" istnieją dwa rodzaje operacji na danych- działania na wartościach i działania używające adresów. To rozróżnienie pozwala nam wprowadzić pierwszy "byt programistyczny" występujący w większości języków programowania.

Bytem tym jest zmienna. Zmienna to "programistyczny pojemnik" lub "programistyczny adres". Adres i pojemnik to rzeczy, które nie mają ze sobą wiele wspólnego, dlatego powinniśmy umieć rozróżniać jaką rolę pełni w danym kontekście zmienna. Podajmy kilka przykładów.

Typową zmienną - "pojemnikiem" może być liczba dzieci danej osoby. Liczba dzieci może się zmienić, ale nie można jej zamienić.