Vous êtes sur la page 1sur 22

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic.

en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

Tema 1: Primera Parte - Lenguajes Procedurales

1. INTRODUCCION ........................................................................................................... 2 2. LENGUAJE DE PROGRAMACIN............................................................................. 2 2.1 CONCEPTO DE COMPUTACIN DESDE EL PUNTO DE VISTA FORMAL...... 2 2.2 CONCEPTO DE COMPUTACIN DESDE EL PUNTO DE VISTA MAS AMPLIO .............................................................................................................................................. 3 2.2.1 ALGUNAS CUESTIONES DE DISEO................................................................... 3 3. DISTINTOS TIPOS DE COMPUTADORA .................................................................. 4 3.1 COMPUTADORA DE HARDWARE .......................................................................... 4 3.1.1 ESTADOS DE COMPUTADORAS........................................................................... 6 3.2 COMPUTADORAS DE FIRMWARE ......................................................................... 6 3.3 TRADUCTORES Y COMPUTADORAS SIMULADAS POR SOFTWARE............. 6 3.3.1 TRADUCCIN........................................................................................................... 7 3.3.2 SIMULACIN DE SOFTWARE (INTERPRETACIN)........................................ 9 4. MODELOS DE COMPUTACIN ................................................................................10 5. LENGUAJES IMPERATIVOS .....................................................................................12 5.1 DEFINICIN DE UN LENGUAJE DE PROGRAMACIN ....................................12 5.2 IMPLEMENTACIN DE LENGUAJES....................................................................13 5.3 PRINCIPIOS Y CRITERIOS DE DISEO DE LENGUAJES DE PROGRAMACIN............................................................................................................13 6. EL LENGUAJE C ..........................................................................................................16 6.1 BREVE HISTORIA......................................................................................................16

Programacin Procedural 2012

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

6.2 ETAPAS EN LA OBTENCIN DE PROGRAMA EJECUTABLE ..........................16 7. LECTURAS ADICIONALES ........................................................................................18 RESEA HISTORICA DE LOS LENGUAJES PROCEDURALES ..............................18 8. BIBLIOGRAFIA: ...........................................................................................................22

1. INTRODUCCION
Para 1969 ya se haban contabilizado ms de 120 lenguajes de programacin, hoy en da hay quienes afirman que la lista supera los 2000. Si bien un programador profesional usa efectivamente no ms de tres lenguajes, en funcin de las posibilidades y las tendencias de la empresa o medio en que est inserto, es importante que se explore ms profundamente en el diseo de los lenguajes y en su efecto sobre la implementacin, por muchas razones, entre ellas: Mejorar la habilidad en el desarrollo de algoritmos eficaces Mejorar el uso de lenguaje de programacin que el profesional utiliza Hacer posible una mejor eleccin del lenguaje de programacin, cuando del profesional dependa Facilitar el estudio de nuevos lenguajes Permitir el diseo de nuevos lenguajes

2. Lenguaje de Programacin
Para que exista comunicacin, debe existir una comprensin mutua de cierto conjunto de smbolos y reglas del lenguaje. En un lenguaje natural, el significado de los smbolos se establece por la costumbre y se aprende mediante la experiencia. Los lenguajes de programacin tienen como objetivo la construccin de programas, normalmente escritos por personas. Estos programas se ejecutarn sobre una computadora que realizar las tareas descritas. La utilizacin de un lenguaje de programacin requiere, por tanto, una comprensin mutua por parte de personas y mquinas. Un lenguaje de programacin es un sistema notacional para describir computaciones en una forma legible tanto para la mquina como para el ser humano.

2.1 Concepto de Computacin desde el punto de vista formal


En general se define una computacin utilizando el concepto matemtico de una Mquina de Turing. Una Mquina de Turing es un tipo de computadora cuya operacin es lo suficientemente simple como para describirse con gran precisin. Adems, se sabe que una Mquina de Turing es capaz de llevar a cualquier clculo que las computadoras actuales pueden hacer(aunque no de manera tan eficiente). Es de aceptacin general que no es posible construir una mquina que sea inherentemente ms poderosa que una Mquina de Turing.

Programacin Procedural 2012

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

2.2 Concepto de Computacin desde el punto de vista mas amplio


Analicemos ahora qu es una computacin desde un punto desde vista ms amplio, que incluya la definicin, diseo e implementacin de lenguajes de programacin. Computacin: Cualquier proceso que puede ser realizado por una computadora. No solo clculos matemticos sino tambin manipulacin de datos, procesamiento de textos, almacenamiento y recuperacin de la informacin. En general, los lenguajes de programacin pueden ser de propsitos generales o de propsitos especficos.

2.2.1 Algunas cuestiones de Diseo


En el diseo de lenguajes la meta es lograr la potencia, expresividad y comprensin que requiere la legibilidad del ser humano, mientras se conservan la precisin y simplicidad necesarias para la traduccin de mquina. La legibilidad del ser humano es un requisito complejo y sutil. Depende en gran parte de las posibilidades de abstraccin que tiene un lenguaje de programacin. La abstraccin permite concentrarse en un problema al mismo nivel de generalizacin, dejando de lado los detalles irrelevantes. La abstraccin permite trabajar con conceptos y trminos familiares al entorno del problema, sin tener que transformarlos a una estructura no familiar1. Abstracciones procedimentales Es una secuencia nombrada de instrucciones que tienen una funcin especfica y limitada. (ejemplo: uso de funciones en lenguaje C). Abstracciones de datos Tcnica de inventar nuevos tipos de datos que sean ms adecuados a una aplicacin y, por consiguiente, facilitar la escritura del programa. (Ejemplo: uso de struct en lenguaje C). Abstracciones de control Resume propiedades de la transferencia de control, es decir, la modificacin de la trayectoria de ejecucin de un programa en una determinada situacin. (ejemplo: for, if, while, etc son ejemplo de abstracciones de control en lenguaje C) El principal objetivo de la abstraccin en el diseo de lenguajes de programacin es el control de la complejidad. Para comprender y construir sistemas complejos, los seres humanos deben controlar cunto detalle necesita ser comprendido en cualquier momento. Se controla la complejidad elaborando abstracciones que esconden los detalles cuando es apropiado. En general todos los mecanismos de abstraccin se disean para que los seres humanos puedan entenderlos.

Lenguajes de programacin. Louden k. Pg 26

Programacin Procedural 2012

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

Si un lenguaje de programacin necesita describir slo computaciones (clculos), entonces solamente necesita suficientes mecanismos para llevar a cabo una Mquina de Turing (esta mquina puede ejecutar cualquier clculo conocido en una computadora). Un lenguaje de este tipo se conoce como completo de Turing2. Un lenguaje es completo de Turing siempre que tenga variables enteras y aritmticas, y que ejecute enunciados en forma secuencial, incluyendo enunciados de asignacin, seleccin y ciclo.

