You are on page 1of 35

Programación I

Matemáticas Aplicadas y
Computación
Andrés Hernández Balderas

2014
2. La programación
"Primero resuelve el problema. Entonces, escribe el código."
John Johnson
"No hay lenguaje de programación, no importa su estructura,
que impida que los programadores hagan malos programas."
Larry Flon

"Un buen programador es alguien que siempre mira


"La formación en informática no puede convertir a en las dos direcciones antes de cruzar una carretera
nadie en experto programador, de la misma forma de sentido único."
que estudiar pinceles y pigmentos puede hacer a Doug Linder
alguien un experto pintor."
Eric Raymond "La mayoría del software actual es muy parecido a una
pirámide egipcia, con millones de ladrillos puestos unos
encima de otros sin una estructura integral, simplemente
realizada a base de fuerza bruta y miles de esclavos.“
"No puedes crear un gran software sin un Alan Kay
gran equipo, y la mayoría de los equipos de "Caminar sobre el agua y programar
desarrollo se comportan como familias aplicaciones siguiendo una especificación, son
disfuncionales." cosas fáciles, si ambas están congeladas. "
Jim McCarthy Edward V Berard
2.1 Lenguajes de Programación.
2.1.1 Definiciones (programación,
programa, lenguaje)

• Programación: Proceso que diseña, codifica,


depura y mantiene el código fuente de los
programas. El código fuente es escrito en un
lenguaje de programación.
• Programa: Conjunto de instrucciones que una
computadora puede interpretar y ejecutar,
siempre y cuando esté en lenguaje o código
máquina. El código máquina es una traducción
del código fuente (cercano al lenguaje humano)
2.1.1 Definiciones (programación,
programa, lenguaje)
• Lenguaje de programación: Conjunto de reglas, símbolos y
palabras especiales que permiten construir un programa.
• Al igual que los lenguajes humanos, poseen una
estructura (gramática o sintaxis) y un significado
(semántica).
• La gramática del lenguaje humano trata de los diferentes
modos (reglas) en que pueden ser combinados los
diferentes tipos de palabras para formar frases
aceptables.
• Los lenguajes de computadoras tienen menos
combinaciones aceptables y deben ser utilizadas
correctamente.
2.1.2 Lenguajes de alto y bajo nivel
• Existen varios tipos de lenguajes:
• Lenguaje máquina: El lenguaje máquina es el
único lenguaje que puede ejecutar una
computadora, es específico en cada arquitectura,
es un código que es interpretado directamente
por el microprocesador, está compuesto por un
conjunto de instrucciones ejecutadas en
secuencia que representan acciones que la
máquina podrá tomar. Lo únicos símbolos que se
utilizan son 0 y 1
2.1.2 Lenguajes de alto y bajo nivel

• Lenguaje de bajo nivel: Los lenguajes de bajo


nivel son mas fáciles de utilizar que los lenguajes
máquina, pero también dependen de la
arquitectura en particular. El lenguaje de bajo
nivel por excelencia es el ensamblador. Las
instrucciones en lenguaje ensamblador son
instrucciones conocidas como nemotécnicos. Por
ejemplo, para operaciones aritméticas son: ADD,
SUB, DIV, etc.
2.1.2 Lenguajes de alto y bajo nivel

• Lenguaje de alto nivel: Un lenguaje de alto nivel


permite al programador escribir las instrucciones
de un programa utilizando palabras o
expresiones sintácticas muy similares al inglés.
Son más cercanos al lenguaje humano que al
lenguaje máquina. Una gran ventaja es que, en
general, son independientes de la arquitectura.
2.1.3 Traductores del lenguaje
(compiladores e intérpretes)
• Para que una computadora pueda ejecutar las
actividades que deseamos, es necesario escribir
un programa. Dicho programa en general será
escrito en un lenguaje de alto nivel, pero
después será necesario traducirlo a lenguaje
máquina.
#include <stdio.h> 1010101 1010101 1010101
0101010111110 01010101
Int main() 0011101010100010101101
{ Traductor 1010101 1010101 1010101
printf(“Hola mundo”); 0101010111110 01010101
return 0; 0011101010100010101101
} 1111101010101010100011
2.1.3 Traductores del lenguaje
(compiladores e intérpretes)
• Intérprete: Analiza el programa fuente y lo ejecuta
directamente, línea a línea, sin generar ningún código
equivalente. Su acción equivale a la de un intérprete
humano, que traduce las frases que oye sobre la
marcha, sin producir ningún escrito permanente. Si el
programa se debe ejecutar dos veces, dos veces se
traduce. Es posible que un error de sintaxis aparezca
muy avanzada la ejecución.

