Está en la página 1de 64

FACULTAD DE INGENIERA E.A.P.

INGENIERA DE SISTEMAS E INFORMTICA

MANUAL DEL CURSO:

Teora de Lenguajes
(Unidad I)
T ema:

Introduccin a la teora de Lenguajes

Dictado por:
DIANA CECILIA MUOZ CASANOVA
M.S. en Ingeniera de Sistemas e Informtica

CHIMBOTE PER 2007

CAPTULO I: HISTORIA DE LOS LENGUAJES DE PROGRAMACIN 1.1. Introduccin 1.2. Historia de los lenguajes de programacin 1.3. Tendencias en los lenguajes de programacin CAPTULO II: EVOLUCIN DE LOS LENGUAJES DE PROGRAMACIN 2.1. Evolucin de los lenguajes de programacin 2.1.1.Estructurados vs. No estructurados 2.1.2.1985-1990 y el nacimiento del xbase 2.1.3.Los primeros aos, 1990-1995: las bases de datos relacionales 2.1.4.La segunda mitad, 1995-2000: la orientacin a objetos 2.1.5.El fin de los lenguajes D.O.S. 2.1.6.2000 y ms all: lenguajes visuales 2.1.7.Una visin a la web y al futuro: html, perl, php, pithon, java y otros 2.2. Generaciones de lenguajes de programacin 2.3. Tipos de lenguaje de programacin segn su campo de aplicacin. 2.4. Tipos de lenguaje de programacin en funcin al estilo de programar 2.5. Lenguajes imperativos 2.6. Lenguajes funcionales 2.6.1.Concepto matemtico de funcin. 2.6.2.Concepto de lenguajes funcionales. 2.6.3.Categoras de lenguajes funcionales. 2.6.4.Problemas del modelo imperativo 2.7. Lenguajes lgicos (declarativos) 2.8. Lenguajes orientados a objetos 2.9. Lenguajes con concurrencia 2.10.Evolucin de los lenguajes de programacin declarativos 2.11.Evolucin de los lenguajes de programacin orientado a objetos e Imperativos 11 11 11 12 12 13 13 14 15 15 16 16 18 18 19 20 20 22 26 27 29 30 2 3 7

CAPTULO III: CONCEPTOS EN LOS LENGUAJES DE PROGRAMACIN 3.1. Qu es lo que constituye un buen lenguaje? 3.1.1.Atributos de un buen lenguaje 3.1.2.Estandarizacin de los lenguajes 3.2. Sintaxis de lenguajes de programacin 3.3. Tipos de datos 3.4. Abstraccin 3.5. Abstraccin en programacin 3.6. Clases de abstraccin 3.6.1.Abstraccin de control 3.6.2.Abstraccin de datos. 31 31 32 32 33 34 34 35 35 37

3.7. Tipos abstractos de datos (TADS) 3.8. Lenguajes de programacin y TADS 3.9. Lenguajes de programacin que deberas aprender 3.9.1.PHP 3.9.2.C# 3.9.3.AJAX 3.9.4.Javascript 3.9.5.PERL 3.9.6.C41 3.9.7.Ruby y ruby on rails 3.9.8.ASP CAPTULO IV: LENGUAJES DE BAJO, MEDIO Y ALTO NIVEL 4.1. Introduccin 4.2. Lenguajes de bajo nivel 4.2.1.Lenguaje mquina. 4.2.2.Ensamblador. A) Ventajas del lenguaje ensamblador B) Desventajas del lenguaje ensamblador 4.3. Lenguajes de medio nivel 4.4. Lenguajes De Alto Nivel 4.5. Generadores de aplicaciones o 4 nivel CAPTULO V: ELEMENTOS DE UN LENGUAJE DE PROGRAMACIN 5.1. 5.2. 5.3. 5.4. 5.5. 5.6. Elementos sintcticos de un lenguaje Tipos de datos Notaciones de expresiones Propiedad asociativa y precedencia Representacin de rbol para expresiones Evaluacin de expresiones 5.6.1.Evaluacin mediante la reconstruccin de un rbol 5.6.2.Evaluacin mediante una pila A) Algoritmo para transformar una notacin infija a postfija B) Tabla de prioridades. C) Algoritmo (pseudocdigo)

37 37 39 39 39 40 40 41 41 42

43 43 44 44 45 48 49 52 53

54 55 56 56 57 57 57 58 58 60 60

CAPTULO I: HISTORIA DE LOS LENGUAJES DE PROGRAMACIN


1.1. INTRODUCCIN Una computadora es una mquina que solo comprende las instrucciones que se le den en un determinado formato. Cada mquina reconoce y ejecuta un nmero de instrucciones diferentes que se agrupan en los distintos lenguajes de programacin. Un lenguaje de programacin es un conjunto limitado de palabras y de smbolos que representan procedimientos, clculos, decisiones y otras operaciones que pueden ejecutar una computadora. A pesar de que en este trabajo parte de la divisin de lenguajes de programacin en imperativos y declarativos (los cuales a su vez se dividen en numerosos subgrupos), la clasificacin ms comn y bsica que suele hacerse de los lenguajes de programacin es la que los divide en lenguajes de bajo y de alto nivel. Los lenguajes de programacin de bajo nivel fueron los primeros que surgieron y se llaman as porque estn directamente relacionados con el hardware del computador, es decir, el usuario introduce una serie de cdigos numricos que la mquina va a interpretar como instrucciones. Para usar este lenguaje, el programador tena que conocer el funcionamiento de la mquina al ms bajo nivel y los errores de programacin eran muy frecuentes. Los lenguajes de alto nivel surgieron con posterioridad con el primer compilador de FORTRAN (FORmula TRANslation), que, como su nombre indica, inici como un "simple" esfuerzo de traducir un lenguaje de frmulas, al lenguaje ensamblador y por consiguiente al lenguaje de mquina, facilitando la labor a los programadores. A partir de FORTRAN, se han desarrollado innumerables lenguajes, que siguen el mismo concepto: facilitar la vida al programador, aumentando la productividad. Estos lenguajes usan un nmero reducido de instrucciones (normalmente en ingls) que siguen unas estrictas reglas gramaticales que se conocen como sintaxis del lenguaje. Pero aunque el programador de esta forma se distancie del hardware del computador, este sigue trabajando en lenguaje mquina. Por ello se hace necesaria una traduccin a una

secuencia de instrucciones interpretables por el computador. Esta labor es llevada a cabo por los compiladores y los intrpretes. El compilador es un programa que se encarga de la traduccin global del programa realizado por el usuario. Esta operacin recibe el nombre de compilacin. El programa es traducido completamente antes de que se ejecute, por lo que la ejecucin se realiza en un periodo muy breve. El intrprete por el contrario lleva a cabo una traduccin inmediata en el momento de la ejecucin, es decir, ir ejecutando las instrucciones una a una haciendo que el proceso requiera un periodo de tiempo sensiblemente mayor del que necesitara un compilador. Los intrpretes son usados para traducir programas de alta dificultad de implementacin, en estos casos, las rdenes a traducir son de tal complejidad que no merece la pena crear un compilador ya que este tambin tendra que ser de una complejidad por encima de lo normal. Hay que mencionar la existencia de lenguajes que combinan caractersticas de los de alto nivel y los de bajo nivel (es decir, Ensamblador). Un ejemplo es C: contiene estructuras de programacin de alto nivel; sin embargo, fue diseado con muy pocas instrucciones, las cuales son sumamente sencillas, fciles de traducir al lenguaje de la mquina; y requiere de un entendimiento apropiado de cmo funciona la mquina, el uso de la memoria, etctera. Por ello, algunos consideran a lenguajes como C (que fue diseado para hacer sistemas operativos), lenguajes de nivel medio, si bien, son considerados mayoritariamente de bajo nivel. 1.2. HISTORIA DE LOS LENGUAJES DE PROGRAMACIN Los primeros lenguajes de programacin surgieron de la idea de Charles Babagge, la cual se le ocurri a este hombre a mediados del siglo XIX. Era un profesor matemtico de la universidad de Cambridge e inventor ingles, que la principio del siglo XIX predijo muchas de las teoras en que se basan los actuales ordenadores. Consista en lo que l denominaba la maquina analtica, pero que por motivos tcnicos no pudo construirse hasta mediados del siglo XX. Con l colaboro Ada Lovedby, la cual es considerada como la primera programadora de la historia, pues realizo programas para aqulla supuesta maquina de Babagge, en tarjetas perforadas. Como la maquina no llego nunca a construirse, los programas de Ada, lgicamente, tampoco llegaron a ejecutarse, pero si suponen un punto de partida

de la programacin, sobre todo si observamos que en cuanto se empez a programar, los programadores utilizaron las tcnicas diseadas por Charles Babagge, y Ada, que consistan entre otras, en la programacin mediante tarjetas perforadas. A pesar de ello, Ada ha permanecido como la primera programadora de la historia. Se dice por tanto que estos dos genios de antao, se adelantaron un siglo a su poca, lo cual describe la inteligencia de la que se hallaban dotados. En 1823 el gobierno Britnico lo apoyo para crear el proyecto de una mquina de diferencias, un dispositivo mecnico para efectuar sumas repetidas. Pero Babagge se dedico al proyecto de la mquina analtica, abandonando la maquina de diferencias, que se pudiera programar con tarjetas perforadas, gracias a la creacin de Charles Jacquard (francs). Este hombre era un fabricante de tejidos y haba creado un telar que poda reproducir automticamente patrones de tejidos, leyendo la informacin codificada en patrones de agujeros perforados en tarjetas de papel rgido. Entonces Babagge intento crear la mquina que se pudiera programar con tarjetas perforadas para efectuar cualquier clculo con una precisin de 20 dgitos. Pero la tecnologa de la poca no bastaba para hacer realidad sus ideas. Si bien las ideas de Babagge no llegaron a materializarse de forma definitiva, su contribucin es decisiva, ya que los ordenadores actuales responden a un esquema anlogo al de la mquina analtica. En su diseo, la mquina constaba de cinco unidades bsicas: 1) Unidad de entrada, para introducir datos e instrucciones. 2) Memoria, donde se almacenaban datos y resultados intermedios. 3) Unidad de control, para regular la secuencia de ejecucin de las operaciones. 4) Unidad Aritmtico-Lgica, que efecta las operaciones. 5) Unidad de salida, encargada de comunicar al exterior los resultados. Charles Babbage, conocido como el "padre de la informtica" no pudo completar en aquella poca la construccin del computador que haba soado, dado que faltaba algo fundamental: la electrnica. El camino sealado de Babbage, no fue nunca abandonado y siguindolo, se construyeron las primeras computadoras. Al desarrollarse las primeras computadoras electrnicas, se vio la necesidad de programarlas, es decir, de almacenar en memoria la informacin sobre la tarea que iban a ejecutar. Las primeras se usaban como calculadoras simples; se les indicaban los pasos de clculo, uno por uno.

John Von Neumann desarroll el modelo que lleva su nombre, para describir este concepto de "programa almacenado". En este modelo, se tiene una abstraccin de la memoria como un conjunto de celdas, que almacenan simplemente nmeros. Estos nmeros pueden representar dos cosas: los datos, sobre los que va a trabajar el programa; o bien, el programa en s. Cmo es que describimos un programa como nmeros? Se tena el problema de representar las acciones que iba a realizar la computadora, y que la memoria, al estar compuesta por switches correspondientes al concepto de bit, solamente nos permita almacenar nmeros binarios. La solucin que se tom fue la siguiente: a cada accin que sea capaz de realizar nuestra computadora, asociarle un nmero, que ser su cdigo de operacin (opcode). Por ejemplo, una calculadora programable simple podra asignar los opcodes: 1 = SUMA, 2 = RESTA, 3 = MULTIPLICA, 4 = DIVIDE. Supongamos que queremos realizar la operacin 5 * 3 + 2, en la calculadora descrita arriba. En memoria, podramos "escribir" el programa de la siguiente forma: Localidad Opcode Significado Comentario 0 5 5 En esta localidad, tenemos el primer nmero de la frmula 1 3 * En esta localidad, tenemos el opcode que representa la multiplicacin. 2 3 3 En esta localidad, tenemos el segundo nmero de la frmula 3 1 + En esta localidad, tenemos el opcode que representa la suma. 4 2 2 En esta localidad, tenemos el ltimo nmero de la frmula. Podemos ver que con esta representacin, es simple expresar las operaciones de las que es capaz el hardware (en este caso, nuestra calculadora imaginaria), en la memoria. La descripcin y uso de los opcodes es lo que llamamos lenguaje de mquina. Es decir, la lista de cdigos que la mquina va a interpretar como instrucciones, describe las capacidades de programacin que tenemos de ella; es el lenguaje ms primitivo, depende directamente del hardware, y requiere del programador que conozca el funcionamiento de la mquina al ms bajo nivel. Los lenguajes ms primitivos fueron los lenguajes de mquina. Esto, ya que el hardware se desarroll antes del software, y adems cualquier software finalmente tiene que expresarse en el lenguaje que maneja el hardware. La programacin en esos momentos era sumamente tediosa, pues el programador tena que "bajarse" al nivel de la mquina y decirle, paso a pasito, cada punto de la

