Fundamentos de lenguajes de programación
Robinson Duque, MEng - Ph.D
Universidad del Valle
[email protected] Programa de Ingenierı́a de Sistemas
Escuela de Ingenierı́a de Sistemas y Computación
Este documento es una adaptación del material original de los profesores
Carlos Andres Delgado y Carlos Alberto Ramı́rez
Overview
1 Conceptos
2 Un poco de historia
Historia de los lenguajes de programación
3 Perspectiva de los paradigmas de programación
Conceptos generales
Taxonomı́a de los paradigmas de programación
Paradigmas de programación
4 Motivación del curso
Conceptos
Un poco de historia
Perspectiva de los paradigmas de programación
Motivación del curso
Lenguaje
Lenguaje =⇒ Comunicación
Lenguaje de programación =⇒ Comunicación con la
máquina
Lenguaje hablado y lenguaje escrito
Lenguaje escrito =⇒ Formalismos =⇒ Lenguajes formales
Conceptos
Un poco de historia
Perspectiva de los paradigmas de programación
Motivación del curso
Lenguajes de programación
La programación se define como una actividad general del
hombre, que significa la acción de extender o cambiar la
funcionalidad de un sistema[VanRoy].
Programar es decirle a un computador (o a alguna máquina)
como realizar su trabajo.
La programación es una actividad de amplio espectro
realizada tanto por no especialistas como por especialistas.
La programación de sistemas de software consta de dos partes
esenciales: la ciencia y la tecnologı́a.
Conceptos
Un poco de historia
Perspectiva de los paradigmas de programación
Motivación del curso
Lenguajes de programación
Un lenguaje de programación es un lenguaje artificial
diseñado para expresar computaciones que pueden ser llevadas
a cabo por una máquina.
Conjunto de sı́mbolos y reglas sintácticas y semánticas.
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación I
Charles Babagge (Máquina Analı́tica) y Ada Lovelace
(Primera programadora) (Mediados del siglo XIX).
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación II
Programa escrito por Ada Lovelace
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación III
Herman Hollerith se percató de que podı́a codificar la
información en tarjetas perforadas cuando observó a los
conductores de trenes que identificaban a los pasajeros según
el orificio que hacı́an en su respectivo ticket. En 1890
Hollerith codificó los datos del censo en tarjetas perforadas.
En la década de 1920 los cálculos numéricos estaban basados
en los números decimales. Con el paso del tiempo, se dieron
cuenta de que la lógica podı́a ser representada con números,
no sólo con palabras.
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación IV
En 1943 se crea el sistema de codificación de ENIAC la
primera computadora de propósito general.
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación V
Short Code de John Mauchly en 1949 (BINAC y UNIVAC I).
Por ejemplo la expresión: a = b+c
b∗c se computa ası́:
A-0, A-1, A-2 entre 1951 y 1953 (UNIVAC).
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación VI
Fortran (FORmula TRANslator) por John Backus et al. en
1953.
C AREA OF A TRIANGLE − HERON ’ S FORMULA
C INPUT − CARD READER UNIT 5 , INTEGER INPUT
C OUTPUT − LINE PRINTER UNIT 6 , REAL OUTPUT
C INPUT ERROR DISPLAY ERROR OUTPUT CODE 1 IN JOB CONTROL LISTING
INTEGER A , B , C
READ ( 5 , 5 0 1 ) A , B , C
501 FORMAT ( 3 I 5 )
IF (A . EQ . 0 . OR . B . EQ . 0 . OR . C . EQ . 0 ) STOP 1
S = (A + B + C) / 2 . 0
AREA = SQRT ( S ∗ ( S − A) ∗ ( S − B) ∗ ( S − C) )
WRITE ( 6 , 6 0 1 ) A , B , C , AREA
601 FORMAT ( 4H A= , I 5 , 5H B= , I 5 , 5H C= , I 5 , 8H AREA= , F10 . 2 ,
$13H SQUARE UNITS )
STOP
END
LISP (LISt Processor) por John McCarthy et al. en 1958.
( defun averagenum ( n1 n2 n3 n4 )
( / ( + n1 n2 n3 n4 ) 4 )
)
( write ( averagenum 10 20 30 4 0 ) )
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación VII
COBOL (COmmon Business Oriented Language) por Grace
Hopper en 1959.
DATA DIVISION .
W OR KING-STORAGE SECTION .
01 Num1 PIC 9 VALUE ZEROS .
01 Num2 PIC 9 VALUE ZEROS .
01 R e s u l t PIC 99 VALUE ZEROS .
PROCEDURE DIVISION .
DISPLAY " Enter first number (1 digit ) : " WITH NO ADVANCING .
ACCEPT Num1 .
DISPLAY " Enter second number (1 digit ) : " WITH NO ADVANCING .
ACCEPT Num2 .
MULTIPLY Num1 BY Num2 GIVING R e s u l t .
DISPLAY " Result is = " , R e s u l t .
STOP RUN .
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación VIII
ALGOL (ALGOrithmic Language) 60 en 1960.
p r o c e d u r e Absmax ( a ) S i z e : ( n , m) R e s u l t : ( y ) S u b s c r i p t s : ( i , k ) ;
v a l u e n , m; a r r a y a ; i n t e g e r n , m, i , k ; real y ;
begin
integer p, q;
y := 0 ; i := k := 1 ;
for p := 1 s t e p 1 u n t i l n do
for q := 1 s t e p 1 u n t i l m do
if abs ( a [ p , q ] ) > y then
begin y := abs ( a [ p , q ] ) ;
i := p ; k := q
end
end Absmax
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación IX
APL (A Programing Language) por Kenneth Iverson(IBM)
https://tryapl.org/
Simula por Ole Johan Dahl y Kristen Nygaard y SNOBOL
(StriNg Oriented symBOlic Language) por los Laboratorios
Bell en 1962. Este es el primer lenguaje orientado a objetos
Begin
OutText ( " Hello , World ! " ) ;
Outimage ;
End ;
Begin
Class G l y p h ;
Virtual : Procedure p r i n t Is Procedure p r i n t ; ;
Begin
End ;
CPL (Combined Programming Languaje) en 1963.
BASIC (Beginners All-purpose Symbolic Instruction Code) por
Kurtz y PL/1 (Programming Language 1) de IBM en 1964.
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación X
BCPL (Basic Combined Programming Language) por Martin
Richards en 1967.
ALGOL 68 y Logo por Danny Bobrow, Wally Feurzeig y
Seymour Papert en 1968.
C por Dennis Ritchie y Ken Thompson entre 1969 y 1973.
Pascal por Wirth y SmallTalk en 1970.
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación XI
Prolog (PROgrammation en LOGique) por Colmerauer,
Roussel, y Kowalski en 1972.
Base del conocimiento:
likes ( mary , f o o d ) .
likes ( mary , w i n e ) .
likes ( john , wine ) .
likes ( j o h n , mary ) .
Consultas:
l i k e s ( mary , f o o d ) .
Yes
l i k e s ( john , food ) .
No
l i k e s (X , w i n e ) .
mary
john
No
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación XII
ML (Meta Language) por Robin Milner en 1973.
fun r e v e r s e [ ] = [ ]
| reverse (h : : t ) = reverse t @ [ h ] ;
fun c o n c a t s p a c e s = s ˆ " " ;
(* Prints each command line arg , suffixed with a space . *)
val =
let
val a r g s = CommandLine . a r g u m e n t s ( )
in
map ( p r i n t o c o n c a t s p a c e ) ( r e v e r s e a r g s ) ;
p r i n t "\n"
end ;
Scheme por Guy L. Steele y Gerald Jay Sussman en 1975.
SQL (Structured Query Language) en 1978.
Ada por Jean Ichbiah et al. en 1983.
C++ por Bjarne Stroustrup en 1983.
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación XIII
Common Lisp en 1984.
Eiffel, Erlang, Perl, Tcl y Fl a finales de los 80’s. Ejemplo
Erlang:
s o r t ( [ P i v o t |T] ) ->
s o r t ( [ X | | X <− T , X < P i v o t ] ) ++
[ P i v o t ] ++
s o r t ( [ X | | X <− T , X >= P i v o t ] ) ;
s o r t ( [ ] ) -> [ ] .
Haskell (en honor a Haskell Curry) en 1990.
main = do
f o r M [ 1 . . 3 ] $ \ i −> do
print i
forM [ 7 . . 9 ] $ \ j −> do
print j
w i t h B r e a k $ \break −>
f o r M [ 1 . . ] $ \ −> do
p " loop "
break ( )
Conceptos
Un poco de historia
Historia de los lenguajes de programación
Perspectiva de los paradigmas de programación
Motivación del curso
Historia de los lenguajes de programación XIV
where
w i t h B r e a k = ( ’ runContT ’ return ) . c a l l C C
p = l i f t I O . putStrLn
Python, Lua, Java, Delphi, JavaScript, PHP, Rebol, Visual
Basic, Mozart, entre otros durante los años 90’s.
C#, .NET, J#, Scala, Factor, entre otros apartir del año
2000.
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigmas de programación - Conceptos generales
Un paradigma es un enfoque para programar máquinas
(computadores) basado en un conjunto coherente de principios o
teorı́a matemática [P. Van Roy]:
Las teorı́as de computación resultan en diferentes paradigmas
(λ calculus, π calculus, lógica de primer orden, etc)
Ninguna teorı́a existente cubre todos los conceptos de
programación
¿Porqué necesitamos tantos paradigmas? Para solucionar
problemas más fácilmente utilizando el paradigma correcto!
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigmas de programación - Conceptos generales
Un paradigma es un enfoque para programar máquinas
(computadores) basado en un conjunto coherente de principios o
teorı́a matemática [P. Van Roy]:
Las teorı́as de computación resultan en diferentes paradigmas
(λ calculus, π calculus, lógica de primer orden, etc)
Ninguna teorı́a existente cubre todos los conceptos de
programación
¿Porqué necesitamos tantos paradigmas? Para solucionar
problemas más fácilmente utilizando el paradigma correcto!
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigmas de programación - Conceptos generales
ilustración tı́pica de cómo ha evolucionado la programación
el diagrama sólo muestra una pequeña parte; deja por fuera
muchas ideas importantes
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Taxonomı́a de los paradigmas de programación
La jungla de paradigmas de programación
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Taxonomı́a de los paradigmas de programación
Taxonomı́a de paradigmas de programación
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigmas de programación
Los principales paradigmas de programación son:
Declarativos (Funcional, Lógico, Por Restricciones)
Imperativo
Relacional
Orientado a Objetos
Por Restricciones
Concurrente
Orientado a agentes
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma programación Declarativa
Una operación es declarativa si siempre que es llamada con los
mismos argumentos retorna el mismo resultado.
Una operación declarativa es:
Independiente (depende solo de sus argumentos)
Sin estado (no hay memoria entre distintos llamados)
Determinista (un llamado con los mismos argumentos da
siempre el mismo resultado)
Ejemplo: HTML, XML, CSS, Mercury, Prolog.
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma programación Declarativa
HTML
<img src=" ./ image . jpg " />
SQL
SELECT ∗ FROM U s e r s WHERE C o u n t r y=’ Mexico ’ ;
XML
< a r t i c l e>
<h e a d e r>
< t i t l e>P r o g r a m a c i o n d e c l a r a t i v a</ t i t l e>
<t e x t>S o l o e s c r i b e s i n p r e o c u p a r t e de má s : )</ t e x t>
</ h e a d e r>
</ a r t i c l e>
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma programación Funcional
Basado en el cálculo λ (sistema formal 1930).
El concepto de función es fundamental.
Funciones son ciudadanos de primera clase (las funciones
pueden ser parámetros o valores de retorno de otras
funciones).
Programa: Conjunto de funciones + Aplicación.
Ejemplos: Lisp, Haskell, Scheme, ML.
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma programación declarativo funcional
Cálculo λ
Diseñado para investigar la definición de función, la noción de
aplicación de funciones y la recursión.
Utilizado para definir algoritmos computables o decidibles.
Es una estrategia para definir si un algoritmo es computable,
ya que se ha demostrado que el problema de la parada es un
problema indecidible.
Cualquier función computable puede ser expresada y evaluada
a través de este cálculo.
Las funciones son consideradas un valor tipo procedimiento.
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma de Programación declarativo lógico
Basado en el cálculo de predicados.
Mecanismo de demostración automática de teoremas.
Esencial: Concepto de deducción lógica.
Programa: Conjunto de axiomas y un objetivo.
Ejemplos: Prolog.
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma programación Imperativa
Orientado por la máquina.
Alto nivel.
Esencial: Asignación y secuenciación.
La programación está dada en términos del estado del
programa.
Programa: Secuencia de instrucciones.
Ejemplos: Fortran, Algol, Basic, C, Pascal.
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma de Programación Orientada a Objetos
Se representa el mundo real mediante objetos y sus
interacciones.
Basado en el concepto computacional de objeto.
Esencial: Concepto de objeto, herencia, mensaje.
Programa: Conjunto de objetos y sus interacciones.
Ejemplos: Smalltalk, Java, C++, Obliq, etc.
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma de Programación Concurrente
Basado en la teorı́a de concurrencia y cálculos de procesos
(Cálculo π, CCS, CCP).
Esencial: Mecanismos de comunicación entre procesos.
Programa: Conjunto de procesos.
Ejemplos: PICT, MWB, Erlang.
Este paradigma funciona bien en lenguajes funcionales, ya que
no se requiere sincronización (semáforos).
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma de Programación Concurrente
Ejemplo en Erlang
−module ( e j em p lo FL P ) .
−export ( [ i n i c i a r / 0 , d i a l o g o /2 ] ) .
d i a l o g o ( E n t r a d a , 0 ) ->
done ;
d i a l o g o ( E n t r a d a , C o n t a d o r ) ->
i o : format ( "~p~n" , [ Entrada ] ) ,
d i a l o g o ( Entrada , Contador − 1) .
i n i c i a r ( ) ->
spawn ( ejemploFLP , d i a l o g o , [ h o l a , 5 ] ) ,
spawn ( ejemploFLP , d i a l o g o , [ a d i o s , 4 ] ) .
%Funciona miento
%c ( ejemploFLP ) .
%ejemploFLP : iniciar () .
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma de Programación Relacional
Las relaciones pueden tener cero, una o más salidas (frente a
funciones)
Puede intercambiarse el rol de las entradas y salidas
Selección no-determinista de una opción entre varias
Ejemplo: Prolog (Búsqueda sobre una base de conocimiento),
Analizadores sintácticos, Bases de datos relacionales (SQL).
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma de Programación Relacional
Ejemplo de paradigma relacional con Prolog (ver ejemplo online).
%Base del conocimiento
amigo ( j u a n , p e d r o ) .
amigo ( j u a n , c a r l o s ) .
amigo ( p e d r o , m a r i a ) .
%consultas
%amigo ( juan , pedro ) . %Retorna yes
%amigo ( juan , X ) . %Retorna X = pedro y X = carlos
Observe que
1 Hay una búsqueda en un conjunto de datos
2 Se retornan cero o más valores en una consulta.
SQL también es un lenguaje relacional de búsqueda sobre bases de
datos.
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma de Programación por Restricciones
Basado en el concepto de restricción (un predicado o relación
lógica).
Esencial: Concepto de consecuencia lógica.
Esencial: Búsqueda en arboles y reducción de dominios
(distribución y propagación).
Programa: Variables + Restricciones (Conjunto de Relaciones
entre variables) + Estrategia de exploración.
La búsqueda de soluciones es concurrente (se exploran varias
posibilidades a la vez).
Ejemplos: CLP, Mozart, MiniZinc.
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma de Programación por Restricciones
Ejemplo: encontrar los valores de las letras para que SEND +
MORE = MONEY (ver ejemplos online).
declare
proc {Money Root}
local
S E N D M O R Y
in
Root = s o l ( s : S e : E n : N d : D m:M o :O r : R y : Y) % Registro con letras
Root : : : 0#9 % Dominio de b ú squeda de
las variables entre 0 y 9
%Restricciones
{FD . d i s t i n c t Root}
%S y M distintos de 0 ( si no todo se hace 0)
S \=: 0
M \=: 0
1000∗S + 100∗E + 10∗N + D
+ 1000∗M + 100∗O + 10∗R + E
=: 10000∗M + 1000∗O + 100∗N + 10∗E + Y
%Estrategia de b ú squeda ( probar primero con n ú meros peque ~
n os del dominio )
{FD . d i s t r i b u t e f f Root}
end
%Explore todas las posibilidades
{ E x p l o r e A l l Money}
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
Paradigma de Programación Orientada a Agentes
Se representa el mundo real mediante agentes y sus
interacciones a través de mensajes.
Basado en el concepto de agentes.
Un agente es una entidad computacional situada en algún
entorno y que es capaz de ejecutar acciones autónomas en
dicho entorno con el fı́n de cumplir sus objetivos de diseño.
Hilo de ejecución independiente, comunicación por paso de
mensajes, conocimiento parcial del entorno, mecanismo de
toma de decisiones, reactividad, proactividad, habilidad social.
Programa: Conjunto de agentes y sus interacciones.
Ejemplos: JADE, JASON.
Conceptos
Conceptos generales
Un poco de historia
Taxonomı́a de los paradigmas de programación
Perspectiva de los paradigmas de programación
Paradigmas de programación
Motivación del curso
¿Qué paradigma es el mejor?
Cada uno es mejor para una clase especı́fica de problema (la
paradoja del paradigma - ”more is not better or worse, only
different”)
Las fronteras de los paradigmas son completamente artificiales
(sólo existen por razones históricas)
Java es sólo orientado a objetos (errado)
Scala es funcional, orientado a objetos, basado en actores
(correcto)
Un programa grande casi siempre necesita diversos paradigmas
(por esto es necesario aprender múltiples paradigmas)
Un buen lenguaje deberı́a soportar diversos paradigmas (Scala
y Erlang se mueven en la dirección correcta; Java y C++ se
están estancando..)
Conceptos
Un poco de historia
Perspectiva de los paradigmas de programación
Motivación del curso
¿Por qué estudiar los conceptos de lenguajes de
programación?
Incrementa la capacidad para expresar ideas.
Amplı́a el espectro de conocimientos necesario para
seleccionar un lenguaje.
Incrementa la habilidad para aprender nuevos lenguajes y
paradigmas.
Conceptos
Un poco de historia
Perspectiva de los paradigmas de programación
Motivación del curso
¿Por qué estudiar los conceptos de lenguajes de
programación?
Mejor entendimiento de como los lenguajes de programación
están implementados.
Mejor uso de los lenguajes de programación que ya se
conocen.
Progreso global de las ciencias computacionales.
Conceptos
Un poco de historia
Perspectiva de los paradigmas de programación
Motivación del curso
Preguntas
?
Conceptos
Un poco de historia
Perspectiva de los paradigmas de programación
Motivación del curso
Próxima sesión
Repaso de Racket.