title: Commodore 64

text: En Argentina la firma Drean, un fabricante de electrodomésticos argentino, compró en 1982 la licencia para fabricar localmente la C64, comenzando la producción en su planta en la provincia de San Luis en 1983. Luego, ante al éxito de ventas, fabricaría los modelos 16 en 1985 (con poco éxito de ventas), 64C a fines de 1986 (con la mayoría de sus partes fabricadas localmente) y 128 a inicios de 1986 (con unos pocos cientos de unidades producidas).


title: Commodore 64

text: El modelo 64 se asemejaba a su par estadounidense, diferenciándose exteriormente en las siglas de encendido y en el anexo de la palabra "Drean" anteponiéndose a Commodore 64 en la carcasa de la máquina. Las mismas diferían de color en sus años de fabricación, algunas respetaban a las de Estados Unidos y otras no, ya que los plásticos se fabricaban localmente. Internamente la versión Argentina tenía salida de video PAL-N en lugar de NTSC; además, por este motivo, tenía una frecuencia de reloj mayor, lo que se podía notar en algunos juegos ya que estos fueron diseñados en su mayoría para la versión estadounidense. Otra diferencia destacable era la fuente de alimentación adaptada para 220V en lugar de los 110V originales. Estos clones legítimos eran de excelente calidad, aunque algunos usuarios se quejaban de la dureza del teclado, y 8 de cada 10 "Commodores" vendidas llegaron a ser de Drean. La Drean Commodore 64C era internamente igual al modelo 64. La diferencia radicaba en el formato de la carcasa, que era más ergonómica, similar al teclado del modelo 128. A diferencia de los otros modelos, incluía el disquete de GEOS. Drean también importó software, que era distribuido en forma de cartuchos, casetes y disquetes, con su marca o bajo la marca "Peek".


title: Commodore 64

text: La producción finalizó a mediados de 1988, cuando Commodore International le retiró la licencia a Drean, luego de haber producido unas 300.000 unidades.


title: Commodore 128

text: El ordenador doméstico/personal "Commodore 128" ("'"C128, CBM 128, C=128) fue la última máquina de 8 bits comercializada por Commodore Business Machines (CBM). Presentada en enero de 1985 en el CES de Las Vegas, apareció tres años después de su predecesor, el exitoso Commodore 64. El diseñador principal del hardware de la C128 fue Bil Herd.


title: Commodore 128

text: El C128 es un sucesor significativamente expandido del C64 y, a diferencia del anterior Plus/4, casi completamente compatible con el C64. Incluye 128 KB de RAM, en dos bancos de 64 KB y una salida de vídeo RGBI de 80 columnas (gestionada por el chip 8563 VDC con 16 KB de RAM de vídeo dedicado), al igual que una caja y un teclado sustancialmente rediseñados, el cual incluía cuatro teclas de cursores (los Commodore anteriores tenían dos, requiriendo pulsar mayúsculas para mover el cursor hacia arriba o a la izquierda), además de las teclas Alt, ayuda, escape, tabulador (no presente en los modelos anteriores) y un teclado numérico. La falta de teclado numérico, tecla Alt y tecla escape en el C64 era un problema con algunas programas de productividad en CP/M cuando se usaban con el cartucho Z80 del C64. Algunas de las teclas añadidas equivalen a las presentes en el teclado de la IBM PC. Mientras que el modo de 40 columnas del C128 duplica el del C64, 1 KB extra de RAM de color está disponible para los programadores, ya que está multiplexada en la dirección de memoria 1. La fuente de alimentación representa una gran mejora con respecto al diseño poco fiable de la fuente del C64, siendo más grande y equipada con un ventilador de refrigeración y un fusible reemplazable. En lugar de un solo microprocesador 6510 como en el C64, el C128 incorpora un diseño de doble CPU. La primaria, una 8502, es una versión ligeramente mejorada de la 6510, capaz de subir el reloj hasta 2 MHz. La segunda CPU es un Zilog Z80, que se usa para hacer funcionar software CP/M, al igual que para iniciar el modo de selección de sistema operativo durante el arranque. Los dos procesadores no pueden trabajar de manera simultánea, por lo que el C128 no es un sistema multiproceso. El C128 tiene tres modos operativos: modo C128 (modo nativo), en el que funciona a 1 o 2 MHz con la CPU 8502 y dispone de los modos de texto de 40 y 80 columnas; modo CP/M, que usa el Z80 en modo texto tanto de 40 como de 80 columnas y el modo C64, que es prácticamente compatible al 100% con el anterior ordenador. La selección de estos modos está implementada a través del chip Z80, el cual controla el bus en el arranque inicial y comprueba si está presente algún cartucho C64/C128 y si la tecla Commodore (selector de modo C64) está activa durante el arranque. Basado en lo que encuentra, cambiará al modo de operación apropiado.


title: Commodore 128

text: El C128D es considerado único debido a que su placa madre soporta cuatro tipos diferentes de RAM:


title: Commodore 128

text: Además de 3 procesadores (8502 como principal, Z80 para CP/M y un 6502 para la disquetera) y dos chips de vídeo diferentes (VIC-IIe y VDC).


title: Commodore 128

text: Mientras las capacidades gráficas y de sonido del C64 eran consideradas generalmente excelentes, los operativos de marketing en la dirección de Commodore estaban preocupados por sostener (si no prolongar) el atractivo de los ordenadores caseros entre los no-programadores. Estos operativos sintieron que el la pantalla de 40 columnas del VIC-II, aunque excelente para juegos, podía ser inadecuada para aplicaciones de productividad como tratamiento de textos. Además, sentían que las nuevas capacidades de sonido y gráficos tendrían un manejo pesado si se controlaban exclusivamente a través de las instrucciones estándar POKE y PEEK, así que se embarcaron en reescribir el BASIC 2.0 para que tuviera instrucciones que reflejaran con más precisión sus capacidades. Además, el aumento de la capacidad de las unidades de disco en los mercados competidores (como las dedicadas a los compatibles PC y los Apple) llevó a los oficiales de alto rango de Commodore a preocuparse por el siguiente paso. Los diseñadores de la C128 tuvieron éxito en resolver la mayoría de esas preocupaciones. Un nuevo chip, el VDC, provee al C128 con una pantalla de 80 columnas compatible con la norma CGA (también llamada RGBI por" Red-Green-Blue-Intensity", rojo-verde-azul-intensidad). El nuevo microprocesador 8502 es completamente retrocompatible con el 6510 del C64, pero puede funcionar al doble de velocidad si se desea. Aun así, el chip VIC-II que controla la pantalla de 40 columnas no puede operar a la mayor velocidad de reloj, así que la pantalla de 40 columnas aparece distorsionada en modo codice_1. En el modo 80 columnas, el editor toma ventaja de las características del VDC para permitir texto parpadeante y subrayado, activado mediante códigos de escape. Los modos de 40 y 80 columnas son independientes y pueden estar activos a la vez. Un programador con una pantalla de vídeo compuesto y otra RGB podría usar una de las pantallas como "bloc de notas". La pantalla activa puede ser intercambiada con ESC-X. Se añadió un botón de reset al sistema. El BASIC 2.0 del C64 fue reemplazado por el BASIC 7.0, que incluye instrucciones diseñadas específicamente para usar las ventajas de la máquina. Un editor de sprites y un monitor de código máquina fueron añadidos posteriormente para beneficio de los programadores . La parte del editor de pantalla del kernel fue mejorada aún más para soportar un sistema de ventanas rudimentario y fue relocalizada en una ROM separada. En modo 80 columnas el editor hace uso de las mejoras del VDC para permitir el parpadeo y subrayado de texto, activado mediante códigos de escape. Un botón de reinicio fue añadido al sistema. Dos nuevas unidades de disco fueron presentadas junto con la C128: la efímera 1570 y la 1571. Más adelante, se presentó la unidad 1581 de 3'5 pulgadas. Todas estas unidades son más fiables que la 1541 y prometían unas mejores prestaciones mediante un "modo ráfaga". La unidad 1581 también tiene más RAM en placa que sus predecesores, haciendo posible abrir un mayor número de ficheros simultáneamente. El C128 también tiene el doble de RAM que el C64 y una mayor proporción está disponible para la programación en BASIC, debido al chip MMU con cambio de bancos. Esto permite que el código de los programas BASIC sean almacenado por separado de las variables, mejorando mucho la habilidad de la máquina para manejar programas complejos, acelerando la recolección de basura y facilitando el despulgamiento para los programadores. Un programa en ejecución puede recibir un codice_2, inspeccionar la variables o alterarlas en modo directo y la ejecución se continúa usando la instrucción BASIC codice_3. La ROM del C128 contiene un huevo de pascua: Introduciendo el comando "SYS 32800,123,45,6" en modo nativo, revela una pantalla de 40 columnas con un listado y un mensaje de los desarrolladores principales de la máquina. También escribiendo las instrucciones QUIT u OFF, produce un "?UNIMPLEMENTED COMMAND ERROR". Estas instrucciones existen en previsión de un ordenador portátil con pantalla LCD nunca producido y están pensados para salir del intérprete BASIC e ignorar el teclado durante la ejecución de programas sensibles, respectivamente. Las mayores capacidades del hardware del C128, especialmente el incremento de la RAM, la resolución de pantalla y la velocidad del bus serial, la convirtieron en la plataforma preferida para usar el sistema operativo gráfico GEOS.


title: Commodore 128

text: El segundo de los dos procesadores es el Zilog Z80, el cual permite al C128 funcionar en CP/M. El C128 fue vendido con CP/M 3.0 (también conocido como CP/M Plus, retrocompatible con CP/M 2.2) y el emulador del terminal ADM31/3A. Un cartucho con el CP/M ya estaba disponible para el C64, pero era caro y está limitado a los programas en discos con formato Commodore. Para tener disponible una gran biblioteca de aplicaciones instantáneamente en su lanzamiento, el CP/M del C128 y su unidad de disquetes 1571 fueron diseñadas para leer casi todos los programas en CP/M específicos de Kaypro sin modificaciones. Desafortunadamente, el C128 era notablemente más lento trabajando en CP/M que la mayoría de sistemas CP/M dedicados, ya que el procesador Z80 funcionaba a una velocidad efectiva de solo 2 MHz (en lugar de los más comunes 4 MHz) y a su uso de CP/M 3.0, cuya complejidad lo hace inherentemente más lento que el anterior y más extendido sistema CP/M 2.2. A partir del código fuente de la implementación de CP/M para el C128, queda claro que los ingenieros planearon originalmente que fuera posible hacer funcionar a CP/M también en el modo "rápido", con la salida de 40 columnas desconectada y el Z80 funcionando a una velocidad efectiva de 4 MHz. A pesar de ello, esta característica no funcionó correctamente en la primera generación del C128. Una característica inusual del C128 entre los sistemas CP/M es que algunos de los servicios de bajo nivel de la BIOS son ejecutados por el 8502 en lugar de por el Z80. Este le transfiere el control al 8502 después de situar los parámetros pertinentes en las posiciones de memoria designadas. El Z80 se apaga entonces, siendo despertado por el 8502 al completar la rutina de la BIOS, con el/los valor/es de estado disponibles en la RAM para su inspección. El CP/M fue posiblemente el menos usado de los tres posibles modos de operación. Pensado para darle al nuevo ordenador una gran librería de programas de grado profesional, los cuales no tenía Commodore, el CP/M ya había pasado hacía tiempo su mejor momento cuando se presentó el C128. Además, CP/M es muy diferente del Commodore DOS incluido en la ROM de las unidades de disco.


