II.

Los lenguajes de programación y la creación de software

El concepto de lenguaje de programación se suele definir como «un lenguaje artificial creado para que alguien pueda dar instrucciones a un ordenador». Los ordenadores no entienden el castellano, el árabe ni el chino, y aunque los seres humanos técnicamente pueden aprender el lenguaje binario (el idioma básico de los ordenadores), casi nadie lo hace. Por eso necesitamos alguna forma intermedia de comunicación, que llamamos «lenguajes de programación».

Como se ha visto en la sección I, los programadores han creado lenguajes de programación y sistemas de software desde los comienzos de los sistemas informáticos. En esta sección, comprenderás cómo han evolucionado los lenguajes de programación y qué puedes hacer con ellos.

Lenguajes de programación de bajo nivel

Al principio, con los primeros ordenadores, el lenguaje ensamblador y el código binario eran los principales lenguajes que se usaban para comunicarse con los ordenadores y pedirles que ejecutaran órdenes traduciendo los datos a unos y ceros (es decir, binario).

El código máquina, también conocido como lenguaje binario, es una serie de unos y ceros que representan una orden dirigida al procesador de un ordenador (CPU). El lenguaje ensamblador es mucho más legible que el lenguaje binario. El ensamblador emplea códigos mnemotécnicos para hacer referencia a las instrucciones del código máquina, en lugar de utilizar directamente los valores numéricos de esas instrucciones.

Aunque parezca que estos lenguajes ya no importan, dado que son invisibles para la mayoría de las personas que usan ordenadores, la realidad es que seguimos utilizando estos lenguajes en los sistemas informáticos modernos. Son los elementos básicos de cualquier ordenador. Cada CPU puede ejecutar un conjunto específico de instrucciones, correspondiente a la marca o arquitectura de esa CPU.

En cualquier caso, ¿para qué podría servirnos aprender a programar con estos lenguajes de bajo nivel? Hay muchas razones, como las siguientes:

  • Algunos componentes de nuestros sistemas operativos, e incluso algunos virus, están escritos en ensamblador.

  • Si quieres trabajar en la programación de una GPU utilizando lenguajes de alto nivel como CUDA u OpenCL, tendrás que entender la programación de bajo nivel.

  • Si quieres mejorar el aprendizaje automático, puedes optimizar el código utilizando el lenguaje ensamblador para gestionar la memoria de forma eficiente.

  • Si quieres aprender cómo funcionan los sistemas operativos en profundidad, conocer el lenguaje ensamblador te será de gran ayuda. Este lenguaje se suele usar en el código de arranque de los sistemas, el código de bajo nivel que inicializa el hardware del sistema y comprueba que funciona bien antes de arrancar el sistema operativo.

  • El lenguaje ensamblador es útil para la ingeniería inversa. Muchos programas se distribuyen solo en forma de código máquina, que es fácil de traducir a lenguaje ensamblador mediante un desensamblador, pero más difícil de traducir a un lenguaje de alto nivel mediante un descompilador.

Después de ver cómo y por qué puedes aprender los lenguajes de bajo nivel, vamos a explicar en qué consisten los lenguajes de alto nivel.

Una pila de nombres de lenguajes de software
Una pila de nombres de lenguajes de software

Lenguajes de programación de alto nivel

Sabemos que un ordenador entiende el código binario, pero nosotros no lo entendemos, a excepción de unas pocas personas en el mundo.

A finales de los años cincuenta, los usuarios de ordenadores (en su mayoría científicos y grandes empresas), a menudo, tenían que escribir el software ellos mismos. Esto acarreaba varios inconvenientes: cada empresa o laboratorio tenía que contar con alguien capaz de programar el ordenador y el software se creaba para un sistema informático concreto, por lo que no se podía intercambiar con otros, ya que no eran compatibles. Entonces se inventaron los compiladores, lo que favoreció el desarrollo de los lenguajes de programación de alto nivel, más abstractos y fáciles de entender.

Note

Un compilador traduce el código escrito en un lenguaje informático a otro lenguaje informático.

Los primeros lenguajes de alto nivel creados en los años cincuenta fueron FORTRAN, COBOL y BASIC. Permitían especificar los programas de forma abstracta, de manera que funcionaran independientemente de los detalles concretos de la arquitectura del hardware del ordenador (Wolfram 2002).

