Definicion Programacion De Sistemas

29

Click here to load reader

Transcript of Definicion Programacion De Sistemas

Page 1: Definicion Programacion De Sistemas

Definicion Programacion De Sistemas¿QUE ES? Un sistema es un conjunto de componentes que interaccionan entre si 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 maquina que produzcan los resultados deseados. ¿QUE ESTUDIA? 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 maquina. El estudio de la programación de sistemas En esta área se estudia la teoría de máquinas y su aplicación en el diseño de sistemas digitales y de arquitectura de computadoras.Áreas específicas: Sistemas digitales para arquitecturas paralelas y control de procesos y sistemas reconfigurables. Inteligencia artificial aplicada a trabajo cooperativo En las aplicaciones cooperativas realizadas en el entorno Web, es viable hacer uso de las herramientas de inteligencia artificial. Se están diseñando y construyendo herramientas para elaborar un sistema sin costura que opere en Web con la finalidad de proporcionar a un grupo de coautores el soporte necesario para producir conjunta y simultáneamente un mismo documento. La plataforma, denominada PINAS, es un sistema de edición cooperativa (Alliance Web) y un sistema de notaciones sobre documentos complejos (COARSY) los cuales podrán permitir a coautores o revisores distribuidos en diferentes sitios del mundo, compartir y anotar observaciones sobre documentos complejos tales como capítulos de libro, artículos, reportes, expedientes médicos, etc. 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

Page 2: Definicion Programacion De Sistemas

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. Otros lenguajes, en contraste, parten del concepto de módulo y proporcionan mecanismos de encapsulamiento y abstracción que ayudan a programar sistemas grandes, ya que el trabajo del equipo de programación y posterior mantenimiento del sistema se ve facilitado. Uno de estos lenguajes es Ada, que está fuertemente fundamentado en la disciplina de la ingeniería del software por lo que es el lenguaje más apropiado en la programación de sistemas empotrados industriales grandes.Ada asume la necesidad de la compilación separada y proporciona dos mecanismos para realizarla, uno ascendente y otro descendente: o El mecanismo descendente (descomposición): consiste en dividir un sistema complejo en componentes más sencillos. Es apropiado para el desarrollo de grandes programas coherentes que, son divididos en varias subunidades que pueden compilarse por separado. Las subunidades se compilan después que la unidad de la que forman parte. o El mecanismo ascendente (abstracción): consiste en la especificación de los aspectos esenciales de un componente, posponiendo su diseño detallado. Es apropiado para la creación de bibliotecas de programa en las que las unidades se escriben para uso general y, consecuentemente, se escriben antes que los programas que las vayan a utilizar. El diseño de sistemas mediante módulos permite encapsular partes del sistema mediante interfaces bien definidas y permiten utilizar técnicas que facilitan el desarrollo de sistemas grandes como: - Ocultación de información. - Tipos abstractos de datos. - Compilación separada. Las unidades de programa en Ada son las siguientes: - Subprograma que define los algoritmos ejecutables. Los procedimientos y las funciones son subprogramas. - Paquete: define una colección de entidades. Los paquetes son el principal mecanismo de agrupación de Ada. - Tarea: define una computación que puede llevarse a cabo en paralelo con otras computaciones. - Unidades Genéricas: ayudan a realizar código reutilizable. Pueden ser subprogramas o paquetes. - Unidad Protegida: puede coordinar el acceso a datos compartidos en el procesamiento paralelo. Aparece en el estándar Ada 95. En Ada, las unidades de compilación pueden ser: o Especificaciones de subprogramas o Especificaciones de paquetes o Cuerpos de subprogramas o paquetes

Page 3: Definicion Programacion De Sistemas

Algunos compiladores pueden establecer ciertos requisitos para las unidades de compilación. Por ejemplo, GNAT en su configuración predefinida exige que cada unidad esté definida en un fichero, con el nombre de la unidad y la extensión .ads para especificaciones y .adb para cuerpos. El guión “-“ se ha de utilizar en sustitución del punto “.” para unidades hijas y subunidades. Referencias: La Programacion de Sistemas es la accion de resolver eficientemente una necesidad mediante un codigo hecho programa que se comunican para satisfacer dicha necesidad en un ambiente amigable y facil de manejar para el usuario final. 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 maquina. Toda accion que codificada resuelva una necesidad o problema sistematizadamente.

Herramientas Desarrolladas Con Teoria De Programacion De Sistemas1.2 Herramientas Desarrolladas Con Teoría De La Programación De Sistemas Las herramientas de programación, son aquellas que permiten realizar aplicativos, programas, rutinas, utilitarios y sistemas para que la parte fisica del computador u ordenador, funcione y pueda producir resultados. Hoy dia existen múltiples herramientas de programación en el mercado, tanto para analistas expertos como para analistas inexpertos. Las herramientas de programación más comunes del mercado, cuentan hoy dia con programas de depuración o debugger, que son utilitarios que nos permiten detectar los posibles errores en tiempo de ejecución o corrida de rutinas y programas. Muchas herramientas de software que manipulan programas fuente realizan primero algún tipo de análisis. Algunos ejemplos de tales herramientas son:

1. Editores de estructuras: Un editor de estructuras toma como entrada una secuencia de órdenes para construir un programa fuente. El editor de estructuras no sólo realiza las funciones de creación y modificación de textos de un editor de textos ordinario, sino que también analiza el texto del programa, imponiendo al programa fuente una estructura jerárquica apropiada. De esa manera, el editor de estructuras puede realizar tareas adicionales útiles para la preparación de programas. Por ejemplo, puede comprobar si la entrada está formada correctamente, puede proporcionar palabras clave de manera automática (por ejemplo, cuando el usuario escribe while, el editor proporciona el correspondiente do y le recuerda al usuario que entre las dos palabras

debe ir un condicional) y puede saltar desde un begin o un paréntesis izquierdo hasta su correspondiente end o paréntesis derecho. Además, la salida de tal editor suele ser similar a la salida de la fase de análisis de un compilador.

