INTRODUCCIÓN

 

Una breve introducción

 

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 se 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 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 exactamente 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

 

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.

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 súper detallado que requiere la máquina, el lenguaje máquina

 

LENGUAJE DE MAQUINA

 

A diferencia de los objetos materiales, que se , los programas se . 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 1 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.

 

LENGUAJE DE PROGRAMACIÓN

 

Dado que las personas tienen serias dificultades para leer, escribir y modificar programas en lenguaje de máquina, pero son esas mismas personas las que deben escribir y mantener los programas, se inventaron los lenguajes de programación. A diferencia de los lenguajes máquina, que están diseñados con el único objetivo de facilitar al procesador la ejecución de las instrucciones a gran velocidad (podríamos llamarlo también lenguaje de ejecución), la finalidad de los lenguajes de programación es facilitar a los seres humanos la comprensión, la escritura y la modificación de los programas. El objetivo primordial de un programa expresado en un lenguaje de computación no es ser ejecutado directamente por una computadora (lo que es imposible), sino comunicar, de manera comprensible para un ser humano, lo que una computadora debe hacer para resolver un determinado problema.

 

 

Dado que la naturaleza de la computación está íntimamente ligada a las matemáticas, los lenguajes de programación generalmente son una mezcla un tanto idiosincrática de notación matemática entrelazada con una gramática rudimentaria, por lo general basada (remotamente) en el inglés. A modo de ejemplo, veamos cómo se expresa el mismo programa citado más arriba en un lenguaje de programación muy difundido, llamado “C”:

 

Aún para personas que no conocen el lenguaje C, este texto es más comprensible que el programa en lenguaje de máquina de más arriba, ya que hay algunos elementos claramente distinguibles.

Quizás lo más notable para el lego sean las notas aclaratorias en castellano, entre los símbolos “/*” y “*/”. Estos textos (llamados comentarios) no afectan la función del programa, pero sí son importantes para dejar plasmada la intención del programador.

En otras palabras, cumplen el rol de “notas adhesivas”, en las que el programador aclara el objetivo de cada parte del programa.

Esto es muy útil cuando otro programador intenta comprender cómo funciona el programa, o incluso cuando el mismo programador debe revisar ese mismo programa un tiempo después de haberlo escrito.

Más allá de los comentarios, si sabemos que en inglés “if ” quiere decir “si” (condicional, no afirmativo), y que “else ” quiere decir “de lo contrario”, es relativamente sencillo advertir que la sentencia “if (x<0) ” determina si el valor de la variable “x” es menor que cero y que, dependiendo del resultado, el procesador ejecutará la sentencia que está entre el “if ” y el “else ”, o de lo contrario la que sigue al “else ”.También es fácil identificar los mensajes que serán mostrados al usuario, aunque el segundo de ellos (“%f\n”) contenga en realidad una codificación propia e idiosincrática del lenguaje C: son los que están entre comillas. También es plausible, para quienes hablan inglés, que el nombre de la función sqrt() es una abreviatura de square root, o “raíz cuadrada”.

El mismo programa puede escribirse en distintos lenguajes de programación

Por ejemplo el lenguaje Python

 

 

 

 

El lenguaje Smalltalk:

 

 

 

De un lenguaje de programación a otro, las convenciones cambian, y también algunos aspectos técnicos, pero en todos ellos reconocemos elementos comunes, y sobre todo vemos que su objetivo es facilitar la confección, comprensión y modificación del programa, al permitir que el programador trabaje en un nivel de abstracción que es confortable

a una mente humana.

 

Leyendo el código fuente de un programa es donde resulta más fácil apreciar la naturaleza cultural del software, tal como lo reconoce la Carta de Recife, firmada por los asistentes a la II Conferencia Latinoamericana y del Caribe de Software Libre (LACFREE II). El programa no resuelve un problema, describe una solución, de la misma manera que una ecuación describe una relación entre sus términos, o que una partitura musical describe una sinfonía. El programa en sí no es activo, no hace nada: es la máquina la que, siguiendo el mecanismo descrito por el programa, actúa sobre el medio para resolver el problema.

 

COMPILACIÓN

 

Los programas escritos en un lenguaje de programación no son comprensibles directamente por una computadora. Recordemos que éstas sólo saben obedecer instrucciones codificadas en su lenguaje de máquina. Antes de poder ejecutar un programa escrito en un lenguaje de programación, debemos traducirlo al lenguaje de la máquina sobre la que queremos que corra. Para cada combinación de procesador, lenguaje y sistema operativo existen traductores automáticos, llamados compiladores. Se trata de programas que leen un programa escrito en un lenguaje de programación y, a partir de él, generan uno escrito en el lenguaje de ejecución adecuado para una determinada combinación de procesador y sistema operativo. El programa en lenguaje de máquina que vimos más arriba, de hecho, es el resultado de pasar el texto del programa C que vimos a continuación por un compilador llamado“gcc”.

Aquí se vuelve evidente otra gran ventaja de los lenguajes de programación sobre el lenguaje de máquina: si mi programa está expresado en un lenguaje de máquina, sólo podré ejecutarlo en máquinas equipadas con un determinado tipo de procesador. Por el contrario, si lo escribí en un lenguaje de programación, en principio basta con hacerlo traducir por el compilador adecuado para que el programa pueda correr sobre el procesador que yo quiera.

 

CÓDIGO FUENTE

 

En inglés, se conoce al programa escrito en lenguaje de programación como source code, y al programa expresado en lenguaje de máquina como objet code (código objeto) o executable code (código ejecutable). En castellano, a menudo se traduce source code con la frase “código fuente”, que no es completamente fiel a la intención de la expresión inglesa. Tendría más precisión técnica traducirlo como “texto original” del programa, ya que se trata del texto tal como lo escribió el programador, mientras que el código ejecutable es el fruto de una traducción automática realizada por un compilador.

Si bien es posible ejecutar un programa en la computadora adecuada contando sólo con el código ejecutable, cuando se trata de comprender el funcionamiento de un programa, de modificarlo, o de hacerlo funcionar en una máquina diferente, es imprescindible disponer de su texto original, es decir de su “código fuente”.

 

CODIGO FUENTE Y SOFTWARE LIBRE

 

Para ser considerado libre, un programa debe ser distribuido de talmodo que el usuario pueda, entre otras cosas, estudiar el modo de funcionamiento del programa, adaptarlo a sus necesidades y distribuir, bajo las mismas condiciones, programas derivados. Para que estas libertades sean practicables, no basta con que la licencia del programa las permita. Además, es necesario que el código fuente del programa esté a disposición del usuario, ya que de lo contrario las tareas de comprender, adaptar y mejorar el programa se vuelven tan complicadas que es casi lo mismo que si estuvieran prohibidas. Por eso la definición de Software Libre elaborada por la Free Software Foundation aclara que un programa no puede ser considerado libre si su código fuente, su texto original, no está disponible.

Oficina Regional de Ciencia para América Latina y el Caribe

UNESCO Montevideo Sector Comunicación e Información

 

Guía Práctica sobre Software Libre   su selección y aplicación local en américa Latina y el Caribe, Fernando da Rosa, Federico Heinz (2007)

 

Recopilado con todo respeto a la UNESCO, Fernando da Rosa y Federico Heinz por Emilio Zuñiga Mireles  septiembre  2018

 

[email protected]

                                    

                                       AE  copyright 2018