Chapter 1 - Introduction

Download Report

Transcript Chapter 1 - Introduction

Paradigme de programare
Mihai Zaharia
1
Obiectivele cursului
1.
2.
3.
4.
5.
Intelegerea principalelor paradigme de programare folosite in
dezvoltarea aplicatiilor la aceasta ora.
Familiarizarea cu diferite limbaje de programare care
implementeaza una sau mai multe paradigme simultan
Stabilirea tipurilor de probleme unde sunt folosite diverse
paradigme functie de context
Invatarea unor instrumente noi de programare
Limbajele care vor fi folositea de-a lungul cursului sunt
1.
2.
3.
4.
5.
6.
7.
8.
UML
C/C++
Java,
Java Beans
LabWindows
Python
Haskel
Prolog
2
Criterii folosite in evaluarea activitatii
 Participarea la orele de curs si de laborator:
 Neparticiparea la mai mult de 14% din laboratoare conduce
la refacerea disciplinei
 Activitatea de laborator (nu e de ajuns sa iti aduci
corpul la laborator = participare) 25%
 Teme acasa la majoritatea laboratorelor 25%
 Examen final 50% (este o singura nota) defalcat astfel:
 Proba de laborator – ELIMINATORIE 25% cu bilete si 2
ore maxim la dispozitie. Un subiect din doua trebuie sa fie
indeplinit integral pentru a se putea nota (min 5)
 Proba teoretica – 25% - test docimologic - contine si
intrebari cu caracter practic specfice laboratorului (min 5)
3
Indatoririle studentului
1.
Cititi materialele recomandate cu o zi inainte de fiecare curs
– elaborati o lista de intrebari eventual
2. Rezolvati temele pe acasa in saptamana in care le-ati primit
3. Participati la cursuri (suportul de curs livrat va contine
numai desenele/cod din slide-uri)
4. Rezervati un minim de 2-4 ore de studiu individual pe
saptamana pentru aceasta materie
5. Verificati intelegerea teoretica si practica a notiunilor
asimilate prin ajutarea colegilor cu raspunsuri legate de partea
teoretica sau ajutor (nu tema copiata) in rezolvarea
problemelor practice
6. Ca viitori ingineri este de asteptate sa Respectati codul etic
minim al IEEE
http://www.ieee.org/about/corporate/governance/p7-8.html
4
Sintaxa
 Defineste simbolurile si gramatica unui limbaj
 BNF sau
 EBNF
if-statement ::= if ( expression ) statement-block
[ else statement-block ]
statement-block ::= statement ';'
| '{' statement ';' [...] '}'
statement ::= if-statement | assignment-statement |
while-statement | ...etc...
5
Strategii de implementare
 Compilator:
 Interpretor:
 Hibrid:
6
Compilarea unui program
file.c
main() {
printf("hello");
exit(0);
}
Cod
sursa
Preprocesor
Compilator
printf.obj
<obj. code for
printf function>
Biblioteci (pentru
cod obiect
Analizor Lexical,
etc
Object
Code
LinkEditor
file.obj
.sym printf
FE048C7138
029845AAAF
...
Executable
Program
file.exe
<hardware
instructions>
Java: o strategie hibrida
Biblioteci
Executare
program
‘Escu.java
javac
Hello.class
Program
sursa Java
compilator
byte code
java
Sunt
‘escu!
MVJ:
- Verificare byte cod
- Incarcare clase
- interpretor
Java Runtime Environment (JRE)
8
Exemple de erori (Java):
public int cmmdc ( int v# ) // eroare lexicala
{
int z = value
y = v;
while ( y >= 0 )
{ int t = y;
y = z % y;
z = t;
}
return y;
}
9
Executia instructiunilor pe un CPU
0010110010100010
0001011110000000
0010110000011000
1101100001011001
0011001010001011
0000011101001111
1101100001100001
0010110100010001
0001011100001110
…etc…
10
Executarea unui program
Registri interni
Cache
RAM
Contorul
programului
11
Ce instructiuni de baza poate
interpreta un procesor?
LOAD
SAVE
MOVE
ADD
MULT
COMPARE
TEST
JUMP TO
12
Java code/bytecode
pentru JVM
 outer:
 for (int i = 2; i < 1000; i++)
 {
 for (int j = 2; j < i; j++)





{
if (i % j == 0) continue outer;
}
System.out.println (i);
}
De ce nu sunt continue
numerele/adresele de la bytecode?
0: iconst_2 //incepe for
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 44 //comparatia cu 1000
9: iconst_2 //incepe for
10: istore_2
11: iload_2
12: iload_1
13: if_icmpge 31 // compartia cu i
16: iload_1 //incepe if
17: iload_2
18: irem
19: ifne 25 // comparatia cu 0
22: goto 38
25: iinc 2, 1 //j++
28: goto 11
31: getstatic #84; //apel PrintStream
34: iload_1
35: invokevirtual #85;
//PrintStream.println:(I)V
38: iinc 1, 1 // i++
41: goto 2
13
44: return
Primele incercari de abstractizare
 Fortran, primul limbaj de nivel înalt,
@echo off cls
echo Press any key to start
AProgram.exe!
PROGRAM EXEMPLU
! VERSION 0.0.
pause > nul
CALL HELLO !apelarea subrutinei HELLO.
CONTAINS !CONTAINS incheie program principal AProgram.exe %1
if errorlevel 1
si incepe definirea subrutinelor
goto error
SUBROUTINE HELLO !definirea corp
echo AProgram has finished
SUBROUTINA
whatever it was doing.
WRITE(*,*) "HELLO WORLD!“ ! afisez "HELLO
goto end
WORLD!" la CONSOLA.
END SUBROUTINE HELLO ! Sfarsit SUBROUTINA error: echo Something went
wrong with Aprogram
END PROGRAM EXEMPLU !sfarsit PROGRAM
end
14
Cele mai cunoscute limbaje din generatia a treia
Functie de tipul de paradigma folosit in rezolvarea
problemelor
 Imperative: FORTRAN, COBOL, BASIC, C, Pascal
 Functionale: Scheme, Lisp
 Limbaje Logice: Prolog
 Orientate obiect:
 Orientate obiect pure: Java, Python
 Orientate obiect si imperative : C++, Perl, Visual Basic
15
Limbaje din generatia a patra
Acestea sunt deja orientate pe anumite tipuri de
aplicatii
 SQL pentru baze de date
 Limbajul Postscript pentru descrierea unei pagini
folosit de imprimante
 PDF pentru documente on-line
 HTML and PHP pentru continut World Wide Web
 Mathematica
16
Exemple - SQL
 Inserarea unui table intr-o baza de date:
INSERT INTO angajati(id, Nume, Prenume, functie)
VALUES (1445, ‘John’,’Smith',’manager’);
 Extragere de informatii functie de un criteriu dintr-
un tabel:
SELECT id, Prenume, salariu FROM angajati
WHERE ( Job = ‘manager’ );
 SQL este considerat a fi declarativ
17
Ce este o paradigma de programare?
 D1 (generală) Caz exemplar, model,
prototip, situaţie ideală, structură tip,
arhetip standard ş.a.
 D2. (în filozofie, la L.Wittgenstein) Modelele
filosofice, acele "tipare" care orientează
gândirea noastră în direcţii predeterminate.,
 D3 (în filozofia limbajului) Listă de cazuri
tipice de jocuri lingvistice prin care putem
înţelege conceptul general..."
18
19
Concepts, Techniques, and Models of Computer Programming (MIT Press, 2004)
Paradigme de programare (wiki)
Action
Agent-oriented
Aspect-oriented
Automata-based
Component-based
Flow-based
Pipelined
Concatenative
Concurrent computing
Relativistic programming
Data-driven
Declarative (contrast:
Imperative)
Constraint
Dataflow
Cell-oriented
(spreadsheets)
Reactive
Intensional
Functional
Logic
Abductive logic
Dialecting
Monolithic)
Answer set
Intentional
Object-oriented (OOP)
Constraint logic
Metaprogramming
By separation of concerns:
Functional logic
Automatic
Aspect-oriented
Inductive logic
Reflective
Role-oriented
End-user programming
Attribute-oriented
Subject-oriented
Event-driven
Homoiconic
Class-based
Service-oriented
Template
Prototype-based
Time-driven
Policy-based
Recursive
Expression-oriented
Non-structured (contrast: Value-level (contrast:
Structured)
Function-level)
Feature-oriented
Array
Probabilistic
Function-level (contrast:
Value-level)
Nondeterministic
Generic
Parallel computing
Imperative (contrast:
Process-oriented
Declarative)
Programming in the large
Procedural
and small
Language-oriented
Semantic
Discipline-specific
Structured (contrast: Nonstructured)
Domain-specific
Modular (contrast:
Grammar-oriented
20
Programarea nestructurată
 Bloc continuu
 Salt direct
ASM
.model small
.stack 1024
. data
z db ? ; n
MOV AX, @data
MOV DS, AX
MOV
al, 3 ; m=3
ADD
al, 5 ; m=m+5
Jmp
etl
etl: MOV z,al ; n=5
MOV al,z
MOV ah, 4ch
INT 21h
end start
Basic
10 rem program exemplu
20 m=3
30 m=m+5
40 goto 50
50 n=5
60 m=n
60 end
21
TIOBE Programming Community Index for August 2013
http://www.tiobe.com/content/paperinfo/tpci/index.html
Position
Aug 2013
Position
Aug 2012
Programming
Language
Ratings
Aug 2013
Delta
Aug 2012
Status
1
2
Java
15.978%
-0.37%
A
2
1
C
15.974%
-2.96%
A
3
4
C++
9.371%
+0.04%
A
4
3
Objective-C
8.082%
-1.46%
A
5
6
PHP
6.694%
+1.17%
A
6
5
C#
6.117%
-0.47%
A
7
7
(Visual) Basic
3.873%
-1.46%
A
8
8
Python
3.603%
-0.27%
A
9
11
JavaScript
2.093%
+0.73%
A
10
10
Ruby
2.067%
+0.38%
A
11
9
Perl
2.041%
-0.23%
A
12
15
Transact-SQL
1.393%
+0.54%
A
13
14
Visual Basic .NET
1.320%
+0.44%
A
14
12
Delphi/Object Pascal
0.918%
-0.09%
A--
15
20
MATLAB
0.841%
+0.31%
A--
16
13
Lisp
0.752%
-0.22%
A
17
19
PL/SQL
0.751%
+0.14%
A
18
16
Pascal
0.620%
-0.17%
A-
19
23
Assembly
0.616%
+0.11%
B
20
22
SAS
0.580%
+0.06%
B
22
Cmmdc Structurat in C
#include <stdio.h>
int main()
{
int a=1574, b=56, t, cmmdc;
while (b != 0)
{
t = b;
b = a % b;
a = t;
}
cmmdc = a;
printf("Greatest common divisior of %d and %d = %d\n",
a, b, cmmdc);
getch();
}
23
Procedural
Java
Script
cmmdc
function calculate()
{
var x = 167; var y = 3; var output;
output = cmmdc(Math.abs(x), Math.abs(y))
}
function cmmdc(x, y)
{
while (y != 0)
{
var
z = x % y;
x = y;
y = z;
}
return x;
}
24
Functional in C
#include <stdio.h>
int cmmdc(int u, int v)
{
if (v == 0)
return u;
else
return cmmdc (v, u % v);
}
int main(void)
{
int x =9, y=6;
printf("The gcd of %d and %d is %d\n",x,y,cmmdc(x,y));
return 0;
}
25
Functional cmmdc in Scheme
(define (cmmdc u v)
(if (= v 0) u
(cmmdc v (modulo u v) )
)
)
Sintaxa Scheme pentru o functie:
( define ( function-name param1 param2 ... )
body of function definition
)
26
Functional cmmdc in Scheme
(define (euclid)
(display "enter two integers:")
(let ( (u (read)) (v (read)) )
(display "the gcd of ")
(display u)
(display " and ")
(display v)
(display " is ")
(display (gcd u v))
(newline)
)
)
27
Imperativ in Java: cmmdc
public class oarescare {
private static long cmmdc(long u, long v) {
long remainder;
if (v < 0) v = -v;
while ( v != 0 ) {
remainder = u % v;
u = v;
v = remainder;
}
if ( u == 0 ) return 1;
// cmmdc(0,x) = 1
else return (u>0)? u : -u; // modul
}
... Restul clasei nu are importanta
28
Imperativ original:FORTRAN 77
INTEGER FUNCTION IGCD(U,V)
INTEGER U, V, TMP
DO WHILE ( V .NE. 0 )
TMP = V
V = MOD(U,V)
U = TMP
END DO
IGCD = V
RETURN
END
PROGRAM MAIN
WRITE(6,*) "Input two integers:"
READ(5,*) I, J
WRITE(6,100) I, J, IGCD(I,J)
100 FORMAT("GCD of ",I4," and ",I4," is ",I4)
STOP
END
29
Oop Java cmmdc
public class CMMDC {
private final int value;
public CMMDC( int value )
{ this.value = value; }
public int cmmdc ( int v ) {
int u = value;
while ( v != 0 ) {
int t = u % v;
u = v;
v = t;
}
return u;
}
}
30
Cmmdc in programare logica Prolog
cmmdc(U, V, U) :- V = 0.
cmmdc(U, V, X) :- not (V = 0),
Y is U mod V,
gcd(V, Y, X).
/* calcul cmmdc(288,60) */
cmmdc(288, 60, X).
consequence :-
a, b, c.
31
Concluzii
Paradigmele sunt necesare
32
Join the club!
33