#include <stdio.h>

Int main()
{ Intérprete
printf(“Hola mundo”);
return 0;
}
2.1.3 Traductores del lenguaje
(compiladores e intérpretes)
• Compilador: Analiza el programa fuente y lo traduce
completo a otro equivalente escrito en lenguaje
máquina. La computadora ejecutará este nuevo
programa hasta que esté completamente traducido. Su
acción equivale a la de un traductor humano, que toma
un libro y produce otro equivalente escrito en otra
lengua. La traducción se realiza solo una vez. Los errores
de sintaxis se detectan antes de la ejecución.

#include <stdio.h> 1010101 1010101 1


0101010111110 01
Int main() 0011101010100010
{ Compilador 1010101 1010101 1
printf(“Hola mundo”); 0101010111110 01
return 0; 0011101010100010
} 1111101010101010
2.1.4 La compilación y sus fases

El proceso de compilación consta de varias fases


• Análisis Léxico: Transforma la secuencia de
símbolos de entrada en una secuencia de
componentes léxicos sobre la cual es más fácil
hacer luego el análisis sintáctico. Lee caracteres
de entrada y los agrupa en secuencias que tienen
significado dentro de la estructura sintáctica del
lenguaje fuente. Un analizador léxico es un
traductor que actúa en la primera fase de un
proceso de compilación.
2.1.4 La compilación y sus fases
• Análisis Sintáctico: Descubre la estructura
sintáctica de la cadena de entrada usando las
reglas que definen las cadenas válidas en el
lenguaje fuente. Dichas reglas viene expresadas
en forma de una gramática que describe de
manera relativamente breve las frases o
secuencias válidas en un lenguaje. Una gramática
también describe la estructura jerárquica o
sintáctica de las frases de un lenguaje.
2.1.4 La compilación y sus fases

• Análisis Semántico: El análisis semántico verifica


que el árbol sintáctico tenga un significado válido
dentro de las reglas semánticas del lenguaje. Por
ejemplo, el analizador semántico verifica que:
– En una asignación, el tipo de la variable concuerde
con el tipo de la expresión asignada.
– Que los subíndices se apliquen a variables tipo
arreglo y no a otras.
– Que las variables estén declaradas antes de ser
usadas.
2.1.4 La compilación y sus fases

• Generación de Código Intermedio: La fase de


generación de código intermedio se ocupa de
generar instrucciones para una máquina virtual
genérica a partir de la información recopilada en
las fases previas de análisis. La razón por la cual
no se genera código objeto directamente es para
permitir que la fase de optimización sea genérica
y por lo tanto portátil (independiente del código
objeto específico).
2.1.4 La compilación y sus fases
• Optimización: La fase de optimización se encarga de
transformar el código intermedio en uno de función
equivalente pero de menor tamaño o de menor tiempo
de ejecución. Algunas de las transformaciones que
puede llevar a cabo la fase de optimización son:
– Eliminar el cálculo de expresiones cuyo valor no se usa.
– Fundir en uno solo el cálculo repetido de la misma expresión.
– Sacar de los bucles las expresiones cuyo valor no cambia en
el bucle.
– Reducir el uso de memoria local reutilizando el espacio de
una variable muerta.
2.1.4 La compilación y sus fases

• Generación de Código Objeto: La fase de


