Está en la página 1de 38

Lenguajes de Programación

Capítulo 1:
Fundamentos Generales

Prof. Dr. Freddy Paz


PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 1
Concepto

¿Qué es un lenguaje de programación?


• Conjunto de signos y reglas que permiten la
comunicación con un ordenador.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 2


Introducción

• Las primeras computadoras ocupaban grandes


espacios físicos, consumían excesiva electricidad y
costaban millones de dólares (1940), sin embargo,
contaban con el poder computacional de una
calculadora de mano moderna.

Una computadora UNIVAC


Fuente: United States Census Bureau

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 3


Introducción
• Se programaba en lenguaje
máquina. El lenguaje máquina
es la secuencia de bits que
controlan directamente el
procesador, ocasionando que
agregue, compare, procese y
mueva datos de un lugar a otro
del registro sucesivamente, en
tiempos de espera apropiados.
• Especificar programas a este nivel de
detalle es una tarea tediosa.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 4


Introducción

• El siguiente programa calcula el máximo común


divisor (MCD) de dos enteros usando el algoritmo de
Euclides. Esta escrito en lenguaje máquina, expresado
en número hexadecimales (base 16) para el conjunto
de instrucciones Pentium x86:

55 89 e5 53 83 ec 04 83 e4 f0 e8 31 00 00 00 89 c3 e8 2a 00
00 00 39 c3 74 10 8d b6 00 00 00 00 39 c3 7e 13 29 c3 39 c3
75 f6 89 1c 24 e8 6e 00 00 00 8b 5d fc c9 c3 29 d8 eb eb 90

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 5


Introducción
• Tan pronto como las personas empezaron a escribir
programas más largos, rápidamente se hizo evidente
la necesidad de una notación menos propensa a
errores. Lenguajes ensambladores fueron inventados
para permitir operaciones que sean expresadas con
abreviaciones mnemónicas.
Código Código
Mnemónico Acción
Binario Hexadecimal
01010000 50 ADD Suma al acumulador
00101101 B1 SUB Resta al acumulador
00110010 32 J Salta al registro
00001111 0F MULT Multiplica al acumulador
Representación de nemónicos de lenguaje máquina para procesadores i386

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 6


Introducción
• MCD empleando MIPS Assembly (un lenguaje ensamblador):
mcd:
beq $a0, $a1, .L2 #Si a = b, ir a la salida
sgt $v0, $a1, $a0 #Si b > a?
bne $v0, $zero, .L1 #Si, ir a .L1

subu $a0, $a0, $a1 #Substraer b de a (b < a)


b mcd #Y repetir
.L1:
subu $a1, $a1, $a0 #Substraer a de b (a < b)
b mcd #Y repetir
.L2:
li $v0, 1 #Sistema invoca print_int
li $a0, newline #Entero a imprimir
syscall #Imprimir

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 7


Introducción
• Instrucciones Jump and Branch (MIPS Assembly)
Mnemónico Instrucción
j Saltar
jr Saltar al registro
beq Ramificar en igual
bne Ramificar en no igual
blez Ramificar en menor o igual a cero
bgtz Ramificar en mayor que cero
bltz Ramificar en menor que cero
bgez Ramificar en mayor o igual a cero
PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 8
Introducción
• Otras Instrucciones (MIPS Assembly)
Mnemónico Instrucción
add Adicionar
addu Adicionar sin signo
sub Substraer
mult Multiplicar
div Dividir
and AND
or OR
sgt Asignar mayor que
PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 9
Introducción
• Calcular el Factorial de un Número Entero Positivo MIPS
Assembly:
fact:
li $t0, 1
move $t1, $a0 # Guardamos el valor de n
.loop:
beq $t1, $zero, .exit # Si n = 0, ir a salida
mult $t0, $t0, $t1 # Construir factorial
add $t1, $t1, -1
j .loop
.exit:
li $v0, 1 #Sistema invoca print_int
li $t0, newline #Entero a imprimir
syscall #Imprimir

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 10


Introducción
• Los lenguajes ensambladores fueron diseñados
originalmente con una correspondencia uno a uno entre
los mnemónicos y las instrucciones del lenguaje
máquina.
• Trasladar desde los mnemónicos al lenguaje máquina
se volvió el trabajo de un programa conocido como
ensamblador. Las capacidades fueron aumentados con
elaborados “macro expansiones” que permitían a los
programadores definir abreviaciones personalizadas
para secuencias de instrucciones frecuentemente
utilizadas.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 11