tarea que tena que realizar. Adems, deba expresarlo en forma numrica; y por supuesto, este proceso era propenso a errores, con lo que la productividad del programador era muy limitada. Sin embargo, hay que recordar que en estos momentos, simplemente an no exista alternativa. El primer gran avance que se dio, fue la abstraccin dada por el Lenguaje Ensamblador, y con l, el nacimiento de las primeras herramientas automticas para generar el cdigo mquina. Esto redujo los errores triviales, como poda ser el nmero que corresponda a una operacin, que son sumamente engorrosos y difciles de detectar, pero fciles de cometer. Sin embargo, an aqu es fcil para el programador perderse y cometer errores de lgica, pues debe bajar al nivel de la forma en que trabaja el CPU, y entender bien todo lo que sucede dentro de l. Con el desarrollo en los 50s y 60s de algoritmos de ms elevado nivel, y el aumento de poder del hardware, empezaron a entrar al uso de computadoras cientficos de otras ramas; ellos conocan mucho de Fsica, Qumica y otras ramas similares, pero no de Computacin, y por supuesto, les era sumamente complicado trabajar con lenguaje Ensamblador en vez de frmulas. As, naci el concepto de Lenguaje de Alto Nivel, con el primer compilador de FORTRAN (FORmula TRANslation), que, como su nombre indica, inici como un "simple" esfuerzo de traducir un lenguaje de frmulas, al lenguaje ensamblador y por consiguiente al lenguaje de mquina. A partir de FORTRAN, se han desarrollado innumerables lenguajes, que siguen el mismo concepto: buscar la mayor abstraccin posible, y facilitar la vida al programador, aumentando la productividad, encargndose los compiladores o intrpretes de traducir el lenguaje de alto nivel, al lenguaje de computadora. Hay que notar la existencia de lenguajes que combinan caractersticas de los de alto nivel y los de bajo nivel (es decir, Ensamblador). El ejemplo mas apropiado podra ser el lenguaje C ya que puede acceder a los registros del sistema, trabajar con direcciones de memoria, todas ellas caractersticas de lenguajes de bajo nivel y a la vez realizar operaciones de alto nivel.

1.3. TENDENCIAS EN LOS LENGUAJES DE PROGRAMACIN El estudio de los lenguajes de programacin agrupa tres intereses diferentes; el del programador profesional, el del diseador del lenguaje y del Implementador del lenguaje. Adems, estos tres trabajos han de realizarse dentro de las ligaduras y capacidades de la organizacin de una computadora y de las limitaciones fundamentales de la propia "calculabilidad".
El termino "el programador" es un tanto amorfo, en el sentido de que camufla

importantes diferencias entre distintos niveles y aplicaciones de la programacin. Claramente el programador que ha realizado un curso de doce semanas en COBOL y luego entra en el campo del procesamiento de datos es diferente del programador que escribe un compilador en Pascal, o del programador que disea un experimento de inteligencia artificial en LISP, o del programador que combina sus rutinas de FORTRAN para resolver un problema de ingeniera complejo, o del programador que desarrolla un sistema operativo multiprocesador en ADA.
El "diseador del lenguaje" es tambin un termino algo nebuloso. Algunos

lenguajes (como APL y LISP) fueron diseados por una sola persona con un concepto nico, mientras que otros (FORTRAN y COBOL) son el producto de desarrollo de varios aos realizados por comits de diseo de lenguajes.
El "Implementador del lenguaje" es la persona o grupo que desarrolla un

compilador o interprete para un lenguaje sobre una maquina particular o tipos de maquinas. Mas frecuentemente, el primer compilador para el lenguaje Y sobre la maquina X es desarrollada por la corporacin que manufactura la maquina X. Por ejemplo, hay varios compiladores de Fortran en uso; uno desarrollado por IBM para una maquina IBM, otro desarrollado por DEC para una maquina DEC, otro por CDC, y as sucesivamente. Las compaas de software tambin desarrollan compiladores y tambin lo hacen los grupos de investigacin de las universidades Hay tambin muchos aspectos compartidos entre los programadores, diseadores de un lenguaje implementadores del mismo. Cada uno debe comprender las necesidades y ligaduras que gobiernan las actividades de los otros dos.

Hay, al menos, dos formas fundamentales desde las que pueden verse o clasificarse los lenguajes de programacin: por su nivel y por principales aplicaciones. Adems, estas visiones estn condicionadas por la visin histrica por la que ha transcurrido el lenguaje
Los "Lenguajes Declarativos" son los ms parecidos al castellano o ingles en su potencia expresiva y funcionalidad estn en el nivel mas alto respecto a los otros. Son fundamentalmente lenguajes de ordenes, dominados por sentencias que expresan "Lo que hay que hacer" en ves de "Como hacerlo". Los lenguajes de " Alto Nivel" son los mas utilizados como lenguaje de programacin. Aunque no son fundamentalmente declarativos, estos lenguajes permiten que los algoritmos se expresen en un nivel y estilo de escritura fcilmente legible y comprensible por otros programadores. Los "Lenguajes Ensambladores" y los "Lenguajes Maquina" son dependientes de la maquina. Cada tipo de maquina, tal como VAX de digital, tiene su propio lenguaje maquina distinto y su lenguaje ensamblador asociado. El lenguaje Ensamblador es simplemente una representacin simblica del lenguaje maquina asociado, lo cual permite una programacin menos tediosa que con el anterior. La programacin de un lenguaje de alto nivel o en un lenguaje ensamblador requiere, por tanto, algn tipo de interfaz con el lenguaje maquina para que el programa pueda ejecutarse. Las tres interfaces mas comunes: un "ensamblador" , un "compilador" y un "interprete". El ensamblador y el compilador traduce el programa a otro equivalente en el lenguaje X de la maquina "residente" como un paso separado antes de la ejecucin. Por otra parte, el interprete ejecuta directamente las instrucciones en un lenguaje Y de alto nivel, sin un paso de procesamiento previo. Algunos lenguajes son lenguajes principalmente interpretados, como APL, PROLOG y LISP. El resto de los lenguajes -- Pascal, FORTRAN, COBOL, PL/I, SNOBOL, C, Ada y Modula-2 son normalmente lenguajes compilados. En algunos casos, un compilador estar utilizable alternativamente para un lenguaje interpretado (tal como LISP) e inversamente (tal como el interprete SNOBOL4 de los laboratorios Bell). Frecuentemente la interpretacin es preferible a la compilacin en un entorno de programacin experimental o de educacin, donde cada nueva ejecucin de un programa implicado un cambio en el propio texto del programa. La calidad de diagnosis y depuracin que soportan los lenguajes interpretados es generalmente mejor que la de los lenguajes compilados, puesto que los mensajes de error se refieren directamente a sentencias del texto del programa original. Adems, la ventaja de la eficiencia que se adjudica tradicionalmente a los lenguajes compilados frente a los interpretados puede pronto ser

eliminado, debido a la evolucin de las maquinas cuyos lenguajes son ellos mismos1lenguajes de alto nivel. Como ejemplo de estos estn las nuevas maquinas LISP, las cuales han sido diseadas recientemente por Symbolics y Xerox Corporations. Los lenguajes de Programacin son tomados de diferentes perspectivas. Es importante para un programador decidir cuales conceptos emitir o cuales incluir en la programacin. Con frecuencia el programador es osado a usar combinaciones de conceptos que hacen al lenguaje "DURO" de usar, de entender e implementar. Cada programador tiene en mente un estilo particular de programacin, la decisin de incluir u omitir ciertos tipos de datos que pueden tener una significativa influencia en la forma en que el Lenguaje es usado, la decisin de usar u omitir conceptos de programacin o modelos. Existen cinco estilo de programacin y son los siguientes:

1. Imperativa : Entrada, procesamiento y salidas de Datos. 2. Funcional : "Funciones", los datos son funciones, los resultados pueden ser un valor
o una funcin.

3. Lgico : {T,F} + operaciones lgicos (Inteligencia Artificial). 4. Orientados a Objetos: Clases, encapsulamiento de datos Herencia de datos,
polimorfismo

5. Concurrente.
El programador, diseador e implementador de un lenguaje de programacin deben comprender la evolucin histrica de los lenguajes para poder apreciar por que presentan caractersticas diferentes. Por ejemplo, los lenguajes "mas jvenes" desaconsejan (o prohiben) el uso de las sentencias GOTO como mecanismo de control inferior, y esto es correcto en el contexto de las filosofas actuales de ingeniera del software y programacin estructurada. Pero hubo un tiempo en que la GOTO, combinada con la IF, era la nica estructura de control disponible; el programador no dispone de algo como la construccin WHILE o un IF-THEN-ELSE para elegir. Por tanto, cuando se ve un lenguaje como FORTRAN, el cual tiene sus races en los comienzos de la historia de los lenguajes de programacin, uno no debe sorprenderse de ver la antigua sentencia GOTO dentro de su repertorio. Lo mas importante es que la historia nos permite ver la evolucin de familias de lenguajes de programacin, ver la influencia que ejercer las arquitecturas y aplicaciones de las computadoras sobre el diseo de lenguajes y evitar futuros defectos de diseo aprendido las lecciones del pasado. Los que estudian se han elegido debido a su mayor influencia y amplio uso entre los programadores, as como por sus distintas caractersticas de diseo e implementacion. Colectivamente cubren los aspectos ms importantes con los

que ha de enfrentarse el diseado de lenguajes y la mayora de las aplicaciones con las que se enfrenta el programador. Tambin varios lenguajes estn prefijados por las letras ANSI. Esto significa que el American National Standards Institute ha adoptado esa versin del lenguaje como el estndar nacional. Una vez que un lenguaje esta estandarizado, las maquinas que implementan este lenguaje deben cumplir todas las especificaciones estndares, reforzando as el mximo de transportabilidad de programas de una maquina a otra. La polica federal de no comprar maquinas que no cumplan la versin estndar de cualquier lenguaje que soporte tiende a "fortalecer" el proceso de estandarizacion, puesto que el gobierno es, con mucho, el mayor comprador de computadoras de la nacin. Finalmente, la notacin algebraica ordinaria, por ejemplo, influyo fuertemente en el diseo de FORTRAN y ALGOL. Por otra parte, el ingles influyo en el desarrollo del COBOL. El lambda calculo de Church dio los fundamentos de la notacin funcional de LISP, mientras que el algoritmo de Markov motivo el estilo de reconocimiento de formas de SNOBOL. La arquitectura de computadoras de Von Neumann, la cual fue una evolucin de la maquina mas antigua de Turing, es el modelo bsico de la mayora de los diseos de computadoras de las ultimas tres dcadas. Esta maquina no solo influyeron en los primeros lenguajes sino que tambin suministraron el esqueleto operacional sobre el que evoluciono la mayora de la programacin de sistemas. Una discusin mas directa de todos estos primeros modelos no estn entre los objetivos de este texto. Sin embargo, es importante apuntar aqu debido a su fundamental influencia en la evolucin de los primeros lenguajes de programacin, por una parte, y por su estado en el ncleo de la teora de la computadora, por otra. Mas sobre este punto, cualquier algoritmo que pueda describirse en ingles o castellano puede escribirse igualmente como una maquina de Turing (maquina de Von Neumann), un algoritmo de Markov o una funcin recursiva. Esta seccin, conocida ampliamente como "tesis de Church", nos permite escribir algoritmos en distintos estilos de programacin (lenguajes) sin sacrificar ninguna medida de generalidad, o potencia de programacin, en la transicin.

CAPTULO II: EVOLUCIN DE LOS LENGUAJES DE PROGRAMACIN


2.1. EVOLUCIN DE LOS LENGUAJES DE PROGRAMACIN 2.1.1.ESTRUCTURADOS VS. NO ESTRUCTURADOS A partir de C el gran lenguaje, y Pascal; se dividen los lenguajes en estructurados (aquellos que en su codificacin usaban una estructura jerrquica de procedimientos y funciones), en contraposicin a los lenguajes no estructurados como el Basic cuya codificacin se basaba en lneas de programacin, permitiendo al programador "saltar" de una lnea de instruccin a otra, haciendo que el cdigo fuera algunas veces inentendible y muy difcil de mantener (modificar) porque no segua una estructura. Basic de todos modos evolucion, primero con el ahora primitivo GW Basic, teniendo su mxima expresin con el Quick Basic del D.O.S. 5.0, el cual ya inclua algunos conceptos mas de avanzada y ms "aggiornados" a lo que eran sus contrapartes estructuradas. 2.1.2.1985-1990 Y EL NACIMIENTO DEL XBASE DBase fue el gran desarrollo para base de datos de los aos 80. Bajo la batuta de la firma Ashton Tate, empresa que dio origen a un interprete de bases de datos muy sencillo y poderoso: dBbase II. Luego vinieron el dBase III+ que hizo furor, y la etapa de la decadencia para dBase: el dBase IV, ya bajo la direccin de Borland. As surgi el gran compilador Clipper, de Nantucket Corp., en su versin Autumm 86 que permita generar ejecutables libres de royalties y sin runtimes, incluso tomando en forma directa el cdigo dBase. Pero no solo era eso, proveia cientos de comandos y funciones para potenciar al dBase. Al ver el xito de dBase y Clipper, surgi la empresa Fox Software que desarrollo el FoxBase (un clon de dBase III+) y supero al "maestro" con su versin Fox Plus, pero aun as, nunca pudo superar a Clipper ya que siempre lidio con su poltica de necesitar de runtimes para su ejecucin, cosa que Clipper nunca necesit.

