martes, 28 de mayo de 2013

Lenguaje de máquina


Lenguaje de máquina del Intel 8088. El código de máquina en hexadecimal se resalta en rojo, el equivalente en lenguaje ensamblador en magenta, y las direcciones de memoria donde se encuentra el código, en azul. Abajo se ve un texto en hexadecimal y ASCII.
El lenguaje de máquina o código máquina es el sistema de códigos directamente interpretable por un circuito microprogramable, como el microprocesador de una computadora o el microcontrolador de un autómata. Este lenguaje está compuesto por un conjunto de instrucciones que determinan acciones al ser tomadas por la máquina. Un programa consiste en una cadena de estas instrucciones más un conjunto de datos sobre el cual se trabaja. Estas instrucciones son normalmente ejecutadas en secuencia, con eventuales cambios de flujo causados por el propio programa o eventos externos. El lenguaje de máquina es específico de la arquitectura de la máquina, aunque el conjunto de instrucciones disponibles pueda ser similar entre arquitecturas distintas.

Los circuitos microprogramables son sistemas digitales, lo que significa que trabajan con dos únicos niveles de tensión. Dichos niveles, por abstracción, se simbolizan con los números 0 y 1, por eso el lenguaje de máquina sólo utiliza dichos signos. Esto permite el empleo de las teorías del álgebra booleana y del sistema binario en el diseño de este tipo de circuitos y en su programación.

Una visión típica de la arquitectura de computadoras como una serie de capas de abstracción: hardware, firmware, ensamblador, kernel, sistema operativo y aplicaciones.
Claude Elwood Shannon, en su libro Analysis of Relay and Switching Circuits, y con sus experiencias en redes de conmutación, sentó las bases para la aplicación del álgebra de Boole a las redes de conmutación. Una red de conmutación es un circuito de interruptores eléctricos que al cumplir ciertas combinaciones booleanas con las variables de entrada, define el estado de la salida. Este concepto es el núcleo de las puertas lógicas, las cuales son, por su parte, los ladrillos con que se construyen sistemas lógicos cada vez más complejos. Shannon utilizaba el relé como dispositivo físico de conmutación en sus redes, dado que el relé, a igual que una lámpara eléctrica, posee dos estados: activado (encendido) o desactivado (apagado). El desarrollo tecnológico ha permitido evolucionar desde las redes de relés electromagnéticos a circuitos con tubos de vacío, luego a redes transistorizadas, hasta llegar a los modernos circuitos integrados, en cuya cúspide se encuentran los circuitos microprogramados.

Sistema binario

El sistema binario, en ciencias e informática, es un sistema de numeración en el que los números se representan utilizando solamente las cifras cero y uno (0 y 1). Es el que se utiliza en las computadoras, debido a que trabajan internamente con dos niveles de voltaje, por lo cual su sistema de numeración natural es el sistema binario (encendido 1, apagado 0).

Lenguaje ensamblador


Lenguaje de máquina del Intel 8088. El código de máquina en hexadecimal se resalta en rojo, el equivalente en lenguaje assembler en magenta, y las direcciones de memoria donde se encuentra el código, en azul. Abajo se ve un texto en hexadecimal y ASCII.
El lenguaje ensamblador, o assembler (assembly language en inglés), es un lenguaje de programación de bajo nivel para los computadores, microprocesadores, microcontroladores y otros circuitos integrados programables. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. Esta representación es usualmente definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico de cierta arquitectura de computador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel, que idealmente son portátiles.

Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje ensamblador al código de máquina del computador objetivo. El ensamblador realiza una traducción más o menos isomorfa (un mapeo de uno a uno) desde las sentencias mnemónicas a las instrucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel, en los cuales una sola declaración generalmente da lugar a muchas instrucciones de máquina.

Muchos sofisticados ensambladores ofrecen mecanismos adicionales para facilitar el desarrollo del programa, controlar el proceso de ensamblaje, y la ayuda de depuración. Particularmente, la mayoría de los ensambladores modernos incluyen una facilidad de macro (descrita más abajo), y son llamados macro ensambladores.

Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se contaba con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente se utiliza con frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la manipulación directa de hardware, altos rendimientos, o un uso de recursos controlado y reducido.
Muchos dispositivos programables (como los microcontroladores) aún cuentan con el ensamblador como la única manera de ser manipulados.

Programación


La programación es el proceso de diseñar, codificar, depurar y mantener el código fuente de programas computacionales. El código fuente es escrito en un lenguaje de programación. El propósito de la programación es crear programas que exhiban un comportamiento deseado. El proceso de escribir código requiere frecuentemente conocimientos en varias áreas distintas, además del dominio del lenguaje a utilizar, algoritmos especializados y lógica formal. Programar no involucra necesariamente otras tareas tales como el análisis y diseño de la aplicación (pero sí el diseño del código), aunque sí suelen estar fusionadas en el desarrollo de pequeñas aplicaciones.

Historia

Para crear un programa, y que la computadora lo interprete y ejecute las instrucciones escritas en él, debe usarse un lenguaje de programación. En sus inicios las computadoras interpretaban sólo instrucciones en un lenguaje específico, del más bajo nivel, conocido como código máquina, siendo éste excesivamente complicado para programar. De hecho sólo consiste en cadenas de números 1 y 0 (sistema binario). Para facilitar el trabajo de programación, los primeros científicos que trabajaban en el área decidieron reemplazar las instrucciones, secuencias de unos y ceros, por palabras o letras provenientes del inglés; las codificaron y crearon así un lenguaje de mayor nivel, que se conoce como Assembly o lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabra inglesa add (sumar). En realidad escribir en lenguaje ensamblador es básicamente lo mismo que hacerlo en lenguaje máquina, pero las letras y palabras son bastante más fáciles de recordar y entender que secuencias de números binarios. A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se hizo necesario disponer de un método sencillo para programar. Entonces, se crearon los lenguajes de alto nivel. Mientras que una tarea tan trivial como multiplicar dos números puede necesitar un conjunto de instrucciones en lenguaje ensamblador, en un lenguaje de alto nivel bastará con solo una. Una vez que se termina de escribir un programa, sea en ensamblador o en un lenguaje de alto nivel, es necesario compilarlo, es decir, traducirlo a lenguaje máquina.1

Léxico y programación

La programación se rige por reglas y un conjunto más o menos reducido de órdenes, expresiones, instrucciones y comandos que tienden a asemejarse a una lengua natural acotada (en inglés); y que además tienen la particularidad de una reducida ambigüedad. Cuanto menos ambiguo es un lenguaje de programación, se dice, es más potente. Bajo esta premisa, y en el extremo, el lenguaje más potente existente es el binario, con ambigüedad nula (lo cual lleva a pensar así del lenguaje ensamblador).
En los lenguajes de programación de alto nivel se distinguen diversos elementos entre los que se incluyen el léxico propio del lenguaje y las reglas semánticas y sintácticas.

Programas y algoritmos

