Está en la página 1de 7

Tema 1:

1. Tipos de lenguajes según paradigma


a. Imperativos
b. Funcionales
c. Lógicos
d. Orientado a objetos
2. Tipos de procesamiento de un programa
a. Compilación
b. Interpretación pura
c. Sistema híbrido C-I
3. Historia de los lenguajes de programación: Minimizar coste de trabajo y maximizar
complejización
a. Desarrollo del hardware -> permite programas complejos -> metodologías y
lenguajes que puedan hacer complejidades.
b. Abaratamiento del hardware -> tiempo de trabajo = mucho % coste
(programación y depuración) -> programación estructurada (y lenguajes más
expresivos, menos necesidad de eficiencia) -> 1980 programación orientada
a objetos (diseño, mantenimiento, reutilización)
4. Maquina de von Neumann: Arquitectura condiciona a lenguajes.
a. Partes
i. Memoria:
1. Posiciones de almacenamiento numeradas (dirección)-
>acceso.
2. instrucciones y datos (palabras binarias)-> 1 por posición
3. 1024 palabras de 40 bits
ii. CPU: Partes
1. Unidad de control: lee instrucciones -> señales de control ->
para tareas
a. “contador del programa” -> almacena dirección de la
siguiente instrucción.
b. Hay 2, una en cada 20 bits por palabra. -> bits
más/menos significativos
2. Unidad aritmética -> recibe señales de UC, y datos de
memoria -> interpretados como enteros base 2
a. Registros -> uno llamado acumulador.
3. Unidad de entrada y salida -> introducir datos e instrucciones
+ comunicar los resultados.
b. Código máquina -> secuencia de palabras binarias con sintaxis de la CPU.
c. Operaciones de la máquina: operación/dores, almacenado, continuación.
i. Op. Aritméticas: + - * /, valor absoluto. Esta instucción indica
operación y operandos, uno de ellos (gen) en el acumulador ->
resultado en acumulador.
ii. Movimiento de datos: Copiar contenido de o a, el
registro/memoria/...
iii. Control de Flujo: Siempre secuencial excepto con goto
1. Goto incondicional: salta siempre
2. Goto condicional: salta bajo condición (acumulador>=0)
d. Algoritmo genérico de la máquina von Neumann
i. Inicializar contador y bucle: Cont(Memoria) -> CPU, Cont++,
Decodificar, Ejecutar.
e. Características
i. Calculo aritmético + rápido qué transmisión memoria-cpu (velocidad
limitada por memoria-cpu)
ii. Antes se escribían las instrucciones en código máquina, cada
ordenador tenía su propio juego (programas no portables) -> dificil
de entender
iii. Direccionamiento absoluto -> si insertas instrucción el resto se
mueve/se borra una instrucción -> mierda/en lugar de eliminar
sustituir por “no operación”.
5. Lenguaje ensamblador
a. Lenguaje máquina: tedioso y propenso a errores -> asignar nombre a cada
operación del código máquina + asignar etiquetas a posiciones de
almacenamiento.
b. Ensamblador: Traduce código ensamblador a máquina, cada CPU tiene el
suyo -> no portabilidad
c. LE y LM son de bajo nivel
6. FORTRAN
a. Alto nivel, imperativo
b. Motivación: Reducir nº de instrucciones y coste, sobre todo tiempo de
depurado de código.
c. Intención: Lenguaje similar a las mates del que sacar el código máquina
desarrollando un compilador.
d. Implementación: Desarrollo de compiladores e interpretes que traduzcan a
código máquina.
e. Tiene saltos condicionales de tres condiciones y sentencias iterativas.
f. FORTRAN II compila subrutinas separadas
i. Subrutina: Fragmento de código del programa que realiza tarea
específica e independiente del resto del código.
g. Lenguaje de Alto Nivel: Portable si tienes el compilador apropiado
7. ALGOL
a. Alto nivel, imperativo
b. Motivación: Hacer lenguaje estándar. Usar solo uno (fail, demasiado flexible
-> ineficiente)
c. Intención: Lenguaje similar a las mates del que sacar buen código
implementable. Ser independiente de la máquina (fail pq no tenía sentencias
de in/output y dependían de la implementación).
d. Cosas de ALGOL que FORTRAN no tiene:
i. Identificadores de cualquier longitud (no máximo 6)
ii. Vectores de n dimensiones (no máximo 3)
iii. Límite inferior de vectores especificable (no 1).
iv. Sentencias de selección anidadas (no permitidas en FORTRAN).
e. ALGOL 60 introduce:
i. El bloque de código con sus variables locales
ii. Pasar parámetros a subprogamas:
1. Paso por valor: Copiar de memoria y usar copia.
2. Paso por referencia: Usar memoria, pudiendo cambiar valor
iii. Procedimientos recursivos (se puede llamar a sí mismo)
iv. Declaración del tamaño de array mediante variable en lugar de
constante.
1. Array: Grupo de variables del mismo tipo con nombre
común.
f. LISP
i. Alto nivel, funcional
ii. Motivación: Inteligencia artificial.
iii. Interés: Procesar datos simbólicos en listas.
1. Lista: Secuencia de 0 o más valores (booleanos, nº, arrays,
símbolos, cadenas, funciones, otras listas…)
a. Operaciones básicas: Construcción, inspección,
manipulación.
g. COBOL
i. Alto nivel
ii. Motivación: Negocios
iii. Interés: Lo más próximo al inglés.
h. Prolog
i. Alto nivel, lógico
ii. Interés: Usar hechos y reglas
i. Ada
i. Permite declarar paquetes dentro de los que declarar objetos, tipos
de datos y procedimientos
ii. Tratamiento de excepciones
iii. Las unidades pueden ser genéricas (al instanciarlas, se pueden
precisar parámetros), para usarlas se instancian primero. (Análogo a
las plantillas de C++).
iv. Permite ejecución concurrente de tareas.
j. Smalltalk
i. Primero orientado a objetos (y usado).
k. C++
i. Orientado a objetos.
ii. Distingue mayúsculas y minúsculas
iii. Variables declarables en cualquier punto, fin con ;
iv. Comentarios con // o /* y \*
v. #include: en qué cabecera encontrar funciones. Ej. iostream
1. Linker combina código de librería y el programa
2. Directivas siempre empiezan por #
3. Se puede usar para incluir otro fichero
vi. Using namespace std; usa entidades (tipos de datos, variables…) del
espacio de nombres std, sin tener que especificarlo.
1. Si no se incluye debe ponerse std:: delante de cada entidad.
2. Los espacios de nombres dividen en subámbitos el ámbito
global -> evitar que se produzcan colisiones de nombres
vii. Int main es el inicio del programa
viii. Return 0 indica el final
l. Java
i. Más pequeño, flexible y fiable que C++
ii. Programación web
8. Paradigmas de programación
a. Imperativa
i. Abstracción de la máquina de Von Neumann -> la conexión memoria-
cpu hace que las variables conceptos esenciales.
ii. Usa iteración para bucles (la más eficiente) -> celdas de memoria
consecutivas
iii. No usan tanto recursividad por menor eficiencia
iv. Un programa consiste en:
1. Declaración de estado (variables y sus valores) y punto de
control???
2. Especificación de secuencia de instrucciones para alterar
estado.
a. Asignaciones
b. Control de flujo
3. En ejecución, se genera una secuencia de estados
4. Ventajas: código máquina eficiente
5. Desventajas: expresividad menor
b. Funcional
i. Evaluación de expresiones construidas con funciones
ii. No iteración, no asignación, distintas variables
iii. Función: relación de valores de un dominio con (co)dominio.
1. Transparencia referencial -> Las funciones no tienen efectos
laterales en el estado del programa. (no importa cuando se
llama, sino qué argumentos se usan). -> Semántica más
simple que en imperativos.
iv. Usan aplicaciones, condicionales, recursión. Típicamente tienen:
1. Conjunto de funciones primitivas
2. Conjunto de formas funcionales para hacer funciones
complejas de funciones primitivas
3. Operación de aplicación de función
4. Estructuras para representar datos. Ej. Lista.
v. Ventajas:
1. No preocuparse de gestión de variables y asignación de
valores.
2. Estructura sintáctica más simple
3. Ejecución concurrente <- Facil representación en grafos
vi. Desventajas: Disminución de eficiencia de ejecución respecto de
imperativos.
c. Lógica:
i. Cálculo predicativo
d. Orientación a objetos:
i. Análisis de sistema como colección de objetos independientes que
interactúan.
ii. El estado de un programa se encapsula en objetos?? Que contienen
datos y proporcionan operaciones para acceder a ellos
iii. Ventajas: Facil mantenimiento y reutilización.
iv. Principios:
1. Abstracción: Poder usar objeto sin saber detalles internos.
2. Ocultación de la información: Limitar acceso a detalles
internos desde otros objetos.
3. Modularidad: Descomposición de programa en partes
(módulos) que interactúan para conseguir objetivos. Cada
módulo una tarea.
v. Conceptos clave:
1. Clase: Descripción de un tipo de objeto. En la clase se
declaran las variables internas a los objetos y operaciones
válidas (métodos) a los objetos de esa clase.
2. Herencia: La nueva clase es “clase derivada” (hereda todos
los métodos y variables internas), la original “clase base”.
Una clase puede tener un método definido de forma distinta
para cada clase derivada.
3. Ligadura dinámica: Al invocar un método, se examina la clase
con el cual se opera y aplica el método apropiado.
a. Ejemplo: Clase A con derivados B1 y B2. Llamamos al
método m de A y en tiempo real la máquina decide
cual versión usar en función del objeto (de B1 o B2).
b. Una ligadura estática decide esto en tiempo de
compilación.
e. Métodos de implementación:
i. Código fuente -> Código máquina. Usualmente el código fuente pasa
primero por el OS antes que código máquina.
ii. OS interfaz con Lenguaje máquina, lenguaje de programación con OS.
1. Se pueden entender como máquinas virtuales.
2. Ej: OS + C compiler = máquina virtual de C.
iii. Metodo 1: Interpretación pura
1. Uso de programa “intérprete” que lee, analiza y ejecuta
directamente, una a una
2. Se llama al intérprete dando el nombre del programa fuente
y los datos de entrada.
3. Ventaja: Fácil asociación error-línea
4. Desventaja: Tiempo de ejecución, 10-100 veces mayor que
compilado. Complicado en programas complicados.
iv. Método 2: Compilación
1. Codigo fuente -> Código máquina; con compilador
2. Genera un programa objeto (instrucciones máquina y
referencias a otro código)
3. Fases:
a. Analizador léxico: Agrupa caracteres en unidades
léxicas (identificadores, palabras especiales,
operadores y símbolos de puntuación). No
comentarios.
b. Analizador sintáctico: Construye unidades jerárquicas
(árboles de análisis sintáctico o derivativos (parse
trees)). A veces no se construye el árbol sino que se
genera la info necesaria y ya.
c. Generador de código intermedio: Ensamblador o
superior
i. Analizador semántico: Comprueba errores.
Ej. Tipo de datos.
d. Generador de código:
i. Traduce código intermedio a código objeto
(lenguaje máquina y referencias a otro código
objeto).
ii. Linking/Enlazado: El código objeto se enlaza
con programas del sistema operativo,
referenciados desde el código objeto.
1. Reemplaza llamadas a programas del
sistema por direcciones de sus puntos
de entrada en memoria.
2. Igual con código de librerías
iii. Resultado: programa binario ejecutable
4. Ventajas: Velocidad
5. Desventajas: Se pierde la estructura por lo que los errores
son difíciles de detectar.
v. Método 3: Sistema híbrido
1. Programa fuente-> A. Léxico -> Sintáctico -> Gen. Código
intermedio -> Intérprete
vi. Método 4: Preprocesadores
1. Procesa antes de compilar -> para especificar que se incluye
el código de otro ficheiro o para definir símbolos.

También podría gustarte