3. Distintos tipos de Computadora


En el desarrollo de un lenguaje de Programacin, hay tres tems que afectan su diseo: 1. La computadora subyacente donde se va a ejecutar el programa escrito en un determinado lenguaje 2. El modelo de ejecucin que apoya a ese lenguaje en el equipo real. 3. El modelo de computacin que el lenguaje implementa Una computadora es un conjunto integrado de algoritmos y estructuras de datos capaz de almacenar y ejecutar programas. Se puede construir una computadora como un dispositivo fsico real utilizando circuitos integrados, tarjetas, etc. En ese caso se le conoce como computadora real o computadora de hardware. Sin embargo, tambin se puede construir a travs de software por medio de programas que se ejecuten en otra computadora, y en este caso se trata de una computadora simulada por software

3.1 Computadora de hardware


Si bien una computadora de hardware puede presentar una variada forma de organizacin, una organizacin tpica incluye los seis componentes que a ms adelante se detallan. Estos componentes estn relacionados con los aspectos principales de los lenguajes de programacin: Una computadora consiste en seis componentes fundamentales que corresponden estrechamente a los aspectos principales de un lenguaje de programacin: Datos, Operaciones, Control de secuencia, Acceso a datos, Gestin de Almacenamiento, Entorno de operacin. Datos Elementos de informacin integrados, que se pueden manipular directamente con operaciones primitivas de hardware. Por ejemplo los enteros, reales o cadenas de caracteres de longitud fija. Entre los principales medios de almacenamiento de datos se encuentra: La memoria principal organizada por lo general como una secuencia lineal de bits subdividida en palabras de longitud fija. Los registros internos de alta velocidad, compuestos de

Lenguajes de programacin. Louden k. Pg 12

Programacin Procedural 2012

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

secuencias de bits con subcampos especiales que son directamente accesibles. La memoria cach y los archivos externos. Operaciones Una computadora debe contener un conjunto de operaciones primitivas interconstruidas, ordinariamente apareadas una a una con los cdigos de operacin que pueden aparecer en las instrucciones de lenguaje mquina. Un conjunto tpico incluira primitivas para aritmtica sobre cada tipo numrico de datos (suma, resta, etc.), primitivas para probar propiedades de un conjunto de datos (cero, positivo, negativo), primitivas para controlar dispositivos. Control de Secuencia Una computadora debe aportar mecanismos para controlar el orden en el que se van a ejecutar las operaciones primitivas. La instruccin siguiente que se debe ejecutar en cualquier punto durante la ejecucin de un programa en lenguaje mquina est determinada por lo comn por el contenido de un registro de direcciones de programa, el cual contiene la direccin de memoria de la prxima instruccin. Acceso a datos Una computadora debe incorporar algn medio para designar operandos y un mecanismo para recuperar operandos designados. De manera similar, el resultado de una operacin primitiva se debe guardar en alguna localidad designada. Llamamos a estos recursos el control de acceso a datos de la computadora. El esquema convencional consiste en asociar direcciones de enteros con localidades de memoria y suministrar operaciones para recuperar el contenido de una localidad dada. Gestin de almacenamiento Para acelerar el desequilibrio entre acceso a datos externos y el procesador central, el sistema operativo suele utilizar multiprogramacin. Mientras aguarda muchos milisegundos a que se lean los datos, la computadora ejecuta otro programa. A fin de que muchos programas puedan residir conjuntamente en la memoria al mismo tiempo, es comn incluir recursos para paginacin o reubicacin dinmica de programas directamente en el hardware. Existen algoritmos de paginacin que intentan prever cuales direcciones de programas y datos tienen ms probabilidades de ser utilizados en futuro cercano, con el propsito de que el hardware pueda ponerlas a disposicin del procesador central. Para acelerar el desequilibrio entre la memoria principal y el procesador central, se emplea una memoria cach. Una memoria cach es un pequeo almacn de datos de alta velocidad que se encuentra entre la memoria principal y el procesador central, contiene los datos e instrucciones que el procesador central ha usado ms recientemente y, por tanto , incluye los datos e instrucciones que es ms probable que se van a necesitar en el futuro cercano. Entorno de operacin El entorno de operacin de una computadora consiste ordinariamente en un conjunto de dispositivos perifricos de almacenamiento y entrada / salida. Estos representan el mundo exterior para la computadora, y cualquier comunicacin con ella debe tener lugar a travs del entorno de operacin. Ej. Discos magnticos, CD-ROM, cintas y otros dispositivos de entrada salida.

Programacin Procedural 2012

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

3.1.1 Estados de computadoras


El pleno entendimiento de una computadora radica en ver con claridad su operacin esttica y la dinmica. Un medio conveniente de visualizar el comportamiento dinmico de una computadora es a travs del concepto de estado de computadora. Considrese que el proceso de ejecucin de programas por la computadora tiene lugar a travs de una serie de estados, cada uno definido por el contenido de la memoria, los registros internos y los almacenes externos en algn punto durante la ejecucin. El contenido inicial de estas reas de almacenamiento define el estado inicial de la computadora. Cada paso en la ejecucin del programa transforma el estado existente en un nuevo estado a travs de la modificacin del contenido de una de estas reas de almacenamiento o ms. Esta transformacin de estado se designa como una transicin de estado. Cuando la ejecucin del programa ha concluido, el estado final est definido por el contenido final de estas reas de almacenamiento.

3.2 Computadoras de Firmware


Dada una definicin precisa de una computadora siempre es posible producir la computadora en hardware, es decir, construir un dispositivo fsico cuyo lenguaje de mquina se a precisamente el de la computadora definida. Esto es cierto incluso si el lenguaje de mquina es de alto nivel como C. Al sugerir esta posibilidad se recurre a un importante principio bsico que est detrs del diseo de las computadoras: cualquier algoritmo o estructura de datos definida con precisin se puede producir en hardware. Puesto que una computadora es simplemente una coleccin de algoritmos y estructuras de datos, se puede suponer que su produccin en hardware es una posibilidad, independientemente de la complejidad de la computadora o su lenguaje de mquina asociado. Las computadoras de hardware reales tienen comnmente un lenguaje de mquina de nivel ms bien bajo en razn de consideraciones prcticas. Es probable que una computadora con C o Ada en su lenguaje de mquina sea considerablemente ms compleja y mucho menos flexible en diversas tareas de cmputo que una computadora con un lenguaje de mquina de bajo nivel. Una alternativa comn a la produccin estricta en hardware de una computadora es la computadora de firmware, simulada por un microprograma que ejecuta en una computadora microprogramable de hardware especial. El lenguaje de mquina de esta computadora consiste por lo general simples transferencias de datos entre memoria principal y registros internos de alta velocidad, entre los registros mismos, y desde los registros a otros registros a travs de procesadores como sumadores y multiplicadores. El microprograma simula la operacin de la computadora deseada en la computadora microprogramable anfitrin. El microprograma reside generalmente en memoria de slo lectura. Ejemplo de computadora de firmware es el BIOS.

