Principios básicos de programación


A menudo nos centramos tanto en cosas complejas que nos olvidamos de lo básico.

Precisamente por eso, voy a comenzar una serie de posts comenzando desde cero.

En este caso, explicaré lo más básico de la programación. Y temo que esto es sólo teoría y además es independiente del lenguaje.

Qué es un lenguaje de programación

¿Conocéis la receta de la tarta de manzana? Tal y como se explica en el post resultaría difícil de entender para un ordenador. No nos engañemos: al contrario de lo que se piensa, los ordenadores son tontos.

Vamos a resumir la receta con pasos sencillos:

  1. Calentar el molde con algo de mantequilla
  2. Mezclar harina, azúcar, leche y huevos en un recipiente y batir con la batidora.
  3. Huntar de mantequilla todo el molde
  4. Pelar 4 manzanas y echarlas en el molde.
  5. Rociar con la mezcla.
  6. Meter en el horno durante 45 minutos.

De momento todo fácil, ¿Verdad? Bueno, pues éste es nuestro programa. Un programa no es más que un conjunto de instrucciones dadas al procesador, que es el cerebro del ordenador. Y, como vemos, es como una receta de cocina.

A menudo, en nuestro programa se dan muchas cosas por sobreentendidas. Por ejemplo, "calentar el molde con algo de mantequilla" tiene numerosas implicaciones:

  1. Coger un molde.
  2. Coger la mantequilla.
  3. Echar mantequilla en el molde.
  4. Abrir la tapa del horno.
  5. Meter el molde.
  6. Cerrar la tapa del horno.
  7. Encender el horno.

Podemos decir que es un programa en sí mismo. Ésto es lo que se considera un programa de bajo nivel, ya que está todo explicado, mientras que la frase inicial podría considerarse una instrucción de alto nivel. Podemos decir, por tanto, que:

Una instrucción de alto nivel se compone de un programa de bajo nivel

Para el procesador el nivel más bajo que existe se llama código máquina. Por lo tanto, un lenguaje tendrá un nivel más bajo cuanto más se parezca un lenguaje al código máquina, que es totalmente numérico.

Por encima del código máquina está el código ensamblador, que es poco más que hacer legible por humanos el código máquina.

Y por encima, los distintos lenguajes: C, C++, Java, Python, Ruby, ... Por tanto, podríamos decir que:

Un lenguaje de programación es un conjunto de instrucciones para explicarle al procesador lo que debe hacer, donde cada instrucción se compone de un programa de menor nivel.

Y dado que los procesadores son bastante tontos, necesitan que los lenguajes sean formales, es decir, que tengan tengan una estructura bien definida, no ambigua y lo más sencilla posible.

Herramientas de un lenguaje de programación

Aunque hay muchos lenguajes de programación, todos disponen de unas herramientas más o menos comunes. De la misma manera que hay muchas cocinas diferentes, un cocinero sabe qué es pochar los tomates o escalfar un huevo, independientemente de dónde se encuentren las cazuelas o los ingredientes.

Veamos algunas de ellas:

Constantes

Una constante es un valor que nunca cambia, al que le damos un nombre. En nuestra tarta de manzana, podemos decir que vamos a usar 4 huevos, y después referirnos a ellos como "los huevos", sin necesidad ya de indicar cuántos son. Podríamos formalizarlo así:

NÚMERO_DE_HUEVOS = 4

En programación hay numerosas convenciones, y en casi todos los lenguajes de programación se utilizan mayúsculas y "underscores" ('_') para los nombres de las constantes, aunque ni es imprescindible ni ocurre en todos los lenguajes.

Variables

Una variable es un valor que cambia con el tiempo. Las variables nos permiten guardar datos y operar con ellos.

Las variables tienen tipos, donde los más habituales son:

  • números enteros
  • números decimales
  • letras, también llamados caracteres
  • listas de otras variables

Por ejemplo, una frase (que en programación llamaremos cadena de caracteres) no es más que una lista de letras.

Volvamos a nuestro ejemplo: nuestro molde podria ser una variable, que consiste en una lista de ingredientes:

mode = lista [ harina, azúcar, leche, huevos ]

Operadores

