JĘZYKI PROGRAMOWANIA I ICH KLASYFIKACJA Cel: Wprowadzenie do programowania: języki i ich charakterystyka. Uczeń wymienia najbardziej znane języki programowania, rozróżnia interpretery i kompilatory Program. Język programowania • Program - zapis algorytmu w języku programowania Program komputerowy - algorytm zapisany w języku programowania (zapisany na nośniku w postaci pliku źródłowego lub wykonywalnego). • Język programowania: sformalizowany (zgodny z pewnymi regułami), zbliżony do języka naturalnego sposób zapisu algorytmu, tak aby był możliwy po kompilacji do wykonania przez komputer. Język programowania • Język programowania – jeden ze sposobów zapisu algorytmu. • Sztuczny język (w odróżnieniu do języków naturalnych), pozwala na zapis zadania i sposobu jego wykonania przez komputer. • Jest to zbiór zasad określających, kiedy ciąg symboli (opisujący np. obliczenia) tworzy program oraz jakie obliczenia opisuje. • Język programowania określony jest przez podanie jego składni i semantyki - ścisłych zasad tworzenia - instrukcji, określających elementarne (w danym języku) operacje. Programowanie • Programowanie to pisanie ciągów instrukcji (programu), który ma wykonać właśnie procesor. • Instrukcje te powinny być zapisane w postaci ciągów zer i jedynek, aby procesor był w stanie je poprawnie zinterpretować (zrozumiały dla procesora język zer i jedynek nazywamy językiem maszynowym). Instrukcje dla procesora • Instrukcje te powinny być zapisane w postaci ciągów zer i jedynek, aby procesor był w stanie je poprawnie zinterpretować • Zrozumiały dla procesora język zer i jedynek nazywamy językiem maszynowym. Język maszynowy • Program w języku maszynowym, rozumianym przez komputer jest ciągiem cyfr binarnych – zer i jedynek. Program taki jest praktycznie nieczytelny dla człowieka. • W praktyce do pisania instrukcji do bezpośredniego wykonania przez komputer używa się języka programowania niskiego poziomu tzw. asemblera. Asembler • Kodom instrukcji dla procesora odpowiadają symbole literowe. Są to skróty nazw czynności. • Również adresy komórek mają nazwy literowe a kompilator zamienia je na adresy liczbowe • Przykład: MOV AX DANE – AX – rejestr procesora – MOV – przesuń – DANE – etykieta komórki pamięci z danymi do przeniesienia do rejestru AX Programowanie w Asemblerze • Programowanie w Asemblerze polega na pisaniu ciągu instrukcji w bardziej przyjazny dla człowieka sposób. • Nie trzeba posługiwać się liczbami dwójkowymi, lecz krótkimi, z reguły trzyliterowymi poleceniami. • Procesor nie potrafi jednak wykonać programu napisanego w Asemblerze. Trzeba program przetłumaczyć na postać binarną - maszynową • Dlatego razem z opracowaniem Asemblera stworzono też specjalny program tłumaczący, który nazywamy kompilatorem Kompilator, kompilacja • Kompilator to program, który tłumaczy kod pewnego języka programowania na język maszynowy - ciąg zer i jedynek, które potrafi wykonać procesor. • Proces tłumaczenia programu na język maszynowy nazywamy kompilacją. Języki wysokiego poziomu • Programista Asemblera nie musi już co prawda używać wyłącznie zer i jedynek, jednak programowanie w Asemblerze nadal jest trudne i wymaga dużej wiedzy i cierpliwości. • Dla ułatwienia programowania wymyślono tak zwane języki wysokiego poziomu. • Jednym z nich jest Pascal. Programowanie w języku wysokiego poziomu – kod źródłowy • Programowanie w języku wysokiego poziomu polega na zapisaniu ciągu instrukcji za pomocą zbliżonych wyrażeń zbliżonych do mowy człowieka ( z reguły jęz. angielskiego) – dzięki temu jest proste. • Program napisany w języku wysokiego poziomu to tzw. kod źródłowy • Aby móc taki program uruchomić, należy go najpierw skompilować (czyli przetłumaczyć na przykład z języka Pascal na język maszynowy). Instrukcje • W przypadku tzw. języków wysokiego poziomu (m.in. Algol, Fortran, Cobol, C, BASIC, Pascal, Logo, Lisp, Prolog) instrukcje budowane są z – pewnej liczby słów angielskich, – znaków operacji matematycznych i logicznych, – stałych liczbowych oraz – symbolicznych nazw zmiennych Klasyfikacja języków programowania • Języki programowania mogą być podzielone ze względu na: – Paradygmat programowania – Generację języka programowania – Sposób kontroli typów. – Sposób wykonywania (kompilacja, interpretacja). – Poziom (języki niskopoziomowe są bardziej zbliżone pod względem budowy do działania sprzętu). – Przeznaczenie. Języki niestrukturalne, strukturalne, obiektowe • Języki niestrukturalne - FORTH, BASIC • Języki strukturalne (program budowany jest z mniejszych elementów: procedur, funkcji itp.), np. Pascal, C, FORTRAN • Języki obiektowe (program składa się z obiektów, które posiadają właściwości i potrafią wykonywać operacje), np. C++, Java - języki zorientowane obiektowo. Podział języków wg poziomu • 1. Języki niskiego poziomu tzw. asemblery • 2. Języki wysokiego poziomu, języki uniwersalne służące do rozwiązywania szerokiego zakresu problemów (Pascal, C, Logo, Basic, itd.) • 3. Języki zorientowane problemowo, nastawione na wąski zakres problemów (HTML, PHP, VBA, dBase) Języki wewnętrzne i zewnętrzne Języki programowania dzielimy na: • języki wewnętrzne (binarne lub asemblery), • języki zewnętrzne (FORTRAN, COBOL, PASCAL, C, BASIC, CLIPPER …). Generacje języków • • • • Wewnętrzne (binarne lub asemblery), maszynowe, algorytmiczne (Pascal, częściowo C), języki czwartej generacji (w tym niektóre języki do tworzenia aplikacji na bazie danych np. SQL) Pod względem stopnia zaawansowania: • Języki pierwszej generacji - są to języki maszynowe, czyli języki procesorów. Instrukcje są w nich zapisywane w postaci liczb binarnych. • Języki drugiej generacji - języki symboliczne, asemblery. • Języki trzeciej generacji - języki wysokiego poziomu, proceduralne (imperatywne). Do tej grupy należą między innymi: FORTH, BASIC - języki niestrukturalne, Pascal, C, FORTRAN - języki strukturalne, C++, Java - języki zorientowane obiektowo. • Języki czwartej generacji - języki bardzo wysokiego poziomu, nieproceduralne (deklaratywne). Przykładem języka z tej grupy jest: SQL. • Języki piątej generacji - języki sztucznej inteligencji, języki systemów ekspertowych. Języki najbardziej zbliżone do języka naturalnego. Przykładem języka piątej generacji jest PROLOG. Języki pierwszej generacji • Języki pierwszej generacji - są to języki maszynowe, czyli języki procesorów. • Instrukcje są w nich zapisywane w postaci liczb binarnych. • Przykładowy kod programu: 111010100000000000001111111111111111100010 011101100000000010100000001 Języki drugiej generacji • Języki drugiej generacji - języki symboliczne, asemblery. • Języki niskiego poziomu, pod względem składni tożsame z maszynowymi, z tą różnicą że zamiast liczb używa się tu łatwiejszych do zapamiętania mnemoników. • Przykładowy kod programu: jmp ffff:0 movax, bx add ax, 1 Pod względem znaczenia kod ten jest jednoznaczny z kodem binarnym przedstawionym w poprzednim punkcie (tylko dla procesorów z grupy 80x86). Języki trzeciej generacji • Języki wysokiego poziomu, proceduralne (imperatywne). • W językach tych jedna instrukcja jest tłumaczona na kilka instrukcji procesora. • Pierwszym językiem tego typu był ALGOL. Do tej grupy należą między innymi: – FORTH, BASIC - języki niestrukturalne, – Pascal, C, FORTRAN - języki strukturalne, – C++, Java - języki zorientowane obiektowo. • Przykładowy kod: if(!x) { printf("Nie wolno dzielić przez zero\n"); return 1; } Języki czwartej generacji • Języki bardzo wysokiego poziomu, nieproceduralne (deklaratywne). • Korzystając z tych języków programista skupia się na problemie, a nie na sposobie jego rozwiązania (języki zorientowane problemowo, task oriented languages). • Syntaktyka wielu języków czwartej generacji przypomina składnię języka naturalnego. • Języki te są one często używane do dostępu do baz danych. Przykładem języka z tej grupy jest: SQL. • Przykładowy kod: SELECT Towar FROM „Faktura" WHERE Cena >= 500 Języki pod względem przeznaczenia • Bazodanowe: dBase, Clipper, FoxPro, Access, Delphi, SQL-owe (np. Oracle). Ukierunkowanie na tworzenie aplikacji baz danych (zbiór informacji jednorodnych, łatwiej dopisywać informacje, dostosowanie do pracy w sieci, sortowanie) • Obliczeniowe (naukowo techniczne, statystyka), np. Fortran (są biblioteki do grafiki), Pascal, C/C++ (ojciec Pascal, matka assembler), podobny do UNIXa, wykonuje instrukcje nie dyskutuje. Jest jakby językiem uniwersalnym, właściwości sieciowe. C++ cechuje obiektowość. Gorzej z zastosowaniami bazodanowymi, biblioteka funkcji matematycznych mniejsza niż w Fortranie. • Specjalizowane: sztuczna inteligencja, systemy ekspertowe, przetwarzanie list, do symulacji procesów • Języki typu "Visual" (np. Visual C++, C#, Visual Basic, Delphi) Języki strukturalne, obiektowe • Języki niestrukturalne • Języki strukturalne (program budowany jest z mniejszych elementów: procedur, funkcji itp.), np. Pascal • Języki obiektowe (program składa się z obiektów, które posiadają właściwości i potrafią wykonywać operacje), np. C+ Implementacja (kodowanie) • W fazie implementacji następuje proces kodowania (pisania oprogramowania w konkretnym języku), projekt zostaje zaimplementowany w konkretnym środowisku programistycznym oraz wykonywane są testy poszczególnych modułów. • Wydzielenie modułów funkcji • Wstępne testowanie (debugger) • Dokumentacja techniczna dla programisty. Komentuje algorytm a nie instrukcje. Opis procedur, funkcji, danych we/wy • Kompilacja, usunięcie błędów (kod max zbliżony do ANSII, nie ignorować ostrzeżeń) Program- zapis algorytmu może mieć postać: 1. źródłową - w pewnym języku programowania 2. kodu pośredniego - ciąg instrukcji wykonywanych przez interpreter 3. binarną - skompilowana - ciąg instrukcji do wykonania bezpośredniego przez procesor Interpretery • Interpretery – interpretują program a nie kompilują. • Tłumaczą program w następujący sposób: 1. 2. 3. 4. pobierają jedną instrukcję programu tłumaczą na język maszynowy dają procesorowi do wykonania powracają do pkt. 1. • Językami interpretowanymi są na przykład: BASIC, SQL, JavaScript. Plusy i minusy interpretera • Aby uruchomić program zapisany w języku interpretowanym należy zawsze posiadać interpreter, bez niego program po prostu nie będzie działać. W związku z tym jeżeli chcemy sprzedać komuś program napisany w języku interpretera należy sprzedać go razem z interpreterem. • Programy zapisane w języku interpretowanym działają powoli, np. jeżeli w programie jakaś instrukcja ma być wykonywana tysiąc razy to interpreter będzie ją tysiąc razy tłumaczył. • Dobrą stroną interpreterów jest fakt, że programy napisane w ich językach charakteryzują się bardzo dużą przenośnością. To znaczy, że program napisany np. na komputerze PC na 99% będzie działał na komputerach iMac - należy mieć odpowiedni interpreter dla iMac-a Kompilatory • Kompilatory działają w następujący sposób: – tłumaczą cały program – zapisują przetłumaczony program w pamięci komputera lub na dysku • Program po przetłumaczeniu (skompilowaniu) przez kompilator jest gotowy do wykonania. • Językami kompilowanymi są na przykład: – Pascal, – C, C++, – Asembler, – COBOL, itp. Plusy i minusy kompilatorów • PLUSY – Programy skompilowane wykonują się szybciej niż interpretowane (nie muszą być na bieżąco tłumaczone), mają postać np. COM, EXE jako pliki wykonywalne. – Nie potrzeba kompilatora aby uruchomić program • MINUSY – Negatywną cechą kompilatorów jest przenośność programów. Programy skompilowane za pomocą kompilatora są w większości nieprzenośne, np. program napisany dla komputera iMac nie będzie działał na komputerze PC. Aby program zadziałał na innym rodzaju komputera należy program na tym komputerze skompilować. Elementy języka programowania Na język programowania składa się kilka elementów: • Składnia: Rodzaje dostępnych symboli – alfabet języka. • Semantyka języka programowania definiuje precyzyjnie znaczenie poszczególnych symboli oraz ich funkcję w programie – gramatyka języka programowania. Definiuje znaczenie poszczególnych sekwencji znaków Semantykę najczęściej definiuje 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. Typy danych • 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. Biblioteki standardowe • Dla większości języków zdefiniowana 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. Podsumowanie koncepcji języków programowania • • • • • W pamięci komputera program jest przechowywany jako kod maszynowy, będący instrukcjami dla konkretnego procesora. Instrukcje te przechowywane są w systemie zero-jedynkowym – język maszynowy. Dla ułatwienia programowania niskopoziomowego utworzono asembler (assembler), którego rozkazy odpowiadają bezpośrednio instrukcjom procesora, jednak zapisywane są w bardziej zrozumiałej dla nas formie. Później powstały języki interpretowane nie mające już tak bliskiego związku z procesorem, ale nadal podobnie jak asembler stanowiące jeden ciąg instrukcji. Przykładem takiego języka może być ogólnie znany Basic (GWBasic, Qbasic, inne). Jedna instrukcja języka drugiej generacji, może być tłumaczona na kilka, kilkadziesiąt a czasem więcej instrukcji procesora. Języki kolejnej generacji, np. Pascal, rozwinęły koncepcję programowania o możliwość podzielenia programu na moduły wykonujące różne operacje wchodzące w jego skład. Następną generację języków programowania tworzą tak zwane języki obiektowe, np. Delphi, Visual Basic, C++. Najpopularniejsze języki programowania • • • • • • • • • • Java C C++ PHP Visual Basic C# Python Perl Objective-C Delphi Basic • • • • • • BASIC (Beginner's All-purpose Symbolic Instruction Code) - język programowania wysokiego poziomu, opracowany w 1964 przez Johna George'a Kemeny'ego i Thomasa E. Kurtza w Dartmouth College w oparciu o Fortran i Algol-60. Założenia projektantów BASIC-a uwzględniały łatwość użytkowania, wszechstronność zastosowań, interaktywność i dobrą komunikację z użytkownikiem poprzez jasne komunikaty błędów. BASIC wybił się na czoło języków do zastosowań amatorskich i półprofesjonalnych po wprowadzeniu na rynek mikrokomputera Altair 8800. BASIC szybko zaimplementowany został przy budowie serii komputerów Apple, a później jako GW BASIC w IBM Następcą GW BASIC-a dla komputerów PC został QB, później rozprowadzany komercyjnie jako QuickBASIC, który w końcu wyewoluował w Visual Basic for Windows. Istnieją też alternatywne interpretery i kompilatory tego języka dla platformy win32 (Power BASIC, DarkBASIC itp.). Wersja darmowa to np. JustBASIC. Just BASIC is a programming language for the Windows operating system. It is completely free and it is suitable for creating all kinds of applications for business, industry, education and entertainment. Just BASIC borrows many features from our popular commercial product, Liberty BASIC. TURBO PASCAL • Turbo Pascal to bardzo popularny język programowania, zorientowany na naukę programowania strukturalnego. Pascal powstał w 1971 roku, kiedy to Niklaus Wirth opublikował pierwszy artykuł o nim, jego upowszechnienie nastąpiło po roku 1974. • Język Pascal miał służyć przede wszystkim do nauki programowania strukturalnego, tj. programowania dużych systemów tzw. metodą "z góry na dół", czyli określania dużych elementów poprzez elementy niższego rzędu, aż do końcowych elementów programowych realizujących określone funkcje. • Pascal jest on dobry do nauki podstaw programowania. Zyskał on dużą popularność dzięki prostej i ścisłej składni oraz czytelnej budowie programu, która łatwo może być modyfikowana. • Turbo Pascal, został wprowadzony na rynek w 1983 roku przez amerykańską firmę Borland International Inc. C/C++ • Język C opracował i zrealizował w latach siedemdziesiątych Dennis Ritchie jako narzędzie do stworzenia systemu operacyjnego Unix. • C jest językiem strukturalnym i zajmuje on miejsce pomiędzy typowymi językami wysokiego poziomu jak Pascal, Basic lub FORTRAN, a asemblerami. Dużą popularność język C zawdzięcza m.in. nowoczesnemu sterowaniu, prostocie wyrażeń oraz nowoczesnym strukturom danych i wielkiemu bogactwu operatorów. • Zaletą C jest jego "zorientowanie maszynowe" np. typy int, char, double float, pointer są tłumaczone prawiew stosunku 1:1 na konstrukcje kodu maszynowego • Obiektowa wersja C, czyli C++, została opracowana przez Bjarne Stroustrup'a z AT&T Bell Laboratories. C++ jest językiem strukturalnym z dodatkowymi konstrukcjami umożliwiającymi programowanie obiektowe i usprawniającymi składnię proceduralną. Język ten zyskał popularność ponieważ daje programiście możliwość tworzenia spójnego, szybkiego i niezawodnego kodu. Paradygmaty programowania • Paradygmat to przyjęty sposób widzenia rzeczywistości w danej dziedzinie, doktrynie itp. Jak to się ma do programowania? Greckie παράδειγμα oznacza wzorzec bądź przykład. Chodzi tu zbiór mechanizmów, jakich programista używa, pisząc program, i o to, jak ów program jest następnie wykonywany przez komputer. Paradygmat programowania to ogół oczekiwań programisty wobec języka programowania i komputera, na którym będzie działał program. Pardygmaty programowania - rodzaje • • • • • • • Programowanie imperatywne Programowanie obiektowe Programowanie funkcyjne Programowanie w logice Programowanie strukturalne Programowanie sterowane przepływem danych Programowanie sterowane zdarzeniami • Programowanie współbieżne Programowanie imperatywne: • • • • • • zmienne struktura blokowa wiązanie statyczne i dynamiczne organizacja wywołań podprogramów przydział pamięci na stosie i na stercie przykłady z języków Ada, C, Pascal Programowanie obiektowe: • • • • • • klasy jako abstrakcyjne typy danych dziedziczenie późne (dynamiczne) wiązanie wywołań polimorfizm szablony i klasy rodzajowe przykłady z języków C++, Java, C#, Ada 95, Smalltalk Programowanie funkcyjne: • • • • • • • • funkcje jako model programowania rachunek lambda dopasowywanie wzorca nadawanie typów rekursja leniwa ewaluacja funkcje wyższego rzędu przykłady z języków Lisp, Scheme, ML, Haskell Programowanie w logice: • rachunek predykatów w Prologu • rezolucja • listy Języki wg różnych kryteriów • wieloparadygmatowe : Ada • Clojure • Common Lisp • D • Icon • Lua • Nemerle • PHP • Python • Ruby • Scala • Snobol • proceduralne i strukturalne : AWK • C • COBOL • Forth • Fortran • Modula-2 • Oberon • Pascal • Perl • PLEX • PL/SQL • REXX • obiektowe: ActionScript • C++ • C++/CLI • C# • Delphi • Delphi.NET • Delphi Prism • Eiffel • Java • JavaScript • Object Pascal • Objective-C • Oxygene • Smalltalk • VB.NET • Funkcyjne: Clojure • Erlang • F# • Haskell • Lisp • ML • OCaml • Scheme • Logiczne: Prolog • edukacyjne : Comal • Logo • Small Basic • historyczne : ALGOL • APL • BASIC • Clascal • Clipper • JAS • Lisp • MUMPS • PLAN • PL/I • PL/M • SAKO • SAS (asembler) • Simula • inne : ABAP • Asembler • C-- • GAUSS • Lustre • MCPL • occam • QCL • SAS 4GL • SQL • Visual Basic Języki programowania szeroko rozumiane - kategorie: • skryptowe (np.: skrypty powłoki systemu operacyjnego) • obsługi stron internetowych - po stronie serwera (np.: PHP, JSP) • obsługi stron internetowych - po stronie klienta (np.: JavaScript, JScript, VBScript, ActionScript) • opisu dokumentów (np.: HTML, TeX) • opisu danych (np.: XML) • przetwarzania tekstu i danych (np.: AWK, Perl) • programowania baz danych (np.: PL/SQL) • ogólnego przeznaczenia (np.: C++, C#, Delphi, Java, Assembler)