title: Commodore 128

text: Incorporando completamente el BASIC original del C64 y el kernel, el C128 consigue prácticamente el 100% de compatibilidad con el Commodore 64. El modo 64 puede ser accedido de tres maneras:Poner a tierra las líneas /EXROM y/o /GAME del puerto del cartucho hacer que el ordenador automáticamente inicie en el modo C64. Esta característica duplica fielmente el comportamiento del C64 cuando un cartucho (como el BASIC de Simons) es enchufado en el puerto y activa esas dos líneas; pero, a diferencia del C64, donde el cambio del mapeado de memoria de estas líneas se realiza directamente en hardware, el firmware de arranque del Z80 del C128 comprueba las líneas al arrancar y entonces cambia de modo según sea necesario. Los cartuchos de modo nativo C128 son reconocidos e iniciados por la comprobación del kernel en las posiciones definidas en el mapa de memoria. El modo C64 casi duplica exactamente las características del hardware del C64. Muchas de las características adicionales del C128 están desactivadas o no disponibles en este modo. La pantalla de 80 columnas, el modo rápido, la MMU y el BASIC 7.0 no están disponible en este modo. Las 4 teclas de cursor en la parte superior del teclado no se reconocen, obligando al usuario a usar la incómoda disposición mediante mayúsculas del C64, que están incluidas en la parte inferior del teclado. También se ignoran el teclado numérico y la fila superior de teclas, excluyendo las teclas F1 a F8. Algunas de estas características pueden ser reactivadas mediante programas, pero los programas comerciales las ignorarían. Algunos de los pocos programas del C64 que fallan en un C128 funcionan correctamente cuando se pulsa la tecla codice_5 (o la tecla ASCII/Nacional en los modelos internacionales del C128). Esto tiene que ver con el mayor puerto E/S de la CPU del C128. Donde la tecla codice_6 presente en ambas máquinas es simplemente una parte mecánica que bloquea la tecla codice_7 izquierda, la tecla codice_8 en el C128 puede ser leída mediante el puerto E/S incluido en el 8502. Algunos programas del C64 se confunden con este bit de E/S extra, manteniendo la tecla codice_8 pulsada se fuerza la línea de E/S, igualando la configuración del C64 y resolviendo el problema. Un puñado de programas del C64 que escriben en $D030 (53296), a menudo como parte del bucle de inicio de los registros del chip VIC-II. Este registro de mapeo de memoria, no usado en el C64, determinado por la velocidad del reloj del sistema. Debido a que este registro ya es completamente funcional en el modo C64, una escritura inadvertida podría contaminar la pantalla de 40 columnas al cambiar la CPU a 2 MHz, en la cual la velocidad del reloj del procesador de vídeo VIC-II no puede producir una pantalla coherente. Afortunadamente, muchos programas sufren este fallo. En julio de 1986, "COMPUTE!'s Gazette" publicó un programa escrito que explotaba esta diferencia usando una matriz de interrupciones para permitir el modo rápido cuando se alcanza la parte inferior de la pantalla visible y entonces desactivarlo cuando el retrazado de la pantalla vuelve a empezar en la parte superior. Usando el reloj más alto durante el periodo de retorno vertical, la pantalla de vídeo estándar se mantiene mientras se aumenta la velocidad de ejecución en un 20%. Un modo de diferenciar entre un C64 y un C128 operando en modo C64, típicamente usado desde dentro de un programa en funcionamiento, es escribir un valor diferente a codice_10 en la dirección codice_11, un registro que es usado para decodificar las teclas extra del C128 (el teclado numérico y algunas otras teclas). En el C64 esta localización de memoria siempre contiene el valor $FF, sin importar lo que se escriba en él, pero en un C128 en modo C64, el valor de la localización (un registro de mapeo de memoria) puede ser cambiado. Así, comprobar el valor de la posición después de escribir en él revelará la verdadera plataforma de hardware.


title: Commodore 128

text: Para manejar la relativamente grande cantidad de ROM y RAM, diez veces el espacio de direcciones de 64 KB del 8502, el C128 usa la MMU 8722 para crear diferentes mapas de memoria, en los que diferentes combinaciones de RAM y ROM son mostradas dependiendo del patrón de bits escrito en el registro de configuración de la MMU en la dirección de memoria $FF00. Las unidades de expansión de RAM de Commodore utilizan un controlador DMA externo para escribir y leer uno o más bytes (hasta rangos completos de bytes) entre la memoria RAM del C128 y la RAM de la unidad de expansión. Otra característica de la MMU es que permite relocalizar la página cero y la pila, gracias al registro de Página Directa.


title: Commodore 128

text: La compleja arquitectura del C128 incluye cuatro tipos de acceso diferente a la RAM (128 kB de RAM principal, 64 kB VDC de Video RAM, 2 kNibbles de la RAM del VIC-II Color, 2 kB de RAM de la disquetera, 128 o 512 kB de RAM de la REU), dos CPUs (la 8502 principal, la Z80 para el CP/M; el 128D también incorpora un 6502 en la unidad de disco) y dos chips de vídeo diferentes (VIC-IIe y VDC) para sus variados modos de operación.


title: Commodore 128

text: A finales de 1985 Commodore lanzó al mercado europeo una nueva versión del C128 con un chasis rediseñado. Llamado Commodore 128D, este nuevo modelo europeo presenta un chasis de plástico con un asa de transporte en un costado, incorporando una unidad de disco 1571 en el chasis principal, reemplaza el teclado integrado por uno separable y añade un ventilador de refrigeración. El teclado incluye dos patas plegables para cambiar el ángulo de escritura. En la última parte de 1986, Commodore lanzó una versión del C128D en Estados Unidos y Europa llamada C128DCR ("cost reduced", coste reducido). El modelo DCR incluye un chasis de acero estampado en lugar de la versión de plástico del C128D (sin asa de transporte), una fuente de alimentación modular similar a la incluida con el C128D, al igual que un teclado separado y una disquetera 1571. En la placa madre, Commodore consolidó algunos de los componentes para ahorrar costes de producción y reemplazó el controlador de vídeo 8563 con el técnicamente más avanzado MOS Technology 8568 (también incluido en los algunos modelos posteriores de C128D). Como medida de ahorro, el ventilador de refrigeración que integraba el modelo D fue eliminado, aunque los enganches en la fuente de alimentación se mantuvieron. Internamente, la ROM del C128DCR, llamada "ROM 1986" por la fecha de copyright mostrada en la pantalla de inicio, contiene muchas correcciones de errores, incluyendo el famoso donde el carácter 'Q' se mantiene como minúscula cuando CAPS LOCK está activo y el 8568 VDC está equipado con 64KB de RAM de vídeo, el máximo direccionable, igual a cuatro veces lo que el C128 original. El incremento en RAM de vídeo hizo posible, entre otras cosas, generar gráficos de alta resolución con una paleta de color más flexible, aunque poco software comercial saco ventaja de esta capacidad. A pesar de las mejoras en las capacidades de vídeo RGB, Commodore no actualizó el BASIC 7.0 con la posibilidad de manipular gráficos RGB. Manejar el VDC en modo gráfico continuó requiriendo el uso de llamadas a primitivas del editor de pantalla en ROM (o sus equivalentes en ensamblador), o usando extensiones de terceros del BASIC. La extensión más popular fue el "BASIC 8" de Free Spirit Software, que añadió comandos para gráficos VDC de alta resolución al BASIC 7.0. BASIC 8 estaba disponible en dos discos (disco de editor y disco de runtime) y con un chip ROM para instalación en el zócalo de ROM de funciones interno del C128.


title: Commodore 128

text: Debido a que el C128 puede hacer funcionar virtualmente todo el software del C64 y con la siguiente generación, los ordenadores caseros de 16 y 32 bits, principalmente el Commodore Amiga y el Atari ST, ganando terreno, se creó relativamente poco software para el modo nativo del C128 (probablemente del orden de 100 a 200 títulos comerciales, más los programas en dominio público y escritos en las revistas) Mientras el C128 vendió 4 millones de unidades entre 1985 y 1989, su popularidad palidece en comparación con la de su predecesor. De esto se culpó a la falta de software nativo y al marketing menos agresivo de Commodore, enfocado mayormente en el Amiga en ese tiempo. Una explicación adicional puede encontrarse en el hecho de que el C64 vendió muchas unidades a la gente interesada principalmente en videojuegos, a los que la cara C128 no les daba demasiado valor como para actualizar. Unas pocas aventuras de Infocom tomaron ventaja de la pantalla de 80 columnas e incrementaron la capacidad de memoria y unos cuantos juegos del C64 fueron portados de manera nativa, como Kickstart 2 y The Last V8 de Mastertonic y Ultima V de Origin Systems, pero la mayoría de juegos funcionaban en modo 64. El C128 fue ciertamente una mejor máquina de negocios que el C64, pero no mucho mejor como máquina de juegos y la gente que quería una máquina para negocios compraba los compatibles IBM PC casi en exclusiva durante el tiempo en que el C128 fue vendido. Con su lenguaje de programación BASIC avanzado, su compatibilidad con CP/M y sus paquetes de software nativo "amistosos con el usuario" como Jane, Commodore intentó crear un mercado para negocios pequeños para el C128, incluso marcando "Personal Computer" en la caja, pero esta estrategia no tuvo éxito frente a sus contemporáneas compatibles IBM PC de bajo coste, como la Leading Edge Model D y la Tandy 1000 que, en algunos casos, se vendían por menos que un sistema C128 completo. Hubo un programa CAD profesional, "Home Designer" de BRiWALL, pero de nuevo, la mayor parte de ese trabajo se hacía en PC durante la vida comercial del C128. La principal razón por la que se mantuvieron las ventas del C128 bastante bien fue probablemente porque era una máquina mejor para los aficionados a la programación que el C64. También, cuando el C128(D/DCR) paró su producción en 1989, se informó que los costes de manufacturarlo igualaban los del Amiga 500, aunque el C128D tenía que venderse por cientos de dólares menos para dejar la imagen del Amiga como tope de gama intacta. Bil Herd ha indicado que los objetivos de diseño del 128 no incluían inicialmente la compatibilidad al 100% con el C64. Alguna forma de compatibilidad se intentó después de que Herd fuera contactado durante la presentación del Plus/4 por una mujer decepcionada porque los paquetes de software educativo que había escrito para el C64 no fueran a funcionar en el nuevo ordenador de Commodore. Más tarde, el departamento de marketing de Commodore demandó una compatibilidad total. Herd dio como razón para incluir un procesador Z80 en el C128 para asegurar la compatibilidad al 100%, debido a que el soporte para el cartucho del Z80 del C64 hubiera significado que el C128 tendría que haber suministrado energía adicional al puerto de cartuchos. También indicó que el chip de vídeo VDC y el Z80 eran fuentes de problemas durante el diseño de la máquina. Herd añadió que "sólo esperaba que el C128 se vendiera durante un año, nos imaginamos que un par de millones estarían bien y, por supuesto, no minaría al Amiga o incluso al C64".


title: Commodore 128