2.1.3.LOS

PRIMEROS

AOS,

1990-1995:

LAS

BASES

DE

DATOS

RELACIONALES A principios de la dcada pasada, se nota la evolucin de los lenguajes de programacin. En forma profesional y aplicaciones de alto nivel, el lenguaje preferido era C. Para el aprendizaje se usaba Pascal, que permita inculcar el concepto de programacin estructurada. Tambin Basic, era un lenguaje utilizado, no en pocas ocasiones en forma profesional, aunque con ciertas limitaciones; su reinado estuvo en los aos 80. En lenguaje C, fue y todava es el gran artfice de la computacin actual. A partir de el se desarrollaron compiladores que realmente constituan otros lenguajes de programacin. Es decir un lenguaje que crea otros lenguajes. Tal es el caso de la estrella de la primera mitad de la dcada pasada: Clipper de Nantucket Corp., el gran compilador de lenguaje Xbase. Clipper fue criticado por los profesionales de la programacin quienes aducan que no era un lenguaje, sino un simple compilador nacido de la necesidad de aligerar la ejecucin de cdigo del Interprete que le dio su origen, es decir el dBase. Pero realmente Clipper, gracias a llevar dentro su cdigo un corazn de lenguaje C, fue muy fcil de utilizar y alcanzo gran popularidad. Se desarrollaron librera externas, y con la programacin al estilo C a partir de su versin 5.0 y la inclusin de objetos, se convirti en uno de los favoritos de la programacin administrativa, junto con Pascal. Todos los lenguajes Xbase se basaban en el concepto de bases de datos relacionales, es decir la agrupacin de la informacin en forma de tablas, denominadas campos y registros, cada uno de ellos preformateados para recibir cierto tipo de dato (ej: fechas, caracteres, nmeros, valores lgicos, etc.); pudiendo "unir" diferentes bases por medio de campos comunes. 2.1.4.LA SEGUNDA MITAD, 1995-2000: LA ORIENTACIN A OBJETOS A medida que los aos van pasando el concepto de Bases relacionales empieza a decaer relativamente, surge entonces una variante que se aplica a todos los lenguajes: La orientacin a objetos. Ya no solo se habla de programacin estructurada, sino que los mdulos de programacin son vistos como objetos, las estructuras representan objetos y/o funciones que se adaptan en forma

general a procesos especficos es la maximizacin de la programacin modular. El modelo de objetos engloba los conceptos de encapsulacin, herencia y poliformismo, el cual se aplica a los datos y al tipo de bases de datos que almacena la informacin. La orientacin a objetos significa la agrupacin de entidades de datos de forma global, de tal manera que puedan ser interpretados de una forma comn por una misma estructura de programacin. 2.1.5.EL FIN DE LOS LENGUAJES D.O.S. Windows 95 marca el comienzo del fin de la programacin D.O.S. y por lo tanto de los lenguajes basados en este. Este proceso no fue enrgico, todava hoy, estamos viviendo esta etapa. Todava hay numerosos y excelentes sistemas desarrollados bajo entorno D.O.S. ejecutndose pero cada vez son los menos. Veamos que hicieron los lenguajes D.O.S. para mantenerse en el mercado: Clipper trato de evolucionar hacia Windows bajo la batuta de Computer Associates con el nombre de Visual Objects, el cual fue un fracaso. Al igual que Visual Dbase 5.0 bajo la rbita de Borland. Los nicos "sobrevivientes" al menos en esencia son Visual Fox (Microsoft), Visual Basic (Microsoft), Delphi (Borland) y Visual C (Microsoft) 2.1.6.2000 Y MS ALL: LENGUAJES VISUALES Con al llegada de Windows todo es Visual, todo es iconos, todo es botones, todo es Ventanas. Para programar en lenguajes visuales, primero hay que comprender lo que es Windows. La forma de programar los sistemas evolucion radicalmente. Con Windows es preciso programar conservando las convenciones del mismo, guardando sus caractersticas y funcionalidades. Los sistemas hechos para Windows, deben ser tan Windows como el propio sistema operativo. La forma de programar se basa en objetos, cada uno de los cuales tiene sus Propiedades y funciones. Se basa en la programacin de eventos para dichos objetos. Otro detalle es que la programacin se basa en componentes (OLE, OCX, ActiveX), los cuales reducen notablemente el trabajo de la

programacin al proporcionar herramientas antes impensadas en la programacin D.O.S. Todos los lenguajes visuales ofrecen RAD (Rapid Aplication Development) o Wizzards; con lo cual comenzaron a prometer hacer aplicaciones en poco tiempo, incluso para inexpertos. Lejos estaban ya los tiempos en que programar era solo usar un simple editor de textos. Ahora las herramientas de programacin son poderosas. Son casi un sistema operativo, por asi decirlo; con entornos de desarrollo avanzado y excelentes Debuggers. Las incursiones cada vez mas innovadoras de Microsoft parecen imponer a la web como el centro de desarrollo de aplicaciones: Microsoft .NET 2.1.7.UNA VISIN A LA WEB Y AL FUTURO: HTML, PERL, PHP, PITHON, JAVA Y OTROS Internet ha sido el disparador de nuevos lenguajes tales como el HTML que es el lenguaje de programacin de las pginas WEB para hipertexto. El mismo constituye una codificacin bastante simple, basada en marcadores (TAGs). De la misma manera, cuando se hace necesario proveer de funciones adicionales a un servicio web se recurre a Perl o a Pithon que son lenguajes que nos permiten escribir scripts para ser alojados en los servidores a efectos de proveer contadores, estadsticas, rankings, etc. Por otra parte Java, bajo la direccin de SUN, constituye la idea de la programacin abierta y universal para las aplicaciones de escritorio, pero todava los estndares visuales (C, Basic y Delphi), son demasiado poderosos como para desplazarlos, a pesar de que Java promete tambin ser un lenguaje de excelentes prestaciones. Las nuevas tecnologas WEB inundan el mercado: PHP, ASP, XML, DHTML, XHTML, AJAX lo cual enriquecen la forma de manejar la informacin y su presentacin al usuario final.

2.2. GENERACIONES DE LENGUAJES DE PROGRAMACIN La evolucin de los lenguajes de programacin se puede dividir en 5 etapas o generaciones. 1. Primera generacin: lenguaje maquina. 2. Segunda generacin: se crearon los primeros lenguajes ensambladores. 3. Tercera generacin: se crean los primeros lenguajes de alto nivel. Ej. C, Pascal, Cobol 4. Cuarta generacin. Son los lenguajes capaces de generar cdigo por si solos, son los llamados RAD, con lo cuales se pueden realizar aplicaciones sin ser un experto en el lenguaje. Aqu tambin se encuentran los lenguajes orientados a objetos, haciendo posible la reutilizacin d partes del cdigo para otros programas. 5. Quinta generacin: aqu se encuentran los lenguajes orientados a la inteligencia artificial.. Ej. PROLOG 2.3. TIPOS DE LENGUAJE DE PROGRAMACIN SEGN SU CAMPO DE APLICACIN.
Aplicaciones cientficas.

En este tipo de aplicaciones predominan las operaciones numricas o matriciales propias de algoritmos matemticos. Lenguajes adecuados son FORTRAN y PASCAL
Aplicaciones en procesamiento de datos.

En estas aplicaciones son frecuentes las operaciones de creacin, mantenimiento y consulta sobre ficheros y bases de datos. Dentro de este campo estaran aplicaciones de gestin empresarial, como programas de nominas, contabilidad facturacin, control de inventario, etc. Lenguajes aptos para este tipo de aplicaciones son COBOL y SQL.
Aplicaciones de tratamiento de textos.

Estas aplicaciones estn asociadas al manejo de textos en lenguaje natural. Un lenguaje muy adecuado para este tipo de aplicaciones es el C.

Aplicaciones en inteligencia artificial.

Dentro de este campo, destacan las aplicaciones en sistemas expertos, juegos, visin artificial, robtica. Los lenguajes ms populares dentro del campo de la inteligencia artificial son LISP y PROLOG
Aplicaciones de programacin de sistemas.

En este campo se incluiran la programacin de software de interfaz entre el usuario y el hardware, como son los mdulos de un sistema operativo y los traductores. Tradicionalmente para estas aplicaciones se utilizaba el Ensamblador, no obstante en la actualidad se muestran muy adecuados los lenguajes ADA, MODULA-2 y C.
Lenguajes de Internet.

HTML, JAVA, Perl, PHP, etc 2.4. TIPOS DE LENGUAJE DE PROGRAMACIN EN FUNCIN AL ESTILO DE PROGRAMAR
Lenguajes imperativos Lenguajes funcionales Lenguajes lgicos (declarativos) Lenguajes orientados a objetos Lenguajes con concurrencia

2.5. LENGUAJES IMPERATIVOS En este tipo de lenguajes, cuyo origen est ligado a la propia arquitectura de von Neumann, la arquitectura consta de una secuencia de celdas, llamadas memoria, en la cual se pueden guardar en forma codificada, lo mismo datos que instrucciones; y de un procesador, el cual es capaz de ejecutar de manera secuencial una serie de operaciones, principalmente aritmticas y booleanas, llamadas comandos. En general, un lenguaje imperativo ofrece al programador conceptos que se traducen de forma natural al modelo de la mquina.Los

lenguajes imperativos ms destacados de la historia han sido: FORTRAN, Algol, Pascal, C, Modula-2, Ada El programador, al utilizar un lenguaje imperativo, por lo general tiene que traducir la solucin abstracta del problema a trminos muy primitivos, cercanos a la mquina. La distancia entre el nivel del razonamiento humano y lo expresable por los lenguajes imperativos causa que sus programas sean ms "comprensibles" para la mquina que para el hombre. Esta desventaja para nosotros, reflejada en la dificultad que tenemos al construir programas en un lenguaje imperativo, se vuelve una ventaja en el momento de la generacin del cdigo. El programa est expresado en trminos tan cercanos a la mquina, que el cdigo generado es relativamente parecido al programa original, lo que permite cierta eficiencia en la ejecucin. Ejemplo: Este sera el cdigo de un programa que determina el factorial de un nmero en un lenguaje imperativo inventado: procedimiento factorial(entero n){ entero resultado = 1; mientras (n > 0) { resultado = resultado * n; n = n - 1; } devuelve resultado; } Este procedimiento (o funcin) recibe un nmero entero n. Declara una variable resultado que ser el resultado final a devolver. Inicialmente, tiene como valor el 1. Despus llega una estructura de control denominada bucle, que se ejecuta mientras la condicin expresada entre los parntesis (n > 0) sea cierta. Dentro del bucle se multiplica la variable resultado por n y el valor se deja de nuevo en resultado. La siguiente sentencia (n = n - 1) es necesaria para ir haciendo el factorial, as como para salir en algn momento del bucle. Por ltimo, tras salir del bucle ya podemos devolver el valor final, que estar en la variable resultado. Ntese que, si en un principio, la variable n es 0, no se entrar en el bucle al no ser

cierta la condicin, por lo que pasara directamente a devolver la variable resultado, que tiene valor inicial 1 (0! = 1). 2.6. LENGUAJES FUNCIONALES 2.6.1.CONCEPTO MATEMTICO DE FUNCIN. Puede ser definida como una correspondencia entre dos variables, una llamada variable dependiente y otra llamada variable dependiente. Veamos la siguiente notacin: y = f(x) Donde: y: Es la variable dependiente de la funcin. Se le llama dependiente porque para que pueda tomar un valor, depende de los valores que pueda tomar la variable x. Tambin podemos decir que y esta en funcin de x. x: Es la variable independiente de la funcin. Se dice que es independiente ya que puede tomar los valores que quiera y no hay nada que se lo impida; o sea, tiene independencia. f: Se puede decir que es el procedimiento o ecuacin que tomar a x para devolverle un valor a y. Veamos una funcin muy comn: y = x2 + x La funcin anterior tiene a y como variable dependiente y a x como variable independiente, y el procedimiento es elevar a x (variable independiente) al cuadrado y sumarle x. Por cada valor que tome x, a y le corresponder otro. Tambin podemos tener una funcin con ms de una variable dependiente... y = x + z 1 / (w + 3) En el sistema anterior podemos encontrar que la variable dependiente (en este caso y) esta en funcin de 3 variables independientes (en este caso x, z, w). Generalmente en las matemticas las variables dependientes estn representadas por la letra y, aunque tambin las podemos representar con letras como z, w, x, g, etc. siempre y cuando sean diferentes de las variables