2. Impresoras estéticas: Una impresora estética analiza un programa y lo imprime de forma que la estructura del programa resulte claramente visible. Por ejemplo, los comentarios pueden aparecer con un tipo de letra especial, y

Page 4: Definicion Programacion De Sistemas

las proposiciones pueden aparecer con una indentación proporcional a la profundidad de su anidamiento en la organización jerárquica de las proposiciones.

3. Verificadores estáticos: Un verificador estático lee un programa, lo analiza e intenta descubrir errores potenciales sin ejecutar el programa. La parte de análisis a menudo es similar a la que se encuentra en los compiladores de optimización. Así, un verificador estático puede detectar si hay partes de un programa que nunca se podrán ejecutar o si cierta variable se usa antes de ser definida. Además, puede detectar errores de lógica, como intentar utilizar una variable real como apuntador, empleando las técnicas de verificación de tipos.

4. Intérpretes: En lugar de producir un programa objeto como resultado de una traducción, un intérprete realiza las operaciones que implica el programa fuente. Para una proposición de asignación, por ejemplo, un intérprete podría construir un árbol como el de la figura 1 y después efectuar las operaciones de los nodos conforme “recorre” el árbol. En la raíz descubriría que tiene que realizar una asignación, y llamaría a una rutina para evaluar la expresión de la derecha y después almacenaría el valor resultante en la localidad de memoria asociada con el identificador posición. En el hijo derecho de la raíz, la rutina descubriría que tiene que calcular la suma de dos expresiones. Se llamaría a sí misma de manera recursiva para calcular el valor de la expresión velocidad*60. Después sumaría ese valor de la variable inicial. Muchas veces los intérpretes se usan para ejecutar lenguajes de órdenes, pues cada operador que se ejecuta en un lenguaje de órdenes suele ser una invocación de una rutina compleja, como un editor o un compilador. Del mismo modo algunos lenguajes de “muy alto nivel”, normalmente son interpretados, porque hay muchas cosas sobre los datos, como el tamaño y la forma de las matrices, que no se pueden deducir en el momento de la compilación.

5. Compiladores: Tradicionalmente, se concibe un compilador como un programa que traduce un programa fuente, como FORTRAN, al lenguaje ensamblador o de máquina de algún computador. Sin embargo, hay lugares, al parecer, no relacionados donde la tecnología de los compiladores se usa con regularidad. La parte de análisis de cada uno de los siguientes ejemplos es parecida a la de un compilador convencional.

a) Formadores de textos. Un formador de textos toma como entrada una cadena de caracteres, la mayor parte de la cual es texto para componer, pero alguna incluye órdenes para indicar párrafos, figuras o estructuras matemáticas, como subíndices o superíndices. b) Compiladores de circuitos de silicio. Un compilador de circuitos de silicio tiene un lenguaje fuente similar o idéntico a un lenguaje de programación convencional. Sin embargo las variables del lenguaje no representan localidades de memoria, sino señales lógicas (0 o 1) o grupos de señales en un circuito de conmutación. La salida es el diseño de un circuito en un lenguaje apropiado. c) Intérpretes de consultas. Un intérprete de consultas traduce un predicado que contiene operadores relacionales y boléanos a órdenes para buscar en una base de datos registros que satisfagan ese predicado.

Lenguajes

Page 5: Definicion Programacion De Sistemas

Se llama lenguaje a cualquier tipo de código semiótico estructurado, para el que existe un contexto de uso y ciertos principios combinatorios formales. Existen muchos contextos tanto naturales como artificiales donde aparecen lenguajes. El lenguaje humano se basa en la capacidad de los seres humanos para comunicarse mediante de signos. Principalmente lo hacemos utilizando el signo lingüístico. Aún así, hay diversos tipos de lenguaje. El lenguaje humano puede estudiarse en cuanto a su desarrollo desde dos puntos de vista complementarios: la ontogenia, que remite al proceso de adquisición del lenguaje por el ser humano, y la filogenia El lenguaje animal se basa en el uso de señales sonoras, visuales y olfativas a modo de signos para referirse a un referente o un significado diferente de dichas señales. Dentro del lenguaje animal están los gritos de alarma, el lenguaje de las abejas, etc. Los lenguajes formales son construcciones artificiales humanas, que se usan en matemática y otras disciplinas formales, incluyendo lenguajes de programación. Estas construcciones tienen estructuras internas que comparten con el lenguaje humano natural, por lo que pueden ser en parte analizados con los mismos conceptos que éste.

Lenguajes NaturalesEste tipo de lenguaje es el que nos permite el designar las cosas actuales y razonar a cerca de ellas, fue desarrollado y organizado a partir de la experiencia humana y puede ser utilizado para analizar situaciones altamente complejas y razonar muy sutilmente. La riqueza de sus componentes semánticos da a los lenguajes naturales su gran poder expresivo y su valor como una herramienta para razonamiento sutil. Por otro lado la sintaxis de un LN puede ser modelada fácilmente por un lenguaje formal, similar a los utilizados en las matemáticas y la lógica. Otra propiedad de los lenguajes naturales es la polisemantica, es decir la posibilidad de que una palabra en una oración tenga diversos significados. En un primer resumen, los lenguajes naturales se caracterizan por las siguientes propiedades: Desarrollados por enriquecimiento progresivo antes de cualquier intento de formación de una teoría. La importancia de su carácter expresivo debido grandemente a la riqueza del componente semántico(polisemantica). Dificultad o imposibilidad de una formalización completa.