Estos lenguajes se usan para escribir programas, que son conjuntos completos y funcionales de instrucciones que los ordenadores utilizan para realizar tareas, como cargar una página web, generar análisis estadísticos o calcular la suma de dos números. Sin embargo, la CPU no reconoce este código directamente, sino que hace falta compilarlo para traducirlo a un lenguaje de bajo nivel.

Si el código era muy largo, se tardaba mucho tiempo en compilarlo, por lo que los programadores inventaron los intérpretes.

Note

Un intérprete ejecuta directamente las instrucciones escritas en un lenguaje de programación, sin necesidad de que un compilador las compile para convertirlas en un programa de código máquina.

Algunos lenguajes de programación utilizan tanto compiladores como intérpretes. Si tuvieras que escribir un programa de Java en un procesador de texto, al compilarlo con el compilador de Java, en realidad estarías creando algo llamado bytecode o código de bytes. El código de bytes puede considerarse una etapa intermedia entre el código fuente (el inicial) y el código objeto (el final). Cuando un ordenador ejecuta un programa de Java, los programas de las bibliotecas de ese ordenador interpretan el código de bytes. Esto permite que Java funcione en cualquier plataforma: para que se ejecuten los programas, los usuarios deben tener en su ordenador las bibliotecas de ejecución de Java correctas.

¿En qué se diferencian los lenguajes de bajo y alto nivel?

La principal diferencia es que los programadores pueden entender, interpretar o compilar más fácilmente los lenguajes de alto nivel que el código máquina. Por otro lado, las máquinas pueden entender el lenguaje de bajo nivel con más facilidad que las personas. Veamos otras diferencias:

Column 1Column 2
Lenguaje fácil de usar para los programadoresLenguaje fácil de usar para las máquinas
El lenguaje de alto nivel utiliza la memoria de forma menos eficienteEl lenguaje de bajo nivel utiliza la memoria de forma más eficiente
Más fácil de depurarDifícil de depurar, en comparación
Más fácil de mantenerDifícil de mantener, en comparación
PortableNo portable
Puede funcionar en cualquier plataformaDepende del ordenador
Necesita un compilador o intérprete para la traducciónNecesita un ensamblador para la traducción
Muy utilizado para programarHoy en día no se utiliza habitualmente para programar

Cómo escribir tus propios programas/software

Existe toda una disciplina dedicada a la creación de software (o productos de software), llamada ingeniería de software. Primero vamos a aprender un poco sobre la ingeniería de software y, después, sobre los lenguajes de programación.

¿Qué es la ingeniería de software?

Cuando pensamos en el software, solemos imaginar una interfaz que nos permite hacer algo con el ordenador, como escribir un texto. La ingeniería de software se define como un proceso de análisis de los requisitos de los usuarios (las necesidades que tienen a la hora de escribir el texto) para crear el producto de software deseado. Luego hay que diseñar, desarrollar y probar una aplicación de software que cumpla esos requisitos.

Ejemplo

Veamos las distintas definiciones de la ingeniería de software:

  • El IEEE, en su norma 610.12-1990, define la ingeniería de software como la aplicación de un enfoque sistemático, disciplinado y computable para el desarrollo, el funcionamiento y el mantenimiento del software.

  • Fritz Bauer la definió así: «el establecimiento y uso de principios de ingeniería estándar. Ayuda a obtener, de forma económica, un software fiable que funcione eficazmente en máquinas reales».

  • Boehm define la ingeniería de software como «la aplicación práctica del conocimiento científico al diseño creativo y la creación de programas informáticos. También incluye la documentación relacionada, necesaria para su desarrollo, uso y mantenimiento».

Pero ¿la ingeniería de software implica algo más que programar?

