miércoles, 5 de octubre de 2016

Información sobre Software Libre (Parte 1)



Es muy difícil comprender en forma cabal la importancia y proyección del Software Libre sin antes entender qué es el software, cómo se desarrolla y su rol dentro de los sistemas de procesamiento de datos. Para esto necesitamos explorar conceptos básicos vinculados a la informática, tales como tecnología, programa, código fuente y código objeto.

La computadora

Por mucho que se hable de “dispositivos inteligentes”, pocas cosas hay más tontas que el procesador de una computadora.

Si vamos a su esencia, un procesador elemental sólo sabe manejarse con un alfabeto de dos letras (”0” y “1”) y dadas dos “letras” de este alfabeto, calcular su suma. Por lo general, las computadoras no operan sobre “letras” individuales (llamadas “bits”), sino sobre palabras de ocho letras, llamadas “bytes”, por ejemplo “01100101”. Hay un total de 256 palabras distintas que  pueden escribir con ocho bits. Estas 256 palabras que, si las interpretamos como números binarios, representan los números del cero al 255, constituyen el vocabulario completo de la computadora.

¿Cómo es posible que con sólo 256 palabras en su vocabulario una computadora pueda hacer tantas cosas? ¿Cómo es posible que sólo sumando pueda hacer cálculos complejos?

El secreto está en que la computadora es programable. La computadora sabe obedecer órdenes, y tiene la capacidad de ejecutar millones de instrucciones en un solo segundo, ejecutando operaciones sobre los millones de bytes que constituyen su memoria. Combinando instrucciones, podemos escribir programas que combinen e interpreten las palabras almacenadas en la memoria de distinta manera de acuerdo al contexto: como cada una de las letras de este texto, como números, o notas musicales, o colores. Enviando los datos de la manera adecuada a una pantalla, una impresora o una tarjeta de sonido, el programa puede impresionar nuestros sentidos. Aceptando datos desde el teclado y el ratón, puede responder a nuestros comandos.

Las computadoras son dispositivos de propósito general, a las que podemos configurar para cumplir tareas específicas: imprimir documentos, tocar música, mostrar videos, interconectar redes, por sí mismas son incapaces de realizar ninguna. Para ello, necesitan que alguien les provea instrucciones detalladas acerca de cómo interpretar la información y cómo comunicarse con el usuario. Un programa es un conjunto de instrucciones para la computadora, que le permite llevar adelante una tarea específica. Ese programa se escribe, como se escribe este texto o cualquier relato. Los encargados de escribir esos textos son los programadores, que dominan un determinado lenguaje de programación para realizar esta tarea, como nosotros dominamos el español, su gramática y su sintaxis para construir este texto.

¿Qué es el código fuente?

El programa

Para que el “milagro” de hacer tantas cosas con un lenguaje de sólo 256 palabras sea posible, es necesario darle instrucciones precisas al procesador de la computadora, indicarle paso a paso qué hacer con esos unos y ceros, combinados en palabras de ocho letras.
Un buen ejemplo de lo complejo que esto puede ser, es el cuento “Instrucciones para subir una escalera” de Julio Cortázar.

“Para subir una escalera se comienza por levantar esa parte del cuerpo situada a la derecha abajo, envuelta casi siempre en cuero o gamuza, y que salvo excepciones cabe exacta mente en el escalón. Puesta en el primer peldaño dicha parte, que para abreviar llamaremos pie, se recoge la parte equivalente de la izquierda (también llamada pie, pero que no ha de confundirse con el pie antes citado), y llevándola a la altura del pie, se le hace seguir hasta colocarla en el segundo peldaño…”  (Julio Cortázar).

En realidad, por detalladas que suenen las instrucciones de Julio Cortázar, una computadora que intentara seguirlas las encontraría exasperantemente abstractas. Aún si dejáramos de lado el detalle de que “levantar” no tiene sentido sin antes ponernos de acuerdo dónde es “arriba”, y suponiendo que sabemos qué es un “pie”, una simple instrucción como “levantar el pie” deja a la computadora fuera de combate. Hay que levantarlo, sí, ¿pero cómo? Más acertado sería enumerar las articulaciones de la pierna que deben moverse, y especificar a qué ángulo deben flexionarse en cada instante del tiempo, pero esto tampoco sería suficientemente detallado. Lo que en realidad hay que describir es el detalle de los impulsos nerviosos que hay que enviarle a cuáles músculos... con menos de esto, la máquina no sabría por dónde empezar.