Lenguajes ArtificialesEl lenguaje nos permite hacer la abstracion y conceptualizacion de ideas y por medio de este comunicarnos. En las distintas ramas de la ciencia nos encontramos con lenguajes artificiales o mejor conocidos como lenguajes formales que limitan su alcance a su materia de estudio. Concretamamente y despues de esta breve introduccion, en la actualidad nos encontramos con distintos lenguajes para para programar y tambien los campos de aplicacion son variados y completamente distintos. De acuerdo a la complejidad del problema a resolver sera necesario hacer una seleccion adecuada del lenguaje de programacion (incluso se puede generar el lenguaje de programacion propio) que permita resolver de manera eficiente el problema. Hasta hace pocos años, el software de desarrollo se basaba fundamentalmente en Lenguajes Artificiales (Basic, C, Cobol, Pascal…) para “explicar” a la computadora las acciones a realizar. Por el contrario, los “Orientados a Objetos” permiten que el programador ignore el lenguaje comprensible para la máquina poniendo a su

Page 6: Definicion Programacion De Sistemas

disposión una serie de objetos preprogramados. De este modo la tarea se simplifica enormemente y se reduce a disponer,dentro de la ventana de programa y en la secuencia adecuada, los programas y funciones de los que nos provee.

Proceso De La ComunicacionLa comunicación es un fenómeno inherente a la relación grupal de los seres vivos por medio del cual éstos obtienen información acerca de su entorno y de otros entornos y son capaces de compartirla haciendo partícipes a otros de esa información. La comunicación es de suma importancia para la supervivencia de especies gregarias, pues la información que ésta extrae de su medio ambiente y su facultad de transmitir mensajes serán claves para sacar ventaja del modo de vida gregario. Etimológicamente, la palabra comunicación deriva del latín “commūnicāre”, que puede traducirse como “poner en común, compartir algo”. Se considera una categoría polisémica en tanto su utilización no es exclusiva de una ciencia social en particular, teniendo connotaciones propias de la ciencia social de que se trate. Proceso de transmisión de información de un emisor (A) a un receptor (B) a través de un medio ©. En la transmisión y la recepción de esa información se utiliza un código específico que debe ser “codificado”, por el emisor y “decodificado” por el receptor”. Elementos del Proceso de la comunicación Los elementos de la comunicación humana son: fuente, emisor o codificador, código (reglas del signo, símbolo), mensaje primario (bajo un código), receptor o decodificador, canal, ruido (barreras o interferencias) y la retroalimentación o realimentación (feed-back, mensaje de retorno o mensaje secundario). • Fuente: Es el lugar de donde emana la información, los datos, el contenido que se enviará, en conclusión: de donde nace el mensaje primario. • Emisor o codificador: Es el punto (persona, organización…) que elige y selecciona los signos adecuados para transmitir su mensaje; es decir, los codifica para poder llevarlo de manera entendible al receptor. En el emisor se inicia el proceso comunicativo. • Receptor o decodificador: Es el punto (persona, organización…) al que se destina el mensaje, realiza un proceso inverso al del emisor ya que en él está el descifrar e interpretar lo que el emisor quiere dar a conocer. Existen dos tipos de receptor, el pasivo que es el que sólo recibe el mensaje, y el receptor activo o perceptor ya que es la persona que no sólo recibe el mensaje sino que lo percibe y lo almacena. El mensaje es recibido tal como el emisor quiso decir, en este tipo de receptor se realiza lo que comúnmente denominamos el feed-back o retroalimentación. • Código: Es el conjunto de reglas propias de cada sistema de signos y símbolos que el emisor utilizará para trasmitir su mensaje, para combinarlos de manera arbitraria porque tiene que estar de una manera adecuada para que el receptor pueda captarlo. Un ejemplo claro es el código que utilizan los marinos para poder comunicarse; la gramática de algún idioma; los algoritmos en la informática…, todo lo que nos rodea son códigos. • Mensaje: Es el contenido de la información (contenido enviado): el conjunto de ideas, sentimientos, acontecimientos expresados por el emisor y que desea trasmitir al receptor para que sean captados de la manera que desea el emisor. El mensaje es la información.

Page 7: Definicion Programacion De Sistemas

• Canal: Es el medio a través del cual se transmite la información-comunicación, estableciendo una conexión entre el emisor y el receptor. Mejor conocido como el soporte material o espacial por el que circula el mensaje. Ejemplos: el aire, en el caso de la voz; el hilo telefónico, en el caso de una conversación telefónica. • Referente: Realidad que es percibida gracias al mensaje. Comprende todo aquello que es descrito por el mensaje. • Situación: Es el tiempo y el lugar en que se realiza el acto comunicativo. • Interferencia o barrera: Cualquier perturbación que sufre la señal en el proceso comunicativo, se puede dar en cualquiera de sus elementos. Son las distorsiones del sonido en la conversación, o la distorsión de la imagen de la televisión, la alteración de la escritura en un viaje, la afonía del hablante, la sordera del oyente, la ortografía defectuosa, la distracción del receptor, el alumno que no atiende aunque esté en silencio. • Retroalimentación o realimentación (mensaje de retorno): Es la condición necesaria para la interactividad del proceso comunicativo, siempre y cuando se reciba una respuesta (actitud, conducta…) sea deseada o no. Logrando la interacción entre el emisor y el receptor. Puede ser positiva (cuando fomenta la comunicación) o negativa (cuando se busca cambiar el tema o terminar la comunicación). Si no hay realimentación, entonces solo hay información más no comunicación.