Un algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones que han de seguirse para resolver un problema. Un programa normalmente implementa (traduce a un lenguaje de programación concreto) uno o más algoritmos. Un algoritmo puede expresarse de distintas maneras: en forma gráfica, como un diagrama de flujo, en forma de código como en pseudocódigo o un lenguaje de programación, en forma explicativa, etc.
Los programas suelen subdividirse en partes menores, llamadas módulos, de modo que la complejidad algorítmica de cada una de las partes sea menor que la del programa completo, lo cual ayuda al desarrollo del programa. Esta es una práctica muy utilizada y se conoce como "refino progresivo".
Según Niklaus Wirth, un programa está formado por los algoritmos y la estructura de datos.
Se han propuesto diversas técnicas de programación cuyo objetivo es mejorar tanto el proceso de creación de software como su mantenimiento. Entre ellas, se pueden mencionar las siguientes:
  • programación declarativa
  • programación estructurada
  • programación modular
  • programación orientada a objetos

Compilación

El programa escrito en un lenguaje de programación (fácilmente comprensible por el programador) es llamado programa fuente y no se puede ejecutar directamente en una computadora. La opción más común es compilar el programa obteniendo un módulo objeto, aunque también puede ejecutarse en forma más directa a través de un intérprete informático.
El código fuente del programa se debe someter a un proceso de traducción para convertirlo en lenguaje máquina, código esté directamente ejecutable por el procesador. A este proceso se le llama compilación.
Habitualmente la creación de un programa ejecutable (un típico.exe para Microsoft 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 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.
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 sólo temporalmente. Un programa podría tener partes escritas en varios lenguajes (por ejemplo C, C++ y ensamblador), que se podrían compilar de forma independiente y luego enlazar juntas para formar un único módulo ejecutable.

Programación e ingeniería del software

Existe una tendencia a identificar el proceso de creación de un programa informático con la programación, que es cierta cuando se trata de programas pequeños para uso personal, y que dista de la realidad cuando se trata de grandes proyectos.
El proceso de creación de software, desde el punto de vista de la ingeniería, incluye los siguientes pasos:
  1. Reconocer la necesidad de un programa para solucionar un problema o identificar la posibilidad de automatización de una tarea.
  2. Recoger los requisitos del programa. Debe quedar claro qué es lo que debe hacer el programa y para qué se necesita.
  3. Realizar el análisis de los requisitos del programa. Debe quedar claro cómo debe realizar el programa las cosas que debe hacer. Las pruebas que comprueben la validez del programa se pueden especificar en esta fase.
  4. Diseñar la arquitectura del programa. Se debe descomponer el programa en partes de complejidad abordable.
  5. Implementar el programa. Consiste en realizar un diseño detallado, especificando completamente todo el funcionamiento del programa, tras lo cual la codificación (programación propiamente dicha) debería resultar inmediata.
  6. Implantar (instalar) el programa. Consiste en poner el programa en funcionamiento junto con los componentes que pueda necesitar (bases de datos, redes de comunicaciones, etc.).
La ingeniería del software se centra en los pasos de planificación y diseño del programa, mientras que antiguamente (programación artesanal) la realización de un programa consistía casi únicamente en escribir el código, bajo sólo el conocimiento de los requisitos y con una modesta fase de análisis y diseño.

Referencias históricas

La primera programadora de computadoras conocida fue Ada Lovelace, hija de Anabella Milbanke Byron y Lord Byron. Anabella introdujo en las matemáticas a Ada quien, después de conocer a Charles Babbage, tradujo y amplió una descripción de su máquina analítica. Incluso, aunque Babbage nunca completó la construcción de cualquiera de sus máquinas, el trabajo que Ada realizó con éstas le hizo ganarse el título de primera programadora de computadoras del mundo. El nombre del lenguaje de programación Ada fue escogido como homenaje a esta programadora.
Este proceso está aplicado a todos los métodos científicos que actualmente se practican.

Objetivos de la programación

La programación debe perseguir la obtención de programas de calidad. Para ello se establece una serie de factores que determinan la calidad de un programa. Algunos de los factores de calidad más importantes son los siguientes:
  • Corrección. Un programa es correcto si hace lo que debe hacer tal y como se estableció en las fases previas a su desarrollo. Para determinar si un programa hace lo que debe, es muy importante especificar claramente qué debe hacer el programa antes de desarrollarlo y, una vez acabado, compararlo con lo que realmente hace.
  • Claridad. Es muy importante que el programa sea lo más claro y legible posible, para facilitar así su desarrollo y posterior mantenimiento. Al elaborar un programa se debe intentar que su estructura sea sencilla y coherente, así como cuidar el estilo en la edición; de esta forma se ve facilitado el trabajo del programador, tanto en la fase de creación como en las fases posteriores de corrección de errores, ampliaciones, modificaciones, etc. Fases que pueden ser realizadas incluso por otro programador, con lo cual la claridad es aún más necesaria para que otros programadores puedan continuar el trabajo fácilmente. Algunos programadores llegan incluso a utilizar Arte ASCII para delimitar secciones de código. Otros, por diversión o para impedir un análisis cómodo a otros programadores, recurren al uso de código ofuscado.
  • Eficiencia. Se trata de que el programa, además de realizar aquello para lo que fue creado (es decir, que sea correcto), lo haga gestionando de la mejor forma posible los recursos que utiliza. Normalmente, al hablar de eficiencia de un programa, se suele hacer referencia al tiempo que tarda en realizar la tarea para la que ha sido creado y a la cantidad de memoria que necesita, pero hay otros recursos que también pueden ser de consideración al obtener la eficiencia de un programa, dependiendo de su naturaleza (espacio en disco que utiliza, tráfico de red que genera, etc.).
  • Portabilidad. Un programa es portable cuando tiene la capacidad de poder ejecutarse en una plataforma, ya sea hardware o software, diferente a aquélla en la que se elaboró. La portabilidad es una característica muy deseable para un programa, ya que permite, por ejemplo, a un programa que se ha desarrollado para sistemas GNU/Linux ejecutarse también en la familia de sistemas operativos Windows. Esto permite que el programa pueda llegar a más usuarios más fácilmente.

Ciclo de vida del software

El término ciclo de vida del software describe el desarrollo de software, desde la fase inicial hasta la fase final. El propósito de este programa es definir las distintas fases intermedias que se requieren para validar el desarrollo de la aplicación, es decir, para garantizar que el software cumpla los requisitos para la aplicación y verificación de los procedimientos de desarrollo: se asegura de que los métodos utilizados son apropiados. Estos programas se originan en el hecho de que es muy costoso rectificar los errores que se detectan tarde dentro de la fase de implementación. El ciclo de vida permite que los errores se detecten lo antes posible y por lo tanto, permite a los desarrolladores concentrarse en la calidad del software, en los plazos de implementación y en los costos asociados. El ciclo de vida básico de un software consta de los siguientes procedimientos:
  • Definición de objetivos: definir el resultado del proyecto y su papel en la estrategia global.
  • Análisis de los requisitos y su viabilidad: recopilar, examinar y formular los requisitos del cliente y examinar cualquier restricción que se pueda aplicar.
  • Diseño general: requisitos generales de la arquitectura de la aplicación.
  • Diseño en detalle: definición precisa de cada subconjunto de la aplicación.
  • Programación (programación e implementación): es la implementación de un lenguaje de programación para crear las funciones definidas durante la etapa de diseño.
  • Prueba de unidad: prueba individual de cada subconjunto de la aplicación para garantizar que se implementaron de acuerdo con las especificaciones.
  • Integración: para garantizar que los diferentes módulos se integren con la aplicación. Éste es el propósito de la prueba de integración que está cuidadosamente documentada.
  • Prueba beta (o validación), para garantizar que el software cumple con las especificaciones originales.
  • Documentación: sirve para documentar información necesaria para los usuarios del software y para desarrollos futuros.
  • Mantenimiento: para todos los procedimientos correctivos (mantenimiento correctivo) y las actualizaciones secundarias del software (mantenimiento continuo).
El orden y la presencia de cada uno de estos procedimientos en el ciclo de vida de una aplicación dependen del tipo de modelo de ciclo de vida acordado entre el cliente y el equipo de desarrolladores.

Conectiva lógica


En lógica, una conectiva lógica, o simplemente conectiva, es un símbolo que se utiliza para conectar dos fórmulas, de modo que el valor de verdad de la fórmula compuesta dependa del valor de verdad de las fórmulas componentes.

En programación se utilizan para combinar valores de verdad y obtener nuevos valores que determinen el flujo de control de un algoritmo o programa.
Las conectivas lógicas son, junto con los cuantificadores, las principales constantes lógicas de muchos sistemas lógicos, principalmente la lógica proposicional y la lógica de predicados.

Conectivas

Las conectivas son funciones de verdad. Quiere decir que son funciones que toman uno o dos valores de verdad, y devuelven un único valor de verdad. En consecuencia, cada conectiva lógica puede ser definida mediante una tabla de valores de verdad que indique qué valor devuelve la conectiva para cada combinación de valores de verdad. A continuación hay una tabla con las conectivas más usuales y su definición mediante tablas de verdad:
Conectiva Notación Ejemplo
de uso
Análogo
natural
Ejemplo de uso en
el lenguaje natural
Tabla de verdad
Negación \neg,\sim \, \neg p \, no No está lloviendo. \begin{array}{c||c}
      \phi & \neg \phi \\
      \hline
      1 & 0 \\
      0 & 1 \\
   \end{array}
Conjunción \and,\And, \cdot \, p \and q \, y Está lloviendo y es de noche. \begin{array}{c|c||c}
      \phi & \psi & \phi \and \psi \\
      \hline
      1 & 1 & 1 \\
      1 & 0 & 0 \\
      0 & 1 & 0 \\
      0 & 0 & 0 \\
   \end{array}
Disyunción \or \, p \or q \, o Está lloviendo o es de noche. \begin{array}{c|c||c}
      \phi & \psi & \phi \or \psi \\
      \hline
      1 & 1 & 1 \\
      1 & 0 & 1 \\
      0 & 1 & 1 \\
      0 & 0 & 0 \\
   \end{array}
Condicional material \to,\supset p \to q \, si... entonces Si está lloviendo, entonces es de noche. \begin{array}{c|c||c}
      \phi & \psi & \phi \to \psi \\
      \hline
      1 & 1 & 1 \\
      1 & 0 & 0 \\
      0 & 1 & 1 \\
      0 & 0 & 1 \\
   \end{array}
Bicondicional \leftrightarrow, \equiv \, p \leftrightarrow q \, si y sólo si Está lloviendo si y sólo si es de noche. \begin{array}{c|c||c}
      \phi & \psi & \phi \leftrightarrow \psi \\
      \hline
      1 & 1 & 1 \\
      1 & 0 & 0 \\
      0 & 1 & 0 \\
      0 & 0 & 1 \\
   \end{array}
Negación
conjunta
\downarrow \, p \downarrow q \, ni... ni Ni está lloviendo ni es de noche. \begin{array}{c|c||c}
      \phi & \psi & \phi \downarrow \psi \\
      \hline
      1 & 1 & 0 \\
      1 & 0 & 0 \\
      0 & 1 & 0 \\
      0 & 0 & 1 \\
   \end{array}
Disyunción
excluyente
\nleftrightarrow, \oplus, \not\equiv, W p \nleftrightarrow q \, o bien... o bien O bien está lloviendo, o bien es de noche. \begin{array}{c|c||c}
      \phi & \psi & \phi \nleftrightarrow \psi \\
      \hline
      1 & 1 & 0 \\
      1 & 0 & 1 \\
      0 & 1 & 1 \\
      0 & 0 & 0 \\
   \end{array}

miércoles, 22 de mayo de 2013

ASCII


Hay 95 caracteres ASCII imprimibles, numerados del 32 al 126.
 
ASCII (acrónimo inglés de American Standard Code for Information Interchange — Código Estándar Estadounidense para el Intercambio de Información), pronunciado generalmente [áski] o [ásci] , es un código de caracteres basado en el alfabeto latino, tal como se usa en inglés moderno y en otras lenguas occidentales. Fue creado en 1963 por el Comité Estadounidense de Estándares (ASA, conocido desde 1969 como el Instituto Estadounidense de Estándares Nacionales, o ANSI) como una refundición o evolución de los conjuntos de códigos utilizados entonces en telegrafía. Más tarde, en 1967, se incluyeron las minúsculas, y se redefinieron algunos códigos de control para formar el código conocido como US-ASCII.

El código ASCII utiliza 7 bits para representar los caracteres, aunque inicialmente empleaba un bit adicional (bit de paridad) que se usaba para detectar errores en la transmisión. A menudo se llama incorrectamente ASCII a otros códigos de caracteres de 8 bits, como el estándar ISO-8859-1 que es una extensión que utiliza 8 bits para proporcionar caracteres adicionales usados en idiomas distintos al inglés, como el español.
ASCII fue publicado como estándar por primera vez en 1967 y fue actualizado por última vez en 1986. En la actualidad define códigos para 32 caracteres no imprimibles, de los cuales la mayoría son caracteres de control obsoletos que tienen efecto sobre cómo se procesa el texto, más otros 95 caracteres imprimibles que les siguen en la numeración (empezando por el carácter espacio). Casi todos los sistemas informáticos actuales utilizan el código ASCII o una extensión compatible para representar textos y para el control de dispositivos que manejan texto como el teclado. No deben confundirse los códigos ALT+número de teclado con los códigos ASCII.

Vista general

Las computadoras solamente entienden números. El código ASCII es una representación numérica de un carácter como ‘a’ o ‘@’.
Como otros códigos de formato de representación de caracteres, el ASCII es un método para una correspondencia entre cadenas de bits y una serie de símbolos (alfanuméricos y otros), permitiendo de esta forma la comunicación entre dispositivos digitales así como su procesado y almacenamiento. El código de caracteres ASCII —o una extensión compatible (ver más abajo)— se usa casi en todos los ordenadores, especialmente con ordenadores personales y estaciones de trabajo. El nombre más apropiado para este código de caracteres es "US-ASCII".


  ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  




ASCII es, en sentido estricto,un código de siete bits, lo que significa que usa cadenas de bits representables con siete dígitos binarios (que van de 0 a 127 en base decimal) para representar información de caracteres. En el momento en el que se introdujo el código ASCII muchos ordenadores trabajaban con grupos de ocho bits (bytes u octetos), como la unidad mínima de información; donde el octavo bit se usaba habitualmente como bit de paridad con funciones de control de errores en líneas de comunicación u otras funciones específicas del dispositivo. Las máquinas que no usaban la comprobación de paridad asignaban al octavo bit el valor cero en la mayoría de los casos, aunque otros sistemas como las computadoras Prime, que ejecutaban PRIMOS ponían el octavo bit del código ASCII a uno.
El código ASCII define una relación entre caracteres específicos y secuencias de bits; además de reservar unos cuantos códigos de control para el procesador de textos, y no define ningún mecanismo para describir la estructura o la apariencia del texto en un documento; estos asuntos están especificados por otros lenguajes como los lenguajes de etiquetas.

Historia

La carta de Código ASCII 1968 de los E.E.U.U. fue estructurada con dos columnas de caracteres de control, una columna con caracteres especiales, una columna con números, y cuatro columnas de letras
 
El código ASCII se desarrolló en el ámbito de la telegrafía y se usó por primera vez comercialmente como un código de teleimpresión impulsado por los servicios de datos de Bell. Bell había planeado usar un código de seis bits, derivado de Fieldata, que añadía puntuación y letras minúsculas al más antiguo código de teleimpresión Baudot, pero se les convenció para que se unieran al subcomité de la Agencia de Estándares Estadounidense (ASA), que habían empezado a desarrollar el código ASCII. Baudot ayudó en la automatización del envío y recepción de mensajes telegráficos, y tomó muchas características del código Morse; sin embargo, a diferencia del código Morse, Baudot usó códigos de longitud constante. Comparado con los primeros códigos telegráficos, el código propuesto por Bell y ASA resultó en una reorganización más conveniente para ordenar listas (especialmente porque estaba ordenado alfabéticamente) y añadió características como la 'secuencia de escape'.

La Agencia de Estándares Estadounidense (ASA), que se convertiría más tarde en el Instituto Nacional Estadounidense de Estándares (ANSI), publicó por primera vez el código ASCII en 1963. El ASCII publicado en 1963 tenía una flecha apuntando hacia arriba (↑) en lugar del circunflejo (^) y una flecha apuntando hacia la izquierda en lugar del guion bajo (_). La versión de 1967 añadió las letras minúsculas, cambió los nombres de algunos códigos de control y cambió de lugar los dos códigos de control ACK y ESC de la zona de letras minúsculas a la zona de códigos de control.
ASCII fue actualizado en consecuencia y publicado como ANSI X3.4-1968, ANSI X3.4-1977, y finalmente ANSI X3.4-1986.

Otros órganos de estandarización han publicado códigos de caracteres que son idénticos a ASCII. Estos códigos de caracteres reciben a menudo el nombre de ASCII, a pesar de que ASCII se define estrictamente solamente por los estándares ASA/ANSI:
  • La Asociación Europea de Fabricantes de Ordenadores (ECMA) publicó ediciones de su clon de ASCII, ECMA-6 en 1965, 1967, 1970, 1973, 1983, y 1991. La edición de 1991 es idéntica a ANSI X3.4-1986.
  • La Organización Internacional de Estandarización (ISO) publicó su versión, ISO 646 (más tarde ISO/IEC 646) en 1967, 1972, 1983 y 1991. En particular, ISO 646:1972 estableció un conjunto de versiones específicas para cada país donde los caracteres de puntuación fueron reemplazados con caracteres no ingleses. ISO/IEC 646:1991 La International Reference Version es la misma que en el ANSI X3.4-1986.
  • La Unión Internacional de Telecomunicaciones (ITU) publicó su versión de ANSI X3.4-1986, Recomendación ITU T.50, en 1992. A principios de la década de 1970 publicó una versión como Recomendación CCITT V.3.
  • DIN publicó una versión de ASCII como el estándar DIN 66003 en 1974.
  • El Grupo de Trabajo en Ingeniería de Internet (IETF) publicó una versión en 1969 como RFC 20, y estableció la versión estándar para Internet, basada en ANSI X3.4-1986, con la publicación de RFC 1345 en 1992.
  • La versión de IBM de ANSI X3.4-1986 se publicó en la literatura técnica de IBM como página de códigos 367.
El código ASCII también está incluido en su probable relevo, Unicode, constituyendo los primeros 128 caracteres (o los 'más bajos').

Los caracteres de control ASCII

El código ASCII reserva los primeros 32 códigos (numerados del 0 al 31 en decimal) para caracteres de control: códigos no pensados originalmente para representar información imprimible, sino para controlar dispositivos (como impresoras) que usaban ASCII. Por ejemplo, el carácter 10 representa la función "nueva línea" (line feed), que hace que una impresora avance el papel, y el carácter 27 representa la tecla "escape" que a menudo se encuentra en la esquina superior izquierda de los teclados comunes.
El código 127 (los siete bits a uno), otro carácter especial, equivale a "suprimir" ("delete"). Aunque esta función se asemeja a otros caracteres de control, los diseñadores de ASCII idearon este código para poder "borrar" una sección de papel perforado (un medio de almacenamiento popular hasta la década de 1980) mediante la perforación de todos los agujeros posibles de una posición de carácter concreta, reemplazando cualquier información previa. Dado que el código 0 era ignorado, fue posible dejar huecos (regiones de agujeros) y más tarde hacer correcciones.

Muchos de los caracteres de control ASCII servían para marcar paquetes de datos, o para controlar protocolos de transmisión de datos (por ejemplo ENQuiry, con el significado: ¿hay alguna estación por ahí?, ACKnowledge: recibido o ", Start Of Header: inicio de cabecera, Start of TeXt: inicio de texto, End of TeXt: final de texto, etc.). ESCape y SUBstitute permitían a un protocolo de comunicaciones, por ejemplo, marcar datos binarios para que contuviesen códigos con el mismo código que el carácter de protocolo, y que el receptor pudiese interpretarlos como datos en lugar de como caracteres propios del protocolo.
Los diseñadores del código ASCII idearon los caracteres de separación para su uso en sistemas de cintas magnéticas.

Dos de los caracteres de control de dispositivos, comúnmente llamados XON y XOFF generalmente ejercían funciones de caracteres de control de flujo para controlar el flujo a hacia un dispositivo lento (como una impresora) desde un dispositivo rápido (como un ordenador), de forma que los datos no saturasen la capacidad de recepción del dispositivo lento y se perdiesen.

Los primeros usuarios de ASCII adoptaron algunos de los códigos de control para representar "metainformación" como final-de-línea, principio/final de un elemento de datos, etc. Estas asignaciones a menudo entraban en conflicto, así que parte del esfuerzo de convertir datos de un formato a otro comporta hacer las conversiones correctas de metainformación. Por ejemplo, el carácter que representa el final-de-línea en ficheros de texto varía con el sistema operativo. Cuando se copian archivos de un sistema a otro, el sistema de conversión debe reconocer estos caracteres como marcas de final-de-línea y actuar en consecuencia.

Actualmente los usuarios de ASCII usan menos los caracteres de control, (con algunas excepciones como "retorno de carro" o "nueva línea"). Los lenguajes modernos de etiquetas, los protocolos modernos de comunicación, el paso de dispositivos basados en texto a basados en gráficos, el declive de las teleimpresoras, las tarjetas perforadas y los papeles continuos han dejado obsoleta la mayoría de caracteres de control.

Binario Decimal Hex Abreviatura Repr AT Nombre/Significado
0000 0000 0 00 NUL ^@ Carácter Nulo
0000 0001 1 01 SOH ^A Inicio de Encabezado
0000 0010 2 02 STX ^B Inicio de Texto
0000 0011 3 03 ETX ^C Fin de Texto
0000 0100 4 04 EOT ^D Fin de Transmisión
0000 0101 5 05 ENQ ^E Consulta
0000 0110 6 06 ACK ^F Acuse de recibo
0000 0111 7 07 BEL ^G Timbre
0000 1000 8 08 BS ^H Retroceso
0000 1001 9 09 HT ^I Tabulación horizontal
0000 1010 10 0A LF ^J Salto de línea
0000 1011 11 0B VT ^K Tabulación Vertical
0000 1100 12 0C FF ^L De avance
0000 1101 13 0D CR ^M Retorno de carro
0000 1110 14 0E SO ^N Mayúsculas fuera
0000 1111 15 0F SI ^O En mayúsculas
0001 0000 16 10 DLE ^P Enlace de datos / Escape
0001 0001 17 11 DC1 ^Q Dispositivo de control 1 — oft. XON
0001 0010 18 12 DC2 ^R Dispositivo de control 2
0001 0011 19 13 DC3 ^S Dispositivo de control 3 — oft. XOFF
0001 0100 20 14 DC4 ^T Dispositivo de control 4
0001 0101 21 15 NAK ^U Confirmación negativa
0001 0110 22 16 SYN ^V Síncrono en espera
0001 0111 23 17 ETB ^W Fin de Transmisión del Bloque
0001 1000 24 18 CAN ^X Cancelar
0001 1001 25 19 EM ^Y Finalización del Medio
0001 1010 26 1A SUB ^Z Substituto
0001 1011 27 1B ESC ^[ or ESC Escape
0001 1100 28 1C FS ^\ Separador de fichero
0001 1101 29 1D GS ^] Separador de grupo
0001 1110 30 1E RS ^^ Separador de registro
0001 1111 31 1F US ^_ Separador de unidad
0111 1111 127 7F DEL ^?, Delete o Backspace Eliminar

Caracteres imprimibles ASCII

El carácter 'espacio', designa al espacio entre palabras, y se produce normalmente por la barra espaciadora de un teclado. Los códigos del 33 al 126 se conocen como caracteres imprimibles, y representan letras, dígitos, signos de puntuación y varios símbolos.
El ASCII de siete bits proporciona siete caracteres "nacionales" y, si la combinación concreta de hardware y software lo permite, puede utilizar combinaciones de teclas para simular otros caracteres internacionales: en estos casos un backspace puede preceder a un acento abierto o grave (en los estándares británico y estadounidense, pero sólo en estos estándares, se llama también "opening single quotation mark"), una tilde o una "marca de respiración".

Binario Dec Hex Representación
0010 0000 32 20 espacio ( )
0010 0001 33 21 !
0010 0010 34 22 "
0010 0011 35 23 #
0010 0100 36 24 $
0010 0101 37 25 %
0010 0110 38 26 &
0010 0111 39 27 '
0010 1000 40 28 (
0010 1001 41 29 )
0010 1010 42 2A *
0010 1011 43 2B +
0010 1100 44 2C ,
0010 1101 45 2D -
0010 1110 46 2E .
0010 1111 47 2F /
0011 0000 48 30 0
0011 0001 49 31 1
0011 0010 50 32 2
0011 0011 51 33 3
0011 0100 52 34 4
0011 0101 53 35 5
0011 0110 54 36 6
0011 0111 55 37 7
0011 1000 56 38 8
0011 1001 57 39 9
0011 1010 58 3A :
0011 1011 59 3B ;
0011 1100 60 3C <
0011 1101 61 3D =
0011 1110 62 3E >
0011 1111 63 3F ?
 
Binario Dec Hex Representación
0100 0000 64 40 @
0100 0001 65 41 A
0100 0010 66 42 B
0100 0011 67 43 C
0100 0100 68 44 D
0100 0101 69 45 E
0100 0110 70 46 F
0100 0111 71 47 G
0100 1000 72 48 H
0100 1001 73 49 I
0100 1010 74 4A J
0100 1011 75 4B K
0100 1100 76 4C L
0100 1101 77 4D M
0100 1110 78 4E N
0100 1111 79 4F O
0101 0000 80 50 P
0101 0001 81 51 Q
0101 0010 82 52 R
0101 0011 83 53 S
0101 0100 84 54 T
0101 0101 85 55 U
0101 0110 86 56 V
0101 0111 87 57 W
0101 1000 88 58 X
0101 1001 89 59 Y
0101 1010 90 5A Z
0101 1011 91 5B [
0101 1100 92 5C \
0101 1101 93 5D ]
0101 1110 94 5E ^
0101 1111 95 5F _
 
Binario Dec Hex Representación
0110 0000 96 60 `
0110 0001 97 61 a
0110 0010 98 62 b
0110 0011 99 63 c
0110 0100 100 64 d
0110 0101 101 65 e
0110 0110 102 66 f
0110 0111 103 67 g
0110 1000 104 68 h
0110 1001 105 69 i
0110 1010 106 6A j
0110 1011 107 6B k
0110 1100 108 6C l
0110 1101 109 6D m
0110 1110 110 6E n
0110 1111 111 6F o
0111 0000 112 70 p
0111 0001 113 71 q
0111 0010 114 72 r
0111 0011 115 73 s
0111 0100 116 74 t
0111 0101 117 75 u
0111 0110 118 76 v
0111 0111 119 77 w
0111 1000 120 78 x
0111 1001 121 79 y
0111 1010 122 7A z
0111 1011 123 7B {
0111 1100 124 7C |
0111 1101 125 7D }
0111 1110 126 7E ~

Rasgos estructurales

  • Los dígitos del 0 al 9 se representan con sus valores prefijados con el valor 0011 en binario (esto significa que la conversión BCD-ASCII es una simple cuestión de tomar cada unidad bcd y prefijarla con 0011).
  • Las cadenas de bits de las letras minúsculas y mayúsculas sólo difieren en un bit, simplificando de esta forma la conversión de uno a otro grupo.

Otros nombres para ASCII

La RFC 1345 (publicada en junio de 1992) y el registro IANA de códigos de caracteres, reconocen los siguientes nombres alternativos para ASCII para su uso en Internet.
  • ANSI_X3.4-1968 (nombre canónico)
  • ANSI_X3.4-1986
  • ASCII
  • US-ASCII (nombre MIME recomendado)
  • us
  • ISO646-US
  • ISO_646.irv:1991
  • iso-ir-6
  • IBM367
  • cp367
  • csASCII
De estos, sólo los nombres "US-ASCII" y "ASCII" se usan ampliamente. A menudo se encuentran en el parámetro de "código de caracteres" opcional en la cabecera Content-Type de algunos mensajes MIME, en el elemento equivalente "meta" de algunos documentos HTML, y en la parte de declaración de codificación de carácter de la cabecera de algunos documentos XML.

Variantes de ASCII

A medida que la tecnología informática se difundió a lo largo del mundo, se desarrollaron diferentes estándares y las empresas desarrollaron muchas variaciones del código ASCII para facilitar la escritura de lenguas diferentes al inglés que usaran alfabetos latinos. Se pueden encontrar algunas de esas variaciones clasificadas como "ASCII Extendido", aunque en ocasiones el término se aplica erróneamente para cubrir todas las variantes, incluso las que no preservan el conjunto de códigos de caracteres original ASCII de siete bits.
La ISO 646 (1972), el primer intento de remediar el sesgo pro-inglés de la codificación de caracteres, creó problemas de compatibilidad, pues también era un código de caracteres de 7 bits. No especificó códigos adicionales, así que reasignó algunos específicamente para los nuevos lenguajes. De esta forma se volvió imposible saber en qué variante se encontraba codificado el texto, y, consecuentemente, los procesadores de texto podían tratar una sola variante.
La tecnología mejoró y aportó medios para representar la información codificada en el octavo bit de cada byte, liberando este bit, lo que añadió otros 128 códigos de carácter adicionales que quedaron disponibles para nuevas asignaciones. Por ejemplo, IBM desarrolló páginas de código de 8 bits, como la página de códigos 437, que reemplazaba los caracteres de control con símbolos gráficos como sonrisas, y asignó otros caracteres gráficos adicionales a los 128 bytes superiores de la página de códigos. Algunos sistemas operativos como DOS, podían trabajar con esas páginas de código, y los fabricantes de ordenadores personales incluyeron soporte para dichas páginas en su hardware.

Los estándares de ocho bits como ISO 8859 y Mac OS Roman fueron desarrollados como verdaderas extensiones de ASCII, dejando los primeros 127 caracteres intactos y añadiendo únicamente valores adicionales por encima de los 7-bits. Esto permitió la representación de un abanico mayor de lenguajes, pero estos estándares continuaron sufriendo incompatibilidades y limitaciones. Todavía hoy, ISO-8859-1 y su variante Windows-1252 (a veces llamada erróneamente ISO-8859-1) y el código ASCII original de 7 bits son los códigos de carácter más comúnmente utilizados.

Unicode y Conjunto de Caracteres Universal (UCS) ISO/IEC 10646 definen un conjunto de caracteres mucho mayor, y sus diferentes formas de codificación han empezado a reemplazar ISO 8859 y ASCII rápidamente en muchos entornos. Mientras que ASCII básicamente usa códigos de 7-bits, Unicode y UCS usan "code points" o apuntadores relativamente abstractos: números positivos (incluyendo el cero) que asignan secuencias de 8 o más bits a caracteres. Para permitir la compatibilidad, Unicode y UCS asignan los primeros 128 apuntadores a los mismos caracteres que el código ASCII. De esta forma se puede pensar en ASCII como un subconjunto muy pequeño de Unicode y UCS. La popular codificación UTF-8 recomienda el uso de uno a cuatro valores de 8 bits para cada apuntador, donde los primeros 128 valores apuntan a los mismos caracteres que ASCII. Otras codificaciones de caracteres como UTF-16 se parece a ASCII en cómo representan los primeros 128 caracteres de Unicode, pero tienden a usar 16 a 32 bits por carácter, así que requieren de una conversión adecuada para que haya compatibilidad entre ambos códigos de carácter.

La palabra ASCIIbético (o, más habitualmente, la palabra "inglesa" ASCIIbetical) describe la ordenación según el orden de los códigos ASCII en lugar del orden alfabético.

La abreviatura ASCIIZ o ASCIZ se refiere a una cadena de caracteres terminada en cero (del inglés "zero").

Es muy normal que el código ASCII sea embebido en otros sistemas de codificación más sofisticados y por esto debe tenerse claro cual es papel del código ASCII en la tabla o mapa de caracteres de un ordenador.

Arte ASCII

Imagen de león creada con arte ascii.
 
 
             _                 _    ____   ____ ___ ___
   __ _ _ __| |_  ____        /_\  / ___| / ___|_ _|_ _|
  / _` | '__| __|/ __ \      //_\\ \___ \| |    | | | |  
 | (_| | |  | |_|  ___/     / ___ \ ___) | |___ | | | |   
  \__,_|_|   \__|\____)    /_/   \_\____/ \____|___|___|  



El código de caracteres ASCII es el soporte de una disciplina artística minoritaria, el arte ASCII, que consiste en la composición de imágenes mediante caracteres imprimibles ASCII. El efecto resultante ha sido comparado con el puntillismo, pues las imágenes producidas con esta técnica generalmente se aprecian con más detalle al ser vistas a distancia. El arte ASCII empezó siendo un arte experimental, pero pronto se popularizó como recurso para representar imágenes en soportes incapaces de procesar gráficos, como teletipos, terminales, correos electrónicos o algunas impresoras.

Aunque se puede componer arte ASCII manualmente mediante un editor de textos, también se pueden convertir automáticamente imágenes y vídeos en ASCII mediante software, como la librería Aalib (de licencia libre), que ha alcanzado cierta popularidad. Aalib está soportada por algunos programas de diseño gráfico, juegos y reproductores de vídeo.

sábado, 20 de abril de 2013

¿Qué son las redes VPN?






Las Redes VPN o Virtual Private Networks hacen referencia a la existencia de una conexión cifrada.

Las redes VPN o Virtual Private Network es un tipo de conexión enmarcada en lo que se ha denominado como “Ciferespacio” o espacio cifrado. La evolución del gigante de Internet y su creciente importancia en las organizaciones empresariales, hace esencial la seguridad en la transmisión de informaciones entre los distintos sectores de la misma.  

En definitiva, se trata de facilitar el acceso a un equipo central desde varios puntos diferentes sin intromisiones externas. Así, la principal fortaleza de las redes VPN es la transmisión de paquetes de datos con garantías de confidencialidad, a la vez que se están difundiendo en una red pública mucho más amplia. 
La privacidad en el acceso a esta red viene determinada por sistemas de autentificación y de encriptación o cifrado de la información, haciéndola incomprensible para cualquier persona que no disponga de permiso. El uso de las redes VPN puede llevarse a cabo utilizando Internet, para el que se crean unos “túneles” que sirven como conductores, o la conexión de área local (LAN) de la propia empresa.

miércoles, 17 de abril de 2013

¿Qué son los protocolos WEP y WPA?






Los protocolos WEP y WPA hacen alusión a la protección de la red inalámbrica Wifi. Con la aparición de la tecnología Wifi cada vez más se prescinde de la conexión a través de cables sustituyéndola por el sistema inalámbrico. Pues bien, la red Wifi puede alcanzar un área de alcance bastante amplia, con lo que aquellos usuarios que se encuentren dentro de ese radio pueden hacer un uso fraudulento de ella sin consentimiento alguno. Para evitar ese intrusismo, existen dos sistemas que han ido evolucionando con el tiempo:

- Protocolo WEP (Wired Equivalent Privacy): es un sistema de cifrado de información más antiguo que el WPA, que utiliza el estándar IEEE 802.11 creado prácticamente a la vez que la red Wifi.

- Protocolo WPA (Wifi Protected Access): surgió para mejorar el anterior. Destaca por la introducción del TKIP (Temporal Key Integrity Protocol) que aumenta la protección de la red empleando un proceso de generación automática de contraseñas cada cierto tiempo. Como evolución, nacería el WPA2 con el sistema de algoritmos AES (Advanced Encryption Standard) para el cifrado.

¿Qué es hacer login?

A la hora de utilizar la mayoría de las aplicaciones informáticas, es preciso "hacer login". Aquí te explicamos este curioso término.
 
Es continuo encontrarse en las aplicaciones informáticas la expresión “hacer login”. Esta expresión inglesa se usa para definir la acción de hacer saber a una aplicación quién eres y así poder usarla.
Los datos que hay que proporcionar a la hora de hacer login varían dependiendo de la aplicación, pero lo más normal es que sean dos:
  • Nombre de usuario.
  • Contraseña (o Password) del usuario.
Esa combinación Nombre-Clave es la que le asegura a la aplicación que quien entra en la misma es quien dice ser y evita, por ejemplo, accesos no autorizados o la suplantación de personalidades.
En la siguiente figura se muestra el proceso de login de Twitter de mi cuenta (que en este caso lo denomina como “iniciar sesión”). Como ves, como nombre de usuario utiliza el nombre usado en Twitter (@jucasas) y, debajo, la clave (esa no te la digo ;) ).
Antes de poder hacer login, es necesario registrarse en la aplicación. El proceso de registro de la aplicación varía dependiendo de cada caso, aunque seguro que, al menos, te solicitarán el nombre de usuario y la clave que vayas a usar a la hora de hacer login. (Es lógico, si la aplicación no conoce cuál es tu nombre de usuario y tu clave, no tiene forma de saber que eres tú).

