Drodzy, dzisiaj chciałbym poruszyć z Wami temat wyboru języka programowania. W swojej długiej już historii programisty poznałem sporą część tego, co sprawia, że obecnie tworzony software pracuje na naszych urządzeniach.

 

Języki programowania

Kompilowalne do wersji wykonywanlej (PE32/64, ELF/32/64 itd):Asembler

  • Asembler
  • Pascal/Delphi
  • C
  • C++
  • Objective-C
  • C++0x

Interpretowane:

  • PHP
  • JavaScript
  • Python

Kompilowane do bytekodu/CIL:

  • Java
  • C#

Błąd Pascala

W mojej historii szkolnej – a wspominam pod kątem informatyki ją bardzo dobrze – programowanie zaczęliśmy w 6-tej klasie podstawówki. Nauczyciel pokazał nam język LOGO, który ruszał żółwikiem po ekranie. Ponieważ był to wyłącznie język podstawowy, służący bardziej do nauki programowania i poznania podstawowych zasad szybko przeszedłem do Pascala oraz Delphi (2.0 Desktop), którą Borland rozprowadzał wówczas darmowo.

Właśnie w Delphi, będąc jeszcze w szkole podstawowej napisałem własny, prosty serwer HTTP, co z obecnego punktu widzenia… było złe.

W szkole średniej nauczyciele uczą młodzież programowania w językach pokroju Pascala, podczas gdy sam Pascal utrudnia przejście na język C za pomocą dość niezwykłej budowy „procedur”:

procedure prostafunkcja()
begin

end;

oraz budowy samego programu. Brak używania klamerek zamykających sprawia, że młodzież ma później zdecydowane problemy z rozpoczęciem przygody w C/C++ a tym bardziej programowania obiektowego. W Pascalu nie występują Klasy, które wykorzystuje się w masie innych języków – nie tylko C. Klamrowanie jest uniwersalnym rozwiązaniem stosowanym przez prawie wszystkie języki programowania – wyłączając np. BASH czy Python.

Ciężko jednak od nauczycieli z podstawówek – czy obecnych gimnazjów – i szkół średnich wymagać, by znali i potrafili nauczyć młodzież chociażby podstaw języka C. W moim przypadku nauczycielem informatyki był matematyk i matematyczka, którzy znali się na swoim fachu. W szkole średniej również trafiłem na dobrych pedagogów z dziedziny… informatyki (tak, takie mieli wykształcenie). W obecnych czasach Katecheta po kursie przygotowawczym nie jest w stanie nauczyć młodzieży niczego poza obsługą Painta, Worda oraz Excela – cytując klasykę: „Sorry, taki mamy klimat”.

Problem Androida i rozwiązania iOS

Powyżej nie wymieniłem oczywiście wszystkich języków programowania – pominąłem np. Scala, Lua, Fortran i wiele innych. Wypisałem powyższe, aby zobrazować problem który dotyka m.in. Androida a rozwiązany został w Apple iOS.

Problem, który chcę tutaj omówić to stosowanie języków kompilowanych i interpretowanych do tworzenia oprogramowania na urządzenia, których zasoby są bardzo ograniczone – telefony, tablety i ogólnie mobile.

Patrząc wstecz – w latach 90-tych i wcześniejszych do programowania aplikacji oraz systemów wykorzystywano języki kompilowane. C, C++, Objective-C i Asembler napędzały sprzęty, w których pamięci RAM dostępnej dla wszystkich aplikacji było mniej, niż obecny HEAP Androidowy przeznaczony dla pojedynczej aplikacji w tym właśnie środowisku.

Mimo posiadania 16-32 MB RAM można było bez problemu grać w gry, słuchać muzyki w formatach MP3, przeglądać masy stron Internetowych (oczywiście prostszych niż obecne). System działał stabilnie bez zwisów, jakie znamy z Androida. Dlaczego?