Traductor Y Su EstructuraTraductor: En un sentido orientado hacia la computación, un traductor, de manera general, es un software que toma como entrada un programa escrito en un código llamado fuente y genera como salida otro programa en un código llamado objeto. Algunos ejemplos de traductores son los compiladores (toma como entrada código en alto nivel y genera como salida código en bajo nivel), los interpretes (toma como entrada código en alto nivel y genera como salida un código intermedio), los preprocesadores (toma como entrada código en alto nivel y genera como salida código en alto nivel) y el ensamblador (toma como entrada código en ensamblador y genera como salida código en bajo nivel). Su estructura podria ser expresada de la siguiente manera: código fuente -→>> traductor -→> código objeto Intérpretes o Traductores Definición. Un intérprete es un programa que ejecuta un programa escrito en un determinado lenguaje examinando y ejecutando cada sentencia del programa una a una, por separado y sin realizar un proceso de compilación previo. Al contrario de lo que se podría pensar el intérprete NO traduce la sentencia a código máquina antes de ejecutarla. En su lugar, identifica el tipo de sentencia y la ejecuta directamente. El código para ejecutar la sentencia está contenido dentro del intérprete que contendrá rutinas para: evaluar una expresión, almacenar información en memoria, recuperar datos de memoria, etc. El intérprete contendrá el número de rutinas necesarias para poder ejecutar cualquier sentencia del lenguaje que está interpretando. Ejemplo: C := A + B 1. El intérprete lee la sentencia y determina que es una asignación. 2. Llamará a una de sus rutinas para evaluar la expresión a la derecha de la asignación.

Page 8: Definicion Programacion De Sistemas

3. Esta rutina toma los símbolos A y B, determina donde están almacenados, obtiene sus valores actuales y los suma. 4. El intérprete toma el valor calculado y lo almacena en la dirección de memoria a la que hace referencia el símbolo C. Al igual que un compilador para llevar a cabo su tarea el intérprete usará un analizador léxico-gráfico y guardará la información necesaria para la traducción en una tabla de símbolos. Interpretar una sentencia es relativamente complejo, al tener que ser escaneada y analizada, los símbolos tienen que ser buscados, hay que llevar a cabo lo indicado por la sentencia, etc. Esto significa que el número de instrucciones máquinas a ejecutar para interpretar una sentencia puede ser mucho mayor que el código generado por un compilador. Además, cada sentencia tendrá que ser interpretada cada vez que aparezca, por lo que una sentencia en un bucle sería interpretada varias veces. Además de elegir entre compilar o interpretar un programa, otra opción es combinar ambos procesos de traducción. En este caso, se realiza una compilación “parcial” a un código intermedio que es seguida de un proceso de interpretación. Uno de los lenguajes más utilizados hoy en día, sobre todo para el desarrollo de aplicaciones para la Web, que sigue esta propuesta es el lenguaje Java. En el lenguaje Java el código primero se compila con el compilador de Java javac. Este compilador genera un código virtual llamado Byte Code. Este código es luego interpretado por una Máquina Virtual de Java (o JVM de Java Virtual Machine) que debe estar instalada y ejecutándose en la máquina en la que se desee ejecutar el código compilado con javac. Comparación entre compiladores e intérpretes Históricamente, debido a la escasez de memoria de los primeros ordenadores, se puso de moda el uso de intérpretes frente a los compiladores, pues el programa fuente sin traducir y el intérprete juntos requerían una cantidad de memoria menor que la del compilador. Por ello, los primeros ordenadores personales (Spectrum, Commodore VIC-20, PC XT de IBM, etc.) iban siempre acompañados de un intérprete de BASIC. La mejor información sobre los errores por parte del compilador así como una mayor velocidad de ejecución del código resultante hizo que poco a poco se impusieran los compiladores. Hoy en día, y con el problema de la memoria prácticamente resuelto, se puede hablar de un gran predominio de los compiladores frente a los intérpretes, aunque intérpretes como los incluidos en los navegadores de Internet para Java son la gran excepción. Algunas de las ventajas de compilar frente a interpretar son: • Se compila una vez; se ejecuta muchas veces • La ejecución del programa objeto es mucho más rápida que si se interpreta el programa fuente. • El compilador tiene una visión global del programa, por lo que la información de mensajes de error es más detallada. Por otro lado, algunas de las ventajas de interpretar frente a compilar son: • Un intérprete necesita menos memoria que un compilador. • Permiten una mayor interactividad con el código en tiempo de desarrollo. • En algunos lenguajes (Smalltalk, Prolog, LISP, Java) está permitido y es frecuente añadir código según se ejecuta otro código, y esta característica solamente es posible implementarla en un intérprete.

Page 9: Definicion Programacion De Sistemas

Lenguajes EnsambladoresLenguajes CompiladoresCOMPILADORES Un compilador acepta programas escritos en un lenguaje de alto nivel y los traduce a otro lenguaje, generando un programa equivalente independiente, que puede ejecutarse tantas veces como se quiera. Este proceso de traducción se conoce como compilación. • el de los programas de partida (LA) • el de los programas equivalentes traducidos (LB), normalmente el lenguaje de máquina • el lenguaje en que está escrito el propio compilador (LC), que puede ser igual o diferente a LA. Aumenta la portabilidad del compilador si está escrito en el mismo lenguaje, es decir, se puede compilar a sí mismo. Los programas interpretados suelen ser más lentos que los compilados, pero los intérpretes son más flexibles como entornos de programación y depuración. Comparando su actuación con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete informático corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar Partes de un compilador

