jueves, 25 de febrero de 2010

lunes, 22 de febrero de 2010

Unidad 2 Introducción al diseño de los lenguajes de programació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 capas de capturar la semántica del programa que implementa la especificación de requisitos.

En los últimos años, una de las artes mas predominantes en el mundo de la programación ha sido el diseño de lenguaje de programación. El numero de lenguajes de programación propuesta y diseñados son extremadamente grandes. Aun el numero de de lenguajes para el que un compilador ha aplicado es inmenso. Sammet (1976) indica 167 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.

http://www.mitecnologico.com/Main/VisionProblemaDise%F1oLenguajesDeProgramacion


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.

¿Cual es el proposito del lenguaje?
-No hay un lenguaje bueno para todo
-Aplicacion especifica
*Bases de datos, sistemas expertos, calculo numero, programacion simbolica, diseño de algortimico, 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 implementacion de un nuevo lenguaje
*Es demasiado facil diseñar un lenguaje incompleto
*Lenguaje demasiado especializado
*Sacrificar caracteristicas del lenguaje por un compilador simple

-Otras opciones
*Un modulo o libreria de funciones
*Ampliar un lenguaje de programacion


http://convena.upb.edu.co/aospina/docs/compil_cap2.pdf



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


http://antares.itmorelia.edu.mx/~jcolivar/courses/ps207a/ps2_u2.pdf


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.

http://www.mitecnologico.com/Main/Dise%F1oDetalladoLenguajesDeProgramacion


2.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

domingo, 21 de febrero de 2010

Unidad 1 Introduccion a la Programación de Sistemas

1.1 ¿QUÉ ES Y QUE ESTUDIA LA PROGRAMACIÓN DE SISTEMAS?

Son los programas que residen en un sistema de computación. Su función es proporcionar al usuario o programador una interface mas eficiente y practica con relación al hardware de la maquina.
La P. de S. estudia como están implementados cada uno de los programas de un Sistema.

PROGRAMACIÓN DE SISTEMAS: Conjunto de reglas para crear soluciones a problemas computables. Conjunto de herramientas que nos pe
rmiten crear software de base que son de utilidad para interactuar con la máquina.

SOFTWARE DE BASE: Compilador, Querys, Sistema Operativo, Cargador.

AUTÓMATA: Son las cadenas posibles que aceptan un lenguaje.

EXPRESIONES REGULARE
S: Conjunto de símbolos que aceptan una palabra reservada.

GRAMÁTICA: Reglas para escribir las sentencias del lenguaje.

http://www.mitecnologico.com/Main/DefinicionProgramacionDeSistemas

www.pelogo.org/data/files/CURSOProgSist.ppt





1.2 ¿HERRAMIENTAS DE
SARROLLADAS CON LA TEORÍA DE LA PROGRAMACIÓN DE SISTEMAS?

Ejemplos:
l Compiladores (javac)
l Traductores.
l Ensambladores (Masm)
l Interpretes (Visual Basic)
l Ligadores (Link)

l Cargadores
l Sistema Operativo (Windows)
l Utilerías de Sistemas (Debugger)
l DBMS.
l Generadores de código.

www.pelogo.org/data/files/CURSOProgSist.ppt

1.3 LENGUAJES

l Naturales (Traductores de Ingles-Español, Ingles-Ruso, etc)
l Artificiales (Compiladores de LP como Java, C++, Ada, etc.)

LENGUAJE DE PROGRAMACIÓN:

Es la notación formal para la descripción de algoritmos, basada en un conjunto de instrucciones en alto nivel, que finalmente pasarán a bajo nivel para interactuar con el hardware y generar herramientas de trabajo.
Los lenguajes son sistemas de comunicación. Un lenguaje de programación consiste en todos los símbolos, caracteres y reglas
de uso que permiten a las personas "comunicarse" con las computadoras.

http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n







EJEMPLO DE SÍMBOLOS QUE COMPONEN UN PROGRAMA:


No obstante, aunque todos los lenguajes de programación tienen un conjunto de instrucciones que permiten realizar dichas operaciones, existe una marcada diferencia en los símbolos, caracteres y sintaxis de los lenguajes de máquina, lenguajes ensambladores y lenguajes de alto nivel.

http://www.eduteka.org/modulos.php?catx=4&idSubX=117

1.3.1 LENGUAJES NATURALES

Este 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.
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.

http://es.wikipedia.org/wiki/Lenguaje_natural

1.3.2 LENGUAJES ARTIFICIALES

LENGUAJES DE INTELIGENCIA ARTIFICIAL