3.3 Traductores y computadoras simuladas por software3


La programacin se hace ms a menudo en un lenguaje de alto nivel muy alejado del lenguaje de mquina mismo del hardware. Existen dos soluciones bsicas para estas cuestiones:

Tomado de Tesis Doctoral. Luengo Dez, Mara. Universidad de Oviedo. Luengo Pgina 19-23

Programacin Procedural 2012

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

3.3.1 Traduccin
Traductor denota cualquier procesador de lenguajes 4 que acepta programas en cierto lenguaje fuente (que puede ser de alto o bajo nivel) como entrada y produce programas funcionalmente equivalentes en otro lenguaje objeto.

Fig. 1: Esquema general de un traductor5 Ensamblador Es un procesador de lenguajes cuyo lenguaje objeto es tambin alguna variedad de lenguaje mquina para una computadora real, pero cuyo lenguaje fuente, un lenguaje ensamblador, constituye en gran medida una representacin simblica del cdigo de mquina objeto. Casi todas las instrucciones en el lenguaje fuente se traducen una por una a instrucciones en el lenguaje objeto. Compilador Un compilador es un procesador de lenguajes cuyo lenguaje fuente es un lenguaje de alto nivel y cuyo lenguaje objeto se aproxima al lenguaje mquina de una computadora real, ya sea que se trate de un lenguaje ensamblador o alguna variedad de lenguaje mquina.

Procesador de lenguaje es un nombre genrico que se aplica a traductores, compiladores, intrpretes, y otros programas que realizan operaciones con los lenguajes. 5 Ver Pratt Captulo 2. Pag. 41

Programacin Procedural 2012

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

Fig. 2: Esquema general de un compilador6 Compilador incremental: Algunos lenguajes como Lisp y Prolog permiten realizar modificaciones del programa fuente durante su ejecucin. Los programas escritos en este tipo de lenguajes pueden dividirse en una parte esttica, que no es susceptible de modificacin durante la ejecucin y una parte dinmica que puede sufrir modificaciones durante ella. La compilacin incremental es una tcnica que compila nicamente las partes estticas del programa. Posteriormente las partes dinmicas no compiladas son interpretadas Compilacin Just in time: esta tcnica se aplica principalmente a entornos distribuidos en los que el cliente desea ejecutar un programa que reside en un servidor. Mientras la compilacin tradicional solicita todo el programa fuente para compilarlo y luego ejecutarlo, la compilacin Just in time solicita un mdulo del programa fuente, compila y ejecuta dicho mdulo. Si el mdulo realiza una llamada a otro mdulo, se solicita entonces dicho mdulo, se compila y ejecuta y as sucesivamente. La ventaja para el usuario es que puede comenzar a obtener resultados parciales de la ejecucin antes que con la compilacin tradicional. Adems en el caso de programas grandes, no siempre es necesario compilar todos los mdulos, ya que algunos pueden no utilizarse. Cargador
6

Ver Pratt. Captulo 3. Pg. 72

Programacin Procedural 2012

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

Es un procesador de lenguajes cuya entrada es un lenguaje objeto, un programa en lenguaje de mquina en manera reubicable; las modificaciones que realiza son a tablas de datos que especifican las direcciones de memoria donde el programa necesita estar para ser ejecutable. Preprocesador Bsicamente es un editor de texto, toma como entrada una forma ampliada de un lenguaje fuente y su salida es una forma estndar del mismo lenguaje fuente. Actividad 1: Investigue la bibliografa y especifique las funciones de cada uno de estos traductores.

3.3.2 Simulacin de software (interpretacin)


En lugar de traducir los programas de alto nivel, a programas equivalentes en lenguaje mquina, se podran simular a travs de programas ejecutados en otra computadora anfitrin, una computadora cuyo lenguaje mquina sea de alto nivel. Esto se construye con software que se ejecuta en la computadora anfitrin, la computadora con lenguaje de alto nivel que de otra manera se podra haber construido en hardware. A esto se le conoce como una simulacin por software (o interpretacin) de la computadora con lenguaje de alto nivel en la computadora anfitrin.

Fig. 3: Esquema general de un intrprete La traduccin y la simulacin proporcionan ventajas diferentes, una ventaja de la traduccin, es que cdigos referentes a ciclos que se repitan gran cantidad de veces, son ejecutados muchas veces, pero se traducen slo una a diferencia de los simulados, que tienen que decodificarlo la misma cantidad de veces que se ejecute. Una ventaja para la simulacin, es que en caso de un error, proporcionan ms informacin acerca de donde fue la falla que en un cdigo objeto traducido. Por lo tanto, si el programa de entrada est en un lenguaje de alto nivel:

Programacin Procedural 2012

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

1. el traductor procesar los enunciados del programa en el orden fsico de entrada, una vez cada uno. 2. el simulador podr procesar los enunciados siguiendo el orden lgico de control y algunos enunciados podr procesarlos ms de una vez y otros omitirlos (segn que sean parte de un bucle o que el control no los alcance). No siempre se dan por separado, la traduccin y la simulacin. Generalmente se mezclan estos dos mecanismos, segn cual de ellos prevalezca se habla de lenguajes compilados cuando prevalece la traduccin (ejemplo: C, C++, Pascal, Fortran, Ada, Cobol) o interpretados cuando predomina la simulacin (ejemplo: LISP, PROLOG, SmallTalk, ML). En general cuando hay enunciados repetitivos es mejor la traduccin pues se decodifica una vez, aunque se ejecuten muchas veces. La desventaja es la prdida de informacin acerca del programa. Actividad 2: Investigue la bibliografa e indique claramente las ventajas y desventajas de la traduccin y la simulacin.

