Transcript PiLdP-Tema1
Tema 1: Introducció als llenguatges de programació i als seus paradigmes Seccions • Llenguatge de Programació • Història i Evolució • Paradigmes i models de còmput subjacents LLENGUATGE DE PROGRAMACIÓ Llenguatge de Programació • Un llenguatge de programació és una notació per a escriure programes. (Sethi, 89) • Un programa és una especificació d’un còmput. • Per còmput entenem allò que pot fer una màquina de Turing. Tesis de Church-Turing • Church’s Thesis: “Every effectively calculable function (effectively decidable predicate) is general recursive”. • Turing’s Thesis: “Every function which would be naturally regarded as computable is computable by a Turing machine”. Formalismes de còmput • Lògica de Predicats • Gottlöb Frege (1848-1925) • Base formal de la teoria de la demostració i la demostració automàtica de teoremes • Programació lògica – Un còmput és una deducció lògica • Màquines de Turing • Alan Turing (1912-1954) • Programació imperativa – Un còmput és l’evolució seqüencial d’estats mitjançant assignacions slide 6 Formalismes de còmput • Lambda calculus • Alonzo Church (1903-1995) • Base formal per als llenguatges funcionals, la semàntica, la teoria de tipus, etc. • Programació Funcional – Un còmput és la reescriptura d’una expressió fins a una forma normal. No hi ha assignacions. • Funcions recursives & automates • Stephen Kleene (1909-1994) • Expressions regulars, màquines d’estats finits, PDAs slide 7 Sobre la Tesis de Church-Turing • Turing-completesa: tenir la mateixa capacitat de còmput que les màquines de Turing. Per exemple: Lambda-càlcul, funcions recursives, lògica de predicats,… • No serien Turing-complets: autòmates finits (DFAs), gramàtiques incontextuals, etc. • No es coneix cap sistema Turing-complet que no sigui Turing-equivalent => reforça Tesis C-T Llenguatge de Programació • Notació formal per a especificar còmputs: – Lèxic (paraules permeses…) – Sintaxis (regles de formació de programes…) – Semàntica (significat i efecte de les diferents construccions…) – Implementacions concretes… • Normalment s’espera que el sistema notacional sigui intel·ligible per l’humà i fàcilment traduïble per a que la màquina l’“entengui”. Perquè estudiar LP i Paradigmes? • L’estructura d’un llenguatge de programació acota el procés intel·lectual del programador al programar. • Aprendrem conceptes bàsics i de vegades ignorats les llenguatges: pas per valor, pas per paràmetre, tipus estàtics, funcions d’ordre superior, etc. • Farà més fàcil aprendre nous llenguatges • Farà més fàcil dissenyar nous llenguatges HISTÒRIA I EVOLUCIÓ Primeres màquines amb “llenguatge” • Teler de Jaquard, 1801. • Permetia fer diferente tipus de teles en funció de les targetes perforades que contenien els patrons desitjats. Primeres màquines amb “llenguatge” • Màquina analítica de Charles Babbage per a càlcul (1816+-) • Motor a vapor, programes amb targetes perforades, … • No es va arribar a fabricar. • Ada Lovelance, primera programadora. Primers “ordinadors” • ENIAC: Electronic Numerical Integrator And Computer. (1946 … 1955) – Primer ordinador electronic de propòsit general. – Dim: 2,4m x 0,9m x 30m, 167m^2, 27 Tonelades, 17468 vàlvules, 150kW, … – Programar era complicat… per “passar al programa dins d’ENIAC”, s’havia de tocar interruptors i cables… – Encara no havia implementat la idea de tenir memoria per al programa i memòria per a les dades ENIAC: • • • • Altres ordinadors cohetanis durant WWII: Z3 (1941): targetes perforades Colossus (1943): criptoanàlisis … Codis Màquina • 40’s • Els codis eren numèrics. – Poc llegibles – Poc modificables – Programar era molt complicat – Problemes inherents al hardware com falta d’indexació, no existència d’aritmètica real, … • Llenguatge de Programació? Llenguatges ensambladors • Principis dels 50: per no haver de escriure/perforar directament codis binaris com a operacions del càlcul de les màquines, es va recorrer al mnemotècnics: – Llenguatge ensamblador: push ebp mov ebp, esp sub esp, 4 push edi – Introduia gestio de macros i subrutines. Primer llenguatge algorísmic • PlanKalkul per Conrad Zuse (dissenyador de Z3), 1948. • No es va implementar… • Permetia coherència de tipus int/bool, estructures condicionals, iteracions, assignacions, etc. • Va dissenyar un programa per jugar a escacs. FORTRAN (Formula Tranlator) • 1954-57 per John Backus. • Orientat al càlcul matemàtic. • Característiques: – Variables de fins a 6 caràcters • Les que comencen per i, j, k, l, m o n eren enteres • Les altres floats – – – – – Assignacions amb expressions aritm. do … while Subrutines i funcions Formats d’entrada sortida Independència de la màquina (idea de compilar/interpretar) Exemple de Fortran Èxit de Fortran • Dubtes d’eficiència degut al Alt nivell, cosa que implicava traduir… però, molt bon traductor. • Facilitava l’aprenentatge (vs. Assemblador) • IBM • Eficiència al desenvolupar • Moltes seqüeles i avui en dia encar utilitzat en cert àmbits científics… (Fortran 2003, OO) ALGOL (ALGOrithmic Language) • 1958 • Desenvolupat per comitè per a ser standard (acadèmic) per descriure càlculs en publicacions. – Inclure notació matemàtica llegigle – Fàcil de traduir a codi màquina • Descripció gramàtica amb BNF, facilitat compiladors. ALGOL (ALGOrithmic Language) (2) • Aportacions: – Variables amb nom qualsevol – Estructurat. Blocks i visibilitat – Arrays amb multiples dimensions – Estructures de control riques: • Seqüències, if-then-else, For-step-until-do, … – Procediments recursius – Modes al pas de parametres (e/s) Exemple d’Algol Èxit Algol? • Tres anys després de Fortran. • Era més ric i per tant més complicat d’aprendre. • Els compiladors de Fortran eren més senzills de fer i més eficients. • … • D’altra banda: influència tota la programació estructurada: Pascal, C, JAVA, … Program Stack program P0; var R1, T1: real; A1: array[0:5,0:20] of real; procedure P1( X: real; Working space for Procedure P2 var T: real; Y: array[0:5,0:20] of real;) Pointer to the elements of A2 Memory for the variable T2 procedure P2; var R2, T2: real; A2: array[0:5,0:20] of real; Activation record for P2 Memory for the variable R2 Working space for Procedure P1 begin R2 := 5; T2 := 25; P1(R2, T2, A2); end;(* P2 *) Reference to procedure P2 /* calls P1 */ begin P2; end; (* P1 *) /* calls P2 */ Pointer to variable T1 Memory for variable X Working space for Procedure P0, the main program begin P1(R1, T1, A1); end;(* program *) Indirect pointer to elements of A1 Activation record for P1 /* calls P1 */ Reference to procedure P1 Pointer to elements of A1 Memory for variable T1 Memory for variable R1 Activation record for P0 COBOL (Common Business Oriented Language) • 1957 • És bàsicament un llenguatge processador de dades, orientat a negoci. • Aportacions: – – – – – – – Dades i programes separats Llenguatge proper al natural (ops. en anglès) Fàcil implementació Noms de dades 30 caràcters Tipus registre Autodocumentat … Exemple de COBOL 000100 ID DIVISION. 000200 PROGRAM-ID. ACCEPT1. 000300 DATA DIVISION. 000400 WORKING-STORAGE SECTION. 000500 01 WS-FIRST-NUMBER PIC 9(3). 000600 01 WS-SECOND-NUMBER PIC 9(3). 000700 01 WS-TOTAL PIC ZZZ9. 000800* 000900 PROCEDURE DIVISION. 001000 0000-MAINLINE. 001100 DISPLAY 'ENTER A NUMBER: '. 001200 ACCEPT WS-FIRST-NUMBER. 001300* 001400 DISPLAY 'ANOTHER NUMBER: '. 001500 ACCEPT WS-SECOND-NUMBER. 001600* 001700 COMPUTE WS-TOTAL = WS-FIRST-NUMBER + WS-SECOND-NUMBER. 001800 DISPLAY 'THE TOTAL IS: ', WS-TOTAL. 001900 STOP RUN. Èxit de COBOL • Llenguatge simple • Molt arrelat en l’entorn financer, e.g. Bancs i Caixes. • Entorns molt grans on els canvis són molt costosos…. (ex. cas de l’any 2000) • Avui en dia… OO LISP (List Processing Language) • 1959, MIT, McCarthy (T. Aw.) • Basat en lambda-càlcul • Aportacions – Garbagge collector – Tipatge dinàmic – Identificació de manipulació entre codi i dades – Pare de la programació funcional… Frases sobre LISP • “LISP being the most powerful and cleanest of languages, that's the language that the GNU project always prefer” -- Richard Stallman • “Anyone could learn Lisp in one day, except that if they already knew FORTRAN, it would take three days” -- Marvin Minsky Exemple LISP (defun list-nth (N L) "Return the N'th member of a list L." (if (null L) nil (if (zerop N) (first L) (list-nth (1- N) (rest L)) ) ) ) PL/1 • 1964 • Desenvolupat per un comitee d’IBM – Millorar el rendiment dels programadors de propòsit general (vs. Fortran i Cobol) – Eclèctic: • Pas de paràmetres, estructurat, registres, processament de llistes, excepcions, multi-tasca, punters, … – Però: massa gran i complexe Exemple de PL/1 BASIC (Beginner’s All-purpose Symbolic Instruction Code) • 1966 • Característiques: – Variables no es declaren. Els noms són lletres simples. S’inicialitzen a 0. – Fàcil de fer servir i aprendre. – GOTO… Exemple de BASIC 10 REM THIS IS A BASIC PROGRAM FOR FINDING THE MEAN 20 DIM A(99) 30 INPUT N 40 FOR I = 1 TO N 50 INPUT A(I) 60 LET S = S + A(I) 70 NEXT I 80 LET M = S/N 90 LET K = 0 100 FOR I = 1 TO N 110 IF A(I) < M THEN 130 120 LET K = K + 1 130 NEXT I 140 PRINT “MEAN IS”, M 150 PRINT “NUMBER GREATER THAN MEAN IS”, K 160 STOP 170 END PASCAL • • • • 71, Wirth (T. Aw.) Llenguatge educatiu. El més usat dels 70. Inclou “rut-time environment”: (Codi, dades estàtiques, pila -> … <- Heap) • Permet definir nous tipus a l’usuari. • Continua amb C, ADA, Java, … Frases de Wirth • “Power of a language lies in its regularity and not in its abundant of Features” • “Character of a language is defined by what it prevents more than by what it allows to be expressed” Exemple de Codi PASCAL (*Pascal program for finding the mean*) Program main (input, output); type intlist = array [1 . . 99] of integer; var a : intlist; i, n, number : integer; sum, mean : real; (*main program starts here *) begin number := 0; sum := 0; readln (n); for I := 1 to n do begin readln(a[i]); sum := sum + a[i] end; mean := sum/n; for I := 1 to n do if (a[i] > mean) then number := number + 1; writeln (‘the number over mean is: ‘, number) end. C • • • • • • 72, Dennis Ritchie (T. Aw.) Més baix nivell que PASCAL Fortament lligat a Unix Descomposició de mòduls i linkatge Sistema de tipus més permissiu. Clar condicionador de C++ i JAVA (sintaxi) 80s • ADA: TAD, taskes, excepcions, paquets, … • Smalltalk: OOP (Simula 67), entorn de desenvolupament visual • Funcionals: ML, Miranda, … Fortament tipats, lazyness, … primes = sieve [2..] sieve (p:x) = p : sieve [n | n <- x; n mod p ~= 0] • Prolog: Primer en programació lògica • C++: C + classes, i herència múltiple, Templates/genèrics, excepcions, … Té molt èxit. 90’s • JAVA: interfaces explítics, herència simple, garbagge collection (s’amaga la gestió de memòria), … – Èxit per la conexió amb l’explosió WWW – Compile once, run everywhere – Màquina virtual – +lent que C++ – Sintaxi similar al C++ -> fàcil trànsit. 90’s • Scripting: Perl, python, AWK,… – senzills, dinàmics, estructures de tipus d’alt nivell, no fortament tipats, etc. • Haskell: fortament tipat, lazy, pur, … • Constraint Programming: SICSTUS Prolog, … 2000’s • SCALA – Web, Concurrencia, Funcional (alt nivell i modularitat) + JAVA • MiniZinc – Constraint programming declaratiu – Model once solve everywhere Què volem d’un bon llenguatge? • Claritat, simplictat i unicitat – Pocs conceptes fàcils de combinar (integritat) – Llegibilitat • Suport a l’abstracció – Tipus – Funcions • • • • • • Facilitat de raonar-ne la correctesa i de testejar Eficiència Portabilitat Entorna de desenvolupament Documentació … Biblio • Capítol: 1,2: “Concepts in programming languages” • Capítol 1,2: “Lenguajes de programación: principios y prácticas” • Wikipedia (fotos i demés…)