Języki programowania
Transkrypt
Języki programowania
Języki programowania historia • • • Programowanie w języku maszynowym komputera (1-sza generacja) Wprowadzenie nazw mnemonicznych – kody operacji, identyfikatory – argumenty; ręczne tłumaczenie Asembler – program tłumaczący język asemblerowy (2-ga generacja) Język asemblerowy - wady – – • zależny od architektury konkretnego komputera Programowanie „małymi kroczkami” Języki programowania 3trzeciej generacji – Wysokopoziomowe konstrukcje pierwotne, dające się zaimplementować w postaci ciągu rozkazów maszynowych Wczesne języki programowania trzeciej generacji • FORTRAN (FORmula TRANslator)zastosowania naukowe i inżynieryjne • COBOL (Commom Busines-Oriented Language) – zastosowania biznesowe (siły morskie USA) TRANSLATOR Program umożliwiający wykonanie programu napisanego w języku różnym od języka maszynowego • Kompilator program źródłowy → program wynikowy • Interpreter program wykonujący program; rozpoznanie każdej instrukcji + wykonanie Asembler - kompilator • Języki trzeciej generacji – uniezależnienie od konkretnego komputera Jeden program – różne kompilatory – różne platformy • W praktyce – brak ścisłych ustaleń dot. definicji języka → problemy z przenoszeniem oprogramowania → wprowadzenie standardów • Środowiska programistyczne Paradygmaty programowania Różne ścieżki rozwoju języków programowania •funkcyjny – Lisp, ML, Scheme •obiektowy – SIMULA, Smaltalk,C++, Ada95, Visual Basic, Java •imperatywny – Fortran, Cobol, Algol, basic, APL, C, Pascal,Ada •deklaratywny – GPSS, Prolog Paradygmat imperatywny (proceduralny) • Znalezienie algorytmu rozwiązującego problem • Dane, ciąg poleceń, wyniki • Zgodny z cyklem maszynowym JC (pobierz, dekoduj, wykonaj) Paradygmat deklaratywny • Pytanie: „Na czym polega problem” • Zadanie programisty: precyzyjny opis problemu • Zaimplementowanie ogólnego algorytmu rozwiązywania problemów • Początkowo języki specjalnego przeznaczenia; wąska klasa zastosowań – Symulowanie systemów ekonomicznych, politycznych, fizycznych Paradygmat funkcyjny • Konstruowanie czarnych skrzynek: we; wy • Program w Lisp’ie: (podziel (sumuj liczby) (zlicz liczby)) (pierwszy(sortuj lista)) • Modularne konstruowanie programów Paradygmat obiektowy • • OOP Object Oriented Programming Dane – obiekty implementowane oddzielnie, zawierające zestaw funkcji do ich obsługi • Komunikacja między modułami – przesyłanie komunikatów CORBA – Common Object Request Broker Architecture Paradygmaty programowania Wpływ paradygmatu programowania na proces rozwiązywania problemów Paradygmaty tworzenia oprogramowania Paradygmaty programowania • Programowanie liniowe - wszystko w jednym worku, go to ! • Programowanie strukturalne - moduły operujące na lokalnych danych i zmiennych, komunikacja przez przekazywanie parametrów, każdy moduł testowany osobno Wada: zmiana struktur danych wymaga zmiany wielu modułów • Programowanie zorientowane obiektowo • Programowanie funkcyjne Style programowania • Top-down • Bottom-up Cykl życia (life cycle) programu: – projekt programu (program design) – napisanie programu – uruchamianie (edycja - poprawianie, translacja, wykonanie) – testowanie, rozwijanie, naprawianie i pielęgnacja (maintanence) programu. Narzędzia do tworzenia oprogramowania: – – – – edytory kompilatory i interpretery debugery programy wspomagające tworzące środowisko pracy Klasyfikacja języków programowania • • • • • • • • • • • • • • Języki bliskie kodu maszynowego Języki imperatywne Języki deklaratywne Języki proceduralne Języki funkcyjne Języki definicyjne - kolejne podstawienia interpretowane są jako definicje Języki logiczne - oparte na logice matematycznej, programy traktowane są jako formuły logiczne Języki ograniczeń (constraint) - problemy są w nich specyfikowane nie w sposób jawny lecz przez podanie zbioru ograniczeń Języki obiektowo zorientowane Języki programowania współbieżnego - dla komputerów o wielu procesorach Języki „przepływu danych” (dataflow) - dla komputerów o eksperymentalnej architekturze, sterowanych nie tyle kolejnymi instrukcjami co przepływem danych Języki czwartej generacji (4GL) - języki bardzo wysokiego poziomu, używają graficznych systemów dialogu z użytkownikiem lub opisu w języku naturalnym Języki zapytań baz danych - do zapisywania i wydobywania informacji z baz danych Metajęzyki - służące do opisu innych języków programowania 1952 asemblery 1957 Fortran John Backus,IBM, Fortran II, Fortran IV (1966), Fortran 77 (1977), Fortran 90 (1991) 1960 LISP J.McCarthy 1960 Algol Algol 60, Algol 68 1960 COBOL …COBOL 85 1962 APL K. Iverson, Harvard 1962 Simula 1964 Basic 1964 PL1 1971 Prolog 1972 C Dennis Ritchie, Bell Labs, C*, Visual C 1975 Pascal N. Wirth 1979 Modula-2 N. Wirth 1980 d-BASE III, III+, IV, V 1983 Smaltalk 1983 Ada ..Ada 95 1986 C++ Bjarne Stroustrup, AT&T, 1988 Mathematica Oparta na SMP 1995 Java SunLabs, Fortran • • • • 1957r Obliczenia naukowe, techniczne Biblioteki matematyczne Analiza numeryczna, statystyka C. Dijkstra, tak pisał o Fortranie w 1972 roku: ... wady ujawniły się dopiero po 10 latach intensywnego używania, ludzie go projektujący godni są podziwu... jednak im prędzej zapomnimy, że FORTRAN kiedykolwiek istniał, tym lepiej, bo jako nośnik myśli nie jest on już wystarczający: marnuje nasze władze umysłowe, jest zbyt ryzykowny i dlatego zbyt drogi by go używać. ... Pascal • 196x ; 1971, Niklaus Wirth • Następca Algolu • Narzędzie do nauki programowania • Rozbudowane struktury danych C • Dennis Ritchie 1972 • Pierwotnie – język do tworzenia systemów operacyjnych (unix, PDP11) • Cechy języka wysokiego oraz niskiego poziomu • Nie związany z żadnym systemem ani sprzętem "Pisanie programów w C jest jak szybki taniec z brzytwami na śliskiej podłodze". Ada • 1980 Departament obrony USA • Augusta Ada Lovelace z d. Byron (1815-1852) • Projektowanie systemów czasu rzeczywistego • Równoległe wykonywanie pewnych czynności • Obsługa sytuacji wyjątkowych • Wbudowane systemy komputerowe • Ada 95 – paradygmat obiektowy C++ • Rozszerzenie C • Paradygmat obiektowy Java • 199xr • C,C++ • Przenoszenie w sieci programów wykonywalnych aplety • Sztuczna inteligencja – LISP, Prolog, powłoki systemów ekspertowych • DBMS – SQL (Structured Query Language) – języki baz danych: Oracle, Ingres, Informix, Paradox, dBase, FoxPro, MS Access ... • 4GL – – – – • • • • • CA-Visual Objects Delphi Clarion Magic Programowanie wizualne (VPL) Języki symulacyjne Programowanie współbieżne Modelowanie matematyczne (Matlab, Mathcad, Mathematica) Programowanie www – – – – – – – Java script CGI CSS PHP Perl Tcl/Tk DHTML • CASE Computer Aided Software Engineering, Podstawowe elementy języków programowaia (imperatywnych i obiektowych) • Instrukcje – Deklaratywne ( deklaracje) – Imperatywne – Komentarze • Zmienne, stałe, literały const stala=1999; Typy danych Definiują sposób interpretacji danych oraz możliwe operacje • Liczby całkowite integer – (notacja uzupełnieniowa do 2) • Liczby rzeczywiste real – (postać zmiennopozycyjna) • Znaki character – (kod ASCII, unicode) • Wartości logiczne boolean – true, false Deklaracje zmiennych Fortran: REAL promien,obwod,pole INTEGER i,j Pascal: var promien,obwod,pole: real; i,j: integer C, C++, Java; float promien,obwod,pole; int i,j; Struktury danych tablica jednorodna Fortran: INTEGER wynik(5,2) Pascal: var wynik: array[1..5,1..2]of integer; C: int wynik[5][2]; Java; int wynik[][]=new int [5][2]; 1,1 1,2 2,1 2,2 3,1 3,2 4,1 4,2 5,1 5,2 Struktury danych tablica niejednorodna Pascal: var osoba: record nazwisko: packed array [1..8] of char; wiek: integer; end C: struct {char nazwisko [8]; int wiek; osoba; } osoba.wiek Instrukcje przypisania C, C++, Java i=i+1; Ada, Pascal i:=i+1; fortran razem=poczatek//koniec // - konkatenacja + - dodawanie lub konkatenacja- zależnie od typu argumentów (np. Java) przeciążenie Instrukcje sterujące Imperatywne – zmiana kolejności wykonywania instrukcji goto fortran if (w) I1; else I2; if (w) {I1; I2;…;In} if w then I1 else I2 pascal if w then begin I1;I2;…;In;end else else {J1;J2;…;Jn} begin J1;J2;…;Jn;end C, C++, Java Instrukcje sterujące Imperatywne – zmiana kolejności wykonywania instrukcji do {I1;I2} while (w) while (w) {I1;I2} repeat I1 until w while w do begin I1; I2 end; for(w1;w2;w3)I1; for z:=w1 to w2 do I1; switch(w1) { case s1: I1; } case w1 of case s2: I2; s1: I1; default: I3; s2: I2; end komentarze //komentarz /*komentarz*/ C komentarz { komentarz } Procedury i funkcje Parametry: formalne moduł wywołujący aktualne procedura Przekazywanie: przez wartość CALL procedura procedura; przez referencję Instrukcje we/wy readln (wartosc); writeln(wartosc); scanf(”%d”,&wartosc); printf(”%d”,wartosc;) cin>> wartosc; Cout << wartosc; translacja Program źródłowy -> program wynikowy FAZY TRANSLACJI: •Analiza leksykalna – tworzy ciąg tokenów (leksemów) •Analiza składniowa - rozpoznaje gramatyczną strukturę programu •Generowanie kodu - Tworzenie programu w języku maszynowym Język • • • • Podstawa - słownik – symbole Ciągi słów – zdania Składnia – zbiór reguł Semantyka – znaczenie L=L(T, N, P, S) L T N P S –język; – słownik symboli końcowych – zbiór symboli pomocniczych – zbiór produkcji (reguł syntaktycznych) – symbol początkowy; S Є N Notacja BNF Backus-Naur-Form metasymbole ::= | { } Przykład: A::=x|(B) B::=AC C::={+A} +,x,(,) – symbole końcowe zdania: x (x) (x+x) ((x)) Diagramy składniowe A::=x|(B) B::=AC C::={+A} A ( B x B A C A + C ) A ( A ) A + x program p1; var i,j: integer; begin j:=i+1; end. Analiza leksykalna: program p1 ; var i j integer begin := +1 end . Analiza składniowa: drzewo rozbioru składniowego, tabela symboli: nazwa id1 := id2 MOV id1, R1 ADD R1, #1.0 MOV R1, id2 + id1 id2 1 leksem i j typ integer integer wyrażenie + składnik wyrażenie - x x+y składnik składnik * wyrażenie / x*y x*y-z x+y*z x y z x/y+(x+y) x*y-z w s s x * - w s y drzewo składniowe w s z if W1 then if W2 then I1 else I2 if-then-else if if (w1) if(w2) I1; else I2; else Instr Instr instrukcja instrukcja if if (w1) { if(w2) I1; } else I2; then Wyr Wyr then if instrukcja w1 if Wyr then instrukcja else w1 Wyr w2 then instrukcja I1 else instrukcja I2 instrukcja I2 if Wyr w2 then instrukcja I1 Konsolidacja i ładowanie Linker – program łączący – połączenie programów wynikowych w moduł wynikowy Program ładujący – umieszcza moduł w pamięci Programowanie obiektowe obiekt + metody(funkcje składowe) klasa - „typ” obiektu wzorzec do tworzenia obiektów komunikat – reprezentuje operację wykonaną na obiekcie metoda – określa sposób wykonania komunikatu dziedziczenie – własność umożliwiająca klasie pochodzącej uzyskiwanie pól i metod klasy rodzicielskiej polimorfizm każda klasa może mieć własne wersje metod kapsułkowanie – pewne elementy obiektu - prywatne Programowanie czynności współbieżnych Przetwarzanie równoległe, współbieżne Procesy, zadania, wątki • tworzenie nowych procesów • komunikacja; synchronizacja Programowanie deklaratywne •bazuje na logice formalnej •dedukcja logiczna ; rezolucje P OR Q Przesłanka: ⌐P Rezolucja->wniosek: Q ZASADA REZOLUCJI P OR Q zdania postaci R OR ⌐ Q P OR R -rezolwenta klauzulowej (OR) P → Q Q OR ⌐ P Prolog PROgramowanie w LOGice – cykliczne stosowanie zasady rezolucji – zbiór zdań początkowych (predykaty) – dedukcja FAKTY: szybszy(żółw, ślimak). szybszy(kot, żółw). REGUŁY: stałe zmienne szybszy(X,Y) AND szybszy(X,Z) → szybszy(X,Z) –logika szybszy(X,Z) :- szybszy(X,Y),szybszy(Y,Z) - Prolog ZAPYTANIA: szybszy(kot, żółw). szybszy(kot, ślimak). szybszy(W, żółw). szybszy(V,ślimak). szybszy(W, V). Programowanie zdarzeniowe • sterowane zdarzeniami • program jest cały czas bombardowany zdarzeniami (events), na które musi odpowiedzieć • przepływ sterowania w programie jest niemożliwy do przewidzenia z góry • dominujący typ programowania GUI zdarzenia - naciśnięcia myszy, klawiszy, żądania odświeżenia, różne zdarzenia sieciowe Programowanie komponentowe • rosnąca złożoność systemów informatycznych • konieczność skrócenia czasu ich budowy • potrzeba klarownej strukturalizacji procesu wytwarzania oprogramowania oraz podniesienia jego jakości • wynik ewolucji obiektowego podejścia do projektowania i implementacji aplikacji - wyposażenie obiektów aplikacji w predefiniowane usługi zapewniające realizacje szeregu standardowych funkcjonalności jak np.: możliwość zdalnej komunikacji, transakcyjność, bezpieczeństwo, trwałość danych, mechanizmy łączenia, samotestowanie, samoinstalacja, etc • dążenie do odseparowania usług, które można uznać za systemowe od funkcjonalności danej aplikacji • znacząca redukcja złożoności budowy aplikacji • wymaga opracowania interfejsów łączenia funkcjonalność aplikacji z częścią systemową stanowiącą środowisko wykonania komponentów • programowanie imperatywne oraz deklaratywne budowa serwera aplikacji • Systemy komponentowe strony serwerowej powstały w wyniku uogólnienia systemów opartych na koncepcji standardu CORBA [ORF1996] oraz usług systemowych opracowanych w ramach architektury OMA zwanych Common CORBA Service • Po stronie klienta zasadniczy wpływ na ukształtowanie się komponentów warstwy prezentacji posiadały technologie związane z tworzeniem stron WWW oraz budową web serwerów. • technologie środowisk komponentowych – CCM (CORBA Component Model) OMG – EJB (Enterprice Java Beans) SUN – COM+ (Common Component Model) .NET Microsoft