El misterio de la “i”

Una de las primeras cosas que aprende todo programador es a declarar variables y utilizar ciclos. Las variables son espacios reservados en la memoria del dispositivo, asociados a un identificador. Los ciclos o bucles son estructuras repetitivas que se ejecutan hasta alcanzar cierta condición o esta deja de cumplirse. Los ciclos más utilizados son el “while” y el “for“.

El bucle for es una estructura de control en programación en la que se puede indicar de antemano el número mínimo de iteraciones (veces que se ejecutará el bloque de código). Está disponible en casi todos los lenguajes de programación imperativos y está compuesto por los siguientes elementos:

  • Variable de control: Utilizada para comprobar la condición que debe cumplir el ciclo para iterar.
  • Inicialización de la variable de control: Se asigna un valor inicial a la variable de control.
  • Condición de control: Condición que se debe cumplir para que se ejecute la próxima iteración del ciclo.
  • Incremento: Modificación que se realiza, generalmente a la variable de control, entre iteraciones del ciclo.
  • Cuerpo: Bloque de código que se ejecuta en cada iteración.

Ejemplo para C/C++:

for (inicialización; condición; incremento/decremento)
    bloque

Ejemplo práctico para C/C++:

int sum = 0;
for (int i = 1; i < 6; ++i) {
    sum += i;
}

Aquí radica el misterio, la gran mayoría de las veces, se utiliza como identificador de la variable de control la letra “i“. Tanto si se consulta la bibliografía como los foros, chats, revistas o cualquier otra fuente que pueda existir, la “i” aparece. En los lenguajes de programación actuales no existe razón alguna para hacer esto. Cuando es necesario anidar un ciclo for, la secuencia es : “i“, “j“, “k“… Es algo tan común y tan ampliamente extendido que no lo cuestionamos. Pero, ¿cómo llegó la “i” a ser tan importante?

Existen varias teorías, siendo de las más populares el hecho de que “i” es la letra inicial de palabras tales como índice e iterador, por lo que es natural y simple utilizarla, especialmente cuando uno de los usos más difundidos de este tipo de ciclos es el recorrido de arreglos y colecciones, donde sus elementos son identificados mediante índices.

Aunque estas teorías pueden tener algo de cierto, la razón más probable pudiera encontrarse en uno de los primeros lenguajes de programación de alto nivel que existieron: FORTRAN.

El primer manual para FORTRAN apareció en octubre de 1956 y el primer compilador estuvo disponible en abril de 1957. Fue el primer compilador que optimizaba el código generado, logrando un rendimiento similar a los programas en ensamblador escritos a mano y reduciendo en un factor de 20 la cantidad de declaraciones necesarias para controlar la máquina.

Fue desarrollado para programar la computadora IBM 704, introducida por IBM en 1954 y la primera producida en masa con hardware para aritmética de punto flotante.

Memoria central IBM 704
Memoria central IBM 704

La IBM 704 tenía una capacidad de memoria de 32K palabras, cada palabra de 36 bits, 144 kb en total.

IBM 704
IBM 704

En esos primeros tiempos de la computación la memoria era un recurso escaso y era necesario hacer un uso lo más eficiente posible de ella.

En el estándar FORTRAN 66 se define que:

Un nombre simbólico que identifica una variable, un arreglo, o una sentencia de función puede tener su tipo especificado en una sentencia de tipo. En la ausencia de una declaración explícita, el tipo es inferido por el primer caracter del nombre: I,J,K,L,M y N implican tipos de datos enteros; cualquier otro caracter implica tipos de datos reales.

Estándar FORTRAN 66, sección 5.3

Teniendo en cuenta el estándar de FORTRAN resulta que “I” es el primer identificador de variable utilizable para el cual se infiere el tipo de datos entero, por lo que no es necesario escribir el tipo.

Hoy en día no parece gran cosa evitar escribir una palabra extra en nuestro código, pero en aquel tiempo, el código debía ser escrito en tarjetas perforadas que podía entender la computadora y la memoria era un recurso escaso.

Tarjeta perforada
Tarjeta perforada

 

Aunque probablemente la elección de “I” fuera originalmente porque el tipo de datos entero, integer en inglés, empieza por esa letra, es probable que haya llegado a nuestros días debido a que FORTRAN lo asume como estándar. Por lo tanto, la razón de que el identificador “i” sea universalmente utilizado en los ciclos for se debe a una decisión de diseño de más de 55 años de antigüedad.

Sin siquiera ser conscientes de ello, los programadores son portadores de una tradición que se remonta a los inicios de su ciencia.

Comentarios