independientes; as mismo, la o las variables independientes se pueden representar de la misma forma, teniendo en cuenta que no deben ser iguales a las dependientes. 2.6.2.CONCEPTO DE LENGUAJES FUNCIONALES. Los matemticos desde hace un buen tiempo estn resolviendo problemas usando el concepto de funcin. Una funcin convierte ciertos datos en resultados. Si supiramos cmo evaluar una funcin, usando la computadora, podramos resolver automticamente muchos problemas. As pensaron algunos matemticos, que no le tenan miedo a la mquina, e inventaron los lenguajes de programacin funcionales. Adems, aprovecharon la posibilidad que tienen las funciones para manipular datos simblicos, y no solamente numricos, y la propiedad de las funciones que les permite componer, creando de esta manera, la oportunidad para resolver problemas complejos a partir de las soluciones a otros ms sencillos. Tambin se incluy la posibilidad de definir funciones recursivamente. Un lenguaje funcional ofrece conceptos que son muy entendibles y relativamente fciles de manejar para todos los que no se durmieron en las clases de matemticas. El lenguaje funcional ms antiguo, y seguramente el ms popular hasta la fecha, es LISP, diseado por McCarthy en la segunda mitad de los aos 50. Su rea de aplicacin es principalmente la Inteligencia Artificial. En la dcada de los 80 hubo una nueva ola de inters por los lenguajes funcionales, aadiendo la tipificacin y algunos conceptos modernos de modularizacin y polimorfismo, como es el caso del lenguaje ML. Programar en un lenguaje funcional significa construir funciones a partir de las ya existentes. Por lo tanto es importante conocer y comprender bien las funciones que conforman la base del lenguaje, as como las que ya fueron definidas previamente. De esta manera se pueden ir construyendo aplicaciones cada vez ms complejas. La desventaja de este modelo es que resulta bastante alejado del modelo de la mquina de Von Neumann y, por lo tanto, la eficiencia de ejecucin de los intrpretes de lenguajes funcionales no es comparable con la ejecucin de los programas imperativos precompilados. Para remediar la deficiencia, se est buscando utilizar arquitecturas paralelas

que mejoren el desempeo de los programas funcionales, sin que hasta la fecha estos intentos tengan un impacto real importante. 2.6.3.CATEGORAS DE LENGUAJES FUNCIONALES. Existen dos categoras de lenguajes funcionales: los funcionales puros y los hbridos, La diferencia entre ambos estriba en que los lenguajes funcionales hbridos son menos dogmticos que los puros, al admitir conceptos tomados de los lenguajes imperativos, como las secuencias de instrucciones o la asignacin de variables. En contraste, los lenguajes funcionales puros tienen una mayor potencia expresiva, conservando a la vez su transparencia referencial, algo que no se cumple siempre con un lenguaje funcional hbrido. Entre los lenguajes funcionales puros, cabe destacar a Haskell y Miranda. Los lenguajes funcionales hbridos ms conocidos son Lisp, Scheme, Ocaml y Standard ML (estos dos ltimos, descendientes del lenguaje ML). 2.6.4.PROBLEMAS DEL MODELO IMPERATIVO Los programas escritos en lenguajes de programacin tradicionales (imperativo) como Pascal, C, ADA, etc. forman una abstraccin de la mquina de Von-Neumann caracterizada por:
Memoria Principal para almacenamiento de datos y cdigo mquina. Unidad Central de Proceso con una serie de registros de almacenamiento

temporal y un conjunto instrucciones de clculo aritmtico, modificacin de registros y acceso a la Memoria Principal. Los programas imperativos estn formados por una serie de datos globales y un conjunto de instrucciones cdigo. Estos dos elementos forman una abstraccin de los datos y cdigo de la memoria principal. El programador trabaja en un nivel cercano a la mquina lo que le permite generar programas eficientes. Con esta proximidad aparece, sin embargo, una dependencia entre el algoritmo y la arquitectura que impide, por ejemplo, utilizar algoritmos programados para arquitecturas secuenciales en arquitecturas paralelas. Los algoritmos escritos en lenguajes imperativos se expresan mediante una secuencia de instrucciones que modifican el estado de un programa accediendo

a los datos globales de la memoria. En este punto es donde empiezan los problemas: Ejemplo Program prueba; var flag:boolean; function f (n: integer):integer; begin flag:=not flag; if flag then f:=n; else f:=2*n; end; ........ --Programa principal begin flag:=true; ...... write(f(1)); write(f(1)); ....... write(f(1) + f(2)); write(f(2) + f(1)); retorna 4 retorna 5 retorna 2 retorna 1

En el primer caso la expresin f(1) retorna valores diferentes dependiendo de la secuencia de ejecucin y en el segundo no se cumplen propiedades matemticas simples tales como la conmutatividad. Estos ejemplos ponen en evidencia que ciertas caractersticas de los lenguajes imperativos tales como la asignacin pueden traer consigo efectos laterales inesperados que oscurecen la semntica del programa; en consecuencia se hace difcil demostrar que los programas cumplen con los requerimientos especificados y que estn libres de errores. Este y otros problemas son inherentes al modelo computacional utilizado, por ende una solucin factible de ser aplicada puede ser cambiar el modelo

computacional. Entre otras alternativas se encuentran el modelo funcional o aplicativo cuyo objetivo es describir los problemas mediante funciones matemticas sin efectos laterales, y el modelo lgico o declarativo que describe los problemas mediante relaciones entre objetos o entidades. 2.7. LENGUAJES LGICOS (DECLARATIVOS) Otra forma de razonar para resolver problemas en matemticas se fundamenta en la lgica de primer orden. El conocimiento bsico de las matemticas se puede representar en la lgica en forma de axiomas, a los cuales se aaden reglas formales para deducir cosas verdaderas (teoremas) a partir de los axiomas. Gracias al trabajo de algunos matemticos, de finales de siglo pasado y principios de ste, se encontr la manera de automatizar computacionalmente el razonamiento lgico -particularmente para un subconjunto significativo de la lgica de primer ordenque permiti que la lgica matemtica diera origen a otro tipo de lenguajes de programacin, conocidos como lenguajes lgicos. Tambin se conoce a estos lenguajes, y a los funcionales, como lenguajes declarativos, porque el programador, parar solucionar un problema, todo lo que tiene que hacer es describirlo va axiomas y reglas de deduccin en el caso de la programacin lgica y va funciones en el caso de la programacin funcional. En los lenguajes lgicos se utiliza el formalismo de la lgica para representar el conocimiento sobre un problema y para hacer preguntas que, si se demuestra que se pueden deducir a partir del conocimiento dado en forma de axiomas y de las reglas de deduccin estipuladas, se vuelven teoremas. As se encuentran soluciones a problemas formulados como preguntas. Con base en la informacin expresada dentro de la lgica de primer orden, se formulan las preguntas sobre el dominio del problema y el intrprete del lenguaje lgico trata de encontrar la respuesta automticamente. El conocimiento sobre el problema se expresa en forma de predicados (axiomas) que establecen relaciones sobre los smbolos que representan los datos del dominio del problema. En el caso de la programacin lgica, el trabajo del programador se restringe a la buena descripcin del problema en forma de hechos y reglas. A partir de sta se pueden encontrar muchas soluciones dependiendo de como se formulen las preguntas (metas), que tienen sentido para el problema. Si el programa est bien

definido, el sistema encuentra automticamente las respuestas a las preguntas formuladas. En este caso ya no es necesario definir el algoritmo de solucin, como en la programacin imperativa, en cambio, lo fundamental aqu es expresar bien el conocimiento sobre el problema mismo. En programacin lgica, al igual que en programacin funcional, el programa, en este caso los hechos y las reglas, estn muy alejados del modelo von Neumann que posee la mquina en la que tienen que ser interpretados; por lo tanto, la eficiencia de la ejecucin no puede ser comparable con la de un programa equivalente escrito en un lenguaje imperativo. Sin embargo, para cierto tipo de problemas, la formulacin del programa mismo puede ser mucho ms sencilla y natural (para un programador experimentado, por supuesto).
PROLOG

Prolog, proveniente del francs Programation et Logique, sus orgenes se remotan a los inicios de la dcada de los 70 con los trabajos del grupo de A. Colmerauer en Marsella, Francia. Es un lenguaje de programacin lgico e interpretado, bastante popular en el medio de investigacin en Inteligencia Artificial.
Historia

Se trata de un lenguaje de programacin ideado a principios de los aos 70 en la universidad de Aix-Marseille por los profesores Alain Colmerauer y Phillipe Roussel. Inicialmente se trataba de un lenguaje totalmente interpretado hasta que, a mediados de los 70, David H.D. Warren desarroll un compilador capaz de traducir Prolog en un conjunto de instrucciones de una mquina abstracta denominada Warren Abstract Machine, o abreviadamente, WAM. Desde entonces Prolog es un lenguaje semi-interpretado. Prolog se enmarca en el paradigma de los lenguajes lgicos, lo que lo diferencia enormemente de otros lenguajes ms populares tales como Fortran, Pascal, C.

Retroseguimiento

En todos los mencionados, las instrucciones se ejecutan normalmente en orden secuencial, es decir, una a continuacin de otra, en el mismo orden en que estn escritas, que slo vara cuando se alcanza una instruccin de control (un bucle, una instruccin condicional o una transferencia). Los programas en Prolog se componen de clusulas de Horn que constituyen reglas del tipo "modus ponendo ponens", es decir, "Si es verdad el antecedente, entonces es verdad el consecuente". No obstante, la forma de escribir las clusulas de Horn es al contrario de lo habitual. Primero se escribe el consecuente y luego el antecedente. El antecedente puede ser una conjuncin de condiciones que se denomina secuencia de objetivos. Cada objetivo se separa con una coma y puede considerarse similar a una instruccin o llamada a procedimiento de los lenguajes imperativos. En Prolog no existen instrucciones de control. Su ejecucin se basa en dos conceptos: la unificacin y el backtracking. Gracias a la unificacin, cada objetivo determina un subconjunto de clusulas susceptibles de ser ejecutadas. Cada una de ellas se denomina punto de eleccin. Prolog selecciona el primer punto de eleccin y sigue ejecutando el programa hasta determinar si el objetivo es verdadero o falso. En caso de ser falso entra en juego el 'backtracking', que consiste en deshacer todo lo ejecutado situando el programa en el mismo estado en el que estaba justo antes de llegar al punto de eleccin. Entonces se toma el siguiente punto de eleccin que estaba pendiente y se repite de nuevo el proceso. Todos los objetivos terminan su ejecucin bien en xito ("verdadero"), bien en fallo ("falso").
Expresiones

Prolog cuenta con operadores para la unificacin y comparacin sea con evaluacin o sea simblica como lo siguiente:
X is Y X=Y X=:=Y

%unificacin con evaluacin. %unificacin simblica %comparacin con evaluacin

X==Y Listas

%comparacin simblica.

La representacin de hechos simples no es lo comn en la clasificacin de elementos, sino que se agrupan los elementos de un mismo tipo en una lista. Ejemplo: % Si queremos hallar la longitud de una lista. % La longitud de una lista vacia es 0. % La longitud de cualquier lista es la longitud de la cola + 1. longitud([],0). longitud([H|T],N):-longitud(T,N0), N is N0 + 1. ?- longitud([a,b,c],L). 3 ?- longitud([a,b,c],4). No % Si queremos determinar si un elemento es pertenece a una lista. % El elemento pertenece a la lista si coincide con la cabeza de la lista. % El elemento pertenece a la lista si es se encuentra en la cola de la lista. pertenece(X,[X|_]). pertenece(X,[_|R]):- pertenece(X,R). ?- pertenece(b,[a,b,c]). Yes ?- pertenece(b,[a,[b,c]]). No ?- pertenece([b,c],[a,[b,c]]). Yes % Si queremos eliminar un elemento de la lista. % Si X es la cabeza de la lista, la cola T es la lista sin X % Si X no es la cabeza de la lista, conservamos la cabeza de la lista % como parte de la respuesta y continuamos eliminando X de la cola T. elimina (X,[X|T],T). elimina (X,[H|T],[H|T1]):- elimina (X,T,T1).

?- elimina(1,[1,2,3,4],R). R = [2,3,4] ?- elimina(1,R,[2,3]). R = [1, 2, 3] R = [2, 1, 3] R = [2, 3, 1] % Si queremos calcular la inversa de una lista. % La inversa de una lista vacia es una lista vacia. % La inversa de H|T es la inversa de T concatenada con H. inversa([],[]). inversa([H|T],L):- inversa(T,R), concatenar(R,[H],L). ?- inversa([a,b,c,d],[d,c,b,a]). Yes 2.8. LENGUAJES ORIENTADOS A OBJETOS A mediados de los aos 60 se empez a vislumbrar el uso de las computadoras para la simulacin de problemas del mundo real. Pero el mundo real est lleno de objetos, en la mayora de los casos complejos, los cuales difcilmente se traducen a los tipos de datos primitivos de los lenguajes imperativos. As es que a dos noruegos, Dahl y Nygaard, se les ocurri el concepto de objeto y sus colecciones, llamadas clases de objetos, que permitieron introducir abstracciones de datos a los lenguajes de programacin. La posibilidad de reutilizacin del cdigo y sus indispensables modificaciones, se reflejaron en la idea de las jerarquas de herencia de clases. A ellos tambin les debemos el concepto de polimorfismo introducido va procedimientos virtuales. Todos estos conceptos fueron presentados en el lenguaje Simula 67, desde el ao 1967. Aunque pensado como lenguaje de propsito general, Simula tuvo su mayor xito en las aplicaciones de simulacin discreta, gracias a la clase SIMULATION que facilitaba considerablemente la programacin. La comunidad informtica ha tardado demasiado en entender la utilidad de los conceptos bsicos de Simula 67, que hoy identificamos como conceptos del modelo de objetos. Tuvimos que esperar hasta los aos 80 para vivir una verdadera ola de propuestas de lenguajes de programacin con conceptos de