4. Modelos de computacin
Entendemos por una computacin a cualquier proceso que puede ser realizado por una computadora, con esto nos estamos refiriendo no solo a clculos matemticos sino que incluimos la manipulacin de datos, el procesamiento de textos y el almacenamiento y recuperacin de la informacin. Estos modelos de computacin dan lugar a distintas familias de lenguajes o paradigmas. Al respecto vale comentar que el concepto de paradigma fue incorporado T. Kuhn para justificar las revoluciones cientficas. Este concepto engloba prcticas y creencias de una comunidad cientfica en un momento dado. Las personas de esa comunidad aceptan y comparten dichas creencias sin discusin, hasta que aparece un nuevo paradigma que rebate alguna caracterstica fundamental. En informtica, tambin es posible observar varias comunidades de ese tipo, cada una hablando su propio lenguaje y utilizando sus propios paradigmas. De hecho los lenguajes de programacin suelen fomentar el uso de ciertos paradigmas y disuadir el uso de otros. A continuacin se resumen los principales paradigmas de programacin, aunque existen lenguajes de programacin hbridos:7 - La programacin imperativa o procedural presta especial atencin a la secuencia de rdenes que el programador debe comunicar para resolver un problema. El paradigma procedimental, es tal vez el ms conocido y utilizado en el proceso de programacin, donde los programas se desarrollan a travs de procedimientos. Pascal, C y BASIC son tres de los lenguajes imperativos ms importantes. La palabra latina imperare significa "dar instrucciones". El paradigma se inici al principio del ao 1950 cuando los diseadores reconocieron que las variables y los comandos o instrucciones de asignacin constituan una simple pero til abstraccin del acceso a memoria y actualizacin del conjunto de instrucciones mquina. Debido a la estrecha relacin con la arquitectura de la
7

Tomado de Tesis Doctoral. Luengo Dez, Mara. Universidad de Oviedo. Pgina 12-13

Programacin Procedural 2012

10

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

mquina, los lenguajes de programacin imperativa pueden ser implementados muy eficientemente, al menos en principio. El paradigma imperativo an tiene cierto dominio en la actualidad. Una buena parte del software actual ha sido desarrollado y escrito en lenguajes imperativos. La gran mayora de programadores profesionales son principalmente o exclusivamente programadores imperativos. En oposicin al paradigma imperativo, surgen los paradigmas declarativos o paradigma de programacin lgica. El paradigma declarativo hace hincapi en la pregunta Cul es el problema? en vez de Qu procedimiento necesitamos para resolver el problema? - La programacin lgica se centra en la descripcin de las relaciones que intervienen en el problema. El paradigma declarativo o paradigma de programacin lgica se basa en el hecho que un programa implementa una relacin antes que una correspondencia. Debido a que las relaciones son mas generales que las correspondencias (identificador - direccin de memoria), la programacin lgica es potencialmente de ms alto nivel que la programacin funcional o la imperativa. El lenguaje ms popular enmarcado dentro de este paradigma es el lenguaje PROLOG. El auge del paradigma declarativo se debe a que el rea de la lgica formal de las matemticas ofrece un sencillo algoritmo de resolucin de problemas adecuado para, usarse en un sistema de programacin declarativo de propsito general. Otros lenguajes son Mercury, Goedel, AProlog, etc. La programacin funcional toma como elemento central las funciones que intervienen en el problema a resolver. Si la programacin imperativa se caracteriza por el uso de variables, comandos y procedimientos, la programacin funcional se caracteriza por el uso de expresiones y funciones. Un programa dentro del paradigma funcional, es una funcin o un grupo de funciones compuestas por funciones ms simples establecindose que una funcin puede llamar a otra, o el resultado de una funcin puede ser usado como argumento de otra funcin. El lenguaje por excelencia ubicado dentro de este paradigma es el LISP. Scheme, ML, Haskell son otros ejemplos de lenguajes funcionales. En la Programacin Orientada a Objetos se resuelve el problema definiendo los objetos que intervienen y el envo de mensajes entre ellos. El paradigma orientado a objetos, se basa en los conceptos de objetos y clases de objetos. Un objeto es una variable que posee un conjunto de operaciones que le pertenecen o estn definidas para ellos. El paradigma orientado a objetos actualmente es el paradigma ms popular. Los lenguajes Simula, Smalltalk, C++, Java etc. se consideran lenguajes Orientados a Objetos.

Existen otros paradigmas, como rogramacin dirigida por eventos, programacin visual, etc. En esta asignatura nos interesa conocer algunas cuestiones de diseo e implementacin de los lenguajes imperativos. Leer Lenguajes de Programacin Principios y Prctica. Louden, Kenneth. Captulo 1. Paradigmas de computacin. Pg. 12 a 18.

Programacin Procedural 2012

11

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

5. Lenguajes Imperativos
El concepto bsico que sustenta este modelo es el de estado de mquina o estado de computadora. El estado de computadora nos permite visualizar el comportamiento dinmico de una computadora. La ejecucin de un programa da lugar a una serie de estados, cada uno definido por el contenido de la memoria, los registros internos y los almacenamientos externos en un punto de ejecucin. El almacenamiento inicial de estas reas define el estado inicial de la computadora. Cada paso en la ejecucin transforma este estado en otro nuevo, a travs de la modificacin de alguna de estas reas. Esta transformacin se denomina transicin de estado. Cuando termina la ejecucin del programa, el estado final viene dado por el contenido final de las reas antes mencionadas. Por lo tanto, la ejecucin de un programa puede verse como una serie de transiciones de estados que realiza la computadora. En este modelo de computacin, un programa es un conjunto de enunciados y la ejecucin de cada enunciado hace que cambie el valor de una o ms localidad de almacenamiento en memoria, es decir que la memoria pase a un nuevo estado. Si se considera a la memoria como un conjunto de cajas, la construccin de un programa consiste en construir los estados de mquina sucesivos (canicas en cajas o valores en variables) que se necesitan para llegar a la solucin. Un lenguaje que posee las caractersticas antes expuestas, es decir la ejecucin secuencial de instrucciones, el uso de variables para representar almacenamiento en memoria y el uso de la asignacin para cambiar en contenido de las variables, se denomina lenguaje imperativo. El calificador imperativo viene del hecho que su caracterstica principal es una secuencia de enunciados que representan comandos, es decir rdenes. Este tipo de modelo de computacin, tiene caractersticas propias del modelo de Von Newmann, variables que representan valores de memoria y asignacin que permite que el programa opere sobre dichos valores. Existen otros paradigmas que no son tan dependientes del modelo de computadora de Von Newmann, y sern estudiados en cursos superiores. El lenguaje C, lenguaje que se usar en este curso responde al paradigma imperativo.

5.1 Definicin de un lenguaje de programacin


Un lenguaje natural es un instrumento de comunicacin utilizado de forma comn entre personas. Para que exista comunicacin, debe existir una comprensin mutua de cierto conjunto de smbolos y reglas del lenguaje. Los lenguajes de programacin tienen como objetivo la construccin de programas, normalmente escritos por personas. Estos programas se ejecutarn por un ordenador que realizar las tareas descritas. El programa debe ser comprendido tanto por personas como por ordenadores. La utilizacin de un lenguaje de programacin requiere, por tanto, una comprensin mutua por parte de personas y mquinas. Este objetivo es difcil de alcanzar debido a la naturaleza diferente de ambos. En un lenguaje natural, el significado de los smbolos se establece por la costumbre y se aprende mediante la experiencia. Sin embargo, los lenguajes de programacin se definen habitualmente por una autoridad, que puede ser el diseador individual del lenguaje o un determinado comit.

