792
Draft Conceptos, T´ ecnicas y Modelos deProgramaci´on

Concepts Techniques and Models of Computer Programming Peter Van Roy and Seif Haridi

Embed Size (px)

Citation preview

DraftConceptos, TecnicasyModelosdeProgramacionDraftDraftConceptos, TecnicasyModelosdeProgramacionporPeterVanRoySeifHariditraducci onJuanFranciscoDazFriasTheMITPressCambridge,MassachusettsLondon,EnglandDraftc 2004MassachusettsInstituteofTechnologyDerechosreservados. Ningunapartedeestelibropuedeser reproducidaenningunaforma, pormedios electr onicos ni mec anicos (incluyendo medios para fotocopiar, grabar, o almacenar yrecuperarinformaci on)sinpermisoescritodeleditorial.Estelibroseedit oconLATEX2apartirdelaversi oneninglesdelosautoresLibraryofCongressCataloging-in-PublicationDataVanRoy,Peter.Concepts,techniques, andmodelsofcomputerprogramming/PeterVanRoy,SeifHaridip.cm.Includesbibliographicalreferencesandindex.ISBN0-262-22069-51.Computerprogramming.I.Haridi,Seif.II.Title.QA76.6.V362004005.1dc22 2003065140DraftTabladeContenidoResumidaPrefacio xiCorriendolosprogramasdeejemplo xxix1. Introducci onalosconceptosdeprogramacion 1I. MODELOSGENERALESDECOMPUTACION 292. Elmodelodecomputaciondeclarativa 313. Tecnicasdeprogramaciondeclarativa 1234. Concurrenciadeclarativa 2575. Concurrenciaporpasodemensajes 3796. Estadoexplcito 4437. Programacionorientadaaobjetos 5338. Concurrenciaconestadocompartido 621II. APENDICES 679A. AmbientedeDesarrollodel SistemaMozart 681B.TiposdeDatosBasicos 685C.SintaxisdelLenguaje 701D. ModeloGeneral deComputacion 711Bibliografa 721Indicealfabetico 729Draftvi ContenidoDraftTabladeContenidoPrefacio xiCorriendolosprogramasdeejemplo xxix1. Introducci onalosconceptosdeprogramacion 11.1. Unacalculadora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2. Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4. Listas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.5. Funcionessobrelistas . . . . . . . . . . . . . . . . . . . . . . . . . . 71.6. Correcci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.7. Complejidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.8. Evaluaci onperezosa. . . . . . . . . . . . . . . . . . . . . . . . . . . 121.9. Programacion dealtoorden . . . . . . . . . . . . . . . . . . . . . . 141.10. Concurrencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.11. Flujodedatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.12. Estadoexplcito . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.13. Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.14. Clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.15. No-determinismoytiempo . . . . . . . . . . . . . . . . . . . . . . . 211.16. Atomicidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231.17. Para dondevamos? . . . . . . . . . . . . . . . . . . . . . . . . . . 241.18. Ejercicios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24I. MODELOSGENERALESDECOMPUTACION 292. Elmodelodecomputaciondeclarativa 312.1. Deniciondelenguajesdeprogramacion practicos . . . . . . . . . . 332.2. Elalmacendeasignaci on unica . . . . . . . . . . . . . . . . . . . . 452.3. Ellenguajen ucleo. . . . . . . . . . . . . . . . . . . . . . . . . . . . 522.4. Lasemanticadellenguajen ucleo . . . . . . . . . . . . . . . . . . . 602.5. Administraciondelamemoria . . . . . . . . . . . . . . . . . . . . . 782.6. Dellenguajen ucleoaunlenguajepractico . . . . . . . . . . . . . . 862.7. Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97Draftviii Contenido2.8. Temasavanzados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1052.9. Ejercicios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1173. Tecnicasdeprogramaciondeclarativa 1233.1. Queesdeclaratividad? . . . . . . . . . . . . . . . . . . . . . . . . . 1273.2. Computaci oniterativa . . . . . . . . . . . . . . . . . . . . . . . . . 1303.3. Computaci onrecursiva . . . . . . . . . . . . . . . . . . . . . . . . . 1373.4. Programando recursivamente . . . . . . . . . . . . . . . . . . . . . . 1403.5. Ecienciaentiempoyenespacio . . . . . . . . . . . . . . . . . . . 1833.6. Programacion dealtoorden . . . . . . . . . . . . . . . . . . . . . . 1943.7. Tiposabstractosdedatos . . . . . . . . . . . . . . . . . . . . . . . 2143.8. Requerimientosnodeclarativos . . . . . . . . . . . . . . . . . . . . 2313.9. Dise nodeprogramas enpeque no . . . . . . . . . . . . . . . . . . . 2393.10. Ejercicios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2534. Concurrenciadeclarativa 2574.1. Elmodeloconcurrentedirigidoporlosdatos . . . . . . . . . . . . . 2594.2. Tecnicas b asicasdeprogramacion dehilos . . . . . . . . . . . . . . 2724.3. Flujos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2824.4. Utilizandoelmodeloconcurrentedeclarativodirectamente . . . . . 3004.5. Ejecuci onperezosa . . . . . . . . . . . . . . . . . . . . . . . . . . . 3064.6. Programacion entiemporealnoestricto . . . . . . . . . . . . . . . 3344.7. EllenguajeHaskell . . . . . . . . . . . . . . . . . . . . . . . . . . . 3394.8. Limitacionesyextensionesdelaprogramacion declarativa . . . . . 3444.9. Temasavanzados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3584.10. Notashistoricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3704.11. Ejercicios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3715. Concurrenciaporpasodemensajes 3795.1. Elmodeloconcurrenteporpasodemensajes . . . . . . . . . . . . . 3815.2. Objetospuerto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3845.3. Protocolos sencillosdemensajes . . . . . . . . . . . . . . . . . . . . 3885.4. Dise nodeprogramas conconcurrencia . . . . . . . . . . . . . . . . 3975.5. Sistemadecontroldeascensores. . . . . . . . . . . . . . . . . . . . 4025.6. Usandodirectamenteelmodeloporpasodemensajes . . . . . . . . 4135.7. EllenguajeErlang . . . . . . . . . . . . . . . . . . . . . . . . . . . 4235.8. Temaavanzado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4325.9. Ejercicios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4376. Estadoexplcito 4436.1. Queesestado? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4466.2. Estadoyconstrucci ondesistemas. . . . . . . . . . . . . . . . . . . 4486.3. Elmodelodeclarativoconestadoexplcito . . . . . . . . . . . . . . 4526.4. Abstracciondedatos . . . . . . . . . . . . . . . . . . . . . . . . . . 4586.5. Coleccionesconestado . . . . . . . . . . . . . . . . . . . . . . . . . 475DraftContenido ix6.6. Razonandoconestado . . . . . . . . . . . . . . . . . . . . . . . . . 4816.7. Dise nodeprogramas engrande . . . . . . . . . . . . . . . . . . . . 4916.8. Casosdeestudio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5066.9. Temasavanzados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5236.10. Ejercicios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5277. Programacionorientadaaobjetos 5337.1. Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5357.2. Clasescomoabstraccionesdedatoscompletas . . . . . . . . . . . . 5377.3. Clasescomoabstraccionesdedatosincrementales . . . . . . . . . . 5477.4. Programacion conherencia. . . . . . . . . . . . . . . . . . . . . . . 5657.5. Relaci onconotrosmodelosdecomputacion . . . . . . . . . . . . . 5857.6. Implementandoelsistemadeobjetos . . . . . . . . . . . . . . . . . 5947.7. EllenguajeJava(partesecuencial) . . . . . . . . . . . . . . . . . . 6017.8. Objetosactivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6077.9. Ejercicios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6188. Concurrenciaconestadocompartido 6218.1. Elmodeloconcurrenteconestadocompartido . . . . . . . . . . . . 6248.2. Programacion conconcurrencia . . . . . . . . . . . . . . . . . . . . 6258.3. Candados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6368.4. Monitores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6458.5. Transacciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6548.6. EllenguajeJava(parteconcurrente) . . . . . . . . . . . . . . . . . 6718.7. Ejercicios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673II. APENDICES 679A. AmbientedeDesarrollodel SistemaMozart 681A.1. Interfazinteractiva . . . . . . . . . . . . . . . . . . . . . . . . . . . 681A.2. Interfazdelalneadecomandos . . . . . . . . . . . . . . . . . . . . 683B.TiposdeDatosBasicos 685B.1. N umeros(enteros,otantes,ycaracteres) . . . . . . . . . . . . . . . 685B.2. Literales( atomosynombres) . . . . . . . . . . . . . . . . . . . . . 690B.3. Registrosytuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691B.4. Pedazos (registroslimitados) . . . . . . . . . . . . . . . . . . . . . . 695B.5. Listas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695B.6. Cadenasdecaracteres . . . . . . . . . . . . . . . . . . . . . . . . . . 697B.7. Cadenasvirtualesdecaracteres . . . . . . . . . . . . . . . . . . . . 699C.SintaxisdelLenguaje 701C.1. Declaraciones interactivas . . . . . . . . . . . . . . . . . . . . . . . 702C.2. Declaraciones yexpresiones . . . . . . . . . . . . . . . . . . . . . . 704DraftxC.3. Noterminalesparalasdeclaracionesylasexpresiones. . . . . . . . 704C.4. Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705C.5. Palabras reservadas . . . . . . . . . . . . . . . . . . . . . . . . . . . 707C.6. Sintaxislexica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708D. ModeloGeneral deComputacion 711D.1. Principiodeextensi oncreativa. . . . . . . . . . . . . . . . . . . . . 712D.2. Lenguajen ucleo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714D.3. Conceptos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714D.4. Formasdiferentesdeestado . . . . . . . . . . . . . . . . . . . . . . 718D.5. Otrosconceptos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718D.6. Dise nodelenguajesporcapas . . . . . . . . . . . . . . . . . . . . . 719Bibliografa 721Indicealfabetico 729DraftPrefacioSeis sabios ciegos sereunieronadiscutir suexperienciadespues demostrarlesunelefante. Esmaravilloso,dijoel primero, unelefanteescomounacuerda:delgadoyexible.No, no, deningunamanera,dijoel segundo, Unelefantees comounarbol: fuertementeplantadosobreel suelo.Maravilloso,dijoeltercero, un elefante es como una pared. Increible, dijo el cuarto, un elefanteesuntubollenodeagua.Esunabestiaextra naenevolucion,dijoel quinto.Extra naenrealidad,dijoel sexto, perodebetenerunaarmonasubyacente.Investiguemoseltemaunpocomas.AdaptacionlibredeunfabulatradicionaldeIndia.Unlenguaje de programaciones comounlenguaje natural del hombre, enelsentidoquefavorececiertasmetaforas, imagenesyformasdepensar.AdaptacionlibredeMindstorms: Children, Computers, andPowerful Ideas,SeymourPapert(1980)Unenfoqueparaestudiarlaprogramacionesestudiarloslenguajesdeprograma-cion.Peroeln umerodelenguajesqueexistenestangrande,queespocopracticoestudiarlos todos. Como podemos abordar esa inmensidad? Podramos tomar unospocos lenguajes que sean representativos de diferentes paradigmas de programacion.Peroestonollevaaunentendimientoprofundodelaprogramacion comounadis-ciplinaunicada.Estelibroutilizaotroenfoque.Nosotrosnos enfocamos enconceptos deprogramacionyenlas tecnicas parausarlos,ynoenloslenguajesdeprogramacion.Losconceptossonorganizadosenterminos de modelos de computacion. Un modelo de computacion es un sistema for-mal que dene c omo se realizan las computaciones. Hay muchas maneras de denirmodelos decomputacion. Como estelibro pretendeser practico, es importantequeel modelodecomputacionseadirectamente util parael programador.Porellolodenimosenterminosdeconceptosimportantesparalosprogramadores:tiposdedatos, operaciones,yunlenguajedeprogramacion.El terminomodelodecompu-taci onprecisalanocionimprecisadeparadigmadeprogramacion.El restodellibro trata sobre modelos decomputacion y no sobre paradigmas deprogramacion.Algunasvecesusamosel terminomodelodeprogramacion.Conestenosreferi-mos a lo que el programador necesita: las tecnicas de programacion y los principiosdedise noqueelmodelodecomputacionprovee.Cada modelo de computacion tiene su propio conjunto de tecnicas para programaryrazonarsobrelosprogramas.El n umerodemodelosdecomputaciondiferentes,queseconocenysesaben utiles, esmuchomenorqueel n umerodelenguajesdeDraftxii Prefacioprogramacion.Estelibrocubremuchosmodelosbienconocidosas comoalgunosmodelos menos conocidos. El principal criterio para presentar un modelo es que sea utilenlapractica.Cadamodelodecomputacionsebasaenunlenguajesencillofundamental lla-madoellenguaje n ucleodelmodelo.Estoslenguajes seintroducendemanerapro-gresiva, a nadiendoconceptosunoporuno. Estonospermitemostrarlaprofundarelacion entre los diferentes modelos. Frecuentemente, a nadir un solo concepto nue-vohace unagrandiferenciaenterminos de programacion. Por ejemplo, a nadirasignaci ondestructiva(estadoexplcito)alaprogramacionfuncional nospermitehacerprogramacion orientadaaobjetos.Cuandodebemos a nadir unconceptoaunmodeloycu al conceptodebemosa nadir?Nosotros abordamos estas preguntas muchas veces. El principal criterioes el principio de extensi on creativa. De manera general, se a nade un nuevoconceptocuandolos programas sevuelvencomplicados por razones tecnicas norelacionadas con el problema que se est a resolviendo. A nadir un concepto allenguajen ucleopuedeconservar lasencillezde los programas, si el conceptoseescogecuidadosamente. Estoseexplicadespuesenel apendiceD. Esteprincipiofundamentalaprogresion deloslenguajesn ucleopresentadosenellibro.Unapropiedadelegantedelenfoquedelenguajes n ucleoesquenospermiteusaral mismotiempodiferentesmodelosenel mismoprograma. Estosesuelellamarprogramacionmultiparadigma. Estoesalgobastantenatural, puessignicasim-plementeusarlosconceptosadecuadosparael problema, independientementedelmodelodecomputaciondel queprovieneel concepto. Laprogramacionmultipa-radigmaes unaideavieja; por ejemplo, los dise nadores de LispyScheme handefendidoporlargotiempounavisi onsimilar.Sinembargo,estelibrolaaplicaenunaformamasampliayprofundadeloquesehahechopreviamente.Desde la perspectiva estrategica de los modelos de computacion, el libro tambienpresentanuevaslucessobreproblemasimportanteseninform atica. Nosotrospre-sentamos tres de esas areas, especcamente dise no de interfaces gracas de usuario,programacion distribuida robusta, y programacion por restricciones. Tambien mos-tramosc omoresolveralgunosdelosproblemasdeestasareaspormediodel usojuiciosoycombinadodediversosmodelosdecomputacion.LenguajesmencionadosEnel libromencionamosmuchoslenguajesdeprogramacionylosrelacionamosconmodelosparticulares decomputacion.Por ejemplo,Java ySmalltalkest anba-sados en un modelo orientado a objetos. Haskell y Standard ML est an basados en unmodelofuncional.PrologyMercuryest anbasadosenunmodelol ogico.Notodosloslenguajesdeprogramacioninteresantespuedenserclasicadosas. Otroslen-guajes los mencionamos por sus propios meritos. Por ejemplo, Lisp y Scheme fueronlos pioneros de muchos de los conceptos que se presentan aqu. Erlang es funcional,inherentementeconcurrente,ysoporta programacion distribuidatoleranteafallos.Escogimos cuatro lenguajes como representantes de modelos de computacion im-DraftPrefacio xiiiportantes: Erlang, Haskell, Java, y Prolog. Identicamos el modelo de computaciondecadaunodeestoslenguajesenterminosdel marcouniformepresentadoenellibro.Paramayorinformacionsobreestoslenguajes,referimosloslectoresaotroslibros. Debidoalaslimitacionesdeespacio,nopodemosmencionartodosloslen-guajesdeprogramacioninteresantes. Laomisiondeunlenguajeenparticularnoimplicaningunaclasedejuiciodevalorsobreelmismo.Draftxiv PrefacioObjetivosdel libroEnse nanzadelaprogramacionEl principal objetivodel libroesense narlaprogramacioncomounadisciplinaunicada con fundamento cientco util para quien practica la programacion.Miremosmasdecercaloqueestosignica.Queeslaprogramaci on?Denimos la programaci on,como una actividad general del hombre, que signicalaacciondeextenderocambiarlafuncionalidaddeunsistema. Laprogramaciones una actividadde amplio espectro realizada tanto por no especialistas (e.g.,consumidoresquecambianlaconguraciondesurelojdealarmaodesutelefonocelular)comoporespecialistas(programadoresdecomputadores, laaudienciadeestelibro).Este libro se enfoca en la construcci on de sistemas de software.En este contexto,laprogramaciones laetapaentrelaespecicaci ondeunsistemayel programaejecutable que lo implementa. La etapa consiste en dise nar la arquitectura ylas abstracciones del programay codicarlas enun lenguaje de programacion.Esta visi on es amplia, tal vez mas amplia que la connotaci on usual ligada alapalabraprogramaci on.Cubretantolaprogramacionenpeque nocomolaprogramacionengrande.Cubretantoasuntos arquitecturales (independientesdel lenguaje) como asuntos de codicacion (dependientes del lenguaje). Est a basadaenconceptosysuuso, masqueenalg unlenguajedeprogramacionenparticular.Encontramosqueestavisi ongeneralesnaturalparaense narlaprogramacion.Noest ainuenciadaporlaslimitacionesdealg unlenguajedeprogramacionodeunametodologadedise noenparticular. Cuandoseusaenunasituaci onespecca,la visi ongeneral se adapta a las herramientas usadas, teniendo en cuenta suscapacidadesylimitaciones.TantocienciacomotecnologaLa programacion, tal como fue denida anteriormente, consta de dos partesesenciales: la tecnologa y su fundamentacion cientca. La tecnologa consistede herramientas, tecnicas practicas, yest andares, que nos permitenrealizar laprogramacion. La ciencia consiste de una teoraamplia yprofunda, conpoderpredictivo,quenospermiteentenderlaprogramacion.Idealmente,lacienciadebeexplicarlatecnologa delaformamasdirectay utilposible.Si alguna de estas partes no es tenida en cuenta, no podramos decir quese est a programando. Sin la teconologa, haramos matematicas puras. Sin laciencia, haramos algoartesanal sinunentendimientoprofundode lorealizado.Por lo tanto, ense nar correctamente la programacionsignica ense nar tanto laDraftPrefacio xvtecnologa(herramientasactuales)comolaciencia(conceptosfundamentales). Elconocimiento de las herramientas prepara al estudiante para el presente. Porsu parte, el conocimiento de los conceptos prepara al estudiante para futurosdesarrollos.M asqueunaartesanaApesardemuchosesfuerzosporintroducirunfundamentocientcoalapro-gramaci on,estaescasi siempreense nadacomounaartesana. Usualmenteseen-se naenel contextodeun(ounospocos)lenguaje(s)deprogramacion(e.g., Java,complementadoconHaskell, Scheme, oProlog). Los accidentes historicos deloslenguajesparticularesescogidosseentretejenjuntoconlosconceptosfundamen-talesdemaneratancercanaquenopuedenser separados. Existeunaconfusi onentreherramientasyconceptos. A unmas, sehandesarrolladodiferentesescuelasdepensamiento, basadasendiferentesmanerasdeverlaprogramacion, llamadasparadigmas:orientadoaobjetos, l ogico,funcional, entreotros.Cadaescueladepensamientotienesupropiaciencia.Launidaddelaprogramacioncomounasoladisciplinasehaperdido.Ense narlaprogramacionenestaformaescomotenerescuelasseparadasparala construcci onde puentes: una escuelaense na c omoconstruir puentes de ma-deramientrasotraescuelaense nac omoconstruirlosdehierro. Losegresadosdecualquieradeestasescuelasconsideraranlarestricciondemaderaohierrocomofundamentalynopensaranenusarestosmaterialesjuntos.El resultadoesquelosprogramasadolecendeundise nopobre. Nosotrospre-sentamosunejemplobasadoenJava, peroel problemasepresentaentodosloslenguajesenalg ungrado. LaconcurrenciaenJavaescomplejadeusarycostosaenrecursoscomputacionales. Debidoaestasdicultades, losprogramadoresqueaprendieronaserlousandoJavapuedenconcluirquelaconcurrenciaesuncon-ceptofundamentalmentecomplejo ycostoso. Las especicaciones delos programassedise nanalrededordelasdicultades, muchasvecesdemaneraretorcida. Peroestas dicultades nosonparanadafundamentales. Hayformas deconcurrenciabastante utiles enlas quelaprogramaciones tansencillacomolaprogramac onsecuencial (e.g., la programacion por ujos1ejemplicada por las tuberas Unix2).Ademas,esposibleimplementarloshilos,launidadb asica delaconcurrencia, casitan baratos como las invocaciones a procedimientos. Si al programador se le ense nalaconcurrenciaenlaformacorrecta, entoncesel oellaserancapacesdeespeci-caryprogramarsistemassinrestriccionesdeconcurrencia(incluyendoversionesmejoradasdeJava).1. Notadeltraductor:streamprogramming, eningles.2. Notadeltraductor:Unixpipes,eningles.Draftxvi PrefacioEl enfoquedel lenguajen ucleoEn los lenguajes de programacion en la practica se escriben programas de millonesde lneas de c odigo. Para ello, estos lenguajes proveen una sintaxis y un conjunto deabstracciones amplios. Como separar los conceptos fundamentales de los lenguajes,sobre los cuales recae su exito, de sus accidentes historicos? El enfoque del lenguajen ucleomuestraunaformade hacerlo. Enesteenfoque, unlenguajepracticoestraducidoenunlenguajen ucleoconsistentedeunpeque non umerodeelementossignicativosparael programador.El conjuntodeabstraccionesylasintaxissoncodicadosenel lenguajen ucleo. Deestamaneratantoel programadorcomoelestudiantetienenunavisi onclaradeloqueel lenguajehace. El lenguajen ucleocuenta con una semantica formal, sencilla, que permite razonar sobre la correci on ycomplejidad de los programas. De esta manera se proporciona una fundamentacions olidaalaintuici ondelprogramador yalastecnicasdeprogramacion construidassobre esta.Unaampliavariedaddelenguajes y paradigmas de programacionsepuedenmodelar a partir de un conjunto de lenguajes n ucleo estrechamente relacionados. Deall queel enfoquedellenguaje n ucleo esrealmente unestudio dela programacion,independiente del lenguaje. Comocualquier lenguaje setraduce enunlenguajen ucleo que a su vez es un subconjunto de un lenguaje n ucleo mas completo, entoncesserecuperalaunidadsubyacentealaprogramacion.Reducirunfen omenocomplejoasuselementosprimitivosesunacaractersticadel metodocientco. Estees unenfoqueexitosoutilizadoentodas las cienciasexactas. Proveeunprofundoentendimientoconpoderpredictivo. Porejemplo, laciencia de las estructuras permite dise nar todos los puentes (sean hechos de madera,hierro, ambos o cualquier otro material) y predecir su comportamiento en terminosdeconceptossimplescomofuerza, energa, tensi on, yesfuerzoydelasleyesqueellosobedecen[57].Comparaci onconotrosenfoquesComparemosel enfoquedel lenguajen ucleoconotrastres formasdedotarlaprogramacion deunabasecientcageneral:Un c alculo, como el c alculo o el c alculo , reduce la programaciona unn umero minimaldeelementos. Los elementos se escogen para simplicar elan alisismatematico, noparaayudarlaintuici ondel programador.Estoesmuy util paralos teoricos, pero no lo es tanto para los programadores en la practica. Los c alculossonmuy utiles paraestudiar las propiedades fundamentales ylos lmites de laprogramacion de un computador, pero no para escribir o razonar sobre aplicacionesengeneral.Una maquina virtual dene un lenguaje en terminos de una implementacion sobreunamaquinaideal.Unamaquinavirtualposeeunaespeciedesemantica operacio-nal, conconceptoscercanosal hardware. Estoes util paradise narcomputadores,DraftPrefacio xviiimplementar lenguajes, ohacer simulaciones. Noes utilpara razonar sobre progra-masysusabstracciones.Unlenguajemultiparadigmaesunlenguajequeabarcadiversosparadigmasdeprogramacion. Por ejemplo,Schemeesalavezfuncionaleimperativo[36],yLedatieneelementosdelosparadigmasfuncional,orientadoaobjetos,yl ogico[27].Lautilidaddeunlenguajemultiparadigma dependedecu anbienintegrados est anlosdiferentesparadigmas.El enfoque del lenguaje n ucleocombinacaractersticas de todos los enfoquesanteriores.Unlenguajen ucleobiendise nadocubreunampliorangodeconceptos,tal como lo hace un lenguaje multiparadigma bien dise nado. Si los conceptossonindependientes, entoncessepuededotaral lenguajen ucleodeunasemanticaformal, sencilla, como en un c alculo. Finalmente, la semantica formal puede ser unamaquinavirtualenunaltoniveldeabstraccion.Estofacilitaalosprogramadoresrazonar sobrelosprogramas.Dise nodeabstraccionesEl segundo objetivo del libro es ense nar c omo dise nar abstracciones en la progra-maci on. La tarea mas difcil para los programadores, y tambien la mas provechosa,noesescribirprogramassinodise narabstracciones.Programaruncomputadoresantetododise naryusar abstraccionesparaconseguirnuevos objetivos. Dema-neramuygeneral, denimosunaabstracci oncomounaherramientaomecanismoqueresuelveunproblemaparticular. Normalmente, lamismaabstraccionpuedeserusadapara resolver varios problemasdiferentes.Estaversatilidad esunadelaspropiedadesmasimportantesdelasabstracciones.Las abstracciones est antanprofundamente integradas a nuestrodiariovivir,quefrecuentementenosolvidamosdeellas. Algunasabstraccionestpicassonloslibros, las sillas, los destornilladores, y los autom oviles.3Las abstracciones se puedenclasicarenunajerarqua dependiendodecu anespecializadasson(e.g.,lapizesmasespecializadoqueinstrumentodeescritura,peroambossonabstracciones).Las abstracciones son particularmente numerosas dentro de los sistemas decomputadores. Los computadores modernos son sistemas altamente complejos con-sistentesdehardware, sistemaoperativo, middleware, ycapasdeaplicaci on, cadauno de los cuales est a basado en el trabajo de miles de personas durante varias deca-das.Estos sistemascontienenungigantesco n umerodeabstracciones quetrabajanjuntasdeunamaneraaltamenteorganizada.Dise nar abstracciones no siempre es facil. Puede ser un proceso largo y penoso, enel cual se ensayan, se descartan y se mejoran diferentes enfoques. Pero la recompensaesmuygrata. Noesunaexageraci on decirquela civilizaci onest aconstruida sobre3. Tambien lo son los lapices, las tuercas y tornillos, los cables, los transistores, lascorporaciones, lascanciones, ylasecuacionesdiferenciales. Notienenqueserentidadesmateriales!Draftxviii Prefacioabstracciones exitosas [125]. Nuevas abstracciones se dise nancadada. Algunasabstraccionesantiguas, comolaruedayel arco, permanecena unentrenosotros.Algunasabstraccionesmodernas,comoeltelefonocelular,r apidamentesevuelvenpartedenuestravidacotidiana.Nosotros usamoselenfoquedescritoacontinuaci onpara lograr elsegundoobje-tivo.Empezamosconconceptosdeprogramacion,loscualessonlamateriaprimaparaconstruirabstracciones.Introducimoslamayoriadelosconceptosrelevantesconocidos hoyenda, enparticular alcancelexico, programaciondealtoorden,composicionalidad, encapsulaci on, cocurrencia, excepciones, ejecuci on perezosa, se-guridad,estado explcito,herencia,yescogencia no-determinstica. Presentamos latecnicasparaconstruirabstraccionesparacadaconcepto. Presentamosbastantesejemplos deabstraccionessecuenciales, concurrentesydistribuidas. Presentamosalgunasleyesgeneralesparaconstruirabstracciones.Muchasdeestasleyestienensu contraparte en otras ciencias aplicadas, detal manera que libros como [51], [57],y[63]puedenservirdeinspiraci onalosprogramadores.CaractersticasprincipalesEnfoquepedag ogicoHay dos enfoques complementarios para ense nar la programacioncomo unadisciplinarigurosa:El enfoque basado en computacion presenta la programacion como una manera dedenir ejecuciones sobre maquinas. Este enfoqueaanza la intuici on delestudianteenel mundoreal por mediode ejecuciones actuales sobre sistemas reales. Esteenfoqueesespecialmenteefectivoconunsistemainteractivo: el estudiantepuedecrear fragmentos de programas e inmediatamente ver como se comportan. Lareducciondel tiempo entre pensar que pasasiyver el resultadoes de granayudaparaentender. Laprecisi onnosesacrica, puestoquelasemanticaformaldeunprograma puedeserdenidaenterminosdeunamaquinaabstracta.El enfoquebasadoenlal ogicapresentalaprogramacioncomounaramadelal ogicamatematica. Lal ogicanoversasobrelaejecuci onsinosobrepropiedadesdelosprogramas,locual esunnivel deabstraccionmasalto. Losprogramassonconstrucciones matematicas que obedecenleyes l ogicas. Lasemanticaformal deunprogramasedeneenterminosdeunal ogicamatematica. El razonamientoserealiza a traves de armaciones l ogicas. El enfoque basado en la l ogica es mas difcildecomprenderparalosestudiantessibienesesencialparadenirespecicacionesprecisasdequehacenlosprogramas.Tal como el libro Structure and Interpretation of Computer Programs [1, 2], nuestrolibrousaelenfoquebasadoencomputacionensumayorparte.Losconceptossonilustrados con fragmentos de programas que pueden ser ejecutados interactivamenteDraftPrefacio xixsobre unpaquete de software que acompa nael libro, the Mozart ProgrammingSystem[120]. Los programas seconstruyenconunenfoquedeconstrucci onporbloques, utilizando abstracciones de bajo nivel para construir las de mas alto nivel.Una peque na dosis de razonamiento l ogico se introduce en los ultimos captulos, e.g.,paradenirespecicacionesyparausarinvariantespararazonarsobreprogramasconestado.FormalismoutilizadoEste libro utiliza un unico formalismo para presentar todos los modelos decomputacion y los programas, a saber, el lenguaje Oz y su modelo de computacion.Paraser precisos, los modelos decomputaciondel librosontodos subconjuntosdeOzcuidadosamenteescogidos. PorQueescogimosOz?Laprincipal raz onesquesoportabienelenfoquedellenguajen ucleo.Otraraz oneslaexistenciadetheMozartProgrammingSystem.PanoramadelosmodelosdecomputacionEstelibropresentaunamiradaglobal yampliademuchos delos modelos decomputacionmas utiles. Losmodelossedise nannosolopensandoensusimpli-cidadformal (aunqueestoes importante), sinosobrelabasedec omopuede elprogramadorexpresarseyrazonar,el mismo, dentrodel modelo. Existenmuchosmodelos de computacion practicos, con diferentes niveles de expresividad, diferentestecnicas deprogramacion, ydiferentesformasderazonar sobreellos.Encontramosquecadamodelotienesusdominios deaplicaci on. Estelibroexplicamuchosdeestosmodelos, c omoserelacionan, c omoprogramarenellos, yc omocombinarlosparasacarleselmayorprovecho.M asnoesmejor(opeor), soloesdiferenteTodoslosmodelosdecomputaciontienensulugar.Noesciertoquelosmodelosconmasconceptosseanmejoresopeores.Unnuevoconceptoescomounaespadadedoblelo. A nadirunconceptoaunmodelodecomputacionintroducenuevasformas de expresi on, logrando que algunos programas seanmas sencillos, perotambien sevuelve masdifcilrazonar sobre losprogramas. Por ejemplo,a nadiendoestado explcito (variables mutables) al modelo de programacion funcional, podemosexpresarel rangocompletodetecnicasdeprogramacionorientadaaobjetos. Sinembargo,razonarsobreprogramasorientadosaobjetosesm asdifcil quehacerlosobre programas funcionales. Laprogramacionfuncional calculavalores usandofunciones matematicas. Ni los valores ni las funciones cambianenel tiempo. Elestadoexplcitoesunaformademodelarcosasquecambianenel tiempo: proveeuncontenedor cuyocontenido puede ser actualizado. La granpotencia de esteconceptohacemasdifcilrazonar sobre el.Draftxx PrefacioLaimportanciadereunirdiferentesmodelosCadamodelode computacionfue dise nadooriginalmenteparaser usadoais-ladamente. Puedeentoncesparecerunaaberracionel usarlosjuntosenunmismoprograma. En nuestro concepto, este no es de ninguna manera el caso, puesto que losmodelos no son solamente bloques monolticos sin nada en com un. Por el contrario,losmodelosdecomputaciontienenmuchoencom un; porejemplo, lasdiferenciasentrelosmodelosdeclarativoeimperativo(yentrelosmodelosconcurrenteyse-cuencial)sonmuypeque nascomparadasconloquetienenencom un. Porello, esfacilusarvariosmodelosalavez.Peroauncuandoestoestecnicamenteposible,porquequerraunousarvariosmodelos enunmismoprograma? La respuesta profundaa estapregunta es simple:porque uno no programa con modelos sino con conceptos de programacion ymecanismos para combinarlos. Dependiendo de cu ales modelos se utilizan es posibleconsiderar que se est a programando en un modelo en particular. El modelo aparececomounaclasedeepifenomeno.Ciertascosassonmasfaciles,otrascosassonmasdifciles, yrazonarsobreel programasehacedeunamaneraparticular. Esmuynatural que un programa bien escrito utilice diferentes modelos. En este punto estarespuestapuedeparecercrptica.M asadelanteenellibroseaclarar a.Un principio importante que veremos en este libro es que los conceptos asociadostradicionalmenteconunmodelopuedenserusadosconefectosmuypositivosenmodelos mas generales. Por ejemplo, los conceptos de alcance lexico y programacionde alto orden, usualmente asociados con la programacionfuncional, son utilesentodos los modelos. Estoes bienconocidoenlacomunidadpracticantede laprogramacionfuncional.Loslenguajesfuncionaleshansidoextendidosconestadoexplcito(e.g., Scheme[36] yStandardML[118, 174]) ymas recientementeconconcurrencia (e.g.,Concurrent ML[145]yConcurrent Haskell[137,135]).Loslmitesdelosmodelos unicosEnnuestraopinionunbuenestilodeprogramacionrequiereusarconceptosdeprogramacionqueest annormalmenteasociadosadiferentes modelos decompu-tacion. Los lenguajes que implementanun unico modelode computacion dicultanestalabor:Loslenguajes orientados aobjetos fomentanelusointensivo delosconceptos deestado y herencia. Los objetos tienen estado por defecto. Aunque esto parece simpleeintuitivo,realmente complica laprogramacion, e.g.,dicultalaconcurrencia (versecci on 8.2). Los patrones de dise no, los cuales denen una terminologa com un paradescribir buenas tecnicas de programacion, se explican normalmente en terminos delconcepto deherencia [54].Enmuchos casos, tecnicas massimples deprogramacionde alto ordenseransucientes (ver secci on7.4.7). Ademas, confrecuencia, elconceptodeherenciaesmal empleado. Porejemplo, enel desarrollodeinterfacesgracas de usuario en el modelo orientado a objetos, se recomienda usar la herenciaDraftPrefacio xxiparaextenderalgunasclasesgenericas quemanejanaparatos4confuncionalidadesespeccasparalaaplicaci on(e.g.,enloscomponentesSwingdeJava).Estovaencontradelprincipiodeseparaci on deresponsabilidades.Loslenguajesfuncionalesfomentanel usointensivodelaprogramaciondealtoorden.Algunosejemplostpicossonlosmonadasylacurricaci on5. Losmonadassonusadosparacodicarel estadopas andoloatravesdel programa.Estovuelvelos programas mas intrincados y no se logranlas propiedades de modularidaddel verdaderoestadoexplcito(ver secci on4.8). Lacurricaci onpermiteaplicarunafunci onparcialmente,pas andolesolamentealgunosdesusargumentos.Comoresultado, devuelve una funci on que espera por los argumentos restantes. El cuerpodelafunci onnoseejecutarahastaquetodoslosargumentosnohayanllegado.Elladodebil esqueconinspeccionarel c odigonoquedaclarosi unafunci ontienetodossusargumentososiest aa uncurricada(esperandoporelresto).Los lenguajes l ogicos, siguiendo la tradici on de Prolog, fomentan el uso intensivode la sintaxis de clausulas de Horn y la b usqueda. Estos lenguajes denen todos losprogramascomocoleccionesdeclausulasdeHorn, lascualesespecicanaxiomasl ogicossimples enlaformasi-entonces.Muchosalgoritmossevuelvendifcilesdeentender cuandosonescritos enesteestilo. Aunquecasi nuncasenecesitan,losmecanismosdeb usquedabasadaenbacktrackingdebenserutilizadossiempre(ver[176]).Estos ejemplos son hasta cierto punto subjetivos; es difcil ser completamente ob-jetivo cuando se est a hablando de un buen estilo de programacion y de expresividadde un lenguaje. Por lo tanto no deben ser mirados como juicios sobre esos modelos.M as bien, son indicadores de que ninguno de esos modelos es una panacea cuando seusademanera unica.Cadamodeloseadaptabienaalg untipodeproblemasperoseadaptamenosbienaotros.Estelibrointentapresentarunenfoqueequilibrado,algunasvecesusandounmodelodemaneraaisladaperosinnegarseausarvariosmodelosjuntoscuandosealomasapropiado.Ense narconestelibroA continuaci on explicamos c omo se adec ua este libro en un currculo en inform ati-cayquecursossepuedenense narconel. Porinform aticaentendemosel campocompleto de la tecnologade la informacion, incluyendo ciencias de la compu-tacion, ingenierade lacomputacion, ysistemas deinformacion. Algunas veces,lainform aticaestambienllamadacomputaci on.4. Notadeltraductor:widgeteningles.5. Notadeltraductor:Eningles,currying.Draftxxii PrefacioElrolencurrculosdeinformaticaNosotrosconsideramoslaprogramacioncomounadisciplinaindependientedecualquierotrodominioeninform atica. Deacuerdoanuestraexperiencia, lapro-gramaci on sedividenaturalmenteentrest opicoscentrales:1. Conceptosytecnicas.2. Algoritmosyestructurasdedatos.3. Dise nodeprogramas eingenieradesoftware.Este libro presenta unminuciosotratamiento del tema (1) yuna introducciona los temas (2) y(3). Enque ordense deberanpresentar estos temas? Hayunainterdependenciamuyfuerteentre(1) y(3). Laexperienciamuestraqueeldise nodeprogramasdebeserense nadotemprano, demaneraquelosestudiantesevitenmalosh abitos. Sinembargo, estoessolounapartedelahistoria, pueslosestudiantes necesitantener conocimiento sobre los conceptos para expresar susdise nos. Parnas hautilizadounenfoque queempiezaconel tema(3) yusaunmodelodecomputacionimperativo[132]. Debidoaqueestelibroutilizamuchosmodelosdecomputacion, recomendamosusarloparaense narlostemas(1)y(3)concurrentemente,introduciendoalaveznuevosconceptosyprincipiosdedise no.En el programa de inform atica de la Universidad Catolica de Lovaina en Lovaina laNueva,Belgica(UCL),seasignan8horasporsemestreacadatema.Estoincluyeclasesysesionesdelaboratorio. Juntos, estostrestemasconformanunsextodelcurrculo completo en inform atica para las formaciones en licenciatura e ingeniera.Hayotropuntoquenosgustaratratar, ytienequeverconc omoense narpro-gramaci on concurrente. En uncurrculo tradicional en inform atica, la concurrenciaseense naextendiendounmodeloconestado, tal comoel captulo8extiendeelcaptulo6. Esdebidamenteconsideradocomplejoydifcil programaras. Existenotrasformas maasencillas deprogramacionconcurrente. Laconcurrenciadecla-rativapresentadaenelcaptulo4esmuchomassimpledeusarparaprogramarypuede ser usada con frecuencia en lugar de la concurrencia con estado (ver el epgra-fequecomienzael captulo4). Laconcurrenciaporujos6, unaformasencilladeconcurrenciadeclarativa,sehaense nadoencursosdeprimera noenMITyotrasinstituciones.Otraformasencilladeconcurrencia,elpasodemensajesentrehilos,se explica en el captulo 5. Nosotros sugerimos que tanto la concurrencia declarativacomo la concurrencia por paso de mensajes sean parte del currculo est andar y seanense nadasantesdelaconcurrenciaconestado.CursosHemos usado este libro como texto para varios cursos ubicados desde segundo a nodepregradohastacursosdeposgrado[144, 178, 179]. Ensuformaactual,ellibro6. Notadeltraductor:Streamconcurrency, eningles.DraftPrefacio xxiiino est aorientado como textodeunprimer curso deprogramacion, pero elenfoquepuedeser ciertamenteadaptado para untalcurso.7Losestudiantes deberan teneralgunaexperienciab asicadeprogramacion(e.g., unaintroduccionpracticaalaprogramacionyconocimientodeestructuras dedatos sencillas comosecuencias,conjuntos,ypilas)yalg unconocimientomatematicob asico(e.g.,unprimercursode an alisis, matematicas discretas o algebra). El libro tiene suciente material para,porlomenos, cuatrosemestresdeclasesydesesionesdelaboratorio.Algunosdeloscursosposiblesson:Uncursodepregrado sobreconceptosytecnicasdeprogramacion. Elcaptulo 1presentaunaintroduccionligera. El cursocontin uaconlos captulos desdeel 2hasta el 8. Dependiendo de la profundidad del cubrimiento deseado, se puede ponermayor o menor enfasis en algoritmos (para ense nar algoritmos al mismo tiempo queprogramacion), concurrencia(lacual puedeserdejadacompletamentedelado, sisequiere),osemanticaformal(paradarleexactitudalasintuiciones).Un curso de pregrado sobre modelos de programacion aplicados. Esto incluye pro-gramaci on relacional (captulo 9 (en CTM)),lenguajes de programacion especcos(especialmenteErlang,Haskell, Java, yProlog),programaciondeinterfacesgra-casdeusuario(captulo10(enCTM)), programaciondistribuida(captulo11(enCTM)), yprogramacionporrestricciones(captulo12(enCTM)). Estecursoesunacontinuaci onnaturaldelanterior.Uncursodepregradosobreprogramacionconcurrenteydistribuida(captulos4, 5, 8, y11(enCTM)). Los estudiantes deberantener algunaexperienciaenprogramacion. Elcursopuedeempezarconalgunaspartesdeloscaptulos2,3,6,y7paraintroducirlaprogramacion declarativayconestado.Uncursodeposgradosobremodelosdecomputacion(todoel libro, incluyendolasemanticapresentadaenelcaptulo13(enCTM)).Elcursopuedeconcentrarseenlasrelacionesentrelosmodelosyenlasemanticadecadaunodeellos.El sitioWebdel cursotienemasinformacionsobrecursos, incluyendolastrans-parenciasytareasdelaboratrioparaalgunosdeellos.ElsitioWebcuentaconuninterpretador animado que muestra c omo el lenguaje n ucleo se ejecuta de acuerdo ala semantica delamaquina abstracta. El libropuedeser usado como complementodeotroscursos:Parte de un curso de pregrado sobre programacion por restricciones (captulos 4, 9(enCTM),y12(enCTM)).Parte de un curso de posgrado sobre aplicaciones colaborativas inteligentes(apartes detodoel libro, conenfasis enlaparteII (enCTM)). Si sequiere, ellibro puedeser complementado por textos sobre inteligencia articial (e.g., [148]) osistemasmultiagentes(e.g.,[183]).7. Conmuchogustoayudaremosaquienestedispuestoaabordarestaadaptacion.Draftxxiv PrefacioParte deuncursodepregrado sobresemantica.Todoslosmodelossondenidosformalmenteenloscaptulosdondeseintroducen,ysusem anticasecomplementaen el captulo 13 (en CTM). As se presenta un caso de estudio, de tama no real, sobrec omodenirlasemanticadeunlenguajedeprogramacion modernoycompleto.Aunqueel libro tieneun s olido soporte teorico, est a orientado a ofrecer unaedu-cacionpracticaenestos aspectos. Cadacaptulocuentaconmuchos fragmentosdeprogramas,todosloscualessepuedenejecutarenel sistemaMozart(vermasabajo). Con estos fragmentos, las clases se pueden ofrecer con demostraciones inter-activasdelosconceptos.Hemosencontradoquelosestudiantesaprecianbastanteestetipodeclases.Cadacaptuloterminaconunconjuntodeejerciciosquenormalmenteincluyenalgodeprogramacion. Ellossepuedenresolversobreel sistemaMozart. Paralamejor asimilaciondel material encada captulo, animamos a los estudiantes arealizar tantos ejercicios comoles seaposible. Los ejercicios marcados (ejercicioavanzado) puedentomar de varios das a varias semanas para resolverlos. Losejerciciosmarcados(proyectodeinvestigacion) sontemasabiertosypuedenllevararealizar contribucionessignicativaseninvestigacionenelarea.SoftwareUnacaractersticapracticadel libroesquetodos losfragmentosdeprogramacorren sobre una plataforma de software, el Mozart Programming System. Mozart esun sistema de programacion, con todas las caractersticas para producir con calidad,acompa nado de un sistema de desarrollo incremental y un conjunto completode herramientas. Mozart compila a unbytecode eciente e independiente de laplataformaquecorresobremuchasvariacionesdeUnixyWindows, ysobreMacOSX. Losprogramasdistribuidospuedenpropagarsesobretodosestossistemas.El sitio WebdeMozart, http://www.mozart-oz.org, tieneinformacion completa,incluyendolos binarios paradescargar, documentacion, publicaciones cientcas,c odigofuente,ylistasdecorreo.El sistema Mozart implementa ecientementetodos los modelos decomputacionque se cubren en ellibro. Esto lo vuelve ideal para usar diferentes modelos al tiem-poenelmismoprograma yparacompararlosmodelosescribiendoprogramas queresuelvenunmismoproblemaendiferentesmodelos. Comocadamodeloest aim-plementado ecientemente, se pueden escribir programas completos usando solo unmodelo. Se pueden utilizar otros modelos despues, si se necesita, de manera justica-dapedag ogicamente. Por ejemplo,sepuedenescribirprogramas enteramenteenelestiloorientadoaobjetos,complementadoconpeque noscomponentesdeclarativosdondeestossonmas utiles.El sistemaMozart es el resultadodeunesfuerzodedesarrollodelargoplazopor partedel Mozart Consortium, unacolaboraci oninformal de investigacionydesarrollo de tres laboratorios. Este sistema ha estado en continuo desarrollo desde1991.El sistemasehaliberadocontodosuc odigofuentebajounalicenciaOpenDraftPrefacio xxvSource. La primera versi on p ublica se libero en 1995. La primera versi on p ublica consoporte para distribuci on se libero en 1999. El libro se basa en una implementacionideal muycercanaalaversi on1.3.0de Mozart liberadaenAbril de 2004. Lasdiferenciasentrelaimplementacionideal yMozartest anlistadasenel sitioWebdellibro.HistoriayagradecimientosLas ideas expresadas en este libro no se produjeron con facilidad. Ellas seproducendespuesdemasdeunadecadadediscusi on, programacion, evaluaci on,deshecharlomalo,adoptarlobuenoyconvenceraotrosqueesoesbueno.Muchagentecontribuyoconideas,implementaciones,herramientasyaplicaciones.Somosafortunadosdehabercontadoconunavisi oncoherenteentrenuestroscolegasporunperodolargo.Graciasaello,hemossidocapacesdeprogresar.Nuestro principal vehculo de investigacion y banco de pruebas de nuevas ideas esel sistemaMozart,el cual implementaellenguajeOz.Losprincipalesdise nadoresydesarroladores delsistemason(enordenalfabetico):PerBrand,ThorstenBrun-klaus, Denys Duchier, Kevin Glynn, Donatien Grolaux, Seif Haridi, Dragan Havelka,MartinHenz, ErikKlintskog, Leif Kornstaedt, Michael Mehl, MartinM uller, To-bias M uller, Anna Neiderud, Konstantin Popov, Ralf Scheidhauer, Christian Schul-te, GertSmolka, PeterVanRoy, yJ orgW urtz. Otroscontribuidoresimportantesson(enordenalfabetico):Ili`esAlouini, Raphael Collet, FrejDrejhammar, SamehEl-Ansary, Nils Franzen, Martin Homik, Simon Lindblom, Benjamin Lorenz, Valen-tinMesaros,yAndreasSimon. AgradecemosaKonstantinPopovyKevinGlynnporadministrarlaliberaci ondelaversi on1.3.0deMozart,lacual sedise n oparaacompa nar ellibro.Tambiennosgustaraagradeceralossiguientesinvestigadoresycontribuidoresindirectos: HassanAt-Kaci, JoeArmstrong, JoachimDurchholz, Andreas Fran-ke, ClaireGardent, FredrikHolmgren, SverkerJanson, TorbjornLager, ElieMil-grom, Johan Montelius, Al-Metwally Mostafa, Joachim Niehren, Luc Onana, Marc-AntoineParent,DaveParnas,MathiasPicker,AndreasPodelski,ChristophePon-sard, Mahmoud Rafea, Juris Reinfelds, Thomas Sj oland, Fred Spiessens, Joe Turner,yJeanVanderdonckt.Agradecemosespecialmentealassiguientespersonasporsuayudaconmaterialrelacionadoconel libro. Raphael Colletporsucoautoradeloscaptulos 12(enCTM)y13(enCTM), porsutrabajoenlapartepracticadeLINF1251,uncursoofrecidoenlaUCL,yporsuayudaconelformatoenLATEX2.DonatienGrolauxportrescasosdeestudioeninterfacesgracasdeusuario(utilizadosenlasseccio-nes 10.4.2 (enCTM)10.4.4 (enCTM)).KevinGlynnporescribirlaintroduccionaHaskell (seccion4.7). WilliamCookpor sus comentariossobreabstracciondedatos. Frej Drejhammar, SamehEl-Ansary, yDraganHavelkaporsuayudaconlapartepracticadeDatalogiII,uncursoofrecidoenKTH(theRoyalInstituteofTechnology,Stockholm).ChristianSchulteporhaberpensadoydesarrollado com-Draftxxvi Prefaciopletamenteunaedici onposteriordeDatalogi II ypor sus comentariossobreunborradordel libro. Ali Ghodsi, JohanMontelius,ylosotrostresasistentesporsuayudaconlapartepracticadeestaedici on. LuisQuesadayKevinGlynnporsutrabajosobrelapartepracticadeINGI2131,uncursoofrecidoenlaUCL. BrunoCarton, Raphael Collet, KevinGlynn, DonatienGrolaux, StefanoGualandi, Va-lentinMesaros, Al-MetwallyMostafa, LuisQuesada, andFredSpiessensporsusesfuerzosenleer, probaryvericarlosprogramasejemplo.Agradecemosmuchsi-mas otras personas, imposible mencionarlas atodas, por sus comentarios sobreel libro. Finalmente, agradecemosalos miembros del Department of ComputingScienceandEngineeringenUCL,SICS(theSwedishInstituteofComputerScien-ce,Stockholm),y el DepartmentofMicroelectronicsandInformationTechnologyatKTH.Pedimosdisculpasatodosaquellosquehayamosomitidoinadvertidamente.Comonosorganizamosparaconservarunresultadosencilloteniendoesamul-tituddedesarrolladores trabajando juntos? Noesunmilagro, sinolaconsecuenciadeunavisi onfuerteyunametodologadedise nocuidadosamenteconstruidaquetom omasdeunadecadacrearypulir.8Alrededor de 1990, algunos de nosotros regresamos, al mismo tiempo, con fuertesfundamentos tanto teoricos como en construcci on de sistemas. Estas personasiniciaronel proyectoACCLAIM, nanciadopor laUni onEuropea(19911994).Poralgunaraz on,esteproyecto sevolvi ounpuntofocal.Entre muchos artculos, los de Sverker Janson y Seif Haridi en 1991 [81] (multipleparadigms inthe AndorraKernel Language AKL), Gert Smolka en1995[161](buildingabstractionsinOz), ySeif Haridi etal. en1998[64] (dependableopendistributioninOz), fuerontres hitos importantes. El primer artculosobre Ozsepublic oen1993yyacontabaconmuchasideasimportantes[68]. Despuesdelproyecto ACCLAIM, dos laboratorios continuaron trabajando juntos sobre las ideasde Oz: el ProgrammingSystemsLab(DFKI, SaarlandUniversityand CollaborativeResearchCenter SFB378), enSaarbr ucken, Alemania, yel Intelligent SystemsLaboratoryenSICS.Ellenguaje Ozfuedise nadooriginalmente por GertSmolkay susestudiantes enelProgrammingSystemsLab[65,68,69,154,155,160,161].El dise nobienfactorizadodel lenguajeylaaltacalidaddesuimplementacionse deben en granparte al liderazgo inspirado por Smolka y la experiencia enconstrucci on desistemasdesulaboratorio. Entrelosdesarrolladores mencionamosaChristianSchulteporsupapelcoordinandoeldesarrollo general,DenysDuchierpor su activo soporte a usuarios, y Per Brand por su papel coordinando el desarrollodelaimplementaciondistribuida.En1996,aloslaboratorios alem anysuecoseunioelDepartmentofComputingScienceandEngineeringenUCLcuandoel primer autor sefue atrabajar all.8. Podemosresumir lametodologaendosreglas (ver[176] paramasinformacion). Laprimera, toda nueva abstracciondebe simplicar el sistema o incrementar grandemente supoder expresivo. La segunda, toda nueva abstraccion debe tener tanto una implementacionecientecomounaformalizacionsencilla.DraftPrefacio xxviiJuntos, los tres laboratorios formaronel Mozart Consortiumconsusitio Webneutral http://www.mozart-oz.orgdemaneraqueel trabajonofueraligadoauna unicainstitucion.EstelibrofueescritousandoLATEX2, ex, xg, xv, vi/vim, emacs, yMozart,alprincipiosobre unDellLatitudeconRedHat LinuxyKDE,ydespues sobre unAppleMacintoshPowerBookG4conMacOSXyX11. LasfotosdepantallasetomaronsobreunSunworkstation corriendoSolaris.El primer autor agradecealaregionde WalloonenBelgicapor sugenerososoporte altrabajo sobre Oz/Mozart enUCLenlosproyectos PIRATESyMILOS.ComentariosnalesHemos tratado de hacer que este libro sea util tanto como libro de texto como dereferencia. A Usted de juzgar cu an bien lo hicimos. Debido a su tama no, es probableque queden algunos errores. Si Usted encuentra alguno, apreciaramos mucho nos lohiciera saber. Por favor, enve estos y todos lo comentarios constructivos que puedateneralasiguientedirecci on:Concepts,Techniques,andModelsofComputerProgrammingDepartmentofComputingScienceandEngineeringUniversitecatholiquedeLouvainB-1348 Louvain-la-Neuve,BelgiumPara terminar, nos gustara agradecer a nuestras familias y amigos por el soportey animobrindados durante los cuatro a nos que tom o escribir estelibro. Seif HaridiagradeceespecialmenteasuspadresAli yAminayasufamiliaEeva, Rebecca,yAlexander. PeterVanRoydeseaagradecerespecialmenteasuspadresFransyHendrikayasufamiliaMarie-Ther`ese, Johan,yLucile.Louvain-la-Neuve,Belgium PeterVanRoyKista,Sweden SeifHaridiSeptember2003DraftxxviiiDraftCorriendolosprogramasdeejemploEstelibropresentabastantes programas yfragmentos de programadeejemplo.TodosellossepuedencorrerbajoelMozartProgrammingSystem.Parahacerlosedebentenerencuentalossiguientespuntos:ElsistemaMozartpuedeserdescargado sincostodesdeelsitioWebdelMozartConsortiumhttp://www.mozart-oz.org. ExistenversionesparadiversossaboresdeWindowsyUnixyparaMacOSX.Todos los ejemplos, salvo aquellos previstos como aplicaciones independientes, sepuedencorrerpormediodel ambientededesarrollointeractivodeMozart(IDE,porsussiglas eningles). Elapendice Apresenta unaintroduccionaesteambiente.Las variables nuevas enlos ejemplos interactivos debenser declaradas conladeclaraciondeclare.Losejemplosdelcaptulo1muestranc omohacerlo.Olvidarestasdeclaracionespuedeproducirunerrorextra nosi existenversionesantiguasde las variables. A partir del captulo 2 la declaracion declare se omite en el textocuandoesobviocu alessonlasnuevasvariables. Sinembargo,ladeclaraciondebesera nadidaparacorrer losejemplos.Algunos captulos usan operaciones que no forman parte de la versi on est andar deMozart. El c odigo fuente de estas operaciones adicionales (junto con bastante mate-rialadicional util)secoloc oenelsitioWebdellibro.Recomendamoscolocar estasdenicionesensuarchivo.ozrc, demaneraqueseancargadasautom aticamentedesdeelarranquedelsistema.El libropresentaocasionalmentefotos delapantallaymedidas detiempodeprogramas. A menos que se indique lo contrario, las fotos de la pantalla se tomaronsobreunaestaciondetrabajodeSuncorriendabajoel sistemaoperativoSolarismientras que las medidas de tiempo fueron tomadas a programas corriendo Mozart1.1.0 sobre la distribuci on de Linux Red Hat versi on 6.1 en un computador portatilDell LatitudeCPxconprocesadorPentiumIII a500MHz. Laaparienciadelasfotosdelapantallaylostiempostomadospuedenvariarsobresusistema.El librosuponeunaimplementacionideal cuyasemanticaespresentadaenloscaptulos13(enCTM)(modelodecomputaciongeneral)y12(enCTM)(espaciosde computacion). Existen unas cuantas diferencias entre esta implementacion idealyelsistemaMozart.EllasseexplicanenelsitioWebdellibro.Draft1 Introduccion a los conceptos de programacionNoexisteuncaminorealhacialageometra. Respuestade EuclidesaPtolomeo,Euclides(.c.300A.C.)Solosigueelcaminodorado.TheWonderful WizardofOz,L.FrankBaum(18561919)Programar esdecirlealcomputador c omodebera realizar sutrabajo.Estecaptu-lopresentaunasencillaypracticaintroduccionamuchosdelosmasimportantesconceptos en programacion. Suponemos que el lector tiene alguna exposici on previaaloscomputadores.NosotrosusamoslainterfazinteractivadeMozartparaintro-ducir los conceptos deprogramacion deforma progresiva. Animamos al lector paraqueensayelosejemplosdeestecaptulocorriendolos enelsistemaMozart.Esta introduccion solo explora la supercie de los conceptos de programacion queveremos en este libro. Los captulos posteriores profundizan en el entendimientodeestosconceptosya nadenmuchosotrosconceptosytecnicas.1.1. UnacalculadoraEmpecemosporusarelsistemapararealizar c alculos.InicieMozartdigitando:ozo haciendo doble clic en el cono de Mozart. All se abre una ventana de edici on condosmarcos.Enelmarcosuperior,digitelalneasiguiente:{Browse 9999*9999}Conel rat onseleccione esalnea. Ahoradirjase al men uOzyseleccione FeedRegion. Estoalimentael sistemaconel textoseleccionado. El sistemaentoncesrealiza elc alculo 9999*9999 ymuestra elresultado, 99980001, enunaventana es-pecial llamada el browser. Los corchetes { . . . } se usan para hacer una invocacion aun procedimiento o a una funci on. Browse es un procedimiento de un argumento, elcual se invoca {Browse X}. Esta invocacion abre el browser, si a un no est a abierto,ymuestra Xdentrodeel.Draft2 Introduccionalosconceptosdeprogramacion1.2. VariablesMientras se trabaja con la calculadora, nos gustara recordar un resultaado previo,demaneraquesepuedautilizarmastardesinvolverloadigitar.Estolopodemoshacerdeclarandounavariable:declareV=9999*9999Estodeclara Vylaligaa 99980001.Estavariablelapodemosusarmastarde:{Browse V*V}Estomuestralarespuesta 9996000599960001. Lasvariablessonsolamenteabre-viaciones para valores. Ellas no pueden ser asignadas mas de una vez. Pero se puededeclararotravariableconelmismonombredeunapreviamentedeclarada.Lava-riableanteriorsevuelveinaccesible. Losc alculospreviosquelausabanaellanocambian. Estosedebeaqueexistendos conceptos ocultosdetr as delapalabravariable:El identicador. Es lo que se digita. Las variables empiezan con una letramay uscula y pueden continuar con cualquier n umero de letras o dgitos. Por ejemplo,lasecuenciadecaracteres Var1puedeserunidenticadordevariable.La variable del almacen. Es lo que el sistema utiliza para calcular. Hace parte delamemoriadelsistema,lacualllamamosalmacen.La declaraciondeclare crea una nueva variable en el almaceny hace que elidenticadordevariabletengaunareferenciaaella.Losc alculospreviosqueusanelmismo identicador nose afectanporque elidenticador referencia otra variabledelalmacen.1.3. FuncionesRealicemos un c alculo un poco mas complicado. Suponga que deseamos calcular lafunci on factorial n!, la cual se dene como 12(n1)n. Esta funci on calculael n umero de permutaciones de n elementos, i.e., el n umero de formas diferentes enqueestoselementossepuedencolocarenunala.Factorialde10es:{Browse 1*2*3*4*5*6*7*8*9*10}Estomuestra 3628800. Quepasasi ahoradeseamoscalcularel factorialde100?Nos gustaraque el trabajotediosodedigitar todos los n umeros de 1a100lohicierael sistema. Haremosmas: Lediremosal sistemac omocalcularel factorialdecualquiern.Estolohacemosdeniendounafunci on:Draft1.3 Funciones 3declarefun {Fact N}if N==0 then 1 else N*{Fact N-1} endendLa declaracion declare crea la nueva variable Fact. La declaracion fun dene unafunci on.Lavariable Factseligaalafunci on.Lafunci ontieneunargumento N,elcual es una variable local, i.e., se conoce solamente dentro del cuerpo de la funci on.Cadavezqueseinvocalafunci onsecreaunanuevavariablelocal.Recursi onEl cuerpo de la funci on es una instruccion denominada una expresi on if. Cuandolafunci onseinvoca,laexpresi on ifrealizalasetapassiguientes:Primerocompruebasi Nesiguala0realizandolaprueba N==0.Si lapruebatieneexito, entoncessecalculalaexpresi onqueest adespuesdelthen. Esto devuelve simplementeeln umero 1.Es as debidoa queelfactorial de0es1.Sila pruebafalla,entonces secalculalaexpresi on queest a despues delelse. Esdecir, si Nnoesigual a0, entoncessecalculalaexpresi on N*{Fact N-1}. Estaexpresi on utiliza Fact, la misma funci on que estamos deniendo! A esto se le llamarecursi on.Esperfectamentenormalynoescausadeinquietud.Factutilizalasiguientedenici onmatematicadefactorial:0! = 1n! = n (n 1)! si n > 0Estadenici onesrecursivadebidoaqueel factorialde Nes Nmultiplicadoporelfactorialde N-1.Ensayemos lafunci on Fact:{Browse {Fact 10}}Estodeberamostrar 3628800al igual queantes. As ganamosconanzaenqueFactest arealizandolosc alculoscorrectamente. Ensayemosunaentradaunpocomasgrande:{Browse {Fact 100}}Estomuestraunn umeroenorme(el cual presentamosengruposdecincodgitosparamejorarsulectura):933 2621544394 41526 81699 23885 62667 00490 71596 82643 81621 4685929638 95217 59999 32299 15608 94146 39761 56518 28625 3697920827 22375 82511 85210 91686 40000 00000 00000 00000 00000Draft4 IntroduccionalosconceptosdeprogramacionEsteesunejemplodeprecisi onaritmeticaarbitraria,algunasvecesllamadapre-cisi oninnita,aunquenoesinnita. Laprecisi onest alimitadaporlacantidaddememoriaquetengasusistema. Uncomputador personal tpico, debajocos-to, con256MBdememoriapuedemanejarcientosdemilesdedgitos. El lectorescepticopreguntar a:esen umeroenormeesverdaderamenteel factorial de100?Comopodemosasegurarlo?Realizarel c alculoamanotomarauntiempomuylargoyprobablementeterminarasiendoincorrecto. M asadelanteveremosc omoganar conanzaenqueelsistemaseest acomportandocorrectamente.CombinacionesEscribamos una funci on para calcular el n umero de combinaciones que se puedenformarconkelementostomadosdeunconjuntodenelementos.Estoeslomismoquecalcular el n umerode subconjuntos, de tama nok, que sepuedenformar apartirdeunconjuntodetama non. Estoseescribe

