· Por María Anguita García y Borja Losa Cruz

Un lenguaje de programación es como un traductor que permite a las personas explicar a un ordenador que quiere que éste haga.

El porqué es necesario un traductor es debido a que cuando se diseñaron las primeras piezas de hardware estas funcionaban y siguen funcionando por medio de impulsos eléctricos de muy bajo voltaje, por lo que se encontraron con un sistema que solo presentaba 2 estados dependiendo de si hay voltaje o no. Para poder manejar información con solo 2 estados se creó el sistema binario, un sistema numérico que emplea únicamente 2 valores, 0 y 1, dependiendo de si hay voltaje.

BitA la unidad mínima se la denominó bit, por lo que un bit puede ser un 1 o un 0. Con 2 bits podemos realizar 4 combinaciones diferentes (00, 01, 10, 11), con 3 bits podemos representar 8 cosas (000, 001, 010, 011, 100, 101, 110, 111), con 4 bits 16 combinaciones, etc. Esto aumenta exponencialmente a la orden de 2 elevado al número de bits. (combinaciones = 2^bits)

La forma más común de transferir datos es mediante Buses de 8 bits (Buses: 8 cables los cuales cada uno representa un bit). Aunque muchos sistemas actuales usan buses de 32 o 64 bits sobre todo para la comunicación entre partes del sistema que requieran mayor velocidad, aún es común el uso de chorros de 8 bits. Se usó tanto este sistema que obtuvo su propio nombre, 8 bits se denomina un byte.

Pero claro, para un ordenador diseñado trabajar en binario es fácil, pero para una persona es una tarea ardua y tediosa, y por ello se crearon los lenguajes de programación, los cuales se engloban en 2 categorías según como de cercano es el programa al hardware, lenguajes de bajo nivel y lenguajes de alto nivel.

Un lenguaje de bajo nivel es el set de instrucciones que ofrece el creador del procesador. Estas instrucciones son únicas para cada modelo o generación de procesador y son la única manera de decirle al procesador del ordenador que hacer.

Cada instrucción representa una cantidad de bytes, que para el procesador no es mas que un código que le indica que operación básica hacer. Además de que tiene una curva de aprendizaje alta, para trabajar con este tipo de lenguajes se requiere manipular directamente bits y bytes en la memoria o el disco duro, por ello es una tarea bastante compleja. Debido a esto se usan exclusivamente en casos muy específicos donde no hay mas remedio, como cuando se programa un Sistema Operativo.

Sistemas operativosUn Sistema Operativo es la base sobre la que se ejecutan todos los programas de un ordenador. Se encarga de gestionar todos los elementos del sistema, como y cuando usar cada parte del hardware y cada programa que se ejecute y provee al usuario de una interfaz para facilitar su uso. Por esto necesita de un acceso directo al procesador y no queda otra que programarlo con un lenguaje de bajo nivel, al menos la parte que se encarga de arrancar el sistema, pero una vez programada esa parte se puede pasar a usar un lenguaje de alto nivel.

Uno de los lenguajes de bajo nivel más usados es el Ensamblador. La mayoría de sus instrucciones constan de 3 datos de varios bytes, el primero es la instrucción, el segundo es el dato destino y el tercero es el dato origen, y ambos destino y origen pueden ser un dato concreto especificado en binario, decimal o hexadecimal (Sistema numérico de 15 dígitos), o pueden representar una dirección de memoria o registro del procesador (Los registros de un procesador son celdas de memoria de acceso rápido)

EnsambladorPor ejemplo:

ADD A, B -> suma el dato del registro B al de A y lo guarda en el registro A

MOV [A], C -> Coge el dato del registro C y lo copia a la dirección indicada en el registro A.

Estos lenguajes también ofrecen un set de funciones un poco menos básicas como funciones para crear bucles, para escribir o leer datos, para representar datos en pantalla…. Pero aún así siguen siendo bastante tediosas para trabajar con ellas por lo “simples” que son, cada función hace algo muy específico y requieren que se escriban cientos de líneas de código para cosas muy sencillas. Pero no pueden acomplejarse mas ya que cada una de estas instrucciones debe poder traducirse a binario para el procesador.

Por otro lado tenemos los lenguajes de alto nivel, estos están mucho más alejados del hardware y mas cercanos al lenguaje humano. Son mucho más sencillos de aprender comparados con los de bajo nivel, su portabilidad es mucho mayor y son más fáciles de modificar. Pero a cambio estos no permiten manejar la memoria de una manera tan precisa como los de bajo nivel.