domingo, 7 de abril de 2013

Bucle do

El Bucle do o bucle hacer es una estructura de control de la mayoría de los lenguajes de programación estructurados cuyo propósito es repetir un bloque de código mientras se cumpla cierta condición. La diferencia con el bucle while radica que el este evalúa la condición al principio, y si está no se cumple, el código que está encerrado dentro del cuerpo del no se ejecuta. En cambio, el bucle do-while evalúa la condición para seguir ejecutándose luego de haber ejecutado el código dentro de su cuerpo, es decir siempre se ejecuta por lo menos una vez el código.

Sintaxis

La sintaxis en pseudocódigo es la siguiente:

   {\color{Sepia}      \mathit{ Hacer }} \;

   {\color{BlueViolet} \mathit{ instrucciones }} \;

   {\color{Sepia} \mathit{ Mientras}} \;
   {\color{BlueViolet} \mathit{ (condici \acute{o} n) }} \;

Condición

Al igual que el bloque while, la condición de salida ha de ser una sentencia que devuelva un valor booleano, y esta puede ser el valor booleano en sí, verdadero (true) si la condición se cumple, o falso si esta no se cumple (false). También puede contener el nombre de una variable booleana, y el valor de la expresión dependerá de su contenido. Se debe tener en cuenta que además de las variables también puede haber llamadas a funciones que devuelvan un valor.

