Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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