Języki programowania - mars.iti.pk.edu.plmars.iti.pk.edu.pl/~anka/WSEiA/PI/jezykiprog.pdf · –...

51
Języki programowania

Transcript of Języki programowania - mars.iti.pk.edu.plmars.iti.pk.edu.pl/~anka/WSEiA/PI/jezykiprog.pdf · –...

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]; osoba.wiek

int wiek;

osoba;

}

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

if (w) I1;

else I2;

if (w)

{I1; I2;…;In}

else

{J1;J2;…;Jn}

goto

if w then I1

else I2

if w then

begin I1;I2;…;In;end

else

begin J1;J2;…;Jn;end

fortran

pascal

C, C++, Java

Instrukcje sterujące Imperatywne – zmiana kolejności

wykonywania instrukcji

while (w) {I1;I2}

do {I1;I2} while (w)

for(w1;w2;w3)I1;

switch(w1)

{ case s1: I1;

case s2: I2;

default: I3;

}

while w do

begin I1; I2 end;

repeat I1 until w

case w1 of

s1: I1;

s2: I2;

end

for z:=w1 to w2 do I1;

komentarze

//komentarz

/*komentarz*/

C komentarz

{ komentarz }

Procedury i funkcje

procedura

moduł

wywołujący

CALL procedura

procedura;

Parametry:

formalne

aktualne

Przekazywanie:

przez wartość

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 –język;

T – słownik symboli końcowych

N – zbiór symboli pomocniczych

P – zbiór produkcji (reguł syntaktycznych)

S – 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 A

B

C

C

A

A

(

+

) B

B

C

C

A

x

x

A (

+

) A

A

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 leksem typ

id1 i integer

id2 j integer

:=

id2 +

id1 1 MOV id1, R1

ADD R1, #1.0

MOV R1, id2

składnik wyrażenie

+

-

wyrażenie

składnik wyrażenie

*

/

x

y

z

składnik

x

x+y

x*y

x*y-z

x+y*z

x/y+(x+y)

w x*y-z

s w

s

-

z

s * w

x s z

s

y

drzewo składniowe

if W1 then if W2 then I1 else I2

if Wyr then Instr else Instr

if (w1)

if(w2)

I1;

else

I2;

if (w1)

{

if(w2)

I1;

}

else

I2;

if-then-else

instrukcja

if

Wyr if

then

instrukcja

if Wyr instrukcja else instrukcja

w1

then

w2 I1 I2

instrukcja

then instrukcja else instrukcja

w2

if

if Wyr

w1 I2

if Wyr 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 klauzulowej (OR)

R OR ⌐ Q

P OR R -rezolwenta

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:

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).

stałe

zmienne

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