Programacin Procedural 2012

12

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

Para que el ordenador pueda comprender un lenguaje humano, es necesario disear mtodos que traduzcan tanto la estructura de las frases como su significado a cdigo mquina. Los diseadores de lenguajes de programacin construyen lenguajes que saben cmo traducir o que creen que sern capaces de traducir. Si los ordenadores fuesen la nica audiencia de los programas, estos se escribiran directamente en cdigo mquina o en lenguajes mucho ms mecnicos. Sin embargo, el programador debe ser capaz de leer y comprender el programa que est construyendo y las personas no son capaces de procesar informacin con el mismo nivel de detalle que las mquinas. Los lenguajes de programacin son, por tanto, una solucin de compromiso entre las necesidades del emisor (programador - persona) y del receptor (ordenador - mquina). Las declaraciones, tipos, nombres simblicos, etc. son concesiones de los diseadores de lenguajes para que los humanos podamos entender mejor lo que se ha escrito en un programa. Por otro lado, la utilizacin de un vocabulario limitado y de unas reglas estrictas son concesiones para facilitar el proceso de traduccin. La definicin de un lenguaje de programacin necesita una descripcin precisa y completa, adems de un traductor que permita aceptar el programa en el lenguaje en cuestin y que, lo ejecute directamente o bien lo transforme en una forma adecuada para su ejecucin. Dos partes se pueden distinguir en la definicin de un lenguaje. La estructura o sintaxis y la semntica o significado. La sintaxis estudia las reglas de formacin de frases. Las reglas de sintaxis nos dicen cmo se escriben los enunciados, declaraciones y otras construcciones del lenguaje. La semntica, sin embargo, hace referencia al significado de esas construcciones.

5.2 Implementacin de lenguajes


Cuando se implementa un lenguaje de programacin, las estructuras de datos y algoritmos que se utilizan en tiempo de ejecucin de un programa escrito en ese lenguaje, definen un modelo de ejecucin definido por la implementacin del lenguaje. Por ejemplo, para la implementacin de las operaciones de suma de enteros y raz cuadrada, el implementador puede optar por representar la suma de enteros a partir de la suma de enteros proporcionada directamente por el hardware, y para la operacin de raz cuadrada puede optar por una simulacin por software. De ah que es importante entender que la implementacin de un lenguaje est determinada por mltiples decisiones que debe tomar el implementador en funcin de los recursos de hardware y software disponibles en la computadora subyacente y los costos de su uso.

5.3 Principios y criterios de diseo de lenguajes de programacin8


Al disear lenguajes de programacin, a menudo es necesario tomar decisiones sobre las caractersticas que se incluyen de forma permanente, las caractersticas que no se incluyen pero existen mecanismos que facilitan su inclusin y las que no se permiten. Estas decisiones pueden afectar al diseo final del lenguaje y posiblemente entrar en conflicto con otros aspectos del lenguaje.

Tomado de Tesis Doctoral. Luengo Dez, Mara. Universidad de Oviedo Pg. 11-12

Programacin Procedural 2012

13

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

A modo de sntesis, se esboza un esquema extraido del libro Lenguajes de Programacin Principios y Prctica. Louden, Kenneth. Captulo 3. Principios de diseo de los lenguajes9. Hay dos principios importantes a tener en cuenta: la eficiencia y la regularidad. La eficiencia debe evaluarse en distintas dimensiones (cdigo, traduccin, etc.)
Eficiencia de cdigo: Hace referencia a un diseo del lenguaje que permite que el traductor genere un cdigo ejecutable eficiente. Por ejemplo el uso de declaraciones anticipadas de las variables. Eficiencia de traduccin: Hace referencia a un diseo del lenguaje que permite que el cdigo fuente se traduzca con rapidez y con un traductor de tamao razonable. Ejemplo: C standard permite un compilador de una sola pasada pues las variables se declaran antes de usarse. C++, el compilador debe realizar una segunda pasada para resolver referencias del identificador.

Eficiencia
Eficiencia de implementacin: Hace referencia a la eficiencia con la que se puede escribir un traductor. Esto est relacionado con la eficiencia de la traduccin y con la complejidad de la definicin del lenguaje.

Eficiencia de la programacin: Hace referencia a la facilidad para escribir programas en el lenguaje. Entre otras, esto involucra la capacidad de expresin del lenguaje y la capacidad de darle mantenimiento al programa.

La regularidad es una cualidad que implica que hayan pocas restricciones en el uso de sus constructores particulares, pocas interacciones raras entre dichos constructores, y menos sorpresas en la forma en la que se comportan las caractersticas del lenguaje. Distintos principios bsicos miden la regularidad, entre otros la generalidad, la ortogonalidad y la uniformidad. Generalidad: Un lenguaje alcanza generalidad evitando casos especiales en cuanto a disponibilidad o uso de constructores y permitiendo la combinacin de constructores muy relacionados en uno mas general. Cuando las caractersticas del lenguaje son ortogonales, el lenguaje es ms sencillo de comprender, porque hay menos situaciones excepcionales a memorizar. La ortogonalidad ofrece la posibilidad de combinar caractersticas de todas las formas posibles (sin excepciones). La no generalidad esta ligada a restricciones de los constructores con independencia del contexto en que estn. - En lenguaje C el operador de igualdad == carece de generalidad. Dos arreglos no pueden compararse a travs de este operador, por ejemplo.
9

Louden, Kenneth. Captulo 3. Principios de diseo de los lenguajes. Pg. 49 a 61.

Programacin Procedural 2012

14

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

En cuanto a la longitud de los arreglos, lenguaje C tiene arreglos de longitud variable, mientras que esta generalidad no est presente en lenguaje Pascal, que admite slo arreglos de longitud fija.