objetos encabezada por Smalltalk, C++, Eiffel, Modula-3, Ada 95 y terminando con Java. La moda de objetos se ha extendido de los lenguajes de programacin a la Ingeniera de Software La reutilizacin de clases previamente probadas en distintos sistemas tambin es otro punto a favor. Sin embargo, el modelo de objetos, a la hora de ser interpretado en la arquitectura von Neumann conlleva un excesivo manejo dinmico de memoria debido a la constante creacin de objetos, as como a una carga de cdigo fuerte causada por la constante invocacin de mtodos. Por lo tanto, los programas en lenguajes orientados a objetos siempre pierden en eficiencia, en tiempo y memoria, contra los programas equivalentes en lenguajes imperativos. Para consolarnos, los expertos dicen que les ganan en la comprensin de cdigo.
Caractersticas fundamentales de la POO:

1. Encapsulamiento: Es la ocultacin de informacin. Significa mantener la informacin dentro del objeto y mantenerlo como una caja negra. Puede ser accedida por mtodos. 2. Abstraccin: Es la capacidad de aislar y encapsular la informacin del diseo y la ejecucin. Es la capacidad para identificar atributos y mtodos. Herencia: Es la propiedad que permite a los objetos crearse a partir de otros objetos. 3. Polimorfismo: Es la capacidad de que diferentes objetos reaccionen de distinta forma a un mismo mensaje. 2.9. LENGUAJES CON CONCURRENCIA La necesidad de ofrecer concurrencia en el acceso a los recursos computacionales se remonta a los primeros sistemas operativos. Mientras que un programa realizaba una operacin de entrada o salida otro podra gozar del tiempo del procesador para sumar dos nmeros, por ejemplo. Aprovechar al mximo los recursos computacionales fue una necesidad apremiante, sobre todo en la poca en que las computadoras eran caras y escasas; el sistema operativo tena que ofrecer la ejecucin concurrente y segura de programas de varios usuarios, que desde distintas terminales utilizaban un solo procesador, y as surgi la necesidad de

introducir algunos conceptos de programacin concurrente para programar los sistemas operativos. Posteriormente, cuando los procesadores cambiaron de tamao y de precio, se abri la posibilidad de contar con varios procesadores en una mquina y ofrecer el procesamiento en paralelo, es decir, procesar varios programas al mismo tiempo. Esto dio el impulso a la creacin de lenguajes que permitan expresar el paralelismo. Finalmente, llegaron las redes de computadoras, que tambin ofrecen la posibilidad de ejecucin en paralelo, pero con procesadores distantes, lo cual conocemos como la programacin distribuida. Histricamente encontramos en la literatura soluciones conceptuales y mecanismos tales como: semforos, regiones crticas, monitores, envo de mensajes (CSP), llamadas a procedimientos remotos (RPC), que posteriormente se incluyeron como partes de los lenguajes de programacin en Concurrent Pascal, Modula, Ada, OCCAM, y ltimamente en Java. Uno de los ejemplos ms importantes es el modelo de envo de mensajes de CSP de Hoare, para las arquitecturas paralelas y distribuidas, el cual no solamente fructific en una propuesta del lenguaje de programacin OCCAM, sino dio origen a una nueva familia de procesadores, llamados "transputers", que fcilmente se componen en una arquitectura paralela. Es difcil evaluar las propuestas existentes de lenguajes para la programacin concurrente, paralela y distribuida. Primero, porque los programadores estn acostumbrados a la programacin secuencial y cualquier uso de estos mecanismos les dificulta la construccin y el anlisis de programas. Por otro lado, este tipo de conceptos en el pasado fue manejado principalmente a nivel de sistemas operativos, protocolos de comunicacin, etctera, donde la eficiencia era crucial, y por lo tanto no se utilizaban lenguajes de alto nivel para la programacin. Hoy en da, la programacin de sistemas complejos tiene que incluir las partes de comunicaciones, programacin distribuida y concurrencia. Esto lo saben los creadores de los lenguajes ms recientes, que integran conceptos para manejar: los hilos de control, comunicacin, sincronizacin y no determinismo; el hardware y las aplicaciones se los exigen.

2.10.EVOLUCIN

DE

LOS

LENGUAJES

DE

PROGRAMACIN

DECLARATIVOS

Grfico N 1: Evolucin de los lenguajes de programacin Declarativos

2.11.EVOLUCIN DE LOS LENGUAJES DE PROGRAMACIN ORIENTADO A OBJETOS E IMPERATIVOS

Grfico N 2: Evolucin de los lenguajes de programacin OO e Imperativos

CAPTULO III: CONCEPTOS EN LOS LENGUAJES DE PROGRAMACIN


3.1. QU ES LO QUE CONSTITUYE UN BUEN LENGUAJE? 3.1.1.ATRIBUTOS DE UN BUEN LENGUAJE
Claridad, sencillez y unidad (legibilidad): La sintaxis del lenguaje afecta

la facilidad con la que un programa se puede escribir, por a prueba, y ms tarde entender y modificar.
Ortogonalidad: Capacidad para combinar varias caractersticas de un

lenguaje en todas las combinaciones posibles, de manera que todas ellas tengan significado.
Naturalidad para la aplicacin: La sintaxis del programa debe permitir

que la estructura del programa refleje la estructura lgica subyacente.


Apoyo para la abstraccin: Una parte importante de la tarea del

programador es proyectar las abstracciones adecuadas para la solucin del problema y luego implementar esas abstracciones empleando las capacidades ms primitivas que provee el lenguaje de programacin mismo.
Facilidad para verificar programas: La sencillez de la estructura

semntica y sintctica ayuda a simplificar la verificacin de programas.


Entorno de programacin: Facilita el trabajo con un lenguaje

tcnicamente dbil en comparacin con un lenguaje ms fuerte con poco apoyo externo.
Portabilidad de programas Costo de uso:

1. Costo de ejecucin del programa. 2. Costo de traduccin de programas. 3. Costo de creacin, prueba y uso de programas. 4. Costo de mantenimiento de los programas: costo total del ciclo de vida.

3.1.2.ESTANDARIZACIN DE LOS LENGUAJES Los estndares son en general de dos clases:


Estndares

patentados: Son

las definiciones elaboradas por

la

compaa que desarroll el lenguaje y que es su propietaria.


Estndares de consenso: Se trata de documentos elaborados por

organizaciones con base en un acuerdo entre los participantes pertinentes. Mtodo principal para asegurar la uniformidad entre varias implementaciones de un lenguaje. Ejemplo: ANSI, IEEE, ISO, etc.. 3.2. SINTAXIS DE LENGUAJES DE PROGRAMACIN La sintaxis suministra informacin significativa que se necesita para entender un programa y proporciona informacin imprescindible para la traduccin del programa fuente a un programa objeto. Se necesita algo ms que slo estructuras sintcticas para la plena descripcin de un lenguaje de programacin. Otros atributos bajo el trmino general de semntica, como el uso de declaraciones, operaciones, control de secuencia y entornos de refinamiento, afectan a una variable y no siempre estn determinados por reglas de sintaxis. CRITERIOS GENERALES DE SINTAXIS El propsito primordial de la sintaxis es proveer una notacin para la comunicacin entre el programador y el procesador de lenguajes de programacin. Los detalles de la sintaxis se eligen en gran medida con base en criterios secundarios, como:
Legibilidad: Un programa es legible si la estructura subyacente del algoritmo

y los datos que el programa representa quedan de manifiesto al inspeccionar el texto del programa.
Facilidad de escritura: Suele hallarse en conflicto con las caractersticas que

facilitan su lectura. Este atributo mejora a travs del uso de estructuras sintcticas concisas y regulares.

Una sintaxis es redundante si comunica el mismo elemento de informacin en ms de una forma. Cierta redundancia es til en la sintaxis de lenguajes de programacin porque facilita la lectura del programa y tambin permite revisar en busca de errores durante la traduccin.
Facilidad de verificacin: Tiene relacin con la legibilidad y facilidad de

escritura. Se necesitan tcnicas que permitan comprobar que el programa es matemticamente correcto.
Facilidad de traduccin: Los programas deben ser fciles de traducir a una

forma ejecutable. Est relacionado con las necesidades del traductor que procesa el programa escrito. La traduccin de los programas se dificulta conforme aumenta el nmero de construcciones sintcticas especiales.
Carencia de ambigedad: Una construccin ambigua permite dos o ms

interpretaciones distintas. El problema de ambigedad surge por lo comn no en la estructura de elementos individuales del programa, sino en la interaccin entre diferentes estructuras (Ej. Condicionales). 3.3. TIPOS DE DATOS
Numricos: Entero, Real. Booleano. Carcter. Definidos por el usuario: tipos especificados por el usuario como limitaciones

de los bsicos.
Enumerados, subrangos, modulares Arrays: son tipos con tamao fijo y todos los elementos del mismo tipo. String est definido e muchos lenguajes como un array de caracteres. Registros: Es una estructura de datos formada por un numero fijo de

componentes de distinto tipo.


Punteros: almacena la direccin de memoria de otro objeto de datos. Referencia: no se pueden manejar directamente, lo hace el compilador. Tipo funcin: se considera un tipo por poderse incluir en una expresin, y

suele ir acompaado de su descriptor.

3.4. ABSTRACCIN La abstraccin nos permite simplificar el anlisis y resolucin de un problema separando las caractersticas que son relevantes de aquellas que no lo son. La relevancia depender fuertemente del contexto. Un ejemplo tpico de abstraccin es una jerarqua de objetos determinada por sus caractersticas comunes. Aunque la abstraccin es un concepto general aplicable a cualquier campo nosotros estamos interesados en la abstraccin que proporciona un lenguaje de programacin. En este sentido la aportacin ms importante ha sido el desarrollo de los lenguajes de alto nivel, stos nos permiten utilizar ciertas construcciones de alto nivel en lugar de una secuencia de instrucciones mquina. An as, el nivel de abstraccin proporcionado por un lenguaje de programacin resulta insuficiente. Podemos aumentar el nivel de abstraccin haciendo que el lenguaje de programacin incluya mecanismos que permitan construir al usuario sus propias abstracciones. El mecanismo ms comn para tal fin es el uso de funciones y procedimientos, aunque existen otros mecanismos. Los lenguajes de programacin orientados a objetos ofrecen un cada vez ms amplio abanico de estructuras de datos organizadas jerrquicamente (listas, pilas, colas, etc.) junto con primitivas para manejarlas agrupadas en lo que habitualmente se conoce como clase, adems, el usuario puede definir nuevas clases 3.5. ABSTRACCIN EN PROGRAMACIN Cuando la computacin estaba en su infancia, la mayora de los programas se escriban en ensamblador por un programador, y no se consideraran como grandes programas segn los estndares de hoy en da. An as, en la medida en que los programas se hicieron ms complejos, los programadores encontraron ms dificultades para recordar toda la informacin que necesitaban para desarrollar o eliminar errores de sus programas. Aunque la introduccin de lenguajes de alto nivel resolvi algunas dificultades, al mismo tiempo increment las expectativas de la gente acerca de lo que podra hacer una computadora, de tal forma que slo provoc la aparicin de un mayor nmero de problemas. As, a medida que se intentaban resolver problemas ms

complejos por medio de una computadora, mayor era la tarea que deba desarrollar el programador, rebasando la capacidad incluso de los mejores programadores. En consecuencia, comenzaron a proliferar equipos de programadores que trabajaban conjuntamente para emprender grandes tareas de programacin. Se observ entonces un problema que an hoy no se ha abordado de forma completamente satisfactoria: los sistemas de software son sistemas complejos con un alto grado de interconexin. La interconexin es la dependencia de una parte del cdigo de otra seccin de cdigo. Surgieron as diversas tcnicas y mecanismos para tratar de reducir el problema de la complejidad. La abstraccin es uno de estos mecanismos y es posiblemente el ms importante de todos. El mecanismo de abstraccin permite descomponer de forma productiva un problema mediante el cambio del nivel de detalle a considerar, pero es algo intangible. Surge por tanto la necesidad de describirla de alguna forma, la especificacin es esta descripcin. La abstraccin funcional; es decir, la idea de crear procedimientos y funciones e invocarlos mediante un nombre, fue uno de los primeros mecanismos de abstraccin que se usaron ampliamente en los lenguajes de programacin. Los procedimientos permitan que las tareas que se ejecutaban varias veces, fueran agrupadas en un lugar para reutilizarlas, en vez de duplicar el cdigo una y otra vez. Es este tipo de abstraccin lo importante es qu hace la funcin y no importa cmo lo hace. El usuario del procedimiento solo necesita conocer la especificacin de la abstraccin y puede ignorar el resto de detalles. 3.6. CLASES DE ABSTRACCIN 3.6.1.ABSTRACCIN DE CONTROL Hace referencia a los mecanismos necesarios para representar el flujo de control de un programa, evitando detalles de bajo nivel. Se subdivide en: nivel de sentencias bsicas y a nivel de subprogramas o unidades de programa.
Sentencias condicionales: If/else, alternativa mltiple (swith). Sentencias iterativas: For, While y repeat.

