Wstęp

Języki programowania jest jednym z kursów przygotowujących studentów do nieco szerszego spojrzenia na projektowanie programów i programowanie. Podobnie jak język którym mówimy determinuje nasz sposób myślenia – język programowania  determinuje sposób w jaki projektujemy program. Dlatego nie powinniśmy się ograniczać o jednego języka programowania nawet jeśli jest to język uniwersalny i powszechnie uznawany za najlepszy.

Niniejszy skrypt przeznaczony jest dla studentów którzy w podstawowym kursie programowania uczą się języka C++. Celem tego skryptu nie jest ani przekonanie czytelników o wyższości czy niższości poszczególnych języków ani nauczenie wszystkich prezentowanych języków. Chciałbym tu jedynie zaprezentować inne sposoby programowania i inne – typowe dla innych języków style. Jeśli czytelnik nie ma zamiaru zmieniać języka czy środowiska w jakim programuje – nie będę go do tego przekonywał. Moim zamiarem jest przede wszystkim pokazanie innego sposobu rozwiązywania problemów, w sytuacji w której język programowania nie pozwala na dowolność, lub wymusza pewien konkretny styl czy metodę.

Książka ta może także być wstępem do nauki różnych języków programowania – dla rozrywki, lub też w celu pogłębienia swojej wiedzy i umiejętności. Wprawdzie współczesne języki programowania pozwalają na dużą dowolność w stylu czy podejściu do programowania, jednak programiści uczący się takich języków zazwyczaj idą po najmniejszej linii oporu – ucząc się konkretnego stylu.

Języki które chciałbym zaprezentować nie pozwalają na pisanie w ten sam sposób. Każdy z nich powinien nauczyć czegoś innego, tak by po powrocie do języka w którym czytelnik programował – poznane metody pozwoliły na pełniejsze wykorzystanie jego możliwości.

Aby język giętki...

Na jednej ze stron internetowych, można znaleźć prosty program napisany w ponad dwustu różnych językach programowania. Można by zadać sobie pytanie – po co istnieje tyle języków programowania zamiast jednego – najlepszego i uniwersalnego – na przykład C++, albo innego.

Tak samo można zadać sobie pytanie: dlaczego ludzie mówią różnymi językami. Dlaczego powstają hermetyczne języki typowe dla pewnych grup zawodowych czy zastosowań. Podobnie jest z językami programowania.

Początkowo programowanie odbywało się w języku procesora. Programista panował całkowicie nad tym co się dzieje z informacją na której komputer operuje. W miarę komplikowania się programów i komputerów coraz bardziej skomplikowane stało się pisanie i konserwowanie programów. Musiały się wiec pojawić sposoby pisania programów które pozwalały na zapis programu w sposób zrozumiały dla programisty.

Pierwsze języki pozwalały na są pisanie w postaci tekstu ciągu instrukcji. Instrukcje są skrótami które są tłumaczone na pojedyncze instrukcje procesora. Nie musimy się jednak martwić o to w jakich komórkach pamięci umieścimy program a w jakim dane – o to zadba program tłumaczący.

Kolejne języki programowania coraz bardziej przypominają język naturalny. Pojawiają się całe słowa opisujące czynności jakie ma wykonać komputer. Nieistotne informacje są przed nami ukrywane, a obliczenia możemy zapisywać w postaci naturalnych dla nas, wyrażeń.

Pojawiają się języki specjalizowane – języki zorientowane na konkretne zastosowania: FOTRTAN – do prowadzenia obliczeń, SIMULA – jedne z pierwszych języków obiektowych zorientowany na budowę symulacji, COBOL do operacji na danych zapisanych w postaci rekordów o znanej strukturze, PROLOG – do operowania na bazach wiedzy, LISP – do operacji na danych nie posiadających ustalonej struktury, czy wreszcie C – język zastępujący ASSEMBLER w programowaniu systemowym.

Dalsza ewolucja komputerów prowadzi do powstania złożonych języków uniwersalnych pozwalających pisanie w sposób typowy dla innych języków programowania. Jednym z takich języków jest C++ czy ostatnio C#, pozwalający na obiektowe podejście do problemów – bardzo przydatne przy modelowaniu, pozwalający na pisanie funkcji i procedur – podobnie jak proste języki systemowe, pozwalający na operowanie na strukturach dynamicznych – podobnie jak LISP.

Języki uniwersalne są naprawdę bardzo dobrym narzędziem dla doświadczonego programisty, jednak nauka programowania jest na nich nieco utrudniona. Nauka – nie programowanie, bo programować można na wiele najrozmaitszych sposobów, i zawsze nawet najbardziej absurdalne rozwiązanie daje się zaprogramować.

