Programowanie urządzeń typu embedded

W sferze programowania – podobnie jak w modzie – istnieją pewne trendy. Od dłuższego czasu można zaobserwować tendencję do korzystania z prostych, wysokopoziomowych rozwiązań kosztem szybkości działania. Jest to spowodowane przede wszystkim rosnącymi kosztami tworzenia dużych systemów oraz tanienia mocy obliczeniowej komputerów. Najczęściej wykorzystywanymi językami wysokiego poziomu są Java oraz C#. Programowanie w tych językach jest niezwykle szybkie i proste. Badania wykazały, że w języku Java tę samą aplikację pisze się około dwóch razy szybciej niż w konkurencyjnym języku C++, do dla firmy oznacza ograniczenie kosztów produkcji oprogramowania o połowę. Jednak to podejście nie sprawdza się w każdym przypadku. Najlepszym przykładem sytuacji, gdzie programowanie na wysokim poziomie się nie sprawdza, są systemy tupu embedded. Są to wysoce wyspecjalizowane urządzenia, które ze względu na produkcję w milionach egzemplarzy najczęściej mają sprzętową moc obliczeniową ograniczoną do minimum.

Przykładem urządzenia typu embedded może by odtwarzacz plików mp3. Producent zamierza wyprodukować miliony podobnych urządzeń i dlatego będzie się starać, żeby koszty poszczególnych elementów były jak najniższe. Jeżeli oszczędzimy 1 zł na każdym urządzeniu, używając słabszego procesora, to ta niewielka kwota pomnożona np. przez 50 000 000 wyprodukowanych egzemplarzy da już znaczącą różnicę w kosztach produkcji urządzenia. Drugim powodem, dla którego urządzenia typu embedded mają niską moc obliczeniową, jest oszczędność energii. Im mniejsza jest moc obliczeniowa procesora i im prostsze oprogramowanie, tym dłużej będzie działać nasz odtwarzacz.

Przy produkcji wielu milionów prostych, wyspecjalizowanych urządzeń korzystających z baterii najczęściej nie opłaca się korzystać z języków niskiego poziomu, najczęściej C lub C++. Języki te dodatkowo pozwalają na wysoki poziom kontroli nad wewnętrznym zachowaniem aplikacji, np. umożliwiają zarządzanie przydziałem pamięci, co pozwala na znaczne przyspieszenie aplikacji, chociaż jest to możliwe tylko dzięki dodatkowej pracy wysoko wykwalifikowanego programisty.

Przykład systemu typu embedded

Jednym z najpopularniejszych systemów typu embedded są telefony komórkowe. Mimo że współczesne telefony mają już moc obliczeniową zbliżoną do komputerów, a ostatnio pojawiły się produkty firmy Blackberry, które wykorzystują sprzętową maszynę Javy i przez to umożliwiają szybkie wykonywanie aplikacji napisanych w języku wysokiego poziomu, to ciągle jednak telefony komórkowe traktowane są jako systemy z ograniczonymi zasobami i wymagające daleko idącej optymalizacji.

Jednym z najpopularniejszych systemów operacyjnych stworzonych do programowania aplikacji w językach niskiego poziomu jest Symbian. Jest to system operacyjny napisany w języku C++. Udostępnia on pełne API, które umożliwia programowanie aplikacji na ten system operacyjny w języku C++. Symbian został zaprojektowany z myślą o ograniczeniu zużycia zasobów i dlatego programista programujący na ten system operacyjny już od samego początku spotyka się z technikami optymalizującymi zużycie zasobów. Symbian np. nie wykorzystuje wprowadzonych do języka C++ wyjątków, tylko zapewnia swój własny mechanizm, tzw. leavy.

Niestety, optymalizacja sposobu programowania pociąga za sobą znaczne utrudnienie dla programisty. Symbian jest znany z tego, że jest jedną z najtrudniejszych platform programistycznych. Inną znaną cechą jest bardzo duża liczba błędów istniejących ciągle w systemie. Przy niskopoziomowym programowaniu niestety programiści mylą się znacznie częściej niż przy programowaniu wysokopoziomowym. Efektem błędów w systemie wielokrotnie są problemy ze stworzeniem działającej aplikacji. Programiści zmuszeni są do szukania obejść błędów, które właściwie nie powinny w ogóle istnieć. To dodatkowo zwiększa koszty stworzenia oprogramowania na ten system operacyjny.

Alternatywy

