Język programowania - zbiór zasad określających kiedy ciąg symboli stanowi program, czyli napis opisujący obliczenia oraz jakie obliczenia oznacza[1].

Podobnie jak języki naturalne, język programowania składa się ze zbiorów reguł syntaktycznych oraz semantycznych, które opisują, jak należy budować poprawne wyrażenia oraz jak komputer ma je rozumieć. Wiele języków programowania posiada pisemną specyfikację swojej składni oraz semantyki, lecz inne zdefiniowane są jedynie przez oficjalne implementacje.

Język programowania pozwala na precyzyjny zapis algorytmów oraz innych zadań, jakie komputer ma wykonać. W niektórych pracach pojęcie języka programowania jest ograniczane wyłącznie do tych języków, w których można zapisać wszystkie istniejące algorytmy - od strony matematycznej oznacza to, że język musi być przynajmniej zupełny w sensie Turinga[2], jednak można się także spotkać z wykorzystaniem tego pojęcia na określenie również bardziej ograniczonych języków.

Spis treści

edytuj Definicje

Język programowania może być zdefiniowany ze względu na kilka cech:

  • Funkcja: JÄ™zyk programowania sÅ‚uży do tworzenia programów komputerowych, których zadaniem jest przetwarzanie danych, wykonywanie obliczeÅ„ i algorytmów oraz kontrolowanie/obsÅ‚uga zewnÄ™trznych urzÄ…dzeÅ„, np. drukarek, robotów itd.
  • Przeznaczenie: JÄ™zyki naturalne sÅ‚użą do komunikacji miÄ™dzy ludźmi, natomiast jÄ™zyki programowania umożliwiajÄ… wydawanie poleceÅ„ maszynom. Niektóre z jÄ™zyków sÄ… wykorzystywane również do kontrolowania jednego urzÄ…dzenia przez inne. PrzykÅ‚adowo, program wykonywany na komputerze może wygenerować kod PostScript do sterowania pracÄ… drukarki bÄ…dź wyÅ›wietlacza.
  • Konstrukcje skÅ‚adniowe: JÄ™zyk programowania może zawierać konstrukcje skÅ‚adniowe do manipulowania strukturami danych oraz zarzÄ…dzania przepÅ‚ywem sterowania.
  • Moc: Teoria obliczeÅ„ klasyfikuje jÄ™zyki wedÅ‚ug rodzajów obliczeÅ„, które można za ich pomocÄ… zrealizować (Hierarchia Chomsky'ego). We wszystkich jÄ™zykach zupeÅ‚nych w sensie Turinga da siÄ™ zaimplementować ten sam zbiór algorytmów. PrzykÅ‚adem czÄ™sto stosowanego jÄ™zyka niezupeÅ‚nego jest SQL sÅ‚użący do komunikacji z bazÄ… danych.

Języki, w których nie da się realizować obliczeń (języki znaczników, jak HTML czy XML oraz gramatyki formalne, np. BNF), nie są zazwyczaj uznawane za języki programowania.

edytuj Przeznaczenie

Memetyczna ewolucja niektórych języków programowania wg deklaracji autorów lub oficjalnych specyfikacji

Obecnie na świecie istnieją tysiące języków programowania i każdego roku powstają nowe. Od języków naturalnych odróżniają się wysoką precyzją oraz jednoznacznością. Człowiek podczas komunikacji między sobą stale popełnia niewielkie błędy lub pozostawia niedomówienia wiedząc, że drugi rozmówca najczęściej go zrozumie. Maszyny wykonują zadania dokładnie, dlatego każdą czynność trzeba opisać ściśle krok po kroku, ponieważ komputer nie potrafi domyślić się, co programista miał na myśli.

Obecnie na świecie istnieją tysiące języków i co roku powstają nowe. Wiele z nich zostało zaprojektowanych od zera, lecz powszechna jest praktyka rozwijania już istniejących rozwiązań oraz celowego upodabniania jednego języka do innego. Pozwala to na szybsze opanowanie nowego języka przez programistów mających już doświadczenie w tworzeniu aplikacji. Potrzeba istnienia wielu różnorodnych języków wynika z dużej liczby sytuacji, w których są one wykorzystywane - każda posiada pewne specyficzne wymagania:

  • Wielkość programów waha siÄ™ od niedużych skryptów pisanych przez amatorów do potężnych aplikacji rozwijanych przez setki programistów.
  • DoÅ›wiadczenie użytkowników waha siÄ™ od nowicjuszy lub programistów okazjonalnych wymagajÄ…cych przede wszystkim prostoty, do ekspertów potrafiÄ…cych zrobić użytek z oferowanych możliwoÅ›ci.
  • Tworzone programy muszÄ… speÅ‚niać okreÅ›lone wymagania dotyczÄ…ce szybkoÅ›ci, skalowalnoÅ›ci oraz wielkoÅ›ci.
  • IstniejÄ…ce jÄ™zyki mogÄ… być zbyt rozbudowane do pewnych zadaÅ„.
  • Programy mogÄ… nie zmieniać siÄ™ z biegiem lat lub być poddawane staÅ‚ym modyfikacjom.
  • ProgramiÅ›ci majÄ… różne gusta - każdy z nich ma swój ulubiony jÄ™zyk, w którym pisze mu siÄ™ najwygodniej.

Z tych powodów nie powiodły się do dziś próby stworzenia języka uniwersalnego.

Obecnie panuje tendencja do tworzenia języków umożliwiających rozwiązywanie problemów na wyższym poziomie abstrakcji. Pierwsze języki programowania były mocno związane z konkretnym sprzętem. Z biegiem czasu wynalezione zostały nowe techniki tworzenia oprogramowania znacznie poprawiające przenośność i oraz opracowane algorytmy pozwalające automatycznie realizować zadania, którymi dotąd musiał zajmować się programista. Skraca to czas tworzenia aplikacji i zmniejsza ilość okazji do popełnienia błędu, lecz w niektórych sytuacjach odbija się to negatywnie na wydajności (np. język Java).

edytuj Elementy języka

Kolorowanie składni jest często wykorzystywane w edytorach kodu do wizualnego różnicowania poszczególnych elementów składni, co ułatwia czytanie kodu. Na obrazku pokolorowany kod w języku Python.

Postać programu wyrażona w języku programowania określana jest jako kod źródłowy. Na język programowania składa się kilka elementów:

edytuj Składnia

Aby dany ciąg znaków mógł być rozpoznany jako program napisany w danym języku, musi spełniać reguły składni. Składnia opisuje:

  • Rodzaje dostÄ™pnych symboli.
  • Zasady, wedÅ‚ug których symbole mogÄ… być łączone w wiÄ™ksze struktury.

Składnia najczęściej opisywana jest w formalnym zapisie będącym połączeniem wyrażeń regularnych oraz notacji BNF lub EBNF. Poniżej przedstawiony jest przykład prostej gramatyki wzorowanej na języku Lisp:

wyrazenie ::= atom | lista
atom  ::= liczba | symbol
liczba  ::= [+-]?['0'-'9']+
symbol  ::= ['A'-'Za'-'z'].*
lista  ::= '(' wyrazenie* ')'

Zapis ten określa wygląd i budowę kolejnych symboli:

  • Wyrażeniem nazwiemy atom i listÄ™.
  • Atomem nazwiemy każdÄ… liczbÄ™ lub symbol.
  • LiczbÄ… nazwiemy ciÄ…g cyfr, który może zaczynać siÄ™ opcjonalnie od znaku + lub -.
  • Symbolem nazwiemy dowolnÄ… sekwencjÄ™ dużych i maÅ‚ych liter alfabetu Å‚aciÅ„skiego.
  • ListÄ… nazwiemy parÄ™ nawiasów, w której może siÄ™ znaleźć zero lub wiÄ™cej wyrażeÅ„.

Przykładowe ciągi, które spełniają podane reguły składni to: "12345", "()", "(a b c232 (1))".

Zauważmy, że na etapie przetwarzania składni w ogóle nie jest brane pod uwagę znaczenie poszczególnych symboli. W praktyce kod poprawny składniowo nie musi być poprawny semantycznie. Występuje tu analogia do języków naturalnych. Zdanie "Bźdźiągwy się mucioszą" jest poprawne pod względem gramatycznym, lecz nie posiada żadnego znaczenia, ponieważ zostały w nim użyte nieistniejące słowa.

edytuj Semantyka

Semantyka języka programowania definiuje precyzyjnie znaczenie poszczególnych symboli oraz ich funkcję w programie. Semantykę najczęściej definuje się słownie, ponieważ większość z jej zagadnień jest trudna lub wręcz niemożliwa do ujęcia w jakikolwiek formalizm. Część błędów semantycznych można wychwycić już w momencie wstępnego przetwarzania kodu programu, np. próbę odwołania się do nieistniejącej funkcji, lecz inne mogą ujawnić się dopiero w trakcie wykonywania.

edytuj Typy danych

Każdy język operuje na jakimś zestawie danych, dlatego niezbędne jest podzielenie danych na odpowiednie typy, zdefiniowane ich właściwości oraz operacji, jakie można na nich realizować. Większość języków posiada typy danych do reprezentowania:

  • Liczb caÅ‚kowitych w różnych zakresach.
  • Liczb zmiennoprzecinkowych (reprezentacje liczb rzeczywistych o różnym stopniu dokÅ‚adnoÅ›ci)
  • CiÄ…gów tekstowych.

Od strony sprzętowej wszystkie te informacje wyrażane są za pomocą sekwencji zer i jedynek. Język programowania nakłada jedynie odpowiednie ograniczenia i zasady ich przetwarzania. Zjawisko konwersji wartości jednego typu na inną nazywa się rzutowaniem.

edytuj Biblioteki standardowe

Dla większości języków zdefiniowana jest także biblioteka standardowa zawierająca podstawowy zestaw funkcji pozwalających realizować wszystkie najważniejsze operacje, np.:

  • ObsÅ‚ugÄ™ wejÅ›cia-wyjÅ›cia.
  • ObsÅ‚ugÄ™ plików.
  • ObsÅ‚ugÄ™ wielowÄ…tkowoÅ›ci.
  • ZarzÄ…dzanie pamiÄ™ciÄ….
  • Podstawowe typy danych oraz funkcje do zarzÄ…dzania nimi.
  • Operacje na ciÄ…gach tekstowych.

Użytkownicy traktują bibliotekę standardową często jako część języka, lecz od strony twórców są to osobne twory. Przykładowo, programiści piszący w języku D mają do dyspozycji zarówno oficjalną bibliotekę Phobos, jak i alternatywny projekt Tango.

edytuj Wykonywanie kodu

Aby program napisany w danym języku mógł być wykonany, niezbędne jest odpowiednie przetworzenie jego kodu źródłowego:

  • Kompilacja - kod źródÅ‚owy jest tÅ‚umaczony do postaci kodu maszynowego, czyli sekwencji elementarnych operacji gotowych do bezpoÅ›redniego przetworzenia przez procesor komputera. Jeżeli dany jÄ™zyk programowania podlega kompilacji, okreÅ›lany jest mianem kompilowanego jÄ™zyka programowania.
  • Interpretacja - kod źródÅ‚owy jest na bieżąco tÅ‚umaczony i wykonywany przez dodatkowy program zwany interpreterem. Jeżeli jÄ™zyk podlega interpretacji, nazywany jest interpretowanym jÄ™zykiem programowania.

Kompilacja do kodu maszynowego zapewnia najwyższą wydajność programom, lecz wygenerowany kod jest ściśle powiązany z platformą sprzętową. Ponadto kompilowane języki są bardziej zbliżone do sposobu funkcjonowania sprzętu, przez co programowanie w nich jest trudniejsze. Języki interpretowane zapewniają większą przenośność programów, które często są niezależne od platformy i systemu operacyjnego. Aby programy wyrażone w języku interpretowanym można było uruchomić na innej platformie, wystarczy napisać dla niej interpreter. Jednak taki sposób wykonywania odbija się negatywnie na wydajności. Alternatywnym rozwiązaniem jest kompilacja programów do postaci pośredniej, tzw. kodu bajtowego (ang. byte code). Jest ona wykonywana przez wirtualne maszyny tłumaczące elementarne rozkazy kodu bajtowego na rozkazy procesora.

edytuj Klasyfikacja języków programowania

Języki programowania mogą być podzielone ze względu na:

edytuj Najpopularniejsze języki programowania

Lista dziesięciu najpopularniejszych języków programowania [3]:

  1. Java
  2. C
  3. C++
  4. PHP
  5. Visual Basic
  6. Perl
  7. Python
  8. C#
  9. JavaScript
  10. Ruby

edytuj Zobacz też

edytuj Linki zewnętrzne

Przypisy

  1. ↑ Mordechai Ben-Ari: Understanding Programming Languages. Chichester: John Wiley & Sons, 1996. 
  2. ↑ Bruce J. MacLennan: Principles of Programming Languages. Oxford University Press, 1987. ISBN 0-19-511306-3. 
  3. ↑ TIOBE Programming Community Index for June 2008