Podemos distinguir tres grandes estilos o subfamilias de los lenguajes de inteligencia artificial. Los tres estilos de programación son los siguientes: programación funcional, programación relacional y programación por objetos. El lenguaje más representativo del estilo funcional es el LISP, LOGO por su identificación con LSIP, cae de lleno dentro de este estilo. El lenguaje más representativo del estilo relacional PROLOG. El lenguaje más representativo del estilo de programación por objetos es el SMALLTALK, pero existen varios dialectos de LISP que permite programar en esta forma.
http://es.wikipedia.org/wiki/Inteligencia_artificial

http://www.monografias.com/trabajos16/inteligencia-artificial/inteligencia-artificial.shtml








1.3.3 PROCESO DE COMUNICACIÓN





http://relacionesypubli.lacoctelera.net/post/2007/03/22/el-proceso-comunicacion-y-tipos-comunicacion
http://www.monografias.com/trabajos11/compil/compil.shtml

1.4 TRADUCTOR Y SU ESTRUCTURA

Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente hasta un texto o programa equivalente escrito en un lenguaje destino produciendo, si cabe, mensajes de error. Los traductores engloban tanto a los compiladores (en los que el lenguaje destino suele ser código máquina) como a los intérpretes (en los que el lenguaje destino está constituido por las acciones atómicas que puede ejecutar el intérprete).









Es importante destacar la velocidad con la que hoy en día se puede construir un compilador. En la década de 1950, se consideró a los traductores como programas notablemente difíciles de escribir. El primer compilador de Fortran (Formula Translator), por ejemplo, necesitó para su implementación el equivalente a 18 años de trabajo individual (realmente no se tardó tanto puesto que el trabajo se desarrolló en equipo).

Estructura:
Un traductor divide su labor en dos etapas: una que analiza la entrada y genera estructuras intermedias y otra que sintetiza la salida a partir de dichas estructuras. Por tanto, el esquema de un traductor pasa de ser el de la anterior, a ser el de la siguiente figura:

Básicamente los objetivos de la etapa de análisis son: a) controlar la corrección del programa fuente, y b) generar las estructuras necesarias para comenzar la etapa de síntesis.
Para llevar esto a cabo, la etapa de análisis consta de las siguientes fases:
Análisis lexicográfico. Divide el programa fuente en los componentes básicos del lenguaje a compilar.
Análisis sintáctico. Comprueba que la estructura de los componentes básicos sea correcta según las reglas gramaticales del lenguaje que se compila.
Análisis semántico. Comprueba que el programa fuente respeta las directrices del lenguaje que se compila (todo lo relacionado con el significado): chequeo de tipos, rangos de valores, existencia de variables, etc.
Generación de código intermedio. Genera un código independiente de la máquina muy parecido al ensamblador. No se genera código máquina directamente porque así es más fácil hacer pseudocompiladores y además se facilita la optimización de código independientemente del microprocesador.
Generación del código máquina. Crea un bloque de código máquina ejecutable, así como los bloques necesarios destinados a contener los datos.
Fase de optimización. La optimización puede realizarse sobre el código intermedio (de forma independiente de las características concretas del microprocesador), sobre el código máquina, o sobre ambos. Y puede ser una aislada de las dos anteriores, o estar integrada con ellas.

http://www.monografias.com/trabajos26/lenguajes-programacion/lenguajes-programacion.shtml

1.4.1 ENSAMBLADORES

¿Que es ensamblador y para que sirve?

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.



http://es.wikipedia.org/wiki/Ensamblador
http://www.mitecnologico.com/Main/TiposLenguajesEnsambladores

Motivos para utilizarlo:

Rapidez
Mayor control de la computadora
Independencia del lenguaje
La mayoría de las computadoras pueden ensamblarlo
Motivo para no utilizarlo:

Dependencia de hardware
Mayor tiempo de codificación
Comprensión más profunda de la computadora
Errores más frecuentes en el programa

Tipos de Ensambladores
Aunque todos los ensambladores realizan básicamente las mismas tareas, podemos clasificarlos de acuerdo a características.

Ensambladores Cruzados (Cross-Assembler).
Se denominan así los ensambladores que se utilizan en una computadora que posee un procesador diferente al que tendrán las computadoras donde va a ejecutarse el programa objeto producido.
El empleo de este tipo de traductores permite aprovechar el soporte de medios físicos (discos, impresoras, pantallas, etc.), y de programación que ofrecen las máquinas potentes para desarrollar programas que luego los van a ejecutar sistemas muy especializados en determinados tipos de tareas.
http://html.rincondelvago.com/cargadores.html