La falta de ortogonalidad puede suponer la enumeracin de situaciones excepcionales o la aparicin de incoherencias. Un ejemplo de falta de ortogonalidad es la limitacin que impone Pascal para que una funcin devuelva determinados tipos de valores. (Una funcin puede devolver un tipo simple, un string o un puntero) Otro ejemplo que muestra la carencia de ortogonalidad del lenguaje Pascal en los parmetros formales de una funcin o procedimiento es que un parmetro formal no puede ser declarado explcitamente, sino que debe haber una declaracin de tipos previamente. Por ejemplo: procedure ordena (var a : array[1..10] of real); no es vlida procedure ordena (var a : Arre); es vlida despus de la declaracin de tipo type Arre = array[1..10] of real; Ortogonalidad: Se refiere a que los constructores del lenguaje no deben comportarse de manera diferente en contextos diferentes. Cuando las caractersticas del lenguaje son ortogonales, el lenguaje es ms sencillo de comprender, porque hay menos situaciones excepcionales a memorizar. La ortogonalidad ofrece la posibilidad de combinar caractersticas de todas las formas posibles (sin excepciones). As, las restricciones que dependen del contexto son No Ortogonales, en tanto que las restricciones que se aplican independientemente del contexto son No Generales. - La no generalidad del operador == en lenguaje C puede considerarse una no ortogonalidad, por cuanto su aplicabilidad depende del tipo de operadores que se estn comparando. - Un ejemplo de falta de ortogonalidad es la limitacin que impone Pascal para que una funcin devuelva determinados tipos de valores. (Una funcin puede devolver un tipo simple, un string o un puntero) - Otro ejemplo que muestra la carencia de ortogonalidad del lenguaje Pascal en los parmetros formales de una funcin o procedimiento es que un parmetro formal no puede ser declarado explcitamente, sino que debe haber una declaracin de tipos previamente. Por ejemplo: procedure ordena (var a : array[1..10] of real); no es vlida procedure ordena (var a : Arre); es vlida despus de la declaracin de tipo type Arre = array[1..10] of real; Uniformidad: Hace referencia a la consistencia de la apariencia y comportamiento de los constructores del lenguaje. Las no-uniformidades son de dos tipos: a) dos cosas similares que no parecen serlo o se comportan similarmente, o

Programacin Procedural 2012

15

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

b) cosas no similares que parecen serlo o se comportan similarmente cuando no debieran. - Ejemplo en lenguaje C los operadores & (and bit a bit) y && (and lgico) tienen una apariencia confusamente similar y producen resultados muy distintos.

6. El Lenguaje C 6.1 Breve Historia


Para hablar del lenguaje C, es bueno recordar que los primeros lenguajes de programacin se denominaban lenguajes de bajo nivel o lenguajes de mquina (ceros y unos). El uso de stos implicaba un conocimiento exhaustivo del computador y un manejo preciso de las direcciones de memoria asociadas a las distintas operaciones y operadores. Para resolver los problemas que surgan de esta tediosa forma de programar, surgieron los lenguajes de programacin ensambladores que usaban smbolos para expresar las distintas operaciones y las direcciones de memoria donde se almacenaban los valores de las variables. Finalmente, surgen los lenguajes de alto nivel, que distan mucho del lenguaje de mquina y se asemejan ms al lenguaje que utilizan las personas para comunicarse (el ingls). Debido al notable abaratamiento de las computadoras alrededor de los aos 70, fue evidente el progreso de la tecnologa de compiladores, dando lugar al surgimiento de muchos lenguajes lderes sobre distintos dominios: comercial, cientfico, militar etc. Si bien muchos de ellos ya prcticamente no se usan, y muchos ms se han desarrollado, en la actualidad el lenguaje C tiene la caracterstica de estar an vigente como consecuencia de las continuas revisiones que en l se han realizado y de su capacidad de reflejar los cambios que se produjeron en otras reas de la computacin. El lenguaje C fue desarrollado en 1972 por Dennos Ritchie y Ken Thompson en los laboratorios Bell Telephone de AT&T. El lenguaje C comienza a desarrollarse como un lenguaje para escribir software y compiladores, especficamente para desarrollar el sistema operativo UNX, pero su uso se ha generalizado y hoy en da muchos sistemas estn escritos en C o en C++. Adems, es un lenguaje que no est ligado a ningn sistema operativo ni mquina, lo que permita la portabilidad entre distintas plataformas. El lenguaje C es un lenguaje de propsitos generales y, si bien es un lenguaje de alto nivel, provee sentencias de bajo nivel que permite facilidades similares a las que se encuentran en los lenguajes ensambladores.

6.2 Etapas en la obtencin de programa ejecutable


Antes de ejecutar un programa en lenguaje C, existen ciertas etapas que se deben realizar, ya que todas ellas contribuyen a la obtencin del programa ejecutable. Ellas son: edicin, compilacin, enlace, carga y ejecucin. Edicin Esta etapa consiste en la escritura de un programa en C, utilizando un programa editor. Este programa, que se conoce como programa en cdigo fuente, deber ser almacenado en el disco con un nombre que lo identifique para su posterior compilacin. Los programas fuentes se almacenan o graban con extensin .c o .cpp segn se utilice lenguaje C C++ ( C plus plus).

Programacin Procedural 2012

16

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

Compilacin El proceso de compilacin consiste en la traduccin del programa fuente a cdigo binario, para que la computadora pueda interpretar las rdenes. Esto se logra dando la orden compilar del ambiente de desarrollo integrado (IDE) o bien desde la lnea de rdenes. Durante esta etapa, se detectan los posibles errores sintcticos cometidos por el programador, cuando no ha respetado las reglas de sintaxis del lenguaje. En este caso, es necesario volver a editar el programa, corregir los errores sealados y compilar nuevamente. Este proceso se repite hasta que no se detectan errores, obtenindose el programa en cdigo objeto que es almacenado en disco. Se debe tener en cuenta que antes de la fase de traduccin mencionada, el compilador invoca automticamente a un programa preprocesador que obedece directrices especiales que indican ciertas operaciones que deben realizarse antes de la compilacin. En general, esas operaciones consisten en la inclusin de otros archivos en el programa a compilar o en el reemplazo de smbolos especiales por textos de programa. Este tema ser oportunamente ampliado. Enlace El programa objeto no es ejecutable, esto se debe a que generalmente los programas contienen referencias a funciones definidas en otro lugar, una biblioteca estndar o en bibliotecas definidos por algn programador, por ejemplo. El enlazador es el que se encarga de vincular el cdigo objeto con las bibliotecas, obteniendo as el programa ejecutable, que es almacenado en disco. Carga El cargador toma el programa ejecutable del disco y los transfiere a memoria. Finalmente la computadora, bajo el control de la UCP (Unidad Central de Procesamiento) toma cada una de las instrucciones y las ejecuta. El siguiente es un esquema de las etapas descriptas:

Programacin Procedural 2012

17

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

Etapa de T R A D U C C I O N

Modulo Fuente Preprocesador

Traductor Etapa de Otros Mdulos Objeto L I N K E D I C I O N

Modulo Objeto

Etapa de E J E C U C I O N

Linkeditor

Mdulo Carga

Datos

Ejecucin en CPU

Salida
Fig. 4: Etapas para la obtencin de un programa ejecutable en C

7. Lecturas Adicionales
Actividad 3: Realice un resumen sobre los orgenes del lenguaje C a partir de la historia de los primeros lenguajes de programacin.

RESEA HISTORICA DE LOS LENGUAJES PROCEDURALES


