E.A.P. INGENIERA DE SISTEMAS E INFORMTICA E.A.P. INGENIERA DE SISTEMAS E INFORMTICA
MANUAL DEL CURSO: MANUAL DEL CURSO: Teora de Lenguajes Teora de Lenguajes (Unidad I) (Unidad I) Tema: Introduccin a la teora de Lenguajes Introduccin a la teora de Lenguajes Dictado por: DIANA CECILIA MUOZ CASANOVA DIANA CECILIA MUOZ CASANOVA M.S. en Ingeniera de Sistemas e Informtica CHIMO!E " #ER$ CHIMO!E " #ER$ %&&' %&&' CA#(!ULO I: HIS!ORIA DE LOS LEN)UA*ES DE #RO)RAMACI+N 1.1. Introduccin 2 1.2. Historia de los lenguajes de programacin 3 1.3. Tendencias en los lenguajes de programacin 7 CA#(!ULO II: E,OLUCI+N DE LOS LEN)UA*ES DE #RO)RAMACI+N 2.1. Evolucin de los lenguajes de programacin 11 2.1.1. Estructurados vs. No estructurados 11 2.1.2. 198!199" # el nacimiento del $%ase 11 2.1.3. &os primeros a'os( 199"!199) las %ases de datos relacionales 12 2.1.*. &a segunda mitad( 199!2""") la orientacin a o%jetos 12 2.1.. El +in de los lenguajes ,.-... 13 2.1./. 2""" # m0s all0) lenguajes visuales 13 2.1.7. 1na visin a la 2e% # al +uturo) 3tml( perl( p3p( pit3on( java # otros 1* 2.2. 4eneraciones de lenguajes de programacin 1 2.3. Tipos de lenguaje de programacin seg5n su campo de aplicacin. 1 2.*. Tipos de lenguaje de programacin en +uncin al estilo de programar 1/ 2.. &enguajes imperativos 1/ 2./. &enguajes +uncionales 18 2./.1. 6oncepto matem0tico de +uncin. 18 2./.2. 6oncepto de lenguajes +uncionales. 19 2./.3. 6ategor7as de lenguajes +uncionales. 2" 2./.*. 8ro%lemas del modelo imperativo 2" 2.7. &enguajes lgicos 9declarativos: 22 2.8. &enguajes orientados a o%jetos 2/ 2.9. &enguajes con concurrencia 27 2.1". Evolucin de los lenguajes de programacin declarativos 29 2.11. Evolucin de los lenguajes de programacin orientado a o%jetos e Imperativos 3" CA#(!ULO III: CONCE#!OS EN LOS LEN)UA*ES DE #RO)RAMACI+N 3.1. ;<u= es lo >ue constitu#e un %uen lenguaje? 31 3.1.1. @tri%utos de un %uen lenguaje 31 3.1.2. EstandariAacin de los lenguajes 32 3.2. .inta$is de lenguajes de programacin 32 3.3. Tipos de datos 33 3.*. @%straccin 3* 3.. @%straccin en programacin 3* 3./. 6lases de a%straccin 3 3./.1. @%straccin de control 3 3./.2. @%straccin de datos. 37 3.7. Tipos a%stractos de datos 9T@,.: 37 3.8. &enguajes de programacin # T@,. 37 3.9. &enguajes de programacin >ue de%er7as aprender 39 3.9.1. 8H8 39 3.9.2. 6B 39 3.9.3. @C@D *" 3.9.*. Cavascript *" 3.9.. 8EE& *1 3.9./. 6 *1 3.9.7. Eu%# # ru%# on rails *1 3.9.8. @.8 *2 CA#(!ULO I,: LEN)UA*ES DE A*O- MEDIO . AL!O NI,EL *.1. Introduccin *3 *.2. &enguajes de %ajo nivel *3 *.2.1. &enguaje m0>uina. ** *.2.2. Ensam%lador. ** @: Fentajas del lenguaje ensam%lador * G: ,esventajas del lenguaje ensam%lador *8 *.3. &enguajes de medio nivel *9 *.*. &enguajes ,e @lto Nivel 2 *.. 4eneradores de aplicaciones o *H nivel 3 CA#(!ULO ,: ELEMEN!OS DE UN LEN)UA*E DE #RO)RAMACI+N .1. Elementos sint0cticos de un lenguaje * .2. Tipos de datos .3. Notaciones de e$presiones / .*. 8ropiedad asociativa # precedencia / .. Eepresentacin de 0r%ol para e$presiones 7 ./. Evaluacin de e$presiones 7 ./.1. Evaluacin mediante la reconstruccin de un 0r%ol 7 ./.2. Evaluacin mediante una pila 8 @: @lgoritmo para trans+ormar una notacin in+ija a post+ija 8 G: Ta%la de prioridades. /" 6: @lgoritmo 9pseudocdigo: /" CA#(!ULO I: HIS!ORIA DE LOS LEN)UA*ES DE #RO)RAMACI+N /0/0 IN!RODUCCI+N 1na computadora es una m0>uina >ue solo comprende las instrucciones >ue se le den en un determinado +ormato. 6ada m0>uina reconoce # ejecuta un n5mero de instrucciones di+erentes >ue se agrupan en los distintos lenguajes de programacin. 1n lenguaje de programacin es un conjunto limitado de pala%ras # de s7m%olos >ue representan procedimientos( c0lculos( decisiones # otras operaciones >ue pueden ejecutar una computadora. @ pesar de >ue en este tra%ajo parte de la divisin de lenguajes de programacin en imperativos # declarativos 9los cuales a su veA se dividen en numerosos su%grupos:( la clasi+icacin m0s com5n # %0sica >ue suele 3acerse de los lenguajes de programacin es la >ue los divide en lenguajes de %ajo # de alto nivel. &os lenguajes de programacin de %ajo nivel +ueron los primeros >ue surgieron # se llaman as7 por>ue est0n directamente relacionados con el 3ard2are del computador( es decir( el usuario introduce una serie de cdigos num=ricos >ue la m0>uina va a interpretar como instrucciones. 8ara usar este lenguaje( el programador ten7a >ue conocer el +uncionamiento de la m0>uina al m0s %ajo nivel # los errores de programacin eran mu# +recuentes. &os lenguajes de alto nivel surgieron con posterioridad con el primer compilador de I-ETE@N 9I-Emula TE@Nslation:( >ue( como su nom%re indica( inici como un JsimpleJ es+uerAo de traducir un lenguaje de +rmulas( al lenguaje ensam%lador # por consiguiente al lenguaje de m0>uina( +acilitando la la%or a los programadores. @ partir de I-ETE@N( se 3an desarrollado innumera%les lenguajes( >ue siguen el mismo concepto) +acilitar la vida al programador( aumentando la productividad. Estos lenguajes usan un n5mero reducido de instrucciones 9normalmente en ingl=s: >ue siguen unas estrictas reglas gramaticales >ue se conocen como sinta$is del lenguaje. 8ero aun>ue el programador de esta +orma se distancie del 3ard2are del computador( este sigue tra%ajando en lenguaje m0>uina. 8or ello se 3ace necesaria una traduccin a una secuencia de instrucciones interpreta%les por el computador. Esta la%or es llevada a ca%o por los compiladores # los int=rpretes. El compilador es un programa >ue se encarga de la traduccin glo%al del programa realiAado por el usuario. Esta operacin reci%e el nom%re de compilacin. El programa es traducido completamente antes de >ue se ejecute( por lo >ue la ejecucin se realiAa en un periodo mu# %reve. El int=rprete por el contrario lleva a ca%o una traduccin inmediata en el momento de la ejecucin( es decir( ir0 ejecutando las instrucciones una a una 3aciendo >ue el proceso re>uiera un periodo de tiempo sensi%lemente ma#or del >ue necesitar7a un compilador. &os int=rpretes son usados para traducir programas de alta di+icultad de implementacin( en estos casos( las rdenes a traducir son de tal complejidad >ue no merece la pena crear un compilador #a >ue este tam%i=n tendr7a >ue ser de una complejidad por encima de lo normal. Ha# >ue mencionar la e$istencia de lenguajes >ue com%inan caracter7sticas de los de alto nivel # los de %ajo nivel 9es decir( Ensam%lador:. 1n ejemplo es 6) contiene estructuras de programacin de alto nivelK sin em%argo( +ue dise'ado con mu# pocas instrucciones( las cuales son sumamente sencillas( +0ciles de traducir al lenguaje de la m0>uinaK # re>uiere de un entendimiento apropiado de cmo +unciona la m0>uina( el uso de la memoria( etc=tera. 8or ello( algunos consideran a lenguajes como 6 9>ue +ue dise'ado para 3acer sistemas operativos:( lenguajes de nivel medio( si %ien( son considerados ma#oritariamente de %ajo nivel. /0%0 HIS!ORIA DE LOS LEN)UA*ES DE #RO)RAMACI+N &os primeros lenguajes de programacin surgieron de la idea de 63arles Ga%agge( la cual se le ocurri a este 3om%re a mediados del siglo DID. Era un pro+esor matem0tico de la universidad de 6am%ridge e inventor ingles( >ue la principio del siglo DID predijo muc3as de las teor7as en >ue se %asan los actuales ordenadores. 6onsist7a en lo >ue =l denomina%a la ma>uina anal7tica( pero >ue por motivos t=cnicos no pudo construirse 3asta mediados del siglo DD. 6on =l cola%oro @da &oved%#( la cual es considerada como la primera programadora de la 3istoria( pues realiAo programas para a>u=lla supuesta ma>uina de Ga%agge( en tarjetas per+oradas. 6omo la ma>uina no llego nunca a construirse( los programas de @da( lgicamente( tampoco llegaron a ejecutarse( pero si suponen un punto de partida de la programacin( so%re todo si o%servamos >ue en cuanto se empeA a programar( los programadores utiliAaron las t=cnicas dise'adas por 63arles Ga%agge( # @da( >ue consist7an entre otras( en la programacin mediante tarjetas per+oradas. @ pesar de ello( @da 3a permanecido como la primera programadora de la 3istoria. .e dice por tanto >ue estos dos genios de anta'o( se adelantaron un siglo a su =poca( lo cual descri%e la inteligencia de la >ue se 3alla%an dotados. En 1823 el go%ierno Grit0nico lo apo#o para crear el pro#ecto de una m0>uina de di+erencias( un dispositivo mec0nico para e+ectuar sumas repetidas. 8ero Ga%agge se dedico al pro#ecto de la m0>uina anal7tica( a%andonando la ma>uina de di+erencias( >ue se pudiera programar con tarjetas per+oradas( gracias a la creacin de 63arles Cac>uard 9+ranc=s:. Este 3om%re era un +a%ricante de tejidos # 3a%7a creado un telar >ue pod7a reproducir autom0ticamente patrones de tejidos( le#endo la in+ormacin codi+icada en patrones de agujeros per+orados en tarjetas de papel r7gido. Entonces Ga%agge intento crear la m0>uina >ue se pudiera programar con tarjetas per+oradas para e+ectuar cual>uier c0lculo con una precisin de 2" d7gitos. 8ero la tecnolog7a de la =poca no %asta%a para 3acer realidad sus ideas. .i %ien las ideas de Ga%agge no llegaron a materialiAarse de +orma de+initiva( su contri%ucin es decisiva( #a >ue los ordenadores actuales responden a un es>uema an0logo al de la m0>uina anal7tica. En su dise'o( la m0>uina consta%a de cinco unidades %0sicas) 1: 1nidad de entrada( para introducir datos e instrucciones. 2: Lemoria( donde se almacena%an datos # resultados intermedios. 3: 1nidad de control( para regular la secuencia de ejecucin de las operaciones. *: 1nidad @ritm=tico!&gica( >ue e+ect5a las operaciones. : 1nidad de salida( encargada de comunicar al e$terior los resultados. 63arles Ga%%age( conocido como el Jpadre de la in+orm0ticaJ no pudo completar en a>uella =poca la construccin del computador >ue 3a%7a so'ado( dado >ue +alta%a algo +undamental) la electrnica. El camino se'alado de Ga%%age( no +ue nunca a%andonado # sigui=ndolo( se constru#eron las primeras computadoras. @l desarrollarse las primeras computadoras electrnicas( se vio la necesidad de programarlas( es decir( de almacenar en memoria la in+ormacin so%re la tarea >ue i%an a ejecutar. &as primeras se usa%an como calculadoras simplesK se les indica%an los pasos de c0lculo( uno por uno. Co3n Fon Neumann desarroll el modelo >ue lleva su nom%re( para descri%ir este concepto de Jprograma almacenadoJ. En este modelo( se tiene una a%straccin de la memoria como un conjunto de celdas( >ue almacenan simplemente n5meros. Estos n5meros pueden representar dos cosas) los datos( so%re los >ue va a tra%ajar el programaK o %ien( el programa en s7. ;6mo es >ue descri%imos un programa como n5meros? .e ten7a el pro%lema de representar las acciones >ue i%a a realiAar la computadora( # >ue la memoria( al estar compuesta por s2itc3es correspondientes al concepto de %it( solamente nos permit7a almacenar n5meros %inarios. &a solucin >ue se tom +ue la siguiente) a cada accin >ue sea capaA de realiAar nuestra computadora( asociarle un n5mero( >ue ser0 su cdigo de operacin 9opcode:. 8or ejemplo( una calculadora programa%le simple podr7a asignar los opcodes) 1 M .1L@( 2 M EE.T@( 3 M L1&TI8&I6@( * M ,IFI,E. .upongamos >ue >ueremos realiAar la operacin N 3 O 2( en la calculadora descrita arri%a. En memoria( podr7amos Jescri%irJ el programa de la siguiente +orma) &ocalidad -pcode .igni+icado 6omentario " En esta localidad( tenemos el primer n5mero de la +rmula 1 3 N En esta localidad( tenemos el opcode >ue representa la multiplicacin. 2 3 3 En esta localidad( tenemos el segundo n5mero de la +rmula 3 1 O En esta localidad( tenemos el opcode >ue representa la suma. * 2 2 En esta localidad( tenemos el 5ltimo n5mero de la +rmula. 8odemos ver >ue con esta representacin( es simple e$presar las operaciones de las >ue es capaA el 3ard2are 9en este caso( nuestra calculadora imaginaria:( en la memoria. &a descripcin # uso de los opcodes es lo >ue llamamos lenguaje de m0>uina. Es decir( la lista de cdigos >ue la m0>uina va a interpretar como instrucciones( descri%e las capacidades de programacin >ue tenemos de ellaK es el lenguaje m0s primitivo( depende directamente del 3ard2are( # re>uiere del programador >ue conoAca el +uncionamiento de la m0>uina al m0s %ajo nivel. &os lenguajes m0s primitivos +ueron los lenguajes de m0>uina. Esto( #a >ue el 3ard2are se desarroll antes del so+t2are( # adem0s cual>uier so+t2are +inalmente tiene >ue e$presarse en el lenguaje >ue maneja el 3ard2are. &a programacin en esos momentos era sumamente tediosa( pues el programador ten7a >ue J%ajarseJ al nivel de la m0>uina # decirle( paso a pasito( cada punto de la tarea >ue ten7a >ue realiAar. @dem0s( de%7a e$presarlo en +orma num=ricaK # por supuesto( este proceso era propenso a errores( con lo >ue la productividad del programador era mu# limitada. .in em%argo( 3a# >ue recordar >ue en estos momentos( simplemente a5n no e$ist7a alternativa. El primer gran avance >ue se dio( +ue la a%straccin dada por el &enguaje Ensam%lador( # con =l( el nacimiento de las primeras 3erramientas autom0ticas para generar el cdigo m0>uina. Esto redujo los errores triviales( como pod7a ser el n5mero >ue correspond7a a una operacin( >ue son sumamente engorrosos # di+7ciles de detectar( pero +0ciles de cometer. .in em%argo( a5n a>u7 es +0cil para el programador perderse # cometer errores de lgica( pues de%e %ajar al nivel de la +orma en >ue tra%aja el 681( # entender %ien todo lo >ue sucede dentro de =l. 6on el desarrollo en los "s # /"s de algoritmos de m0s elevado nivel( # el aumento de poder del 3ard2are( empeAaron a entrar al uso de computadoras cient7+icos de otras ramasK ellos conoc7an muc3o de I7sica( <u7mica # otras ramas similares( pero no de 6omputacin( # por supuesto( les era sumamente complicado tra%ajar con lenguaje Ensam%lador en veA de +rmulas. @s7( naci el concepto de &enguaje de @lto Nivel( con el primer compilador de I-ETE@N 9I-Emula TE@Nslation:( >ue( como su nom%re indica( inici como un JsimpleJ es+uerAo de traducir un lenguaje de +rmulas( al lenguaje ensam%lador # por consiguiente al lenguaje de m0>uina. @ partir de I-ETE@N( se 3an desarrollado innumera%les lenguajes( >ue siguen el mismo concepto) %uscar la ma#or a%straccin posi%le( # +acilitar la vida al programador( aumentando la productividad( encarg0ndose los compiladores o int=rpretes de traducir el lenguaje de alto nivel( al lenguaje de computadora. Ha# >ue notar la e$istencia de lenguajes >ue com%inan caracter7sticas de los de alto nivel # los de %ajo nivel 9es decir( Ensam%lador:. El ejemplo mas apropiado podr7a ser el lenguaje 6 #a >ue puede acceder a los registros del sistema( tra%ajar con direcciones de memoria( todas ellas caracter7sticas de lenguajes de %ajo nivel # a la veA realiAar operaciones de alto nivel. /010 !ENDENCIAS EN LOS LEN)UA*ES DE #RO)RAMACI+N El estudio de los lenguajes de programacin agrupa tres intereses di+erentesK el del programador pro+esional( el del dise'ador del lenguaje # del Implementador del lenguaje. @dem0s( estos tres tra%ajos 3an de realiAarse dentro de las ligaduras # capacidades de la organiAacin de una computadora # de las limitaciones +undamentales de la propia Jcalcula%ilidadJ. El termino Jel 2rogra3adorJ es un tanto amor+o( en el sentido de >ue camu+la importantes di+erencias entre distintos niveles # aplicaciones de la programacin. 6laramente el programador >ue 3a realiAado un curso de doce semanas en 6-G-& # luego entra en el campo del procesamiento de datos es di+erente del programador >ue escri%e un compilador en 8ascal( o del programador >ue dise'a un e$perimento de inteligencia arti+icial en &I.8( o del programador >ue com%ina sus rutinas de I-ETE@N para resolver un pro%lema de ingenier7a complejo( o del programador >ue desarrolla un sistema operativo multiprocesador en @,@. El Jdise4ador del lenguajeJ es tam%i=n un termino algo ne%uloso. @lgunos lenguajes 9como @8& # &I.8: +ueron dise'ados por una sola persona con un concepto 5nico( mientras >ue otros 9I-ETE@N # 6-G-&: son el producto de desarrollo de varios a'os realiAados por comit=s de dise'o de lenguajes. El JI32le3entador del lenguajeJ es la persona o grupo >ue desarrolla un compilador o interprete para un lenguaje so%re una ma>uina particular o tipos de ma>uinas. Las +recuentemente( el primer compilador para el lenguaje P so%re la ma>uina D es desarrollada por la corporacin >ue manu+actura la ma>uina D. 8or ejemplo( 3a# varios compiladores de Iortran en usoK uno desarrollado por IGL para una ma>uina IGL( otro desarrollado por ,E6 para una ma>uina ,E6( otro por 6,6( # as7 sucesivamente. &as compa'7as de so+t2are tam%i=n desarrollan compiladores # tam%i=n lo 3acen los grupos de investigacin de las universidades Ha# tam%i=n muc3os aspectos compartidos entre los programadores( dise'adores de un lenguaje implementadores del mismo. 6ada uno de%e comprender las necesidades # ligaduras >ue go%iernan las actividades de los otros dos. Ha#( al menos( dos +ormas +undamentales desde las >ue pueden verse o clasi+icarse los lenguajes de programacin) por su nivel # por principales aplicaciones. @dem0s( estas visiones est0n condicionadas por la visin 3istrica por la >ue 3a transcurrido el lenguaje &os J&enguajes ,eclarativosJ son los m0s parecidos al castellano o ingles en su potencia e$presiva # +uncionalidad est0n en el nivel mas alto respecto a los otros. .on +undamentalmente lenguajes de ordenes( dominados por sentencias >ue e$presan J&o >ue 3a# >ue 3acerJ en ves de J6omo 3acerloJ. &os lenguajes de J @lto NivelJ son los mas utiliAados como lenguaje de programacin. @un>ue no son +undamentalmente declarativos( estos lenguajes permiten >ue los algoritmos se e$presen en un nivel # estilo de escritura +0cilmente legi%le # comprensi%le por otros programadores. &os J&enguajes Ensam%ladoresJ # los J&enguajes La>uinaJ son dependientes de la ma>uina. 6ada tipo de ma>uina( tal como F@D de digital( tiene su propio lenguaje ma>uina distinto # su lenguaje ensam%lador asociado. El lenguaje Ensam%lador es simplemente una representacin sim%lica del lenguaje ma>uina asociado( lo cual permite una programacin menos tediosa >ue con el anterior. &a programacin de un lenguaje de alto nivel o en un lenguaje ensam%lador re>uiere( por tanto( alg5n tipo de inter+aA con el lenguaje ma>uina para >ue el programa pueda ejecutarse. &as tres inter+aces mas comunes) un Jensam%ladorJ ( un JcompiladorJ # un JinterpreteJ. El ensam%lador # el compilador traduce el programa a otro e>uivalente en el lenguaje D de la ma>uina JresidenteJ como un paso separado antes de la ejecucin. 8or otra parte( el interprete ejecuta directamente las instrucciones en un lenguaje P de alto nivel( sin un paso de procesamiento previo. @lgunos lenguajes son lenguajes principalmente interpretados( como @8&( 8E-&-4 # &I.8. El resto de los lenguajes !! 8ascal( I-ETE@N( 6-G-&( 8&QI( .N-G-&( 6( @da # Lodula!2 R son normalmente lenguajes compilados. En algunos casos( un compilador estar0 utiliAa%le alternativamente para un lenguaje interpretado 9tal como &I.8: e inversamente 9tal como el interprete .N-G-&* de los la%oratorios Gell:. Irecuentemente la interpretacin es pre+eri%le a la compilacin en un entorno de programacin e$perimental o de educacin( donde cada nueva ejecucin de un programa implicado un cam%io en el propio te$to del programa. &a calidad de diagnosis # depuracin >ue soportan los lenguajes interpretados es generalmente mejor >ue la de los lenguajes compilados( puesto >ue los mensajes de error se re+ieren directamente a sentencias del te$to del programa original. @dem0s( la ventaja de la e+iciencia >ue se adjudica tradicionalmente a los lenguajes compilados +rente a los interpretados puede pronto ser eliminado( de%ido a la evolucin de las ma>uinas cu#os lenguajes son ellos mismos1lenguajes de alto nivel. 6omo ejemplo de estos est0n las nuevas ma>uinas &I.8( las cuales 3an sido dise'adas recientemente por .#m%olics # Dero$ 6orporations. &os lenguajes de 8rogramacin son tomados de di+erentes perspectivas. Es importante para un programador decidir cuales conceptos emitir o cuales incluir en la programacin. 6on +recuencia el programador es osado a usar com%inaciones de conceptos >ue 3acen al lenguaje J,1E-J de usar( de entender e implementar. 6ada programador tiene en mente un estilo particular de programacin( la decisin de incluir u omitir ciertos tipos de datos >ue pueden tener una signi+icativa in+luencia en la +orma en >ue el &enguaje es usado( la decisin de usar u omitir conceptos de programacin o modelos. E$isten cinco estilo de programacin # son los siguientes) /0 I32erati5a : Entrada( procesamiento # salidas de ,atos. %0 6uncional : JIuncionesJ( los datos son +unciones( los resultados pueden ser un valor o una +uncin. 10 Lgico : ST(IT O operaciones lgicos 9Inteligencia @rti+icial:. 70 Orientados a O8jetos: 6lases( encapsulamiento de datos Herencia de datos( polimor+ismo 90 Concurrente0 El programador( dise'ador e implementador de un lenguaje de programacin de%en comprender la evolucin 3istrica de los lenguajes para poder apreciar por >ue presentan caracter7sticas di+erentes. 8or ejemplo( los lenguajes Jmas jvenesJ desaconsejan 9o pro3i%en: el uso de las sentencias 4-T- como mecanismo de control in+erior( # esto es correcto en el conte$to de las +iloso+7as actuales de ingenier7a del so+t2are # programacin estructurada. 8ero 3u%o un tiempo en >ue la 4-T-( com%inada con la II( era la 5nica estructura de control disponi%leK el programador no dispone de algo como la construccin UHI&E o un II!THEN!E&.E para elegir. 8or tanto( cuando se ve un lenguaje como I-ETE@N( el cual tiene sus ra7ces en los comienAos de la 3istoria de los lenguajes de programacin( uno no de%e sorprenderse de ver la antigua sentencia 4-T- dentro de su repertorio. &o mas importante es >ue la 3istoria nos permite ver la evolucin de +amilias de lenguajes de programacin( ver la in+luencia >ue ejercer las ar>uitecturas # aplicaciones de las computadoras so%re el dise'o de lenguajes # evitar +uturos de+ectos de dise'o aprendido las lecciones del pasado. &os >ue estudian se 3an elegido de%ido a su ma#or in+luencia # amplio uso entre los programadores( as7 como por sus distintas caracter7sticas de dise'o e implementacion. 6olectivamente cu%ren los aspectos m0s importantes con los >ue 3a de en+rentarse el dise'ado de lenguajes # la ma#or7a de las aplicaciones con las >ue se en+renta el programador. Tam%i=n varios lenguajes est0n pre+ijados por las letras @N.I. Esto signi+ica >ue el @merican National .tandards Institute 3a adoptado esa versin del lenguaje como el est0ndar nacional. 1na veA >ue un lenguaje esta estandariAado( las ma>uinas >ue implementan este lenguaje de%en cumplir todas las especi+icaciones est0ndares( re+orAando as7 el m0$imo de transporta%ilidad de programas de una ma>uina a otra. &a polic7a +ederal de no comprar ma>uinas >ue no cumplan la versin est0ndar de cual>uier lenguaje >ue soporte tiende a J+ortalecerJ el proceso de estandariAacion( puesto >ue el go%ierno es( con muc3o( el ma#or comprador de computadoras de la nacin. Iinalmente( la notacin alge%raica ordinaria( por ejemplo( in+lu#o +uertemente en el dise'o de I-ETE@N # @&4-&. 8or otra parte( el ingles in+lu#o en el desarrollo del 6-G-&. El lam%da calculo de 63urc3 dio los +undamentos de la notacin +uncional de &I.8( mientras >ue el algoritmo de LarVov motivo el estilo de reconocimiento de +ormas de .N-G-&. &a ar>uitectura de computadoras de Fon Neumann( la cual +ue una evolucin de la ma>uina mas antigua de Turing( es el modelo %0sico de la ma#or7a de los dise'os de computadoras de las ultimas tres d=cadas. Esta ma>uina no solo in+lu#eron en los primeros lenguajes sino >ue tam%i=n suministraron el es>ueleto operacional so%re el >ue evoluciono la ma#or7a de la programacin de sistemas. 1na discusin mas directa de todos estos primeros modelos no est0n entre los o%jetivos de este te$to. .in em%argo( es importante apuntar a>u7 de%ido a su +undamental in+luencia en la evolucin de los primeros lenguajes de programacin( por una parte( # por su estado en el n5cleo de la teor7a de la computadora( por otra. Las so%re este punto( cual>uier algoritmo >ue pueda descri%irse en ingles o castellano puede escri%irse igualmente como una ma>uina de Turing 9ma>uina de Fon Neumann:( un algoritmo de LarVov o una +uncin recursiva. Esta seccin( conocida ampliamente como Jtesis de 63urc3J( nos permite escri%ir algoritmos en distintos estilos de programacin 9lenguajes: sin sacri+icar ninguna medida de generalidad( o potencia de programacin( en la transicin. CA#(!ULO II: E,OLUCI+N DE LOS LEN)UA*ES DE #RO)RAMACI+N %0/0 E,OLUCI+N DE LOS LEN)UA*ES DE #RO)RAMACI+N %0/0/0 ES!RUC!URADOS ,S0 NO ES!RUC!URADOS @ partir de 6 el gran lenguaje( # 8ascalK se dividen los lenguajes en estructurados 9a>uellos >ue en su codi+icacin usa%an una estructura jer0r>uica de procedimientos # +unciones:( en contraposicin a los lenguajes no estructurados como el Gasic cu#a codi+icacin se %asa%a en l7neas de programacin( permitiendo al programador JsaltarJ de una l7nea de instruccin a otra( 3aciendo >ue el cdigo +uera algunas veces inentendi%le # mu# di+7cil de mantener 9modi+icar: por>ue no segu7a una estructura. Gasic de todos modos evolucion( primero con el a3ora primitivo 4U Gasic( teniendo su m0$ima e$presin con el <uicV Gasic del ,.-... ."( el cual #a inclu7a algunos conceptos mas de avanAada # m0s JaggiornadosJ a lo >ue eran sus contrapartes estructuradas. %0/0%0 /:;9</::& . EL NACIMIEN!O DEL =ASE ,Gase +ue el gran desarrollo para %ase de datos de los a'os 8". Gajo la %atuta de la +irma @s3ton Tate( empresa >ue dio origen a un interprete de %ases de datos mu# sencillo # poderoso) dG%ase II. &uego vinieron el dGase IIIO >ue 3iAo +uror( # la etapa de la decadencia para dGase) el dGase IF( #a %ajo la direccin de Gorland. @s7 surgi el gran compilador 6lipper( de NantucVet 6orp.( en su versin @utumm 8/ >ue permit7a generar ejecuta%les li%res de ro#alties # sin runtimes( incluso tomando en +orma directa el cdigo dGase. 8ero no solo era eso( proveia cientos de comandos # +unciones para potenciar al dGase. @l ver el =$ito de dGase # 6lipper( surgi la empresa Io$ .o+t2are >ue desarrollo el Io$Gase 9un clon de dGase IIIO: # supero al JmaestroJ con su versin Io$ 8lus( pero aun as7( nunca pudo superar a 6lipper #a >ue siempre lidio con su pol7tica de necesitar de runtimes para su ejecucin( cosa >ue 6lipper nunca necesit. %0/010 LOS #RIMEROS A>OS- /::&</::9: LAS ASES DE DA!OS RELACIONALES @ principios de la d=cada pasada( se nota la evolucin de los lenguajes de programacin. En +orma pro+esional # aplicaciones de alto nivel( el lenguaje pre+erido era 6. 8ara el aprendiAaje se usa%a 8ascal( >ue permit7a inculcar el concepto de programacin estructurada. Tam%i=n Gasic( era un lenguaje utiliAado( no en pocas ocasiones en +orma pro+esional( aun>ue con ciertas limitacionesK su reinado estuvo en los a'os 8". En lenguaje 6( +ue # todav7a es el gran art7+ice de la computacin actual. @ partir de el se desarrollaron compiladores >ue realmente constitu7an otros lenguajes de programacin. Es decir un lenguaje >ue crea otros lenguajes. Tal es el caso de la estrella de la primera mitad de la d=cada pasada) 6lipper de NantucVet 6orp.( el gran compilador de lenguaje D%ase. 6lipper +ue criticado por los pro+esionales de la programacin >uienes aduc7an >ue no era un lenguaje( sino un simple compilador nacido de la necesidad de aligerar la ejecucin de cdigo del Interprete >ue le dio su origen( es decir el dGase. 8ero realmente 6lipper( gracias a llevar dentro su cdigo un coraAn de lenguaje 6( +ue mu# +0cil de utiliAar # alcanAo gran popularidad. .e desarrollaron li%rer7a e$ternas( # con la programacin al estilo 6 a partir de su versin ." # la inclusin de o%jetos( se convirti en uno de los +avoritos de la programacin administrativa( junto con 8ascal. Todos los lenguajes D%ase se %asa%an en el concepto de %ases de datos relacionales( es decir la agrupacin de la in+ormacin en +orma de ta%las( denominadas campos # registros( cada uno de ellos pre+ormateados para reci%ir cierto tipo de dato 9ej) +ec3as( caracteres( n5meros( valores lgicos( etc.:K pudiendo JunirJ di+erentes %ases por medio de campos comunes. %0/070 LA SE)UNDA MI!AD- /::9<%&&&: LA ORIEN!ACI+N A O*E!OS @ medida >ue los a'os van pasando el concepto de Gases relacionales empieAa a decaer relativamente( surge entonces una variante >ue se aplica a todos los lenguajes) &a orientacin a o%jetos. Pa no solo se 3a%la de programacin estructurada( sino >ue los mdulos de programacin son vistos como o%jetos( las estructuras representan o%jetos #Qo +unciones >ue se adaptan en +orma general a procesos espec7+icos es la ma$imiAacin de la programacin modular. El modelo de o%jetos englo%a los conceptos de encapsulacin( 3erencia # poli+ormismo( el cual se aplica a los datos # al tipo de %ases de datos >ue almacena la in+ormacin. &a orientacin a o%jetos signi+ica la agrupacin de entidades de datos de +orma glo%al( de tal manera >ue puedan ser interpretados de una +orma com5n por una misma estructura de programacin. %0/090 EL 6IN DE LOS LEN)UA*ES D0O0S0 Uindo2s 9 marca el comienAo del +in de la programacin ,.-... # por lo tanto de los lenguajes %asados en este. Este proceso no +ue en=rgico( todav7a 3o#( estamos viviendo esta etapa. Todav7a 3a# numerosos # e$celentes sistemas desarrollados %ajo entorno ,.-... ejecut0ndose pero cada veA son los menos. Feamos >ue 3icieron los lenguajes ,.-... para mantenerse en el mercado) 6lipper trato de evolucionar 3acia Uindo2s %ajo la %atuta de 6omputer @ssociates con el nom%re de Fisual -%jects( el cual +ue un +racaso. @l igual >ue Fisual ,%ase ." %ajo la r%ita de Gorland. &os 5nicos Jso%revivientesJ al menos en esencia son Fisual Io$ 9Licroso+t:( Fisual Gasic 9Licroso+t:( ,elp3i 9Gorland: # Fisual 6 9Licroso+t: %0/0?0 %&&& . M@S ALL@: LEN)UA*ES ,ISUALES 6on al llegada de Uindo2s todo es Fisual( todo es iconos( todo es %otones( todo es Fentanas. 8ara programar en lenguajes visuales( primero 3a# >ue comprender lo >ue es Uindo2s. &a +orma de programar los sistemas evolucion radicalmente. 6on Uindo2s es preciso programar conservando las convenciones del mismo( guardando sus caracter7sticas # +uncionalidades. &os sistemas 3ec3os para Uindo2s( de%en ser tan Uindo2s como el propio sistema operativo. &a +orma de programar se %asa en o%jetos( cada uno de los cuales tiene sus 8ropiedades # +unciones. .e %asa en la programacin de eventos para dic3os o%jetos. -tro detalle es >ue la programacin se %asa en componentes 9-&E( -6D( @ctiveD:( los cuales reducen nota%lemente el tra%ajo de la programacin al proporcionar 3erramientas antes impensadas en la programacin ,.-... Todos los lenguajes visuales o+recen E@, 9Eapid @plication ,evelopment: o UiAAardsK con lo cual comenAaron a prometer 3acer aplicaciones en poco tiempo( incluso para ine$pertos. &ejos esta%an #a los tiempos en >ue programar era solo usar un simple editor de te$tos. @3ora las 3erramientas de programacin son poderosas. .on casi un sistema operativo( por asi decirloK con entornos de desarrollo avanAado # e$celentes ,e%uggers. &as incursiones cada veA mas innovadoras de Licroso+t parecen imponer a la 2e% como el centro de desarrollo de aplicaciones) Licroso+t .NET %0/0'0 UNA ,ISI+N A LA AE . AL 6U!URO: H!ML- #ERL- #H#- #I!HON- *A,A . O!ROS Internet 3a sido el disparador de nuevos lenguajes tales como el HTL& >ue es el lenguaje de programacin de las p0ginas UEG para 3iperte$to. El mismo constitu#e una codi+icacin %astante simple( %asada en marcadores 9T@4s:. ,e la misma manera( cuando se 3ace necesario proveer de +unciones adicionales a un servicio 2e% se recurre a 8erl o a 8it3on >ue son lenguajes >ue nos permiten escri%ir scripts para ser alojados en los servidores a e+ectos de proveer contadores( estad7sticas( ranVings( etc. 8or otra parte Cava( %ajo la direccin de .1N( constitu#e la idea de la programacin a%ierta # universal para las aplicaciones de escritorio( pero todav7a los est0ndares visuales 96( Gasic # ,elp3i:( son demasiado poderosos como para desplaAarlos( a pesar de >ue Cava promete tam%i=n ser un lenguaje de e$celentes prestaciones. &as nuevas tecnolog7as UEG inundan el mercado) 8H8( @.8( DL&( ,HTL&( DHTL&( @C@D lo cual enri>uecen la +orma de manejar la in+ormacin # su presentacin al usuario +inal. %0%0 )ENERACIONES DE LEN)UA*ES DE #RO)RAMACI+N &a evolucin de los lenguajes de programacin se puede dividir en etapas o generaciones. /0 #ri3era generacin: lenguaje ma>uina. %0 Segunda generacin: se crearon los primeros lenguajes ensam%ladores. 10 !ercera generacin: se crean los primeros lenguajes de alto nivel. Ej. 6( 8ascal( 6o%olW 70 Cuarta generacin0 .on los lenguajes capaces de generar cdigo por si solos( son los llamados E@,( con lo cuales se pueden realiAar aplicaciones sin ser un e$perto en el lenguaje. @>u7 tam%i=n se encuentran los lenguajes orientados a o%jetos( 3aciendo posi%le la reutiliAacin d partes del cdigo para otros programas. 90 Buinta generacin: a>u7 se encuentran los lenguajes orientados a la inteligencia arti+icial.. Ej. 8E-&-4 %010 !I#OS DE LEN)UA*E DE #RO)RAMACI+N SE)$N SU CAM#O DE A#LICACI+N0 A2licaciones cientCicas0 En este tipo de aplicaciones predominan las operaciones num=ricas o matriciales propias de algoritmos matem0ticos. &enguajes adecuados son I-ETE@N # 8@.6@& A2licaciones en 2rocesa3iento de datos0 En estas aplicaciones son +recuentes las operaciones de creacin( mantenimiento # consulta so%re +ic3eros # %ases de datos. ,entro de este campo estar7an aplicaciones de gestin empresarial( como programas de nominas( conta%ilidad +acturacin( control de inventario( etc. &enguajes aptos para este tipo de aplicaciones son 6-G-& # .<&. A2licaciones de trata3iento de teDtos0 Estas aplicaciones est0n asociadas al manejo de te$tos en lenguaje natural. 1n lenguaje mu# adecuado para este tipo de aplicaciones es el 6. A2licaciones en inteligencia artiCicial0 ,entro de este campo( destacan las aplicaciones en sistemas e$pertos( juegos( visin arti+icial( ro%tica. &os lenguajes m0s populares dentro del campo de la inteligencia arti+icial son &I.8 # 8E-&-4 A2licaciones de 2rogra3acin de siste3as0 En este campo se incluir7an la programacin de so+t2are de inter+aA entre el usuario # el 3ard2are( como son los mdulos de un sistema operativo # los traductores. Tradicionalmente para estas aplicaciones se utiliAa%a el Ensam%lador( no o%stante en la actualidad se muestran mu# adecuados los lenguajes @,@( L-,1&@!2 # 6. Lenguajes de Internet0 HTL&( C@F@( 8erl( 8H8( etc %070 !I#OS DE LEN)UA*E DE #RO)RAMACI+N EN 6UNCI+N AL ES!ILO DE #RO)RAMAR &enguajes imperativos &enguajes +uncionales &enguajes lgicos 9declarativos: &enguajes orientados a o%jetos &enguajes con concurrencia %090 LEN)UA*ES IM#ERA!I,OS En este tipo de lenguajes( cu#o origen est0 ligado a la propia ar>uitectura de von Neumann( la ar>uitectura consta de una secuencia de celdas( llamadas memoria( en la cual se pueden guardar en +orma codi+icada( lo mismo datos >ue instruccionesK # de un procesador( el cual es capaA de ejecutar de manera secuencial una serie de operaciones( principalmente aritm=ticas # %ooleanas( llamadas comandos. En general( un lenguaje imperativo o+rece al programador conceptos >ue se traducen de +orma natural al modelo de la m0>uina.&os lenguajes imperativos m0s destacados de la 3istoria 3an sido) 6OR!RAN- Algol- #ascal- C- Modula<%- Ada El programador( al utiliAar un lenguaje imperativo( por lo general tiene >ue traducir la solucin a%stracta del pro%lema a t=rminos mu# primitivos( cercanos a la m0>uina. &a distancia entre el nivel del raAonamiento 3umano # lo e$presa%le por los lenguajes imperativos causa >ue sus programas sean m0s Jcomprensi%lesJ para la m0>uina >ue para el 3om%re. Esta desventaja para nosotros( re+lejada en la di+icultad >ue tenemos al construir programas en un lenguaje imperativo( se vuelve una ventaja en el momento de la generacin del cdigo. El programa est0 e$presado en t=rminos tan cercanos a la m0>uina( >ue el cdigo generado es relativamente parecido al programa original( lo >ue permite cierta e+iciencia en la ejecucin. Eje32lo: Este ser7a el cdigo de un programa >ue determina el +actorial de un n5mero en un lenguaje imperativo inventado) procedimiento +actorial9entero n:S entero resultado M 1K mientras 9n X ": S resultado M resultado N nK n M n ! 1K T devuelve resultadoK T Este procedimiento 9o +uncin: reci%e un n5mero entero n. ,eclara una varia%le resultado >ue ser0 el resultado +inal a devolver. Inicialmente( tiene como valor el 1. ,espu=s llega una estructura de control denominada %ucle( >ue se ejecuta mientras la condicin e$presada entre los par=ntesis 9n X ": sea cierta. ,entro del %ucle se multiplica la varia%le resultado por n # el valor se deja de nuevo en resultado. &a siguiente sentencia 9n M n ! 1: es necesaria para ir 3aciendo el +actorial( as7 como para salir en alg5n momento del %ucle. 8or 5ltimo( tras salir del %ucle #a podemos devolver el valor +inal( >ue estar0 en la varia%le resultado. Ntese >ue( si en un principio( la varia%le n es "( no se entrar0 en el %ucle al no ser cierta la condicin( por lo >ue pasar7a directamente a devolver la varia%le resultado( >ue tiene valor inicial 1 9"Y M 1:. %0?0 LEN)UA*ES 6UNCIONALES %0?0/0 CONCE#!O MA!EM@!ICO DE 6UNCI+N0 8uede ser de+inida como una corres2ondencia entre dos varia%les( una llamada varia%le dependiente # otra llamada varia%le dependiente. Feamos la siguiente notacin) E F CGDH Donde: E: Es la varia%le dependiente de la +uncin. .e le llama dependiente por>ue para >ue pueda tomar un valor( depende de los valores >ue pueda tomar la varia%le D. Tam%i=n podemos decir >ue ZE esta en +uncin de D[. D: Es la varia%le independiente de la +uncin. .e dice >ue es independiente #a >ue puede tomar los valores >ue >uiera # no 3a# nada >ue se lo impidaK o sea( tiene independencia. C: .e puede decir >ue es el procedimiento o ecuacin >ue tomar0 a D para devolverle un valor a E. Feamos una +uncin mu# com5n) E F D % I D &a +uncin anterior tiene a E como varia%le dependiente # a D como varia%le independiente( # el procedimiento es elevar a D 9varia%le independiente: al cuadrado # sumarle D. 8or cada valor >ue tome D( a E le corresponder0 otro. Tam%i=n podemos tener una +uncin con m0s de una varia%le dependiente... E F D I J " / K GL I 1H En el sistema anterior podemos encontrar >ue la varia%le dependiente 9en este caso E: esta en +uncin de 3 varia%les independientes 9en este caso D- J- L:. 4eneralmente en las matem0ticas las varia%les dependientes est0n representadas por la letra E( aun>ue tam%i=n las podemos representar con letras como J- L( D- g- etc. siempre # cuando sean di+erentes de las varia%les independientesK as7 mismo( la o las varia%les independientes se pueden representar de la misma +orma( teniendo en cuenta >ue no de%en ser iguales a las dependientes. %0?0%0 CONCE#!O DE LEN)UA*ES 6UNCIONALES0 &os matem0ticos desde 3ace un %uen tiempo est0n resolviendo pro%lemas usando el concepto de +uncin. 1na +uncin convierte ciertos datos en resultados. .i supi=ramos cmo evaluar una +uncin( usando la computadora( podr7amos resolver autom0ticamente muc3os pro%lemas. @s7 pensaron algunos matem0ticos( >ue no le ten7an miedo a la m0>uina( e inventaron los lenguajes de programacin +uncionales. @dem0s( aprovec3aron la posi%ilidad >ue tienen las +unciones para manipular datos sim%licos( # no solamente num=ricos( # la propiedad de las +unciones >ue les permite componer( creando de esta manera( la oportunidad para resolver pro%lemas complejos a partir de las soluciones a otros m0s sencillos. Tam%i=n se inclu# la posi%ilidad de de+inir +unciones recursivamente. 1n lenguaje +uncional o+rece conceptos >ue son mu# entendi%les # relativamente +0ciles de manejar para todos los >ue no se durmieron en las clases de matem0ticas. El lenguaje +uncional m0s antiguo( # seguramente el m0s popular 3asta la +ec3a( es LIS#( dise'ado por Lc6art3# en la segunda mitad de los a'os ". .u 0rea de aplicacin es principalmente la Inteligencia @rti+icial. En la d=cada de los 8" 3u%o una nueva ola de inter=s por los lenguajes +uncionales( a'adiendo la tipi+icacin # algunos conceptos modernos de modulariAacin # polimor+ismo( como es el caso del lenguaje ML0 8rogramar en un lenguaje +uncional signi+ica construir +unciones a partir de las #a e$istentes. 8or lo tanto es importante conocer # comprender %ien las +unciones >ue con+orman la %ase del lenguaje( as7 como las >ue #a +ueron de+inidas previamente. ,e esta manera se pueden ir constru#endo aplicaciones cada veA m0s complejas. &a desventaja de este modelo es >ue resulta %astante alejado del modelo de la m0>uina de Fon Neumann #( por lo tanto( la e+iciencia de ejecucin de los int=rpretes de lenguajes +uncionales no es compara%le con la ejecucin de los programas imperativos precompilados. 8ara remediar la de+iciencia( se est0 %uscando utiliAar ar>uitecturas paralelas >ue mejoren el desempe'o de los programas +uncionales( sin >ue 3asta la +ec3a estos intentos tengan un impacto real importante. %0?010 CA!E)OR(AS DE LEN)UA*ES 6UNCIONALES0 E$isten dos categor7as de lenguajes +uncionales) los +uncionales puros # los 37%ridos( &a di+erencia entre am%os estri%a en >ue los lenguajes +uncionales 37%ridos son menos dogm0ticos >ue los puros( al admitir conceptos tomados de los lenguajes imperativos( como las secuencias de instrucciones o la asignacin de varia%les. En contraste( los lenguajes +uncionales puros tienen una ma#or potencia e$presiva( conservando a la veA su transparencia re+erencial( algo >ue no se cumple siempre con un lenguaje +uncional 37%rido. Entre los lenguajes +uncionales puros( ca%e destacar a HasVell # Liranda. &os lenguajes +uncionales 37%ridos m0s conocidos son &isp( .c3eme( -caml # .tandard L& 9estos dos 5ltimos( descendientes del lenguaje L&:. %0?070 #ROLEMAS DEL MODELO IM#ERA!I,O &os programas escritos en lenguajes de programacin tradicionales 9imperativo: como 8ascal( 6( @,@( etc. +orman una a%straccin de la m0>uina de Fon!Neumann caracteriAada por) Me3oria #rinci2al para almacenamiento de datos # cdigo m0>uina. Unidad Central de #roceso con una serie de registros de almacenamiento temporal # un conjunto instrucciones de c0lculo aritm=tico( modi+icacin de registros # acceso a la Lemoria 8rincipal. &os programas imperativos est0n +ormados por una serie de datos glo%ales # un conjunto de instrucciones cdigo. Estos dos elementos +orman una a%straccin de los datos # cdigo de la memoria principal. El programador tra%aja en un nivel cercano a la m0>uina lo >ue le permite generar programas e+icientes. 6on esta pro$imidad aparece( sin em%argo( una dependencia entre el algoritmo # la ar>uitectura >ue impide( por ejemplo( utiliAar algoritmos programados para ar>uitecturas secuenciales en ar>uitecturas paralelas. &os algoritmos escritos en lenguajes imperativos se e$presan mediante una secuencia de instrucciones >ue modi+ican el estado de un programa accediendo a los datos glo%ales de la memoria. En este punto es donde empieAan los pro%lemas) Eje32lo 8rogram prue%aK var +lag)%ooleanK +unction + 9n) integer:)integerK %egin +lag)Mnot +lagK i+ +lag t3en +)MnK else +)M2NnK endK ........ !!8rograma principal %egin +lag)MtrueK ...... 2rite9+91::K retorna 2 2rite9+91::K retorna 1 ....... 2rite9+91: O +92::K retorna 4 2rite9+92: O +91::K retorna 5 En el primer caso la e$presin +91: retorna valores di+erentes dependiendo de la secuencia de ejecucin # en el segundo no se cumplen propiedades matem0ticas simples tales como la conmutatividad. Estos ejemplos ponen en evidencia >ue ciertas caracter7sticas de los lenguajes imperativos tales como la asignacin pueden traer consigo e+ectos laterales inesperados >ue oscurecen la sem0ntica del programaK en consecuencia se 3ace di+7cil demostrar >ue los programas cumplen con los re>uerimientos especi+icados # >ue est=n li%res de errores. Este # otros pro%lemas son in3erentes al modelo computacional utiliAado( por ende una solucin +acti%le de ser aplicada puede ser cam%iar el modelo computacional. Entre otras alternativas se encuentran el modelo +uncional o aplicativo cu#o o%jetivo es descri%ir los pro%lemas mediante +unciones matem0ticas sin e+ectos laterales( # el modelo lgico o declarativo >ue descri%e los pro%lemas mediante relaciones entre o%jetos o entidades. %0'0 LEN)UA*ES L+)ICOS GDECLARA!I,OSH -tra +orma de raAonar para resolver pro%lemas en matem0ticas se +undamenta en la lgica de primer orden. El conocimiento %0sico de las matem0ticas se puede representar en la lgica en +orma de a$iomas( a los cuales se a'aden reglas +ormales para deducir cosas verdaderas 9teoremas: a partir de los a$iomas. 4racias al tra%ajo de algunos matem0ticos( de +inales de siglo pasado # principios de =ste( se encontr la manera de automatiAar computacionalmente el raAonamiento lgico !particularmente para un su%conjunto signi+icativo de la lgica de primer orden! >ue permiti >ue la lgica matem0tica diera origen a otro tipo de lenguajes de programacin( conocidos como lenguajes lgicos. Tam%i=n se conoce a estos lenguajes( # a los +uncionales( como lenguajes declarativos( por>ue el programador( parar solucionar un pro%lema( todo lo >ue tiene >ue 3acer es descri%irlo v7a a$iomas # reglas de deduccin en el caso de la programacin lgica # v7a +unciones en el caso de la programacin +uncional. En los lenguajes lgicos se utiliAa el +ormalismo de la lgica para representar el conocimiento so%re un pro%lema # para 3acer preguntas >ue( si se demuestra >ue se pueden deducir a partir del conocimiento dado en +orma de a$iomas # de las reglas de deduccin estipuladas( se vuelven teoremas. @s7 se encuentran soluciones a pro%lemas +ormulados como preguntas. 6on %ase en la in+ormacin e$presada dentro de la lgica de primer orden( se +ormulan las preguntas so%re el dominio del pro%lema # el int=rprete del lenguaje lgico trata de encontrar la respuesta autom0ticamente. El conocimiento so%re el pro%lema se e$presa en +orma de predicados 9a$iomas: >ue esta%lecen relaciones so%re los s7m%olos >ue representan los datos del dominio del pro%lema. En el caso de la programacin lgica( el tra%ajo del programador se restringe a la %uena descripcin del pro%lema en +orma de 3ec3os # reglas. @ partir de =sta se pueden encontrar muc3as soluciones dependiendo de como se +ormulen las preguntas 9metas:( >ue tienen sentido para el pro%lema. .i el programa est0 %ien de+inido( el sistema encuentra autom0ticamente las respuestas a las preguntas +ormuladas. En este caso #a no es necesario de+inir el algoritmo de solucin( como en la programacin imperativa( en cam%io( lo +undamental a>u7 es e$presar %ien el conocimiento so%re el pro%lema mismo. En programacin lgica( al igual >ue en programacin +uncional( el programa( en este caso los 3ec3os # las reglas( est0n mu# alejados del modelo von Neumann >ue posee la m0>uina en la >ue tienen >ue ser interpretadosK por lo tanto( la e+iciencia de la ejecucin no puede ser compara%le con la de un programa e>uivalente escrito en un lenguaje imperativo. .in em%argo( para cierto tipo de pro%lemas( la +ormulacin del programa mismo puede ser muc3o m0s sencilla # natural 9para un programador e$perimentado( por supuesto:. #ROLO) 8rolog( proveniente del +ranc=s 8rogramation et &ogi>ue( sus or7genes se remotan a los inicios de la d=cada de los 7" con los tra%ajos del grupo de @. 6olmerauer en Larsella( Irancia. Es un lenguaje de programacin lgico e interpretado( %astante popular en el medio de investigacin en Inteligencia @rti+icial. Historia .e trata de un lenguaje de programacin ideado a principios de los a'os 7" en la universidad de @i$!Larseille por los pro+esores @lain 6olmerauer # 83illipe Eoussel. Inicialmente se trata%a de un lenguaje totalmente interpretado 3asta >ue( a mediados de los 7"( ,avid H.,. Uarren desarroll un compilador capaA de traducir 8rolog en un conjunto de instrucciones de una m0>uina a%stracta denominada Uarren @%stract Lac3ine( o a%reviadamente( U@L. ,esde entonces 8rolog es un lenguaje semi!interpretado. 8rolog se enmarca en el paradigma de los lenguajes lgicos( lo >ue lo di+erencia enormemente de otros lenguajes m0s populares tales como Iortran( 8ascal( 6. Retrosegui3iento En todos los mencionados( las instrucciones se ejecutan normalmente en orden secuencial( es decir( una a continuacin de otra( en el mismo orden en >ue est0n escritas( >ue slo var7a cuando se alcanAa una instruccin de control 9un %ucle( una instruccin condicional o una trans+erencia:. &os programas en 8rolog se componen de cl0usulas de Horn >ue constitu#en reglas del tipo Jmodus ponendo ponensJ( es decir( J.i es verdad el antecedente( entonces es verdad el consecuenteJ. No o%stante( la +orma de escri%ir las cl0usulas de Horn es al contrario de lo 3a%itual. 8rimero se escri%e el consecuente # luego el antecedente. El antecedente puede ser una conjuncin de condiciones >ue se denomina secuencia de o%jetivos. 6ada o%jetivo se separa con una coma # puede considerarse similar a una instruccin o llamada a procedimiento de los lenguajes imperativos. En 8rolog no e$isten instrucciones de control. .u ejecucin se %asa en dos conceptos) la uni+icacin # el %acVtracVing. 4racias a la uni+icacin( cada o%jetivo determina un su%conjunto de cl0usulas suscepti%les de ser ejecutadas. 6ada una de ellas se denomina punto de eleccin. 8rolog selecciona el primer punto de eleccin # sigue ejecutando el programa 3asta determinar si el o%jetivo es verdadero o +also. En caso de ser +also entra en juego el \%acVtracVing\( >ue consiste en des3acer todo lo ejecutado situando el programa en el mismo estado en el >ue esta%a justo antes de llegar al punto de eleccin. Entonces se toma el siguiente punto de eleccin >ue esta%a pendiente # se repite de nuevo el proceso. Todos los o%jetivos terminan su ejecucin %ien en =$ito 9JverdaderoJ:( %ien en +allo 9J+alsoJ:. ED2resiones 8rolog cuenta con operadores para la uni+icacin # comparacin sea con evaluacin o sea sim%lica como lo siguiente) D is P ]uni+icacin con evaluacin. D M P ]uni+icacin sim%lica DM)MP ]comparacin con evaluacin DMMP ]comparacin sim%lica. Listas &a representacin de 3ec3os simples no es lo com5n en la clasi+icacin de elementos( sino >ue se agrupan los elementos de un mismo tipo en una lista. Eje32lo: ] .i >ueremos 3allar la longitud de una lista. ] &a longitud de una lista vacia es ". ] &a longitud de cual>uier lista es la longitud de la cola O 1. longitud9^_(":. longitud9^H`T_(N:)!longitud9T(N":( N is N" O 1. ?! longitud9^a(%(c_(&:. 3 ?! longitud9^a(%(c_(*:. No ] .i >ueremos determinar si un elemento es pertenece a una lista. ] El elemento pertenece a la lista si coincide con la ca%eAa de la lista. ] El elemento pertenece a la lista si es se encuentra en la cola de la lista. pertenece9D(^D`a_:. pertenece9D(^a`E_:)! pertenece9D(E:. ?! pertenece9%(^a(%(c_:. Pes ?! pertenece9%(^a(^%(c__:. No ?! pertenece9^%(c_(^a(^%(c__:. Pes ] .i >ueremos eliminar un elemento de la lista. ] .i D es la ca%eAa de la lista( la cola T es la lista sin D ] .i D no es la ca%eAa de la lista( conservamos la ca%eAa de la lista ] como parte de la respuesta # continuamos eliminando D de la cola T. elimina 9D(^D`T_(T:. elimina 9D(^H`T_(^H`T1_:)! elimina 9D(T(T1:. ?! elimina91(^1(2(3(*_(E:. E M ^2(3(*_ ?! elimina91(E(^2(3_:. E M ^1( 2( 3_ E M ^2( 1( 3_ E M ^2( 3( 1_ ] .i >ueremos calcular la inversa de una lista. ] &a inversa de una lista vacia es una lista vacia. ] &a inversa de H`T es la inversa de T concatenada con H. inversa9^_(^_:. inversa9^H`T_(&:)! inversa9T(E:( concatenar9E(^H_(&:. ?! inversa9^a(%(c(d_(^d(c(%(a_:. Pes %0;0 LEN)UA*ES ORIEN!ADOS A O*E!OS @ mediados de los a'os /" se empeA a vislum%rar el uso de las computadoras para la simulacin de pro%lemas del mundo real. 8ero el mundo real est0 lleno de o%jetos( en la ma#or7a de los casos complejos( los cuales di+7cilmente se traducen a los tipos de datos primitivos de los lenguajes imperativos. @s7 es >ue a dos noruegos( ,a3l # N#gaard( se les ocurri el concepto de o%jeto # sus colecciones( llamadas clases de o%jetos( >ue permitieron introducir a%stracciones de datos a los lenguajes de programacin. &a posi%ilidad de reutiliAacin del cdigo # sus indispensa%les modi+icaciones( se re+lejaron en la idea de las jerar>u7as de 3erencia de clases. @ ellos tam%i=n les de%emos el concepto de polimor+ismo introducido v7a procedimientos virtuales. Todos estos conceptos +ueron presentados en el lenguaje .imula /7( desde el a'o 19/7. @un>ue pensado como lenguaje de propsito general( .imula tuvo su ma#or =$ito en las aplicaciones de simulacin discreta( gracias a la clase .IL1&@TI-N >ue +acilita%a considera%lemente la programacin. &a comunidad in+orm0tica 3a tardado demasiado en entender la utilidad de los conceptos %0sicos de .imula /7( >ue 3o# identi+icamos como conceptos del modelo de o%jetos. Tuvimos >ue esperar 3asta los a'os 8" para vivir una verdadera ola de propuestas de lenguajes de programacin con conceptos de o%jetos enca%eAada por S3alltalM- CII- EiCCel- Modula<1- Ada :9 # terminando con *a5a. &a moda de o%jetos se 3a e$tendido de los lenguajes de programacin a la Ingenier7a de .o+t2are &a reutiliAacin de clases previamente pro%adas en distintos sistemas tam%i=n es otro punto a +avor. .in em%argo( el modelo de o%jetos( a la 3ora de ser interpretado en la ar>uitectura von Neumann conlleva un e$cesivo manejo din0mico de memoria de%ido a la constante creacin de o%jetos( as7 como a una carga de cdigo +uerte causada por la constante invocacin de m=todos. 8or lo tanto( los programas en lenguajes orientados a o%jetos siempre pierden en e+iciencia( en tiempo # memoria( contra los programas e>uivalentes en lenguajes imperativos. 8ara consolarnos( los e$pertos dicen >ue les ganan en la comprensin de cdigo. Caractersticas Cunda3entales de la #OO: 1. Enca2sula3iento: Es la ocultacin de in+ormacin. .igni+ica mantener la in+ormacin dentro del o%jeto # mantenerlo como una caja negra. 8uede ser accedida por m=todos. 2. A8straccin: Es la capacidad de aislar # encapsular la in+ormacin del dise'o # la ejecucin. Es la capacidad para identi+icar atri%utos # m=todos. Herencia: Es la propiedad >ue permite a los o%jetos crearse a partir de otros o%jetos. 3. #oli3orCis3o: Es la capacidad de >ue di+erentes o%jetos reaccionen de distinta +orma a un mismo mensaje. %0:0 LEN)UA*ES CON CONCURRENCIA &a necesidad de o+recer concurrencia en el acceso a los recursos computacionales se remonta a los primeros sistemas operativos. Lientras >ue un programa realiAa%a una operacin de entrada o salida otro podr7a goAar del tiempo del procesador para sumar dos n5meros( por ejemplo. @provec3ar al m0$imo los recursos computacionales +ue una necesidad apremiante( so%re todo en la =poca en >ue las computadoras eran caras # escasasK el sistema operativo ten7a >ue o+recer la ejecucin concurrente # segura de programas de varios usuarios( >ue desde distintas terminales utiliAa%an un solo procesador( # as7 surgi la necesidad de introducir algunos conceptos de programacin concurrente para programar los sistemas operativos. 8osteriormente( cuando los procesadores cam%iaron de tama'o # de precio( se a%ri la posi%ilidad de contar con varios procesadores en una m0>uina # o+recer el procesamiento en paralelo( es decir( procesar varios programas al mismo tiempo. Esto dio el impulso a la creacin de lenguajes >ue permit7an e$presar el paralelismo. Iinalmente( llegaron las redes de computadoras( >ue tam%i=n o+recen la posi%ilidad de ejecucin en paralelo( pero con procesadores distantes( lo cual conocemos como la programacin distri%uida. Histricamente encontramos en la literatura soluciones conceptuales # mecanismos tales como) sem0+oros( regiones cr7ticas( monitores( env7o de mensajes 96.8:( llamadas a procedimientos remotos 9E86:( >ue posteriormente se inclu#eron como partes de los lenguajes de programacin en 6oncurrent 8ascal( Lodula( @da( -66@L( # 5ltimamente en Cava. 1no de los ejemplos m0s importantes es el modelo de env7o de mensajes de 6.8 de Hoare( para las ar>uitecturas paralelas # distri%uidas( el cual no solamente +ructi+ic en una propuesta del lenguaje de programacin -66@L( sino dio origen a una nueva +amilia de procesadores( llamados JtransputersJ( >ue +0cilmente se componen en una ar>uitectura paralela. Es di+7cil evaluar las propuestas e$istentes de lenguajes para la programacin concurrente( paralela # distri%uida. 8rimero( por>ue los programadores est0n acostum%rados a la programacin secuencial # cual>uier uso de estos mecanismos les di+iculta la construccin # el an0lisis de programas. 8or otro lado( este tipo de conceptos en el pasado +ue manejado principalmente a nivel de sistemas operativos( protocolos de comunicacin( etc=tera( donde la e+iciencia era crucial( # por lo tanto no se utiliAa%an lenguajes de alto nivel para la programacin. Ho# en d7a( la programacin de sistemas complejos tiene >ue incluir las partes de comunicaciones( programacin distri%uida # concurrencia. Esto lo sa%en los creadores de los lenguajes m0s recientes( >ue integran conceptos para manejar) los 3ilos de control( comunicacin( sincroniAacin # no determinismoK el 3ard2are # las aplicaciones se los e$igen. %0/&0 E,OLUCI+N DE LOS LEN)UA*ES DE #RO)RAMACI+N DECLARA!I,OS )rNCico NO /: E5olucin de los lenguajes de 2rogra3acin Declarati5os %0//0 E,OLUCI+N DE LOS LEN)UA*ES DE #RO)RAMACI+N ORIEN!ADO A O*E!OS E IM#ERA!I,OS )rNCico NO %: E5olucin de los lenguajes de 2rogra3acin OO e I32erati5os CA#(!ULO III: CONCE#!OS EN LOS LEN)UA*ES DE #RO)RAMACI+N 10/0 PBUQ ES LO BUE CONS!I!U.E UN UEN LEN)UA*ER 10/0/0 A!RIU!OS DE UN UEN LEN)UA*E Claridad- sencilleJ E unidad Glegi8ilidadH: &a sinta$is del lenguaje a+ecta la +acilidad con la >ue un programa se puede escri%ir( por a prue%a( # m0s tarde entender # modi+icar. Ortogonalidad: 6apacidad para com%inar varias caracter7sticas de un lenguaje en todas las com%inaciones posi%les( de manera >ue todas ellas tengan signi+icado. Naturalidad 2ara la a2licacin: &a sinta$is del programa de%e permitir >ue la estructura del programa re+leje la estructura lgica su%#acente. A2oEo 2ara la a8straccin: 1na parte importante de la tarea del programador es pro#ectar las a%stracciones adecuadas para la solucin del pro%lema # luego implementar esas a%stracciones empleando las capacidades m0s primitivas >ue provee el lenguaje de programacin mismo. 6acilidad 2ara 5eriCicar 2rogra3as: &a sencilleA de la estructura sem0ntica # sint0ctica a#uda a simpli+icar la veri+icacin de programas. Entorno de 2rogra3acin: Iacilita el tra%ajo con un lenguaje t=cnicamente d=%il en comparacin con un lenguaje m0s +uerte con poco apo#o e$terno. 8orta%ilidad de programas 6osto de uso) 1. 6osto de ejecucin del programa. 2. 6osto de traduccin de programas. 3. 6osto de creacin( prue%a # uso de programas. *. 6osto de mantenimiento de los programas) costo total del ciclo de vida. 10/0%0 ES!ANDARISACI+N DE LOS LEN)UA*ES &os est0ndares son en general de dos clases) EstNndares 2atentados: .on las de+iniciones ela%oradas por la compa'7a >ue desarroll el lenguaje # >ue es su propietaria. EstNndares de consenso: .e trata de documentos ela%orados por organiAaciones con %ase en un acuerdo entre los participantes pertinentes. L=todo principal para asegurar la uni+ormidad entre varias implementaciones de un lenguaje. Ejemplo) @N.I( IEEE( I.-( etc.. 10%0 SIN!A=IS DE LEN)UA*ES DE #RO)RAMACI+N &a sinta$is suministra in+ormacin signi+icativa >ue se necesita para entender un programa # proporciona in+ormacin imprescindi%le para la traduccin del programa +uente a un programa o%jeto. .e necesita algo m0s >ue slo estructuras sint0cticas para la plena descripcin de un lenguaje de programacin. -tros atri%utos %ajo el t=rmino general de sem0ntica( como el uso de declaraciones( operaciones( control de secuencia # entornos de re+inamiento( a+ectan a una varia%le # no siempre est0n determinados por reglas de sinta$is. CRI!ERIOS )ENERALES DE SIN!A=IS El propsito primordial de la sinta$is es proveer una notacin para la comunicacin entre el programador # el procesador de lenguajes de programacin. &os detalles de la sinta$is se eligen en gran medida con %ase en criterios secundarios( como) Legi8ilidad: 1n programa es legi%le si la estructura su%#acente del algoritmo # los datos >ue el programa representa >uedan de mani+iesto al inspeccionar el te$to del programa. 6acilidad de escritura: .uele 3allarse en con+licto con las caracter7sticas >ue +acilitan su lectura. Este atri%uto mejora a trav=s del uso de estructuras sint0cticas concisas # regulares. 1na sinta$is es redundante si comunica el mismo elemento de in+ormacin en m0s de una +orma. 6ierta redundancia es 5til en la sinta$is de lenguajes de programacin por>ue +acilita la lectura del programa # tam%i=n permite revisar en %usca de errores durante la traduccin. 6acilidad de 5eriCicacin) Tiene relacin con la legi%ilidad # +acilidad de escritura. .e necesitan t=cnicas >ue permitan compro%ar >ue el programa es matem0ticamente correcto. 6acilidad de traduccin: &os programas de%en ser +0ciles de traducir a una +orma ejecuta%le. Est0 relacionado con las necesidades del traductor >ue procesa el programa escrito. &a traduccin de los programas se di+iculta con+orme aumenta el n5mero de construcciones sint0cticas especiales. Carencia de a38igTedad: 1na construccin am%igua permite dos o m0s interpretaciones distintas. El pro%lema de am%igbedad surge por lo com5n no en la estructura de elementos individuales del programa( sino en la interaccin entre di+erentes estructuras 9Ej. 6ondicionales:. 1010 !I#OS DE DA!OS Num=ricos) Entero( Eeal. Gooleano. 6ar0cter. ,e+inidos por el usuario) tipos especi+icados por el usuario como limitaciones de los %0sicos. Enumerados( su%rangos( modularesW @rra#s) son tipos con tama'o +ijo # todos los elementos del mismo tipo. .tring est0 de+inido e muc3os lenguajes como un arra# de caracteres. Eegistros) Es una estructura de datos +ormada por un numero +ijo de componentes de distinto tipo. 8unteros) almacena la direccin de memoria de otro o%jeto de datos. Ee+erencia) no se pueden manejar directamente( lo 3ace el compilador. Tipo +uncin) se considera un tipo por poderse incluir en una e$presin( # suele ir acompa'ado de su descriptor. 1070 AS!RACCI+N &a a%straccin nos permite simpli+icar el an0lisis # resolucin de un pro%lema separando las caracter7sticas >ue son relevantes de a>uellas >ue no lo son. &a relevancia depender0 +uertemente del conte$to. 1n ejemplo t7pico de a%straccin es una jerar>u7a de o%jetos determinada por sus caracter7sticas comunes. @un>ue la a%straccin es un concepto general aplica%le a cual>uier campo nosotros estamos interesados en la a%straccin >ue proporciona un lenguaje de programacin. En este sentido la aportacin m0s importante 3a sido el desarrollo de los lenguajes de alto nivel( =stos nos permiten utiliAar ciertas construcciones de alto nivel en lugar de una secuencia de instrucciones m0>uina. @5n as7( el nivel de a%straccin proporcionado por un lenguaje de programacin resulta insu+iciente. 8odemos aumentar el nivel de a%straccin 3aciendo >ue el lenguaje de programacin inclu#a mecanismos >ue permitan construir al usuario sus propias a%stracciones. El mecanismo m0s com5n para tal +in es el uso de +unciones # procedimientos( aun>ue e$isten otros mecanismos. &os lenguajes de programacin orientados a o%jetos o+recen un cada veA m0s amplio a%anico de estructuras de datos organiAadas jer0r>uicamente 9listas( pilas( colas( etc.: junto con primitivas para manejarlas agrupadas en lo >ue 3a%itualmente se conoce como clase( adem0s( el usuario puede de+inir nuevas clases 1090 AS!RACCI+N EN #RO)RAMACI+N 6uando la computacin esta%a en su in+ancia( la ma#or7a de los programas se escri%7an en ensam%lador por un programador( # no se considerar7an como grandes programas seg5n los est0ndares de 3o# en d7a. @5n as7( en la medida en >ue los programas se 3icieron m0s complejos( los programadores encontraron m0s di+icultades para recordar toda la in+ormacin >ue necesita%an para desarrollar o eliminar errores de sus programas. @un>ue la introduccin de lenguajes de alto nivel resolvi algunas di+icultades( al mismo tiempo increment las e$pectativas de la gente acerca de lo >ue podr7a 3acer una computadora( de tal +orma >ue slo provoc la aparicin de un ma#or n5mero de pro%lemas. @s7( a medida >ue se intenta%an resolver pro%lemas m0s complejos por medio de una computadora( ma#or era la tarea >ue de%7a desarrollar el programador( re%asando la capacidad incluso de los mejores programadores. En consecuencia( comenAaron a proli+erar e>uipos de programadores >ue tra%aja%an conjuntamente para emprender grandes tareas de programacin. .e o%serv entonces un pro%lema >ue a5n 3o# no se 3a a%ordado de +orma completamente satis+actoria) los sistemas de so+t2are son sistemas complejos con un alto grado de intercone$in. &a intercone$in es la dependencia de una parte del cdigo de otra seccin de cdigo. .urgieron as7 diversas t=cnicas # mecanismos para tratar de reducir el pro%lema de la complejidad. &a a%straccin es uno de estos mecanismos # es posi%lemente el m0s importante de todos. El mecanismo de a%straccin permite descomponer de +orma productiva un pro%lema mediante el cam%io del nivel de detalle a considerar( pero es algo intangi%le. .urge por tanto la necesidad de descri%irla de alguna +orma( la especi+icacin es esta descripcin. &a a%straccin +uncionalK es decir( la idea de crear procedimientos # +unciones e invocarlos mediante un nom%re( +ue uno de los primeros mecanismos de a%straccin >ue se usaron ampliamente en los lenguajes de programacin. &os procedimientos permit7an >ue las tareas >ue se ejecuta%an varias veces( +ueran agrupadas en un lugar para reutiliAarlas( en veA de duplicar el cdigo una # otra veA. Es este tipo de a%straccin lo importante es >u= 3ace la +uncin # no importa cmo lo 3ace. El usuario del procedimiento solo necesita conocer la especi+icacin de la a%straccin # puede ignorar el resto de detalles. 10?0 CLASES DE AS!RACCI+N 10?0/0 AS!RACCI+N DE CON!ROL Hace re+erencia a los mecanismos necesarios para representar el +lujo de control de un programa( evitando detalles de %ajo nivel. .e su%divide en) nivel de sentencias %0sicas # a nivel de su%programas o unidades de programa. .entencias condicionales) I+Qelse( alternativa m5ltiple 9s2it3:. .entencias iterativas) Ior( U3ile # repeat. A8straccin 2rocedi3ental Su82rogra3a) conjunto de l7neas de cdigo con cierta independencia del resto. #rocedi3ientos: su%programas >ue tienen de " a n par0metros( sin tipo( no pueden ser usados en e$presiones # pueden devolver de " a n resultados distintos. 6unciones: pueden tener de " a n argumentos de entrada( devuelve solo 1 resultado siempre. Tiene tipo # se puede usar en una e$presin. #aso de 2arN3etros: Iormas de paso de par0metros) 8or re+erencia) se pasa la direccin de memoria del par0metro 9EQ.:. 8or copia) 6opia por valor) se crea una var temporal copi0ndole el valor del par0metro.9E: 6opia por resultado) se crea una var local( # al aca%ar se devuelve el resultado 9.: 6opia por valor!resultado) se crea una var local pas0ndole el valor( con la >ue se tra%aja( # al aca%ar se devuelve el resultado Iormas de asignar los argumentos) 8or posicin) se asignan los par0metros +ormales con los reales por orden. 8or nom%re) en la llamada se a'ade el nom%re del par0metro +ormal. 8or de+ecto) toma un valor por de+ecto especi+icado en compilacin si no se le da ninguno. Eje32lo: Void ordenar (int a[],int n) el usuario no necesita conocer los detalles de cmo se realiAa el ordenamiento( solo de%e suministrar un arreglo # su tama'o # reci%ir0 el arreglo ordenado 9en un orden predeterminado como ascendente: 10?0%0 AS!RACCI+N DE DA!OS0 1na a%straccin de datos 9tipo de dato o tipo a%stracto de dato: es un nuevo tipo de dato m0s un conjunto de operaciones >ue permiten manipular los o%jetos de dic3o tipo. En esta de+inicin juega un papel importante el uso de la pala%ra o%jeto en lugar de varia%le. &a di+erencia entre am%os conceptos se e$plicar0 m0s adelante. &a correcta utiliAacin de los tipos a%stractos de datos 9T@,s en lo sucesivo: en el dise'o de programas da lugar a programas de gran modularidad # calidad) .on m0s legi%les .on m0s +0ciles de interpretar .on m0s +0ciles de modi+icar 10'0 !I#OS AS!RAC!OS DE DA!OS G!ADSH Es una estructura de datos junto a las instrucciones para manejarlo( 3aciendo invisi%le ciertas partes al usuario programador. 8ermite la asociacin de una representacin con sus operaciones concretas en una unidad adecuada de lenguaje >ue incorpora los nuevos tipos # el ocultamiento de la representacin del nuevo tipo a las unidades >ue lo usan. Tipos gen=ricos( genericidad) consiste en >ue las entidades de programa puedan tra%ajar con independencia de los tipos de datos concretos. 8ara usarse 3a# >ue instanciarlos. 10;0 LEN)UA*ES DE #RO)RAMACI+N . !ADS &a a%straccin de datos es una t=cnica de dise'o de programas >ue promete un alto grado de modularidad # un desarrollo independiente de la implementacin de dic3a a%straccin # de la aplicacin del programa. 8or tratarse de una t=cnica de dise'o( su utiliAacin es en su ma#or parte independiente del lenguaje de programacin( sin em%argo( el uso e implementacin de T@,s con lenguajes de programacin >ue no los soportan convenientemente puede dar lugar a de+iciencias en algunos de los aspectos siguientes) Ocultacin de la re2resentacin0 &os lenguajes >ue no soportan T@,s no pueden c3e>uear el %uen uso de la a%straccin de datos( dada la imposi%ilidad de ocultar a los usuarios de la a%straccin la representacin de los o%jetos InicialiJacin de las estructuras de datos. &os lenguajes >ue no soportan T@,s no disponen de un procedimiento autom0tico de inicialiAacin de las estructuras de datos >ue se utiliAan para representar a los o%jetos del T@,. Esto supone >ue al principio de los programas >ue utilicen un T@, de%e invocarse a una accin para inicialiAar convenientemente dic3as estructuras 9operacin no relacionada con los o%jetos Co32ilacin inde2endiente0 En los lenguajes >ue soportan T@,s( el cdigo de estos se puede separar del cdigo de los programas de aplicacin # compilarlos independientemente. En todo caso( esta +acilidad se tiene en cual>uier lenguaje >ue soporte la compilacin independiente. #ara3etriJacin de ti2os0 En los lenguajes >ue no soportan T@,s no se puede parametriAar una de+inicin de tipo con otro tipoK es decir( no se pueden realiAar a%stracciones 9+uncionales o de datos: de tipos desconocidos. A8stracciones 2oli3rCicas0 En los lenguajes >ue no soportan T@,s no se pueden construir a%stracciones >ue puedan ser utiliAadas por o%jetos de di+erentes tipos. Los ti2os deCinidos 2or el usuario no se co32ortan co3o los 2redeCinidos del lenguaje. @s7( por ejemplo( un o%jeto de tipo Eacional no se crea por completo al declararlo siendo necesario realiAar una llamada posterior a la operacin 6rearaEacional para inicialiAarlo convenientemente. Esta 5ltima de+iciencia provoca >ue en un lenguaje de programacin >ue no soporte T@,s puedan e$istir o%jetos cu#a representacin no sea v0lida sin >ue ello sea detectado por el compilador. Esto o%liga al usuario a utiliAar escrupulosamente el T@,( o %ien( al desarrollador de la a%straccin de datos a realiAar implementaciones de =ste >ue tuvieran en cuenta =ste 3ec3o. 10:0 LEN)UA*ES DE #RO)RAMACI+N BUE DEER(AS A#RENDER 10:0/0 #H# 8H8 usa una meAcla entre interpretacin # compilacin para intentar o+recer a los programadores la mejor meAcla entre rendimiento # +le$i%ilidad. 8H8 compila para tu codigo una serie de instrucciones 9llamadas opcodes: siempre >ue estas son accedidas. Estas instrucciones son entonces ejecutadas una por una 3asta >ue el script termina. Esto es di+erente a la manera convencional de compilacion de lenguajes como 6OO donde el cdigo es compilado a cdigo ejecuta%le >ue es despues ejecutado. 83p es recompilado cada veA >ue se solicita un script. 1na ventaja importante de interpretar el cdigo es >ue toda la memoria usada por tu cdigo es manejada por 8H8( # el lenguaje autom0ticamente vac7a esta memoria cuando el script +inaliAa. Esto signi+ica >ue tu no tienes >ue preocuparte de las cone$iones a la %ase de datos( por>ue 8H8 lo 3ar0 por ti. P#or UuV de8eras a2renderloR Es uno de los lenguajes de programacin m0s populares( la gran +luideA # rapideA de sus scripts # su prometedor +uturo( desarrollar aplicaciones Ue%s utiliAando lenguajes como 6 o 6-G-& son cosas del pasado. 10:0%0 CW 6B es un lenguaje de propsito general orientado a o%jetos creado por Licroso+t para su plata+orma .NET. .u sinta$is %0sica deriva de 6Q6OO # utiliAa el modelo de o%jetos de la plata+orma .NET el cual es similar al de Cava aun>ue inclu#e mejoras derivadas de otros lenguajes. 6B +ue dise'ado para com%inar el control a %ajo nivel de lenguajes como 6 # la velocidad de programacin de lenguajes como Fisual Gasic. P#or UuV de8eras a2renderloR Es una parte esencial de la plata+orma .Net( 6B com%ina los mejores elementos de m5ltiples lenguajes de amplia di+usin como 6OO( Cava( Fisual Gasic o ,elp3i. ,e 3ec3o( su creador @nders Heljs%erg +ue tam%i=n el creador de muc3os otros lenguajes # entornos como Tur%o 8ascal( ,elp3i o Fisual COO. &a idea principal detr0s del lenguaje es com%inar la potencia de lenguajes como 6OO con la sencilleA de lenguajes como Fisual Gasic( # >ue adem0s la migracin a este lenguaje por los programadores de 6Q6OOQCava sea lo m0s inmediata posi%le. 10:010 A*A= @C@D no es un lenguaje e$actamente su nom%re viene dado por el acrnimo de @s#nc3ronous Cava.cript @nd DL& # es posi%lemente la ma#or novedad en cuanto a programacin 2e% en estos 5ltimos a'os. El coraAn de @ja$ es el o%jeto DL&HttpEe>uest >ue nos permite realiAar una cone$in al servidor # al enviarle una peticin # reci%ir la respuesta >ue procesaremos en nuestro cdigo Cavascript( estamos 3a%lando del verdadero motor de @ja$( por ejemplo gracias a este o%jeto podemos desde una p0gina HTL& leer datos de una 2e% o enviar datos de un +ormulario sin necesidad de recargar la p0gina. P#or UuV de8eras a2renderloR &a demanda de @C@D no slo es ampl7a sino >ue de calidad de%ido a la di+icultad de aprendiAaje >ue conlleva( si la 3erramienta de Licroso+t( @tlas( destinada a la realiAacin de aplicaciones @C@D tiene =$ito puede supone un aumento en la demanda de esta tecnolog7a. 10:070 *A,ASCRI#! .e trata de un lenguaje de programacin del lado del cliente( por>ue es el navegador el >ue soporta la carga de procesamiento. 4racias a su compati%ilidad con la ma#or7a de los navegadores modernos( es el lenguaje de programacin del lado del cliente m0s utiliAado. P#or UuV de8eras a2renderloR &a raAn de ma#or peso es >ue es utiliAado por millones de p0ginas 2e%s para validar +ormularios( crear cooVies( detectar navegadores # mejorar el dise'o( su +0cil aprendiAaje lo 3ace un lenguaje mu# demandado. 10:090 #ERL 8erl es la alternativa m0s popular a 8H8( seguramente por>ue es el lenguaje m0s antiguo tam%ien dentro de las alternativas. En internet nos encontramos numerosos recursos >ue utiliAan 8erl( muc3os de las aplicaciones Jopen sourceJ re>uieren tener 8erl instalado correctamente. 8erl tiene una ventaja # es >ue es mu# +le$i%le( # tam%ien tiene un gran cantidad de modulos #a escritos. Gien escritos los scripts en 8erl se asemejan %astante a 8H8. &a principal causa de la suc7a apariencia de 8erl es por la a+icin de sus desarrolladores a la escritura en Juna l7neaJ empa>uetanto numerosas +uncionalidades en una sola l7nea de cdigo. P#or UuV de8eras a2renderloR &a potenc7a de 8erl a la 3ora de procesar grandes cantidades de datos lo 3ace realmente popular a la 3ora de desarrollar aplicaciones del lado del servidor( aprender 8erl o 83p es %0sico a la 3ora de desarrollar aplicaciones Ue%. 10:0?0 C Es un lenguaje de Jmedio nivelJ pero con numerosas caracter7sticas de %ajo nivel. ,ispone de las estructuras t7picas de los lenguajes de alto nivel pero( a su veA( dispone de construcciones del lenguaje >ue permiten un control a mu# %ajo nivel. P#or UuV de8eras a2renderloR @prender 6 es %0sico mientras aprendes 6 estas aprendiendo conceptos %0sicos de lenguajes cmo Cava o 6B( adem0s no slo es mas sencillo >ue estos 5ltimos sino >ue comporten gran parte de su sinta$is. 10:0'0 RU. . RU. ON RAILS Eu%# on Eails( tam%i=n conocido como EoE o Eails es un +rame2orV de aplicaciones 2e% de cdigo a%ierto escrito en el lenguaje de programacin Eu%#. Eu%# apareci en el a'o 199 # creo >ue su principal pro%lema 3a%7a sido la +alta de documentacin en otro idioma >ue no sea japon=s. Eso se 3a ido solucionando # crece la popularidad del lenguaje. .u aplicacin insignia( por decirlo de alg5n modo parece ser EoE. .u mecanismo de gem parece al 68@N de 8erl # al 8ear de 8H8 P#or UuV de8eras a2renderloR .imple # +uncional( el uso de @ctive Eecord de +orma e+iciente simpli+ica # agiliAa el desarrollo de +orma nota%le. @l minimiAar el tra%ajo con la %ase de datos 9escri%iendo triggers # procedimientos almacenados: # emplear un 5nico lenguaje para todo el desarrollo( se consigue acortar los tiempos de desarrollo 9time2marVet:. 10:0;0 AS# @ctive .erver 8ages 9@.8: # @.8.NET es un intento de Licroso+t para introducirse en el mercado del desarrollo Ue%( # viene a ser como su estandar para su servidor Ue%( II.. @.8 3a sido atacado por la comunidad open source desde >ue este apareci( # dan numerosas raAones para ello) El propietario( una 5nica plata+orma( la lentitud... @.8 3a sido implementado en otras plata+ormas # >ue cuando esta +uncionando %ajo su servidor predeterminado II. es relativamente r0pido. P#or UuV de8eras a2renderloR .implemente por>u= en algunas ocasiones no tienes otra opcin de%ido a la popularidad >ue 3a alcanAado. CA#(!ULO I,: LEN)UA*ES DE A*O- MEDIO . AL!O NI,EL 70/0 IN!RODUCCI+N El ordenador slo entiende un lenguaje conocido como cdigo %inario o cdigo m0>uina( consistente en ceros # unos. Es decir( slo utiliAa " # 1 para codi+icar cual>uier accin. &os lenguajes m0s pr$imos a la ar>uitectura 3ard2are se denominan lenguajes de %ajo nivel # los >ue se encuentran m0s cercanos a los programadores # usuarios se denominan lenguajes de alto nivel. 70%0 LEN)UA*ES DE A*O NI,EL Fistos a mu# %ajo nivel( los microprocesadores procesan e$clusivamente se'ales electrnicas %inarias. ,ar una instruccin a un microprocesador supone en realidad enviar series de unos # ceros espaciadas en el tiempo de una +orma determinada. Esta secuencia de se'ales se denomina cdigo m0>uina. El cdigo representa normalmente datos # n5meros e instrucciones para manipularlos. 1n modo m0s +0cil de comprender el cdigo m0>uina es dando a cada instruccin un mnemnico( como por ejemplo .T-EE( @,, o C1L8. Esta a%straccin da como resultado el ensam%lador( un lenguaje de mu# %ajo nivel >ue es espec7+ico de cada microprocesador. &os lenguajes de %ajo nivel permiten crear programas mu# r0pidos( pero >ue son a menudo di+7ciles de aprender. L0s importante es el 3ec3o de >ue los programas escritos en un %ajo nivel son totalmente dependientes de la m0>uina o de cada procesador. .i se lleva el programa a otra m0>uina se de%e reescri%ir el programa desde el principio. @l estar pr0cticamente dise'ados a medida del 3ard2are( aprovec3an al m0$imo las caracter7sticas del mismo. ,entro de este grupo se encuentran) &EN41@CE Lc<1IN@. EN.@LG&@,-E. 70%0/0 LEN)UA*E M@BUINA0 El lenguaje m0>uina es el 5nico lenguaje >ue entiende directamente la computadora. 8or esta raAn( su estructura esta totalmente adaptada a los circuitos de la m0>uina # mu# alejado de la +orma de e$presin # an0lisis de los pro%lemas propia de los 3umanos. Esto 3ace >ue la programacin en este lenguaje resulte tediosa # complicada( re>uiri=ndose un conocimiento pro+undo de la ar>uitectura +7sica del ordenador. Irente a esto( el cdigo m0>uina 3ace posi%le >ue el programador utilice la totalidad de los recursos >ue o+rece el ordenador( o%teni=ndose programas mu# e+icientes 9es decir( >ue aprovec3an al m0$imo los recursos e$istentes: en tiempo de ejecucin # en ocupacin de memoria. 70%0%0 ENSAMLADOR0 El lenguaje ensam%lador constitu#e el primer intento de sustitucin del lenguaje m0>uina por uno m0s cercano al usado por los 3umanos. Este acercamiento a las personas se plasma en las siguientes aportaciones) 1so de una notacin sim%lica o nemot=cnica para representar los cdigos de operacin direccionamiento sim%lico .e permite el uso de comentarios entre las l7neas de instrucciones( 3aciendo posi%le la redaccin de programas m0s legi%les. @parte de esto =l &E presenta la ma#or7a de los inconvenientes del lenguaje m0>uina( como son su repertorio mu# reducido de instrucciones( el r7gido +ormato de instrucciones( la %aja pota%ilidad # la +uerte dependencia del 3ard2are. 8or otro lado mantiene la ventaja del uso ptimo de los recursos 3ard2are( permitiendo la o%tencin de un cdigo mu# e+iciente. Ese tipo de lenguajes 3acen corresponder a cada instruccin en ensam%lador una instruccin en cdigo m0>uina. Esta transduccin es llevada a ca%o por un programa traductor denominado Ensam%lador. 8ara solventar en cierta medida la limitacin >ue supone poseer un repertorio de instrucciones( tan reducido( se 3an desarrollado unos ensam%ladores especiales denominados macroensam%ladores. &os lenguajes >ue traducen los macroensam%ladores disponen de macroinstrucciones cu#a traduccin da lugar a varias instrucciones m0>uina # no a una sola. ,ado >ue el lenguaje ensam%lador esta +uertemente condicionado por la ar>uitectura del ordenador >ue soporta( los programadores no suelen escri%ir programas de tama'o considera%le en ensam%lador. Las %ien usan este lenguaje para a+inar partes importantes de programas escritos en lenguajes de m0s alto nivel. Ha# un distinto &enguaje de L0>uina 9#( por consiguiente( un distinto &enguaje Ensam%lador: para cada 681. 8or ejemplo( podemos mencionar tres lenguajes completamente di+erentes( >ue sin em%argo vienen de la aplicacin de los conceptos anteriores) &enguaje Ensam%lador de la +amilia Intel 8"$8/ &enguaje Ensam%lador de la +amilia Lotorola /8""" &enguaje Ensam%lador del procesador 8-UEE( usado en las IGL E.Q/""". Tenemos 3 +a%ricantes distintos( compitiendo entre s7 # cada uno aplicando conceptos distintos en la manu+actura de sus procesadores( su ar>uitectura # programacinK todos estos aspectos( in+lu#en en >ue el lenguaje de m0>uina # ensam%lador cam%ie %astante. AH ,EN!A*AS DEL LEN)UA*E ENSAMLADOR 1na veA >ue 3emos visto la evolucin de los lenguajes( ca%e preguntarse) ;En estos tiempos JmodernosJ( para >u= >uiero el &enguaje Ensam%lador? El proceso de evolucin trajo consigo algunas desventajas( >ue a3ora veremos como las ventajas de usar el &enguaje Ensam%lador( respecto a un lenguaje de alto nivel) /0 ,elocidad El proceso de traduccin >ue realiAan los int=rpretes( implica un proceso de cmputo adicional al >ue el programador >uiere realiAar. 8or ello( nos encontraremos con >ue un int=rprete es siempre m0s lento >ue realiAar la misma accin en &enguaje Ensam%lador( simplemente por>ue tiene el costo adicional de estar traduciendo el programa( cada veA >ue lo ejecutamos. ,e a37 nacieron los compiladores( >ue son muc3o m0s r0pidos >ue los int=rpretes( pues 3acen la traduccin una veA # dejan el cdigo o%jeto( >ue #a es &enguaje de L0>uina( # se puede ejecutar mu# r0pidamente. @un>ue el proceso de traduccin es m0s complejo # costoso >ue el de ensam%lar un programa( normalmente podemos despreciarlo( contra las ventajas de codi+icar el programa m0s r0pidamente. .in em%argo( la ma#or parte de las veces( el cdigo generado por un compilador es menos e+iciente >ue el cdigo e>uivalente >ue un programador escri%ir7a. &a raAn es >ue el compilador no tiene tanta inteligencia( # re>uiere ser capaA de crear cdigo gen=rico( >ue sirva tanto para un programa como para otroK en cam%io( un programador 3umano puede aprovec3ar las caracter7sticas espec7+icas del pro%lema( reduciendo la generalidad pero al mismo tiempo( no desperdicia ninguna instruccin( no 3ace ning5n proceso >ue no sea necesario. 8ara darnos una idea( en una 86( # suponiendo >ue todos son %uenos programadores( un programa para ordenar una lista tardar0 cerca de 2" veces m0s en Fisual Gasic 9un int=rprete:( # 2 veces m0s en 6 9un compilador:( >ue el e>uivalente en Ensam%lador. 8or ello( cuando es cr7tica la velocidad del programa( Ensam%lador se vuelve un candidato lgico como lenguaje. @3ora %ien( esto no es un a%solutoK un programa %ien 3ec3o en 6 puede ser muc3as veces m0s r0pido >ue un programa mal 3ec3o en Ensam%ladorK sigue siendo sumamente importante la eleccin apropiada de algoritmos # estructuras de datos. 8or ello( se recomienda %uscar optimiAar primero estos aspectos( en el lenguaje >ue se desee( # solamente usar Ensam%lador cuando se re>uiere m0s optimiAacin # no se puede lograr por estos medios. %0 ECiciencia de ta3a4o 8or las mismas raAones >ue vimos en el aspecto de velocidad( los compiladores e int=rpretes generan m0s cdigo m0>uina del necesarioK por ello( el programa ejecuta%le crece. @s7( cuando es importante reducir el tama'o del ejecuta%le( mejorando el uso de la memoria # teniendo tam%i=n %ene+icios en velocidad( puede convenir usar el lenguaje Ensam%lador. Entre los programas >ue es cr7tico el uso m7nimo de memoria( tenemos a los virus # manejadores de dispositivos 9drivers:. Luc3os de ellos( por supuesto( est0n escritos en lenguaje Ensam%lador. 10 6leDi8ilidad &as raAones anteriores son cuestin de grado) podemos 3acer las cosas en otro lenguaje( pero >ueremos 3acerlas m0s e+icientemente. 8ero todos los lenguajes de alto nivel tienen limitantes en el controlK al 3acer a%stracciones( limitan su propia capacidad. Es decir( e$isten tareas >ue la m0>uina puede 3acer( pero >ue un lenguaje de alto nivel no permite. 8or ejemplo( en Fisual Gasic no es posi%le cam%iar la resolucin del monitor a medio programaK es una limitante( impuesta por la a%straccin del 41I Uindo2s. En cam%io( en ensam%lador es sumamente sencillo( pues tenemos el acceso directo al 3ard2are del monitor. Eesumiendo( la +le$i%ilidad consiste en reconocer el 3ec3o de >ue Todo lo >ue puede 3acerse con una m0>uina( puede 3acerse en el lenguaje ensam%lador de esta m0>uinaK los lenguajes de alto nivel tienen en una u otra +orma limitante para e$plotar al m0$imo los recursos de la m0>uina. H DES,EN!A*AS DEL LEN)UA*E ENSAMLADOR 8or otro lado( al ser un lenguaje m0s primitivo( el Ensam%lador tiene ciertas desventajas respecto a los lenguajes de alto nivel) /0 !ie32o de 2rogra3acin0 @l ser de %ajo nivel( el &enguaje Ensam%lador re>uiere m0s instrucciones para realiAar el mismo proceso( en comparacin con un lenguaje de alto nivel. 8or otro lado( re>uiere de m0s cuidado por parte del programador( pues es propenso a >ue los errores de lgica se re+lejen m0s +uertemente en la ejecucin. 8or todo esto( es m0s lento el desarrollo de programas compara%les en &enguaje Ensam%lador >ue en un lenguaje de alto nivel( pues el programador goAa de una menor a%straccin. %0 #rogra3as Cuente grandes 8or las mismas raAones >ue aumenta el tiempo( crecen los programas +uentesK simplemente( re>uerimos m0s instrucciones primitivas para descri%ir procesos e>uivalentes. Esto es una desventaja por>ue di+iculta el mantenimiento de los programas( # nuevamente reduce la productividad de los programadores. 10 #eligro de aCectar recursos ines2erada3ente Tenemos la ventaja de >ue todo lo >ue se puede 3acer en la m0>uina( se puede 3acer con el &enguaje Ensam%lador 9+le$i%ilidad:. El pro%lema es >ue todo error >ue podamos cometer( o todo riesgo >ue podamos tener( podemos tenerlo tam%i=n en este &enguaje. ,ic3o de otra +orma( tener muc3o poder es 5til pero tam%i=n es peligroso. En la vida pr0ctica( a+ortunadamente no ocurre muc3oK sin em%argo( al programar en este lenguaje ver0n >ue es muc3o m0s com5n >ue la m0>uina se JcuelgueJ( J%lo>ueeJ o Jse le va#a el avinJK # >ue se reinicialiAe. ;8or >u=?( por>ue con este lenguaje es per+ectamente posi%le 9# sencillo: realiAar secuencias de instrucciones inv0lidas( >ue normalmente no aparecen al usar un lenguaje de alto nivel. En ciertos casos e$tremos( puede llegarse a so%reescri%ir in+ormacin del 6L-. de la m0>uina 9no 3e visto e+ectos m0s riesgosos:K pero( si no la conservamos( esto puede causar >ue dejemos de JverJ el disco duro( junto con toda su in+ormacin. 70 6alta de 2orta8ilidad 6omo #a se mencion( e$iste un lenguaje ensam%lador para cada m0>uinaK por ello( evidentemente no es una seleccin apropiada de lenguaje cuando deseamos codi+icar en una m0>uina # luego llevar los programas a otros sistemas operativos o modelos de computadoras. .i %ien esto es un pro%lema general a todos los lenguajes( es muc3o m0s notorio en ensam%lador) #o puedo reutiliAar un 9"] o m0s del cdigo >ue desarrollo en J6J( en una 86( al llevarlo a una E.Q/""" con 1NID( # lo mismo si despu=s lo llevo a una Lacintos3( siempre # cuando est= %ien 3ec3o # siga los est0ndares de J6J( # los principios de la programacin estructurada. En cam%io( si escri%imos el programa en Ensam%lador de la 86( por %ien >ue lo desarrollemos # muc3os est0ndares >ue sigamos( tendremos pr0cticamente >ue reescri%ir el 1"" ] del cdigo al llevarlo a 1NID( # otra veA lo mismo al llevarlo a L@6. 7010 LEN)UA*ES DE MEDIO NI,EL 1n lenguaje intermedio se puede de+inir como una manera de representar procedimientos # estructuras de datos >ue sirva como entrada para una LF 9La>uina Firtual: en alguna parte de su jerar>u7a( entre el lenguaje de entrada 9el nivel m0s alto: # el cdigo ejecutado en la m0>uina 9el nivel m0s %ajo: tanto en el tiempo de compilacin como en el de ejecucin. 8ara considerar el papel de los lenguajes intermedios # sus ventajas # desventajas( conviene destacar la di+erencia entre la traduccin de un lenguaje de alto nivel a cdigo m0>uina anteriormente a su ejecucin 9su compilacin: # su interpretacin( es decir( la conversin de cada instruccin del lenguaje a cdigo m0>uina # su ejecucin( una por una( al ejecutar el programa. Este proceso se realiAa a trav=s de una LF de interpretacin >ue simula un ordenador cu#o cdigo m0>uina es el lenguaje de alto nivel >ue est0 siendo interpretado. P t7picamente( esta LF se constru#e a trav=s de un conjunto de programas de cdigo m0>uina >ue representa los algoritmos # estructuras de datos necesarios para la ejecucin de las instrucciones del lenguaje de alto nivel. Ha# ventajas # desventajas en cada manera de convertir los lenguajes de alto nivel a cdigo m0>uina( >ue se pueden resumir as7) Co32ilacin Fentajas 1. No 3a# >ue repetir la conversin de la misma instruccin a cdigo ma>uina cada veA >ue aparece 2. &os programas corren mu# r0pido ,esventajas 1. 8erdida de claridad e in+ormacin so%re el programa 2. ,i+icultad en localiAar la +uente e$acta de error Ejemplo @,@( 6 ( 6OO( I-ETE@N( 8ascal Inter2retacin Fentajas 1. No 3a# p=rdida de claridad ni de in+ormacin so%re un programa ni so%re donde est0n los errores. 2. No 3a# >ue decodi+icar cdigo >ue no se va a ejecutar ,esventajas 1. &os programas corren muc3o mas lento R se paga el coste de decodi+icar cada instruccin Ejemplo HTL&( &isp ( L&( 8erl( 8ostscrip( .malltalV Estos dos casos representan los dos e$tremos por>ue e$iste tam%i=n lo >ue se llama la compilacin parcial( >ue es una meAcla de los dos en+o>ues( donde se compila el lenguaje de alto nivel a un lenguaje intermedio 9m0s cerca de las estructuras presentes en el cdigo m0>uina >ue las del cdigo +uente: # luego se interpreta este lenguaje al ejecutar el programa. 6omo puede imaginarse( esta t=cnica com%ina las ventajas # desventajas de los dos en+o>ues anteriores. 1n ejemplo de esta com%inacin e$iste en el lenguaje de programacin Cava # su entorno. 6omo se puede ver en los cuadros superiores( tanto los programas compilados parcialmente a un lenguaje intermedio 9como Cava: como los programas escritos en lenguajes de alto nivel >ue se interpretan 9como &isp: re>uieren una LF para interpretar el programa. &a principal ventaja del lenguaje intermedio en este caso es su pro$imidad al nivel del cdigo m0>uina( en el sentido de >ue supone menos tra%ajo a la 3ora de ejecutarlo #( por lo tanto( los programas corren m0s r0pidamente >ue los puramente interpretados. @dem0s del papel de los lenguajes intermedios en la compilacin parcial( se puede destacar su papel en la compilacin est0ndar. 6omo ejemplo se puede considerar 6 como lenguaje intermedio para un lenguaje compilado nuevo. .i el autor de un nuevo lenguaje decide utiliAar 6( por ejemplo( como su lenguaje intermedio( slo tendr0 >ue implementar una LF para convertir el cdigo +uente de su lenguaje a 6( a3orrando muc3o tra%ajo. &as 5entajas de utiliAar un lenguaje tan esta%lecido como 6 como lenguaje intermedio son) &a +acilidad de portar el lenguaje a una nueva m0>uina 9slo 3a# >ue tener un compilador 6 disponi%le all7:. &a generacin de cdigo m0>uina es una tarea mu# compleja >ue re>uiere un conocimiento pro+undo de la ar>uitectura de la m0>uina en cuestin # de cada m0>uina en >ue se >uiere una versin del lenguaje. &a +acilidad de modi+icar alg5n rasgo del comportamiento del lenguaje en alguna m0>uina en concreto 9por ejemplo( caracter7sticas de memoria o rendimiento se pueden a'adir li%rer7as 6 customiAadas sin grandes pro%lemas:. &as posi%ilidades disponi%les para mapear estructuras intermedias del nuevo lenguaje a estructuras de datos de 6. P las des5entajas son) &a depuracin es mu# di+7cil por>ue( entre otras cosas( los errores >ue ocurren en el cdigo 6 no son mu# +0ciles de localiAar en lo >ue 3a escrito el programador originalmente en el nuevo lenguaje. &as caracter7sticas de rendimiento # e+iciencia del lenguaje est0n determinadas por el compilador 6. Ha%r0 ocasiones en las >ue no e$ista una %uena traduccin entre una estructura en el nuevo lenguaje # las estructuras de datos en 6( por lo >ue 3a%r0 una p=rdida de e+iciencia en el programa resultante 9como( por ejemplo( ocurre en la ma#or7a de las ocasiones en >ue se compilan estructuras de 8rolog a 6 R slo se puede e$presar iteracin en 8rolog utiliAando recursin:. 7070 LEN)UA*ES DE AL!O NI,EL El avance en el desarrollo de JcompiladoresJ e Jint=rpretesJ 9los dos tipos de programas traductores: 3a sido por lo tanto +undamental en el desarrollo de los lenguajes de J3H generacinJ cu#as ventajas adem0s de la +acilidad de aprendiAaje # lecturaQescritura son las +acilidades de correccin( trans+ormacin # conversin de un lenguaje a otro. &os lenguajes de alto nivel tienen normalmente las caracter7sticas de ZTransporta%ilidad[. Es decir( est0n implementadas so%re varias ma>uinas de +orma >ue un programa puede ser +0cilmente ZTransportado[ 9Trans+erido: de una ma>uina a otra sin una revisin sustancial. En ese sentido se llama JIndependientes de la ma>uinaJ. &os lenguajes de Z@lto Nivel[ son los m0s utiliAados como lenguaje de programacin. @un>ue no son +undamentalmente declarativos( estos lenguajes permiten >ue los algoritmos se e$presen en un nivel # estilo de escritura +0cilmente legi%le # comprensi%le por otros programadores. &os lenguajes de alto nivel son normalmente +0ciles de aprender por>ue est0n +ormados por elementos de lenguajes naturales( como el ingl=s. En G@.I6( el lenguaje de alto nivel m0s conocido( los comandos como JII 6-NT@,-E M 1" THEN .T-8J pueden utiliAarse para pedir a la computadora >ue pare si 6-NT@,-E es igual a 1". Est0n dirigidos a solucionar pro%lemas mediante el uso de E,,\s 9Estructuras ,in0micas de ,atos) .on estructuras >ue pueden cam%iar de tama'o durante la ejecucin del programa. Nos permiten crear estructuras de datos >ue se adapten a las necesidades reales de un programa:. Estos lenguajes permiten al programador olvidarse por completo del +uncionamiento interno de la ma>uinaQs para la >ue est0n dise'ando el programa. Tan solo necesitan un traductor >ue entiendan el cdigo +uente como las caracter7sticas de la ma>uina. .uelen usar tipos de datos para la programacin # 3a# lenguajes de propsito general 9cual>uier tipo de aplicacin: # de propsito especi+ico 9como I-ETE@N para tra%ajos cient7+icos:. Ejemplos de estos lenguajes de alto nivel son 8@.6@&( @8& # I-ETE@N 9para aplicaciones cient7+icas:( 6-G-& 9para aplicaciones de procesamiento de datos:( .N-G-& 9para aplicaciones de procesamiento de te$tos:( &I.8 # 8E-&-4 9para aplicaciones de inteligencia arti+icial:( 6 # @,@ 9para aplicaciones de programacin de sistemas: # 8&QI 9para aplicaciones de propsitos generales: . 7090 )ENERADORES DE A#LICACIONES 7O NI,EL 8osteriormente( usando estos lenguajes( se 3an redactado programas destinados a +acilitar un n5mero variado de operaciones en campos de aplicacin espec7+icos como simulacin de +enmenos +7sicos( manipulacin de datos estad7sticos( etc. &os m0s avanAados # +le$i%les de estos programas son las planillas electrnicas u 3ojas de c0lculo # los programas de administracin de arc3ivos o %ases de datos ,ados >ue tales aplicaciones no J3acen nadaJ sin >ue el usuario de+ina ciertas estructuras # ciertas operaciones( pueden ser consideradas como JgeneradoresJ de aplicaciones( aun>ue este nom%re se reserva 3a%itualmente para niveles m0s avanAados en >ue los usuarios pueden generar sistemas mu# di+erentes unos de otros( con J3erramientasJ >ue se parecen a lenguajes de programacin. Estas 3erramientas con+orman los lenguajes de cuarto nivel >ue son por esencia Jprogramas para crear programasJ con una +inalidad espec7+ica( como el J6@.EJ destinado a +acilitar el tra%ajo de los analistas de sistemas. CA#(!ULO ,: ELEMEN!OS DE UN LEN)UA*E DE #RO)RAMACI+N 90/0 ELEMEN!OS SIN!@C!ICOS DE UN LEN)UA*E El estilo sint0ctico general de un lenguaje est0 dado por la seleccin de diversos elementos sint0cticos %0sicos. &os m0s destacados son) Conjunto de caracteres: &a eleccin del conjunto de caracteres es la primera >ue se 3ace al pro#ectar una sinta$is de lenguaje. .e usan pala%ras de 8 %its aun>ue cada veA m0s se consideran las representaciones de 1/ %its 9/.3/ caracteres di+erentes:. IdentiCicadores: &a sinta$is %0sica para identi+icadores( una cadena de letras # d7gitos >ue comienAan con una letra( tiene amplia aceptacin. &as variaciones entre lenguajes se encuentra entre los signos de puntuacin admitidos 9Z.[ ( [([ ( [!Z( Za[...:. S38olos de o2eradores: 6asi todos los lenguajes emplean los caracteres especiales ZO[ # Z!Z para representar las dos operaciones aritm=ticas %0sicas. Tam%i=n adoptan alguna com%inacin # utiliAacin de caracteres especiales para ciertos operadores. #ala8ras cla5e E 2ala8ras reser5adas: 1na pala%ra clave es un identi+icador >ue se usa como una parte +ija de la sinta$is de un enunciado 9ej. II:. El an0lisis sint0ctico durante la traduccin se +acilita usando pala%ras reservadas. &a adiccin de una nueva pala%ra reservada al lenguaje signi+ica >ue todo programa antiguo >ue utilice ese identi+icador como nom%re de varia%le 9u otro nom%re: #a no es sint0cticamente correcto. #ala8ras 2regoneras: .on pala%ras opcionales >ue se insertan en los enunciados para mejorar la legi%ilidad. Co3entarios: @#udan a documentar el programa. Es2acios en 8lanco: .us regla var7an entre los lenguajes. Deli3itadores E corcXetes: 1n delimitador es un elemento sint0ctico >ue se usa simplemente para se'alar el principio o el +inal de alguna unidad sint0ctica( como un enunciado o e$presin. .e pueden usar simplemente para mejorar la legi%ilidad o simpli+icar el an0lisis sint0ctico. 6or3atos de ca32os li8res E Cijos: 1na sinta$is es de campo +ijo si los enunciados de programa se pueden escri%ir en cual>uier parte de un rengln de entrada sin >ue importe la posicin so%re el rengln o las interrupciones entre renglones. 1na sinta$is de campo +ijo utiliAa la posicin so%re un rengln de entrada para transmitir in+ormacin. ED2resiones: .on los %lo>ues sint0cticos de construccin a partir de los cuales se constru#en enunciados 9# a veces programas:. Enunciados: 6onstitu#en el componente sint0ctico m0s destacado en los lenguajes imperativos. .u sinta$is tiene un e+ecto decisivo so%re la regularidad( legi%ilidad # +acilidad de escritura generales del lenguajes. 90%0 !I#OS DE DA!OS 1n tipo de datos es una clase de o%jetos de datos ligados a un conjunto de operaciones para crearlos # manipularlos. Todo lenguaje tiene un conjunto de tipos primitivos de datos >ue est0n integrados el lenguaje. @dem0s( un lenguaje puede proveer recursos >ue permitan al programador de+inir nuevos tipos de datos. &os elementos %0sicos de una especi+icacin de un tipo de datos son) @. &os atri%utos >ue distinguen o%jetos de datos de ese tipo. G. &os valores >ue los o%jetos de datos de ese tipo puede tener( # 6. &as operaciones >ue de+inen las posi%les manipulaciones de o%jetos de datos de ese tipo.
&os elementos %0sicos de la implementacin de un tipo de datos son) @. &a representacin de almacenamiento. G. &a manera en >ue las operaciones de+inidas para el tipo de datos se representan en t=rminos de algoritmos o procedimientos particulares >ue manipulan la representacin de almacenamiento elegida para los o%jetos de datos. 9010 NO!ACIONES DE E=#RESIONES El operador %inario se aplica a los operandos. En notacin in+ija( un operador %inario se coloca entre sus operandos( como en la e$presin a O %. -tras opciones son la notacin pre+ija 9polaca: ( en la cual el operador aparece primero( como en Oa% ( # la notacin post+ija 9polaca inversa: en la cual el operador se escri%e al +inal( como en a%O. &os par=ntesis no son necesarios en notacin pre+ija o post+ija( de%ido a >ue los operandos de cada operador pueden encontrarse sin peligro de am%igbedad. Eje32lo: G = I . H Y S Notacin 8re+ija) ^ O DP _ N d N O DPd
Notacin 8ost+ija) ^ DP O_ N d DP O d N 9070 #RO#IEDAD ASOCIA!I,A . #RECEDENCIA Con5encin !radicional0
e E$ponenciacin N ( Q Lultiplicacin( divisin O ( ! .uma( resta 9090 RE#RESEN!ACI+N DE @ROL #ARA E=#RESIONES Ejemplo. INIIC@ ) % N % ! * N a N c 8EEIIC@ ) ! N % % N N * a c 8-.TIIC@ ) % % N * a N c N ! @r8ol de sintaDis a8stracta 90?0 E,ALUACI+N DE E=#RESIONES 90?0/0 E,ALUACI+N MEDIAN!E LA RECONS!RUCCI+N DE UN @ROL0 7 N 7 ! * N 2 N 3 90?0%0 E,ALUACI+N MEDIAN!E UNA #ILA 1. TraduAca a notacin post+ija la e$presin >ue se evaluar0. 2. Eecorra la notacin post+ija de iA>uierda a derec3a. a: @l encontrar una constante introduAca su valor a la pila %: @l encontrar un operador %inario e$traiga dos valores de la pila( apli>ue el operador a esos valores e introduAca el resultado en la pila. 3. ,espu=s de recorrer toda la notacin post+ija( el valor de la e$presin se encuentra en el tope de la pila. Ejemplo) E$presin 8ila au$iliar 6omentario 77N*2N3N! 7 IntroduAca 7 7N*2N3N! 7 7 IntroduAca 7 N*2N3N! *9 Lultipli>ue *2N3N! *9 * IntroduAca * 2N3N! *9 * 2 IntroduAca 2 N3N! *9 8 Lultipli>ue 3N! *9 8 3 IntroduAca 3 N! *9 2* Lultipli>ue ! 2 Eeste AH Algorit3o 2ara transCor3ar una notacin inCija a 2ostCija0 8ar=ntesis ) 9 : La#or prioridad 8otenciacin ) e Lultiplicacin ( ,ivisin ) N ( Q .uma ( Eesta ) O ( ! Descri2cin Solucin: 1. &a e$presin se va le#endo car0cter a car0cter( los operandos pasan directamente a +ormar parte de la e$presin en post+ija. 2. &os operadores se meten en la pila siempre >ue esta este vac7a o %ien siempre >ue tengan ma#or prioridad >ue el operador cima de la pila 9o %ien igual si es la m0$ima prioridad:. .i la prioridad es menor o igual se saca el elemento cima de la pila # se vuelve a 3acer la comparacin con el elemento cima. 3. &os par=ntesis iA>uierdos siempre se meten en la pila con la m7nima prioridad. 6uando se lee un par=ntesis derec3o( 3a# >ue sacar todos los operadores de la pila pasando a +ormar parte de la e$presin post+ija( 3asta llegar a un par=ntesis iA>uierdo( el cual se elimina( #a >ue los par=ntesis no +orman parte de la e$presin post+ija. *. El algoritmo termina cuando no 3a# m0s caracteres en la e$presin # la pila esta vac7a. Eje32lo: A Y G I C < G D K E Z 6 H < ) H " H caracter ledo ED2resin Estado de la 2ila @ N 9 G O 6 ! 9 , Q E e I : ! 4 : ! H @ @ @ @G @G @G6 @G6O @G 6O @G 6O , @G 6O , @G 6O , E @G 6O , E @G 6O , E I @G 6O , E I e Q @G 6O , E I e Q ! @G 6O , E I e Q ! 4 @G 6O , E I e Q ! 4! @G 6O , E I e Q ! 4! N @G 6O , E I e Q ! 4! NH @G 6O , E I e Q ! 4! N H ! N YG YG YGI YGI N9! N9!9 N9!9 N9!9 Q N9!9 Q N9!9 Q e N9!9 Q e N9! N9! N9! N ! ! En la descripcin realiAada( se o%serva >ue el par=ntesis iA>uierdo tiene la m0$ima prioridad +uera de la pila( es decir( en la notacin in+ijaK sin em%argo( cuando esta dentro de la pila la prioridad es m7nima. ,e igual +orma( para tratar el 3ec3o de >ue varios operadores de potenciacin son evaluados de iA>uierda a derec3a( este operador tendr0 ma#or prioridad cuando no esta metido en la pila >ue el mismo pero metido en la pila. H !a8la de 2rioridades0 O2erador #rioridad dentro de la 2ila #rioridad Cuera de la 2ila e 3 * N ( Q 2 2 O ( ! 1 1 9 " CH Algorit3o G2seudocdigoH 1. -%tener caracteres de la e$presin # repetir pasos 2 al * para cada car0cter 2. .i es operando( pasarlo a la e$presin post+ija 3. .i es operador 3.1. .i la pila esta vac7a meterlo en la pila. Eepetir a partir de 1. 3.2. .i la pila no esta vac7a. .i la prioridad del operador le7do es ma#or >ue la prioridad del operador cima de la pila( meterlo en la pila # repetir a partir de 1. .i la prioridad del operador es menor o igual >ue la prioridad del operador de la cima( sacar de la cima # pasarlo a la e$presin post+ija( volver a 3. *. .i es par=ntesis derec3o *.1. .acar cima de la pila # pasarlo a la e$presin post+ija *.2. .i nueva cima es par=ntesis iA>uierdo( suprimir elemento cima. *.3. .i cima no es par=ntesis iA>uierdo( volver a *.1 *.*. Folver a partir de 1. . .i >uedan elementos en la pila( pasarlos a la e$presin post+ija /. Iin del algoritmo.