Sentencias Comparativas

La forma más obvia tal vez, y la más usada sin duda, son las sentencias comparativas, que usan los operandos igual, diferente, menor o igual, mayor o igual, menor y mayor. En el caso del lenguaje C, se utilizan los siguientes símbolos para representar las comparaciones anteriores: ==, !=, <=, >=, <, >,

Ejemplo (usando sintaxis de C)

#include <stdio.h>
int main(){
     int a, b;
     a = 3;
     b = 5;
     do {
        a = a + 1;
     } while(a <= b);
     printf("%d", a);
}

jueves, 21 de marzo de 2013

Bucle for

El bucle for o ciclo for es una estructura de control en la que se puede indicar el número minimo de iteraciones. Está disponible en casi todos los lenguajes de programación imperativos.

Elementos del bucle


   {\color{Sepia}      \mathit{ para }} \;
   {\color{OliveGreen} \mathit{ i }} \;
   {\color{BlueViolet} \mathit{ \gets }} \;
   {\color{OliveGreen} \mathit{ x }} \;
   {\color{Sepia}      \mathit{ hasta }} \;
   {\color{OliveGreen} \mathit{ n}} \;
   {\color{Sepia}      \mathit{ a \; incrementos \; de }} \;
   {\color{OliveGreen} \mathit{ s }} \;
   {\color{Sepia}      \mathit{ hacer }}

   {\color{BlueViolet} \mathit{ instrucciones }}

   {\color{BlueViolet}      \mathit{ fin \; para }}
  • 'Variable de control': prácticamente un mandato impuesto por el uso habitual es utilizar la letra i Iterador como variable de control, o bien sus sucesoras en caso de bucles anidados. El uso de esta letra críptica quizás a primera vista es sin embargo una excelente forma de aportar agilidad de lectura al código por su uso tan extensivo. Como raras veces los bucles anidados superan las tres dimensiones (por una sencilla cuestión de explosión exponencial), las letras i, j y k suelen ser las únicas relacionadas con este uso. En C se define en el primer parámetro de la instrucción junto con la inicialización (opcional).
  • Inicialización de la variable de control: en pseudolenguaje se pide explicitarlo (es la sección := ValorInicial), sin embargo, otros lenguajes más permisivos como C no lo requieren de forma obligatoria. De todos modos, la práctica de utilizar variables de control que no se inicializan en el bucle no es recomendada para la legibilidad del código. En C se define en el primer parámetro del bucle junto con la variable de control.
  • Condición de control: en pseudolenguaje se ve representado por el valor final que puede tomar la variable de control (la sección A ValorFinal). En C es el segundo parámetro y puede ser cualquier condición (ni siquiera es obligación que esté la variable de control, aunque una vez más, esto no se considera una buena práctica).
  • Incremento: en pseudolenguaje se toma por defecto el valor 1, aunque puede explicitarse por medio de la sentencia PASO = ValorPaso cualquier número entero (léase bien entero, o sea que técnicamente podemos decrementar). En C es el último parámetro.
  • Cuerpo: es lo que se hará en cada iteración, pueden ser una o más instrucciones. En pseudolenguaje pesa la restricción de no poder alterar el valor de la variable de control; esto no es requerido en C, pero no se considera una buena práctica.