Son las operaciones que se pueden realizar con las variables y las constantes.

Hay de 3 tipos:

  • operadores aritméticos: suma, resta, multiplicación, división, etc.
  • operadores lógicos: mayor que, menor que, igual, etc.
  • operadores binarios: que no voy a explicar ahora.

Por ejemplo, si el operador "+=" implica "añadir a una lista", podríamos indicar el contenido del molde, pero añadiéndolos poco a poco:

molde = lista []
molde += harina
molde += azúcar
molde += leche
molde += huevos

Condiciones

En ocasiones hay que realizar comprobaciones, habitualmente de una variable. En estas comprobaciones hay dos partes: cuando la condición se cumple y cuando no.

Habitualmente todos los lenguajes de programación siguen una estructura similar a ésta:

if condición
then acción_si_cumple
else acción_si_no_cumple

Voy a poner un ejemplo basado en la receta, aunque luego veremos que no es del todo válido:

if la mantequilla se ha derretido
then huntar todo el molde con la mantequilla

En este caso he omitido la parte de "no se cumple la condición", ya que suele ser opcional.

Bucles

A veces comprobar una condición no es suficiente, y hay que comprobarla varias veces, o es necesario realizar una misma operación para distintos elementos.

Un ejemplo: Hay que echar 4 huevos:

huevos = 4 x huevo
for huevo in huevos, molde += huevo

Comentarios

A veces nos quedan programas feos y difíciles de entender, por lo que se ponen comentarios para explicar a los humanos qué ocurre ahí. Realmente no importan, ya que el procesador los ignorará.

Suele haber de dos tipos: comentario de una línea o de varias líneas. Los primeros tendrán una marca de inicio y "comentan" el resto de la línea, mientras que los segundos "comentan" todo hasta que aparezca una marca de fin.

Un ejemplo:

// necesitamos 4 huevos
huevos = 4 x huevo

/*
echamos los 4 huevos
en el molde
*/
for huevo in huevos, molde += huevo

Comentar bien es difícil, ya que a menudo se comenta más o menos de lo que se debería. En realidad, un buen programa no debería requerir comentarios, pero a veces vienen bien.

Funciones

En ocasiones hay que repetir código, quizá con pequeñísimas variaciones. Por eso se inventaron las funciones: es una manera de agrupar código y evitar repetirlo en distintas partes del programa. En muchas ocasiones, estas funciones pueden tener parámetros que alteren el comportamiento.

En esta ocasión no utilizaré la metáfora de la receta de cocina, sino algo más matemático: calcular el área de un triángulo:

function area_de_triangulo(base, altura) {
  return base * altura / 2
}

Así, después se puede invocar a esta función con distintos argumentos:

area_de_triángulo(2, 2)  --> 2
area_de_triángulo(3, 4)  --> 6

El programa

Y con estas simples herramientas, podemos crear el programa. Pero aquí viene la parte difícil: hay que indicar todo con pelos y señales, sin olvidar absolutamente nada.

Había pensado poner aquí el programa de la tarta de manzana completo... Pero creo que no es nada pedagógico. Queda demasiado enrevesado y feo :D

Alguien podrá echar de menos otras herramientas, como las clases, paquetes, módulos, librerías... Pero éstas no son estándar y no me parecía bien juntarlas con las herramientas básicas. Lo contaré en otros posts.

La ejecución

La ejecución de cualquier programa requiere dos fases: compilación y ejecución. No voy a entrar en muchos detalles ahora.

Baste decir que:

  • Algunos lenguajes utilizan un código entre el código máquina y el código de alto nivel, y es necesario un programa que los traduzca. A este programa se le conoce como intérprete.
  • hay algunos lenguajes interpretados, como Python o Ruby en los que puede parecer que no exite la fase de compilación, ya que se puede "ejecutar" el código directamente. En realidad las dos fases existen, pero ocurren de forma ajena al usuario.

Más información

En este punto sería interesante comenzar a ver cómo pueden clasificarse los lenguajes... pero eso es muy aburrido.

Podéis echar un ojo a mi tutorial de Python básico, o esperar a mi siguiente post :D


Comentarios

Comments powered by Disqus