Ensambladores Residentes.
Son aquellos que permanecen en la memoria principal de la computadora y cargan, para su ejecución, al programa objeto producido. Este tipo de ensamblador tiene la ventaja de que se puede comprobar inmediatamente el programa sin necesidad de transportarlo de un lugar a otro, como se hacía en cross-assembler, y sin necesidad de programas simuladores.
http://148.202.148.5/cursos/cc206/programaciondesistemas_2_1.htm

Macroensambladores.
Son ensambladores que permiten el uso de macroinstrucciones (macros). Debido a su potencia, normalmente son programas robustos que no permanecen en memoria una vez generado el programa objeto.
http://es.wikipedia.org/wiki/Macro_ensamblador

Microensambladores.
Generalmente, los procesadores utilizados en las computadoras tienen un repertorio fijo de instrucciones, es decir, que el intérprete de las mismas interpretaba de igual forma un determinado código de operación.
http://atc.ugr.es/pedro/docencia/ec1/practica4/00_tutorial_pract_amd.pdf

Ensambladores de una fase.
Estos ensambladores leen una línea del programa fuente y la traducen directamente para producir una instrucción en lenguaje máquina o la ejecuta si se trata de una pseudoinstrucción. También va construyendo la tabla de símbolos a medida que van apareciendo las definiciones de variables, etiquetas, etc.
http://148.202.148.5/cursos/cc206/programaciondesistemas_2_1.htm

Ensambladores de dos fases.
Los ensambladores de dos fases se denominan así debido a que realizan la traducción en dos etapas. En la primera fase, leen el programa fuente y construyen una tabla de símbolos; de esta manera, en la segunda fase, vuelven a leer el programa fuente y pueden ir traduciendo totalmente, puesto que conocen la totalidad de los símbolos utilizados y las posiciones que se les ha asignado.
http://148.202.148.5/cursos/cc206/programaciondesistemas_2_5.htm

1.4.2 COMPILADORES

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).
http://www.monografias.com/trabajos11/compil/compil.shtml


Estructura de un Compilador:
La estructura de un compilador, esta dividida en cuatro grandes módulos, cada uno independiente del otro, se podría decir que un compilador esta formado por cuatros módulos mas 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 modulo 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 modulo es el llamado modulo de ensamblado, este modulo no es ni más mi 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 ultimo modulo es el encargado de realizar el enlazado del código de fuente de entrada (código maquina relocalizable) 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 relocalizables y ubica los datos en las posiciones apropiadas de la memoria.

http://es.wikipedia.org/wiki/Compilador

Tipos de Compiladores:
Una sola pasada: Examina el código fuente una vez, generando el código o programa objeto.
Pasadas múltiples: Requieren pasos intermedios para producir un código en otro lenguaje, y una pasada final para producir y optimizar el código producido durante los pasos anteriores.
Optimación: Lee un código fuente, lo analiza y descubre errores potenciales sin ejecutar el programa.
Compiladores incrementales: generan un código objeto instrucción por instrucción (en vez de hacerlo para todo el programa) cuando el usuario teclea cada orden individual. El otro tipo de compiladores requiere que todos los enunciados o instrucciones se compilen conjuntamente.
Ensamblador: El lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla.
Compilador cruzado: se genera código en lenguaje objeto para una máquina diferente de la que se está utilizando para compilar. Es perfectamente normal construir un compilador de Pascal que genere código para MS-DOS y que el compilador funcione en Linux y se haya escrito en C++.
Compilador con montador: compilador que compila distintos módulos de forma independiente y después es capaz de enlazarlos.
Autocompilador: Compilador que está escrito en el mismo lenguaje que va a compilar. Evidentemente, no se puede ejecutar la primera vez. Sirve para hacer ampliaciones al lenguaje, mejorar el código generado, etc.
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.
Descompilador: Es un programa que acepta como entrada código máquina y lo traduce a un lenguaje de alto nivel, realizando el proceso inverso a la compilación.
http://users.dsic.upv.es/~jsilva/uned/compiladores/Apuntes01.pdf

1.4.3 INTERPRETES

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.
http://es.wikipedia.org/wiki/Int%C3%A9rprete_(inform%C3%A1tica)

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.
Esquema de traducción/ejecución de un programa interpretado

http://www.di.uniovi.es/~labra/FTP/Interpretes.pdf

1.5 GENERADORES DE CÓDIGO PARA COMPILADORES (COMPILADOR DE COMPILADORES, HERRAMIENTAS)

Estructura del proceso de Compilación:
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.
Estructura del proceso de Compilación:
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 mas fácilmente sobre él.
En la etapa de optimización de código, se busca obtener el código mas 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 relocalizable 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 de los mismos etc.