Normalmente los compiladores están divididos en dos partes: • Front End: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar. • Back End: es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el Front End. Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para la generación de código máquina en varias plataformas distintas. El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker). Tipos de compiladores Esta taxonomía de los tipos de compiladores no es excluyente, por lo que puede haber compiladores que se adscriban a varias categorías:

• Compiladores cruzados: generan código para un sistema distinto del que están funcionando. • Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original. • Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente. • Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina. • Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan.

Page 10: Definicion Programacion De Sistemas

Pauta de creación de un compilador: En las primeras épocas de la informática, el software de los compiladores era considerado como uno de los más complejos existentes. Los primeros compiladores se realizaron programándolos directamente en lenguaje máquina o en ensamblador. Una vez que se dispone de un compilador, se pueden escribir nuevas versiones del compilador (u otros compiladores distintos) en el lenguaje que compila ese compilador. Actualmente existen herramientas que facilitan la tarea de escribir compiladores ó intérpretes informáticos. Estas herramientas permiten generar el esqueleto del analizador sintáctico a partir de una definición formal del lenguaje de partida, especificada normalmente mediante una gramática formal y barata, dejando únicamente al programador del compilador la tarea de programar las acciones semánticas asociadas.

Lenguajes InterpretesINTÉRPRETES. Un intérprete es un traductor que toma un programa fuente, lo traduce y a continuación lo ejecuta. BASIC es un lenguaje interpretado. Se trata de traductores-ejecutores ya que con cada instrucción realizan un proceso triple de lectura-traducción-ejecución. Son relativamente lentos, pero muy buenos para la depuración de programas. Se puede también utilizar una alternativa diferente de los compiladores para traducir lenguajes de alto nivel. En vez de traducir el programa fuente y grabar en forma permanente el código objeto que se produce durante la corrida de compilación para utilizarlo en una corrida de producción futura, el programador sólo carga el programa fuente en la computadora junto con los datos que se van a procesar. A continuación, un programa intérprete, almacenado en el sistema operativo del disco, o incluido de manera permanente dentro de la máquina, convierte cada proposición del programa fuente en lenguaje de máquina conforme vaya siendo necesario durante el proceso de los datos. No se graba el código objeto para utilizarlo posteriormente. La siguiente vez que se utilice una instrucción, se le debe interpretar otra vez y traducir a lenguaje máquina. Por ejemplo, durante el procesamiento repetitivo de los pasos de un ciclo, cada instrucción del ciclo tendrá que volver a ser interpretado cada vez que se ejecute el ciclo, lo cual hace que el programa sea más lento en tiempo de ejecución (porque se va revisando el código en tiempo de ejecución) pero más rápido en tiempo de diseño (porque no se tiene que estar compilando a cada momento el código completo). El intérprete elimina la necesidad de realizar una corrida de compilación después de cada modificación del programa cuando se quiere agregar funciones o corregir errores; pero es obvio que un programa objeto compilado con antelación deberá ejecutarse con mucha mayor rapidez que uno que se debe interpretar a cada paso durante una corrida de producción.

Lenguajes Generadores De Codigo Para CompiladoresGENERACION DE CÓDIGO

Page 11: Definicion Programacion De Sistemas

Aquí se hablará de las herramientas generadoras automáticas de código para un compilador. Estas herramientas trabajan basadas en un conjunto de reglas; estas reglas definen la traducción de las instrucciones del lenguaje intermedio al lenguaje de máquina. Para a generación de código, se busca en las reglas establecidas la proposición que coincida con la entrada actual; la entrada actual proviene de un árbol. Un ejemplo de esto seria Entonces el compilador recibe una entrada de caracteres, por lo general escrita por el programador; el compilador realiza los análisis: léxico, sintáctico y semántico, para generar seguidamente el código intermedio, el código intermedio se genera con principios de búsqueda de patrones y aplicación de reglas. Después se hace la optimización del código intermedio; seguidamente se realiza la generación de código objeto en lenguaje de máquina. En sintesis para crear un generador de código se deben hacer muchas de las tareas que realizan los compiladores; algunas de estas tareas son: la busqueda de patrones,la escritura de código, el analisis sintactico, el analisis lexico y la optimización de código. Estas tareas las realiza el desarrollador una vez para una arquitectura especifica. METACOMPILADOR: Es Sinónimo De compilador de compiladores y se refiere a un programa que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un compilador y genera como salida el compilador para ese lenguaje. El desarrollo de los metacompiladores se encuentra con la dificultad de unir la generación de código con la parte de análisis. Lo que sí se han desarrollado son generadores de analizadores léxicos y sintácticos. Por ejemplo, los conocidos: • generador de analizadores léxicosLEX. • generador deYACC: analizadores sintácticos desarrollados para UNIX. Los inconvenientes que tienen son que los analizadores que generan no son muy eficientes. Unidad 2

Consideraciones Preliminares Diseño Lenguajes De Programacion2.2 Consideraciones preliminares • 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. EFICIENCIA DE LOS LENGUAJES DE PROGRAMACION Compilación rápida del código fuente y ejecución rápida del código objeto. Los factores fundamentales en la calidad del software son: la eficiencia, la portabilidad, la verificabilidad, la integridad, la facilidad de uso, la exactitud, la robustez, la extensibilidad, la compatibilidad y la reutilización. En términos generales, estos factores pueden describirse de la siguiente forma: La eficiencia: capacidad para el aprovechamiento óptimo de los recursos que emplea. Los lenguajes OOP arrastraron en un principio la reputación de ser ineficaces. Esto se debía en gran medida a que los primeros lenguajes (como Smalltalk) eran

Page 12: Definicion Programacion De Sistemas