Sí, para crear un software hay que seguir muchos pasos, tanto antes como después de programar. Lo llamamos ciclo de vida del desarrollo de software (SDLC, por sus siglas en inglés) y está estructurado en una secuencia bien definida, que hace que el proceso de diseño y desarrollo sea más eficiente. Se compone de los siguientes pasos:

  • La comunicación es el primer paso. En general, un posible cliente de una empresa de software inicia la solicitud del producto de software que desea.

  • La recopilación de requisitos consiste en tratar de obtener toda la información posible sobre las necesidades del cliente.

  • En el estudio de viabilidad, el equipo elabora un plan aproximado para el proceso de creación del software.

  • Con el análisis del sistema, el equipo del proyecto analiza el alcance de dicho proyecto y, basándose en él, define el calendario y los recursos.

  • El diseño del software es la etapa en que el equipo, a partir de la información obtenida en las fases de requisitos y análisis, diseña el producto de software en sí.

  • La fase de codificación o programación es en la que el equipo comienza a escribir el código del programa en un lenguaje de programación adecuado y desarrolla programas ejecutables sin errores de forma eficiente.

  • Las pruebas son una parte esencial del proceso para descubrir y corregir posibles errores.

  • La fase de integración es necesaria si el software debe integrarse con elementos externos como bases de datos u otros programas.

  • La fase de implementación tiene lugar cuando el nuevo software está listo y se instala en los ordenadores de los usuarios.

  • El funcionamiento y el mantenimiento consisten en confirmar, durante el uso real, la eficiencia del software. Se comprueban y corrigen los posibles errores.

Diferencias entre desarrollo en cascada y desarrollo ágil

Todas las fases o actividades del SDLC que hemos mencionado más arriba pueden ejecutarse en otro orden, siguiendo las diversas metodologías que existen. Además, con cada método se invierte más o menos tiempo en las diferentes fases del SDLC. Esas etapas pueden llevarse a cabo sucesivamente, como en la metodología en cascada, o pueden repetirse a lo largo de varias iteraciones, para dar prioridad a que el producto de software esté listo de manera gradual, como en la metodología ágil.

Comparación entre el desarrollo en cascada y el ágil
Comparación entre el desarrollo en cascada y el ágil

Los métodos tradicionales de desarrollo de software utilizan lo que se denomina desarrollo en cascada. Antes de que las actualizaciones de software pudieran descargarse fácilmente o implementarse de manera automática por Internet, se diseñó el proceso de desarrollo en cascada. El objetivo de este método era que, cuando el cliente recibiera el programa de software, este tuviera todas las características necesarias y se hubieran detectado y resuelto todos los problemas conocidos hasta la siguiente versión del programa. Este proceso es muy arriesgado y requiere mucho tiempo, porque el producto se prueba al final, después de que los desarrolladores y diseñadores hayan dedicado una gran cantidad de tiempo a diseñar y crear todo el programa. Por otra parte, este tipo de proceso da prioridad a la eficiencia de la ingeniería en detrimento de la experiencia del usuario final; esto puede dar lugar a problemas que no hayan previsto los ingenieros y que les resulten frustrantes a los clientes finales, que no participan en el proceso de desarrollo una vez completado el análisis de requisitos inicial. Y esa frustración puede provocar pérdidas en el negocio o que haya que volver a crear el producto desde cero, con el gran coste que eso supone.

La metodología ágil es un enfoque más moderno, que se recomienda utilizar para crear software de forma colaborativa entre los equipos de desarrollo y los clientes. Este sistema se basa en la planificación, el aprendizaje y la comunicación continuos para ofrecer software que se va ampliando poco a poco, en lugar de entregarlo todo de una vez al final del proyecto. Los usuarios finales (las personas que utilizarán el software) son la principal referencia al definir las características y los requisitos del diseño, y se les pide que hagan pruebas dividiendo el producto en pequeñas porciones que se van sumando a lo largo del proyecto. De este modo, si se detecta un error en el proceso para el que se diseñó el producto, se pueden hacer ajustes inmediatamente, antes de seguir desarrollándolo. Dividir el proceso en partes más pequeñas y probar e integrar continuamente las funciones del software por lotes permite fraccionar el riesgo de invertir en su desarrollo y hace que los usuarios puedan implementarlo y usarlo antes.

Ahora que conocemos todo el proceso que hay detrás de la creación del software, regresemos a la programación y los lenguajes de programación.

Note

Como ya sabes, la mayoría de los programas informáticos están escritos en un lenguaje de programación de alto nivel. La versión de un programa que podemos leer las personas se llama código fuente. Al igual que un desarrollador de software, tú también puedes crear y editar código fuente en un lenguaje de alto nivel utilizando un IDE de software o incluso un procesador de texto básico.

¿Qué es un IDE de software?

IDE son las siglas en inglés de entorno de desarrollo integrado. Se trata de una aplicación que utilizan los desarrolladores para crear programas informáticos. En este caso, la palabra integrado hace referencia a la forma en que se combinan varias herramientas de desarrollo en un solo programa. Por ejemplo, un IDE típico incluye un editor de código fuente, un depurador y un compilador. La mayoría de los IDE también ofrecen una interfaz de proyectos que permite a los programadores hacer un seguimiento de todos los archivos relacionados con un proyecto. Muchos cuentan también con funciones de control de versiones.