Abstraccin procedimental
Subprograma: conjunto de lneas de cdigo con cierta independencia del

resto.
Procedimientos: subprogramas que tienen de 0 a n parmetros, sin tipo,

no pueden ser usados en expresiones y pueden devolver de 0 a n resultados distintos.


Funciones: pueden tener de 0 a n argumentos de entrada, devuelve solo 1

resultado siempre. Tiene tipo y se puede usar en una expresin. Paso de parmetros:
Formas de paso de parmetros: Por referencia: se pasa la direccin de memoria del parmetro (E/S). Por copia: Copia por valor: se crea una var temporal copindole el valor del

parmetro.(E)
Copia por resultado: se crea una var local, y al acabar se devuelve el

resultado (S)
Copia por valor-resultado: se crea una var local pasndole el valor, con

la que se trabaja, y al acabar se devuelve el resultado


Formas de asignar los argumentos: Por posicin: se asignan los parmetros formales con los reales por

orden.
Por nombre: en la llamada se aade el nombre del parmetro formal. Por defecto: toma un valor por defecto especificado en compilacin si

no se le da ninguno. Ejemplo: Void ordenar (int a[],int n) el usuario no necesita conocer los detalles de cmo se realiza el ordenamiento, solo debe suministrar un arreglo y su tamao y recibir el arreglo ordenado (en un orden predeterminado como ascendente)

3.6.2.ABSTRACCIN DE DATOS. Una abstraccin de datos (tipo de dato o tipo abstracto de dato) es un nuevo tipo de dato ms un conjunto de operaciones que permiten manipular los objetos de dicho tipo. En esta definicin juega un papel importante el uso de la palabra objeto en lugar de variable. La diferencia entre ambos conceptos se explicar ms adelante. La correcta utilizacin de los tipos abstractos de datos (TADs en lo sucesivo) en el diseo de programas da lugar a programas de gran modularidad y calidad:
Son ms legibles Son ms fciles de interpretar Son ms fciles de modificar

3.7. TIPOS ABSTRACTOS DE DATOS (TADS) Es una estructura de datos junto a las instrucciones para manejarlo, haciendo invisible ciertas partes al usuario programador. Permite la asociacin de una representacin con sus operaciones concretas en una unidad adecuada de lenguaje que incorpora los nuevos tipos y el ocultamiento de la representacin del nuevo tipo a las unidades que lo usan. Tipos genricos, genericidad: consiste en que las entidades de programa puedan trabajar con independencia de los tipos de datos concretos. Para usarse hay que instanciarlos. 3.8. LENGUAJES DE PROGRAMACIN Y TADS La abstraccin de datos es una tcnica de diseo de programas que promete un alto grado de modularidad y un desarrollo independiente de la implementacin de dicha abstraccin y de la aplicacin del programa. Por tratarse de una tcnica de diseo, su utilizacin es en su mayor parte independiente del lenguaje de programacin, sin embargo, el uso e implementacin de TADs con lenguajes de programacin que no los soportan convenientemente puede dar lugar a deficiencias en algunos de los aspectos siguientes:

Ocultacin de la representacin. Los lenguajes que no soportan TADs no

pueden chequear el buen uso de la abstraccin de datos, dada la imposibilidad de ocultar a los usuarios de la abstraccin la representacin de los objetos
Inicializacin de las estructuras de datos. Los lenguajes que no soportan

TADs no disponen de un procedimiento automtico de inicializacin de las estructuras de datos que se utilizan para representar a los objetos del TAD. Esto supone que al principio de los programas que utilicen un TAD debe invocarse a una accin para inicializar convenientemente dichas estructuras (operacin no relacionada con los objetos
Compilacin independiente. En los lenguajes que soportan TADs, el cdigo

de estos se puede separar del cdigo de los programas de aplicacin y compilarlos independientemente. En todo caso, esta facilidad se tiene en cualquier lenguaje que soporte la compilacin independiente.
Parametrizacin de tipos. En los lenguajes que no soportan TADs no se

puede parametrizar una definicin de tipo con otro tipo; es decir, no se pueden realizar abstracciones (funcionales o de datos) de tipos desconocidos.
Abstracciones polimrficas. En los lenguajes que no soportan TADs no se

pueden construir abstracciones que puedan ser utilizadas por objetos de diferentes tipos.
Los tipos definidos por el usuario no se comportan como los predefinidos

del lenguaje. As, por ejemplo, un objeto de tipo Racional no se crea por completo al declararlo siendo necesario realizar una llamada posterior a la operacin Crear_Racional para inicializarlo convenientemente. Esta ltima deficiencia provoca que en un lenguaje de programacin que no soporte TADs puedan existir objetos cuya representacin no sea vlida sin que ello sea detectado por el compilador. Esto obliga al usuario a utilizar escrupulosamente el TAD, o bien, al desarrollador de la abstraccin de datos a realizar implementaciones de ste que tuvieran en cuenta ste hecho.

3.9. LENGUAJES DE PROGRAMACIN QUE DEBERAS APRENDER 3.9.1.PHP PHP usa una mezcla entre interpretacin y compilacin para intentar ofrecer a los programadores la mejor mezcla entre rendimiento y flexibilidad. PHP compila para tu codigo una serie de instrucciones (llamadas opcodes) siempre que estas son accedidas. Estas instrucciones son entonces ejecutadas una por una hasta que el script termina. Esto es diferente a la manera convencional de compilacion de lenguajes como C++ donde el cdigo es compilado a cdigo ejecutable que es despues ejecutado. Php es recompilado cada vez que se solicita un script. Una ventaja importante de interpretar el cdigo es que toda la memoria usada por tu cdigo es manejada por PHP, y el lenguaje automticamente vaca esta memoria cuando el script finaliza. Esto significa que tu no tienes que preocuparte de las conexiones a la base de datos, porque PHP lo har por ti. Por qu deberas aprenderlo? Es uno de los lenguajes de programacin ms populares, la gran fluidez y rapidez de sus scripts y su prometedor futuro, desarrollar aplicaciones Webs utilizando lenguajes como C o COBOL son cosas del pasado. 3.9.2.C# C# es un lenguaje de propsito general orientado a objetos creado por Microsoft para su plataforma .NET. Su sintaxis bsica deriva de C/C++ y utiliza el modelo de objetos de la plataforma .NET el cual es similar al de Java aunque incluye mejoras derivadas de otros lenguajes. C# fue diseado para combinar el control a bajo nivel de lenguajes como C y la velocidad de programacin de lenguajes como Visual Basic. Por qu deberas aprenderlo? Es una parte esencial de la plataforma .Net, C# combina los mejores elementos de mltiples lenguajes de amplia difusin como C++, Java, Visual Basic o Delphi. De hecho, su creador Anders Heljsberg fue tambin el creador de muchos otros lenguajes y entornos como Turbo Pascal, Delphi o Visual J++. La idea principal detrs del lenguaje es combinar la potencia de lenguajes

como C++ con la sencillez de lenguajes como Visual Basic, y que adems la migracin a este lenguaje por los programadores de C/C++/Java sea lo ms inmediata posible. 3.9.3.AJAX AJAX no es un lenguaje exactamente su nombre viene dado por el acrnimo de Asynchronous JavaScript And XML y es posiblemente la mayor novedad en cuanto a programacin web en estos ltimos aos. El corazn de Ajax es el objeto XMLHttpRequest que nos permite realizar una conexin al servidor y al enviarle una peticin y recibir la respuesta que procesaremos en nuestro cdigo Javascript, estamos hablando del verdadero motor de Ajax, por ejemplo gracias a este objeto podemos desde una pgina HTML leer datos de una web o enviar datos de un formulario sin necesidad de recargar la pgina. Por qu deberas aprenderlo? La demanda de AJAX no slo es ampla sino que de calidad debido a la dificultad de aprendizaje que conlleva, si la herramienta de Microsoft, Atlas, destinada a la realizacin de aplicaciones AJAX tiene xito puede supone un aumento en la demanda de esta tecnologa. 3.9.4.JAVASCRIPT Se trata de un lenguaje de programacin del lado del cliente, porque es el navegador el que soporta la carga de procesamiento. Gracias a su compatibilidad con la mayora de los navegadores modernos, es el lenguaje de programacin del lado del cliente ms utilizado. Por qu deberas aprenderlo? La razn de mayor peso es que es utilizado por millones de pginas webs para validar formularios, crear cookies, detectar navegadores y mejorar el diseo, su fcil aprendizaje lo hace un lenguaje muy demandado.

3.9.5.PERL Perl es la alternativa ms popular a PHP, seguramente porque es el lenguaje ms antiguo tambien dentro de las alternativas. En internet nos encontramos numerosos recursos que utilizan Perl, muchos de las aplicaciones "open source" requieren tener Perl instalado correctamente. Perl tiene una ventaja y es que es muy flexible, y tambien tiene un gran cantidad de modulos ya escritos. Bien escritos los scripts en Perl se asemejan bastante a PHP. La principal causa de la suca apariencia de Perl es por la aficin de sus desarrolladores a la escritura en "una lnea" empaquetanto numerosas funcionalidades en una sola lnea de cdigo. Por qu deberas aprenderlo? La potenca de Perl a la hora de procesar grandes cantidades de datos lo hace realmente popular a la hora de desarrollar aplicaciones del lado del servidor, aprender Perl o Php es bsico a la hora de desarrollar aplicaciones Web. 3.9.6.C Es un lenguaje de "medio nivel" pero con numerosas caractersticas de bajo nivel. Dispone de las estructuras tpicas de los lenguajes de alto nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un control a muy bajo nivel. Por qu deberas aprenderlo? Aprender C es bsico mientras aprendes C estas aprendiendo conceptos bsicos de lenguajes cmo Java o C#, adems no slo es mas sencillo que estos ltimos sino que comporten gran parte de su sintaxis. 3.9.7.RUBY Y RUBY ON RAILS Ruby on Rails, tambin conocido como RoR o Rails es un framework de aplicaciones web de cdigo abierto escrito en el lenguaje de programacin Ruby. Ruby apareci en el ao 1995 y creo que su principal problema haba sido la falta de documentacin en otro idioma que no sea japons. Eso se ha ido solucionando y crece la popularidad del lenguaje. Su aplicacin insignia, por decirlo de algn modo parece ser RoR. Su mecanismo de gem parece al CPAN de Perl y al Pear de PHP

Por qu deberas aprenderlo? Simple y funcional, el uso de Active Record de forma eficiente simplifica y agiliza el desarrollo de forma notable. Al minimizar el trabajo con la base de datos (escribiendo triggers y procedimientos almacenados) y emplear un nico lenguaje para todo el desarrollo, se consigue acortar los tiempos de desarrollo (time2market). 3.9.8.ASP Active Server Pages (ASP) y ASP.NET es un intento de Microsoft para introducirse en el mercado del desarrollo Web, y viene a ser como su estandar para su servidor Web, IIS. ASP ha sido atacado por la comunidad open source desde que este apareci, y dan numerosas razones para ello: El propietario, una nica plataforma, la lentitud... ASP ha sido implementado en otras plataformas y que cuando esta funcionando bajo su servidor predeterminado IIS es relativamente rpido. Por qu deberas aprenderlo? Simplemente porqu en algunas ocasiones no tienes otra opcin debido a la popularidad que ha alcanzado.

CAPTULO IV: LENGUAJES DE BAJO, MEDIO Y ALTO NIVEL


4.1. INTRODUCCIN El ordenador slo entiende un lenguaje conocido como cdigo binario o cdigo mquina, consistente en ceros y unos. Es decir, slo utiliza 0 y 1 para codificar cualquier accin. Los lenguajes ms prximos a la arquitectura hardware se denominan lenguajes de bajo nivel y los que se encuentran ms cercanos a los programadores y usuarios se denominan lenguajes de alto nivel. 4.2. LENGUAJES DE BAJO NIVEL Vistos a muy bajo nivel, los microprocesadores procesan exclusivamente seales electrnicas binarias. Dar una instruccin a un microprocesador supone en realidad enviar series de unos y ceros espaciadas en el tiempo de una forma determinada. Esta secuencia de seales se denomina cdigo mquina. El cdigo representa normalmente datos y nmeros e instrucciones para manipularlos. Un modo ms fcil de comprender el cdigo mquina es dando a cada instruccin un mnemnico, como por ejemplo STORE, ADD o JUMP. Esta abstraccin da como resultado el ensamblador, un lenguaje de muy bajo nivel que es especfico de cada microprocesador. Los lenguajes de bajo nivel permiten crear programas muy rpidos, pero que son a menudo difciles de aprender. Ms importante es el hecho de que los programas escritos en un bajo nivel son totalmente dependientes de la mquina o de cada procesador. Si se lleva el programa a otra mquina se debe reescribir el programa desde el principio. Al estar prcticamente diseados a medida del hardware, aprovechan al mximo las caractersticas del mismo. Dentro de este grupo se encuentran:
LENGUAJE MQUINA. ENSAMBLADOR.

4.2.1.LENGUAJE MQUINA. El lenguaje mquina es el nico lenguaje que entiende directamente la computadora. Por esta razn, su estructura esta totalmente adaptada a los circuitos de la mquina y muy alejado de la forma de expresin y anlisis de los problemas propia de los humanos. Esto hace que la programacin en este lenguaje resulte tediosa y complicada, requirindose un conocimiento profundo de la arquitectura fsica del ordenador. Frente a esto, el cdigo mquina hace posible que el programador utilice la totalidad de los recursos que ofrece el ordenador, obtenindose programas muy eficientes (es decir, que aprovechan al mximo los recursos existentes) en tiempo de ejecucin y en ocupacin de memoria. 4.2.2.ENSAMBLADOR. El lenguaje ensamblador constituye el primer intento de sustitucin del lenguaje mquina por uno ms cercano al usado por los humanos. Este acercamiento a las personas se plasma en las siguientes aportaciones:
Uso de una notacin simblica o nemotcnica para representar los

cdigos de operacin
direccionamiento simblico Se permite el uso de comentarios entre las lneas de instrucciones,

haciendo posible la redaccin de programas ms legibles. Aparte de esto l LE presenta la mayora de los inconvenientes del lenguaje mquina, como son su repertorio muy reducido de instrucciones, el rgido formato de instrucciones, la baja potabilidad y la fuerte dependencia del hardware. Por otro lado mantiene la ventaja del uso ptimo de los recursos hardware, permitiendo la obtencin de un cdigo muy eficiente. Ese tipo de lenguajes hacen corresponder a cada instruccin en ensamblador una instruccin en cdigo mquina. Esta transduccin es llevada a cabo por un programa traductor denominado Ensamblador. Para solventar en cierta medida la limitacin que supone poseer un repertorio de instrucciones, tan reducido, se han desarrollado unos ensambladores especiales denominados macroensambladores.

Los lenguajes que traducen los macroensambladores disponen de macroinstrucciones cuya traduccin da lugar a varias instrucciones mquina y no a una sola. Dado que el lenguaje ensamblador esta fuertemente condicionado por la arquitectura del ordenador que soporta, los programadores no suelen escribir programas de tamao considerable en ensamblador. Mas bien usan este lenguaje para afinar partes importantes de programas escritos en lenguajes de ms alto nivel. Hay un distinto Lenguaje de Mquina (y, por consiguiente, un distinto Lenguaje Ensamblador) para cada CPU. Por ejemplo, podemos mencionar tres lenguajes completamente diferentes, que sin embargo vienen de la aplicacin de los conceptos anteriores:
Lenguaje Ensamblador de la familia Intel 80x86 Lenguaje Ensamblador de la familia Motorola 68000 Lenguaje Ensamblador del procesador POWER, usado en las IBM

RS/6000. Tenemos 3 fabricantes distintos, compitiendo entre s y cada uno aplicando conceptos distintos en la manufactura de sus procesadores, su arquitectura y programacin; todos estos aspectos, influyen en que el lenguaje de mquina y ensamblador cambie bastante. A) VENTAJAS DEL LENGUAJE ENSAMBLADOR Una vez que hemos visto la evolucin de los lenguajes, cabe preguntarse: En estos tiempos "modernos", para qu quiero el Lenguaje Ensamblador? El proceso de evolucin trajo consigo algunas desventajas, que ahora veremos como las ventajas de usar el Lenguaje Ensamblador, respecto a un lenguaje de alto nivel: 1. Velocidad El proceso de traduccin que realizan los intrpretes, implica un proceso de cmputo adicional al que el programador quiere realizar. Por ello, nos encontraremos con que un intrprete es siempre ms