Stare dobre języki programowania takie jak PASCAL czy ADA – wymuszały pewien porządek w kodzie programu. W C++ można napisać program który będzie działał, a którego nie będzie się dawało w żaden sposób zrozumieć. I nie chodzi mi tu o dziwne nazwy zmiennych czy też wcięcia robione dość dowolnie, ale o strukturę kodu, który nie musi być czytelny.

Studenci często piszą kod po to żeby działał i po to by dostać zaliczenie lub ocenę. Rzadko przejmują się tym że ktoś kiedyś będzie musiał go zrozumieć a nawet poprawić. Tymczasem, po ukończeniu studiów trafią oni do pracy w której po pierwsze będą pracować w zespole pisząc kod wraz z innymi programistami, najczęściej zaczynając od robienia poprawek w tym co napisał ktoś inny. Poza tym ten sam kawałek kodu zazwyczaj żyje w programie dość długo i z wersji na wersję trzeba go przebudowywać i poprawiać, zwiększać funkcjonalność i dostosowywać do nowych środowisk i systemów. I niestety trzeba go poprawiać a nie pisać od początku, gdyż pisząc od początku – możemy popełnić nowe błędy, a poza tym ciągłe przepisywanie kodu – jest czasochłonne a co za tym idzie – kosztowne.

Dlatego na zajęciach z języków programowania postawiłem sobie założenie – nie uczymy się innych języków po to by w nich programować, ale by poznać metody programowania – typowe dla pewnych klas programów i ich zastosowań. Dlatego w trakcie tego kursu zajmiemy się najprostszymi dialektami wybranych języków. Nie będziemy korzystali z ułatwień jakie wprowadzano w trakcie ewolucji tych języków. Języki zostały tak dobrane, by uczestnicy kursu mogli poznać konkretne techniki – typowe dla tych języków.

Istnieje dowód twierdzenia, że jeśli problem jest rozwiązywalny w jednym z języków – to jest także rozwiązywalny w innym, pod warunkiem, że oba języki są zupełne. Istnieje też wiele dowodów praktycznych, że prowadzi to do komplikacji kodu i nerwicy programisty.

Podobnie jest z językami naturalnymi. Można zaryzykować twierdzenie, że jeśli jakieś pojęcie daje się wyrazić w jednym z języków – to można je opisać – w innym. Czasem jest to jednak bardzo skomplikowane – jak w przypadku chińskiego słowa tao. W zasadzie dosłowne tłumaczenie nie jest możliwe, ale pojęcie jakie to słowo wyraża daje się opisać – w sposób o tyle wierny o ile skomplikowany.

Dlatego jeśli chcemy zrozumieć innych ludzi i rozszerzyć swoje rozumienie i świadomość uczymy się języków. Podobnie w nauce programowanie – poznajemy nowe języki nie po to by w nich pisać, ale by poznawać nowe metody i konstrukcje.

Dla programistów znających C++, lub uczących się tego języka, chciałbym polecić 5 języków programowania których znajomość bardzo wzbogaci nasze programowanie:

1.        FORTRAN – język bardzo prosty, zmuszający programistę do optymalizowania programu już na jego projektu. Jednocześnie język który pozwala na pisanie programu w postaci procedur i funkcji, a nie pozwalający na operowanie na dynamicznych strukturach danych.

2.        LISP – jedyny w swoim rodzaju – tu nie możemy w ogóle mówić o ciągu instrukcji. W najbardziej fundamentalistycznej wersji w ogóle nie możemy mówić o iteracji. Jedyne czym dysponujemy – to superpozycja funkcji.

3.        RedCode – w zasadzie język napisany do zabawy – język do pisania zawodników w grze CORE WARS. Język będący kwintesencją języków wewnętrznych procesora.

4.        JAVA – język obiektowy – tu wszystko jest obiektem. Język o tyle ciekawy, że pozwala na łączenie modułów w memencie wykonywania kodu a nie w momencie kompilacji. Ponadto zarzucający pewne ograniczenia na strukturę dziedziczenia klas.

5.        JavaScript – Język skryptowy. W zasadzie obiektowy, ale bez ścisłej kontroli typów. Do czego to prowadzi – warto zobaczyć,

Myślę, że nawet po pobieżnym zapoznaniu się z tymi językami – czytelnik będzie w stanie lepiej wykorzystać potencjał jaki drzemie w uniwersalnym języku jakiego używa – bez względu na to jaki to język.