0 evaluări0% au considerat acest document util (0 voturi)
42 vizualizări7 pagini
El documento describe la historia y tipos de lenguajes de programación. Comienza con los lenguajes imperativos y funcionales, luego pasa a discutir la máquina de Von Neumann y cómo esto influyó en el desarrollo de lenguajes de bajo nivel como el ensamblador. Más adelante, introduce lenguajes de alto nivel tempranos como FORTRAN, ALGOL y LISP, seguidos de lenguajes orientados a objetos como Smalltalk y C++. Finalmente, resume dos paradigmas de programación principales: imperativo y funcional.
El documento describe la historia y tipos de lenguajes de programación. Comienza con los lenguajes imperativos y funcionales, luego pasa a discutir la máquina de Von Neumann y cómo esto influyó en el desarrollo de lenguajes de bajo nivel como el ensamblador. Más adelante, introduce lenguajes de alto nivel tempranos como FORTRAN, ALGOL y LISP, seguidos de lenguajes orientados a objetos como Smalltalk y C++. Finalmente, resume dos paradigmas de programación principales: imperativo y funcional.
El documento describe la historia y tipos de lenguajes de programación. Comienza con los lenguajes imperativos y funcionales, luego pasa a discutir la máquina de Von Neumann y cómo esto influyó en el desarrollo de lenguajes de bajo nivel como el ensamblador. Más adelante, introduce lenguajes de alto nivel tempranos como FORTRAN, ALGOL y LISP, seguidos de lenguajes orientados a objetos como Smalltalk y C++. Finalmente, resume dos paradigmas de programación principales: imperativo y funcional.
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.