lento que realizar la misma accin en Lenguaje Ensamblador, simplemente porque tiene el costo adicional de estar traduciendo el programa, cada vez que lo ejecutamos. De ah nacieron los compiladores, que son mucho ms rpidos que los intrpretes, pues hacen la traduccin una vez y dejan el cdigo objeto, que ya es Lenguaje de Mquina, y se puede ejecutar muy rpidamente. Aunque el proceso de traduccin es ms complejo y costoso que el de ensamblar un programa, normalmente podemos despreciarlo, contra las ventajas de codificar el programa ms rpidamente. Sin embargo, la mayor parte de las veces, el cdigo generado por un compilador es menos eficiente que el cdigo equivalente que un programador escribira. La razn es que el compilador no tiene tanta inteligencia, y requiere ser capaz de crear cdigo genrico, que sirva tanto para un programa como para otro; en cambio, un programador humano puede aprovechar las caractersticas especficas del problema, reduciendo la generalidad pero al mismo tiempo, no desperdicia ninguna instruccin, no hace ningn proceso que no sea necesario. Para darnos una idea, en una PC, y suponiendo que todos son buenos programadores, un programa para ordenar una lista tardar cerca de 20 veces ms en Visual Basic (un intrprete), y 2 veces ms en C (un compilador), que el equivalente en Ensamblador. Por ello, cuando es crtica la velocidad del programa, Ensamblador se vuelve un candidato lgico como lenguaje. Ahora bien, esto no es un absoluto; un programa bien hecho en C puede ser muchas veces ms rpido que un programa mal hecho en Ensamblador; sigue siendo sumamente importante la eleccin apropiada de algoritmos y estructuras de datos. Por ello, se recomienda buscar optimizar primero estos aspectos, en el lenguaje que se desee, y solamente usar Ensamblador cuando se requiere ms optimizacin y no se puede lograr por estos medios.

2. Eficiencia de tamao Por las mismas razones que vimos en el aspecto de velocidad, los compiladores e intrpretes generan ms cdigo mquina del necesario; por ello, el programa ejecutable crece. As, cuando es importante reducir el tamao del ejecutable, mejorando el uso de la memoria y teniendo tambin beneficios en velocidad, puede convenir usar el lenguaje Ensamblador. Entre los programas que es crtico el uso mnimo de memoria, tenemos a los virus y manejadores de dispositivos (drivers). Muchos de ellos, por supuesto, estn escritos en lenguaje Ensamblador. 3. Flexibilidad Las razones anteriores son cuestin de grado: podemos hacer las cosas en otro lenguaje, pero queremos hacerlas ms eficientemente. Pero todos los lenguajes de alto nivel tienen limitantes en el control; al hacer abstracciones, limitan su propia capacidad. Es decir, existen tareas que la mquina puede hacer, pero que un lenguaje de alto nivel no permite. Por ejemplo, en Visual Basic no es posible cambiar la resolucin del monitor a medio programa; es una limitante, impuesta por la abstraccin del GUI Windows. En cambio, en ensamblador es sumamente sencillo, pues tenemos el acceso directo al hardware del monitor. Resumiendo, la flexibilidad consiste en reconocer el hecho de que Todo lo que puede hacerse con una mquina, puede hacerse en el lenguaje ensamblador de esta mquina; los lenguajes de alto nivel tienen en una u otra forma limitante para explotar al mximo los recursos de la mquina.

B) DESVENTAJAS DEL LENGUAJE ENSAMBLADOR Por otro lado, al ser un lenguaje ms primitivo, el Ensamblador tiene ciertas desventajas respecto a los lenguajes de alto nivel: 1. Tiempo de programacin. Al ser de bajo nivel, el Lenguaje Ensamblador requiere ms instrucciones para realizar el mismo proceso, en comparacin con un lenguaje de alto nivel. Por otro lado, requiere de ms cuidado por parte del programador, pues es propenso a que los errores de lgica se reflejen ms fuertemente en la ejecucin. Por todo esto, es ms lento el desarrollo de programas comparables en Lenguaje Ensamblador que en un lenguaje de alto nivel, pues el programador goza de una menor abstraccin. 2. Programas fuente grandes Por las mismas razones que aumenta el tiempo, crecen los programas fuentes; simplemente, requerimos ms instrucciones primitivas para describir procesos equivalentes. Esto es una desventaja porque dificulta el mantenimiento de los programas, y nuevamente reduce la productividad de los programadores. 3. Peligro de afectar recursos inesperadamente Tenemos la ventaja de que todo lo que se puede hacer en la mquina, se puede hacer con el Lenguaje Ensamblador (flexibilidad). El problema es que todo error que podamos cometer, o todo riesgo que podamos tener, podemos tenerlo tambin en este Lenguaje. Dicho de otra forma, tener mucho poder es til pero tambin es peligroso. En la vida prctica, afortunadamente no ocurre mucho; sin embargo, al programar en este lenguaje vern que es mucho ms comn que la mquina se "cuelgue", "bloquee" o "se le vaya el avin"; y que se reinicialize. Por qu?, porque con este lenguaje es perfectamente posible (y sencillo) realizar secuencias de instrucciones invlidas, que normalmente no aparecen al usar un lenguaje de alto nivel.

En ciertos casos extremos, puede llegarse a sobreescribir informacin del CMOS de la mquina (no he visto efectos ms riesgosos); pero, si no la conservamos, esto puede causar que dejemos de "ver" el disco duro, junto con toda su informacin. 4. Falta de portabilidad Como ya se mencion, existe un lenguaje ensamblador para cada mquina; por ello, evidentemente no es una seleccin apropiada de lenguaje cuando deseamos codificar en una mquina y luego llevar los programas a otros sistemas operativos o modelos de computadoras. Si bien esto es un problema general a todos los lenguajes, es mucho ms notorio en ensamblador: yo puedo reutilizar un 90% o ms del cdigo que desarrollo en "C", en una PC, al llevarlo a una RS/6000 con UNIX, y lo mismo si despus lo llevo a una Macintosh, siempre y cuando est bien hecho y siga los estndares de "C", y los principios de la programacin estructurada. En cambio, si escribimos el programa en Ensamblador de la PC, por bien que lo desarrollemos y muchos estndares que sigamos, tendremos prcticamente que reescribir el 100 % del cdigo al llevarlo a UNIX, y otra vez lo mismo al llevarlo a MAC. 4.3. LENGUAJES DE MEDIO NIVEL Un lenguaje intermedio se puede definir como una manera de representar procedimientos y estructuras de datos que sirva como entrada para una MV (Maquina Virtual) en alguna parte de su jerarqua, entre el lenguaje de entrada (el nivel ms alto) y el cdigo ejecutado en la mquina (el nivel ms bajo) tanto en el tiempo de compilacin como en el de ejecucin. Para considerar el papel de los lenguajes intermedios y sus ventajas y desventajas, conviene destacar la diferencia entre la traduccin de un lenguaje de alto nivel a cdigo mquina anteriormente a su ejecucin (su compilacin) y su interpretacin, es decir, la conversin de cada instruccin del lenguaje a cdigo mquina y su ejecucin, una por una, al ejecutar el programa. Este proceso se realiza a travs de una MV de interpretacin que simula un ordenador cuyo cdigo mquina es el

lenguaje de alto nivel que est siendo interpretado. Y tpicamente, esta MV se construye a travs de un conjunto de programas de cdigo mquina que representa los algoritmos y estructuras de datos necesarios para la ejecucin de las instrucciones del lenguaje de alto nivel. Hay ventajas y desventajas en cada manera de convertir los lenguajes de alto nivel a cdigo mquina, que se pueden resumir as:

Compilacin Ventajas 1. 2. 1. 2. No hay que repetir la conversin de la misma instruccin a cdigo maquina cada vez que aparece Los programas corren muy rpido Perdida de claridad e informacin sobre el programa Dificultad en localizar la fuente exacta de error

Desventajas

Ejemplo ADA, C , C++, FORTRAN, Pascal Interpretacin 1. Ventajas 2. Desventajas 1. No hay prdida de claridad ni de informacin sobre un programa ni sobre donde estn los errores. No hay que decodificar cdigo que no se va a ejecutar Los programas corren mucho mas lento se paga el coste de decodificar cada instruccin

Ejemplo HTML, Lisp , ML, Perl, Postscrip, Smalltalk Estos dos casos representan los dos extremos porque existe tambin lo que se llama la compilacin parcial, que es una mezcla de los dos enfoques, donde se compila el lenguaje de alto nivel a un lenguaje intermedio (ms cerca de las estructuras presentes en el cdigo mquina que las del cdigo fuente) y luego se interpreta este lenguaje al ejecutar el programa. Como puede imaginarse, esta tcnica combina las ventajas y desventajas de los dos enfoques anteriores. Un ejemplo de esta combinacin existe en el lenguaje de programacin Java y su entorno. Como se puede ver en los cuadros superiores, tanto los programas compilados parcialmente a un lenguaje intermedio (como Java) como los programas escritos en lenguajes de alto nivel que se interpretan (como Lisp) requieren una MV para interpretar el programa. La principal ventaja del lenguaje intermedio en este caso

es su proximidad al nivel del cdigo mquina, en el sentido de que supone menos trabajo a la hora de ejecutarlo y, por lo tanto, los programas corren ms rpidamente que los puramente interpretados. Adems del papel de los lenguajes intermedios en la compilacin parcial, se puede destacar su papel en la compilacin estndar. Como ejemplo se puede considerar C como lenguaje intermedio para un lenguaje compilado nuevo. Si el autor de un nuevo lenguaje decide utilizar C, por ejemplo, como su lenguaje intermedio, slo tendr que implementar una MV para convertir el cdigo fuente de su lenguaje a C, ahorrando mucho trabajo. Las ventajas de utilizar un lenguaje tan establecido como C como lenguaje intermedio son:
La facilidad de portar el lenguaje a una nueva mquina (slo hay que tener un

compilador C disponible all).


La generacin de cdigo mquina es una tarea muy compleja que requiere un