Algunos IDE ofrecen un entorno de ejecución (RTE, de runtime environment) para probar los programas de software. Cuando se ejecuta un programa dentro del RTE, el desarrollador puede observar cada uno de los eventos que tienen lugar dentro de la aplicación que está probando. Esto puede ser útil para identificar y corregir los errores y para averiguar a qué se deben las fugas de memoria. Como los IDE proporcionan una interfaz de usuario centralizada para escribir el código y probar los programas, los programadores pueden hacer cambios rápidamente, recompilar el programa y volver a ejecutarlo. La programación sigue siendo un trabajo complicado, pero el software de los IDE ayuda a agilizar el proceso de desarrollo.

Los programadores, los desarrolladores de software, los desarrolladores web y otros profesionales de la informática emplean una infinidad de lenguajes de programación. Pero ¿cuántos hay?

Según Wikipedia, existen unos 700 lenguajes de programación, incluyendo los lenguajes de codificación esotéricos. Otras fuentes que solo tienen en cuenta los lenguajes significativos siguen sumando la impresionante cifra de 245 lenguajes. También existe una lista, llamada HOPL, que afirma incluir todos los lenguajes de programación que han existido y calcula que son 8945 en total. Algunos incluso estiman que hay hasta 25 000.

Pero ¿cómo elegir el lenguaje de programación que deberías aprender? Y ¿de verdad puedes aprender a programar? La respuesta es sí. Puedes y deberías, ya que cada vez es más necesario tener conocimientos de programación para realizar todo tipo de trabajos.

Carlcheo ha creado una práctica infografía para ayudarnos a decidir qué lenguaje de programación aprender y ha recopilado diversos recursos muy útiles para empezar a aprender algunos de esos lenguajes.

  • Si buscas un lenguaje para que tus hijos aprendan a programar, es recomendable que usen Scratch y, cuando terminen con él, pasen a Python.

  • Si quieres aprender un lenguaje para trabajar en Facebook o Google, puede que la mejor opción sea Python. Es muy buena elección en general, ya que se considera uno de los lenguajes que son relativamente fáciles de aprender.

  • Si quieres aprender un lenguaje «fácil», según los desarrolladores, deberías optar por Python, Ruby o JavaScript. Con estos lenguajes puedes adquirir una base sólida para entender la lógica y la sintaxis de la programación. Y, cuando lo hayas conseguido, cualquier otro idioma te resultará más fácil de aprender.

  • Si quieres desarrollar juegos, C++ suele ser el lenguaje más adecuado.

  • Si prefieres programar a un nivel relativamente bajo, C y C++ son buenas opciones, ya que suelen compilarse directamente en el código máquina de la plataforma que se use. Además, C y C++ permiten escribir de una forma bastante cercana a la mayor parte del código máquina (por ejemplo, incrementando punteros). Rust es un lenguaje más reciente.

  • Si quieres trabajar en proyectos de iPhone, es decir, en proyectos relacionados con iOS, elige Swift.

  • Si prefieres trabajar en proyectos relacionados con Android, deberías escoger Java o Kotlin.

  • Si te atrae la estética de los sitios web, es muy probable que te interese aprender un lenguaje de programación orientada al usuario (desarrollo web front-end) y que la mejor opción sea JavaScript.

  • Si te atraen los servidores (desarrollo web back-end) y las bases de datos, el lenguaje más adecuado puede ser Ruby o Python.

  • Si ya sabes qué tecnologías te interesan, esto te servirá para decidirte entre el desarrollo front-end o el back-end.

Y un último consejo: dado que hay cientos de lenguajes para elegir, es conveniente plantearse las dos preguntas siguientes antes de tomar una decisión.

  • ¿Qué es lo que te hizo interesarte por la programación?

  • ¿Qué quieres programar?

Hay muchas oportunidades de avanzar en tu carrera profesional. Con el primer lenguaje que aprendas, puedes empezar a pensar como un programador y entender la lógica básica de la programación. Y no olvides que, para mantenerte al día de las tendencias en tecnología y lenguajes, es fundamental seguir aprendiendo a lo largo de tu vida.

Next section
III. Comprender y utilizar el software de nuestros dispositivos