Programación de software

En cualquier ordenador podemos distinguir dos elementos esenciales: el hardware y el software. El hardware es la parte física, los chips y los cables (la máquina) mientras que el software son los programas que se ejecutan sobre esta máquina.

En este post nos dedicamos a dar unas pinceladas de este segundo elemento, el software, y más en concreto en como se confeccionan los programas.

Un programa informático es el resultado final de un proceso que empieza con el planteamiento de un problema. Un programa es un conjunto de instrucciones escritas con un lenguaje de programación y que serán ejecutadas en un ordenador.

Cada máquina reconoce un lenguaje propio, denominado lenguaje máquina o ensamblador, que consta de unas instrucciones muy a bajo nivel, en las cuales se accede directamente a los elementos físicos de la máquina como por ejemplo los registros. Por ejemplo son del tipo: copia lo que hay en una posición concreta de la memoria a un registro concreto o suma lo que hay en dos registros o copia lo que hay en un registro a otra posición de memoria. La unidad de control (a la unidad central de proceso o CPU) es quien es capaz de entender estas instrucciones sencillas y controlar su ejecución. Como ya sabréis, cada máquina tiene una configuración física diferente, y también un lenguaje ensamblador diferente. Por ejemplo, es diferente el ensamblador de un PC que el de un Mac.

En la primera etapa de la informática todos los programas se hacían utilizando el código máquina, pero aparte de que es muy complicado de programar y muy difícil de leer, una vez tenemos el programa sólo lo podemos ejecutar en un tipo de máquina concreto. Si cambiamos de máquina perdemos todos nuestros programas.Programación de software

Es por estos factores que aparecen los lenguajes de programación de alto nivel, donde se busca por una parte un lenguaje más fácil de escribir y leer, y por la otra la portabilidad, es decir que podamos traer los programas de una máquina a otra. Realmente lo que realmente la máquina ejecuta continúa siendo código máquina, pero el programador escribe en otro lenguaje. Hace falta, por lo tanto, una etapa de traducción intermedia. Esta traducción puede ser por dos mecanismos diferentes: la compilación y la interpretación:

- Compilación: antes de ejecutar nuestro programa, lo compilamos. Lo que denominamos compilador (que es otro programa) primero reconoce si nuestro código está escrito siguiendo las reglas del lenguaje y si no hay errores lo traduce a código máquina. Lo que posteriormente se ejecuta es el código máquina que se ha generado.

- Interpretación: el código se va ejecutando instrucción a instrucción, y una a una se van traduciendo a código máquina. Quien lo hace es el intérprete (también otro programa).

Hay un tercer mecanismo que es el de Java, que utiliza una solución mixta, primero con un compilador que no genera código máquina para la máquina física sino para lo que se llama una máquina virtual (la famosa máquina virtual de Java). A este código de máquina virtual se le llama byte-code. La máquina virtual en realidad es un interprete que después va ejecutando (traduciendo a código máquina real) el byte-code instrucción a instrucción.

Programación de softwarePero entre el planteamiento del problema y el programa es necesaria otra fase, la de concepción de un algoritmo. Un algoritmo es también la resolución del problema como una secuencia de acciones, pero no destinado a ser ejecutado en un ordenador sino en lo que podríamos denominar máquina abstracta o ideal. Un algoritmo está escrito en lenguaje humano, como el castellano (a diferencia del programa que está escrito en un lenguaje de programación) y está destinado a que lo entienda el programador que después lo traducirá a cualquier lenguaje de programación concreto como Java, C++, Python, Visual Basic…. De esta forma, el algoritmo será la lista de las acciones necesarias por que se resuelva el problema inicial, en nuestro caso escritas en castellano. La elección del lenguaje en que codificamos el algoritmo dependerá de factores muy variados (y no siempre técnicos), cómo pueden ser la facilidad por aprenderlo, facilidad por leerlo, eficiencia, disponibilidad para la plataforma dónde se ha de ejecutar, el precio, …

¿Porque pasamos por esta fase intermedia? Porque así la persona que resuelve el problema no tiene porque saber nada lenguaje que se utilizará después por hacer la codificación a programa, quizás que ni siquiera sepa cual será este lenguaje.

Los algoritmos deben representar dos cosas: las acciones que hace falta hacer y los objetos sobre los cuales se hacen estas acciones, es decir los objetos que el algoritmo manipula. Para hacer esto de una manera que lo pueda entender cualquier programador se hace utilizando lo que se llama pseudo-código, que no es más que, en nuestro caso, castellano con unas reglas sintácticas concretas para representar las acciones y los objetos.

Resumiendo, los programas están escritos en un lenguaje de programación concreto y los algoritmos en pseudo-código, un castellano modificado con ciertas reglas sintácticas.

Por ejemplo

Problema: calcular la media de dos números con una calculadora tradicional

Objetos: una calculadora (no científica)

Solución:

  1. Poner en marcha la calculadora pulsando el botón ON
  2. Introducir el primer número
  3. Pulsar la tecla “+”
  4. Introducir el segundo número
  5. Pulsar la tecla “/”
  6. Teclear el número “2″
  7. Pulsar la tecla “=”

Esta secuencia de siete acciones nos describe como debemos hacer para resolver un determinado problema. Cómo podemos ver es muy similar a una receta de cocina. A un algoritmo debemos decirle los ingredientes y enseres que necesitamos (los objetos de qué hablábamos) y como se preparan (las acciones).

En próximos post hablaré un poco de los principales lenguajes de programación y de sus ventajas e inconvenientes, que nos permitirá seleccionar cual es el mejor lenguaje para implementar nuestros pseudo-códigos.