interpretados y no compilados. La existencia de compiladores permite a los desarrolladores ganar rapidez. Actualmente, usando un buen lenguaje orientado a objetos como C++, Java, etc. Junto con las librerías apropiadas para la realización de un programa, puede que se ejecute más rápidamente que el mismo programa compilado con un lenguaje procedural La portabilidad: facilidad para ser ejecutados en distintos entornos lógicos o físicos . La verificabilidad: capacidad para soportar procedimientos de pruebas, test o ensayos. La integridad: nivel de protección frente a procesos que traten de alterarlo. La facilidad de uso: comodidad y claridad en la interacción con el usuario. La exactitud: nivel de precisión que alcanzan los resultados obtenidos. La robustez: capacidad para funcionar correctamente en situaciones extremas. La extensibilidad: capacidad para adaptar su funcionamiento al incremento en sus objetivos. La compatibilidad: facilidad de poder ser aplicados en conjunción con otros programas. La reutilización: posibilidad de utilizarlos (total o parcialmente) en nuevos contextos. INDEPENDENCIA DE LA MÁQUINA Independencia de la máquina: Puesto que diferentes usuarios utilizan diferentes ordenadores, el sistema debe ser accesible por todos ellos sin merma de prestaciones, especialmente por las plataformas mayoritarias: Windows, MacOS ? y Unix. Los programas Windows son independientes de la máquina en la que se ejecutan (o al menos deberían serlo), el acceso a los dispositivos físicos se hace a través de interfaces, y nunca se accede directamente a ellos. Esta es una de las principales ventajas para el programador, ya que no hay que preocuparse por el modelo de tarjeta gráfica o de impresora, la aplicación funcionará con todas, y será el sistema operativo el que se encargue de que así sea. A la hora de explotar un gran número de bases de datos de diferentes editores nos encontramos ante un doble problema. Por una parte, la citada falta de homogeneidad de los sistemas informáticos de los usuarios; por otra parte, cada una de las bases de datos suele tener su propio programa de consulta, de modo que nos encontramos multitud de programas diferentes que deberán conocer los usuarios. Dichos programas están en su mayor parte diseñados para ordenadores tipo PC con sistema operativo Windows. Teniendo en cuenta todo lo anterior, podemos ver que el sistema ha de permitir acceder a multitud de máquinas diferentes a una serie de programas en muchos casos incompatibles con ellas. Los servidores de aplicaciones son la base de programas informáticos diseñados para ser ejecutados desde ordenadores personales a través de Navegadores de Internet convencionales. Con ello se consigue independencia de la máquina (los programas funcionan en cualquier ordenador), independencia de ubicación (es posible utilizar los programas desde cualquier lugar) y una administración ligera y centralizada (mantenimiento cero de los programas de los ordenadores de los usuarios al residir éstos en el servidor). SIMPLICIDAD Un lenguaje debe ser tan simple como sea posible. Debe haber un número mínimo de conceptos con reglas simples para su combinación. Un lenguaje de programación debe

Page 13: Definicion Programacion De Sistemas

esforzarse en la simplicidad sintáctica y semántica. Simplicidad en la semántica implica que el lenguaje contiene un mínimo número de conceptos y estructuras. Estos conceptos deben ser naturales, rápidamente aprendidos, y fácilmente entendidos. with little danger of misinterpretation. La simplicidad requiere que un idioma incorpore tan pocos conceptos como sean posibles. El lenguaje debe ser una ayuda para el programador antes de que alcance el estado real de codificación en programación. Debe darle un conjunto de conceptos claro, simple y unificado para que pueda usarlos como primarios en el desarrollo de lenguajes. Para ello es deseable tener un número mínimo de conceptos diferentes, con las reglas de su combinación lo más simples y regulares posibles. Esta claridad semántica y de conceptos es el factor determinante del valor de un lenguaje. La simplicidad sintáctica requiere que la sintaxis represente cada concepto en una y una única forma y que ésta interpretación es tan legible como sea posible. Esto no necesariamente implica que la sintaxis es tan concisa como sea posible, desde que la concisión es a menudo contraproducente a la legibilidad. Excluye múltiples representaciones de la misma semántica conceptual y representaciones sintácticas que son fácilmente confusas. UNIFORMIDAD Ya que la representación de los objetos lleva implica tanto el análisis como el diseño y la codificación de los mismos. La estructura lógica de la BD definida mediante el LDD debe ser uniforme y acorde al modelo de datos del SGBD, para facilitar la manipulación de esta estructura. En el caso específico del LDD, el lenguaje del SGBD debe ser capaz de definir la estructura lógica de la BD, sin entrar en detalles de implementación ni mecanismos en que se accede a los datos de la BD. La forma idónea de realizar lo anterior es mediante un lenguaje declarativo, el cual permite declarar la estructura del modelo de acuerdo al modelo de datos que utiliza el SGBD. Para el caso del LMD, el lenguaje del SGBD debe incluir formas de especificar qué se desea hacer con los datos (insertar, recuperar, modificar o borrar datos), sin entrar en detalles acerca de cómo se realizan estas operaciones. Igual que en el caso anterior, la mejor manera de realizar esto es mediante un lenguaje declarativo que permita especificar la estructura de la operación a realizar, de acuerdo siempre con el modelo de datos utilizado por el SGBD. Generalización y especialización – – La generalización dice que algo similar también es correcto, pero es difícil de implementar. – – Hay que especializar para facilitar la implementación sin perder la utilidad del lenguaje. Resumen: Para el diseño de lenguajes de Programación se debe considerar varios aspectos, entre ellos las tareas que se desean realizar y los datos a manejar. Generalmente diseñamos un lenguaje porque necesitamos comunicarnos con algo de manera fácil y rápida, por ejemplo un archivo, un hardware, una base de dato; ependiendo de la tarea que se quiera realizar entonces diseñamos. Una forma de como hacerla y como podemos relacionarlo con otras tareas para permitir que esa relación pueda ser automatizada. Además de las tareas que se van a