text: Las primeras versiones del C128 ocasionalmente experimentaban problemas de fiabilidad causados por la temperatura, debido al uso de una protección electromagnética sobre la placa principal. La protección está equipada con apoyos que tocan la parte superior de los chips principales, causando que la protección actúe como un gran disipador térmico. Una combinación de falta de contacto entre la protección y los chips, la limitada conductividad térmica inherente a los empaquetados plásticos de los chips, al igual que la relativamente pobre conductividad térmica de la protección misma (que está hecha de mu-metal), daba como resultado un sobrecalentamiento y en algunos casos fallos. El chip de sonido SID es particularmente vulnerable a este problema. El remedio más común es quitar la protección, la cual Commodore solo añadió para cumplir con las regulaciones de radiofrecuencia de la FCC. El BASIC 7.0 del Commodore 128, el lenguaje de programación que viene incluido en el ordenador, puede colgarse o provocar un reinicio ejecutando codice_12. Este bug está presente en todas las máquinas Commodore de 8 bits.


title: Compilador

text: En informática, un compilador es un programa que traduce código escrito en un lenguaje de programación (llamado fuente) a otro lenguaje (conocido como objeto). En este tipo de traductor, el lenguaje fuente es generalmente un lenguaje de alto nivel, y el objeto un lenguaje de bajo nivel (código máquina). A diferencia de los intérpretes, los compiladores reúnen diversos elementos o fragmentos en una misma unidad (un programa ejecutable o una biblioteca), que puede ser almacenada y reutilizada. Este proceso de traducción se conoce como "compilación".


title: Compilador

text: La construcción de un compilador involucra la división del proceso en una serie de fases que variará con su complejidad. Generalmente estas fases se agrupan en dos tareas: el análisis del programa fuente y la síntesis del programa objeto.Alternativamente, las fases descritas para las tareas de análisis y síntesis se pueden agrupar en:Esta división permite que el mismo generador se utilice para crear el código máquina de varios lenguajes de programación distintos y que el mismo analizador que sirve para examinar el código fuente de un lenguaje de programación concreto sirva para producir código máquina en varias plataformas. Suele incluir la generación y optimización del código dependiente de la máquina.


title: Compilador

text: En 1938, Konrad Zuse desarrolló la primera computadora digital electromecánica, denominada Z1 en Alemania, y posteriormente, en 1946, se desarrolló la primera computadora totalmente electrónica ENIAC, sucedida principalmente por la EDVAC (1951), primera computadora electrónica digital. En un principio, estas máquinas ejecutaban instrucciones consistentes en códigos numéricos que señalaban a los circuitos de la máquina los estados correspondientes a cada operación, lo que se denominó lenguaje máquina.


title: Compilador

text: Pronto los primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus programas mediante claves más fáciles de recordar que esos códigos; al final, todas esas claves juntas se traducían manualmente a lenguaje máquina. Estas claves constituyen los llamados lenguajes ensambladores.


title: Compilador

