Lenguajes de programación
Table of Contents
Lenguajes de programación
Los ordenadores usan un lenguaje al que llamamos lenguaje máquina.
Este lenguaje usa una codificación, es decir, un alfabeto, unos códigos, llamado código binario. Se llama código binario porque se emplean dos estados. En sus circuitos puede haber corriente o no, que nosotros representamos con 1 (hay corriente) y 0 (no hay corriente).
La unión de sus circuitos forman grupos de 1s y 0s, dando así lugar a "palabras" e instrucciones.
La programación ha ido variando con el tiempo y, en general, reconocemos tres generaciones de lenguajes que te explico en los siguientes apartados.
Lenguaje máquina
Las primeros ordenadores se programaban conectando circuitos a mano, haciendo que el ordenador hiciera unas tareas u otras. Para cambiar de tarea, había que reprogramar los circuitos, lo cual era bastante tedioso y difícil. Además, si había errores estos eran muy difíciles de descubrir y "reparar".
Aquí, por ejemplo, te muestro la imagen de uno de los primeros ordenadores, el ENIAC, donde como ves está cableado directamente:
Figure 1: ENIAC
Más tarde aparecen las tarjetas perforadas, y con ello lo que podríamos considerar como el primero lenguaje de programación llamado lenguaje máquina.
Figure 2: Tarjeta perforada
En estas tarjetas se escribían instrucciones para la CPU a programar. Cada CPU tiene un conjunto de instrucciones. Si quieres programar en lenguaje máquina tienes que aprender a usar el juego de instrucciones de la CPU a programar, y no te servirá para otra CPU.
En la película "Piratas de Silicon Valley" puedes ver una escena en la que aparecen Bill Gates y Paul Allen revisando un programa escrito por medio de tarjetas perforadas: ver escena en youtube.
Por ejemplo, en las CPU de arquitectura MIPS todas las instrucciones son de 32 bits. Te muestro, a continuación, la instrucción que se usaría para cargar el valor que hay en la dirección de memoria 68 a partir de la 8ª celda al registro número 3:
100011 00011 01000 00000 00001 000100
Estos son los significados de los bits:
100011 00011 01000 00000 00001 000100 |------| |-----| |-----| |------------------| | | | | | | | +---- Dirección de memoria: 68 en decimal | | | | | +------------------- Número a partir del cual se busca en memoria: 8 en decimal | | | +---------------------------- Número de registro donde se carga el valor: 3 en decimal | +------------------------------------- Código de operación: 35 en decimal
Otro ejemplo, pero esta vez, más completo y para arquitectura x8664 sería el siguiente programa en el que se suman los números 10 y 14 para dejar el resultado en el registro %eax de la CPU:
10111000 00001110 00000000 00000000 00000000 10111011 00001010 00000000 00000000 00000000 00000001 11011000
En el ejemplo de arriba:
- Hay tres instrucciones
- La primera instrucción mueve el número 14 al registro %eax
- La segunda instrucción mueve el número 10 al registro %ebx
- La tercera y última instrucción suma el contenido de los registros %eax y %ebx dejando el resultado en el registro %eax
Antes de terminar, verás que los programas en lenguaje máquina se suelen representar en hexadecimal, y no en binario, porque es más fácil de entender y son mucho más cortos (piensa que un carácter en hexadecimal representa a 4 en binario, lo que quiere decir que son 4 veces más cortos). Por ejemplo, el programa anterior en hexadecimal quedaría tal que así:
B8 0E 00 00 00 BB 0A 00 00 00 01 D8
En cualquiercaso, hoy en día, nadie usa el lenguaje máquina para programar.
Lenguaje ensamblador
Se trata de un lenguaje de bajo nivel, más sencillo de aprender y programar que el lenguaje máquina. Este lenguaje también es dependiente de la arquitectura de la CPU a programar, lo que significa que tienes que conocer el juego de instrucciones de la CPU a programar.
Se llama juego de instrucciones al conjunto de todas las instrucciones que admite la CPU.
En este lenguaje se usan mnemotécnicos que representan las instrucciones del microprocesador.
Los programas escritos en lenguaje ensamblador tienen que ser traducidos a lenguaje máquina para que se puedan ejecutar ya que, como te dije anteriormente, los ordenadores solo "hablan" lenguaje máquina.
Al traductor que convierte lenguaje ensamblador a lenguaje máquina se llama ensamblador. Este traductor es un programa de sistema y, como imaginarás, el primer ensamblador tuve que ser escrito directamente en lenguaje máquina.
Hoy en día tampoco se escriben programas en ensamblador salvo en casos muy concretos como: el bootloader de los sistemas operativos y otras partes del mismo que tienen que ver con la parte que arranca y carga el sistema operativo en la memoria.
Por ejemplo, en las CPU de arquitectura x86, para cargar el número 61 en hexadecimal (97 en decimal) al registro AL se haría de la siguiente manera en ensamblador:
MOV AL, 61h
Varias cosas a tener en cuenta:
- Se usan nombres de instrucciones como, en este caso,
MOVpara mover - Se usan nombres para los registros de la CPU como, en este caso,
AL - Se usan números en decimal o hexadecimal que son más manejables y fáciles de trabajar para una persona (programador)
Una vez traducida esta instrucción a binario, lenguaje máquina, quedaría tal cual:
10110000 01100001
Estos bits tienen el siguiente significado:
1011 0000 01100001 | | | | | | | | +------ Número 61 en hexadecimal o 97 en decimal | | | +---------------- Código para el registro AL (número 0 en decimal) | +---------------------- Código para la instrucción MOV (mover un valor a un registro)
Vemos como, una vez traducido a lenguaje máquina:
- La instrucción
MOVes igual al código en binario1011 - El registro
ALes el código0000binario (número 0 en decimal) - El número 61 en hexadecimal es el
01100001en binario - Todo junto nos da como instrucción en lenguaje máquina el
1011000001100001
Por último, te muestro un programa escrito en ensamblador para CPU de arquitectura x8664 que suma los números 14 y 10 (y que ya vimos en binario):
.globl main .type main, @function main: movl $14, %eax movl $10, %ebx add %eax, %ebx
En los lenguajes ensamblador, como ves, se usan identificadores para las instrucciones y registros de la CPU. Así, eax, ebx o ebx son identificadores de tres de los registros de las CPU x86. Y movl o add son instrucciones de la arquitectura de CPU x86.
Lenguajes de alto nivel
Y, por fin, llegamos a nuestros días en que usamos lenguajes de alto nivel, mucho más fáciles de entender, aprender y aplicar, que los dos anteriores.
Estos lenguajes son fáciles de usar y aprender porque usan un léxico, sintaxis y semántica cercano al ser humano. Estos lenguajes ocultan los detalles de la arquitectura de la CPU a programar, no hace falta aprenderse el juego de instrucciones del microprocesador, lo que hace mucho más fácil la programación. Así pues, estos lenguajes no dependen de la arquitectura de la CPU.
Cuando aprendes a usar un lenguaje de alto nivel es fácil la transición a otro lenguaje. Por ejemplo, si aprendes a programar en Java te resultará muy fácil pasar a programar con PHP o Python por ejemplo.
Un ejemplo de programa en C que carga dos valores en memoria y los suma dejando el resultado en otra posición de memoria sería el siguiente:
int main(int argc, char **argv) { int num1, num2, resultado; num1 = 14; num2 = 10; resultado = num1 + num2; return 0; }
Evidentemente, estos lenguajes tienen que ser traducidos a máquina para, finalmente, poder ser ejecutados por el ordenador. A estos traductores se les conoce con el nombre de compiladores y hablaremos de ellos más adelante.
Hoy en día hay una gran cantidad de languejes de programación. Si quieres conocer las tendencias de uso una buena referencia suele ser TIOBE. Entre los lenguajes más populares se suelen encontrar: Python, C y C++, Java, C#, JavaScript o PHP, entre otros. Unos son más adecuados para web, otros para desarrollo mobile, otros para scripting, etc.
En resumen
| Lenguaje Máquina | Lenguaje Ensamblador | Lenguaje de Alto Nivel |
|---|---|---|
| La programación es compleja | Facilita la programación aunque sigue siendo difícil escribir programas | La programación es fácil |
| Las instrucciones son en binario | Se programa usando mnemotécnicos (instrucciones complejas) | Se utilizan sentencias y órdenes con un léxico, sintaxis y semántica cercano al lenguaje humano |
| Estos programas se pueden ejecutar directamente | Necesita traducción al lenguaje máquina para poder ejecutarse | Necesita traducción al lenguaje máquina para poder ejecutarse |
| Es único para cada procesador (no es portable de un equipo a otro) | Hay diferentes lenguajes de ensamblador por cada arquitectura de CPU | Son independientes de la CPU |
| Hoy día nadie programa en este lenguaje | Se usa en casos muy concretos, sobre todo en el desarrollo de programas de sistema | Son los que se usan hoy en día |