Page 14: Definicion Programacion De Sistemas

realizar tambien se debe pensar en los tipos de datos que se van a manejar, por ejemplo números, cadenas, ya que si se van a realizar operaciones, hay que pensar en que espacio de memoria se van a almacenar. Otras cosas a considerar son como se va a manejar la memoria, y a que tipo de computadoras estarán enfocados.

Objetivos Filosofias Diseño Lenguajes De ProgramacionEl principal objetivo del lenguaje es, por supuesto, servir de apoyo didáctico en una materia de lenguajes de programación, intérpretes y compiladores. Derivado de la persecución de este objetivo surgen varias metas específicas y objetivos particulares: • La apreciación del desarrollo e implementación de un lenguaje de programación. • La comprensión del procedimiento seguido en la formación de un conjunto de reglas gramaticales que permiten identificar y nombrar sin ambigüedad acciones y secuencias ordenadas de acciones sobre el contexto específico de un problema en particular. • Proporcionar un medio de familiarización con la realización de operaciones aritméticas usando una pila y su posterior extensión para la manipulación de otros datos. • La clara especificación y adecuada documentación del proceso de creación o extensión de un lenguaje y sus resultados. En el diseño de Stop se ha tratado de seguir muchos de los principios usados en los modernos lenguajes de programación hasta el punto donde su implementación no sea demasiado complicada para el desarrollo de un proyecto semestral. Principalmente se ha buscado que sea regular, modular y estructurado. FILOSOFÍA DE DISEÑO DEL LENGUAJE El lenguaje de programación esta pensado para la programación evolutiva. Esta consiste en un método de programación basado en un ciclo de prueba y error donde se refina un programa hasta conseguir que haga lo que queremos. Esta forma de programar se aplica a problemas donde se desconoce que algoritmo nos llevará a la solución. Esta situación se da en investigación y en la creación de prototipos donde hay que realizar muchas pruebas hasta dar con la solución más apropiada. Para estos casos, es más apropiado el uso de un interprete que un compilador, ya que de esta forma se reduce el tiempo invertido en cada prueba. Para que un lenguaje sea efectivo en programación evolutiva tiene que facilitar: la interacción, la modificación del programa y aportar instrucciones de alto nivel cercanas al problema. Estos tres punto se consiguen cuando el lenguaje tiene las siguientes características: Estado de Interacción. Entre prueba y prueba es interesante guardar el estado de ejecución. De esta forma se evita repetir la ejecución de las instrucciones necesarias para llegar al estado de ejecución donde queremos realizar pruebas. Los programas implementa esta característica mediante un ámbito global dinámico que guarda funciones y variables mientras se utiliza el intérprete. Sintaxis Cercana al Problema. Es más efectivo escribir en una notación cercana al problema que adaptarse a la sintaxis de un lenguaje de programación. De esta forma

Page 15: Definicion Programacion De Sistemas

se evita el paso de traducción que tiene que realizar el programador antes de escribir una nueva sentencia del programa. DISEÑO DEL LENGUAJE Hasta el momento, lo que se ha visto ha sido una serie de operaciones aritméticas y de manipulación de la pila. Todas éstas indicadas de manera implícita a través de una serie de términos y convenciones que es necesario definir de forma más precisa antes de continuar con otra cosa. Existen dos formas en las que puede representarse una pila y su funcionamiento; de ésta dependerá la terminología que se emplee. Nosotros hemos venido usando una representación que conceptualiza a la pila como un arreglo que “crece” o es utilizado desde su base (el primer nivel) hacia arriba. Los datos entran y se toman de la base y desplazan o “empujan” a los elementos, que ya pudieran estar introducidos en la pila, hacia arriba. Identificaremos a los diversos elementos involucrados acorde al siguiente diagrama: Ingreso Llamaremos nivel a cada una de las localidades con que cuente la pila y los enumeraremos a partir de 1. La base es el primer nivel. El tope de la pila lo identificaremos como el nivel en el que se encuentre el elemento con ingreso más antiguo. Representaremos con una elipsis (…) el resto de las localidades o elementos en la pila. Por último, mientras que nos hemos limitado a usar números en la representación de elementos que pueden ser introducidos en la pila, no estamos restringidos a esto. Dependiendo de su implementación una pila puede albergar más que números. De forma genérica nos referiremos a estos elementos como objetos. Los diagramas que se han usado para ilustrar el contenido de la pila antes y después de la aplicación de una instrucción (que aparece como una operación, función, operador o nombre en el código del programa) serán identificados como diagramas de pila. En estos diagramas la elipsis se incluirá sólo cuando sea necesario recalcar la existencia del resto de la pila o su contenido; mientras no se indique lo contrario, siempre debe considerarse a la pila de Stop como infinita y factible de tener un contenido. Adicionalmente, en la presente descripción: Las palabras clave de Stop se escriben en mayúsculas, aunque el lenguaje no es sensible a altas o bajas (lo que en otros ambientes es lo que se denomina case insensitive). Palabras clave de Stop se escriben usando un font no proporcional. • • Elementos a substituir por otro valor se ilustran en itálicas. • • Conceptos y acciones a resaltar se subrayan. • • En las descripciones sintácticas, elementos repetitivos se denotan por el seguimiento de una elipsis. • • Salidas en pantalla se muestran en negritas. COMUNICACIÓN HUMANA Las teorías de la comunicación representan un punto de partida indispensable no sólo para el estudio y la investigación de la comunicación, sino para el quehacer profesional práctico. El curso discute las aportaciones conceptuales de las perspectivas teóricas más recientes para el análisis de la comunicación masiva contemporánea. Comunicación interpersonal e intercultural, así como las habilidades interactivas necesarias para gerentes.