Introducción
• La correspondencia entre el lenguaje ensamblador y el
lenguaje máquina era evidente y explícita, sin embargo,
la programación seguía siendo centrada en la máquina:
cada tipo de computador debía ser programado en su
propio lenguaje ensamblador, mientras que los
programadores pensaban en términos de las
instrucciones que la máquina debía ejecutar.
• A medida que las computadoras evolucionaban, se volvía
cada vez más frustrante tener que reescribir los
programas para cada máquina nueva. Incluso se volvía
difícil realizar un seguimiento a detalle de los programas.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 12


Introducción
• La correspondencia entre el lenguaje ensamblador y el
lenguaje máquina era evidente y explícita, sin embargo,
la programación seguía siendo centrada en la máquina:
cada tipo de computador debía ser programado en su
propio lenguaje ensamblador, mientras que los
programadores pensaban en términos de las
instrucciones que la máquina debía ejecutar.
• A medida que las computadoras evolucionaban, se volvía
cada vez más frustrante tener que reescribir los
programas para cada máquina nueva. Incluso se volvía
difícil realizar un seguimiento a detalle de los programas.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 13


Introducción
• Las personas empezaron a desear un lenguaje que sea
independiente de la máquina, particularmente uno en
que las computaciones numéricas puedan ser
expresadas en algo que se asemeje a las fórmulas
matemáticas. Estos deseos llevaron a que a mediados
de 1950 se desarrollara el dialecto original de Fortran,
el primer lenguaje de programación de alto nivel. Otros
lenguajes de alto nivel siguieron como los notables Lisp
y Algol.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 14


Introducción
• Trasladar de un lenguaje de alto nivel a lenguaje
ensamblador o lenguaje máquina es el trabajo de un
programa conocido como compilador. Los compiladores
son substancialmente más complicados que los
ensambladores porque las correspondencias uno-a-uno
entre la fuente y las operaciones específicas no existen
cuando el código es de alto nivel.
• La aceptación de Fortran fue lenta al principio porque los
programadores con algo de esfuerzo, podían escribir
programas en lenguaje ensamblador que podían ejecutarse
más rápido que uno producido por un compilador.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 15


Introducción
• Con el tiempo, las deficiencias del compilador fueron
reducidas y eventualmente revertidas. Las mejoras en la
tecnología de los compiladores ha llevado a que estos
generen un código más apropiado que si una persona lo
haría. Este hecho ha permitido no solamente minimizar el
esfuerzo de programación, sino también los costos de
mantenimiento, mejora y corrección.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 16


El Arte de Diseñar Lenguajes
• Hoy en día, existen muchos lenguajes de programación de
alto nivel y nuevos que continúan emergiendo.
• ¿Por qué existen tantos?
• Existen algunas posibles razones:
• Evolución: Ciencias de la Computación es una disciplina
joven y en constante evolución. En la década de 1960 y a
principios de 1970 vio una revolución en la “programación
estructurada” que dio lugar a construcciones de alto nivel. A
finales de 1980 el bloque estructurado de lenguajes como
Algol, Pascal y Ada comenzaron a dar lugar a estructuras
orientadas a objetos como Smalltalk, C++, Eiffel y otros.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 17


El Arte de Diseñar Lenguajes
• Propósitos Especiales: Muchos de los lenguajes fueron
diseñados para solucionar problemas de un dominio
específico. Los diversos dialectos de Lisp son buenos para
manipular data simbólica y estructuras de datos complejas.
C es bueno para la programación de estructuras de bajo
nivel. Prolog es bueno para el razonamiento en relaciones
lógicas entre los datos. Cada uno de estos lenguajes puede
ser usado exitosamente para un amplio rango de tareas,
pero el énfasis está claramente en la especialidad.
• Preferencias Personales: A diferentes personas les gusta
diferentes cosas. Muchas veces es simplemente una
cuestión de gusto.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 18


El Arte de Diseñar Lenguajes
• Preferencias Personales: A muchas personas les gusta
que C sea conciso y breve, otras lo odian. Algunas personas
encuentran natural pensar de forma recursiva, otras
prefieren la iteración. Algunas personas les gusta trabajar
con punteros, otras prefieren la eliminación de referencias
que ofrece Lisp, Clu y Java. La fuerza y la variedad de
gustos personales hacen que sea poco probable que un
lenguaje de programación sea universalmente aceptable.

