curso de cpp

128
Curso de cPP Resumen de Contenido http://www.zator.com/Cpp/E_Cr.htm Prólogo o Resumen de Contenido (esta página) o Índice o Convenciones y notación 0 Introducción o 0.1 El Ordenador Electrónico Digital o 0.2 El Sistema Operativo o 0.3 El Hardware 1 Programación C++ o 1.1 Introducción a la POO o 1.2 El lenguaje C++ o 1.3 Estructura de un programa o 1.4 Proceso de creación de un programa o 1.5 Secuencia de ejecución o 1.6 Tratamiento de excepciones o 1.7 Programación actual o 1.8 Estructura de la información 2 Variables o 2.1 Atributos o 2.2 Tipos de datos 3 Elementos léxicos o 3.1 Comentarios o 3.2 Tokens 4 Estructura del lenguaje o 4.1 Declaraciones o 4.2 Punteros o 4.3 Matrices o 4.4 Funciones o 4.5 Estructuras o 4.6 Campos de bits o 4.7 Uniones o 4.8 Enumeraciones

Upload: gerardo-luis-coss-hilaquita

Post on 24-Jul-2015

80 views

Category:

Documents


5 download

TRANSCRIPT

Curso de cPP Resumen de Contenidohttp://www.zator.com/Cpp/E_Cr.htm Prlogo o o o o o o o o o o o o o o o o o o o o o o o o o o o o o Resumen de Contenido (esta pgina) ndice Convenciones y notacin 0.1 El Ordenador Electrnico Digital 0.2 El Sistema Operativo 0.3 El Hardware 1.1 Introduccin a la POO 1.2 El lenguaje C++ 1.3 Estructura de un programa 1.4 Proceso de creacin de un programa 1.5 Secuencia de ejecucin 1.6 Tratamiento de excepciones 1.7 Programacin actual 1.8 Estructura de la informacin 2.1 Atributos 2.2 Tipos de datos 3.1 Comentarios 3.2 Tokens 4.1 Declaraciones 4.2 Punteros 4.3 Matrices 4.4 Funciones 4.5 Estructuras 4.6 Campos de bits 4.7 Uniones 4.8 Enumeraciones 4.9 Operadores 4.10 Sentencias 4.11 Clases

0 Introduccin

1 Programacin C++

2 Variables

3 Elementos lxicos

4 Estructura del lenguaje

o o o o o o o

4.12 Plantillas 4.13 Tecnicismos 5.1 STL 5.2 Internacionalizacin 5.3 Entradas/salidas 5.5 Librera clsica 6.1 Reglas de lectura

5. Librera Estndar

6 Apndices 7. Bibliografa 9. Librera de ejemplos

A modo de prlogo"... Creo que sera tan extravagante actuar decentemente en poltica que podra llegar a ser rentable. Y si no lo fuera, al menos nos respetaramos a nosotros mismos. Que no es poco". Antonio Robles en "Ciudadanos de Catalua y VidalQuadras" [7]. Artculo aparecido en el peridico on-line Libertad Digital

Todo esto puedes saltrtelo, se trata solo de justificarme a m mismo... Ms que "curso", tal vez deberamos decir apuntes, chuleta, traduccin o chapuza (para los ms exigentes). En principio son, mejor debera decir "nacieron", simplemente como unos apuntes personales para ponerme al da; para refrescar los conocimientos sobre C/C++, que tena bastante oxidados, pues los nicos pinitos al respecto que haba en mi "Currculum" fueron lo sucinto para hacer un pequesimo programa que leyera y escribiera en determinadas posiciones de memoria en un PC bajo MS-DOS; se trataba entonces de controlar una tarjeta de adquisicin analgico-digital especfica. La herramienta fue el compilador C 5.1 de Microsoft que an conservo. Ahora, unos 15 aos ms tarde, me veo en la necesidad de volver a utilizar el C; mientras tanto he odo, ledo y utilizado algo la programacin orientada a objetos, de forma que me pareca lo natural hacerlo en C++, as que lanza en ristre como D. Quijote, descargo el magnfico compilador C++ Builder de Borland-Imprise (que es gratis total), saco los viejos libros de C, y sobre todo, me bajo todas las ayudas que hay sobre el tema en el "site" de Borland. Adems, aunque conservo un librito de un tal Bjarne Stroustrup: "The C++ programming language", que vena de regalo con un compilador que compr entonces (1989): "Zortech C++ Compiler" (con el que confieso que no llegu a hacer gran cosa) y del que ahora me entero que el tal Stroustrup, adems de tener un nombre impronunciable, es nada menos que el inventor del C++. Bueno, a lo que iba: me pareca que el librito era poca cosa, as que encargo el nuevo y actualizado; un "tocho" de ms de mil pginas, que cuesta un @ y que es el no va ms sobre el tema [1]. Adems descargo algunas cosas que encuentro por ah sobre C++ que me parecen interesantes, algunas de las cuales encontrareis en el captulo de bibliografa (perdn si se me olvida citar alguna).

La primera sorpresa que me encuentro, al empezar a hincarle el diente a todo mi flamante bagaje informativo, es que aunque el viejo C de K&R [3] sigue estando bajo la piel del nuevo C++, el lenguaje ha evolucionado. Hace poco, mi hermano que es precisamente profesor de informtica, me dijo que el C era un lenguaje muy pequeo y fcil "Ni siguiera las E/S forman parte de l"; puede que eso sea verdad, creo que s [4]. Pero de lo que no me cabe duda, es que pertenezcan o no las rutinas de E/S al propio lenguaje (al fin y al cabo, salvo que hagamos un programa "autista", tendremos que utilizarlas), el pequeo beb ha crecido hasta convertirse en el monstruo que es ahora. Miro los ejemplos y ni siquiera entiendo la notacin... Lo que pensaba que sera un paseo militar, empieza a convertirse en algo a lo que tengo que dedicar muchas (muchsimas) horas, as que decido pasar muy despacito desde el principio hasta el final, y no se me ocurre mejor manera que ir haciendo mi propio libro de C++ por el sistema de ir cortando, pegando y traduciendo los diversos captulos del manual de ayuda "C++ Builder Languaje Guide" [2]. En algunos puntos voy incluyendo mis propias explicaciones o entresacados de otros textos que me parecen reveladores. Adems de enterarme, lo que pretendo es llegar a tener un texto donde yo mismo pueda encontrar lo que quiero sin que ocurra lo de siempre: "Lo he ledo en algn sitio pero no recuerdo donde...", con todos los ndices, tablas y referencias cruzadas que estime convenientes; como veris estoy describiendo mi propio mtodo de estudio cuando algo me interesa. El siguiente paso es bastante obvio: Porqu no ponerlo en la Red por si puede servirle a alguien ms?. Ya se que en la red hay mucho y bueno, pero casi todo en ingls; adems, pienso que si algn estudiante o programador hispano-hablante saca de aqu, aunque solo sea una idea o un concepto, habr cumplido su cometido. Dicho todo esto, solo me queda volver a advertiros que no se trata del docto trabajo de un sper experto en el tema. Se trata simplemente del trabajo de un programador "patatero" (que ha pelado muchsimas patatas) [5]. Si hay algn error es porque yo mismo no lo tengo claro, y por supuesto os agradecera cualquier puntualizacin, crtica o aportacin al respecto. Entiendo que a ms de uno le parezca un atrevimiento hacer unos apuntes, traduccin, etc sobre C++ admitiendo el propio desconocimiento; lleva razn, es atrevido, por eso he intentado explicaros el origen y la intencin. Adems, a fin de cuentas se ven por ah cosas peores; conozco a uno que ha puesto en su pgina personal el "careto" de su perro... Nada ms. Que sea leve!. Antes de despedirme, solo contaros un pequeo chiste que circula por las escuelas de informtica. Viene a decir que Stroustrup se mostr muy extraado del xito de su C++, y que en "petit comit" haba reconocido que lo nico que pretendi era que le subieran el sueldo a los programadores de los laboratorios de AT&T, y que lamentaba que algunas empresas hubieran ido a la bancarrota intentando pasar sus programas a C++...[6] Greetings (que dicen los Yanquis) Adolfo J. Milln Comienzo: Cdiz (Espaa), Agosto 2.000 Inicio.

[1] Casi todo el mundo est de acuerdo en que no es un libro para estudiar C++, sino la suprema referencia, "La Biblia" del C++, y que para entenderlo es imprescindible haber estudiado C++ previamente ("To read this book, you will need tons of C++ & OOP knowledge, even if you are an ace C programmer"). Ms datos sobre este libro en la Bibliografa ( comentarios sobre el mismo en Amazon ( www.amazon.com). Stroustrp 2000), extensos

[2] As pues, los derechos de autor corresponden principalmente a Borland-Imprise, pues originalmente se trata de una traduccin "No autorizada" de dicho manual. Espero que no me demanden por ello; el resto del copyright y los errores son mos. [3] K&R. Siglas con que se conoce a Brian W. Kernighan y Dennis M. Ritchie, creadores del lenguaje C. [4] Kernighan y Ritchie parece que tambin estn de acuerdo: "El lenguaje C no es grande y no le est bien un gran libro".... "Puesto que C es relativamente pequeo, se puede describir en un pequeo espacio y aprender con rapidez. En verdad, un programador puede razonablemente esperar conocer, entender y utilizar la totalidad del lenguaje" ( [5] Bueno... tambin tengo mi culturilla universitaria. [6] Mucho tiempo despus de escribir este prlogo, un amable lector me envi un divertidsimo email con una versin apcrifa del chiste aludido. Est en forma de una supuesta entrevista con Stroustrup, en la que este explica las razones de la invencin del lenguaje. Incluyo su trascripcin literal ( 0.Pw1) para que el lector tenga una idea aproximada de lo que le espera :-)) K&R).

[7] S. Ya se que no tiene nada que ver con el C++ o con la Informtica, as que perdonadme. Es que acabo de leerlo y me ha parecido tan hermoso que no he podido resistir la tentacin de ponerlo en algn sitio (que no solo de pan vive El Hombre!!).

1 Convenciones y notacin

Las notas a pi de pgina se han sealado con numeracin arbiga entre corchetes con un hipervnculo al lugar de la cita [1]. Las palabras clave y los identificadores que tienen un sentido especfico en C++, se han sealado en negrita y color negro. Por ejemplo: "auto, extern y register no son permitidos, s en cambio

static"Cuando queremos destacar alguna palabra, smbolo o frase, utilizamos cuatro sistemas: resaltar el fondo; en negrita color azul, o simplemente en color rojo. Cuando queremos resaltar una idea (prrafo) utilizamos una lmpara .

Para los textos de ejemplos y explicaciones, tal como se escribiran en el cdigo fuente, se ha utilizado el tipo courier de espacio fijo con un fondo distinto y un sangrado a la izquierda Cuando va dentro de una frase de texto normal como aqu, adems del cambio de tipo y el fondo, se ha utilizado un color negro para resaltar la diferencia.

2 ReferenciasA lo largo del texto existen innumerables referencias a otros epgrafes, con sus correspondientes hipervnculos, donde se comenta un concepto relacionado. El hipervnculo est entre parntesis con un pequeo icono ( o ). Por ejemplo: "La coma se usa tambin como un operador en las expresiones con coma ( 4.10.5)". En estos casos, y indican que se trata de una referencia en esta misma publicacin. Cuando el asunto referenciado est en una posicin anterior o posterior de la misma pgina, se utilizan los iconos y respectivamente. y hacen subir