Firma Blackberry wprowadziła na rynek telefony komórkowe wykorzystujące tzw. sprzętową maszynę wirtualną Javy. Na normalnym komputerze aplikacja napisana w języku Java jest wykonywana przez zewnętrzny program, co dodatkowo spowalnia działanie aplikacji. wykorzystanie sprzętowej maszyny wirtualnej, czyli stworzenie procesora interpretującego bezpośrednio tzw. kod binarny Javy umożliwiło znaczne przyspieszenie działania Javy i tym samym otwarło drogę do programowania systemów w tym języku. Technologia ta jeszcze nie jest dobrze rozwinięta, ale stanowi ciekawą alternatywę dla tradycyjnego programowania niskopoziomowego systemów ebedded.

Czy programowanie niskopoziomowe się opłaca?

Niestety nie da się jednoznacznie odpowiedzieć na pytanie, czy niskopoziomowe programowanie systemów ebedded się opłaca. Z całą pewnością jest opłacalne wtedy, kiedy poziom komplikacji oprogramowania jest bardzo niski, urządzenie jest produkowane w milionach egzemplarzy i wykorzystywana jest bateria do zasilania urządzenia. Od pewnego momentu opłaca się już programować na wysokim poziomie, jednak przejście to jest płynne i podjęcie decyzji o zastosowaniu jednej lub drugiej technologii jest możliwe dopiero po daleko idącej kalkulacji kosztów i analizie wymagań.

Programowanie multiplatformowe w C++

W dobie wielu konkurujących ze sobą systemów operacyjnych programista często staje przed wyborem platformy docelowej. Często okazuje się, że wybór ten nie jest prosty, ponieważ różni użytkownicy mają różne oczekiwania w stosunku do platformy. Podobnie było w przypadku oprogramowania telekomunikacyjnego, którego rozwijaniem zajmuję się dotychczas. Ze względu na łatwość i dobrą znajomość środowiska pierwotnie wybrany został system operacyjny Windows. Niestety, okazało się, że dostawca sprzętu niektóre potrzebne funkcje udostępnia jedynie pod systemem Linux RHEL. Najlepszym rozwiązaniem podczas pisania oprogramowania jest takie tworzenie kodu, aby był on dostępny pod maksymalną liczbą platform. Łatwo powiedzieć.

Jaki język programowania wybrać?

Współczesny świat IT wytworzył co najmniej kilkadziesiąt języków programowania. Każdy z nich ma swoje wady i zalety. Jeśli masz przed sobą jakieś zadanie do wykonania – który z nich powinieneś wybrać?

Scrum – zwinne zarządzanie projektami IT

Coraz większe zainteresowanie wśród programistów zyskują tzw. metodyki zwinne (ang. agile) zarządzania projektami. I nic dziwnego, gdyż badania przeprowadzone w USA wykazały, że projekty wykorzystujące to podejście uzyskują lepszy współczynnik ROI, czyli zwrot z zainwestowanych pieniędzy.

Synchroniczne vs asynchroniczne operacje wejścia-wyjścia

Ze względu na coraz większy poziom komplikacji systemów informatycznych, naturalną tendencją w językach programowania jest przestawianie się na coraz prostsze sposoby metody uzyskania podobnych (choć bynajmniej nie takich samych) efektów. Przykładami mogą być tutaj język Java czy też C# połączony z .Net. Proces ten w dużej mierze polega na usuwaniu konieczności poznawania sposobu działania systemów operacyjnych przez użytkownika. Użytkownik ma tylko składać w całość gotowe komponenty. Jednak takie „przyjazne dla idioty” rozwiązania prowadzą bardzo często do drastycznego spadku wydajności aplikacji.

Obiektowe podejście do operacji asynchronicznych

W jednym z poprzednich artykułów opisałem ideę działania operacji asynchronicznych. Poza wieloma zaletami operacje asynchroniczne mają jedną poważną wadę – są skomplikowane. Stosunkowo trudno jest zaimplementować dużą, multiplatformowa aplikację. Oczywiście możliwe jest obudowanie funkcji do obsługi operacji asynchronicznych klasami, które znacznie uproszczą nam korzystanie asynchronicznych operacji. Dzięki podejściu obiektowemu i zastosowaniu rozwiązań wyższego poziomu można utworzyć prosty i łatwy w użyciu interfejs.

Gry w HTML5

W momencie pojawienia się HTML 5 zaczęło się pojawiać nowe zjawisko – gry komputerowe działające w przeglądarce (i niekorzystające z rozszerzenia Flash). Być może te gry są przyszłością współczesnej rozrywki…