Projektanci Androida popełnili – moim zdaniem – znaczący błąd, skreślający system w „profesjonalnych” rozwiązaniach. Do obsługi aplikacji zastosowano język Java, który jest zdecydowanie wolniejszym od kodu przygotowanego w języku kompilowanym.

Java jest interpretowana – wcześniej kompilowana do bytekodu. Zanim jednak nastąpi interpretacja właściwa, system Android musi rozpakować plik APK (ZIP) który zawiera składowe aplikacji, rozdysponować je do odpowiednich katalogów, wczytać i przeanalizować plik MANIFEST opisujący elementy aplikacji, wczytać szablony layoutów, zarezerwować pamięć do wykonania kodu, uruchomić odśmiecacz, który zadba od stworzenie miejsca (HEAP) dla aplikacji i następnie wykonać kod.

W przypadku języka kompilowanego konieczne jest wyłącznie zarezerwowanie pamięci i załadowanie programu oraz bibliotek do pamięci, gdzie biblioteki często są współdzielone i ładowane raz do RAMu a program otrzymuje jedynie wskaźnik na umieszczoną bibliotekę.

Takie rozwiązanie wykorzystali twórcy platformy iOS, przez co aplikacja Facebooka działająca w tym środowisku działa o wiele stabilniej, szybciej niż jej Androidowy brat oferowany przez Facebooka.

Jeśli mieliście okazję zapoznać się z iOS zapewne zauważycie znaczną różnicę w wydajności tej platformy w stosunku do Androida. Można powiedzieć, że wynikają one ze sprzętu stosowanego w produktach Apple oraz np. Samsunga, jednak popatrzcie na to szczerze – platformy na których działa iOS oraz Android nie różnią się aż tak drastycznie, by dawać tak różny User Experience (UX).

 

Write in C, stupid!

Programowanie w językach kompilowanych – nazywane przeze mnie programowaniem natywnym, ze względu na używanie bezpośrednio binarnych elementów systemu – jest w efekcie o wiele bardziej opłacalne pod względem wydajności. To programista dba o zwalnianie pamięci, to programista odpowiada za jakość kodu i to programista przygotowuje aplikację dla określonych platform. Nie ma tutaj optymalizacji automatycznych (poza tymi oferowanymi przez kompilator w procesie tłumaczenia i linker w procesie łączenia), nie ma garbage collectora, który sprząta po „niepotrzebnych” jego zdaniem elementach aplikacji.

Proste urządzenia, które z natury mają bardzo ograniczone zasoby sprzętowe – modemy, routery, firewalle czy starsze telefony komórkowe zostały wyposażone w oprogramowanie napisane w Asemblerze lub C/C++ właśnie ze względu na ich ograniczenia.

Obecnie chyba zapomina się o historii i tworzy Pythony, PHPy, C# i wpycha się gdzie się da JIT-tery. Nie jest to dobra droga – nie upraszczajmy rzeczy tylko i wyłącznie dlatego, że zdobędziemy tym samym rzesze programistów mogących pisać swoje aplikacje na dane środowisko. Apple iOS jest doskonałym potwierdzeniem mojej teorii, która działa w praktyce właśnie na iPhonach, iPadach i innych urządzeniach iNaPoczątku.

Bierzmy więc lekcję z przeszłości i przestańmy upraszczać kodowanie dla „magików”, którzy nauczyli się podstaw Javy z tutoriali. Programowanie to nie tylko kopiuj-wklej z sieci. Programiści języków kompilowanych wiedzą, że jest to sztuka, która wpływa bezpośrednio na jakość ich produktu. Języki kompilowane choć nieco trudniejsze do opanowania i wymagające złożonych umiejętności algorytmicznych sprawiają, że oprogramowanie działa szybciej a urządzenia stabilniej. Nauka tych języków nie jest wybitnie trudna a komplementarną wiedzę uzyskacie już w szkole średniej czy na studiach pierwszego stopnia.

Na koniec ludowe przysłowie: „Kto drogi skraca, ten do domu nie wraca”.

 

Pozdrawiam, M.M.