Estas referencias estn siempre asociadas a los correspondientes hipervnculos.

y bajar en la misma pgina. El smbolo conduce a la pgina correspondiente, mientras que indica que se abrir una ventana auxiliar mostrando el asunto sealado. En estos casos se trata de una nota o ejemplo complementario al contenido de la pgina actual. Cuando la referencia se refiere a un libro tradicional (en papel), como los citados en la bibliografa, el icono utilizado es un libro abierto: . Cuando se trata de un artculo, libro o publicacin disponible .

en la Web en formato electrnico, el icono es

Finalmente, cuando la referencia se refiere a un artculo de revista o publicacin peridica tradicional, el icono es un montn de hojas . Este recurso se ha intentado utilizar al mnimo, para evitar al lector la frustracin de tener una referencia quizs inaccesible.

Ejemplo:Una secuencia de declaraciones de propiedades de cualquier tipo (por ejemplo int capacidad;), incluyendo enumeraciones, campos de bits etc; as como declaracin y definicin de mtodos. Todos ellos con especificadores opcionales de acceso y de tipo de almacenamiento (auto, extern y

register no son permitidos, si en cambio static

4.11.7). Los elementos as definidos se denominan miembros de la clase; hemos dicho que son de dos tipo: propiedades de clase y mtodos de clase. Ejemplo: class vuelo { char nombre[30]; int capacidad; public: // // // // vuelo es la clase por defecto es privado capacidad es una propiedad a partir de aqu todo es pblico

char char void void }; Inicio.

origen[8]; destino[8]; despegue(&operacion}; crucero(&operacion);

// despegue es un mtodo

[1] Esto es una nota a pi de pgina. Si en ocasiones ves aparecer en el texto la nota [2] antes que la [1] no te preocupes; es que he tenido que incluir la segunda nota en una posicin anterior a la [1] que ya estaba colocada. De momento no he descubierto un sistema cmodo para renumerarlas al estilo de los procesadores de texto (FrontPage no tiene todava esta opcin).

Introduccin al C++... appalled at the monstrous messes that computer scientists can produce under the name of improvements. It is to efforts such as C++ that I here refer. These artefacts are filled with frills and features but lack coherence, simplicity, understandability and implementability. If computer scientists could see that art is at the root of the best science, such ugly creatures could never take birth. R.P.Mody "C in Education and Software Engineering", ACM SIGCSE Bulletin Vol.23 No. 3 September 1991.

1 Presentacin del lenguaje C++Con independencia de las explicaciones ms tcnicas que se incluyen en el captulo 1, digamos aqu que el lenguaje C++ es el resultado de una "larga" evolucin (informticamente hablando). Las cosas no nacieron de improviso como son ahora; se ha ido puliendo y completando a lo largo del tiempo. Adems de importar conceptos de lenguajes anteriores. Por ejemplo, de Simula67 ( 0.Iw1) y

Algol68 ( Stroustrup 1987), para lo bueno y para lo malo [1], el lenguaje C++ incorpora muchas caractersticas heredadas del C, su ancestro ms directo, el cual recoge a su vez influencias anteriores: B, BCPL ( 0.Iw2), etc. ( K&R).

Nota: es mucho lo que puede encontrarse en la red sobre los orgenes del C y sus influencias previas, pero uno de los mejores documentos, con la autoridad que le confiere ser precisamente de uno de sus creadores, es: "The development of the C language" ( Dennis M. Ritchie).

Para los que estudian C++ como una herramienta de trabajo, aunque en realidad su profesin no es la informtica, sino otra ms "cientfica", una advertencia: como todos los lenguajes de programacin (obra de los ltimos cinco segundos de la evolucin del hombre), C++ es muy "artificial", y aunque los informticos son gente bastante lgica, las cosas son as porque s. No se le puede pedir el tipo de lgica que encontramos en las Matemticas o en la Fsica por ejemplo. El resultado de todo esto es que C++ est repleto de conceptos y detalles inter-relacionados; reglas que son as por "definicin"; porque a su inventor le pareci que eran la mejor forma de hacerlas o porque vienen heredadas [3]. Cuestiones que podran quizs ser de otro modo, pero son as por

compatibilidad (con el C); otras reglas tienen sus excepciones tambin por tradicin o por herencia; etc. Para el comn de los mortales es imposible hacerse una idea exacta con una primera lectura, pues muchos conceptos solo cobran su verdadera dimensin cuando se entienden otros a los que no se ha llegado todava [1a]. Hace tiempo le sobre un personaje histrico del que decan que tena tal capacidad, que lea los libros por el sistema de ir arrancando y tirando las pginas ledas. Desde luego no es el caso del C+ +; es ms que posible que cualquier libro de C++ requiera mltiples relecturas, cada una de las cuales nos proporcionar una mejor y ms detallada perspectiva del lenguaje, de sus enormes posibilidades e incluso de los niveles de refinamiento y sofisticacin que pueden alcanzarse con l [2]. El propio inventor del lenguaje afirma al respecto: "Don't panic!. All will become clear in time" [2a]. Se me ocurre que una buena analoga seran esas imgenes Web que aparecen progresivamente y que solo se ven con nitidez cuando se ha terminado su descarga [4]. Las referencias a otros puntos hace que constantemente tengamos que saltar de un sitio a otro (por fortuna los documentos HTML y el navegador vienen que ni pintados para el caso, podemos saltar a una cita y volver inmediatamente el punto de partida con un par de clic de ratn). Est fuera de toda duda que C++ es un lenguaje difcil y spero; podramos citar al menos una decena de "lindezas" que se han dicho acerca de l (hemos incluido aqu alguna con objeto de que el estudiante sepa a que se enfrenta). Sin embargo, nuestro nimo no es disuasorio sino todo lo contrario; considere que simplemente debe dedicarle una especial atencin y esfuerzo, en la seguridad de que el lenguaje lo merece. Tengo un amigo al que le gusta decir que hay dos clases de "informticos": Los que saben C++ y los que no merecen llamarse informticos. Seguramente es exagerado, pero estoy convencido que su estudio constituye la base de la informtica actual. Su rastro puede verse por doquier, incluso en lenguajes tan de moda y actuales como Java, php o JavaScript. De forma que su conocimiento le da al estudiante no ocasional de informtica una inmejorable posicin de partida para adentrarse en otras materias. En mi opinin el estudio de C++ en las Escuelas de Informtica sera comparable al estudio de anatoma en las de Medicina. Seguramente necesitar bastantes horas para llegar a dominar C++, pero es con diferencia "El Rey" de los lenguajes de programacin. Habr merecido la pena!.

2 El C++ real y el C++ EstndarAl hablar de lenguajes no privados [5] tan universales como C++, es un Comit Internacional el que decide como es (o debe ser) el lenguaje ( E1[2]). Posteriormente los fabricantes de compiladores intentan adecuar sus productos a las directrices del Estndar, aunque en ocasiones incluyen por su cuenta caractersticas y funcionalidades especficas (principalmente en las libreras que acompaan al compilador en forma de herramientas). Esto significa que existen tantas versiones de C++ como plataformas distintas, ya que existen compiladores C++ para virtualmente cada combinacin de hardware y Sistema Operativo conocidos. Las diferencias entre estos C++ reales y el C++ Estndar (o de Stroustrup) como lo denomin algn autor [6], es por supuesto variable en funcin del grado de adecuacin que haya logrado cada fabricante. Adems, el Estndar es bastante tolerante y permite a los implementadores decidir por su cuenta ciertas cuestiones de detalle. Todos estos factores hacen que en ocasiones, dos

compiladores distintos aplicados al mismo cdigo conduzcan a resultados diferentes. Por supuesto, no nos referimos a que 2 + 2 dejen de ser 4, sino a errores y avisos de cosas que son o no permitidas en segn qu plataforma. A las consideraciones anteriores hay que aadir que los ordenadores son finitos, lo que exige que las aplicaciones que corren en ellos sean necesariamente finitas. En consecuencia, los fabricantes de compiladores se ven obligados a imponer ciertas condiciones y lmites a sus productos. Por ejemplo: el Estndar dice que los bloques, zonas de programa englobadas en llaves { }, pueden ser anidados (bloques dentro de otros bloques). Sin embargo las implementaciones pueden sealar un lmite mximo de anidamiento para estos casos. Naturalmente los lmites y condiciones pueden variar para cada compilador. El Estndar solo exige que estas limitaciones estn debidamente documentadas. Nota: En esta obra hemos utilizado los tres compiladores C++ de uso ms popular en el mundo de la informtica personal y empresarial: El compilador Borland C++ de Imprise. El Visual C++ de Microsoft, y el C++ de la Open Software Foundation (GNU Cpp). Los dos primeros son para la plataforma Wintel. El ltimo para Linux. Desafortunadamente, la versin que dispongo de "Visual" es bastante antigua (1998). Como comprobar el lector a lo largo de estas pginas, aunque por fortuna los tres compiladores son bastante consistentes y se aproximan al Estndar, esta concordancia no siempre es perfecta y los resultados no siempre coinciden en algunos rincones del lenguaje. En aquellas ocasiones en que hemos detectado disparidades se han incluido las observaciones pertinentes. Tenga en cuenta que estas se refieren siempre a versiones concretas de cada compilador y que las divergencias pueden o no manifestarse si se utilizan otros compiladores u otras versiones.

Tanto si se va a acometer un nuevo proyecto, como si se debe mantener el cdigo de aplicaciones ya existentes (que los anglosajones denominan "legacy code"), es importante tener claras algunas cuestiones relativas a la estandarizacin de lenguaje y al grado de adaptacin de cada plataforma o compilador concreto. Estas cuestiones aparecen con cierta regularidad en los foros de debate, y aunque no conciernen estrictamente a nefito, en cambio s son importantes para el profesional que se enfrenta a situaciones del mundo real. Son las siguientes:

2.1 Adecuacin al EstndarObserve que la declaracin de que un compilador o plataforma de desarrollo "sigue el Estndar", solo indica que la parte cuyo comportamiento est definido en la norma, se comporta exactamente segn lo indicado por esta, pero que lo anterior no es bice para que pueda contener extensiones especficas (no estndar), ni para que carezca de todas las caractersticas especificadas en la norma (lo que se denomina "100% conforme). Algunas funcionalidades sencillamente pueden faltar (no estar implementadas). Nota: en general las deficiencias o carencias se refieren a las partes ms modernas del lenguaje. Especialmente algunos aspectos del tratamiento de clases y funciones genricas ("templates"). En el momento de actualizar esta pgina (Diciembre 2006), solo un compilador que conozca, presume de ser 100% "compliant"; el resto presenta diverso grado de adecuacin. Desde las muy bajas, como son proverbialmente las antiguas versiones de Microsoft VC++,

hasta las modernas, en las que es del orden del 99%. De acuerdo con los expertos, los compiladores ms conformes por el momento son: la serie GNU c++ 4*; VC 2k3; VC 2k5; Intel C++ 8.0 y Comeau 4.2 (o versiones posteriores). Salvo casos de fuerza mayor, que se deba lidiar con "legacy code", el consejo de los expertos es no considerar siquiera cualquier compilador cuyo fabricante no lo haya actualizado en los ltimos cuatro aos.

2.2 Importancia de escribir cdigo estrictamente estndarLa cuestin es totalmente independiente de la anterior, aunque su planteamiento carece de sentido en el supuesto de que utilicemos un compilador que carece de extensiones particulares y sigue el estndar al 100%. Las posturas "relajadas" a este respecto se sintetizan en que debe primarse la rapidez en la puesta apunto de la aplicacin. Sus defensores argumentan que les importa ms completar rpidamente las aplicaciones, que la pureza conceptual o formal de su cdigo, y que a sus clientes solo les importa el precio final de las mismas. En consecuencia, debe utilizarse sin escrpulo cualquier caracterstica o recurso disponible en la plataforma. Las posturas estrictas argumentan que el costo de mantenimiento de las aplicaciones es tanto o ms importante que el de su desarrollo inicial, y que en consecuencia, debe seguirse escrupulosamente el Estndar. Sobre todo, teniendo en mente la posibilidad de que el usuario pueda migrar a otra plataforma en el futuro. En cuyo caso, la fidelidad al estndar pagar sus rditos. Las posturas extremas preconizan incluso utilizar solo aquel subconjunto del Estndar que sea universalmente soportado, intentando huir de "rincones oscuros" cuyo comportamiento exacto dependa del compilador.

3 Organizacin y plan de la obraLa propia naturaleza del lenguaje y las, ya sealadas, complejas inter-ralaciones entre sus partes, hacen que en principio sea difcil establecer un orden de exposicin, un "Plan de la obra" que diramos. En este caso el "Plan" no ha existido en absoluto, como se indic en el prlogo, comenc aproximadamente con el mismo orden que en "C++ Builder Languaje Guide", al que se han ido haciendo retoques. De todas formas, sea cual sea el plan de la obra, inevitablemente aparecern cuestiones para las que seguir su hilo argumental requerir un proceso de saltos de un sitio a otro, puesto que si se encadena la exposicin siguiendo un orden conceptual determinado, otros conceptos vendrn inevitablemente desordenados. Parece ser que la naturaleza del conocimiento es ms bien una suerte de inter-relaciones ms parecidas a las redes neuronales que a una cinta de casete. A lo largo de estas pginas me ha venido a la mente muchas veces lo desesperante que debe ser preparar un proyecto docente para esta asignatura que no pueda ser fcilmente discutido. En cualquier caso, la lectura de libros electrnicos como el presente (al menos para mi) presentan un cierto problema. No aparecen los captulos uno detrs de otro como en los libros clsicos "en papel", en los que hay un orden "natural"; un principio organizacin posicional y de orden de lectura. La ubicuidad del texto electrnico resulta molesta en cierto sentido. Tengo que reconocer que no estoy demasiado satisfecho de la "navegabilidad" en el formato actual, lo que no significa que no sea cmodo saltar de un sitio a otro (esto me pasa en general con todos los sistemas de ayuda on-line).

Si eres de los que prefieren tener la idea de un cierto orden, te aconsejo que utilices el ndice; est a una distancia de un solo clic de ratn de cualquier pgina en que te encuentres: [Indice] en la esquina superior derecha. Inicio. [1] Respecto a esta influencia, hay opiniones para todos los gustos. En el enlace adjunto puede encontrar una de ellas, "Why C++ Sucks" (en ingls). Originalmente el documento estaba en http://world.std.com/, sin embargo, a mediados de 2006 un lector me avis que el enlace estaba roto. No he podido volver a encontrar el documento original (parece como si se lo hubiese tragado la red). Sin embargo, afortunadamente conservo una copia en mi archivo histrico Why C++ Sucks.

[1a] "Then there are the many hidden features in C++ that you cannot reveal up front"... "There is a lot to learn after you learn the language. First you solo. Then you get your pilot's license. Then you learn how to fly. Learning C++ is a process of discovery". Al Stevens "C. Programming". Dr. Dobb's Journal. Sept. 1992. [2] Es frecuente que encontremos trozos de cdigo elegantsimos pero tambin difciles de desentraar en una primera lectura. Como botn de muestra, las dos sentencias que siguen son perfectamente correctas en c++: int z = *pt3+-*++pt3; void (_USERENTRY * _RTLENTRY _EXPFUNC32 signal(int __sig, void (_USERENTRY * __func)(int))) (int); [2a] Stroustrup TC++PL 2.9 [1]

[3] Los comits de estandarizacin tambin tienen mucho que decir al respecto, de forma que la versin "Estndar" de cualquier lenguaje es algo que se escapa de las manos y del control de su creador inicial. [4] Son las imgenes GIF entrelazadas o las JPEG progresivas. [5] "Not proprietary" que no son propiedad intelectual de ninguna empresa o institucin. De esta forma no existe un nico "fabricante" del lenguaje que decide sus caractersticas. En caso contrario, por ejemplo el de Java, propiedad de la compaa SUN, es esta ltima la que controla su desarrollo. [6] Desde su alumbramiento, el Dr. Stroustrup ha seguido muy de cerca la evolucin y desarrollo de su "criatura", aunque desde luego, actualmente la ltima palabra la tiene el comit encargado de elaborar el Estndar al que l mismo pertenece.

0.1 El Ordenador Electrnico Digital"Calcular con nmeros es en s mismo una forma de razonamiento, y buena parte del razonamiento que las personas hacemos se puede considerar una forma de computacin... La computacin y el razonamiento lgico son en

realidad las dos caras de una misma moneda". Martin Davis "La Computadora Universal, de Leibniz a Turing". Editorial Debate S.A. Madrid 2002.

1 Presentacin:Imaginamos sobradamente conocidos por cualquier estudiante de C++ los principios generales sobre los que se basan los ordenadores electrnicos digitales; las mquinas en las que probablemente se ejecutarn sus programas. Sin embargo, no est de ms un brevsimo repaso a fin de refrescar y traer al tiempo presente algunos conceptos. Nota: En muchos pases hispano-hablantes de cultura tcnica ms influenciada por USA, se utiliza el trmino "computadora" por ordenador; ms parecida a su equivalente ingls "Computer". Por su parte, la versin castellana deriva del francs "Ordinateur". Esta es tambin la razn por la que en hispano Amrica se dice "La PC", mientras que por aqu decimos "El PC", en referencia al ordenador (masculino).

2 Ordenador electrnico digital:"Underlying our approach to this subject is our conviction that 'computer science' is not a science and that its significance has little to do with computers. The computer revolution is a revolution in the way we think and in the way we express what we think". Harol Abelson y otros. "Structure and Interpretation of Computer Programs". 2 Edicin 1999. The MIT Press Cambridge, Massachusetts. Cualquier dispositivo capaz de resolver problemas mediante proceso de la informacin en forma discreta. Recordemos que aqu, el trmino "digital" se usa en contraposicin a "analgico", y significa que la informacin se representa internamente en forma de nmeros. Por contra, en los dispositivos analgicos la informacin est representada por tensiones y/o intensidades si el dispositivo es electrnico. Aunque pueden existir dispositivos analgicos no elctricos. Por ejemplo, mecnicos, hidrulicos, pticos. etc. En estos ltimos la informacin est representada por la posicin o desplazamiento de ruedas o palancas; por la presin o circulacin de un fluido en un conducto, o por la propagacin de la luz en un circuito (que puede ser una fibra ptica). Mediante el recuento, comparacin y manipulacin de estos nmeros, de acuerdo con un conjunto de instrucciones almacenadas en su memoria, un ordenador electrnico digital puede realizar multitud de tareas: Realizar complejos clculos matemticos; reproducir una meloda o ganar una partida de ajedrez al campen mundial humano de la especialidad. La informacin se presenta en forma de datos e instrucciones (algoritmos) para su manipulacin y, como hemos sealado, est "digitalizada". Es decir, reducida a magnitudes numricas discretas (nmeros racionales) representados a su vez en formato binario. Este formato utiliza magnitudes que solo pueden adoptar dos valores mutuamente exclusivos (cierto y falso, cero o uno, encendido o apagado, Etc.) Por consiguiente, pueden representarse con solo dos smbolos (grficamente O y 1). En contraposicin, el formato decimal tiene diez dgitos (del 0 al 9 en el sistema arbigo). Esta forma de representacin es vlida no solo para la informacin textual, representada mediante el cdigo ASCII, Unicode, o cualquier otra convencin. Tambin las cantidades numricas, las imgenes, los colores, los sonidos y los algoritmos, estn almacenados en el ordenador en formato binario. Resulta

as, que el universo de las computadoras electrnicas digitales es un ocano de nmeros binarios que representan datos e instrucciones para su manipulacin. Nota: No confundir los conceptos: electrnico (basados en la electrnica); digital (utilizar magnitudes discretas representadas por nmeros) y binarios (utilizar este modo de representacin, una lgica y un lgebra de Boole Int Ap.K). Nada impide la existencia de ordenadores no electrnicos. Por ejemplo, mecnicos, pticos, biolgicos o basados en fluidos. Tambin han existido y existen ordenadores analgicos (no digitales) exclusivamente mecnicos. Por ejemplo, la humilde regla de clculo, o dispositivos ms sofisticados, como elementos de puntera y direccin de tiro de artillera. Tampoco existe inconveniente terico para la existencia de ordenadores digitales no binarios [9]. El hecho de que los actuales ordenadores electrnicos digitales sean binarios, se debe, entre otras razones, a que los circuitos elctricos estn especialmente adaptados al modo binario. Simplemente haciendo corresponder los dos posibles valores de la variable con dos estados fsicos de un circuito o dispositivo. Por ejemplo, con los estados de: conduccin no conduccin; tensin, sin tensin; magnetizado no magnetizado; con luz, sin luz; Etc. Como el lgebra de Boole [1] maneja variables que solo pueden tener dos estados ("cierto" y "falso"), es muy fcil representar y emular comportamientos y ecuaciones de este lgebra mediante circuitos electrnicos. As, construir un circuito electrnico que responda (que proporcione como salida) el OR, AND, NOR, XNOR, Etc. de ciertas variables de "entrada", es trivial desde el punto de vista de diseo de circuitos lgicos. Es relativamente fcil disear un circuito digital que responda a unas "Ecuaciones" lgicas (de Boole) por complejas que sean. Nota: Han existido intentos de construir ordenadores digitales en base a lgicas no binarias. Por ejemplo, "ternarias". Actualmente se empieza a hablar de la computacin cuntica, basada en algo distinto a dos estados mutuamente exclusivos.

3 Propiedades de los datosMs adelante ( 2) se incluyen algunas puntualizaciones sobre el asunto de datos e instrucciones (algunas casi filosficas), pero por ahora nos centraremos en los primeros (los datos) para aclarar algunos conceptos que, con frecuencia se confunden. Nota: Al ser este un manual o curso de C++, encontrar que la mayor parte de l se refiere a los algoritmos.

3.1 Los datos como colectivoAunque en ltimo extremo todo son nmeros, desde un punto de vista macroscpico, a los informticos les gusta referirse a los datos clasificndolos en dos grandes apartados que se corresponden mejor con la imagen que el humano tiene de ellos: numricos y textuales o alfanumricos . Cuando estos datos no estn en la memoria interna sino en dispositivos externos (generalmente discos magnticos u pticos), se agrupan en ficheros, de los que existen infinidad de tipos; aunque es frecuente agruparlos en dos grandes categoras: textuales y binarios [6].

Nota: En algunos Sistemas, por ejemplo Windows, es costumbre que los ficheros del mismo tipo (de la misma "familia") tengan nombres con la misma terminacin [10]. Tradicionalmente esta terminacin la componen tres letras despus del nombre separadas de l por un punto, lo que permite identificar fcilmente los ficheros de la misma familia. Existen tantos tipos como la imaginacin de los programadores y fabricantes de software han sido capaces de crear (.TXT; .DLL; .DOC; .ASP; Etc.) Generalmente el sistema operativo asocia cada fichero (no ejecutable) con una aplicacin (ejecutable) que es la encargada de su manejo [8]. A este proceso se le denomina asignacin de extensiones de nombres de archivo.

3.1a Datos textuales.Se refieren a la idea que todos tenemos de aquella informacin que puede ser representada mediante la escritura. Tienen cuatro atributos o caractersticas que conviene matizar: Lengua natural [2] en que se haya representado, que puede ser cualquiera de las conocidas: Espaol, Francs, Ingls, Alemn, etc. Sistema de escritura utilizado. Existen dos: alfabticos e ideogrficos. Los primeros utilizan un conjunto reducido de smbolos (caracteres) para representar las palabras. Para nosotros es el denominado "Sistema occidental" que se basa en un alfabeto de raz latina, aunque naturalmente existen otros: rabe, Griego, Etc. Los sistemas ideogrficos utilizan smbolos (ideogramas) para representar ideas. Existen sistemas que son combinacin de ambos. Juego de caracteres. Es el conjunto de caracteres distintos que se utiliza en un documento. Por ejemplo, aunque el Espaol y el Francs utilizan un alfabeto de raz latina, algunos caracteres y signos de puntuacin son distintos, de forma que ambos idiomas utilizan distinto juego de caracteres ("Character set"). Sistema de codificacin empleado para traducir los grafos del alfabeto a nmeros. Se empez utilizando el US-ASCII, pero actualmente el sistema ms utilizado es Unicode ( 2.2.1a).

3.1b Datos binariosLa informtica trata cada vez ms con los tipos de datos denominados "Multimedia", sonidos e imgenes [3], en multitud de formas y calidades: Monoaural, estreo, Dolbi-digital, MP3, Etc. para los primeros; Estticas o en forma de flujo (stream), en color o en blanco y negro, Etc. para las segundas. Aunque tanto los sonidos como las imgenes son de naturaleza intrnsecamente analgica, los informticos han inventado sistemas para digitalizarlas (reducirlas a nmeros) con la menor prdida de calidad y de la forma ms comprimida posible. Aqu se habla de "codecs" para referirse a los diversos algoritmos que a la postre reducen los sonidos o imgenes a ficheros de nmeros, y posteriormente reconstruyen los sonidos e imgenes a partir de los nmeros. Estos ficheros son conocidos de forma genrica como "binarios".

3.2 Datos individualesDesde la ptica de los lenguajes como C/C++, los datos son bsicamente de dos tipos: numricos y caracteres. Existen diversos subtipos de los primeros, el ms simple de los cuales es el entero corto sin signo unsigned

short. De los segundos existe menos variedad; bsicamente solo dos tipos: caracteres estrechos y anchos (char y wchar_t). En cambio presentan la ventaja de que puedenagruparse en cadenas (arrays o matrices) de cualquier longitud. Son las denominadas "cadenas alfanumricas", en las que sus elementos (caracteres) pueden ser alfabticos (letras), numricos (guarismos) y signos de puntuacin (interrogacin, punto, coma, Etc.) Ambos tipos de datos, numricos y caracteres, son conocidos colectivamente como escalares. En ellos pueden distinguirse varios aspectos:

3.2a Representacin simblicaCorresponde a la representacin de los datos en el programa (fuente) y en la mente del programador. En lo que respecta a los primeros (magnitudes numricas), nuestra cultura "Occidental" utiliza para su representacin el denominado sistema de numeracin decimal con cero , inventado por la antigua cultura Indostnica. Sin embargo, la notacin que empleamos es arbiga [5]. La razn de que haya prevalecido frente al sistema latino (nmeros "romanos") es simplemente que es mucho ms adecuado para las operaciones aritmticas (una de las causas del escaso desarrollo de las matemticas en la Roma Clsica, fue precisamente lo inadecuado del sistema de numeracin que utilizaban). Para la representacin de caracteres utilizamos un alfabeto de raz latina que, aunque coincide en lo sustancial, presenta algunas diferencias entre los distintos idiomas occidentales. Como resultado de lo anterior, escribimos que la variable pi vale 3.1416 y la primera letra mayscula del alfabeto es A. Nota: Es tradicin informtica que algunas constantes numricas sean representadas en el fuente por una representacin distinta de la decimal. Por ejemplo, octal o hexadecimal .

3.2b Sistema de codificacin.Se refiere a una regla por la que los caracteres son transformados en nmeros manipulables por el ordenador (los datos numricos ya lo estn). Existen dos formas de hacerlo: los sistemas de ancho constante y los de ancho variable. En ambos casos la estrategia consiste en ordenar el juego de caracteres (letras, guarismos y signos) en una tabla, y hacer corresponder un nmero con las posiciones sucesivas de la misma. La diferencia entre ambos sistemas es que los primeros utilizan representaciones numricas que ocupan siempre el mismo espacio en el interior de la mquina (generalmente 8 o 16 bits). Por contra, los sistemas de codificacin de ancho variable o multibyte, tratan los caracteres de forma parecida a lo que ocurre con los dato numricos. Es decir, que su representacin no ocupa siempre el mismo espacio. En estos sistemas existen caracteres cuya representacin puede abarcar 1, 2, 3 o incluso 4 bytes. La ms conocida y famosa de estas tablas es la US-ASCII, que tiene 127 posiciones y es de ancho constante. Aqu cada carcter se representa por un nmero cuya representacin ocupa siempre 8

bits ( 2.2.1a). La internacionalizacin de la informtica, que empez a manejar juegos de caracteres de otras culturas e idiomas distintos del ingls-americano, oblig a utilizar tablas ms extensas, en las que rpidamente se sobrepas la cantidad de 256 elementos (caracteres distintos), que es el mximo que puede expresarse con 8 bits (ver ms adelante ).

3.2c Representacin internaTambin denominado formato fsico. Se refiere a la forma en que estn representados los nmeros en el sistema binario, nico soportado por el ordenador. Aqu se siguen dos estrategias. La primera, ms simple y uniforme, se aplica a los caracteres. Estos se representan siempre por magnitudes binarias de igual longitud; 8 o 16 bits, segn se trate de caracteres normales (estrechos) o anchos. La segunda, ms compleja y elaborada, corresponde a la representacin de las magnitudes numricas, para las que se utiliza un sistema de ancho variable bastante sofisticado que incluye varios subtipos. La razn de esta complejidad es doble. La primera de economa de espacio, de forma que, a costa de no poder representar determinados valores, algunas representaciones utilizan menos espacio [7]. Por ejemplo, un unsigned short no puede ser negativo ni mayor que 65,535; a cambio puede ser almacenado en 16 bits. Por contra, los nmeros muy grandes o muy pequeos requieren mayores espacios de almacenamiento, hasta 80 bits ( 2.2.4).

Adems de la anterior, razones de precisin, y de poder representar cantidades positivas y negativas, ha motivado la aparicin de algunas variedades de representacin (binarias desde luego) a cuyos detalles dedicamos un captulo ( 2.2.4a).

Nota: Aunque hayamos sealado que existen sistemas de codificacin de ancho variable para los caracteres, como veremos a continuacin, la representacin interna de estos utiliza siempre un formato de ancho fijo, dejando la representacin de ancho variable para almacenamientos externos y comunicaciones.

3.2d Codificacin y representacin externas.Con frecuencia los programas tienen que habrselas con el mundo exterior, con el que deben intercambiar informacin. Por ejemplo, determinados datos pueden ser ledos o escritos a un fichero de disco o a una lnea de comunicacin. Es muy frecuente que, tanto el sistema de codificacin como la representacin del fichero utilizadas por el dispositivo, sean distintas de las utilizadas internamente por el programa. El resultado es que debe efectuarse las correspondientes conversiones de cdigo y de formato durante las operaciones de E/S. Por ejemplo, mientras que en el programa, los caracteres estn siempre representados por magnitudes numricas de longitud fija (1 o 2 bytes), en los ficheros de disco y lneas de comunicacin suelen utilizarse sistemas de codificacin multibyte. En los que los caracteres ocupan distinto ancho segn el caso.

4 Sistemas de representacin numricaEn lo que sigue daremos un breve repaso a los distintos modos de representacin simblica utilizados para los datos numricos, haciendo hincapi en los aspectos informticos de la cuestin.

4.1 Sistema decimalEn cuanto al problema de representar internamente cantidades numricas, el sistema tradicional (el decimal con cero al que estamos acostumbrados), no es muy adecuado para los dispositivos electrnicos, puesto que aqu, al ser un sistema de base 10, las variables (las cifras), pueden tener diez valores distintos (los guarismos 0 al 9 si utilizamos el sistema arbigo de numeracin). Recordemos que en este sistema, una cantidad cualquiera, por ejemplo 1798, en realidad se lee como: 1 x 103 + 7 x 102 + 9 x 101 + 8 x 100 == 1 x 1000 + 7 x 100 + 9 x 10 + 8 x 1

Observe la diferencia entre los diversos conceptos involucrados: El nmero o cantidad "mil setecientos noventa y ocho", su representacin en el sistema decimal (1978) y las "cifras" o "guarismos" que componen su representacin en este "sistema de numeracin" (en este caso cuatro cifras: 1, 7, 8 y 9 colocadas en un cierto orden). Desde la escuela primaria sabemos que este en este sistema, el valor de las cifras viene complementado por su posicin en el conjunto (decimos que es posicional), de forma que el valor total de una expresin viene representado por el producto de su valor-base (0 a 9) multiplicado por la potencia de 10 que corresponda segn su posicin. Al final se suman los resultados parciales. Resulta as que en el sistema decimal, la cantidad mas alta que se puede representar mediante una cantidad de cuatro cifras, nnnn es, como mximo: 9 x 103 + 9 x 102 + 9 x 101 + 9 x 100 == 9999 (10.000 si le aadimos el cero).

Es fcil verificar que un nmero decimal de n dgitos puede representar como mximo una cantidad igual a 10n. En el caso del ejemplo, para 4 dgitos, 104 = 10000. Observe que el mismo concepto (la misma cantidad) puede ser representada utilizando distintos sistemas de numeracin, por ejemplo: MDCCXCVIII en nmeros romanos (como dijimos, un sistema muy poco adecuado para las matemticas).

4.2 Sistema binarioEl sistema binario puede representar igualmente cualquier cantidad basndose en cifras que solo pueden tener dos valores, 0 y 1 ( ). El sistema es exactamente anlogo al decimal, con la diferencia de las potencias; de 2 que es la nueva base (en vez de 10 como en aquel caso). Por tanto, la cantidad binaria 11100000110 se lee: 1x210 + 1x29 + 1x28 + 0x27 + 0x26 + 0x25 + 0x24 + 0x23 + 1x22 + 1x21 + 0x20 Si el lector quiere "sacar la cuenta" ver que conduce igualmente a "mil setecientos noventa y ocho". Una magnitud que solo puede tener dos valores se denomina bit, abreviatura de "Binary digit" (dgito binario). Es la menor cantidad de informacin que puede concebirse. Su abreviatura es b. Por ejemplo: 10 Kb son 10.000 bits. Resulta as, que un interruptor que puede estar encendido o

apagado es (puede ser) un almacenamiento de 1 bit de informacin (basta con hacer corresponder "encendido" con uno de los valores y "apagado" con el otro). El asunto es que estas variables "binarias" (que solo pueden adoptar dos valores distintos), son mucho mas adecuadas para su representacin en dispositivos elctricos, magnticos y pticos que las "decimales", por lo que es este el "formato" elegido para la representacin y almacenamiento de datos numricos en los ordenadores electrnicos digitales. La capacidad de representacin de este sistema es sin embargo menor que en el decimal, as, una cantidad binaria de 4 dgitos puede representar como mximo: 1 x 23 + 1 x 22 + 1 x 21 + 1 x 20 == 15 (16 si aadimos el cero)

Es fcil verificar que, en este sistema de numeracin, un nmero de n dgitos puede representar como mximo una cantidad igual a 2n (en el caso del ejemplo, para 4 dgitos, 24 = 16). La tabla adjunta expresa las cantidades que se obtienen con la unidad, seguida de cierto nmero n de ceros en los sistemas decimal y binario. Lo que representa las potencias n de la base de numeracin. Es decir: 10n o 2n. Base 10 Nmero decimal Base 2 Nmero binario 100 101 102 103 104 105 106 107 108 109 1010 1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 10000000000 20 21 22 23 24 25 26 27 28 29 210 1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 10000000000 Equivalente decimal 1 2 4 8 16 32 64 128 256 512 1024

4.3 Sistema UnarioDel mismo modo que las cifras del sistema binario pueden tener dos valores, las cifras de este sistema solo pueden tener uno. Su representacin puede ser cualquiera, 1, *, x, Etc. Es el sistema de los hombres primitivos; el mtodo de representacin de una cantidad se limita pintar un palote en la pared o aadir una cuenta a un collar para cada unidad (es tambin el sistema de numeracin de los prisioneros de las pelculas en sus celdas). En este sistema las cantidades 3 y 4 se representaran: *** **** Podramos encontrar en cualquier texto una expresin como: 10110111 con la indicacin de que no es un nmero binario sino unario. En tal caso, sabemos que no es la representacin del decimal 183, sino la representacin de las cantidades 1, 2 y 3. La verdad es que este sistema no se utiliza en

informtica a excepcin de algunos supuestos tericos. Por ejemplo, en la mquina de Turing ( 0.1.1).

4.4 Otros sistemas de representacin numricaAdems del decimal y el binario (este ltimo es el sistema "natural" del ordenador), en la literatura informtica y en los fuentes de los programas se utilizan otras formas de numeracin; sobre todo para representar valores constantes ( 2.2.4b) y BCD ( 0.1w1). 3.2.3b). Son los sistemas octal ( 2.2.4b); hexadecimal (

5 Almacenamiento internoTradicionalmente el almacenamiento interno de los ordenadores se organiza desde el punto de vista lgico en grupos de 8 (o mltiplos de 8) cifras binarias (bits). Estos conjuntos (octetos) son la menor cantidad de informacin que trata el ordenador con entidad propia; reciben el nombre de bytes y suele abreviarse con B. Por ejemplo, 16 Kb y 16 KB. Se refieren a 16000 bits y 128.000 bits respectivamente [4]. Nota: Hemos sealado que bit es abreviatura de Binary Digit, mientras que el nombre Byte fue acuado en la dcada de los 50 por Werner Bushholz de la IBM; la palabra proviene de una mutacin de "bit", hecha de forma que no hubiese confusin al pronunciarlas (bit y byte suenan muy distintas en ingls). En ocasiones, adems de los octetos, se utilizan agrupaciones de 4 bits, reciben el nombre de nibble. As que 2 nibbles == 1 Byte. Podemos usar un smil para entenderlo: aunque nuestro alfabeto tiene 26 caracteres no solemos utilizarlos aislados. Para que tengan significado se utilizan en grupos (palabras). Los ordenadores utilizan tambin palabras, solo que estas son siempre de la misma longitud (8, 16, 32 o 64 bits segn el modelo de procesador). Segn lo anterior, un octeto (una "palabra" de 8 bits), 1 Byte, puede contener un nmero de hasta 28 = 256, lo que deriva en que si reservamos una palabra de 8 bits para "describir" (contener) una variable, sabemos de antemano que dicha variable no va a poder adoptar ms de 256 estados distintos. Esto, unido al hecho de que la forma de representacin interna utiliza el sistema binario y los elementos y circuitos fsicos son igualmente binarios (pueden adoptar solo dos estados), hacen que las potencias de dos: 8, 16, 32, 64 Etc. sean "nmeros mgicos" en el mundo de las computadoras.

Temas relacionados: Tipos bsicos: Representacin interna y rango ( 2.2.4) 2.2.4a)

