Programación de Sistemas - Temas de Evaluación PDF
Document Details
Tags
Summary
Este documento resume los temas de programación de sistemas de la primera evaluación. Se centra en la introducción a la programación de sistemas, incluyendo ejemplos de programas de sistemas, como sistemas operativos, compiladores, y ligadores. También explica qué es la programación de sistemas y qué estudia. Discute diferentes enfoques y herramientas en la programación de sistemas.
Full Transcript
# Temas desarrollados de la Primera Evaluación. ## Programación de sistemas ### Introducción a la programación de sistemas La programación de sistemas comprende el desarrollo de aquellos programas de computadora que tienen una fuerte interacción con el hardware de la computadora y su sistema oper...
# Temas desarrollados de la Primera Evaluación. ## Programación de sistemas ### Introducción a la programación de sistemas La programación de sistemas comprende el desarrollo de aquellos programas de computadora que tienen una fuerte interacción con el hardware de la computadora y su sistema operativo. Los programas de sistemas tienen que ver con organización y direcciones de memoria, registros del procesador, ciclos de reloj, Entrada / Salida, conjuntos de instrucciones, dispositivos periféricos, etc. #### Ejemplos de programas de sistemas: * El sistema operativo (S.O) * Traductores de lenguaje (compiladores, ensambladores, interpretes, etc.) * Cargadores (loaders) * Ligadores (linkers). El diseño y construcción de los compiladores requiere del conocimiento y aplicación de multiples disciplinas, tales como: teoria de la comunicación y lenguajes, arquitectura de computadoras, ingeniería de software, programación de computadoras, entre otras. ### 1.1 ¿Qué es la Programación de Sistemas y qué estudia la programación de sistemas? Un sistema es un conjunto de componentes que interaccionan entre sí para lograr un objetivo común. Las personas se comunican con el lenguaje, que es un sistema muy desarrollado formado por palabras y símbolos que tienen significado para el que habla y para quienes lo escuchan, lo mismo es para las computadoras las cuales tienen sistemas y se comunican por medio de computadoras. La programación es el proceso de convertir las especificaciones a grandes rasgos de los sistemas en instrucciones de máquina que produzcan los resultados deseados. Entonces, la Programación de Sistemas se refiere a la creación de programas cuya finalidad es servir a otros programas. Entre los programas que semanejan en la Programación de Sistemas se encuentran, entre otros, los sistemas operativos, los compiladores, los ensambladores, los cargadores y los macro procesadores. El trabajo de un programador de sistemas es seleccionar, modificar y mantener el complejo software del sistema operativo. Por lo tanto, los programadores de sistemas desempeñan una función de apoyo al mantener el ambiente del software del sistema operativo en el que trabajan los programadores de aplicaciones y los operadores de las computadoras. También participan en las decisiones relativas a reducciones o ampliaciones de hardware y/o software. Programación de Sistemas Conceptos y Aplicaciones Se entiende por programación de sistemas el conjunto de programas necesario para que una computadora de una imagen coherente y monolítica ante sus usuarios. Es un área especializada dentro de las ciencias de la computación. Así, mediante la programación de sistemas, no solo se manejan las computadoras por medio del lenguaje maquina (0 y 1) sino por otros sistemas operativos, sin lo cual sería muy difícil la interacción con la máquina. #### Tiene algunas áreas específicas: * Sistemas para arquitecturas paralelas y distribuidas. * Diseño de sistemas operativos para arquitecturas paralelas y sistemas distribuidos, particularmente en lo que se refiere a manejo de memoria y calendarización de procesos. * Redes y protocolos, programación distribuida, diseño y evaluación de “middleware” enfocados a aplicaciones de minería de datos y multimedia. * Diseño de algoritmos paralelos y distribuidos. Herramientas para programación paralela y distribuida. * Sistemas de tiempo real. Relacionados con diversos aspectos de la planificación de los sistemas de tiempo real entre los cuales se encuentran los siguientes: planificación tolerante a fallas en sistemas de tiempo real, planificación de tiempo real en situaciones de sobrecarga, esto es en aplicaciones en donde se demande del procesador más del 100% de su capacidad, y planificación de sistemas de tiempo real aplicada al control de procesos y técnicas de planificación de tareas de tiempo real con restricciones de consumo de poder. * Diseño y programación de sistemas grandes. Los sistemas empotrados suelen ser grandes y complejos, formados por subsistemas relacionados, pero relativamente independientes. Algunos lenguajes ignoran el hecho de que los programas se construyen por partes, cada una de ellas compilada por separado y todas ellas enlazadas en una aplicación final. El resultado se convierte en aplicaciones monolíticas difíciles de mantener. ### 1.2 Herramientas desarrolladas con la teoría de programación de sistemas El mecanismo más básico de operar una computadora es entrando un comando y esperar una acción o resultado como respuesta. Aunque hoy en día se usan interfaces de usuario más amigables como uso de ratón, tabletas gráficas, pantallas sensibles al tacto, etc. casi todas las acciones se convierten en comandos que son ejecutados como si se hubieran tecleado directamente. Podemos ver la aplicación de la programación de sistemas en herramientas tales como: * Procesadores de comandos (shell) * Procesadores de palabras * Correctores gramaticales * Editores sensibles al contexto * Procesadores de lenguaje como SQL, HTML o XML * Procesadores de archivos de inicialización (.INI) ### 1.3 Lenguajes Existen muchos lenguajes de programación con características y aptitudes muy diferenciadas. Todo ello se encuentra en dos grandes grupos: * Los lenguajes máquina. * Los lenguajes simbólicos. Lenguaje de programación en el que las instrucciones de los diferentes programas se codifican utilizando los caracteres de las lenguas naturales. La ejecución de un programa. Entre los primeros se encuentran los denominados lenguajes en código máquina. En estos lenguajes, la codificación de estos lenguajes se hace utilizando un lenguaje binario de ceros y unos que son los únicos símbolos que puede entender cualquier computador. Cada sistema físico tiene su código máquina distinta por lo que un programa escrito en un determinado código máquina sólo vale para un sistema físico. A los lenguajes máquina les sucedieron, los lenguajes simbólicos los cuales utilizan caracteres naturales para escribir las instrucciones de los programas. Los lenguajes simbólicos se dividen a su vez en: * Lenguajes simbólicos de bajo nivel o ensambladores. * Lenguajes simbólicos de alto nivel. Dentro de los segundos se puede distinguir a su vez los lenguajes procedurales y los relacionales. 1. Un lenguaje procedural es aquel lenguaje de programación en el que hay que señalar tanto lo que se quiere hacer como el modo de hacerlo. Los lenguajes de tercera generación son de tipo procedural. 2. Un lenguaje relacional es un tipo de lenguaje de programación en el que sólo hay que especificar lo que se quiere obtener, sin necesidad de especificar a su vez el camino a seguir para obtener los resultados deseados. Este tipo de lenguaje son de muy alta productividad en desarrollo pero muy ineficientes en ejecución. La diferencia entre uno y otro es que los primeros exige que se diga tanto lo que se quiere hacer como la forma en que hay que hacerlo mientras que los relacionales sólo exigen que se diga lo que se quiere hacer, pero no es necesario que se exprese el camino para realizarlo. A medida que se va subiendo de nivel los lenguajes son más sencillos y más productivos en desarrollo, pero en contra partida son menos eficientes a la hora de su ejecución. Los programas escritos en lenguajes simbólicos se denominan programas fuente y los programas no son directamente ejecutables su ejecución implica su previa traducción a código máquina para obtener los denominados programas objeto o absolutos. Esta traducción se hace a través de los ensambladores, compiladores o intérpretes, a los lenguajes que de forma genérica se les denomina procesadores de lenguajes. ### 1.3.1 Proceso de la comunicación Esencia de la comunicación Hombre-Maquina Generaciones de Lenguajes: 1ra. Generación: Lenguaje Maquina 2ª Generación: Leng. Ensamblador 3a Generación: Leng. Alto Nivel 4ta. Generación: Los lenguajes de más alto nivel no ofrecen necesariamente mayores capacidades de programación, pero si ofrecen una interacción programador/computadora más avanzada. Cuanto más alto es el nivel del lenguaje, más sencillo es comprenderlo y utilizarlo. El único lenguaje que hoy en día la computadora es capaz de entender de forma nativa es en código binario. Aun no existe una computadora cuyo lenguaje nativo sea un lenguaje humano, tal como el español. ### 1.3.2 Lenguajes Naturales Son los que cotidianamente los seres humanos utilizan para comunicarse, expresar ideas, etc. Tiene una fuerte caracterización para las costumbres, geografía y entorno entre otros. Ejemplo: Ingles, francés, Español. En un futuro quizás sea posible desarrollar un lenguaje de programación basado 100% en lenguaje natural. ### 1.3.3 Lenguajes Artificiales Son aquellos que intentan resolver situaciones de ambigüedad o de múltiple interpretación, que se da en los lenguajes naturales. Ejemplo: la palabra “Salte” en lenguaje natural debe ser interpretada como salir o saltar? También llamados “Lenguajes formales” tales como “Lenguajes Matemáticos” como en una expresión matemática. Ejemplo: 1/2 x² dx Estos lenguajes artificiales son subconjuntos de un lenguaje natural utilizado con un fin determinado; ejemplo, para la programación de computadoras. ### 1.4 Traductores y su estructura Un traductor es un programa que convierte un programa fuente a un objeto o programa objeto. El programa fuente puede estar en algún lenguaje de programación dado. El programa objeto esta en el otro lenguaje de programación. #### 1.4.1 Traductores * Ensambladores * Interpretes * Compiladores * Preprocesadores Cuando se empezaron a utilizar símbolos nemotécnicos, se escribieron programas para traducir automáticamente los programas escritos en lenguaje ensamblador a lenguaje máquina. A estos programas traductores se les llamo ensambladores. La entrada para un ensamblador es un programa fuente escrito en lenguaje ensamblador. La salida es un programa objeto, escrito en lenguaje de máquina. El programa objeto incluye también la información necesaria para que el cargador pueda preparar el programa objeto para su ejecución. Para evitar confusiones, de aquí en adelante llamaremos lenguaje ensamblador al conjunto de nemotécnicos y a las reglas para su manejo. Al programa que traduce un programa objeto a partir de un programa escrito en lenguaje ensamblador lo llamaremos ensamblador. Es como un compilador, solo que la salida es una ejecución. El programa de entrada se reconoce y ejecuta a la vez. No se produce un resultado físico (código máquina) sino lógico (una ejecución). Hay lenguajes que sólo pueden ser interpretados, como p.ej. SNOBOL (StriNg Oriented SimBOlyc Language), LISP (LISt Processing), algunas versiones de BASIC (Beginner's All-purpose Symbolic Instruction Code), etc. Su principal ventaja es que permiten una fácil depuración. Entre los inconvenientes podemos citar, en primer lugar, la lentitud de ejecución, ya que al ejecutar a la vez que se traduce no puede aplicarse un alto grado de optimización. Además de que la traducción optimiza el programa acercándolo a la máquina, los lenguajes interpretados tienen la característica de que permiten construir programas que se pueden modificar a sí mismos. Hoy en día, un compilador es un traductor que facilita la comunicación entre el programador y la máquina, por medio de un proceso de transformación. Un compilador es un programa que lee las líneas escritas en un lenguaje de programación (como Pascal) y las traduce a otro que pueda ejecutar la computadora. Los programas compilados se ejecutan más rápido que los interpretados, debido a que han sido completamente traducidos a lenguaje de máquina y no necesitan compartir memoria con el intérprete. A grandes rasgos un compilador es un programa que lee un programa escrito es un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este proceso de traducción, el compilador informa a su usuario de la presencia de errores en el programa fuente. El programa compilador traduce las instrucciones en un lenguaje de alto nivel a instrucciones que la computadora puede interpretar y ejecutar. Para cada lenguaje de programación se requiere un compilador separado. El compilador traduce todo el programa antes de ejecutarlo. Los compiladores son, pues, programas de traducción insertados en la memoria por el sistema operativo para convertir programas de cómputo en pulsaciones electrónicas ejecutables (lenguaje de máquina). ### 1.4.2 Contexto de la compilación. La estructura de un compilador, está dividida en cuatro grandes módulos, cada uno independiente del otro, se podría decir que un compilador está formado por cuatros módulos más a su vez. El primero de ellos es el preprocesador, es el encargado de transformar el código fuente de entrada original en el código fuente puro. El segundo módulo es el de compilación que recibe el código fuente puro, este es él modulo principal de un compilador, pues si ocurriera algún error en esta etapa el compilador no podría avanzar. En esta etapa se somete al código fuente puro de entrada a un análisis léxico gráfico, a un análisis sintáctico, a un análisis semántico, que construyen la tabla de símbolos, se genera un código intermedio al cual se optimiza para así poder producir un código de salida generalmente en algún lenguaje ensamblador. El tercer módulo es el llamado módulo de ensamblado, este módulo no es ni más ni menos que otro compilador pues recibe un código fuente de entrada escrito en ensamblador, y produce otro código de salida, llamado código binario no enlazado. El cuarto y último modulo es el encargado de realizar el enlazado del código de fuente de entrada (código maquina re localizable) con las librerías que necesita, como así también de proveer al código de las rutinas necesarias para poder ejecutarse y cargarse a la hora de llamarlo para su ejecución, modifica las direcciones re localizables y ubica los datos en las posiciones apropiadas de la memoria. ### 1.5 Generadores de código para compiladores (compilador de compilador). Analizando en detalle el proceso de compilación, se divide en dos grandes fases, una de Análisis y la otra de Síntesis. #### Fase de Análisis: * En el llamado análisis lexicográfico o léxico, el compilador revisa y controla que las "palabras" estén bien escritas y pertenezcan a algún tipo de token (cadena) definido dentro del lenguaje, como por ejemplo que sea algún tipo de palabra reservada, o si es el nombre de una variable que este escrita de acuerdo a las pautas de definición del lenguaje. * En el análisis sintáctico como su nombre lo indica se encarga de revisar que los tokens estén ubicados y agrupados de acuerdo a la definición del lenguaje. Dicho de otra manera, que los tokens pertenezcan a frases gramaticales validas, que el compilador utiliza para sintetizar la salida. * El análisis semántico se encarga de revisar que cada agrupación o conjunto de token tenga sentido, y no sea un absurdo. En esta etapa se reúne la información sobre los tipos para la fase posterior, en esta etapa se utiliza la estructura jerárquica de la etapa anterior y así poder determinar los operadores, y operandos de expresiones y preposiciones. #### Fase de Síntesis: * Etapa de generación de código intermedio, aunque algunos compiladores no la tienen, es bueno saber de su existencia, en esta etapa se lleva el código del programa fuente a un código interno para poder trabajar más fácilmente sobre él. * En la etapa de optimización de código, se busca obtener el código más corto y rápido posible, utilizando distintos algoritmos de optimización. Etapa de generación de código, se lleva el código intermedio final a código maquina o código objeto, que por lo general consiste en un código maquina re localizable o código ensamblador. * La tabla de símbolos no es una etapa del proceso de compilación, sino que una tarea, una función que debe realizar el proceso de compilación. En ella se almacenan los identificadores que aparecen en el código fuente puro, como así también los atributos de los mismos, su tipo, su ámbito y en el caso de los procedimientos el número de argumentos el tipo del mismo etc. ## Unidad 2: Introducción al diseño de los lenguajes deprogramación ### 2.1 Visión del problema. Proporciona modelos de diseño que permitan caracterizar el desarrollo de aplicaciones utilizando un lenguaje de programación se necesita un lenguaje de modelado que sea capaz de capturar la semántica del modelo al que se ajusta el lenguaje de programación. El modelado de diseño proporcionado por el lenguaje de modelado debe ser capaz de capturar la semántica del programa que implementa la especificación de requisitos. En los últimos años, una de las artes más predominantes en el mundo de la programación ha sido el diseño de lenguaje de programación. El número de lenguajes de programación propuesta y diseñados son extremadamente grandes. Aun el número de lenguajes para el que un compilador ha aplicado es inmenso. Sammet (1976) indica167 en su lista 1974-1975.Los primeros lenguajes fueron los pioneros, explorando un nuevo campo. No es de sorprenderse que carecieran de un buen diseño. Después que el desarrollo inicial del lenguaje de alto nivel y la implementación de los primeros pocos compiladores, allí resultó un período bastante largo en el que las tentativas conscientes se hicieron para diseñar nuevos lenguajes sin los desperfectos de los viejos. La mayor parte de estas tentativas eran los fracasos, no tanto de una falta de ideas en cómo diseñar mejores lenguajes como de un superávit de ideas ### 2.2 Consideraciones Premilinares. Debemos tomar en cuenta las palabras reservadas del lenguaje, los operadores, los tipos de datos. * Debemos considerar el objetivo del lenguaje, si es un lenguaje de enseñanza, si es un lenguaje para profesionales, si el código desarrollado va a ser mejor. ¿Cuál es el propósito del lenguaje?-No hay un lenguaje bueno para todo-Aplicación especifica *Bases de datos, sistemas expertos, calculo número, programación simbólica, diseño de algorítmico, etc. ¿Es necesario diseñar un nuevo lenguaje?-Ya existe un lenguaje apropiado *El nuevo lenguaje se diferencia de los existentes-Se consume demasiado tiempo en el diseño e implementación de un nuevo lenguaje *Es demasiado fácil diseñar un lenguaje incompleto *Lenguaje demasiado especializado *Sacrificar características del lenguaje por un compilador simple-Otras opciones *Un módulo o librería de funciones *Ampliar un lenguaje de programación ### 2.3 Objetivos y filosofías del diseño de los lenguajes de programación. Algunos usos de los lenguajes de programación son: * Comunicación humana * Prevención y Detección de errores * Usabilidad * Portabilidad * Independencia de la máquina Filosofías * Se debe lograr una correcta comunicación entre emisor y receptor * Es más importante que un programa sea leíble que escribible, ya que un programa generalmente se escribe una vez y se lee muchas veces (documentación, mantenimiento, etc.) * La tendencia actual es separa la interfaz de la implementación Tratar de hacer lenguajes para múltiples arquitecturas de computadoras (máquinas virtuales) * Control de apuntadores * Control de tipo de datos robustos * Simplicidad por eficiencia ### 2.4 Diseño detallado. El diseño detallado tiene que ver con la especificación de detalles algorítmicos, representaciones concretas de datos, interconexiones entre funciones y estructuras de datos, y empaque del producto de programación. El diseño detallado está fuertemente influenciado por el lenguaje de instrumentación, pero no es lo mismo que la instrumentación; el diseño detallado tiene que ver más con aspectos semánticos y menos con detalles sintácticos que es la instrumentación. El punto de inicio para el diseño detallado es una estructura arquitectónica a la que se le van a proporcionar los detalles algorítmicos y las representaciones concretas de datos. Mientras que hay una fuerte tentación para proceder directamente de la estructura arquitectónica a la instrumentación, hay varias ventajas que pueden lograrse en el nivel intermedio de detalle proporcionado por el diseño detallado. Explicar el lenguaje que se va a desarrollar en el curso: ¿Por qué se va a desarrollar (problemática)? – Vocabulario del lenguaje (léxico palabras clases que hacen) – Reglas de estructura (gramática, sintaxis) – Semántica – Si existe código intermedio – Si se mejora ese código - El código objeto final