lenguajes de alto nivelTambién tiene otra desventaja, cualquier programa que se ejecute en un ordenador necesita estar escrito en un lenguaje de bajo nivel, así que los programas que se usan para programar (entornos de desarrollo) traducen el código de alto nivel a bajo, ocasionando muchas veces redundancias lo que provoca una ralentización del programa por mala optimización, pero esto ya no suele tenerse mucho en cuenta debido a la velocidad actual de los procesadores.

Actualmente hay decenas de lenguajes de alto nivel y suelen clasificarse en 4 tipos según la estructura que siguen y su forma de programar:

Por un lado están los de programación procedural que están optimizados para poder dividir el código en partes o subprogramas que se llaman unos a otros para ser ejecutados. Por ejemplo C y Pascal.

Luego está la programación orientada a objetos la cual esta diseñada para estructurar el programa en clases y objetos tomando de ejemplo el mundo real. Cada “Página de código” o clase y representa algo (Ejemplo: clase Vehículo, atributos: ruedas, color etc.) y los objetos son lo que representa la clase pero ya definidos (Objeto1, clase vehículo, 4 ruedas, color rojo etc.), y dentro de cada clase se pueden tener varios Objetos. Por ejemplo Java

Otro tipo es la programación funcional, y se usan principalmente para realizar programas expresivos y matemáticamente elegantes. Se caracterizan por la recursividad de evaluación de funciones. Ejemplo Lisp

Por último están los de programación lógica, los cuales siguen una estructura e instrucciones expresadas empleando lógica formal matemática, trata de descomponer el programa en sus componentes lógicos. Ejemplo Prolog.

Al comienzo usar un lenguaje de programación puede parecer muy complicado, pero al final la mayoría siguen la misma lógica y en general usan funciones muy parecidas, las cuales no hacen falta ni memorizar ya que internet ofrece muchos recursos de ayuda para cuando no se sepa como hacer algo. La única complejidad es entender la lógica.

Lenguajes de programacionPrimero, en todos es necesario definir que datos vas a usar a lo que se le denomina declarar variables. También en muchos casos se te pide decir de que tipo es la variable (numéricos, caracteres, binario, etc.). Pongo un ejemplo marcando en azul el tipo de variable, en naranja su nombre y en rojo su valor (el nombre de una variable puede ser cualquiera que se quiera mientras no contenga símbolos especiales ni comience con un dígito)

int numero = 0 <- Esto crea una variable tipo int (número entero) y le da el valor 0. Ahora numero vale 0.

boolean verdad = true <- Esto crea una variable boolean (binaria, solo puede valer true o false).

String frase = “Hola Mundo” <- Esto crea una variable String (Cadena de caracteres), y vale lo que hay entre comillas.

Luego sería necesario usar funciones definidas por el lenguaje, normalmente cada uno tiene un set distinto de funciones, sobre todo si son para cosas específicas, pero para el tratamiento de datos la mayoría funcionan con condicionales estilo “si ocurre esto, haz esto” que se suele denotar con el IF:

If (ocurre esto) {haz esto}

Por ejemplo: If (verdad) { numero = 1 }

(Si ‘verdad’ vale true, iguala ‘numero’ a 1)

Esta función comprueba la variable ‘verdad’, y si ‘verdad’ vale true, iguala la variable ‘numero’ a 1, que en nuestro caso ocurriría ya que ahora mismo ‘verdad’ vale true, por lo que ‘numero’ ahora valdrá 1.

Si ahora digo:

verdad = false

If (verdad) { numero = 3 }

(‘verdad’ vale false, si ‘verdad’ es true iguala ‘numero’ a 3)

He puesto ‘verdad’ a false, por lo que el condicional no se cumple, así que ‘numero’ seguirá valiendo 1. También no hace falta que indique de nuevo los tipos de las variables por que ya los definí antes.

Lo más común es usar estructuras tipos “Si ocurre esto, haz esto, y si no, haz esto otro”, el “y si no” se denota como ‘else’. Por ejemplo:

If (verdad) { numero = 3 }

else { numero = 5}

(Si ‘verdad’ es true, iguala ‘numero’ a 3, y si no iguala ‘numero’ a 5 )

Primero comprueba si ‘verdad’ es true, pero como no lo es ya que lo cambiamos antes, va ha hacer el ‘else’, por lo que ahora la variable ‘numero’ vale 5.

También es muy común el uso de bucles para repetir una o varias líneas de código varias veces entre otras muchas cosas. Como comente antes hay funciones mas específicas que muchas veces dependen del lenguaje pero hay otras que no como por ejemplo la función para mostrar texto en pantalla ‘print’:

print(frase)

Esto simplemente hace que el programa muestre por pantalla la cadena de caracteres que se le haya indicado entre paréntesis, como la variable ‘frase’ la pusimos el valor “Hola Mundo”, mostrará eso por pantalla.

 

Bibliografía:

Anuncios