Los primeros algoritmos conocidos fueron desarrollados en Mesopotamia (regin de Irak) entre los aos 3000 y 1500 a.C., cerca de la ciudad de Babilonia. Estos algoritmos eran secuencias de instrucciones, no tenan estructuras de control alternativas (escriban el algoritmo de diversas formas) ni repetitivas (escriban las instrucciones tantas veces como fuera necesario). Un estudio sobre estos algoritmos puede consultarse en el artculo Ancient babylonian algorithms [KNUT72]. El matemtico griego Euclides en el siglo IV a.C. construy un algoritmo para el clculo del mximo comn divisor de dos nmeros naturales. Este algoritmo ya inclua estructuras de control iterativas.

Programacin Procedural 2012

18

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

Charles Babbage construyo entre los aos 1820 y 1850 dos mquinas de computar, ninguna de las cuales fue terminada. De las dos, la mquina analtica fue la que ms se pareca a los ordenadores digitales modernos. Los programas estaban escritos en lenguaje mquina y utilizaban ciertas tarjetas de operacin y de variables (no haba memoria). Junto a Babbage trabaj Ada Augusta, condesa de Lovelace, hija del poeta Lord Byron, que es reconocida por algunos como la primera programadora (en su honor se llam Ada al lenguaje desarrollado bajo los auspicios del Ministerio de Defensa de los Estados Unidos). En el fundamento lgico del reconocimiento y traduccin de los lenguajes, siempre se debe de hacer referencia a la obra de Alan Mathison Turing. Su origen est en el problema de la decisin, planteado por David Hilbert en el Congreso Internacional de Matemticos de 1900, en Pars. La publicacin en la que Turing anunci su resultado ha tenido una significacin y trascendencia que rebas con mucho el problema inmediato al que se diriga. Al atacar el problema de Hilbert, Turing se vio forzado a plantearse cmo dar al concepto de mtodo una definicin precisa. A partir de la idea intuitiva de que un mtodo es un algoritmo, Turing hizo ver cmo esta idea puede refinarse y convertirse en un modelo detallado del proceso de computacin, en el cual un algoritmo cualquiera es descompuesto en una secuencia de pasos simples. El modelo computacional resultante es una construccin lgica conocida por mquina de Turing, que puede reconocer todo tipo de lenguajes. Otras aportaciones importantes utilizadas posteriormente en procesadores de lenguaje, se deben a las investigaciones de Alonzo Church, y dos de sus discpulos, Stephen C. Kleene y J. Barkley Rosser, sobre la lgica de la demostrabilidad, poniendo a punto un lenguaje formal coherente, bautizado por ellos como lambda-clculo. Este lenguaje era til para razonar sobre funciones matemticas, tales como la raz cuadrada, los logaritmos y cualesquiera otras funciones ms complicadas que pudieran definirse (Church eligi la letra griega , equivalente a la "L" latina, para sugerir que su sistema formal es un lenguaje). El lenguaje de programacin LISP, est inspirado en el lambda-clculo. Las primeras investigaciones relacionadas directamente con los procesadores de lenguaje, fueron el estudio del problema de lectura de frmulas algebraicas complicadas y su interpretacin. As la notacin polaca inversa (Reverse Polish Notation), o notacin libre de parntesis fue introducida por J. Lukasiewicz a finales de los aos 20. Las frmulas con parntesis, en su caso ms general fueron estudiadas por Kleene en 1934, y por Church en 1941. Continuando los estudios anteriores, K. Zuse especific, en 1945, un algoritmo que determinaba cuando una expresin con parntesis estaba bien formada. En 1951, H. Rutishauser describi el nivel de parntesis de una frmula algebraica, como un perfil entre distintos niveles, que parte del nivel cero, y que va ascendiendo nivel a nivel, para descender por ltimo, otra vez, a nivel cero. Todos estos estudios estaban situados dentro del campo de la Lgica. La palabra inglesa compiler se atribuye a menudo a Grace Murray Hopper (1906-1992) [SAMM92], quien desarroll la implementacin de lenguajes de alto nivel como una recopilacin de subrutinas de una biblioteca. En un principio se llam compilador, a un programa que "reuna" subrutinas (compilaba). As cuando en 1954 empez a utilizarse el trmino "compilador algebraico", su significado es el actual. En un principio, se facilit el proceso de compilacin restringiendo la notacin, primeramente se suprimi la precedencia de los operadores, y por tanto se necesitaban muchos parntesis. Otra forma era requiriendo el completo uso de parntesis, pues se conoca una manera mecnica y simple de insertar los parntesis, obtenindose expresiones con el "mximo

Programacin Procedural 2012

19

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

nmero de parntesis", desarrollados por los estudios ligados al dominio de la Lgica. En 1952 C. Bhm centr su inters en este ltimo mtodo, y lo aplic a las frmulas secuencialmente. Bhm y John Backus estaban en el equipo de 18 personas que realizo el primer compilador de FORTRAN para IBM, en 1954. Este lenguaje se diseaba al mismo tiempo que se desarrollaba. Despus del FORTRAN otros lenguajes de alto nivel empezaron a desarrollarse a finales de los aos 50, y algunos de ellos todava juegan un papel importante hoy en da, aunque han sido remodelados en revisiones peridicas. Este es el caso del LISP y COBOL que fueron diseados originalmente en esa poca. Por otra parte, en 1957 Kantorovic mostr como se puede representar una frmula con estructura de rbol, lo cual supuso el primer paso para la conexin con el anlisis sintctico de los lingistas. La jerarqua de los lenguajes haba sido introducida por Chomsky (1956), como parte de un estudio sobre lenguajes naturales. Su utilizacin para especificar la sintaxis de los lenguajes de programacin la realiz Backus, con el borrador del que sera ms tarde ALGOL 60. Los compiladores diseados en los aos 50, compilaban secuencialmente frmulas aritmticas. Todos usaban para almacenamiento intermedio de las partes procesadas una pila LIFO. En 1959 Bauer y Samuelson formalizaron esta tcnica con los autmatas de pila. Las tcnicas fundamentales del anlisis sintctico se desarrollaron y formalizaron en los aos 60. En un principio las investigaciones se centraron en el anlisis sintctico ascendente, aunque posteriormente se completaron con el estudio del anlisis descendente. El anlisis sintctico ascendente se basa en reconocer las sentencias desde las hojas hasta la raz del rbol. Floyd, en 1963, fue el primero en introducir las gramticas de precedencia, que dieron lugar a los compiladores basados en precedencia. En 1966 McKeeman obtuvo la precedencia dbil como una generalizacin de la precedencia simple. Otro desarrollo en el anlisis sintctico descendente se debe a Knuth, que generaliz los autmatas de pila de Bauer y Samuelson, para reconocer los lenguajes generados por las gramticas LR(k). Los mtodos descendentes de anlisis sintctico, se basan en construir el rbol sintctico desde la raiz a las hojas, es decir en forma descendente. Los compiladores dirigidos por sintaxis, en la forma de anlisis recursivo descendente fueron propuestos por primera vez de modo explcito por Lucas en 1961, para describir un compilador simplificado de ALGOL 60 mediante un conjunto de subrutinas recursivas, que correspondan a la sintaxis BNF. El problema fundamental para el desarrollo de este mtodo fue el retroceso, lo que hizo que su uso prctico fuera restringido. La elegancia y comodidad de la escritura de compiladores dirigidos por sintaxis fue pagada en tiempo de compilacin por el usuario. As mientras que con esta tcnica tenan que ejecutarse 1000 instrucciones para producir una instruccin mquina, con las tcnicas de los mtodos ascendentes se tenan que ejecutar 50. La situacin cambi cuando comenz a realizarse anlisis sintctico descendente dirigido por sintaxis sin retroceso, por medio del uso de las gramticas LL(1), obtenidas independientemente por Foster (1965) y Knuth (1967). Generalizadas posteriormente por Lewis, Rosenkrantz y Stearns en 1969, dando lugar a las gramticas LL(k), que pueden analizar sintcticamente sin retroceso, en forma descendente, examinando en cada paso, todos los smbolos procesados anteriormente y los k smbolos ms a la derecha. Evidentemente, tanto el anlisis de las gramticas LL(k) como el de las LR(k), es eficiente, y la discrepancia entre mtodos de anlisis sintctico ascendente o descendente no va ms all de su importancia histrica.