Usos

Su uso principal se orienta a los vectores, pudiendo modificar, agregar, eliminar o consultar datos que se encuentren según el índice. Por esto último, una condición mínima del vector es que debe ser ordenado, por que si se intenta leer un dato inexistente, esto genera un error de programación.

For en pseudolenguaje

La principal diferencia de un bucle PARA con respecto a los bucles MIENTRAS Y REPETIR, es que puede determinarse al comienzo del bucle cuántas veces se iterará el mismo, lo cual muchas veces puede redundar en una optimización del código por parte de los compiladores. Los condicionales constituyen junto con los bucles los pilares de la programación estructurada, y su uso es una evolución de una sentencia de lenguaje ensamblador que ejecutaba la siguiente línea o no en función del valor de una condición.
El bucle PARA se ha convertido en el bucle más ampliamente utilizado en la programación, ya que con la evolución de los lenguajes la mayoría de las condiciones de fin

MIENTRAS NoFinDeTabla(tabla) HACER
 PróximoRegistro(tabla)
 HacerAlgo(ElementoActual(tabl
FIN MIENTRAS
 
Es lo mismo decir:
PARA i := 0 a CantidadRegistros(tabla) - 1, PASO = 1
 PróximoRegistro(tabla)
 HacerAlgo(ElementoActual(tabla))
FIN PARA
 
Otro uso común es utilizar los bucles PARA para recorrer vectores de dos o más dimensiones, en cuyo caso se anidan estas iteraciones.
PSEUDOLENGUAJE
Vector a[3][4][2]. // Estamos indicando un vector de 3 dimensiones y 24 elementos en total.
PARA i:= 0 A 2 HACER
  PARA j:= 0 A 3 HACER
    PARA k:= 0 A 1 HACER
      HacerAlgo(a[i][j][k])
    FIN PARA
  FIN PARA
FIN PARA

Ejemplo de PARA en pseudocódigo

PARA VariableControl := ValorInicial A ValorFinal, PASO = Incremento 
  Cuerpo
 FIN PARA
donde VariableControl, ValorInicial, ValorFinal y Paso son enteros. La(s) instrucción(es) del cuerpo se ejecutará(n) (ValorFinal - ValorInicial + 1) veces, o sea que va desde ValorInicial a ValorFinal inclusive.

Ejemplo en C++

int main()
{
  int vector[10], i;
  for(i = 0; i < 10; i++)
  {
   vector[i] = i;
  }
}
En la definición del for, tenemos que la variable de control i se inicializa en un valor 0, luego se entrega la condición de control que debe ser falsa durante su ejecución, para completar el ciclo; y por último, tenemos el incrementador en una unidad.
Si por ejemplo en la condición colocamos i < 11, entonces el ciclo for se ejecutará desde [0...10], lo cual, al intentar acceder al elemento vector[10], esto generará error, ya que el vector (por definición) va desde [0..(n-1)].

Ejemplo anterior escrito en Léxico

tarea
{
los objetos vector[10], i son cantidades
variando i desde 0 hasta 9 haga
         copie i en vector[i]
}

Bucle Por Cada (For Each)

Este bucle es una evolución del concepto del bucle Para en algunos lenguajes. Se utiliza para recorrer estructuras repetitivas de datos de forma más simple y ágil. El bucle For Each puede describirse genéricamente (en pseudolenguaje) de la siguiente manera:
POR CADA elemento DE tipo EN conjunto HACER
  Cuerpo
FIN FOR EACH
  • Elemento: es el nombre de la variable u objeto que toma el elemento iterado en el cuerpo del bucle.
  • Tipo de Dato: es el tipo de variable o la clase a la que pertenece el objeto que se quiere iterar.
  • Conjunto: es la estructura de datos que se quiere iterar. El uso más típico es con vectores o -en programación orientada a objetos- clases del tipo Colección.
  • Cuerpo: es lo que se hará en cada iteración, pueden ser una o más instrucciones. Si bien no se impone una obligación al respecto, lo más común es que en este Cuerpo exista alguna operación sobre el elemento iterado.

Necesidad de una nueva estructura de control

Esta estructura surge como una innovación en los lenguajes para permitir un código más ágil y legible en una situación que es una de las principales causas del uso del bucle PARA: aplicar la misma operación sobre todos los elementos de un vector, y no necesitar conocer la posición del elemento en el vector. Esta estructura con el bucle PARA se resuelve de la siguiente manera:
Con el bucle POR CADA esto se reduce a:
POR CADA x DE tipo EN Vector HACER
 x = AlgunaOperación(x)
FIN PARA
Las ventajas de utilizar la estructura POR CADA son las siguientes:
  1. No es necesario llamar a una función que obtenga el tamaño del vector
  2. No es necesario utilizar la incómoda notación de subíndices para referirnos al valor en cuestión, sobre todo teniendo en cuenta que si utilizamos esta estructura es porque no necesitamos el valor del índice.
  3. Nos permite hacer un chequeo en tiempo de compilación sobre el tipo de dato que representa el elemento.
El bucle POR CADAo no es un sustituto del PARA, es una mejora para el muy frecuente caso anteriormente mencionado. La diferencia esencial entre el bucle PARA y el POR CADA es que en el primero guía su iteración por una variable que se incrementa hasta cierto punto de corte; en cambio en el segundo lo que guía la iteración es el recorrido de todos los elementos de un vector. Ciertamente podemos transformar cualquier POR CADA en un PARA, pero transformar un bucle PARA en un bucle POR CADA requeriría inicializar y controlar manualmente las variables de control, con lo cual se perdería nuevamente legibilidad en el código. Por tanto, cuando en un lenguaje se nos da la posibilidad de utilizar ambas estructuras, la elección del POR CADA debe hacerse en aquellos casos para los que fue pensado: aplicar la misma operación a todos los elementos de un vector sin importar el orden en que se hagan; si bien no es necesario que la variable elemento sea utilizada en el cuerpo del bucle, su ausencia denota con seguridad una mala elección de estructura de control.