Page 16: Definicion Programacion De Sistemas

Análisis de las capacidades de transmisión de información de fibras ópticas, tomando en cuenta los sistemas transmisores, los sistemas receptores y los requerimientos de acoplamiento óptico. Comportamiento de ondas electromagnéticas en el interior de las fibras ópticas. Receptores óptimos, transmisión coherente, amplificación óptica, multicanalización por división de longitud de onda, redes ópticas, SONET, ATM. La computadora, a diferencia de otras herramientas que en general apoyan el esfuerzo físico de los humanos, fue inventada para facilitar el trabajo intelectual. Si el hombre tiene algún problema, por ejemplo “sumar dos y dos”, el diseñador define el algoritmo que resuelve el problema, el programador lo codifica en un lenguaje de programación, el cual la computadora es capaz de “entender”, luego la computadora ejecuta el algorítmo expresado como programa en el lenguaje de programación en cuestión, y listo. La máquina le entrega al hombre la respuesta “4″, sin que éste tuviera que esforzar sus neuronas. • Se busca una comunicación eficiente entre el programador y el ordenador. • Un buen nivel de comunicación se da cuando los programas son leíbles.No ha de ser necesaria una documentación externa al programa (minimizar). Es más importante que un programa sea leíble que escribible. Un programa se escribe una vez, pero se lee muchas durante su depuración, documentación y mantenimiento. Tendencia actual a separar la interfaz de la implementación de un módulo. • La sintaxis ha de reflejar la semántica. Reducir las manipulaciones implícitas. Coerciones (coerciones de PL/I o C). ON de BASIC para eventos o excepciones. Constructores y destructores de C++ (necesarios, pero complican el seguimiento del flujo de ejecución). • El lenguaje ha de representar los patrones de pensamiento humanos. No hay que crear una sintaxis pensada exclusivamente para un modelo de cómputo teórico (l-calculus). un conjunto de instrucciones de la máquina facilitar la compilación (forth). • El programador no es un ordenador. Que el compilador entienda una estructura es posible que el programador no. Evitar incluso la posibilidad de escribirlas Reducir el conocimiento contextual. El programador no funciona con una pila como el programa compilado. PREVENCIÓN Y DETECCION DE ERRORES Tener una serie de defensas tal que si un error no es detectado por uno, este probablemente sea detectado por otro. Los errores deben ser detectados por el compilador, si un mecanismo no es capaz de detectar un error es necesario implementar otro que lo detecte, pero nunca ignorarlo. A continuación se presentan prevencion y tolerancia de errores y fallos Prevencion de errores • El programador comete errores. Hay que prevenir los errores • El programador es su fuente. El programador no sabe lo que hace y el compilador ha de limitar sus acciones (EUCLID, PASCAL). Hacer imposible cierto tipo de errores. Ejecutar datos → control de flujo limitado

Page 17: Definicion Programacion De Sistemas

Errores en el uso de datos → Tipado fuerte Apuntadores erróneos → Gestión de memoria implícita (LISP, PROLOG, ML, etc). Hay que facilitar su detección, identificación y corrección. Tener que declarar antes de utilizar. Evitar coerciones inductoras de errores. • float a int por su perdida de precisión. • Comprobaciones en tiempo de ejecución. Índice de array fuera de limites. Control sobre los apuntadores a NULL. Prevención y tolerancia de fallos • Hay dos formas de aumentar la fiabilidad de un sistema: Prevención de fallos: Se trata de evitar que se introduzcan fallos en el sistema antes de que entre en funcionamiento Prevención de fallos Se realiza en dos etapas: • Evitación de fallos – – Se trata de impedir que se introduzcan fallos durante la construcción del sistema • Eliminación de fallos – – Consiste en encontrar y eliminar los fallos que se producen en el sistema una vez construido Tolerancia de fallos: Se trata de conseguir que el sistema continúe funcionando aunque produzcan fallos En ambos casos el objetivo es desarrollar sistemas con modos de fallo bien definidos. Detección de errores • Por el entorno de ejecución hardware (p.ej.. instrucción ilegal)

ºnúcleo o sistema operativo (p.ej. puntero nulo) • Por el software de aplicación Duplicación (redundancia con dos versiones) Comprobaciones de tiempo Inversión de funciones Códigos detectores de error Validación de estado Validación estructural

Diseño Detallado Lenguajes De ProgramacionEl 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.

Page 18: Definicion Programacion De Sistemas

La instrumentación comunica los aspectos de la sintaxis del lenguaje de programación, el estilo de codificación la documentación interna, y la inserción de pruebas y depuraciones al código. Las dificultades que se encuentran durante la instrumentación casi siempre se deben al hecho de que el instrumentador simultáneamente está realizando análisis, diseño y actividades de codificación mientras intenta expresar el resultado final en un lenguaje de instrumentación. El diseño detallado permite el diseño de algoritmos y representaciones de datos en un nivel más alto de abstracción y notación que el que proporciona el lenguaje de instrumentación . El diseño detallado separa la actividad de diseño a bajo nivel de la instrumentación, igual que las actividades de análisis y diseño aislan las consideraciones de lo que se desea de la estructura que logrará los resultados deseados. Una especificación adecuada de diseño detallado minimiza el número de sorpresas durante la instrumentación del producto.

Caso De Estudio2.5 Caso de estudio 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 partner-pub-8555 ISO-8859-1