No obstante, algunos lenguajes son más exitosos que otros. De


los muchos que han sido diseñados, solo pocas docenas son
ampliamente utilizados. ¿Qué vuelve a un lenguaje exitoso?

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 19


El Arte de Diseñar Lenguajes
• Facilidad de Uso para Inexpertos: Parte del éxito de
un lenguaje de programación es debido a su baja curva de
aprendizaje. Basic es un ejemplo de este éxito. De la misma
manera Logo es popular entre los educadores de nivel
primario por una simple razón: hasta un niño de 5 años
puede aprenderlo. Pascal fue enseñado por muchos años
como un lenguaje de programación introductorio porque en
comparación con otros lenguajes “serios” es compacto y
fácil de aprender.
• Facilidad de Implementación: Además de la baja curva
de aprendizaje, Basic es exitoso debido a que puede ser
implementado fácilmente en máquinas con pocos recursos.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 20


El Arte de Diseñar Lenguajes
• Estandarización: Casi todos los lenguajes ampliamente
usados siguen un estándar o una única forma de
implementación. La estandarización del lenguaje y de un
conjunto amplio de librerías es la única forma de asegurar la
portabilidad entre plataformas.
• Libre Distribución: Algunos lenguajes como C están más
asociados con la libre distribución. C fue originalmente
desarrollado a inicios de los 70s por Dennis Ritchie y Ken
Thompson en los laboratorios Bell, en conjunto con el diseño
del sistema operativo Unix original. Linux, el sistema operativo
líder Open-Source fue escrito en C. C y sus derivados
representan el 66% de los proyectos alojados en el repositorio
sourceforge.net
PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 21
El Arte de Diseñar Lenguajes
• Economía y Patrocinio: Finalmente, existen otros
factores además del mérito técnico que influyen en el éxito
de un lenguaje de programación. El respaldo de un sponsor
reconocido es un factor. Cobol y Ada contaron con el
respaldo del Departamento de Defensa de los Estados
Unidos. De igual manera, C# no hubiera recibido la atención
debida si no hubiera tenido el respaldo de Microsoft.
Algunos lenguajes puede ser mejores alternativas debido a
que existe una amplia base de entornos de desarrollo,
programas instalados y programadores con experticia que
serían más fáciles de reemplazar.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 22


El Espectro de Lenguajes de Programación
• Existen distintos lenguajes de programación que pueden
ser clasificados en familias de acuerdo a su modelo
computacional.

Declarativos
Funcionales Lisp, Scheme, Haskell
Lógicos Prolog
Imperativos
Procedimentales C, Ada, Fortran, Basic
Scripting Perl, Python, PHP
Orientados a Objetos Smalltalk, Eiffel, Java

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 23


El Espectro de Lenguajes de Programación

• Declarativos: el desarrollo de programas se realiza


declarando un conjunto de condiciones, proposiciones,
afirmaciones, restricciones, ecuaciones o transformaciones
que describen el problema y detallan su solución.

• Imperativos: el desarrollo de programas se realiza


especificando paso a paso un conjunto de instrucciones
que deben ejecutarse para variar el estado del programa
y hallar la solución.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 24


El Espectro de Lenguajes de Programación

• Funcionales: emplean un modelo computacional basado


en la recursiva definición de funciones. Están inspirados
en el “cálculo lambda”, un modelo formal computacional
desarrollado por Alonzo Church en 1930. Un programa
es considerado una función por sus entradas y salidas,
definido en términos de funciones.
• Lógicos: estos lenguajes están inspirados en la lógica de
predicado. El modelo computacional consiste en
encontrar valores que satisfagan ciertas relaciones
específicas, usando una lista de reglas lógicas.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 25


El Espectro de Lenguajes de Programación
• Procedimentales: estos lenguajes permiten crear
programas basados en el concepto de “procedimientos”,
que consisten en una serie de pasos computacionales
también conocidas como rutinas como solución a un
problema.
• Scripting: Son un subconjunto de los procedimentales
pero que permiten la creación de tareas automatizadas,
que son usadas frecuentemente.
• Orientados a Objetos: Permite el desarrollo de programas
informáticos bajo la perspectiva del uso de colecciones de
unidades individuales denominadas objetos, que
interactúan unos con otros.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 26