Representacin binaria de las cantidades numricas ( Orden de almacenamiento ( 2.2.6a).

Alineacin interna (

4.6.1)

Inicio. [1] George Boole (1815-1864). Matemtico ingls cuyos trabajos tericos sobre conjuntos de nmeros binarios (que solo pueden adoptar dos valores), ayud a establecer las bases de la moderna lgica simblica. Su lgebra de la lgica binaria es tambin denominada lgebra Booleana. [2] Nos referimos a las lenguas o lenguajes "Naturales" en contraposicin a los "Artificiales" utilizados en informtica. Los primeros han sido inventados espontneamente por el hombre (a excepcin del Esperanto) y son el resultado de mutaciones que se pierden en la noche de los tiempos. Los segundos han sido y estn siendo inventados por los informticos para comunicarse con los ordenadores (computadoras). [3] Ya se est experimentando con olores. Creo que incluso existe alguna patente al respecto. [4] Por supuesto byte puede escribirse con mayscula y minscula, pero es costumbre informtica utilizar la mayscula -Byte-, mientras que bit siempre con minscula. En mis tiempos -cuando la gente denominaba a estos cacharros "cerebros" electrnicos- era pecado mortal no hacerlo as, de forma que ante una expresin xxx KB o yyy Kb todo el mundo saba a que atenerse. [5] Ahora que el asunto parece estar de moda, digamos que no solo debemos a la cultura Islmica las cifras numricas, incluso muchos textos clsicos han llegado hasta nosotros a travs del Islam. Tambin conocimientos de astronoma y medicina. [6] Existe un tercer grupo de ficheros, los ejecutables, que se correspondera con lo que hemos denominado algoritmos (instrucciones) y que podran considerarse dentro del grupo de los binarios. Adems de los citados, pueden existir otros tipos, como directorios y ficheros de dispositivo. Estos ltimos son artificios utilizados por el Sistema Operativo. Los ficheros de directorio sirven para organizar el contenido del disco en carpetas y subcarpetas. Los ficheros de dispositivo representan la interfaz de los perifricos controlados por el SO. [7] Lo contrario obligara a reservar para "todos" los datos numricos, el espacio correspondiente al mayor de ellos (mxima entidad numrica soportada por el programa). [8] A menudo es un problema conocer la naturaleza de los ficheros que encontramos en nuestro sistema. Cuando esto no es posible, puede intentarse, al menos, conocer el tipo o familia a que pertenece un fichero determinado por su terminacin. Entre los sitios que podran citarse, recomendar dos: Filext y File-Extensions Org. Ambos contienen una extensa base de datos y toneladas de informacin al respecto. [9] Incluso en publicaciones muy autorizadas, es frecuente ver como se confunden los trminos digital y binario, tomndolos como sinnimos cuando en realidad no lo son (los dgitos no tienen porqu ser binarios). Como hemos sealado, pueden existir ordenadores digitales de lgica ternaria o de ms estados. Por ejemplo, decimal. ENIAC, considerado como el primer ordenador digital electrnico de clculo numrico ( A2.1), tena una arquitectura decimal, de forma que la representacin interna de los nmeros no era binaria.

[10] Lo anterior no es cierto en UNIX, donde tradicionalmente los ficheros no tienen terminacin especfica. En cuanto a Microsoft, los sistemas de archivo de sus Sistemas Operativos no reconocen diferencias entre Maysculas/minsculas en los nombres de ficheros, de forma que la tcnica de utilizar una terminacin de tres caracteres para determinar el tipo de un fichero -lo que se conoce como TLA "Tree Letter Acronym"- tiene el problema de que solo permite 17.576 ATL nicos suponiendo las letras del alfabeto ingls americano.

0.2 El Sistema Operativo1 Presentacin:Podramos repetir aqu lo indicado al tratar del Ordenador Electrnico Digital ( 0.1). Deberan ser igualmente conocidos por cualquier estudiante de C++ unos mnimos conceptos generales sobre los Sistemas Operativos, puesto que sin un mnimo "background" en la materia, difcilmente se puede ser un buen programador C++. Incluso dira ms; seguramente se necesite un conocimiento ms que mediano sobre la plataforma que utilice, y si es el caso de un Sistema "moderno" del tipo de MS Windows, este conocimiento es vital, ya que precisamente una de las caractersticas de estos entornos es que hay que acudir a los "servicios" del sistema virtualmente para cualquier cosa que queramos hacer ( 1.7).

El problema es que un sistema moderno como Windows es bastante complejo, y aunque es cierto que algunos lenguajes encapsulan los servicios del sistema mediante una capa de software aadido, que intenta enmascarar su complejidad, como dice Petzold ( complejidad saltar fuera y le morder la pierna". PW5E): "Antes o despus esta

El presente captulo incluye unas pinceladas generales sobre esta parte del software que controla el funcionamiento del ordenador, introduciendo algunos conceptos que son imprescindibles para entender otros relacionados con la multiprogramacin y multitarea, adems de ser fundamentales para entender como y porqu funcionan los programas C++ (o de cualquier otro lenguaje) en los entornos operativos actuales. Sus caractersticas las personalizaremos en el Sistema Windows de MS por ser el ms popular. Aunque este conocido sistema ha sufrido paulatinas mutaciones, nos referiremos a las que se implementan en las versiones actuales de 32 bits.

2 El Sistema OperativoDesde el punto de vista funcional, el Sistema Operativo (SO) es el supervisor de cualquier actividad que se ejecuta en el ordenador. Me gusta decir que el SO viene a ser como el soplo de vida que hace funcionar la mquina. Sin l, el hardware se comparara a un ser humano en coma profundo; quizs con un gran potencial pero incapaz de ninguna accin. Nota: el trmino Sistema Operativo data, de finales de los 50. En toda esta obra nos referimos a l como el "Sistema" (con maysculas) o por su acrnimo "SO". Cuando utilicemos minsculas (el sistema) nos referimos al ordenador como conjunto.

En realidad el SO est constituido por un conjunto relativamente grande de programas; solo hay que considerar la ingente cantidad de espacio necesario para cargar un Sistema Windows actual; incluso en su configuracin mnima (el cdigo de Windows 3.11 tena aproximadamente 500.000 lneas de cdigo, el de Windows 2000 tiene 45 millones). Sin embargo, hablando con propiedad, muchos de estos mdulos no pertenecen al "Sistema", son programas de aplicacin y utilidades adicionales que no tienen que ver demasiado con aqul, sino con tcnicas comerciales y de mrketing. Pero esto... es ya otra historia.

3 Programas de aplicacinDesde un punto de vista estructural, el software que controla el funcionamiento de un ordenador est organizado por capas ( 1.7a).De estas, el Sistema Operativo es una capa intermedia, situada entre los programas de aplicacin y los controladores de dispositivos ("drivers"). La capa superior, constituida por los programas de aplicacin, es la encargada de realizar tareas directamente utilizables por el usuario. Un procesador de textos, una hoja de clculo, un navegador Web, etc. Son el tipo de programa que, con ms probabilidad, ser objeto de atencin del programador C++ [2]. Una caracterstica de los programas de aplicacin es que estn compilados para un Sistema especfico [10]. Por ejemplo; un procesador de textos WordPefect para Linux correr en cualquier plataforma hardware que tenga cargado dicho sistema, con independencia de su configuracin concreta: Modelo de procesador; tipo de disco; tipo de bus interno; tipo de tarjeta grfica. etc.

4 Controladores de dispositivosPor su parte, la capa inferior del Software est constituida por unos programas que actan de interfaz entre el hardware y el Sistema Operativo. Son los denominados controladores de dispositivos, porque son ellos los que controlan los dispositivos hardware. Nota: En la arquitectura PC, algunos de estos controladores de dispositivos E/S estn integrados en las rutinas de la BIOS ( H4).

Los "drivers" son especficos de cada elemento hardware y Sistema que deba manejarlo, de forma que para un determinado Sistema existen tantos drivers como dispositivos hardware deba soportar. A la inversa, cada fabricante de hardware, por ejemplo digitalizadores, impresoras, controladoras de disco etc. debe disponer de un controlador especfico para cada modelo y Sistema Operativo distinto con el que deba usarse el modelo en cuestin. Nota: los "drivers" instalables (que se pueden cargar como cualquier otro programa durante la carga inicial del Sistema) se materializan en ficheros [13] y permiten que el SO pueda configurarse segn las caractersticas particulares de la mquina o preferencias del usuario. Su introduccin constituy un factor de flexibilidad y progreso considerable para los SO's. En MSDOS este proceso es controlado con un fichero "Script" denominado CONFIG.SYS.

A principios de los 90 era frecuente que, junto con cada nuevo elemento hardware que se adquiriese, el fabricante aadiera un disquete con los "drivers" para los SOs ms conocidos, por ejemplo, Xenix, Windows 3.1, OS/2 etc. En la actualidad, todava se siguen incluyendo estos programas en forma de disquete o CD. El propio Windows incluye cientos de tales controladores para los modelos de hardware de los fabricantes ms conocidos (incluyendo algunos denominados "Genricos" o estndar); estos controladores son proporcionados a MS por los fabricantes [3].

Los controladores de dispositivo se suelen agrupar en alguna de las siguientes categoras o clases: Adaptadores de audio (tarjetas de sonido). Dispositivos de comunicacin (infrarrojos, mdems, etc). Dispositivos de visualizacin; pantallas (displays). Teclados. Ratn ("mouse" y otros sealadores grficos). Dispositivos multimedia. Dispositivos de Red. Impresoras. Almacenamiento

4 El ncleoComo el resto del software, tambin el SO est construido por capas. Las interior, la que representa su parte ms ntima, el "Kernel" o ncleo [1], es un programa multihebra que reside permanentemente en memoria. Se ocupa bsicamente de tres tareas primordiales: Gestin de memoria. Gestin de E/S a disco. Control de las tareas en ejecucin.

Desde un punto de vista conceptual, quizs sea esta ltima su actividad principal, de forma que el kernel es antes que nada un gestor de tareas. Conceptualmente, la gestin del almacenamiento (ficheros de disco), denominada genricamente como sistema de ficheros ("File System"), no es una parte fundamental del Sistema. De hecho algunos SOs pueden utilizar ms de uno (o ninguno). Sin embargo desde un punto de vista funcional, la eficacia del "File System" es determinante en el rendimiento global del Sistema Operativo. Actualmente se estn haciendo importantes esfuerzos para mejorar este apartado, y algunos de los avances ms revolucionarios de los futuros SOs vendrn de esta direccin. A ttulo de ejemplo y

como pincelada al respecto, incluimos el principio de un artculo de Leander Kahney: "Searching for the Perfect OS", aparecido en Wired News www.wired.com en Julio del 2004:

It may sound idiotically simple, but according to technology's leading seer, Apple CEO Steve Jobs, searching for information -- not sorting it -- is the wave of the future. At Apple's Worldwide Developers Conference in San Francisco this week, Jobs declared that searching for information on a hard drive, rather than sorting into files and folders, is the future of computing. "We all have a million file folders and you can't find anything," Jobs said during his keynote speech introducing Tiger, the next iteration of Mac OS X, due next year. "It's easier to find something from among a billion Web pages with Google than it is to find something on your hard disk," he added. The solution, Jobs said, is a system-wide search engine, Spotlight, which can find information across files and applications, whether it be an e-mail message or a copyright notice attached to a movie clip. "We think it's going to revolutionize the way you use your system," Jobs declared. In Jobs' scheme, the hierarchy of files and folders is a dreary, outdated metaphor inspired by office filing. In today's communications era, categorized by the daily barrage of new e-mails, websites, pictures and movies, who wants to file when you can simply search? What does it matter where a file is stored, as long as you can find it?

3 La mquina virtualLa descripcin "oficial" de Windows nos dice que es un Sistema grfico, multiprograma y multihebra. Dejando aparte los aspectos grficos, su caracterstica ms notoria para el usuario es su capacidad de multiprogramacin; lo que permite que puedan ejecutarse de forma simultanea y sin interferencias diversas aplicaciones. Para implementar esta capacidad, Windows crea un entorno de ejecucin propio e independiente para cada tarea; es como si cada aplicacin corriese en una mquina independiente, que por esta razn se denomina mquina virtual (MV). Puesto que los dispositivos fsicos son nicos y adems pueden ser distintos en cada mquina, se crean tambin unos dispositivos virtuales (designados de forma genrica como VDs, "Virtual devices") que representan, de forma ideal y normalizada, el "hardware" de las mquinas virtuales. De esta forma se consigue que las MV utilicen un hardware virtual que es independiente del hardware real [4].

Las mquinas virtuales se materializan en una tarea en la que se ejecuta una aplicacin y un determinado software de soporte (los controladores virtuales de dispositivo ), que proporcionan a la aplicacin una simulacin prcticamente perfecta del ambiente que pretenden recrear. La

aplicacin dispone de todos los posibles dispositivos y servicios como si fuesen reales, incluyendo controlador de interrupciones programable PIC ("Programmable interrupt controller" vectores de interrupcin ( servicios de BIOS ( H2.4); servicios de E/S ( H2.4.1); acceso directo a memoria (DMA H2.3), etc. H2); tabla de H3.2); H2.1); memoria; registros de UCP (

Las implicaciones prcticas son trascendentales, porque a fin de cuentas, cualquier programa Windows est pensado para correr en una de estas mquinas virtuales, lo que le hace realmente independiente del hardware. Se consigue tambin que los servicios del sistema, encapsulados en libreras .DLL ( 1.4.4b), puedan escribirse igualmente para un entorno independiente del hardware, ya que proporcionan servicios a mquinas virtuales.

El artificio de la mquina virtual no es nuevo. Los mainframes han utilizado desde siempre tcnicas anlogas para soportar multiprogramacin, pero su aplicacin de forma segura en la informtica personal solo pudo realizarse, cuando a partir del Intel 80386, los microprocesadores dispusieron de determinadas capacidades hardware. Es lo que se conoce como funcionamiento en modo protegido ( H5.1), que presenta una doble ventaja: Simplificar la gestin de estas tareas, que son manejadas por el hardware del procesador en vez de utilizar recursos estrictamente software (el procesador garantiza de forma segura la independencia entre las diversas tareas). Realizar gran parte del control con recursos hardware preconstruidos en el procesador, lo que acelera el rendimiento global del sistema.

4 Dispositivos virtualesLa mquina virtual utiliza recursos virtuales; estos recursos pueden ser elementos hardware o software, aunque de forma genrica los denominamos dispositivos virtuales (VDs). Los VDs son utilizados mediante controladores de dispositivo tambin virtuales VxDs. Observe que los VDs no existen, son en realidad una abstraccin conceptual. Lo que si tiene existencia real son estos controladores virtuales VxDs, representados por ficheros de terminacin .VXD. Estas piezas de software "virtualizan" los mencionados dispositivos, de forma que se comportan hacia la mquina virtual como si estuviese dialogando con un dispositivo hardware real y le proporcionan los mismos servicios que si los dispositivos fsicos estuviesen realmente disponibles. La particularidad es que este hardware es ideal, en el sentido que es normalizado. Por ejemplo, para una aplicacin que corre en una mquina virtual, la controladora de video es siempre la misma, con independencia de cual sea el modelo realmente conectado. As pues, aunque son conceptos distintos, a efectos prcticos los VDs y los VxDs pueden tomarse como sinnimos. Los primeros son abstracciones y los segundos son ejecutables que simulan (virtualizan) dicha abstraccin de forma que parezca que las MVs disponen de ciertos recursos (hardware o software) estndar. Aunque la mayora de los VxDs manejan dispositivos hardware (sus

E/S), otros manejan o reemplazan determinados recursos software, por ejemplo rutinas de ROM BIOS.

Estos dispositivos virtuales son nicos, y compartidos por todas las mquinas virtuales que los necesitan en cada momento. Cualquier dispositivo hardware puede ser utilizado sucesivamente por diversas MVs, de forma que si su estado puede ser alterado al cambiar de una mquina virtual a otra, el dispositivo debe ser utilizado a travs de un controlador virtual, que se encarga de restablecer el estatus a los valores correspondientes. Muchos dispositivos hardware utilizan interrupciones para avisar que los datos estn listos o que ellos mismos lo estn [11]. Los dispositivos virtuales raramente interceptan estas interrupciones por s mismos. En su lugar utilizan el Controlador programable de interrupciones virtual VPICD ello instalan un procedimiento callback ( interrupcin hardware. . Para 1.4.4b2a) que es utilizado por VPICD cuando ocurre una

Como el lector puede suponer, no existe limitacin terica en cuanto a la cantidad o funcionalidad de los VxDs. Los Sistemas Operativos Windows incluyen VxDs que soportan los dispositivos hardware y software ms usuales; adems disponen de las herramientas necesarias para que el usuario pueda crear los que necesite para atender las caractersticas especiales de nuevos dispositivos o modificar los existentes [7]. La realidad es que en ltima instancia, los VxDs de Windows manejan absolutamente todos los dispositivos, desde el sistema de archivos a las tarjetas de sonido y dispositivos de red, ya que proporcionan soporte a un software bsico como son los servicios del sistema (encapsulados en las DLLs). A continuacin se relacionan los que actualmente pueden considerarse como estndar, junto con el acrnimo por el que son conocidos y los servicios que proporcionan: Dispositivo de acceso directo a memoria ("Virtual Direct Memory Access Device" VDMAD) Este dispositivo virtualiza los accesos directos a memoria DMAs ("Direct Memory Access"). El fichero fuente es VDMAD.VXD. Controlador MS-DOS ("DOS manager" DOSMGR) Controlador de dispositivo que virtualiza un Sistema MS-DOS. Intercambiador de pginas de memoria (PAGEFILE y PAGESWAP) Controlador de dispositivo encargado de manejar memoria virtual mediante un mecanismo de intercambio de pginas (page swapping). El fichero fuente es DYNAPAGE.VXD. Controlador programable de interrupciones virtual ("Virtual PIC Device" VPICD) Controlador de dispositivo que virtualiza el controlador programable de interrupciones PIC ("Programmable interrupt controller" H2.4).

Controlador de memoria virtual (V86MMGR) Controlador de dispositivo que virtualiza los modelos de memoria XMS (Extendida) y EMS (Expandida) para aplicaciones que corren en una mquina virtual x86 (V86).

Cargador virtual de dispositivos ("Virtual x Device Loader" VXDLDR) Este controlador es en realidad un servicio para el funcionamiento de las mquinas virtuales, ya que permite cargar y descargar dinmicamente (en tiempo de ejecucin) los propios controladores virtuales (VxDs).

Cache virtual ("Virtual CACHE" VCACHE) Controlador virtual que proporciona servicios de cach ( H5.2).

Coprocesador matemtico virtual ("Virtual Math Coprocessor" VMCPD) Controlador que virtualiza el coprocesador matemtico.

Dispositivo virtual de energa ("Virtual Power Device" VPOWERD) Este dispositivo virtualiza los servicios de ahorro de energa que son estndar en muchos dispositivos actuales. Por ejemplo, placas-base, controladores de disco, etc.

Shell virtual ("Virtual Shell Device" SHELL) Controlador de dispositivo que virtualiza servicios de shell ( 1.7.3). En este caso, el SHELL se refiere a servicios de envo y visualizacin de mensajes, monitorizacin de las propiedades de las mquinas virtuales y comunicacin con otras aplicaciones, en especial con libreras de enlazado dinmico (DLLs).

Interfaz virtual para el temporizador ("Virtual Timer API" VTDAPI) Controlador de dispositivos que virtualiza servicios de temporizado.

Temporizador virtual ("Virtual Timer Device" VTD) Controlador que virtualiza el reloj del sistema.

Servicios virtuales de Windows-32 ("VWIN32 Services" VWIN32) Este controlador que virtualiza servicios de VxDs de Windows 32.

4 Gestor de mquinas virtualesCon las premisas anteriores, resulta evidente que, en cada momento, deben existir tantas de estas mquinas virtuales como aplicaciones distintas estn en ejecucin. Esta tarea de mantenimiento, sincronizacin, creacin y destruccin de las MV, es realizada por un programa supervisor, el denominado VMM ("Virtual machine manager"), fichero VMM32.VXD en un Sistema Windows 32. El VMM trabaja con libreras de enlazado dinmico de 32 bits que proporcionan las funciones y recursos grficos que necesitan las aplicaciones Windows. Trabaja tambin con dispositivos virtuales a travs de controladores virtuales; todo ello en modo protegido, lo que permite a los dispositivos virtuales interceptar interrupciones y fallos, de forma que se puede controlar el acceso a los dispositivos y al software instalado por parte de las aplicaciones que corren en las MVs.

4.1 En realidad, este gestor de mquinas virtuales es el corazn del Sistema Operativo. Su tarea principal es crear, correr y controlar las MVs en las que corren las aplicaciones. Para ello ofrece un servicio de multiprograma preemptivo de tarea nica (single-threaded) en el que el tiempo de UCP se comparte entre las diversas mquinas virtuales. Cuando el VMM arranca, la primera mquina virtual que crea es la Mquina Virtual del Sistema SVM ("System virtual machine"), capaz de contener aplicaciones Windows de 16 bits [5], aunque tambin pueden crearse MVs para programas Win32 y aplicaciones MS-DOS si son necesarias. La SVM puede tener varias hebras de ejecucin, las dems solo pueden tener una. El proceso es como sigue: Inicialmente, el programa WIN.COM carga el fichero VMM32.VXD que contiene el VMM y los controladores virtuales por defecto. El VMM se carga en memoria extendida utilizando un controlador virtual; se inicializa a s mismo y a los controladores virtuales. A continuacin conmuta a un modo de ejecucin protegido [12]. El resultado es que el VMM y los controladores virtuales corren en un espacio contiguo de direcciones de 32 bits (flat model address space) denominado anillo 0 (ring 0). A partir del 80386, los procesadores Intel que "motorizan" los PC's tienen 4 niveles de proteccin interna en forma niveles de privilegio denominados anillos ("Rings") numerados de 0 a 3. El anillo 3 es donde residen las aplicaciones Windows; el anillo 0 es donde reside el cdigo con mayores privilegios. Por ejemplo el kernel del SO y los programas VxDs que pueden manejar directamente los puertos de E/S ( H2.5). Un cdigo del anillo 0 no solo puede interceptar directamente las E/S de cualquier puerto fsico, tambin redireccionarlas en caso necesario, lo que le permite virtualizar o emular cual

0.3 El HardwareEsta pgina ha sido movida.

Toda la seccin dedicada al Hardware ha sido reestructurada. Consulte la seccin "Tecnologa del PC" en la seccin de Tutoriales de la pgina inicial ( Tutoriales).

1 Programacin C++"No programming language can be all things to all programers. No matter how many features a language has, there's always someone who wants just one more". Dan Saks "C/C++ Users Journal" Enero 1990.

1 Observaciones y comentarios sobre los lenguajes C/C++Se ha dicho: "C++ es un lenguaje potente, pero a veces no es precisamente un paseo por el parque... De acuerdo, de acuerdo, es orientado a objetos. Correcto. Yo personalmente conozco gente que ha trabajado toda una semana en herencia mltiple, para retirarse completamente frustrado a Carolina del Norte a limpiar cochineras". Joshua Trupin: MSDN Magazine, Septiembre 2000 www.msdn.microsoft.com/msdnmag/default.asp "C hace fcil dispararse en los propios pies; C++ lo hace ms difcil, pero cuando lo haces, te vuela la pierna completa". Stroustrup. C++ es un lenguaje difcil en el que puede existir una lnea muy tenue entre una caracterstica y un 'bug' ". Programming in C++: Rules and Recommendations, Ellemtel Telecommunication Systems Laboratories, Sweden. "Para nuestro gusto C++ ya es demasiado largo y complicado". Comit de estandarizacin del C++. "Tiene una sintaxis compleja, semntica sutil y una temible reputacin". Steve Donovan "Scripting C++". InformIT Marzo 2002 "Todos los hombres ascienden en la escala hasta alcanzar su mximo nivel de ineficacia". Dr. Laurence J. Peter. "La pirmide de Peter". Ed. Plaza & Janes S.A. Barcelona [5]. Creo que C++ es un magnfico ejemplo de que lo anterior es aplicable tambin a los lenguajes de programacin. En efecto, C++ es una muestra de como las cosas pueden seguir mejorndose hasta llegar a un nivel de complejidad que las hace prcticamente inutilizables por el comn de los mortales, a no ser que les dediquen un mnimo de 500 horas para empezar a entenderlas [9]. Como botn de muestra, incluyo un comentario encontrado en Amazon [1] sobre el libro "The C++ Programming Language" (TC++PL para los ntimos) del ya citado Stroustrup: "Estoy en mi tercer ao de aprendizaje de C++ (s, se tarda un tiempo en conocer el C++, en conocerlo realmente), todava lo leo una y otra vez, y cada vez encuentro ms y ms cosas tiles y consejos importantes", Caliv Nir (Israel).

Afortunadamente parece que las cosas vuelven a su cauce. Hace poco tiempo que algunos se dieron cuenta que el asunto haba empezado a desmadrarse, as que empezaron a quitarle cosas y a simplificarlo..., Estaba naciendo Java! (es tambin la explicacin "oficial" de Microsoft para inventar el C# ;-) Nota: Esta es la situacin por el momento, pero no os preocupis. Vemos como Java se est perfeccionando a marchas rpidas, con lo que a no tardar ser tan complejo como C++ y habr que volver a inventar algo ms sencillo...[4] En cuanto al C#: Sea bienvenida cualquier mejora!!. Aunque se me ocurre que no estara de ms aquello de mantener una cierta "diversidad gentica" en la informtica, mucho me temo que al paso que vamos acabemos todos vestidos de gris con el "Libro Rojo" en el bolsillo :-( [6]

2 Resea histricaDesde un punto de vista histrico, el C es anterior al C++, aunque el estndar C++ fuera publicado antes que el de C [2], de modo, que paradjicamente el hijo influy en el estndar del padre. As pues, la propuesta de ANSI C recogi algunas de las normas del C++. Ambos nacieron en los prestigiosos laboratorios Bell de la AT&T (American Telephone and Telegraph) en Murray Hill (New Jersey USA) [3]. El primero de la mano de Brian W. Kernighan y Dennis M. Ritchie (la "K" y la "R" de K&R, siglas con las que se les conoce), el segundo es de Bjarne Stroustrup. La primera edicin del libro: "El lenguaje de programacin C" de K&R es de 1978. Por su parte la primera edicin de: "El lenguaje de programacin C++" de Stroustrup es de 1986. El propio Stroustrup reconoce que comenz a trabajar en su diseo en 1979; justo un ao despus de la publicacin del clsico de K&R. Las primeras versiones en uso del lenguaje (bajo el nombre de "C con clases") en el entorno de los departamentos de investigacin de la AT&T se remontan a 1980. La primera utilizacin del lenguaje fuera del entorno de investigacin data de Agosto de 1983. La designacin actual C++ fue acuada en el verano de 1.983 por Rick Mascitti. El primer compilador comercial fue lanzado en Octubre de 1985. Como todos los lenguajes (naturales y de programacin), el C++ es un resultado de la evolucin; de forma que recoge influencia de sus ancestros, algunos de los cuales ya se han sealado ( 0.1). Adems es en s mismo un producto en evolucin. Las ltimas aportaciones datan de los 80, y se refieren principalmente al mecanismo de excepciones y a las plantillas ("Templates"). Sin duda la mejor fuente de informacin sobre la historia y evolucin de este lenguaje es su propio inventor, de modo que remitimos al lector a sus propias palabras D&EC++.

2.1 Situacin actualDespus de dcadas de aparente inactividad por parte del Comit Internacional encargado de elaborar el estndar, el 25 de Marzo de 2011, los medios especializados de todo el mundo, se hacan eco de que finalmente, el comit ISO para el C++ haba sido aprobado el ltimo borrador del nuevo estndar en su reunin de primavera en Madrid. Esta versin, en la que se haba estado trabajando intensamente, era conocida como C++09 porque se supona que sera aprobada en el 2009. Sin embargo, el proceso sufri sucesivos retrasos, de forma que finalmente era conocido -quizs un poco humorsticamente- como C++0x, en relacin a que no se saba cuando aparecera. Finalmente, si las

cosas discurren como es de suponer, la aprobacin ocurrir dentro de este ao, as que el prximo estndar ser el C++2011. Nota: a la hora de escribir estas lneas, la ltima revisin publicada lo era bajo el ttulo ISO_C0x_final_draft. Un documento .PDF de nada menos que 11 MB.

Podra decirse que despus de vivir una poca dorada, la popularizacin y uso del C++ haba sufrido una cierta ralentizacin en favor de nuevas modas y nuevos lenguajes, y que incluso su desarrollo y evolucin haban quedado estancados desde los aos 70. Sin embargo, esta aparente "inactividad" ha estado lejos de ser real y el nuevo estndar incluye un sinnmero de avances conceptuales y materiales -en forma de nuevas libreras- que lo colocan de nuevo en una posicin puntera dentro del mundo de la programacin, en especial en lo que respecta a grandes sistemas. Precisamente, la razn principal de los retrasos ocurridos en el proceso de aprobacin del nuevo estndar, tienen mucho que ver con la magnitud, nmero y calado de las nuevas extensiones y libreras. Con independencia de que los cambios se hagan oficiales, muchas de las nuevas herramientas ya estaban en la calle de forma ms o menos oficial, de la mano de los fabricantes de compiladores. De forma que se habla incluso de un "renacimiento" del C++ como herramienta y concepto. En este sentido, es interesante la entrevista de Craig Symonds y Mohsen Agsen, dos profesionales que sin duda gozan de una buena perspectiva del mundo de la programacin actual: "C++ Renaissance" o este otro comentario: "C++ Renaissance: First Symptoms of Contagion in Traditionally Non-Native Teams".

3 Estudiar C++"C++ should not be for beginners, as it is better to learn the principles from a clearer language than be confused by what all the syntactic knobs and dials, and superfluous constructs do in C++. As for courses, C++ has proven so difficult to learn that you need lots of courses". Ian Joyner "C++??" ( [Joyner-96]).

Para tener una perspectiva histrica parece natural estudiar primero C y despus C++, con lo que se empiezan a ver las diferencias y salvedades entre uno y otro. Este es el enfoque de algunos libros; de hecho el ya comentado manual de ayuda "C++ Builder Languaje Guide" sigue ms o menos esta pauta. Dedica muchos comentarios a las diferencias entre C y C++, y al final dedica un captulo a los asuntos que son exclusivos de este ltimo. Algunos de estos libros incluso hacen comentarios curiosos, que ya solo tienen sentido desde un punto de vista histrico. Por ejemplo, citan que los ficheros fuente de los programas C deben tener nombres con terminacin ".c" y los de C++ terminaciones ".cc" o ".cpp", lo que es superfluo para los compiladores actuales. Por ejemplo, Borland C++Builder puede compilar perfectamente fuentes .c como C o como C++ con un simple indicador (-P) en la orden de llamada. Nota: Otros, como los compiladores GNU C/C++, permiten utilizar ambos criterios. Adems de poder utilizar una directiva explcita, pueden distinguir el tipo de compilacin por la terminacin de los fuentes. Por ejemplo, las terminaciones .c son tratadas y compiladas como fuentes C, mientras que los sufijos .C; .Cpp; .C++; .cc son compilados como C++. Otros compiladores C+

+ Unix como Solaris de SUN o HP-UX pueden compilar fuentes con terminaciones .C, .c, .cc, .cpp o .cxx.

C++ no naci como un lenguaje orientado a objetos puro. Ms bien se trataba de aadirle "objetos" al clsico C de K&R, ya que el nuevo paradigma de programacin "con objetos", se mostraba como un paso adelante en el arte de la programacin. De hecho, aunque C++ introduce nuevas palabras clave y operadores para manejo de clases, algunas de sus extensiones tienen aplicacin fuera del contexto de programacin con objetos (fuera del mbito de las clases). Esta es tambin la causa de que C++, junto con las magnficas cualidades del C, arrastre algunas de sus deficiencias. Sigue siendo permisivo (aunque menos) "intentando hacer algo razonable con lo que se haya escrito", solo que a veces, sin que nos demos cuenta, se pasa de listo. Por supuesto, con ambos lenguajes resulta cierto el viejo aforismo informtico: "Un programa no hace lo que queremos que haga, sino lo que le hemos dicho que haga". En el caso del C++ quizs tendramos que aadir: "Mas lo que l decide por su cuenta"... :-) Cuando se trata de programas sencillos, que no requieren necesariamente de las caractersticas "++" de la POO, surge inmediatamente la cuestin si ser mejor hacerlo en C o en C++, Cual es mas rpido? Cual proporciona un cdigo ms compacto? Segn dicen los expertos, con los actuales compiladores el resultado est en tablas. Las diferencias se mantienen en un margen de 5% y por lo general los resultados se encuentran a la par. Sin embargo, en cuanto se trata de escribir programas algo ms complicados que mostrar el consabido "Hola mundo", las diferencias de productividad son notables, con una indiscutible ventaja a favor del C++. Nota: En cierta forma esta discusin, usar C++ o C, es un poco bizantina, dado que a efectos prcticos el segundo es un subconjunto del primero (de hecho, los compiladores GNU C y C++ estn integrados en un solo producto). Ms bien cabra discutir si, utilizando C++, merece o no la pena usar los recursos de la POO.

Dicho esto queda una cuestin: Aunque estudiar C++ a partir de C proporciona una perspectiva histrica, una visin del desarrollo del lenguaje, de como fueron sucediendo las cosas. En mi opinin, hacerlo de esta forma no solo es innecesario sino quizs contraproducente para el estudiante normal. No digo que est de ms, solo que es un camino innecesariamente farragoso. Me parece que se trata de una situacin parecida a la de alguien que quisiera aprender Espaol empezando por aprender Latn. Por supuesto no estara de ms si tiene tiempo y gana, si se es un lingista. Se tendr un mayor conocimiento del lenguaje y su evolucin; se comprender mejor el porqu de ciertas cosas. Pero para el extranjero que simplemente necesita entenderse en Espaol, es evidentemente innecesario. Digo esto, porque al ser la POO un paso superior de abstraccin respecto de los primeros sistemas de "traslacin de frmulas". Un paso en la evolucin de los lenguajes de programacin, con un cuerpo de doctrina ya suficientemente consolidado y coherente, las cosas pueden explicarse partiendo directamente del estudio de C++ y aprovechando todas sus posibilidades desde el principio. Incluso dira que intentando "olvidarse" del viejo C que an pervive en su interior. Es perfectamente factible introducir el concepto general de clase y objeto, para decir despus que las estructuras son una "clase" especial que tiene estas y las otras propiedades (todas sus propiedades son pblicas), sin necesidad de introducir el concepto tradicional de "estructura" C, para luego decir que en C++ son un tipo especial de clase... Esto tendr la ventaja adicional de permitir al nefito empezar a pensar "en objetos" con ms rapidez.

Nota: Tena ya una gran cantidad de material recopilado cuando me di cuenta de esta realidad, as que tuve que volver a rehacer una parte de la estructura de este "libro", volviendo a empezar directamente con el C++, e intentando hacer la menor cantidad de referencias al viejo C. A la hora de escribir estas lneas todava no est terminado el trabajo (no se si lo estar algn da), pero esta es la intencin, de forma que si cuando caiga en manos del lector quedan referencias al viejo C, que no sean meramente histricas o comparativas, sepa que se debe simplemente a un trabajo inacabado. Inicio. [1] Ya sabis que esta tienda on-line tiene una caracterstica (que se va extendiendo a otras muchas): Los lectores pueden incluir comentarios y opiniones personales sobre los libros. Tiene la ventaja de que no son comentarios interesados de la editorial. Si sabemos leer entre lneas, esta posibilidad puede ser de mucha ayuda a la hora de evaluar el libro. Sin embargo, la mejor fuente de informacin (en ingls) sobre C++, incluyendo evaluacin de libros, es la Asociacin de usuarios C y C++ ACCU (The Association of C and C++ Users), seccin "Book reviews".

[2] El instituto ANSI (American National Standards Institute) estableci en 1.989 el comit denominado J16 para estandarizar el C++. Paralelamente, la organizacin internacional encargada de los estndares ISO (International Standards Organization www.iso.ch), haba creado el comit WG14 que trabajaba en el mismo sentido. Finalmente, el comit americano recomend que se adoptara el estndar ISO como estndar americano. La primera versin del Estndar data de principios de 1997; la ltima (por el momento) se ratific en Marzo de 1998, y se public en Septiembre del mismo ao por el ANSI y el ISO. De forma que el "Estndar C++" es la norma ISO/IEC 14882 (IEC es acrnimo de "International Electrotechnical Commission", uno de los grupos de trabajo del ANSI). La Norma est disponible para descarga en un documento .PDF de 2.794 KB y 732 pginas, previo pago de unos 18 $ US: National Committee for Information Technology Standards (puede pagarse con tarjeta de crdito). La versin impresa es mucho ms cara!!. Tambin puede descargarse gratis uno de los ltimos borradores conocidos como DWPs ("Draft Working Papers"): ftp://ftp.research.att.com/dist/c++std/WP/CD2. Hay que advertir no obstante, que la Norma dista mucho de ser un texto adecuado para aprender C++. [3] "Bell Labs"; durante mucho tiempo los mayores y mejores laboratorios de investigacin industrial del mundo. Adems del origen de los lenguajes C y C++, entre otras "naderas", fueron tambin la cuna del transistor; del Sistema Operativo UNIX, y de las primeras clulas fotovoltaicas con utilidad prctica. [4] Mucho despus de escribir esta nota, he encontrado esta confirmacin: "I predicted the growth of Java complexity and don't condemn it, I consider complexity an inevitable consequence of serving a large community". Bjarne Stroustrup "The State of the Languaje".

[5] Como lectura complementaria tambin recomendara: "La Ley de Murphy", de Arthur Bloch. Ed. Temas de Hoy S.A. Madrid. Una de mis lecturas favoritas y sin duda un buen libro "de cabecera" para los programadores C++.

[6] Si no entiendes la referencia no te preocupes... Sencillamente eres demasiado joven!. [9] Hace poco lea el comentario del directivo de una gran multinacional, quejndose que el tiempo de entrenamiento estimado para que un programador C++ fuese verdaderamente eficiente era de tres aos, mientras que la NASA estimaba en 18 meses el tiempo de preparacin de un astronauta.

1.1 Introduccin a la POO1 Qu es eso de los "Objetos"?En la programacin tradicional exista una clara diferenciacin entre los datos y su manipulacin, es decir, el conjunto de algoritmos para manejarlos. Los tipos de datos eran muy simples; todo lo ms nmeros de diverso tipo y caracteres (aislados o agrupados en cadenas o matrices), pero nunca elementos heterogneos. La situacin para el programador era que el lenguaje pareca decirle: estos son los posibles contenedores para la informacin que debes manejar (los tipos de datos soportados por el lenguaje) y aqu aparte, las operaciones que puedes realizar con ellos (las operaciones definidas para dichos datos). Por ejemplo, si son datos numricos las operaciones aritmticas, las comparaciones, las asignaciones, etc. Con estas herramientas el programador construa su cdigo, y para poner un poco de orden en l