generación de código objeto se encarga de
generar el programa usando el juego de
instrucciones específico de la máquina o CPU
objeto, y el formato para archivos ejecutables del
sistema operativo. Entre otras cosas, también se
le asignan direcciones definitivas a las rutinas y
variables que componen el programa.
2.1.5 Breve historia y evolución de los
lenguajes de programación
• Muchos proponen como antecesor de los programas a
los códigos que se daban mediante tarjetas perforadas a
la máquina del telar de Jacquard (1801). Con estos
códigos se daban indicaciones a la máquina para
cambiar sus movimientos para generar patrones
decorativos.
• Ada Lovelace (1842) especificó con detalle un método
con el cual se calcularían los números de Bernoulli
utilizando la “Máquina Analítica” propuesta por Charles
Babbage. Este método es reconocido por muchos
historiadores como el primer programa de computadora
del mundo.
2.1.5 Breve historia y evolución de los
lenguajes de programación
• En 1890 Hollerith codificó los datos del censo de
Estados Unidos en tarjetas perforadas.
• En la década de 1940 fueron creadas las primeras
computadoras modernas las cuales eran programadas
en lenguaje ensamblador. La programación requería de
gente muy especializada y se tenía que invertir mucho
tiempo y dinero en el desarrollo de programas, lo cual
no garantizaba la ausencia de errores abundantes.
• En la década de 1950 surgen los primeros lenguajes
modernos de alto nivel: FORTRAN (ciencia y militar),
LISP (inteligencia artificial) y COBOL (negocios)
2.2 Paradigmas de programación

Los paradigmas de programación nos


indican las diversas formas en que, a lo
largo de la evolución de los lenguajes,
han sido aceptadas como estilos para
programar y para resolver los problemas
por medio de una computadora.
2.2.1 Lenguajes procedurales
• El paradigma procedural se conoce también como
imperativo o algorítmico.
• En este paradigma se expresa cómo debe solucionarse
un problema especificando una secuencia de acciones a
realizar a través de uno o más procedimientos
denominados subrutinas o funciones.
• Dentro de esta categoría se engloban la programación
estructurada que restringe el uso de la instrucción goto,
la programación modular y la programación orientada a
objetos. Cada una de estas extensiones o evoluciones
han permitido mejorar la mantenibilidad y la calidad de
los programas imperativos.
2.2.1 Lenguajes procedurales
• Lenguajes: Basic, Pascal, C, etc.
• Ejemplo:
program prog1;
Var area,base,altura :real;
begin
write('Dame Base :');
readln(base); Pascal
write('Dame Altura:');
readln(altura);
area := base * altura / 2;
writeln('El Area es =',area:0:2);
readln;
end.
2.2.2 Lenguajes declarativos
• A la programación imperativa se le contrapone la
programación declarativa en la que se describe la lógica
de computación necesaria para resolver un problema
sin describir un flujo de control de ningún tipo. No es
necesario definir algoritmos puesto que se detalla la
solución del problema en lugar de como llegar a esa
solución.
• En la programación declarativa, la solución es alcanzada
a través de mecanismos internos de control pero no se
especifica exactamente como llegar a ella.
• Dentro de esta categoría se engloban la programación
funcional y la programación lógica.
2.2.3 Lenguajes de programación lógica

• El paradigma lógico de programación está


basado en "premisas" que se dan a un universo,
y basado en esas reglas (que se asumen como
verdaderas) el programa responde un valor de
verdad, concluido usando la lógica matemática.
• Lenguajes: Prolog
2.2.3 Lenguajes de programación lógica
• Ejemplo: quiere_a(maria,enrique).
quiere_a(juan,jorge).
quiere_a(maria,susana).
quiere_a(maria,ana).
quiere_a(susana,pablo).
quiere_a(ana,jorge).
varon(juan).
varon(pablo).
varon(jorge).

Prolog
varon(enrique).
mujer(maria).
mujer(susana).
mujer(ana).
teme_a(susana,pablo).
teme_a(jorge,enrique).
teme_a(maria,pablo).
/* Esta linea es un comentario */
quiere_pero_teme_a(X,Y) :- quiere_a(X,Y), teme_a(X,Y).
querido_por(X,Y) :- quiere_a(Y,X).
puede_casarse_con(X,Y) :- quiere_a(X,Y), varon(X), mujer(Y).
puede_casarse_con(X,Y) :- quiere_a(X,Y), mujer(X), varon(Y).
2.2.4 Lenguajes funcionales
• Se basa en construir programas a partir de
funciones, es decir, una función está formada de
pequeñas funciones.
• Una función puede tener cualquier número de
argumentos, incluyendo cero, y debe devolver un
solo valor.
• La definición de función proporciona un
parámetro formal (nombre) y la llamada a la
función proporciona un argumento real (un
valor)
2.2.4 Lenguajes funcionales