El Espectro de Lenguajes de Programación
• Algoritmo de Euclides para calcular el MCD
El máximo común divisor (MCD) de dos enteros A y B es el entero
más grande que divide tanto a A como a B.
El algoritmo de Euclides es una técnica para encontrar
rápidamente el MCD de dos enteros.
Se basa en la siguiente propiedad: mcd(a,b)=mcd(a−b,b). Así, si se va
sustrayendo el número menor de el número mayor, cada vez los
pares de números que quedan se van haciendo más pequeños hasta
que uno de los números es 0, y mcd(a,0)=a.

Por ejemplo, para calcular el máximo común divisor de 105 y 70:


mcd(105,70)=mcd(105−70,70)=mcd(35,70)=mcd(35,70−35)=
mcd(35,35)=mcd(35,35−35)=mcd(35,0)=35

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 27


El Espectro de Lenguajes de Programación
• MCD en lenguaje C

int mcd (int a, int b) {


while (a != b) {
if (a > b)
a = a – b;
else
b = b – a;
}
return a;
}

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 28


Introducción
• Calcular el Factorial de un Número Entero Positivo

int fact (int n) {

int i, f = 1;
for (i = n; i > 0; i --)
f = f * i;
return f;

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 29


El Espectro de Lenguajes de Programación
• Programación Funcional

La programación funcional es un paradigma de


programación basado en el uso de funciones matemáticas.

Los programas escritos bajo este paradigma están


constituidos únicamente por definiciones de funciones, en
las que se evidencia la transparencia referencial por lo que
existe carencia total de efectos colaterales.
Predicado
Valores de las variables

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 30


El Espectro de Lenguajes de Programación
• Programación Funcional

▰ Este es un ejemplo de ausencia de Transparencia Referencial:

1 class Ejemplo{
2 static int m = 1;
3 static int method1() {m++; return m-1;}
4 static int a1() {return m + method1();}
5 static int a2() {return method1() + m;}
6 }Predicado
Valores de las variables

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 31


El Espectro de Lenguajes de Programación
• Programación Funcional

La transparencia referencial es útil en caso de modificar un


programa, para asegurar que las modificaciones no afecten los
cálculos de otras secciones.

Es importante en el proceso de verificación de un programa


(demostrar matemáticamente que cumple la especificación),
ya que es posible utilizar subexpresiones que se encuentren
Predicado
demostradas Valores
y así validar las expresiones que las conforman.
de las variables

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 32


El Espectro de Lenguajes de Programación
• Programación Funcional

▰ Ausencia de asignaciones de variables.

▰ Ausencia de construcciones estructuradas como la


secuencia o la iteración.

▰ Se basa en repeticiones de instrucciones que se llevan


a cabo mediante funciones (recursividad).
Predicado
Valores de las variables

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 33


El Espectro de Lenguajes de Programación
• Programación Funcional – Sintaxis condicional
Es posible evaluar varias condiciones con la sintaxis COND.
Sintaxis: (cond (<cond1>
<expresión_cond1_sea_verdadera>)
(<cond2> <expresión_cond2_sea_verdadera>)
...
(else <expresión_en_caso_ninguna_sea_verdadera> )
#lang racket
(define
Predicado(ES_POS_NEG X)
(cond ((> X 0) "Es positivo")
((<Valores
X 0)de"Es
las variables
negativo")
((= X 0) "Es cero")))

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 34


El Espectro de Lenguajes de Programación
• MCD en lenguaje Racket

(define (mcd a b)
(cond ((= a b) a)
((> a b) (mcd (- a b) b))
(else (mcd (- b a) a))))

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 35


Introducción
• Factorial (Racket):

(define (factorial n)
(cond ((= n 1) 1)
((> n 1) (* n (factorial (- n 1))))))

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 36


EJERCICIO
Elabore una función que permita evaluar la
siguiente función:

 x +1
2
, si x0
 2
f ( x )  x + 3x + 2 , si 0  x  3
 x +1
37

 , si x  3

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 37


Bibliografía
• Gabbrielli, M., Martini, S. (2006). Programming Languages: Principles
and Paradigms.
• Lee, K. D. (2017). Foundations of Programming Languages. Springer.
• Mitchell, J. C., & Apt, K. (2003). Concepts in programming languages.
Cambridge University Press.
• Tucker, A. B., & Noonan, R. E. (2007). Programming languages
principles and paradigms. Boston: McGraw-Hill Higher Education.
• Watt, D. A., & Wong, S. (1990). Programming Languages. Concepts
and Paradigms Prentice Hall.

PUCP, Lenguajes de Programación, Capítulo 1 Diapositiva 38

También podría gustarte