nk

ennotaci onmatema aticaysepronunciacombinatorio nk.Sepuededenircomosigueusandolafunci onfactorial:

nk

=n!k!(n k)!locualllevanaturalmentealafunci onsiguiente:declarefun {Comb N K}{Fact N} div ({Fact K}*{Fact N-K})endPorejemplo, {Comb 10 3}da120, locual correspondeal n umerodemanerasenquesepuedenescogertreselementosdeunconjuntode10elementos. Estanoeslaformamasecientedeescribir Comb,peroesprobablementelamassencilla.Abstracci onfuncionalLa denici on de Comb utiliza la funci on Fact, ya existente, en su denici on. Siem-preesposibleutilizarfuncionesexistentesparadenirfuncionesnuevas. Sellamaabstraccionfuncional al hechodeutilizarfuncionesparaconstruirabstracciones.Deestamanera, losprogramassoncomocebollas, concapasdefunciones sobrecapas defuncionesinvocando funciones.Esteestilodeprogramacion secubre enelcaptulo3.1.4. ListasAhorapodemos calcular funciones sobrelos enteros. Peroenrealidadnohaymuchoque hacer conunentero. Supongamos que deseamos hacer c alculos conDraft1.4 Listas 5muchosenteros.Porejemplo,nosgustara calcularel tri angulodePascal1:11 11 2 11 3 3 11 4 6 4 1. . . . . . . . . . .Estetri angulodebesunombreal cientcoylosofoBlaisePascal. El tri angulocomienza con un 1 en la primera la. Cada elemento es la suma de los dos elementosjusto encimade el a la izquierda y a la derecha (si unode esos elementos no existe,como en los bordes, se toma como cero). Quisieramos denir una funci on que calculetoda la nesima la de un solo golpe. La nesima la contiene n enteros. Podemoscalcularladeunsologolpeutilizandolistasdeenteros.Unalistanoesmasqueunasecuenciadeelementosentreparentesis cuadrados,izquierdo y derecho, como [5 6 7 8]. Por razones historicas, la lista vaca se escribenil(yno []).Laslistassemuestranigualquelosn umeros:{Browse [5 6 7 8]}Lanotaci on [5 6 7 8]es unaabreviaci on. Realmente, unalistaes unacadenadeenlaces, dondecadaenlacecontienedos cosas: unelementodelalistayunareferencia al restodelacadena. Las listassiemprese creanelemento porelemento,comenzando con nilyagregando enlacesunoporuno.UnnuevoenlaceseescribeH|T, donde H es el elemento nuevo y T es la parte antigua de la cadena. Construya-mosunalista.Empezamos con Z=nil.Agregamos unprimerenlace Y=7|Zyluegounsegundoenlace X=6|Y. Ahora Xreferenciaunalistacondosenlaces, unalistaquetambiensepuedeescribircomo [6 7].El enlace H|Tfrecuentementesellamauncons, unterminoheredadodeLisp.2Tambien lo llamamos unpar lista. Crear unnuevo enlace se llama consear.3Si Tesunalista,etoncesconsear Hy Tcreaunanuevalista H|T:1. El triangulo de Pascal es unconcepto clave encombinatoria. Los elementos de lanesimalasonlascombinaciones`nk,dondekvarade0an.Estoestaestrechamenterelacionadoconel teoremadel binomioquediceque(x + y)n=Pnk=0`nkxky(nk)paracualquierenteron 0.2. La mayorade la terminologade listasfue introducida conel lenguajeLisp a nales deladecadade losa nos1950y hapermanecidodesde eseentonces[111].Nuestra utilizaciondelabarraverticalesheredadadeProlog, unlenguajedeprogramacionlogicainventadoaprincipiosdelosa nos1970[37, 163]. EnLispseescribeel conscomo(H . T), locualesllamadounparpunto.3. Notadel traductor: Enel libro eningles dice consing locual es claramente unapalabrainventadaparaexpresarelconcepto.Draft6 Introduccionalosconceptosdeprogramacionnil21 21 21 21 21 21 28 nil15|L = [5 6 7 8]L =L.2 =L.1 = 5L.2 = [6 7 8]|6 |7 |8|6 |7 |Figura1.1:Descomposiciondelalista [5 6 7 8].declareH=5T=[6 7 8]{Browse H|T}Lalista H|Tseescribe [5 6 7 8].Tienecomocabeza 5ycomocola [6 7 8].Elcons H|Tpuededescomponerseparasacardealllacabezaylacola:declareL=[5 6 7 8]{Browse L.1}{Browse L.2}Aquseutilizaeloperador punto.,elcualsirveparaseleccionar elprimerooelsegundoargumentodeunparlista.Ejecutar L.1calculalacabezade L,elentero5. Ejecutar L.2calculalacolade L, lalista [6 7 8]. Lagura1.1presentaunagraca: Lesunacadenaenlacualcadaenlacetieneunelementodelalistay nilmarcael nal. Ejecutar L.1calculael primerelementoyejecutar L.2calculaelrestodelacadena.ReconocimientodepatronesUnaformamascompactadedescomponerunalistaselograpormediodel usodelainstruccioncase,lacualconsiguecalcularlacabezaylacolaenunaetapa:declareL=[5 6 7 8]case L of H|T then {Browse H} {Browse T} endEsto muestra 5 y [6 7 8], igual que antes. La instruccion case declara dosvariables locales, Hy T, ylas ligaalacabezaylacolade lalista L. Decimosquelainstruccioncaserealizareconocimientodepatrones,porquedescompone LDraft1.5 Funcionessobrelistas 71 2 1 Tercera fila1 Primera fila1 1 Segunda fila(0) 1 3 3 1 (0)1 4 6 4 1+ + + + +Cuarta filaQuinta filaFigura1.2:CalculodelaquintaladeltriangulodePascal.deacuerdoal patr on H|T. Lasvariableslocalesquesedeclaranconlainstruccioncase son como las variables declaradas con declare, salvo que las variables existensolamenteenelcuerpodelainstruccioncase,i.e.,entreelthenyelend.1.5. FuncionessobrelistasAhora que podemos calcular con listas, denamos una funci on, {Pascal N}, paracalcular la nesima la del tri angulo de Pascal. Primero, entendamos c omo se haceel c alculoamano. Lagura1.2muestrac omocalcularlaquintalaapartirdelacuarta. Miremosc omofuncionaestosi cadalaesunalistadeenteros. Paracalcular una la, partimos de la anterior. Desplazamos la la hacia la izquierda unaposici on y hacia la derecha una posici on.4Luego sumamos las dos las desplazadas.Porejemplo,tomemoslacuartala:[1 3 3 1]Desplacemosestalaalaizquierdayaladerechayluegosumemoslaselementoporelemento:[1 3 3 1 0]+ [0 1 3 3 1]N otese que el desplazamiento a la izquierda a nade un cero a la derecha y eldesplazamientoa la derechaa nade unceroa laizquierda. Realizandola sumaseobtiene[1 4 6 4 1]loquecorresponde alaquintala.4. Notadeltraductor:shiftleftyshiftright,eningles.Draft8 IntroduccionalosconceptosdeprogramacionLafunci onprincipalAhoraqueentendemosc omoresolverel problema, podemosprocederaescribirlafunci onquerealizaesasoperaciones.Estaes:declare Pascal SumListas DesplIzq DesplDerfun {Pascal N}if N==1 then [1]else{SumListas {DesplIzq {Pascal N-1}} {DesplDer {Pascal N-1}}}endendAdemas de denir Pascal, declaramos las variables para las tres funciones auxiliaresquefaltadenir.LasfuncionesauxiliaresPara resolver completamente el problema, todava tenemos que denir tresfunciones: DesplIzq, lacual realizael desplazamientodeunaposici onhacialaizquierda, DesplDer, lacual realizael desplazamientode unaposici onhacialaderecha,y SumListas,lacualsumadoslistas.Estasson DesplIzqy DesplDer:fun {DesplIzq L}case L of H|T thenH|{DesplIzq T}else [0] endendfun {DesplDer L} 0|L endDesplDer simplementea nadeunceroalaizquierda. DesplIzqrecorre Lelementopor elemento y construye la salida elemento por elemento. Hemos agregado un elsealainstruccioncase. Estoessimilaraunelseenunif: seejecutasi el patr ondel case no concuerda. Es decir, cuando L est a vaca, entonces la salida es [0], i.e.,unalistaquesolocontienealcero.Estaes SumListas:fun {SumListas L1 L2}case L1 of H1|T1 thencase L2 of H2|T2 thenH1+H2|{SumListas T1 T2}endelse nil endendEsta es la funci on mas complicada que hemos visto hasta ahora. Utiliza dosinstruccionescase,unadentrodelaotra,debidoaquetenemosquedescomponerdos listas, L1y L2. Ahoratenemos completaladenici onde Pascal. Podemoscalcularcualquierladel tri angulodePascal.Porejemplo, invocar {Pascal 20}devuelvelavigesima la:Draft1.6 Correccion 9[1 19 171 969 3876 11628 27132 50388 75582 9237892378 75582 50388 27132 11628 3876 969 171 19 1]Esta respuesta es correcta? Como se puede asegurar? Parece correcta: es simetrica(invertirlalistaproducelamismalista)yelprimeroyel segundoargumentoson1y19,locual escorrecto.Al mirarlagura1.2, esfacil observarqueel segundoelementodelanesimalasiempresesn 1(siempreesunomasqueel delalapreviayempiezaenceroparalaprimerala).Enlaproximasecci on,veremosc omorazonar sobrecorreccion.DesarrollodesoftwaredearribaaabajoResumamoslametodologa queusamosparaescribir Pascal:Elprimerpasoconsisteenentenderc omorealizar elc alculoamano.El segundo paso consiste en escribir una funci on principal para resolver elproblema,suponiendolaexistenciadealgunasfuncionesauxiliares(enestecaso,DesplIzq, DesplDer,y SumListas).El tercer paso consiste en completar la solucion escribiendo las funciones auxilia-res.Lametodologaconsistenteenescribirprimerolafunci onprincipal yrellenarlosblancosdespuesseconocecomometodologadedesarrollodearribaaabajo.5Esunodelosenfoquesmasconocidosparael dise nodeprogramas, peroesoessolounapartedelahistoriacomoloveremosmasadelante.1.6. Correcci onUn programa es correcto si hace lo que nos gustara que hiciera. Como podemosdecir si un programa es correcto? Normalmente es imposible duplicar los c alculos delprograma a mano. Necesitamos otras maneras. Una manera simple, lacual usamosanteriormente, consiste en vericar que el programa es correcto para las salidas queconocemos.Estoincrementanuestraconanzaenelprograma.Peronollegamuylejos. Para probar la correccion, en general, tenemos que razonar sobre el programa.Estosignicatrescosas:Necesitamosunmodelomatematicodelasoperacionesdel lenguajedeprogra-maci on, que dena que hacen ellas. Este modelo se llama la semantica del lenguaje.Necesitamos denir que quisieramos que el programa hiciera. Normalmente, estoesunarelacci onmatematicaentrelasentradasconquesealimentar aelprogramaylassalidas queelprograma calcula.Esto sellamalaespecicaci ondelprograma.Usamos tecnicas matematicas para razonar sobre el programa, utilizando la5. Notadeltraductor:top-down, eningles.Draft10 Introduccionalosconceptosdeprogramacionsemantica.Queremosdemostrarqueelprograma satisfacelaespecicaci on.Aunquese haya demostrado queun programa escorrecto, este puedea un producirresultados incorrectos, si el sistema sobre el cual corre no est a correctamenteimplementado. Como podemos tener conanza en que el sistema satisface lasemantica?Vericar estoes unagranempresa: signicavericarel compilador,el sistemaentiempodeejecuci on, el sistemaoperativo, el hardware, ylafsicasobre laquesebasaelhardware!Todasestas sontareasimportantes perovanmasall adel alcancedeestelibro. ColocamosnuestraconanzaenlosdesarrolladoresdeMozart,lascompa nas desoftware,losfabricantesdehardware,ylosfsicos.6Inducci onmatem aticaUnatecnicamuy util eslainducci onmatematica. Estaconsisteendosestapas.Primeromostramosqueel programaescorrectoparael casomassimple. Luegomostramosquesielprogramaescorrectoparauncasodado,entoncestambienloes para el caso siguiente. Si podemos asegurarnos que todos los casos son nalmentecubiertos,entonceslainducci onmatematicanospermiteconcluirqueelprogramasiempreescorrecto.Estatecnicasepuedeaplicarparalosenterosylaslistas:Para los enteros, el caso mas simple es 0 y para un entero n dado el caso siguienteesn + 1.Para laslistas,elcasomassimplees nil(lalistavaca) ypara unalista Tdadaelcasosiguientees H|T(sincondicionessobre H).Miremosc omofuncionalainducci onparalafunci onfactorial:{Fact 0}devuelvelarespuestacorrecta,asaber,1.Supongaque {Fact N-1}es correcto. Entonces miremos lainvocacion {FactN}. Vemosquelainstruccioniftomael casoelse(pues Nnoescero), ycalculaN*{Fact N-1}. Porhipotesis, {Fact N-1}devuelvelarespuestacorrecta. Porlotanto, suponiendo quela multiplicacion es correcta, {Fact N} tambien devuelve larespuestacorrecta.Este razonamiento utiliza la denici onmatematica de factorial, a saber, n! =n (n 1)! si n >0, y 0! =1. M as adelante en el libro veremos tecnicasde razonamientomas sosticadas. Peroel enfoque b asicoes siempre el mismo:empezarconlasemanticadel lenguajeylaespecicaci ondel problema,yusarunrazonamiento matematico para mostrar que el programa implementa correctamentelaespecicaci on.6. Algunospodrandecirqueestoesest upido. ParafraseandoaThomasJeerson, ellospodrandecirqueelpreciodelacorreccioneslavigilanciaeterna.Draft1.7 Complejidad 111.7. ComplejidadLa funci on Pascal quedenimos atr as se comporta muy lentamentesi tratamosdecalcularlasdemayornumeraci onenel tri angulo.Calcularlala20tomaunsegundoodos.Lala30tomavariosminutos.7Siloensaya,esperepacientementeel resultado. PorQuesetomatodoestetiempodemas?Miremos denuevolafunci on Pascal:fun {Pascal N}if N==1 then [1]else{SumListas {DesplIzq {Pascal N-1}} {DesplDer {Pascal N-1}}}endendInvocar {Pascal N}invocar a,asuvez, dosvecesa {Pascal N-1}. Porlotanto,invocar {Pascal 30} invocar a {Pascal 29} dos veces, llevando a cuatro invocacio-nes de {Pascal 28}, ocho de {Pascal 27}, y as sucesivamente doblando el n ume-rodeinvocacionesporcadalainferior. Estollevaa229invocacionesa {Pascal1}, lo cual es aproximadamente un billon. No debe sorprender entonces que calcular{Pascal 30} sea lento. Podemos acelerarlo? S, existe una forma sencilla: invocarsolo una vez a {Pascal N-1} en lugar de hacerlo dos veces. La segunda invocacionproduceelmismoresultadoquelaprimera.Sitansolorecord aramos elprimerre-sultado, unainvocacionserasuciente. Podemosrecordarlousandounavariablelocal. Presentamos la nueva funci on, PascalRapido, la cual usa una variable local:fun {PascalRapido N}if N==1 then [1]else L inL={PascalRapido N-1}{SumListas {DesplIzq L} {DesplDer L}}endendDeclaramos la variable local L agregando L in en la parte else. Esto es lo mismoqueusardeclare,salvoqueel identicadorsolopuedeserusadoentreel elseyel end. Ligamos Lal resultadode {PascalRapido N-1}. Ahorapodemosusar Ldondelonecesitemos.Cuanr apida es PascalRapido? Ensayemosla calculando lala30.Estotomaminutoscon Pascal,peroserealizacasiqueinstant aneamentecon PascalRapido. Una lecci on que podemos aprender de este ejemplo es que usarunbuenalgoritmoesmasimportantequetenerel mejorcompiladorposibleolamaquinamasr apida.7. Estostiemposvaranseg unlavelocidaddesumaquina.Draft12 IntroduccionalosconceptosdeprogramacionGarantasenel tiempodeejecuci onComo lo muestra este ejemplo, es importante saber algosobre el tiempo deejecuci onde unprograma. Conocer el tiempo exactoes menos importante quesaber que el tiempo no se ampliar a exageradamente con un incremento en el tama nodelaentrada. El tiempodeejecuci ondeunprogramamedidocomounafunci ondeltama nodelaentrada,modulounfactorconstante,sellamalacomplejidadentiempodelprograma. Cu alsealaformadeestafunci on,dependedec omosemideel tama nodelaentrada. Suponemosqueestesemidedeformaquetienesentidoparalamaneraenqueel programaseusa. Porejemplo, tomamoscomotama nodelaentradade {Pascal N}simplementeel entero N(yno, e.g., lacantidaddememoriaquesenecesitaparaalmacenar N).Lacomplejidadentiempode {Pascal N}es proporcional a2n. Estoes unafunci on exponencial en n, la cual crece muy r apidamente a medida que n seincrementa. Cual es la complejidad en tiempo de {PascalRapido N}? Se realizanninvocacionesrecursivasycadaunadeellastomatiempoproporcioanl an. Lacomplejidad en tiempo es, por tanto, proporcional a n2. Esta es una funci onpolinomial ennque crece a una velocidadmucho mas lenta que una funci onexponencial. Losprogramascuyacomplejidadentiempoesexponencial sonpocopracticos salvo para entradas de tama no peque no. Los programas cuya complejidadentiemposonpolinomiosdebajoordensonpracticos.1.8. EvaluacionperezosaLas funciones que hemos escrito hasta ahora realizan sus c alculos tan pronto comosoninvocadas.Aestoselellamaevaluaci onansiosa.Existeotraformadeevaluarfuncionesllamadaevaluaci onperezosa.8Enlaevaluaci onperezosa, soloserealizaun c alculo cuando su resultado se necesita. Este tema se cubre en el captulo 4 (versecci on 4.5). A continuaci on presentamos una funci on perezosa, sencilla, que calculaunalistadeenteros:fun lazy {Ents N}N|{Ents N+1}endInvocar {Ents 0}calculalalistainnita 0|1|2|3|4|5|....Estopareceuncicloinnito,peronoloes.Laanotacion lazyaseguraquelafunci ons oloseaevaluadacuandosenecesite.Estaesunadelasventajasdelaevaluaci onperzosa:podemoscalcularconestructurasdedatospotencialmenteinnitassincondicionalgunadelmitedeciclos.Porejemplo:L={Ents 0}{Browse L}8. Laevaluacionansiosaylaperezosaalgunasvecessonllamadasevaluaciondirigidaporlosdatosyevaluaciondirigidaporlademada,respectivamente.Draft1.8 Evaluacionperezosa 13Estomuestralosiguiente,i.e.,absolutamentenadasobreloselementosde L:L(El browser nohace que las funciones perezosas seanevaluadas.) Laanotacion signica que Lest a ligada a unafunci on perezosa. Si se necesita alg unelementode L, entoncesesafunci onseinvocar aautom aticamente. Aqu podemosverunc alculoquenecesitaunelementode L:{Browse L.1}Estomuestraelprimerelementode L,asaber,0.Podemosrealizar c alculosconlalistacomosiestuvieracompletamentecalculada:case L of A|B|C|_ then {Browse A+B+C} endEsto obliga a que se calculen los primeros tres elementos de L y ni uno mas. Que semuestraenelbrowser?C alculoperezosodel tri angulodePascalRealicemosalgo util usandoevaluaci onperezosa.Nosgustaraescribirunafun-cionquecalculetantas las del tri angulodePascal comosenecesiten, perosinconocerdeantemanocu antas. Esdecir, tenemosquemirarlaslasparadecidircu ando,lasquehay,sonsucientes.Acontinuaci on,unafunci onperezosaquege-neraunalistainnitadelas:fun lazy {ListaPascal Fila}Fila|{ListaPascal{SumListas {DesplIzq Fila} {DesplDer Fila}}}endInvocar estafunci onymirarelresultadonomostrara nada:declareL={ListaPascal [1]}{Browse L}(El argumento [1]eslaprimeraladel tri angulo)Paramostrarmasresultados,laslasdebennecesitarse:{Browse L.1}{Browse L.2.1}Estomuestralaprimeraylasegundalas.Enlugardeescribirunafunci onperezosa, podramosescribirunafunci onquetoma N, el n umerodelas quenecesitamos, ycalculadirectamenteestas las apartirdeunalainicial:Draft14 Introduccionalosconceptosdeprogramacionfun {ListaPascal2 N Fila}if N==1 then [Fila]elseFila|{ListaPascal2 N-1{SumListas {DesplIzq Fila} {DesplDer Fila}}}endendPodemosmostrar10las invocando {Browse {ListaPascal2 10 [1]}}. Peroque pasasimastardedecidimosquesenecesitan11las? Tendramos queinvocardenuevo ListaPascal2, conargumento11.Esto realizara denuevo eltrabajo dedenir las primeras 10 las. La versi on perezosa evita la repetici on deeste trabajo.Siemprequedalistaparacontinuardondequed o.1.9. ProgramaciondealtoordenHemos escrito una funci on eciente, PascalRapido, que calcula las del tri angulode Pascal. Ahora nos gustara experimentar con variaciones del tri angulo de Pascal.Por ejemplo, en lugar de sumar los n umeros de las listas para calcular cada la, nosgustararestarlos, oaplicarlesel o-exclusivo(calcularsolosi losdosn umerossonpares o impares a la vez), o muchas otras alternativas. Una manera de hacer esto esescribir una nueva versi on de PascalRapido para cada variacion. Pero esto se vuelvepesado muy r apidamente. Es posible tener una sola versi on que se pueda usar paratodas las variaciones? De hecho, es posible. LLamemosla PascalGenerico. Siempreque lainvoquemos, pasamos la funci onadecuada ala variacion (suma,o-exclusivo,etc.) como argumento. La capacidad de pasar funciones como argumentos se conocecomoprogramacion dealtoorden.Acontinuaci onsepresentaladenici onde PascalGenerico. Estacuentaconunargumentoadicional Opquecontienelafunci onquecalculacadan umero:fun {PascalGenerico Op N}if N==1 then [1]else L inL={PascalGenerico Op N-1}{OpListas Op {DesplIzq L} {DesplDer L}}endendSumListas se reemplaza por OpListas. El argumento adicional Op se pasa aOpListas. DesplIzq y DesplDer no necesitan conocer Op, de manera que podemosusarlasversionesexistentes.Ladenici onde OpListases:fun {OpListas Op L1 L2}case L1 of H1|T1 thencase L2 of H2|T2 then{Op H1 H2}|{OpListas Op T1 T2}endelse nil endendDraft1.9 Programaciondealtoorden 15Enlugarderealizarlasuma H1+H2,estaversi onrealiza {Op H1 H2}.Variacionessobreel tri angulodePascalDenamos algunas funciones para ensayar PascalGenerico. Para lograr eltri angulodePascal original,podemosdenirlafunci ondeadici on:fun {Sum X Y} X+Y endAhorapodemos correr {PascalGenerico Sum 5}.9Estocalculalaquintalaex actamente como antes. Podemos denir PascalRapido utilizando PascalGenerico:fun {PascalRapido N} {PascalGenerico Sum N} endDenamosotrafunci on:fun {Xor X Y} if X==Y then 0 else 1 end endEstorealizaunaoperaci ondeoexclusivo,lacualsedeneacontinuaci on:X Y {Xor X Y}0 0 00 1 11 0 11 1 0El o-exclusivonospermitecalcularlaparidaddecadan umeroenel tri angulodePascal, i.e., si el n umeroesparoimpar. Losn umeros, comotal, nosecalculan.Invocar {PascalGenerico Xor N}dacomoresultado:11 11 0 11 1 1 11 0 0 0 11 1 0 0 1 1. . . . . . . . . . . . .Algunasotrasfuncionessedejancomoejercicio.1.10. Concurrencia9. Tambienpodemoscorrer {PascalGenerico Number.+ 5},pueslaoperaciondeadicion+hacepartedel modulo Number. Perolosmodulosnoseintroducenenestecaptulo.Draft16 IntroduccionalosconceptosdeprogramacionNos gustaraquenuestroprogramatuvieravarias actividades independientes,cadaunadelascualesseejecuteasupropioritmo. Estosellamaconcurrencia.Nodeberaexistirinterferenciaentrelaactividades, amenosqueel programadordecidaquenecesitancomunicarse. As escomoel mundoreal funcionaafueradelsistema.Nosgustara poderhacerestodentrodelsistematambien.Introducimos la concurrencia por medio de la creacionde hilos. Un hilo essimplemente un programa en ejecuci on como las funciones que vimos anteriormente.Ladiferenciaesqueunprogramapuedetenermasdeunhilo. Loshilossecreanconla instruccionthread. Recuerda como erade lenta la versi onoriginal dePascal?Podemosinvocar Pascaldentrodesupropiohilo. Estosignicaquenoimpedira que otros c alculos contin uen realizandose. Pueden desacelerarse, si Pascaltiene realmente mucho trabajo por hacer. Esto se debe a que los hilos comparten elmismocomputadorsubyacente.Peroningunodeloshilossedetendr a.Heaquunejemplo:thread P inP={Pascal 30}{Browse P}end{Browse 99*99}Estocreaunhilo nuevo. Dentro de este hilo, invocamos {Pascal 30}yluegoinvocamos Browseparamostrarel resultado. El hilonuevotienemuchotrabajoporhacer.Peroestonoleimpidemostrar 99*99inmediatamente.1.11. FlujodedatosQuepasasi unaoperaci ontratadeusarunavariablequenoesteligadaa un?Desdeunpuntodevistapuramenteestetico, seramuyagradablesi laoperaci onsimplementeesperara. Tal vezotrohiloliguelavariable, yentonceslaoperaci onpueda continuar. Este comportamiento civilizado se conoce como ujo de datos. Lagura1.3muestraunejemplosencillo: lasdosmultiplicacionesesperanhastaquesusargumentosestenligadosylasumaesperahastaquelas multiplicacionessecompleten.Comoveremosmasadelanteenellibro,haymuybuenasrazonesparateneraccesoauncomportamientoporujodedatos.Porahoramiremosc omoelujodedatosylaconcurrencia trabajanjuntos.Consideremos,e.g.:declare X inthread {Delay 10000} X=99 end{Browse inicio} {Browse X*X}Lamultiplicacion X*Xesperahastaque Xsealigada. El primer Browsemuestrademanerainmediata inicio. El segundo Browseesperapor el resultadodelamultiplicacion, de manera que no muestra nada todava. El {Delay 10000} invocaunapausapor10000ms(i.e., 10segundos). Xesligadas olodespuesdel retrasoinvocado. Una vez X se liga, la multiplicacion contin ua y el segundo browse muestra9801. Lasdosoperaciones X=99y X*XsepuedenrealizarencualquierordenconDraft1.12 Estadoexplcito 17X Y Z U* *+Figura1.3:Unejemplosencillodeejecucionporujodedatos.cualquier tipo de retraso; la ejecuci on por ujo de datos siempre producira el mismoresultado. El unico efecto que puede tener un retraso es que las cosas vayan despacio.Porejemplo:declare X inthread {Browse inicio} {Browse X*X} end{Delay 10000} X=99Esto se comporta ex actamente igual que antes: el browser muestra 9801 despues de10segundos. Estoilustradospropiedadesagradablesdel ujodedatos. Primero,los c alculos funcionan correctamente independientemente de c omo se han repartidoentrelos hilos. Segundo, los c alculos sonpacientes: nose nalanerrores, sinoquesimplementeesperan.Agregar hilos y retrasos a un programa puede cambiar radicalmente la aparienciade unprograma. Perosiempre que las operaciones se invoquenconlos mismosargumentos, los resultados del programa no cambian para nada. Esta es la propiedadclavedelaconcurrenciapor ujodedatos yes laraz onpor laquepresentalamayora delasventajasdelaconcurrenciasinlascomplejidadesquenormalmenteseleasociana esta.Laconcurrencia porujodedatossecubreenelcaptulo4.1.12. EstadoexplcitoComopodemos lograrqueunafunci onaprendadesupasado?Es decir, nosgustaraque la funci ontuviera alg untipo de memoriainterna que la ayude arealizar sutarea. La memoriase necesita enfunciones que puedencambiar sucomportamientoyaprenderdesupasado. Estetipodememoriasellamaestadoexplcito. Delamismamaneraquelaconcurrencia, el estadoexplctomodelaunaspecto esencial de la manera como el mundo real funciona. Nos gustara ser capacesdehacerestoenelsistematambien.M asadelanteenellibroveremos razones masprofundasparatenerestadoexplcito(vercaptulo6). Porahora, miremosc omofunciona.Porejemplo, quisieramosvercu anseguidoseutilizalafunci on PascalRapido.Hayalgunamaneraparaque PascalRapidopuedarecordar cu antas veces fueDraft18 Introduccionalosconceptosdeprogramacioninvocada? Podemoshacerloa nadiendoestadoexplcito.UnaceldadememoriaHay muchas maneras de denir estado explcito. La manera m as simple esdenirunaceldasencilladememoria. Estoescomounacajaenlacual sepuedeguardar cualquier contenido. Muchos lenguajes de programacionllamana estounavariable.Nosotroslollamamosunaceldaparaevitarconfusionesconlasvariablesqueusamosantes,lascualessonmasparecidasavariablesmatematicas,i.e., no mas que abreviaciones para valores. Hay tres funciones sobre celdas: NewCellcreaunaceldanueva, :=(asignacion) colocaunvalor nuevoenunacelda, y @(acceso)tomael valoractualmentealmacenadoenlacelda. Accesoyasignaci ontambiensellamanleeryescribir.Porejemplo:declareC={NewCell 0}C:=@C+1{Browse @C}Esto crea una celda C con contenido inicial 0, agrega uno al contenido, y lo muestra.Agregandomemoriaa PascalRapidoConunaceldadememoria, podemoslograrque PascalRapidocuentecu antasveces es invocada. Primerocreamos unaceldaexternaa PascalRapido. Luego,dentrode PascalRapido,agregamos 1alcontendidodelacelda.Elresultadoes:declareC={NewCell 0}fun {PascalRapido N}C:=@C+1{PascalGenerico Sum N}end(Para mantenerlocorto,estadenici onutiliza PascalGenerico.)1.13. ObjetosUnafunci onconmemoriainternasellamanormalmenteunobjeto. Laversi onextendidade PascalRapidoque denimos enlasecci onanterior es unobjeto.Resulta que los objetos son unos animales muy utiles. Presentamos otro ejemplo.Denimosunobjetocontador. Elcontador tieneunaceldaquemantienelacuentaactual. El contadortienedosoperaciones, Incry Leer, lascualesllamaremossuinterfaz. Incr agrega 1 a la cuenta y luego devuelve el valor resultante de la cuenta.Leersolodevuelveelvalordelacuenta.Ladenici ones:Draft1.14 Clases 19declarelocal C inC={NewCell 0}fun {Incr}C:=@C+1@Cendfun {Leer}@CendendLadeclaracionlocaldeclaraunavariable nueva Cque es visible solohastaelendcorrespondiente. Hayalgoespecial pararesaltar: laceldase referenciaconunavariablelocaldemaneraquequedacompletamenteinvisibledesdeelexterior.Estosellamaencapsulaci on.Laencapsulaci onimplicaquelosusuariosnopuedenmeterseconlointernodel contador. Podemosgarantizarqueel contadorsiemprefuncionaracorrectamentesinimportar c omose utiliza. EstonoeraciertoparaPascalRapidoextendidodebidoaquecualquierapodraconsultarymodicarlacelda.Por lo tanto, siempre que la interfaz del objeto contador sea la misma, el programausuario no necesita conocer la implementacion. Separar la interfaz de la implemen-tacioneslaesenciadelaabstracciondedatos. Estapuedesimplicarbastanteelprograma usuario.Unprograma queutilizauncontadorfuncionaracorrectamentepara cualquier implementacion siempre que la interfaz sea la misma. Esta propiedadsellamapolimorsmo. Laabstracciondedatosconencapsulaci onypolimorsmosecubreenelcaptulo6(versecci on6.4).Podemoshacercrecerelcontador:{Browse {Incr}}{Browse {Incr}}Quemuestraesto? Incrsepuedeusarencualquierparteenunprogramaparacontarcu antasvecespasaalgo.Porejemplo, PascalRapido podrausar Incr:declarefun {PascalRapido N}{Browse {Incr}}{PascalGenerico Sum N}end1.14. ClasesEnla ultimasecci onsedeni ounobjetocontador. Quepasasi necesitamosmas de un contador? Sera agradable tener una f abrica que pueda fabricar tantoscontadores como necesitemos. Tal fabrica se llama una clase. Una forma de denirlaes:Draft20 Introduccionalosconceptosdeprogramaciondeclarefun {ContadorNuevo}C Incr Leer inC={NewCell 0}fun {Incr}C:=@C+1@Cendfun {Leer}@Cendcontador(incr:Incr leer:Leer)endContadorNuevo es una funci on que crea una celda nueva y devuelve nuevas funcio-nes Incry Leerqueutilizanesacelda. Crearfuncionesquedevuelvenfuncionescomoresultadoesotraformadeprogramacion dealtoorden.Agrupamos las funciones Incr y Leer juntas dentro de un registro, el cual es unaestructuradedatoscompuestaquepermitefacil accesoasuspartes. El registrocontador(incr:Incr leer:Leer) se caracteriza por suetiqueta contador yporsusdoscampos,llamados incry leer.Creemosdoscontadores:declareCtr1={ContadorNuevo}Ctr2={ContadorNuevo}Cada contador tiene su memoria interna propia y sus funciones Incr y Leer propias.Podemosaccederaestasfuncionesutilizandoeloperador.(punto). Ctr1.incraccedealafunci on Incrdel primercontador.Hagamoscrecerel primercontadorymostremossuresultado:{Browse {Ctr1.incr}}Hacialaprogramaci onorientadaaobjetosHemos presentado un ejemplo de clase sencilla, ContadorNuevo, que denedos operaciones, Incry Leer. Las operacionesdenidas dentrodelas clases sellaman metodos. La clase puede ser usada para crear tantos objetos contador comonecesitemos. Todosestosobjetoscompartenlosmismosmetodos, perocadaunotiene su memoria interna propia por separado. La programacion con clases y objetossellamaprogramacion basadaenobjetos.A nadirunaideanueva, laherencia, alaprogramacionbasadaenobjetosllevaalaprogramacionorientadaaobjetos. Laherenciasignicaquesepuededenirunaclasenuevaenterminosdeclasesyaexistentesespecicandosolamentequeeslodiferentede laclasenueva. Por ejemplo, supongamos quetenemos unaclasecontadorquesolotieneel metodo Incr. Podemosdenir unaclasenueva, igualque la primera clase salvo que le agrega a ella el metodo Leer. Decimos quelaclasenuevaheredadelaprimeraclase. Laherenciaes unconceptopoderosopara estructurarprogramas. Permitequeunaclaseseadenidaincrementalmente,Draft1.15 No-determinismoytiempo 21C={NewCell 0} C:=2 C:=1C={NewCell 0} C:=1 C:=2El contenido final de C es 1El contenido final de C es 2Primera ejecucin:Segunda ejecucin:tiempoFigura1.4:Todaslasejecucionesposiblesdelprimerejemplono-determinstico.endiferentes partes del programa. Laherenciaes unconceptodelicadodeusarcorrectamente. Paraquelaherenciaseafacil deusar, loslenguajesorientadosaobjetosagregansintaxisespecial.Elcaptulo7cubrelaprogramacionorientadaaobjetosymuestrac omoprogramar conherencia.1.15. No-determinismoytiempoHemos visto c omo agregar, separadamente, concurrencia y estado a un programa.Quepasacuandounprogramatieneambas?Resultaquetenerambasal mismotiempo es unasuntodelicado, pues el mismo programapuede tener resultadosdiferentesentreunayotraejecuci on.Estosedebeaqueel ordenenqueloshilostienenacceso al estado puedecambiar de unaejecuci on a la otra. Esta variabilidadsellamano-determinismo.Elno-determinismoexistedebidoalaimposibilidaddedeterminar el momento exacto del tiempo en el cual una operaci on b asica se ejecuta.Si conocieramos ese momento exacto