text: Pese a todo, el lenguaje ensamblador seguía siendo el de una máquina, pero más fácil de manejar (las instrucciones de máquina se reemplazan por mnemónicos. Los trabajos de investigación se orientaron hacia la creación de un lenguaje que expresara las distintas acciones a realizar de una manera lo más sencilla posible para una persona. El primer compilador fue escrito por Grace Hopper, en 1952 para el lenguaje de programación A-0. En 1950 John Backus dirigió una investigación en IBM sobre un lenguaje algebraico. En 1954 se empezó a desarrollar un lenguaje que permitía escribir fórmulas matemáticas de manera traducible por un ordenador; le llamaron FORTRAN (FORmulae TRANslator). Fue el primer lenguaje de alto nivel y se introdujo en 1957 para el uso de la computadora IBM modelo 704.


title: Compilador

text: Surgió así por primera vez el concepto de un traductor como un programa que traducía un lenguaje a otro lenguaje. En el caso particular de que el lenguaje a traducir es un lenguaje de alto nivel y el lenguaje traducido de bajo nivel, se emplea el término compilador.


title: Compilador

text: El trabajo de realizar un compilador fue complicado de realizar. El primer compilador de FORTRAN tardó 18 años-persona en realizarse y era muy sencillo. Este desarrollo de FORTRAN estaba muy influenciado por la máquina objeto en la que iba a ser implementado. Como un ejemplo de ello tenemos el hecho de que los espacios en blanco fuesen ignorados, debido a que el periférico que se utilizaba como entrada de programas (una lectora de tarjetas perforadas) no contaba correctamente los espacios en blanco.


title: Compilador

text: El primer compilador autocontenido, es decir, capaz de compilar su propio código fuente fue el creado para Lisp por Hart y Levin en el MIT en 1962. Desde 1970 se ha convertido en una práctica común escribir el compilador en el mismo lenguaje que este compila, aunque PASCAL y C han sido alternativas muy usadas.


title: Compilador

text: Crear un compilador autocontenido genera un problema llamado bootstrapping, es decir el primer compilador creado para un lenguaje tiene que o bien ser compilado por un compilador escrito en otro lenguaje o bien compilado al ejecutar el compilador en un intérprete.


title: Compilador

text: Esta taxonomía de los tipos de compiladores no es excluyente, por lo que puede haber compiladores que se adscriban a varias categorías:En las primeras épocas de la informática, los compiladores eran considerados un "software" de los más complejos existentes.


title: Compilador

text: Los primeros compiladores se realizaron programándolos directamente en lenguaje máquina o en ensamblador. Una vez que se dispone de un compilador, se pueden escribir nuevas versiones del compilador (u otros compiladores distintos) en el lenguaje que compila ese compilador.


title: Compilador

text: Existen herramientas que facilitan la tarea de escribir compiladores o intérpretes informáticos. Estas herramientas permiten generar el esqueleto del analizador sintáctico a partir de una definición formal del "lenguaje de partida", especificada normalmente mediante una gramática formal y barata, dejando únicamente al programador del compilador la tarea de programar las acciones semánticas asociadas.


title: Compilador

text: Es el proceso por el cual se traducen las instrucciones escritas en un determinado lenguaje de programación a lenguaje máquina. Además de un traductor, se pueden necesitar otros programas para crear un programa objeto ejecutable. Un programa fuente se puede dividir en módulos almacenados en archivos distintos. La tarea de reunir el programa fuente a menudo se confía a un programa distinto, llamado preprocesador. El preprocesador también puede expandir abreviaturas, llamadas a macros, a proposiciones del lenguaje fuente.


title: Compilador

text: Normalmente la creación de un programa ejecutable (un típico archivo ".exe" para Windows o DOS) conlleva dos pasos. El primer paso se llama "compilación" (propiamente dicho) y traduce el código fuente escrito en un lenguaje de programación almacenado en un archivo a código en bajo nivel (normalmente en código objeto, no directamente a lenguaje máquina). El segundo paso se llama "enlazado" en el cual se enlaza el código de bajo nivel generado de todos los ficheros y subprogramas que se han mandado a compilar y se añade el código de las funciones que hay en las bibliotecas del compilador para que el ejecutable pueda comunicarse directamente con el sistema operativo, traduciendo así finalmente el código objeto a código máquina, y generando un módulo ejecutable.


title: Compilador

text: Estos dos pasos se pueden hacer por separado, almacenando el resultado de la fase de compilación en archivos objetos (un típico.obj para Microsoft Windows, DOS o para Unix); para enlazarlos en fases posteriores, o crear directamente el ejecutable; con lo que la fase de compilación se almacena solo temporalmente. Un programa podría tener partes escritas en varios lenguajes (por ejemplo C, C++ y Asm), que se podrían compilar de forma independiente y luego enlazar juntas para formar un único módulo ejecutable.


title: Compilador

text: El proceso de traducción se compone internamente de varias etapas o fases, que realizan distintas operaciones lógicas. Es útil pensar en estas fases como en piezas separadas dentro del traductor, y pueden en realidad escribirse como operaciones codificadas separadamente aunque en la práctica a menudo se integren juntas.


title: Compilador

text: El análisis léxico constituye la primera fase, aquí se lee el programa fuente de izquierda a derecha y se agrupa en componentes léxicos (tókenes), que son secuencias de caracteres que tienen un significado. Además, todos los espacios en blanco, líneas en blanco, comentarios y demás información innecesaria se elimina del programa fuente. También se comprueba que los símbolos del lenguaje (palabras clave, operadores, etc.) se han escrito correctamente.


title: Compilador

text: Como la tarea que realiza el analizador léxico es un caso especial de coincidencia de patrones, se necesitan los métodos de especificación y reconocimiento de patrones, se usan principalmente los autómatas finitos que acepten expresiones regulares. Sin embargo, un analizador léxico también es la parte del traductor que maneja la entrada del código fuente, y puesto que esta entrada a menudo involucra un importante gasto de tiempo, el analizador léxico debe funcionar de manera tan eficiente como sea posible.


title: Compilador

text: En esta fase los caracteres o componentes léxicos se agrupan jerárquicamente en frases gramaticales que el compilador utiliza para sintetizar la salida. Se comprueba si lo obtenido de la fase anterior es sintácticamente correcto (obedece a la gramática del lenguaje). Por lo general, las frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico.


title: Compilador

text: La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la definición de expresiones:Las reglas 1 y 2 son reglas básicas (no recursivas), en tanto que la regla 3 define expresiones en función de operadores aplicados a otras expresiones.


title: Compilador

text: La división entre análisis léxico y análisis sintáctico es algo arbitraria. Un factor para determinar la división es si una construcción del lenguaje fuente es inherentemente recursiva o no. Las construcciones léxicas no requieren recursión, mientras que las construcciones sintácticas suelen requerirla. No se requiere recursión para reconocer los identificadores, que suelen ser cadenas de letras y dígitos que comienzan con una letra. Normalmente, se reconocen los identificadores por el simple examen del flujo de entrada, esperando hasta encontrar un carácter que no sea ni letra ni dígito, y agrupando después todas las letras y dígitos encontrados hasta ese punto en un componente léxico llamado identificador. Por otra parte, esta clase de análisis no es suficientemente poderoso para analizar expresiones o proposiciones. Por ejemplo, no podemos emparejar de manera apropiada los paréntesis de las expresiones, o las palabras "begin" y "end" en proposiciones sin imponer alguna clase de estructura jerárquica o de anidamiento a la entrada.


title: Compilador

text: La fase de análisis semántico revisa el programa fuente para tratar de encontrar errores semánticos y reúne la información sobre los tipos para la fase posterior de generación de código. En ella se utiliza la estructura jerárquica determinada por la fase de análisis sintáctico para identificar los operadores y operandos de expresiones y proposiciones.


title: Compilador

text: Un componente importante del análisis semántico es la verificación de tipos. Aquí, el compilador verifica si cada operador tiene operandos permitidos por la especificación del lenguaje fuente. Por ejemplo, las definiciones de muchos lenguajes de programación requieren que el compilador indique un error cada vez que se use un número real como índice de una matriz. Sin embargo, la especificación del lenguaje puede imponer restricciones a los operandos, por ejemplo, cuando un operador aritmético binario se aplica a un número entero y a un número real. Revisa que los arreglos tengan definido el tamaño correcto.


title: Compilador

text: Consiste en generar el código objeto equivalente al programa fuente. Solo se genera código objeto cuando el programa fuente está libre de errores de análisis, lo cual no quiere decir que el programa se ejecute correctamente, ya que un programa puede tener errores de concepto o expresiones mal calculadas. Por lo general el código objeto es código de máquina relocalizable o código ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa. Después, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de máquina que ejecuta la misma tarea. Un aspecto decisivo es la asignación de variables a registros.


title: Compilador

text: Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explícita del programa fuente. Se puede considerar esta representación intermedia como un programa para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto.


title: Compilador

text: La representación intermedia puede tener diversas formas. Existe una forma intermedia llamada «código de tres direcciones» que es como el lenguaje ensamblador de una máquina en la que cada posición de memoria puede actuar como un registro. El código de tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene como máximo tres operandos. Esta representación intermedia tiene varias propiedades:


title: Compilador

text: La fase de optimización de código consiste en mejorar el código intermedio, de modo que resulte un código máquina más rápido de ejecutar. Esta fase de la etapa de síntesis es posible sobre todo si el traductor es un compilador (difícilmente un intérprete puede optimizar el código objeto). Hay mucha variación en la cantidad de optimización de código que ejecutan los distintos compiladores. En los que hacen mucha optimización, llamados «compiladores optimizadores», una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa objeto sin retardar demasiado la compilación.


title: Compilador

text: La interacción entre los algoritmos utilizados por las fases del compilador y las estructuras de datos que soportan estas fases es, naturalmente, muy fuerte. El escritor del compilador se esfuerza por implementar estos algoritmos de una manera tan eficaz como sea posible, sin aumentar demasiado la complejidad. De manera ideal, un compilador debería poder compilar un programa en un tiempo proporcional al tamaño del mismo.


title: Compilador

text: Cuando un analizador léxico reúne los caracteres en un token, generalmente representa el token de manera simbólica, es decir, como un valor de un tipo de datos enumerado que representa el conjunto de tokens del lenguaje fuente. En ocasiones también es necesario mantener la cadena de caracteres misma u otra información derivada de ella, tal como el nombre asociado con un token identificador o el valor de un token de número.


title: Compilador

text: En la mayoría de los lenguajes el analizador léxico solo necesita generar un token a la vez. En este caso se puede utilizar una variable global simple para mantener la información del token. En otros casos (cuyo ejemplo más notable es FORTRAN), puede ser necesario un arreglo (o vector) de tókenes.


title: Compilador

text: Si el analizador sintáctico genera un árbol sintáctico, por lo regular se construye como una estructura estándar basada en un puntero que se asigna de manera dinámica a medida que se efectúa el análisis sintáctico. El árbol entero puede entonces conservarse como una variable simple que apunta al nodo raíz. Cada nodo en la estructura es un registro cuyos campos representan la información recolectada tanto por el analizador sintáctico como, posteriormente, por el analizador semántico. Por ejemplo, el tipo de datos de una expresión puede conservarse como un campo en el nodo del árbol sintáctico para la expresión.


title: Compilador

text: En ocasiones, para ahorrar espacio, estos campos se asignan de manera dinámica, o se almacenan en otras estructuras de datos, tales como la tabla de símbolos, que permiten una asignación y desasignación selectivas. En realidad, cada nodo del árbol sintáctico por sí mismo puede requerir de atributos diferentes para ser almacenado, de acuerdo con la clase de estructura del lenguaje que represente. En este caso, cada nodo en el árbol sintáctico puede estar representado por un registro variable, con cada clase de nodo conteniendo solamente la información necesaria para ese caso.


title: Compilador

text: Esta estructura de datos mantiene la información asociada con los identificadores: funciones, variables, constantes y tipos de datos. La tabla de símbolos interactúa con casi todas las fases del compilador: el analizador léxico, el analizador sintáctico o el analizador semántico pueden introducir identificadores dentro de la tabla; el analizador semántico agregará tipos de datos y otra información; y las fases de optimización y generación de código utilizarán la información proporcionada por la tabla de símbolos para efectuar selecciones apropiadas de código objeto.


title: Compilador

text: Puesto que la tabla de símbolos tendrá solicitudes de acceso con tanta frecuencia, las operaciones de inserción, eliminación y acceso necesitan ser eficientes, preferiblemente operaciones de tiempo constante. Una estructura de datos estándar para este propósito es la tabla de dispersión o de cálculo de dirección, aunque también se pueden utilizar diversas estructuras de árbol. En ocasiones se utilizan varias tablas y se mantienen en una lista o pila.


title: Compilador

text: La búsqueda y la inserción rápida son esenciales también para la tabla de literales, la cual almacena constantes y cadenas utilizadas en el programa. Sin embargo, una tabla de literales necesita impedir las eliminaciones porque sus datos se aplican globalmente al programa y una constante o cadena aparecerá solo una vez en esta tabla. La tabla de literales es importante en la reducción del tamaño de un programa en la memoria al permitir la reutilización de constantes y cadenas. También es necesaria para que el generador de código construya direcciones simbólicas para las literales y para introducir definiciones de datos en el archivo de código objeto.


title: Compilador

text: De acuerdo con la clase de código intermedio (por ejemplo, código de tres direcciones o código P) y de las clases de optimizaciones realizadas, este código puede conservarse como un arreglo de cadenas de texto, un archivo de texto temporal o bien una lista de estructuras ligadas. En los compiladores que realizan optimizaciones complejas debe ponerse particular atención a la selección de representaciones que permitan una fácil reorganización.


title: Compilador

text: La representación intermedia puede tener diversas formas. Existe una forma intermedia llamada «código de tres direcciones», que es como el lenguaje ensamblador para una máquina en la que cada posición de memoria puede actuar como un registro. El código de tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene como máximo tres operandos. El programa fuente de (1) puede aparecer en código de tres direcciones como


title: Compilador

text: Esta representación intermedia tiene varias propiedades. Primera, cada instrucción de tres direcciones tiene a lo sumo un operador, además de la asignación. Por tanto, cuando se generan esas instrucciones el compilador tiene que decidir el orden en que deben efectuarse, las operaciones; la multiplicación precede a la adición al programa fuente de. Segunda, el compilador debe generar un nombre temporal para guardar los valores calculados por cada instrucción. Tercera, algunas instrucciones de «tres direcciones» tienen menos de tres operadores, por ejemplo la primera y la última instrucciones de asignación.La fase de optimización de código trata de mejorar el código intermedio de modo que resulte un código de máquina más rápido de ejecutar. Algunas optimizaciones son triviales. Por ejemplo, un algoritmo natural genera el código intermedio (2) utilizando una instrucción para cada operador de la representación del árbol después del análisis semántico, aunque hay una forma mejor de realizar los mismos cálculos usando las dos instrucciones


title: Compilador

text: Este sencillo algoritmo no tiene nada de malo, puesto que el problema se puede solucionar en la fase de optimización de código. Esto es, el compilador puede deducir que la conversión de 60 de entero a real se puede hacer de una vez por todas en el momento de la compilación, de modo que la operación "entreal( )" se puede eliminar. Además, temp3 se usa solo una vez, para transmitir su valor a id1. Entonces resulta seguro sustituir a id1 por temp3, a partir de lo cual la última proposición de (2) no se necesita y se obtiene el código de (3).


title: Compilador

text: Hay muchas variaciones en la cantidad de optimización de código que ejecutan los distintos compiladores. En lo que hacen mucha optimización llamados «compiladores optimizadores», una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo, hay optimizaciones sencillas que mejoran sensiblemente el tiempo de ejecución del programa objeto sin retardar demasiado la compilación.


title: Compilador

text: Al principio las computadoras no tenían la suficiente memoria para guardar un programa completo durante la compilación. Este problema se resolvió mediante el uso de archivos temporales para mantener los productos de los pasos intermedios durante la traducción o bien al compilar «al vuelo», es decir, manteniendo solo la información suficiente de las partes anteriores del programa fuente que permita proceder a la traducción.


title: Compilador

text: Las limitaciones de memoria son ahora un problema mucho menor, y es posible requerir que una unidad de compilación entera se mantenga en memoria, en especial si se dispone de la compilación por separado en el lenguaje. Con todo, los compiladores ocasionalmente encuentran útil generar archivos intermedios durante alguna de las etapas del procesamiento. Algo típico de estos es la necesidad de direcciones de "corrección hacia atrás" durante la generación de código.


title: Cláusula de Horn

text: En lógica proposicional, una fórmula lógica es una cláusula de Horn si es una cláusula (disyunción de literales) con, como máximo, un literal positivo. Se llaman así por el lógico Alfred Horn, el primero en señalar la importancia de estas cláusulas en 1951.


title: Cláusula de Horn

text: Esto es un ejemplo de una cláusula de Horn:


Cláusula de Horn


title: Cláusula de Horn

text: Una fórmula como esta también puede reescribirse de forma equivalente como una implicación:


title: Cláusula de Horn

text: Una cláusula de Horn con exactamente un literal positivo es una cláusula "definite"; en álgebra universal las cláusulas "definites" resultan (aparecen) como cuasi-identidades. Una cláusula de Horn sin ningún literal positivo es a veces llamada cláusula objetivo (goal) o consulta (query), especialmente en programación lógica.


title: Cláusula de Horn

text: Una fórmula de Horn es una cadena textual (string) de cuantificadores existenciales o universales seguidos por una conjunción de cláusulas de Horn.


title: Cláusula de Horn

text: La sintaxis de una cláusula de Horn en PROLOG tiene el siguiente aspecto: que podría leerse así: "A es hija de B si A es mujer y B es padre de A".


title: Cláusula de Horn

text: En términos lógicos representa la siguiente implicación:


title: Cláusula de Horn

text: Por definición de implicación se obtiene la siguiente cláusula de Horn:


title: Cláusula de Horn

text: Obsérvese que, en PROLOG, el símbolo ":-" separa la conclusión de las condiciones. En PROLOG, las variables se escriben comenzando por una letra mayúscula. Todas las condiciones deben cumplirse simultáneamente para que la conclusión sea válida; por tanto, la coma (en algunas versiones de PROLOG se sustituye la coma por el símbolo &) que separa las distintas condiciones es equivalente a la conjunción copulativa.


title: Cláusula de Horn

text: En cambio la disyunción normalmente no se representa mediante símbolos especiales (aunque puede hacerse con el símbolo ";"), sino añadiendo reglas nuevas al programa. En este caso: que podrían leerse así: "A es hija de B si A es mujer y B es padre de A o A es hija de B si A es mujer y B es madre de A".


title: C++

text: C++ es un lenguaje de programación diseñado en 1979 por Bjarne Stroustrup. La intención de su creación fue extender al lenguaje de programación C mecanismos que permiten la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, C++ es un lenguaje híbrido.


title: C++

text: Posteriormente se añadieron facilidades de programación genérica, que se sumaron a los paradigmas de programación estructurada y programación orientada a objetos. Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma.


title: C++

text: Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes, tales como ROOT.


title: C++

text: El nombre "C++" fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C.A continuación se cita un programa de ejemplo Hola mundo escrito en C++: /* Esta cabecera permite usar los objetos que encapsulan los descriptores stdout y stdin: cout(«) y cin(»)*/


title: C++

text: using namespace std;


title: C++

text: int main()


title: C++

text: Al usar la directiva codice_1 se le dice al compilador que busque e interprete todos los elementos definidos en el archivo que acompaña la directiva (en este caso, codice_2). Para evitar sobrescribir los elementos ya definidos al ponerles igual nombre, se crearon los espacios de nombres o codice_3 del singular en inglés. En este caso hay un espacio de nombres llamado codice_4, que es donde se incluyen las definiciones de todas las funciones y clases que conforman la biblioteca estándar de C++. Al incluir la sentencia codice_5 le estamos diciendo al compilador que usaremos el espacio de nombres codice_4 por lo que no tendremos que incluirlo cuando usemos elementos de este espacio de nombres, como pueden ser los objetos codice_7 y codice_8, que representan el flujo de salida estándar (típicamente la pantalla o una ventana de texto) y el flujo de entrada estándar (típicamente el teclado).


title: C++

text: La definición de funciones es igual que en C, salvo por la característica de que si codice_9 no va a recoger argumentos, no tenemos por qué ponérselos, a diferencia de C, donde había que ponerlos explícitamente, aunque no se fueran a usar. Queda solo comentar que el símbolo codice_10 se conoce como operador de inserción, y "grosso modo" está enviando a codice_7 lo que queremos mostrar por pantalla para que lo pinte, en este caso la cadena codice_12. El mismo operador codice_10 se puede usar varias veces en la misma sentencia, de forma que gracias a esta característica podremos concatenar el objeto codice_14 al final, cuyo resultado será imprimir un retorno de línea.


title: C++

text: C++ tiene los siguientes tipos fundamentales:


title: C++

text: El modificador codice_26 se puede aplicar a enteros para obtener números sin signo (por omisión los enteros contienen signo), con lo que se consigue un rango mayor de números naturales.


title: C++

text: Según la máquina y el compilador que se utilice los tipos primitivos pueden ocupar un determinado tamaño en memoria. La siguiente lista ilustra el número de bits que ocupan los distintos tipos primitivos en la arquitectura x86.


title: C++

text: Otras arquitecturas pueden requerir distintos tamaños de tipos de datos primitivos. C++ no dice nada acerca de cuál es el número de bits en un byte, ni del tamaño de estos tipos; más bien, ofrece solamente las siguientes "garantías de tipos":Para la versión del estándar que se publicó en 1998, se decidió añadir el tipo de dato codice_16, que permite el uso de caracteres UNICODE, a diferencia del tradicional codice_15, que contempla simplemente al código de caracteres ASCII extendido. A su vez, se ha definido para la mayoría de las funciones y clases, tanto de C como de C++, una versión para trabajar con codice_16, donde usualmente se prefija el carácter "w" al nombre de la función (en ocasiones el carácter es un infijo). Por ejemplo:Cabe resaltar que en C se define codice_16 como: typedef unsigned short wchar_t; Mientras que en C++ es en sí mismo un tipo de dato.


title: C++

text: La palabra reservada codice_25 define en C++ el concepto de no existencia o no atribución de un tipo en una variable o declaración. Es decir, una función declarada como codice_25 no devolverá ningún valor. Esta palabra reservada también puede usarse para indicar que una función no recibe parámetros, como en la siguiente declaración: int funcion (void);


title: C++

text: Aunque la tendencia actual es la de no colocar la palabra "void".


title: C++

text: Además se utiliza para determinar que una función no retorna un valor, como en:


title: C++

text: void funcion (int parametro); Cabe destacar que codice_25 no es un tipo. Una función como la declarada anteriormente no puede retornar un valor por medio de return: la palabra clave va sola. No es posible una declaración del tipo:


title: C++

text: void t; //Está mal En este sentido, codice_25 se comporta de forma ligeramente diferente a como lo hace en C, especialmente en cuanto a su significado en declaraciones y prototipos de funciones.


title: C++

text: Sin embargo, la forma especial void * indica que el tipo de datos es un puntero. Por ejemplo: void *memoria; Indica que memoria es un puntero a "alguna parte", donde se guarda información de "algún tipo". El programador es responsable de definir estos "algún", eliminando toda ambigüedad. Una ventaja de la declaración ""void *"" es que puede representar a la vez varios tipos de datos, dependiendo de la operación de "cast" escogida. La memoria que hemos apuntado en alguna parte, en el ejemplo anterior, bien podría almacenar un entero, un flotante, una cadena de texto o un programa, o combinaciones de estos. Es responsabilidad del programador recordar qué tipo de datos hay y garantizar el acceso adecuado.


title: C++

text: Además de los valores que pueden tomar los tipos anteriormente mencionados, existe un valor llamado NULL, sea el caso numérico para los enteros, carácter para el tipo char, cadena de texto para el tipo string, etc. El valor NULL, expresa, por lo regular, la representación de una Macro, asignada al valor "0".


title: C++

text: Tenemos entonces que: void* puntero = NULL; int entero = NULL; bool boleana = NULL; char caracter = NULL; El valor de las variables anteriores nos daría 0. A diferencia de la variable "caracter", que nos daría el equivalente a NULL, '\0', para caracteres.


title: C++

text: Para evitar ambigüedad en funciones sobrecargadas, puede emplearse la palabra clave "nullptr". Esta palabra clave siempre representa un puntero. Por ejemplo: void f(int a); void f(foo *a);


title: C++

text: int main(int argc, char** argv) {


title: C++

text: Todo programa en C++ debe tener la función principal codice_50 (a no ser que se especifique en tiempo de compilación otro punto de entrada, que en realidad es la función que tiene el codice_50)


title: C++

text: int main()


title: C++

text: La función principal del código fuente main debe tener uno de los siguientes prototipos: int main() int main(int argc, char** argv)


title: C++

text: Aunque no es estándar algunas implementaciones permiten int main(int argc, char** argv, char** env)


title: C++

text: La primera es la forma por omisión de un programa que no recibe parámetros ni argumentos. La segunda forma tiene dos parámetros: "argc", un número que describe el número de argumentos del programa (incluyendo el nombre del programa mismo), y "argv", un puntero a un array de punteros, de "argc" elementos, donde el elemento argv[i] representa el "i"-ésimo argumento entregado al programa. En el tercer caso se añade la posibilidad de poder acceder a las variables de entorno de ejecución de la misma forma que se accede a los argumentos del programa, pero reflejados sobre la variable "env".


title: C++

text: El tipo de retorno de main es un valor entero int. Al finalizar la función codice_9, debe incluirse el valor de retorno (por ejemplo, return 0;, aunque el estándar prevé solamente dos posibles valores de retorno: EXIT_SUCCESS y EXIT_FAILURE, definidas en el archivo cstdlib), o salir por medio de la función exit. Alternativamente puede dejarse en blanco, en cuyo caso el compilador es responsable de agregar la salida adecuada.


title: C++

text: Los objetos en C++ son abstraídos mediante una clase. Según el paradigma de la programación orientada a objetos un objeto consta de:Un ejemplo de clase que podemos tomar es la clase perro. Cada perro comparte unas características (atributos). Su número de patas, el color de su pelaje o su tamaño son algunos de sus atributos. Las funciones que lo hagan ladrar, cambiar su comportamiento... esas son las funciones de la clase.


title: C++

text: Este es otro ejemplo de una clase: class Punto //por omisión, los miembros son 'private' para que solo se puedan modificar desde la propia clase. private: protected: public:


title: C++

text: Son unos métodos especiales que se ejecutan automáticamente al crear un objeto de la clase. En su declaración no se especifica el tipo de dato que devuelven, y poseen el mismo nombre que la clase a la que pertenecen. Al igual que otros métodos, puede haber varios constructores sobrecargados, aunque no pueden existir constructores virtuales.


title: C++

text: Como característica especial a la hora de implementar un constructor, justo después de la declaración de los parámetros, se encuentra lo que se llama "lista de inicializadores". Su objetivo es llamar a los constructores de los atributos que conforman el objeto a construir.


title: C++

text: Cabe destacar que no es necesario declarar un constructor al igual que un destructor, pues el compilador lo puede hacer, aunque no es la mejor forma de programar.


title: C++

text: Tomando el ejemplo de la Clase Punto, si deseamos que cada vez que se cree un objeto de esta clase las coordenadas del punto sean igual a cero podemos agregar un constructor como se muestra a continuación: class Punto


C++


title: C++

text: // Main para demostrar el funcionamiento de la claseusing namespace std;


title: C++

text: int main () {


title: C++

text: Si compilamos y ejecutamos el anterior programa, obtenemos una salida que debe ser similar a la siguiente:


title: C++

text: Coordenada X: 0 Coordenada Y: 0


title: C++

text: Existen varios tipos de constructores en C++:Constructores + Memoria heap Un objeto creado de la forma que se vio hasta ahora, es un objeto que vive dentro del scope(las llaves { }) en el que fue creado. Para que un objeto pueda seguir viviendo cuando se saque del scope en el que se creó, se lo debe crear en memoria heap. Para esto, se utiliza el operador new, el cual asigna memoria para almacenar al objeto creado, y además llama a su constructor(por lo que se le pueden enviar parámetros). El operador new se utiliza de la siguiente manera: int main() {


title: C++

text: Además, con el operador new[] se pueden crear arrays (colecciones o listas ordenadas) de tamaño dinámico: Punto *asignar(int cuantos) {


title: C++

text: Los destructores son funciones miembro especiales llamadas automáticamente en la ejecución del programa, y por tanto no tienen por qué ser llamadas explícitamente por el programador. Sus principales cometidos son:


title: C++

text: Los destructores son invocados automáticamente al alcanzar el flujo del programa el fin del ámbito en el que está declarado el objeto. El único caso en el que se debe invocar explícitamente al destructor de un objeto, es cuando este fue creado mediante el operador new, es decir, que este vive en memoria heap, y no en la pila de ejecución del programa. La invocación del destructor de un objeto que vive en heap se realiza a través del operador delete o delete[] para arrays. Ejemplo: int main() {


title: C++

text: Si no se utilizara el operador delete y delete[] en ese caso, la memoria ocupada por unEntero y arrayDeEnteros respectivamente, quedaría ocupada sin sentido. Cuando una porción de memoria queda ocupada por una variable que ya no se utiliza, y no hay forma de acceder a ella, se denomina un 'memory leak'. En aplicaciones grandes, si ocurren muchos memory leaks, el programa puede terminar ocupando bastante más memoria RAM de la que debería, lo que no es para nada conveniente. Es por esto, que el manejo de memoria heap debe usarse conscientemente.


title: C++

text: Existen dos tipos de destructores pueden ser públicos o privados, según si se declaran:


title: C++

text: El uso de destructores es clave en el concepto de Adquirir Recursos es Inicializar.


title: C++

text: Función miembro es aquella que está declarada en ámbito de clase. Son similares a las funciones habituales, con la salvedad de que el compilador realizara el proceso de Decoración de nombre ("Name Mangling" en inglés): Cambiará el nombre de la función añadiendo un identificador de la clase en la que está declarada, pudiendo incluir caracteres especiales o identificadores numéricos. Este proceso es invisible al programador. Además, las funciones miembro reciben implícitamente un parámetro adicional: El puntero this, que referencia al objeto que ejecuta la función.


title: C++

text: Las funciones miembro se invocan accediendo primero al objeto al cual refieren, con la sintaxis: myobject.mymemberfunction(), esto es un claro ejemplo de una función miembro.


title: C++

text: Caso especial es el de las funciones miembro estáticas. A pesar de que son declaradas dentro de la clase, con el uso de la palabra clave static no recibirán el puntero this. Gracias a esto no es necesario crear ninguna instancia de la clase para llamar a esta función, sin embargo, solo se podrá acceder a los miembros estáticos de la clase dado que estos no están asociados al objeto sino al tipo. La sintaxis para llamar a esta función estática es mytype::mystaticmember().


title: C++

text: Las plantillas son el mecanismo de C++ para implantar el paradigma de la programación genérica. Permiten que una clase o función trabaje con tipos de datos abstractos, especificándose más adelante cuales son los que se quieren usar. Por ejemplo, es posible construir un vector genérico que pueda contener cualquier tipo de estructura de datos. De esta forma se pueden declarar objetos de la clase de este vector que contengan enteros, flotantes, polígonos, figuras, fichas de personal, etc.


title: C++

text: La declaración de una plantilla se realiza anteponiendo la declaración template  a la declaración de la estructura (clase, estructura o función) deseado.


title: C++

text: Por ejemplo: template  T max(const T &x, const T &y) {


title: C++

text: La función max() es un ejemplo de programación genérica, y dados dos parámetros de un tipo T (que puede ser int, long, float, double, etc.) devolverá el mayor de ellos (usando el operador >). Al ejecutar la función con parámetros de un cierto tipo, el compilador intentará "calzar" la plantilla a ese tipo de datos, o bien generará un mensaje de error si fracasa en ese proceso.


title: C++

text: El siguiente ejemplo: template  int myfunction(A a); crea una plantilla bajo la cual pueden ser definidas en el código de cabecera cualesquiera funciones especializadas para un tipo de datos como int myfunction(int), int myfunction(std::string), int myfunction(bool), etcétera: int myfunction (int a) {


title: C++

text: int myfunction (std::string a) {


title: C++

text: int myfunction (bool a) {


title: C++

text: Cada una de estas funciones tiene su propia definición (cuerpo). Cada cuerpo diferente, no equivalente ("no convertible") corresponde a una especialización. Si una de estas funciones no fuera definida, el compilador tratará de aplicar las conversiones de tipos de datos que le fuesen permitidas para "calzar" una de las plantillas, o generará un mensaje de error si fracasa en ese proceso.


title: C++

text: Todas las definiciones habilitadas de una plantilla deben estar disponibles al momento de la compilación, por lo cual no es posible actualmente "compilar" una plantilla como archivo de objeto, sino simplemente compilar especializaciones de la plantilla. Por lo tanto, las plantillas se distribuyen junto con el código fuente de la aplicación. En otras palabras, no es posible compilar la plantilla std::vector< > a código objeto, pero sí es posible, por ejemplo, compilar un tipo de datos std::vector.


title: C++

text: En C++ es posible definir clases abstractas. Una clase abstracta, o clase base abstracta (ABC), es una que está diseñada solo como clase "padre" de las cuales se deben derivar clases hijas. Una clase abstracta se usa para representar aquellas entidades o métodos que después se implementarán en las clases derivadas, pero la clase abstracta en sí no contiene ninguna implementación -- solamente representa los métodos que se deben implementar. Por ello, no es posible instanciar una clase abstracta, pero sí una clase concreta que implemente los métodos definidos en ella.


title: C++

text: Las clases abstractas son útiles para definir interfaces, es decir, un conjunto de métodos que definen el comportamiento de un módulo determinado. Estas definiciones pueden utilizarse sin tener en cuenta la implementación que se hará de ellos.


title: C++

text: En C++ los métodos de las clases abstractas se definen como funciones virtuales puras. class Abstracta


title: C++

text: class ConcretaA : public Abstracta };


title: C++

text: class ConcretaB : public Abstracta };


title: C++

text: En el ejemplo, la clase ConcretaA es una implementación de la clase Abstracta, y la clase ConcretaB es otra implementación. Debe notarse que el = 0 es la notación que emplea C++ para definir funciones virtuales puras.


title: C++

text: Una adición a las características de C son los espacios de nombre ("namespace" en inglés), los cuales pueden describirse como áreas virtuales bajo las cuales ciertos nombres de variable o tipos tienen validez. Esto permite evitar las ocurrencias de conflictos entre nombres de funciones, variables o clases.


title: C++

text: El ejemplo más conocido en C++ es el espacio de nombres std::, el cual almacena todas las definiciones nuevas en C++ que difieren de C (algunas estructuras y funciones), así como las funcionalidades propias de C++ ("streams") y los componentes de la biblioteca STL.


title: C++

text: Por ejemplo: // Las funciones en esta cabecera existen dentro del espacio de nombres std::


title: C++

text: namespace mi_paquete{


title: C++

text: int main()


title: C++

text: Como puede verse, las invocaciones directas a "mi_valor" darán acceso solamente a la variable descrita localmente; para acceder a la variable del espacio de nombres "mi_paquete" es necesario acceder específicamente el espacio de nombres. Un atajo recomendado para programas sencillos es la directiva using namespace, que permite acceder a los nombres de variables del paquete deseado en forma directa, siempre y cuando no se produzca alguna ambigüedad o conflicto de nombres.


title: C++

text: Existen varios tipos de herencia entre clases en el lenguaje de programación C++. Estos son:


title: C++

text: La herencia en C++ es un mecanismo de abstracción creado para poder facilitar y mejorar el diseño de las clases de un programa. Con ella se pueden crear nuevas clases a partir de clases ya hechas, siempre y cuando tengan un tipo de relación especial.


title: C++

text: En la herencia, las clases derivadas "heredan" los datos y las funciones miembro de las clases base, pudiendo las clases derivadas redefinir estos comportamientos (polimorfismo) y añadir comportamientos nuevos propios de las clases derivadas. Para no romper el principio de encapsulamiento (ocultar datos cuyo conocimiento no es necesario para el uso de las clases), se proporciona un nuevo modo de visibilidad de los datos/funciones: "protected". Cualquier cosa que tenga visibilidad protected se comportará como pública en la clase Base y en las que componen la jerarquía de herencia, y como privada en las clases que NO sean de la jerarquía de la herencia.


title: C++

text: Antes de utilizar la herencia, nos tenemos que hacer una pregunta, y si tiene sentido, podemos intentar usar esta jerarquía: Si la frase  ES-UN  tiene sentido, entonces estamos ante un posible caso de herencia donde clase A será la clase base y clase B la derivada.


title: C++

text: Ejemplo: clases Barco, Acorazado, Carguero, etc. Un Acorazado ES-UN Barco, un Carguero ES-UN Barco, un Trasatlántico ES-UN Barco, etc.


title: C++

text: En este ejemplo tendríamos las cosas generales de un Barco (en C++)


title: C++

text: class Barco {


title: C++

text: y ahora las características de las clases derivadas, podrían (a la vez que heredan las de barco) añadir cosas propias del subtipo de barco que vamos a crear, por ejemplo: class Carguero: public Barco { // Esta es la manera de especificar que hereda de Barco


title: C++

text: class Acorazado: public Barco {


title: C++

text: Por último, hay que mencionar que existen 3 clases de herencia que se diferencian en el modo de manejar la visibilidad de los componentes de la clase resultante:La herencia múltiple es el mecanismo que permite al programador hacer clases derivadas a partir, no de una sola clase base, sino de varias. Para entender esto mejor, pongamos un ejemplo: Cuando ves a quien te atiende en una tienda, como persona que es, podrás suponer que puede hablar, comer, andar, pero, por otro lado, como empleado que es, también podrás suponer que tiene un jefe, que puede cobrarte dinero por la compra, que puede devolverte el cambio, etc. Si esto lo trasladamos a la programación sería herencia múltiple (clase empleado_tienda): class Persona { };


title: C++

text: class Empleado { };


title: C++

text: class EmpleadoTienda: public Persona, Empleado { }; Por tanto, es posible utilizar más de una clase para que otra herede sus características.


title: C++

text: La sobrecarga de operadores es una forma de hacer polimorfismo. Es posible definir el comportamiento de un operador del lenguaje para que trabaje con tipos de datos definidos por el usuario. No todos los operadores de C++ son factibles de sobrecargar, y, entre aquellos que pueden ser sobrecargados, se deben cumplir condiciones especiales. En particular, los operadores sizeof y :: no son sobrecargables.


title: C++

text: No es posible en C++ crear un operador nuevo.


title: C++

text: Los comportamientos de los operadores sobrecargados se implementan de la misma manera que una función, salvo que esta tendrá un nombre especial: codice_53


title: C++

text: Los siguientes operadores pueden ser sobrecargados:Dado que estos operadores son definidos para un tipo de datos definido por el usuario, este es libre de asignarles cualquiera semántica que desee. Sin embargo, se considera de primera importancia que las semánticas sean tan parecidas al comportamiento natural de los operadores como para que el uso de los operadores sobrecargados sea intuitivo. Por ejemplo, el uso del operador unario - debiera cambiar el "signo" de un "valor".


title: C++

text: Los operadores sobrecargados no dejan de ser funciones, por lo que pueden devolver un valor, si este valor es del tipo de datos con el que trabaja el operador, permite el encadenamiento de sentencias. Por ejemplo, si tenemos 3 variables A, B y C de un tipo T y sobrecargamos el operador = para que trabaje con el tipo de datos T, hay dos opciones: si el operador no devuelve nada una sentencia como "A=B=C;" (sin las comillas) daría error, pero si se devuelve un tipo de datos T al implementar el operador, permitiría concatenar cuantos elementos se quisieran, permitiendo algo como "A=B=C=D=...;"


title: C++

text: Los lenguajes de programación suelen tener una serie de bibliotecas de funciones integradas para la manipulación de datos a nivel más básico. En C++, además de poder usar las bibliotecas de C, se puede usar la nativa STL (Standard Template Library), propia del lenguaje. Proporciona una serie plantillas (templates) que permiten efectuar operaciones sobre el almacenado de datos, procesado de entrada/salida.


title: C++

text: Las clases basic_ostream y basic_stream, y los objetos cout y cin, proporcionan la entrada y salida estándar de datos (teclado/pantalla). También está disponible cerr, similar a cout, usado para la salida estándar de errores. Estas clases tienen sobrecargados los operadores « y », respectivamente, con el objeto de ser útiles en la inserción/extracción de datos a dichos flujos. Son operadores inteligentes, ya que son capaces de adaptarse al tipo de datos que reciben, aunque tendremos que definir el comportamiento de dicha entrada/salida para clases/tipos de datos definidos por el usuario. Por ejemplo: ostream& operator«(ostream& fs, const Punto& punto)


title: C++

text: De esta forma, para mostrar un punto, solo habría que realizar la siguiente expresión: Punto p(4,5); cout « "Las coordenadas son: " « p « endl;


title: C++

text: Es posible formatear la entrada/salida, indicando el número de dígitos decimales a mostrar, si los textos se pasarán a minúsculas o mayúsculas, si los números recibidos están en formato octal o hexadecimal, etc.


title: C++

text: Tipo de flujo para el manejo de ficheros. La definición previa de "ostreams/istreams" es aplicable a este apartado. Existen tres clases (ficheros de lectura, de escritura o de lectura/escritura): ifstream,ofstream y fstream.


title: C++

text: Como abrir un fichero: (nombre_variable_fichero).open("nombre_fichero.dat/txt", ios::in); para abrirlo en modo lectura. (nombrevariablefichero).open("nombre_fichero.dat/txt", ios::out); para abrirlo en modo escritura.


title: C++

text: Ejemplo: f.open("datos.txt", ios::in);


title: C++

text: Como cerrar el fichero: nombre_variable_fichero.close();


title: C++

text: Ejemplo: f.close();


title: C++

text: Leer un fichero:


title: C++

text: Escribir un fichero:


title: C++

text: Pueden abrirse pasando al constructor los parámetros relativos a la ubicación del fichero y el modo de apertura:


title: C++

text: Se destacan dos clases, ostringstream e istringstream. Todo lo anteriormente dicho es aplicable a estas clases. Tratan a una cadena como si de un flujo de datos se tratase. ostringstream permite elaborar una cadena de texto insertando datos cual flujo, e istringstream puede extraer la información contenida en una cadena (pasada como parámetro en su constructor) con el operador codice_54. Ejemplos: ostringstream s; s « nombre « "," « edad « "," « estatura « "," « punto(5,6) « endl; cout « s.str(); istringstream s(cadena); s » nombre » edad » estatura » p;


title: C++

text: Son clases plantillas especiales utilizadas para almacenar tipos de datos genéricos, sean cuales sean. Todos los contenedores son homogéneos, es decir, una vez que se declaran para contener un tipo de dato determinado, en ese contenedor, solo se podrán meter elementos de ese tipo. Según la naturaleza del almacenado, disponemos de varios tipos: Para añadir elementos al final del vector, se utiliza el método push_back(const T&). Por otro lado, para eliminar un elemento del final del vector, se debe usar el método pop_back().


title: C++

text: using namespace std;


title: C++

text: int main() {


title: C++

text: Además de los métodos push_back(const T&) y pop_back(), se agregan los métodos push_front(const T&) y pop_front(), que realizan lo mismo que los ya explicados, pero en el comienzo de la cola.


title: C++

text: int main() { using namespace std;


title: C++

text: int main() {Pueden considerarse como una generalización de la clase de "puntero". Un iterador es un tipo de dato que permite el recorrido y la búsqueda de elementos en los contenedores. Como las estructuras de datos (contenedores) son clases genéricas, y los operadores (algoritmos) que deben operar sobre ellas son también genéricos (funciones genéricas), Stepanov y sus colaboradores tuvieron que desarrollar el concepto de iterador como elemento o nexo de conexión entre ambos. El nuevo concepto resulta ser una especie de punteros que señalan a los diversos miembros del contenedor (punteros genéricos que como tales no existen en el lenguaje).


title: C++

text: Combinando la utilización de templates y un estilo específico para denotar tipos y variables, la STL ofrece una serie de funciones que representan operaciones comunes, y cuyo objetivo es "parametrizar" las operaciones en que estas funciones se ven involucradas de modo que su lectura, comprensión y mantenimiento, sean más fáciles de realizar.


title: C++

text: Un ejemplo es la función copy, la cual simplemente copia variables desde un lugar a otro. Más estrictamente, copia los contenidos cuyas ubicaciones están delimitadas por dos iteradores, al espacio indicado por un tercer iterador. La sintaxis es: De este modo, todos los datos que están entre inicio_origen y fin_origen, excluyendo el dato ubicado en este último, son copiados a un lugar descrito o apuntado por inicio_destino.


title: C++

text: Un algoritmo muy importante que viene implementado en la biblioteca STL, es el sort. El algoritmo sort, ordena cualquier tipo de contenedor, siempre y cuando se le pasen como argumentos, desde donde y hasta donde se quiere ordenarlo.


title: C++

text: Entre las funciones más conocidas están swap (variable1, variable2), que simplemente intercambia los valores de variable1 y variable2; max (variable1, variable2) y su símil min (variable1, variable2), que retornan el máximo o mínimo entre dos valores; find (inicio, fin, valor) que busca valor en el espacio de variables entre inicio y fin; etcétera.


title: C++

text: Los algoritmos son muy variados, algunos incluso tienen versiones específicas para operar con ciertos iteradores o contenedores, y proveen un nivel de abstracción extra que permite obtener un código más "limpio", que "describe" lo que se está haciendo, en vez de hacerlo paso a paso explícitamente.


title: C++

text: El 12 de agosto de 2011, Herb Sutter, presidente del comité de estándares de C++, informó la aprobación unánime del nuevo estándar. La publicación del mismo se realizó en algún momento del 2011.


title: C++

text: Entre las características del nuevo estándar se pueden destacar:Además se ha actualizado la biblioteca estándar del lenguaje.


title: C++

text: En 2011 C++11 inauguró una nueva era en la historia de C++, iniciando un ciclo trienal de lanzamiento de nuevas versiones. A C++11 le siguió C++14 y luego C++17, que es la versión actual en 2019; C++20 se encuentra próximo a estandarizarse, y ya se está trabajando en la versión C++23. Los compiladores intentan adelantarse incorporando de manera experimental algunas novedades antes de los lanzamientos oficiales. Pero cada nueva versión de C++ incluye tal cantidad de agregados que los compiladores más adelantados no suelen terminar de incorporarlos hasta dos o tres años después del lanzamiento de esa versión.


title: C++

text: En C++, cualquier tipo de datos que sea "declarado completo" ("fully qualified", en inglés) se convierte en un tipo de datos único. Las condiciones para que un tipo de datos T sea "declarado completo" son "a grandes rasgos" las siguientes:En general, esto significa que cualquier tipo de datos definido haciendo uso de las cabeceras completas, es un tipo de datos completo.


title: C++

text: En particular, y, a diferencia de lo que ocurría en C, los tipos definidos por medio de struct o enum son tipos completos. Como tales, ahora son sujetos a sobrecarga, conversiones implícitas, etcétera.


title: C++

text: Los tipos enumerados, entonces, ya no son simplemente alias para tipos enteros, sino que son tipos de datos únicos en C++. El tipo de datos bool, igualmente, pasa a ser un tipo de datos único, mientras que en C funcionaba en algunos casos como un alias para alguna clase de dato de tipo entero.


title: C++

text: Uno de los compiladores libres de C++ es el de GNU, el compilador G++ (parte del proyecto GCC, que engloba varios compiladores para distintos lenguajes). Otros compiladores comunes son Intel C++ Compiler, el compilador de Xcode, el compilador de Borland C++, el compilador de CodeWarrior C++, el compilador g++ de Cygwin, el compilador g++ de MinGW, el compilador de Visual C++, Carbide.c++, entre otros. A pesar de su adopción generalizada, muchos programadores han criticado el lenguaje C ++, incluyendo Linus Torvalds, Richard Stallman, y Ken Thompson. Los problemas incluyen una falta de reflexión o recolector de basura, tiempos de compilación lentos, perceived feature creep, y mensajes de error detallados, particularmente de la metaprogramación de plantilla.


title: C++

text: Para evitar los problemas que existen en C ++, y para aumentar la productividad, algunas personas sugieren lenguajes alternativos más recientes que C ++, como D, Go, Rust y Vala.


title: Código alfanumérico

text: Con un código de un bit podemos representar 2=2 combinaciones. Para representar los diez dígitos (0-9) y las 26 letras minúsculas necesitamos como mínimo 6 bits (2=32, 2=64 combinaciones). Si además se quieren representar las letras mayúsculas y otros símbolos de utilidad necesitaremos un mayor número de bits. En general con el término de carácter o código alfanumérico se incluyen: La información que la computadora debe procesar está formada por letras, números y símbolos especiales.


title: Código alfanumérico

text: Los ordenadores trabajan con voltajes fijos que se representan con los números 0 y 1 que forman la base de un sistema binario. Con la presencia o ausencia de tensión eléctrica no solo se pueden representar números sino los estados de una variable lógica Con un conjunto de variables lógicas se puede definir cualquier sistema lógico.


title: Código de caracteres de 8 bits

text: Con un código de caracteres de 8 bits (1 byte) se pueden representar hasta 2 = 256 caracteres diferentes.


title: Código de caracteres de 8 bits

text: Existe un código, que desde que fue definido en 1963, ha sido adoptado como el estándar para la transmisión de datos. Este código denominado ASCII ("American Standard Code for Information Interchange") permite representar hasta 128 caracteres diferentes, para ello necesita 7 bits (2 = 128 permutaciones). Normalmente el código ASCII se extiende a 8 bits (1 byte) añadiendo un bit de control, llamado bit de paridad.


title: Código de caracteres de 8 bits

text: A pesar de que el código ASCII es el más ampliamente difundido, algunas empresas de sistemas informáticos crearon sus propios códigos alfanuméricos. Tal es el caso de IBM, en cuyos equipos suele utilizarse el código alfanumérico denominado EBCDIC.


title: Código de caracteres de 8 bits

text: El conjunto de caracteres alfabéticos representables en ASCII no engloba los caracteres acentuados, ni otros diacríticos. Así, surgieron otros códigos de 8 bits compatibles con ASCII especialmente creados para representar otras lenguas además del inglés. El ISO 8859-1, por ejemplo, posee caracteres apropiados para el español, portugués, francés y otras lenguas latinas.


title: Ciencia

text: La ciencia (del latín "scientĭa", 'conocimiento') es un sistema que organiza y construye el conocimiento a través de preguntas comprobables y un método estructurado que estudia e interpreta los fenómenos naturales, sociales y artificiales. El conocimiento científico se obtiene mediante observación y experimentación en ámbitos específicos. Dicho conocimiento es organizado y clasificado sobre la base de principios explicativos, ya sean de forma teórica o práctica. A partir de estos se generan preguntas y razonamientos, se formulan hipótesis, se deducen principios y leyes científicas, y se construyen modelos científicos, teorías científicas y sistemas de conocimientos por medio de un método científico.


title: Ciencia

text: La ciencia considera y tiene como fundamento la observación experimental. Este tipo de observación se organiza por medio de métodos, modelos y teorías con el fin de generar nuevo conocimiento. Para ello se establecen previamente unos criterios de verdad y un método de investigación. La aplicación de esos métodos y conocimientos conduce a la generación de nuevos conocimientos en forma de predicciones concretas, cuantitativas y comprobables referidas a observaciones pasadas, presentes y futuras. Con frecuencia esas predicciones se pueden formular mediante razonamientos y estructurar como reglas o leyes generales, que dan cuenta del comportamiento de un sistema y predicen cómo actuará dicho sistema en determinadas circunstancias.


title: Ciencia

text: Desde la revolución científica, el conocimiento científico ha aumentado tanto que los científicos se han vuelto especialistas y sus publicaciones se han vuelto muy difíciles de leer para los no especialistas. Esto ha dado lugar a diversos esfuerzos de divulgación científica, tanto para acercar la ciencia al gran público, como para facilitar la compresión y colaboración entre científicos de distintos campos.


title: Ciencia

text: La historia de la ciencia abarca el desarrollo de la ciencia desde la antigüedad hasta el presente. La ciencia es un conocimiento empírico, teórico y de procedimiento sobre el universo, producido por científicos que formulan explicaciones y predicciones comprobables basadas en sus observaciones. Hay tres ramas principales de la ciencia: natural, social y formal.


title: Ciencia

text: Las primeras raíces de la ciencia se remontan al Antiguo Egipto y Mesopotamia alrededor de 3000 a 1200 A.C. Sus contribuciones a las matemáticas, la astronomía y la medicina entraron y dieron forma a la filosofía natural griega de la antigüedad clásica, mediante la cual se hicieron intentos formales para proporcionar explicaciones de eventos en el mundo físico basadas en causas naturales. Después de la caída del Imperio romano occidental, el conocimiento de las concepciones griegas del mundo se deterioró en Europa occidental de habla latina durante los primeros siglos (400 a 1000 EC) de la Edad Media, pero continuó prosperando en el Imperio Romano Oriental (o Bizantino) de habla griega. Con la ayuda de traducciones de textos griegos, la cosmovisión helenística se conservó y se absorbió en el mundo musulmán de habla árabe durante la Edad de Oro islámica. La recuperación y asimilación de obras griegas y las investigaciones islámicas en Europa occidental desde el siglo X al XIII revivieron el aprendizaje de la filosofía natural en Occidente.


title: Ciencia

text: La filosofía natural se transformó durante la Revolución Científica en la Europa de los siglos XVI al XVII, a medida que nuevas ideas y descubrimientos se apartaron de las concepciones y tradiciones griegas anteriores. La Nueva Ciencia que surgió era más mecanicista en su cosmovisión, más integrada con las matemáticas y más confiable y abierta ya que su conocimiento se basaba en un método científico recién definido. Pronto siguieron más "revoluciones" en los siglos siguientes. La revolución químicadel siglo XVIII, por ejemplo, introdujo nuevos métodos cuantitativos y medidas para la química. En el siglo XIX, se enfocaron nuevas perspectivas con respecto a la conservación de la energía, la edad de la Tierra y la evolución. Y en el siglo XX, nuevos descubrimientos en genética y física sentaron las bases para nuevas subdisciplinas como la biología molecular y la física de partículas.Además, las preocupaciones industriales y militares, así como la creciente complejidad de los nuevos esfuerzos de investigación, pronto marcaron el comienzo de la era de la " gran ciencia ", particularmente después de la Segunda Guerra Mundial.


title: Ciencia

text: Las primeras raíces de la ciencia se remontan al Antiguo Egipto y a la Mesopotamia en torno a los años 3000 a 1200 a.C. Aunque las palabras y los conceptos de "ciencia" y "naturaleza" no formaban parte del paisaje conceptual de la época, los antiguos egipcios y mesopotámicos hicieron aportaciones que más tarde encontrarían un lugar en la ciencia griega y medieval: las matemáticas, la astronomía y la medicina.A partir de alrededor del año 3000 a.C., los antiguos egipcios desarrollaron un sistema de numeración de carácter decimal y orientaron sus conocimientos de geometría a la resolución de problemas prácticos, como los de los topógrafos y constructores.Incluso desarrollaron un calendario oficial que contenía doce meses, de treinta días cada uno, y cinco días al final del año.Los antiguos pueblos de Mesopotamia utilizaban los conocimientos sobre las propiedades de diversos productos químicos naturales para la fabricación de cerámica, loza, vidrio, jabón, metales, yeso de cal e impermeabilización; también estudiaban la fisiología animal, la anatomía y el comportamiento con fines divinatoriosy realizaban amplios registros de los movimientos de los objetos astronómicos para su estudio de la astrología. Los mesopotámicos tenían intenso interés por la medicinay las primeras prescripciones médicas aparecen en sumeria durante la Tercera Dinastía de Ur ( 2112 a.C. - 2004 a.C.). No obstante, los mesopotámicos parecen haber tenido poco interés en recopilar información sobre el mundo natural por el mero hecho de recopilar informacióny principalmente sólo estudiaron temas científicos que tenían aplicaciones prácticas obvias o relevancia inmediata para su sistema religioso.


title: Ciencia

text: En la antigüedad clásica, no existe un verdadero análogo antiguo de un científico moderno. En su lugar, individuos bien educados, generalmente de clase alta, y casi universalmente varones, realizaban diversas investigaciones sobre la naturaleza siempre que podían disponer de tiempo.Antes de la invención o descubrimiento del concepto de "naturaleza" (griego antiguo "physis") por parte de los filósofos presocráticos, las mismas palabras solían utilizarse para describir la "forma natural" en que crece una planta, y la "manera" en que, por ejemplo, una tribu adora a un dios determinado. Por esta razón, se afirma que estos hombres fueron los primeros filósofos en sentido estricto, y también los primeros en distinguir claramente "naturaleza" y "convención" La filosofía natural, precursora de la ciencia natural, se distinguía así como el conocimiento de la naturaleza y de las cosas que son verdaderas para toda comunidad, y el nombre de la búsqueda especializada de tal conocimiento era "filosofía", el reino de los primeros filósofos-físicos. Eran principalmente especuladores o teóricos, particularmente interesados en la astronomía. En cambio, tratar de utilizar el conocimiento de la naturaleza para imitarla (artificio o tecnología, griego "technē") era visto por los científicos clásicos como un interés más apropiado para los artesanos de clase social inferior.


title: Ciencia

text: Los primeros filósofos griegos de la Escuela Milesiana, fundada por Tales de Mileto y continuada posteriormente por sus sucesores Anaximandro y Anaximenes, fueron los primeros en intentar explicar la fenómenos naturales sin apoyarse en lo sobrenatural. El Pitagóricos desarrolló una filosofía de números complejos y contribuyó significativamente al desarrollo de la ciencia matemática.{rp|465}} El teoría de los átomos fue desarrollado por el filósofo griego Leucipo y su alumno Demócrito. El médico griego Hipócrates estableció la tradición de la ciencia médica sistemática y es conocido como "El padre de la medicina"


title: Ciencia

text: Un punto de inflexión en la historia de la ciencia filosófica primitiva fue el ejemplo de Sócrates de aplicar la filosofía al estudio de los asuntos humanos, incluyendo la naturaleza humana, la naturaleza de las comunidades políticas y el propio conocimiento humano. El método socrático, tal y como se documenta en los diálogos de Platón, es un método dialéctico de eliminación de hipótesis: se encuentran mejores hipótesis identificando y eliminando constantemente las que conducen a contradicciones. Se trata de una reacción al énfasis de los sofistas en la retórica. El método socrático busca verdades generales, comúnmente sostenidas, que dan forma a las creencias y las escudriña para determinar su consistencia con otras creencias. Sócrates criticó el tipo de estudio más antiguo de la física por ser demasiado puramente especulativo y carente de autocrítica. Sócrates fue más tarde, en palabras de su "Apología", acusado de corromper a la juventud de Atenas porque "no creía en los dioses en los que cree el Estado, sino en otros nuevos seres espirituales". Sócrates refutó estas afirmaciones, pero fue condenado a muerte.


title: Ciencia

text: Aristóteles creó posteriormente un programa sistemático de filosofía teleológica: El movimiento y el cambio se describen como la actualización de los potenciales que ya están en las cosas, según el tipo de cosas que sean. En su física, el Sol gira alrededor de la Tierra, y muchas cosas tienen como parte de su naturaleza que son para los humanos. Cada cosa tiene una causa formal, una causa final, y un papel en un orden cósmico con un impulsor inmóvil. Los socráticos también insistieron en que la filosofía debería utilizarse para considerar la cuestión práctica de la mejor manera de vivir para un ser humano (un estudio que Aristóteles dividió en ética y filosofía política). Aristóteles sostenía que el hombre conoce una cosa científicamente "cuando posee una convicción a la que ha llegado de una manera determinada, y cuando los primeros principios sobre los que descansa esa convicción le son conocidos con certeza".


title: Ciencia

text: El astrónomo griego Aristarco de Samos (310-230 a.C.) fue el primero en proponer un modelo heliocéntrico del universo, con el Sol en el centro y todos los planetas orbitando alrededor de él. El modelo de Aristarco fue ampliamente rechazado porque se creía que violaba las leyes de la física.El inventor y matemático Archimedes de Siracusa hizo importantes contribuciones a los inicios del cálculoy a veces se le ha atribuido como su inventor, aunque su protocálculo carecía de varias características definitorias.Plinio el Viejo fue un escritor y polímata romano, que escribió la enciclopedia seminal "Historia Natural", que se ocupan de la historia, la geografía, la medicina, la astronomía, las ciencias de la tierra, la botánica y la zoología.Otros científicos o protocientíficos de la Antigüedad fueron Teofrasto, Euclides, Herófilo, Hiparco, Ptolomeo y Galeno.


title: Command & Conquer

text: Command & Conquer es una franquicia de videojuegos de estrategia en tiempo real, originalmente creada por Westwood Studios y posteriormente adquirida por Electronic Arts. "Command & Conquer" es considerada un hito y una figura icónica en la industria de los videojuegos de PC, y su comunidad de seguidores es sumamente activa en cooperación con los actuales poseedores de la licencia.


title: Command & Conquer

text: En su inicio, la historia de Command & Conquer estaba diseñada para ser una continuidad histórica alternativa a nuestra propia realidad. Sin embargo, con la aparición de nuevas entregas, la historia terminó ramificándose en tres variantes. La primera de ellas sigue la historia original de las Guerras Tiberianas; la segunda, Red Alert, trata sobre la guerra de los aliados contra los soviéticos; y la tercera, denominada Generals, muestra un futuro mundial no muy ajeno a la actual realidad política global. Originalmente Red Alert había sido diseñada como una precuela de Tiberian Dawn, pero con la aparición de posteriores juegos quedó oficialmente desvinculada y muy probablemente continúe de esta forma debido a la pérdida del público tras abandonar la idea original y dedicarla a la propaganda militar con la migración del género e introduciendo bandos "árabes y chinos" y alejándose de la historia "tiberiana" tanto como de su público objetivo. Existe un motivo por el que se han censurado muchos juegos: "incitar a supuestos conflictos entre naciones" y por lo que parece que el poco aclamado Generals 2 no ha visto la luz. En el caso de las Guerras Tiberianas, como en las de Red Alert, este artículo sigue las líneas argumentales utilizadas por Westwood, aunque en estos juegos generalmente hay dos líneas argumentales posibles.


title: Command & Conquer

text: El guion original de Command & Conquer, cuya primera entrega ahora es conocida como Tiberian Dawn ("Amanecer Tiberiano"), basa su argumento en la aparición del Tiberio, una sustancia de origen extraterrestre que en 1995 se infiltra en el ecosistema planetario mutándolo mediante la extracción de los recursos del mismo y su concentración en cristales relativamente fáciles de recolectar. La humanidad descubre que la sustancia traída por el meteorito es una fuente importante de materia prima, perfecta como fuente de recursos industriales y energéticos (como la madera lo fue en su tiempo).


title: Command & Conquer

text: Pronto, sin embargo, se descubre que el Tiberio es altamente dañino para todas las formas de vida basadas en el carbono, humanos incluidos. Este factor genera una creciente inestabilidad mundial, particularmente en países de climas cálidos, donde el Tiberio se expande a mayor velocidad (probablemente debido a que la mutación molecular se ve favorecida por una mayor actividad térmica).


title: Command & Conquer

text: En Tiberian Dawn, un asteroide de un material inicialmente desconocido impacta el planeta en diversas áreas, cubriendo en mayor o menor medida al 75% de la superficie. Inicialmente y después de que la situación política se tranquiliza, una poderosa organización paramilitar seudorreligiosa de oscuros orígenes conocida como la Hermandad de Nod se ve interesada en la explotación y desarrollo de tecnologías basadas en el Tiberio, cuyas ganancias económicas obtenidas de estas acciones le permiten subvencionar sus planes de dominación mundial. Ante esta situación, la Organización de las Naciones Unidas autoriza la creación de una fuerza militar denominada GDI ("Global Defense Initiative" o Iniciativa Global de Defensa) para hacer frente a la amenaza de Nod. Pronto el mundo se ve envuelto en una guerra abierta entre ambas facciones. En esta guerra, los ejércitos de la GDI hacen frente a Nod logrando considerables victorias en el campo de batalla. Sin embargo, una campaña mediática por parte de Nod hace difícil mantener la GDI como institución, desacreditándola públicamente y forzándola a actuar en la clandestinidad. Tras un fallido ataque contra Estados Unidos por parte de Nod y la recuperación de su estatus legal, la GDI localiza a Kane, líder de la Hermandad de Nod, y su centro de mando en el Templo Base de Sarajevo. La GDI realiza un asalto acorazado conjuntamente con un ataque de bombardeo mediante el Cañón Orbital de Iones en un supremo esfuerzo por poner fin a la Primera Guerra Tiberiana.