Programacin Procedural 2012

20

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

La generacin de cdigo destino se efectuaba ad hoc, hasta comienzos de los sesenta, y no existan mtodos formales para el desarrollo de esta tarea. Con la introduccin de los lenguajes formales, la tcnica general para realizar la generacin de cdigo, se basa en asociar a cada regla sintctica unas reglas de traduccin, llegndose al concepto actual de "traduccin dirigida por sintaxis". Tambin a principios de los sesenta se comenzaron a plantear tcnicas de generacin de cdigo, mediante anlisis sintctico recursivo descendente. As Hoare en 1962, describi un compilador de ALGOL 60, organizado como un conjunto de procedimientos, cada uno de los cuales es capaz de procesar una de las unidades sintcticas del informe de ALGOL 60. A partir de mediados de los aos sesenta se comienza la normalizacin por el American National Standards Institute (A.N.S.I.) de los lenguajes de programacin, dndose un paso decisivo en la transportabilidad de los programas entre distintas mquinas y fabricantes. Hasta finales de los aos sesenta, la mayora de los trabajos sobre teora de lenguajes estaban relacionados con la definicin sintctica. La definicin semntica es una cuestin mucho ms compleja, por lo que recibi menor atencin en la primera poca de desarrollo. A finales de los aos sesenta surgen las primeras definiciones semnticas elaboradas de lenguajes de programacin, como la dada para PL/I por el laboratorio de IBM de Viena, en 1969. La dcada de los setenta se caracteriza por la aparicin de nuevos lenguajes de programacin, resultado en parte de la formalizacin de las tcnicas de construccin de compiladores de la dcada anterior, y por otra por el gran desarrollo del hardware. Entre los nuevos lenguajes se destaca el PASCAL, diseado para la enseanza de tcnicas de programacin estructurada, por N. Wirth en 1971. En el campo de la programacin de sistemas destacan el lenguaje C, diseado por Kernighan y Ritchie en 1973[KERN78, KERN84, KERN88], y lenguaje Modula-2, diseado por Wirth a finales de los setenta [WIRT88]. Tambin hay que sealar la aparicin de los pequeos sistemas (micro-ordenadores) y el abaratamiento de stos. La dcada de los ochenta comienza marcada por la aparicin del lenguaje ADA, que pretende ser multipropsito, y con unas prestaciones muy elevadas. El diseo de este lenguaje se hizo segn las directrices marcadas por el Ministerio de Defensa de los Estados Unidos. Es un lenguaje basado en el Pascal, que incluye caractersticas importantes tales como abstraccin de datos, multitarea, manejo de excepciones, encapsulamiento y mdulos genricos. Para la construccin de sus compiladores se han utilizado las tcnicas ms avanzadas, y tambin se ha visto la necesidad de considerar nuevas tcnicas de diseo de compiladores. Se avanza en el concepto de tipo abstracto de datos. Se desarrollan otras arquitecturas de computadoras, que faciliten el procesamiento paralelo. La tecnologa VLSI, abre expectativas para el desarrollo de nuevas arquitecturas, y en el campo de compiladores de silicio. Tambin hay que destacar en esta dcada el gran desarrollo de la Inteligencia Artificial, que ha conllevado el auge de los lenguajes LISP, PROLOG, Lazy ML (1984), MIRANDA (1985), Standard ML (1986) y Scheme as como el avance de investigaciones sobre procesamiento de lenguajes naturales. La dcada de los noventa se est iniciando con un fuerte impulso de los lenguajes orientados a objetos, de las interfaces grficas de usuario (GUI), de la generacin de cdigo para las CPU paralelas, desarrollo para mltiples plataformas y de los lenguajes visuales [CHAN90, VARH94]. Sobre el desarrollo de compiladores y las probables tendencias en 1994 puede leerse el informe [HAYE94]. La aparicin de Internet y la mquina abstracta JVM (Java Virtual Machine) puede influir notablemente en el desarrollo de compiladores al definirse un cdigo intermedio comn y portable entre distintos sistemas operativos y ordenadores.

Programacin Procedural 2012

21

Asignatura: Programacin Procedural Lic. en Ciencias de la Computacin _ Lic. en Sistemas de Informacin - Departamento de Informtica Facultad de Ciencias Exactas, Fsicas y Naturales - UNSJ

8. Bibliografia: Lenguajes de Programacin Diseo e Implementacin. Pratt Terrence y Marvin Zelkowitz. Editorial Prentice Hall. Hispano americana, S.A. Segunda Edicin. 1987. Programacin Orientada a Objetos. Tcnicas Avanzadas de Programacin. Fontela, Carlos. Buenos Aires. Editorial Nueva Librera. 2003..

Lenguajes de Programacin Principios y Prctica. Louden, Kenneth C. Mexico, D.F. Editorial Thomson. 2004. Desarrollo y evaluacin de tcnicas de construccin de Procesadores de Lenguajes para mquinas abstractas orientadas a objetos. Luengo Dez, Mara. Tesis Doctoral. Universidad de Oviedo. Ao 2002.

http://www.ecured.cu/index.php/Programaci%C3%B3n,_lenguajes_y_paradigmas

Programacin Procedural 2012

22

Vous aimerez peut-être aussi