• En lugar de una secuencia de eventos, se tiene


composición de funciones, es decir, f(g(x)).
• La recursividad es muy usada de la misma
manera que en las matemáticas, reemplazando
el constructor de iteración de los lenguajes
imperativos.
• Manejo de almacenamiento implícito.
• Lenguajes: Lisp, Scheme.
2.2.4 Lenguajes funcionales
• Ejemplo:

(define !
(lambda (n)
(if (= n 0)
1
Scheme
(* n (! (- n 1)))
)
)
)
2.2.5 Lenguajes orientados a objetos
• La programación orientada a objetos trata de
amoldarse al modo de pensar del humano y no al
de la máquina. Esto es posible gracias a la forma
racional con la que se manejan las abstracciones
que representan las entidades del dominio del
problema, y a propiedades como la jerarquía o el
encapsulamiento.
• El elemento básico de este paradigma no es la
función (elemento básico de la programación
estructurada), sino un ente denominado objeto.
2.2.5 Lenguajes orientados a objetos

• Un objeto es la representación de un concepto para


un programa, y contiene toda la información
necesaria para abstraer dicho concepto: los datos
que describen su estado y las operaciones que
pueden modificar dicho estado, y determinan las
capacidades del objeto.
• Lenguajes: Java, C++, Visual Basic .Net, C#
2.2.5 Lenguajes orientados a objetos
• Ejemplo: class Coche {
int velocidad, kilometraje;

void acelerar(int nuevaVelocidad) {


velocidad = nuevaVelocidad;
}

void frenar() { velocidad = 0;}

void avanzar(int kilometros) {


kilometraje = kilometraje + kilometros;

}
}
Java
class Viaje {
String destino;

void viajar(String lugar) {


Coche miCoche = new Coche();
destino = lugar;
miCoche.acelerar(120);
miCoche.avanzar(1300);
miCoche.frenar;
}
}
2.2.6 Lenguajes de programación
concurrente
• Normalmente, cuando un programa se ejecuta se
produce, a nivel sistema operativo, un proceso
(Proceso = Código + Datos + Recursos)
• En el contexto de un programa concurrente, un hilo
(Thread) es cada uno de los flujos secuenciales de
control independientes especificados en un
programa. Un hilo genera un proceso.
• La programación concurrente implica la
simultaneidad en la ejecución de múltiples procesos
que son hilos de ejecución creados por un único
programa.
2.2.6 Lenguajes de programación
concurrente
• Se pueden ejecutar en una misma CPU o de
forma distribuida en varias CPU.
• Lenguajes: Java, Ada, C#
2.2.6 Lenguajes de programación
concurrente
• Ejemplo:
using System;
using System.Threading;

public class ejemplo1{

public static void calculaPares(){


int cont=0;
for(int i=1; i<=500000; cont+=(i%2 ==0?1:0), i+=1 );
System.Console.WriteLine("pares {0}", cont);

C#
}

public static void calculaImpares(){


int cont=0;
for(int i=1; i<=500000; cont+=(i%2==1?1:0), i+=1 );
System.Console.WriteLine("Impares {0}", cont);
}

public static void Main(){


System.Console.WriteLine("pares hasta el 500,000");
Thread t1= new Thread( ejemplo1.calculaPares );
Thread t2= new Thread( ejemplo1.calculaImpares );
t1.Start();
t2.Start();
}
}
2.3 El ciclo de desarrollo de un programa

Verificación
Definición del Verificación del
manual del
problema programa
algoritmo

Análisis del Codificación del Documentación


problema algoritmo del programa

Diseño del Ejecución del Puesta en


algoritmo programa marcha

You might also like