conocimiento profundo de la arquitectura de la mquina en cuestin y de cada mquina en que se quiere una versin del lenguaje.
La facilidad de modificar algn rasgo del comportamiento del lenguaje en

alguna mquina en concreto (por ejemplo, caractersticas de memoria o rendimiento se pueden aadir libreras C customizadas sin grandes problemas).
Las posibilidades disponibles para mapear estructuras intermedias del nuevo

lenguaje a estructuras de datos de C. Y las desventajas son:


La depuracin es muy difcil porque, entre otras cosas, los errores que ocurren

en el cdigo C no son muy fciles de localizar en lo que ha escrito el programador originalmente en el nuevo lenguaje.
Las caractersticas de rendimiento y eficiencia del lenguaje estn determinadas

por el compilador C.
Habr ocasiones en las que no exista una buena traduccin entre una estructura

en el nuevo lenguaje y las estructuras de datos en C, por lo que habr una prdida de eficiencia en el programa resultante (como, por ejemplo, ocurre en la mayora de las ocasiones en que se compilan estructuras de Prolog a C slo se puede expresar iteracin en Prolog utilizando recursin).

4.4. LENGUAJES DE ALTO NIVEL El avance en el desarrollo de "compiladores" e "intrpretes" (los dos tipos de programas traductores) ha sido por lo tanto fundamental en el desarrollo de los lenguajes de "3 generacin" cuyas ventajas adems de la facilidad de aprendizaje y lectura/escritura son las facilidades de correccin, transformacin y conversin de un lenguaje a otro. Los lenguajes de alto nivel tienen normalmente las caractersticas de Transportabilidad. Es decir, estn implementadas sobre varias maquinas de forma que un programa puede ser fcilmente Transportado (Transferido) de una maquina a otra sin una revisin sustancial. En ese sentido se llama "Independientes de la maquina". Los lenguajes de Alto Nivel son los ms utilizados como lenguaje de programacin. Aunque no son fundamentalmente declarativos, estos lenguajes permiten que los algoritmos se expresen en un nivel y estilo de escritura fcilmente legible y comprensible por otros programadores. Los lenguajes de alto nivel son normalmente fciles de aprender porque estn formados por elementos de lenguajes naturales, como el ingls. En BASIC, el lenguaje de alto nivel ms conocido, los comandos como "IF CONTADOR = 10 THEN STOP" pueden utilizarse para pedir a la computadora que pare si CONTADOR es igual a 10. Estn dirigidos a solucionar problemas mediante el uso de EDD's (Estructuras Dinmicas de Datos: Son estructuras que pueden cambiar de tamao durante la ejecucin del programa. Nos permiten crear estructuras de datos que se adapten a las necesidades reales de un programa). Estos lenguajes permiten al programador olvidarse por completo del funcionamiento interno de la maquina/s para la que estn diseando el programa. Tan solo necesitan un traductor que entiendan el cdigo fuente como las caractersticas de la maquina. Suelen usar tipos de datos para la programacin y hay lenguajes de propsito general (cualquier tipo de aplicacin) y de propsito especifico (como FORTRAN para trabajos cientficos). Ejemplos de estos lenguajes de alto nivel son PASCAL, APL y FORTRAN (para aplicaciones cientficas), COBOL (para aplicaciones de procesamiento de datos),

SNOBOL (para aplicaciones de procesamiento de textos), LISP y PROLOG (para aplicaciones de inteligencia artificial), C y ADA (para aplicaciones de programacin de sistemas) y PL/I (para aplicaciones de propsitos generales) . 4.5. GENERADORES DE APLICACIONES 4 NIVEL Posteriormente, usando estos lenguajes, se han redactado programas destinados a facilitar un nmero variado de operaciones en campos de aplicacin especficos como simulacin de fenmenos fsicos, manipulacin de datos estadsticos, etc. Los ms avanzados y flexibles de estos programas son las planillas electrnicas u hojas de clculo y los programas de administracin de archivos o bases de datos Dados que tales aplicaciones no "hacen nada" sin que el usuario defina ciertas estructuras y ciertas operaciones, pueden ser consideradas como "generadores" de aplicaciones, aunque este nombre se reserva habitualmente para niveles ms avanzados en que los usuarios pueden generar sistemas muy diferentes unos de otros, con "herramientas" que se parecen a lenguajes de programacin. Estas herramientas conforman los lenguajes de cuarto nivel que son por esencia "programas para crear programas" con una finalidad especfica, como el "CASE" destinado a facilitar el trabajo de los analistas de sistemas.

CAPTULO V: ELEMENTOS DE UN LENGUAJE DE PROGRAMACIN


5.1. ELEMENTOS SINTCTICOS DE UN LENGUAJE El estilo sintctico general de un lenguaje est dado por la seleccin de diversos elementos sintcticos bsicos. Los ms destacados son:
Conjunto de caracteres: La eleccin del conjunto de caracteres es la primera

que se hace al proyectar una sintaxis de lenguaje. Se usan palabras de 8 bits aunque cada vez ms se consideran las representaciones de 16 bits (65.536 caracteres diferentes).
Identificadores: La sintaxis bsica para identificadores, una cadena de letras y

dgitos que comienzan variaciones entre

con una

letra,

tiene amplia aceptacin.

Las

lenguajes se encuentra entre los signos de puntuacin

admitidos (. , , , -, _...).
Smbolos de operadores: Casi todos los lenguajes emplean los caracteres

especiales + y - para representar las dos operaciones aritmticas bsicas. Tambin adoptan alguna combinacin y utilizacin de caracteres especiales para ciertos operadores.
Palabras clave y palabras reservadas: Una palabra clave es un identificador

que se usa como una parte fija de la sintaxis de un enunciado (ej. IF). El anlisis sintctico durante la traduccin se facilita usando palabras reservadas. La adiccin de una nueva palabra reservada al lenguaje significa que todo programa antiguo que utilice ese identificador como nombre de variable (u otro nombre) ya no es sintcticamente correcto.
Palabras pregoneras: Son palabras opcionales que se insertan en los

enunciados para mejorar la legibilidad.

Comentarios: Ayudan a documentar el programa.

Espacios en blanco: Sus regla varan entre los lenguajes.

Delimitadores y corchetes: Un delimitador es un elemento sintctico que se

usa simplemente para sealar el principio o el final de alguna unidad sintctica, como un enunciado o expresin. Se pueden usar simplemente para mejorar la legibilidad o simplificar el anlisis sintctico.
Formatos de campos libres y fijos: Una sintaxis es de campo fijo si los

enunciados de programa se pueden escribir en cualquier parte de un rengln de entrada sin que importe la posicin sobre el rengln o las interrupciones entre renglones. Una sintaxis de campo fijo utiliza la posicin sobre un rengln de entrada para transmitir informacin.
Expresiones: Son los bloques sintcticos de construccin a partir de los cuales

se construyen enunciados (y a veces programas).


Enunciados: Constituyen el componente sintctico ms destacado en los

lenguajes imperativos. Su sintaxis tiene un efecto decisivo sobre la regularidad, legibilidad y facilidad de escritura generales del lenguajes. 5.2. TIPOS DE DATOS Un tipo de datos es una clase de objetos de datos ligados a un conjunto de operaciones para crearlos y manipularlos. Todo lenguaje tiene un conjunto de tipos primitivos de datos que estn integrados el lenguaje. Adems, un lenguaje puede proveer recursos que permitan al programador definir nuevos tipos de datos. Los elementos bsicos de una especificacin de un tipo de datos son: A. Los atributos que distinguen objetos de datos de ese tipo. B. Los valores que los objetos de datos de ese tipo puede tener, y

C. Las operaciones que definen las posibles manipulaciones de objetos de datos de ese tipo. Los elementos bsicos de la implementacin de un tipo de datos son: A. La representacin de almacenamiento. B. La manera en que las operaciones definidas para el tipo de datos se representan en trminos de algoritmos o procedimientos particulares que manipulan la representacin de almacenamiento elegida para los objetos de datos. 5.3. NOTACIONES DE EXPRESIONES El operador binario se aplica a los operandos. En notacin infija, un operador binario se coloca entre sus operandos, como en la expresin a + b. Otras opciones son la notacin prefija (polaca) , en la cual el operador aparece primero, como en +ab , y la notacin postfija (polaca inversa) en la cual el operador se escribe al final, como en ab+. Los parntesis no son necesarios en notacin prefija o postfija, debido a que los operandos de cada operador pueden encontrarse sin peligro de ambigedad. Ejemplo: (X+Y)* Z [ + XY ] * Z * + XYZ Notacin Postfija: [ XY +] * Z XY + Z * 5.4. PROPIEDAD ASOCIATIVA Y PRECEDENCIA Convencin Tradicional. * , / + , Exponenciacin Multiplicacin, divisin Suma, resta

Notacin Prefija:

5.5. REPRESENTACIN DE RBOL PARA EXPRESIONES Ejemplo. INFIJA : b * b - 4 * a * c PREFIJA : - * b b * * 4 a c POSTFIJA : b b * 4 a * c * rbol de sintaxis abstracta

5.6. EVALUACIN DE EXPRESIONES 5.6.1.EVALUACIN MEDIANTE LA RECONSTRUCCIN DE UN RBOL. 7*7- 4*2*3

5.6.2.EVALUACIN MEDIANTE UNA PILA 1. Traduzca a notacin postfija la expresin que se evaluar. 2. Recorra la notacin postfija de izquierda a derecha.
a) Al encontrar una constante introduzca su valor a la pila b) Al encontrar un operador binario extraiga dos valores de la pila,

aplique el operador a esos valores e introduzca el resultado en la pila. 3. Despus de recorrer toda la notacin postfija, el valor de la expresin se encuentra en el tope de la pila. Ejemplo: Expresin 77*42*3*7*42*3**42*3*42*3*2*3**3*3**Pila auxiliar 7 77 49 49 4 49 4 2 49 8 49 8 3 49 24 25 Comentario Introduzca 7 Introduzca 7 Multiplique Introduzca 4 Introduzca 2 Multiplique Introduzca 3 Multiplique Reste

A) Algoritmo para transformar una notacin infija a postfija. Parntesis Potenciacin Suma , Resta Descripcin Solucin: 1. La expresin se va leyendo carcter a carcter, los operandos pasan directamente a formar parte de la expresin en postfija. 2. Los operadores se meten en la pila siempre que esta este vaca o bien siempre que tengan mayor prioridad que el operador cima de la pila (o bien igual si es la mxima prioridad). Si la prioridad es menor o igual :() : :+,Mayor prioridad

Multiplicacin , Divisin : * , /

se saca el elemento cima de la pila y se vuelve a hacer la comparacin con el elemento cima. 3. Los parntesis izquierdos siempre se meten en la pila con la mnima prioridad. Cuando se lee un parntesis derecho, hay que sacar todos los operadores de la pila pasando a formar parte de la expresin postfija, hasta llegar a un parntesis izquierdo, el cual se elimina, ya que los parntesis no forman parte de la expresin postfija. 4. El algoritmo termina cuando no hay ms caracteres en la expresin y la pila esta vaca. Ejemplo: A*(B+ C-(D/E F)-G )H caracter ledo A * ( B + C ( D / E F ) G ) H A A A AB AB ABC ABC+ AB C+ AB C+ D AB C+ D AB C+ D E AB C+ D E AB C+ D E AB C+ D E AB C+ D E AB C+ D E AB C+ D E AB C+ D E AB C+ D E AB C+ D E Expresin Estado de la pila * *( *( *(+ *(+ *(*(-( *(-( *(-( / *(-( / *(-( / *(-( / *(*(*(* -

F F/ F/F/F/F/F/F/-

G GG- * G- *H G- * H -

En la descripcin realizada, se observa que el parntesis izquierdo tiene la mxima prioridad fuera de la pila, es decir, en la notacin infija; sin embargo, cuando esta dentro de la pila la prioridad es mnima. De igual forma, para tratar el hecho de que varios operadores de potenciacin son evaluados de izquierda a derecha, este operador tendr mayor prioridad cuando no esta metido en la pila que el mismo pero metido en la pila.

B) Tabla de prioridades. Operador de la pila * , / + ,( C) Algoritmo (pseudocdigo) 1. Obtener caracteres de la expresin y repetir pasos 2 al 4 para cada carcter 2. Si es operando, pasarlo a la expresin postfija 3. Si es operador 3.1. Si la pila esta vaca meterlo en la pila. Repetir a partir de 1. 3.2. Si la pila no esta vaca. Si la prioridad del operador ledo es mayor que la prioridad del operador cima de la pila, meterlo en la pila y repetir a partir de 1. Si la prioridad del operador es menor o igual que la prioridad del operador de la cima, sacar de la cima y pasarlo a la expresin postfija, volver a 3. 4. Si es parntesis derecho 4.1. Sacar cima de la pila y pasarlo a la expresin postfija 4.2. Si nueva cima es parntesis izquierdo, suprimir elemento cima. 4.3. Si cima no es parntesis izquierdo, volver a 4.1 4.4. Volver a partir de 1. 5. Si quedan elementos en la pila, pasarlos a la expresin postfija 6. Fin del algoritmo. 0 3 2 1 5 4 2 1 Prioridad dentro de la pila Prioridad fuera

También podría gustarte