Eso sí: provista con instrucciones suficientemente detalladas, la computadora las cumple rápidamente y sin cuestionarlas. Si las instrucciones contienen alguna equivocación que la llevan a patear la escalera hasta convertirla en astillas (o, si es una escalera dura, hasta destrozar el pie), lo hará sin dudar, pues la computadora está hecha sólo para obedecer órdenes.

Para poder manejar la complejidad que requiere dar una descripción tan detallada y precisa, la exquisita prosa de Julio Cortázar no sólo es demasiado abstracta, sino peligrosamente ambigua. En vez de usar castellano, o inglés, los programadores utilizan lenguajes formales fuertemente apoyados en la matemática, y derivan de ella el poder de expresar relaciones abstractas en términos de elementos más concretos. En estos lenguajes formales se escriben los programas y se desarrolla el denominado código fuente, el que luego se traduce al lenguaje super detallado que requiere la máquina, el lenguaje máquina.

Lenguaje de máquina

A diferencia de los objetos materiales, que se fabrican, los programas se escriben. Quizás parte de la fascinación que la programación ejerce sobre quienes la practican se deba a la magia aparente de lograr que una máquina cumpla las órdenes que le impartimos verbalmente. Para que pueda entender lo que le ordenamos, sin embargo, debemos comunicarnos con ella de una manera especial: el procesador, dentro de cada computadora, sólo comprende instrucciones escritas en su propio lenguaje, denominado lenguaje de máquina (a veces mencionado como código binario o código objeto). Existen muchos tipos distintos de procesador y cada uno de ellos tiene un lenguaje de máquina distinto, diseñado por su fabricante. Esa es la razón por la que no es posible ejecutar cualquier programa en cualquier computadora.

Los programas escritos en lenguajes de máquina son, básicamente, larguísimas listas de números. Cada uno de estos números representa una operación elemental (por ejemplo, 1: sumar, 2: restar, 3: almacenar en memoria, etc), o un operando, o una combinación de ambas cosas. Para que el lector pueda darse una idea concreta de cómo es un programa codificado en lenguaje de máquina, lo ilustraré con un ejemplo: lo que sigue es una pequeña porción de un programa, escrito en el lenguaje de máquina de los procesadores de la familia Intel funcionando bajo el sistema operativo GNU/Linux. Este programa imprime la raíz cuadrada de un número cualquiera. Si el número resulta ser negativo, el programa imprime un mensaje de error (recordemos que no es posible sacar la raíz cuadrada de un número negativo):


Una computadora moderna está en condiciones de ejecutar millones de instrucciones de máquina como estas por segundo. Construir un programa complejo a partir de instrucciones tan elementales y codificadas en un formato tan poco amigable es, sin embargo, una tarea muy complicada para un ser humano. También es extremadamente difícil entender cómo funciona un programa si sólo disponemos de él en lenguaje de máquina. Para comprender cómo funciona el programa citado más arriba no sólo es necesario recordar qué número corresponde a cual operación, también debemos identificar cuáles partes de los números representan operaciones, cuáles representan operandos, cuáles datos, y muchas otras cosas más.

Debido a detalles técnicos, modificarlo es mucho más difícil aún, ya que para eliminar o agregar instrucciones no basta con insertarlas o borrarlas en la lista: también hay que modificar los valores de muchas de las demás instrucciones. Por ello, modificar un programa del que sólo tenemos una copia en lenguaje de máquina, o traducirlo para que funcione en una máquina con un lenguaje de máquina distinto, es una tarea virtualmente impracticable.

(Extraído de Guía Práctica de Software Libre, su selección y aplicación local en América Latina y el Caribe, publicación de UNESCO, escrita por Fernando de Rosa y Federico Heinz).

No hay comentarios.:

Publicar un comentario