Logo FPCode

Introducción a la programación

Conceptos básicos sobre la programación, paradigmas, lenguajes de programación y entornos de desarrollo.

Introducción

La programación es una de las habilidades muy importante en el ámbito de la informática. Su comprensión permite diseñar soluciones automáticas a problemas reales, estructurando datos y órdenes que un ordenador pueda entender y ejecutar. En esta introducción abordaremos los conceptos básicos que sustentan la programación: qué son los datos, qué papel juegan los algoritmos, cómo se estructuran los programas, qué paradigmas de programación existen, qué lenguajes se utilizan, entre otros conceptos…

Referencias

Índice

  1. La programación
  2. Paradigmas de programación
  3. Lenguajes de programación
  4. Diagrama de flujo
  5. Herramientas y entornos para el desarrollo de programas
  6. Calidad de los programas
  7. Ejercicios

1. La programación

La programación es una herramienta que nos permite dar instrucciones a las máquinas para que realicen tareas por nosotros. Aunque hoy en día estamos acostumbrados a usar ordenadores y aplicaciones, esta capacidad de comunicarnos con las máquinas no ha existido siempre, sino que ha sido el resultado de una evolución larga en el tiempo. La idea de seguir pasos ordenados para resolver un problema se remonta al siglo IX, cuando el matemático persa Al-Juarismi definió las bases de lo que hoy conocemos como algoritmos.

1.2. Algoritmos y programas

Un algoritmo es, simplemente, una secuencia de pasos finitos y ordenados que nos lleva a resolver un problema, como cuando seguimos una receta de cocina. Durante muchos siglos, estos algoritmos eran ejecutados por personas. Sin embargo, con el avance de la tecnología, especialmente a partir de la Revolución Industrial, empezamos a crear máquinas capaces de hacer ese trabajo. En el siglo XIX, Ada Lovelace escribió el que se considera el primer algoritmo pensado para ser ejecutado por una máquina, colaborando con Charles Babbage y su máquina analítica. Ya en el siglo XX, con la aparición de los primeros ordenadores electrónicos, surgió la necesidad de crear lenguajes de programación, que son formas estructuradas y comprensibles de dar instrucciones a un ordenador.

Estas instrucciones, llamadas órdenes o sentencias, permiten realizar acciones concretas, como mostrar mensajes, realizar operaciones matemáticas o guardar información. Cuando agrupamos varias instrucciones de forma ordenada y lógica, obtenemos un programa. Un programa es la codificación concreta de un algoritmo usando un lenguaje de programación, que puede ser ejecutado por un ordenador. Podemos imaginar un programa como una historia: cada línea es un paso que hace avanzar la acción. Es importante destacar que un programa no puede funcionar sin información; por lo tanto, los datos son su materia prima. Representan información codificada que puede ser procesada por una máquina.

Si todas las instrucciones están bien escritas y colocadas en el orden correcto, el programa funcionará como se espera. Si no, pueden aparecer errores o comportamientos imprevistos. Aprender a programar es, por tanto, aprender a pensar de forma estructurada, lógica y creativa para resolver problemas con la ayuda de las máquinas.

2. Paradigmas de programación

A lo largo del tiempo, la programación ha evolucionado para adaptarse a distintos tipos de problemas y formas de pensar. Esta evolución ha dado lugar a lo que conocemos como paradigmas de programación, que no son más que enfoques o estilos que definen cómo organizar y estructurar el código para resolver un problema.

Un paradigma no es simplemente una técnica aislada, sino un modelo que marca una manera determinada de escribir programas, con sus propias reglas, principios y formas de razonar. Algunos paradigmas se centran en cómo se ejecutan las instrucciones paso a paso, mientras que otros ponen el foco en qué resultado se quiere conseguir sin especificar cómo.

Uno de los paradigmas más comunes es el imperativo, donde el programador da instrucciones explícitas a la máquina sobre lo que debe hacer en cada momento. Dentro de este enfoque, encontramos variantes como:

  • Programación estructurada
    Organiza el código en bloques lógicos utilizando estructuras como condiciones (if), bucles (while, for) y funciones o procedimientos. Favorece una lectura clara y un control preciso del flujo del programa.
    Ejemplos de lenguajes: C, Pascal, Fortran.

  • Programación modular
    Basada en la estructurada, divide el programa en partes independientes llamadas módulos o paquetes. Cada módulo resuelve una parte del problema y puede ser reutilizado en otros programas.
    Ejemplos de lenguajes: Perl, Ruby.

  • Programación orientada a objetos (POO)
    Organiza el código en torno a objetos que agrupan datos y comportamientos relacionados. Se basa en conceptos como clases, herencia, encapsulamiento y polimorfismo. Es muy útil para desarrollar sistemas grandes y complejos.
    Ejemplos de lenguajes: Java, Python, C++, C#.

  • Programación orientada a eventos
    El flujo del programa está determinado por eventos como acciones del usuario, mensajes del sistema o señales externas. Los programas reaccionan a estos eventos mediante manejadores o controladores que ejecutan código específico. Este paradigma es muy usado en interfaces gráficas y aplicaciones interactivas.
    Ejemplos de lenguajes: JavaScript, Visual Basic.

En contraposición, el paradigma declarativo se basa en decirle al ordenador qué se quiere lograr, sin detallar cómo hacerlo. Aquí es la máquina la que se encarga de encontrar el camino para alcanzar el resultado. Dentro de este grupo encontramos:

  • Programación lógica
    Se basa en la definición de hechos y reglas lógicas para deducir resultados. En lugar de especificar cómo realizar una tarea, se declara qué es cierto y la máquina infiere las respuestas.
    Ejemplos de lenguajes: Prolog, Mercury, Oz.

  • Programación funcional
    Construye soluciones a partir de funciones puras que no tienen efectos secundarios ni modifican estados externos. Se centra en la composición y transformación de datos mediante funciones.
    Ejemplos de lenguajes: Haskell, Lisp, Scala.

Ambos paradigmas, el imperativo y el declarativo, representan formas muy distintas de razonar sobre los problemas, pero no son excluyentes. De hecho, muchos lenguajes actuales permiten combinar ideas de varios paradigmas. A esta capacidad se la conoce como programación multiparadigma, y es una práctica habitual en entornos reales. Por ejemplo, lenguajes como Python o Java permiten mezclar programación estructurada, orientada a objetos y, en parte, funcional.

Adoptar uno u otro paradigma depende del tipo de problema que se quiere resolver, la experiencia del programador y las características del lenguaje utilizado. Seguir las reglas y principios de un paradigma ayuda a escribir código más limpio, comprensible y mantenible, facilitando tanto el desarrollo individual como el trabajo en equipo.

Aunque existen muchos paradigmas, los más estudiados en etapas iniciales del aprendizaje de la programación son la programación estructurada y la modular, ya que ofrecen una base para adquirir buenos hábitos de organización y pensamiento lógico.

3. Lenguajes de programación

En la comunicación humana usamos un lenguaje para transmitir información entre un emisor y un receptor, a través de un canal. Cada idioma tiene sus propias reglas gramaticales y estructuras, pero todos comparten una característica esencial: una sintaxis que permite que el mensaje sea comprendido. Esta organización de las palabras es lo que garantiza una comunicación efectiva.

En informática, también se usa el concepto de lenguaje, aunque en este caso, el receptor no es una persona sino una máquina. Los ordenadores funcionan a nivel básico mediante señales eléctricas, representadas como secuencias de 0 y 1, llamadas bits. Estos bits reflejan los dos posibles estados de un transistor: encendido (1) o apagado (0).

Dado que las personas no pueden comunicarse directamente con bits, se crearon lenguajes intermedios llamados lenguajes de programación. Estos lenguajes permiten traducir nuestras ideas en instrucciones comprensibles para una máquina, sirviendo de puente entre el pensamiento humano y la lógica del ordenador.

En los inicios de la informática, la programación era muy rudimentaria. Se utilizaban tarjetas perforadas con agujeros que representaban instrucciones en binario. Este proceso era lento y propenso a errores, pero fue el primer paso hacia formas más eficientes de comunicación con las máquinas.

Con el tiempo apareció el lenguaje ensamblador, que introdujo instrucciones más comprensibles que el binario puro, aunque seguía siendo un lenguaje de bajo nivel. Cada instrucción en ensamblador corresponde directamente a una operación que la CPU puede ejecutar, como mover datos entre registros o hacer sumas. Para usar ensamblador es necesario conocer bien el hardware de la máquina.

suma.asm
section .data
; Definimos los dos números a sumar
num1 db 5 ; Número 1 (5 en decimal)
num2 db 10 ; Número 2 (10 en decimal)
section .text
global _start
_start:
; Cargamos los números en los registros
mov a1, [num1] ; Cargamos el valor de num1 en el registro AL
add a1, [num2] ; Sumamos el valor de num2 al registro AL
; El resultado de la suma está ahora en el registro AL
; (AL es un registro de 8 bits en la arquitectura x86)
; Para finalizar el programa
mov ebx, 0 ; Código de salida 0
mov eax, 1 ; Número de la llamada al sistema para salir
int 0x80 ; Interrupción para hacer la llamada al sistema

Aunque al ver código ensamblador parece que usamos palabras humanas como mov, add o int, la máquina no entiende estas palabras tal cual. Lo que realmente procesa son códigos binarios que representan esas instrucciones. Por ejemplo, una simple instrucción como mov a1, [num1] se traduce en una secuencia de bits que puede ocupar 48 o más, dependiendo de la arquitectura. Esto nos da una idea de la enorme cantidad de ceros y unos que hay detrás de cualquier programa, incluso el más simple.

Gracias a la evolución de la informática, hoy disponemos de lenguajes de programación de más alto nivel, como C, Python o Java, que nos permiten centrarnos en la lógica de los programas sin tener que preocuparnos por el hardware. Estos lenguajes siguen teniendo reglas y sintaxis propias, pero hacen que programar sea más accesible, más rápido y menos propenso a errores.

3.2. Clasificación

Los lenguajes de programación se pueden clasificar de diversas formas según diferentes criterios, como el nivel de abstracción, la forma en que se ejecutan o cómo se procesan antes de la ejecución.

Según el nivel de abstracción:

Lenguajes de bajo nivel

Son aquellos que están muy cercanos al lenguaje máquina, es decir, al código binario que entiende directamente el procesador. Un ejemplo típico son los lenguajes ensamblador (assembly), que utilizan instrucciones simbólicas que representan operaciones básicas del hardware. Los lenguajes de bajo nivel permiten un control muy preciso sobre el hardware y la memoria, pero son más difíciles de aprender y escribir, ya que requieren conocer la arquitectura interna del computador.

Lenguajes de alto nivel

Estos lenguajes están diseñados para ser más abstractos y legibles para los humanos, ocultando los detalles complejos del hardware. Permiten expresar algoritmos y estructuras de manera más intuitiva y cercana al lenguaje natural. Algunos ejemplos son Python, Java y JavaScript. Los lenguajes de alto nivel facilitan el desarrollo rápido, la mantenibilidad y la portabilidad del código entre diferentes sistemas.

Según la forma en que se ejecutan:

Lenguajes compilados

En este tipo de lenguajes, el código fuente que escribe el programador se traduce completamente a código máquina mediante un programa llamado compilador, antes de que se ejecute. El resultado es un archivo ejecutable independiente que la computadora puede correr directamente. Esto suele ofrecer mejor rendimiento, ya que la traducción está optimizada y ocurre solo una vez. Lenguajes como C, C++, Go o Rust son ejemplos típicos de lenguajes compilados.

Lenguajes interpretados

En los lenguajes interpretados, el código fuente no se convierte directamente a código máquina. En lugar de eso, un programa llamado intérprete lee y ejecuta el código línea por línea en tiempo real. Esto facilita la depuración y la portabilidad, ya que el código puede ejecutarse en cualquier máquina que tenga el intérprete adecuado, sin necesidad de recompilar. Python, PHP, JavaScript y Ruby son ejemplos de lenguajes interpretados..

3.3. Ejemplos

  • C Sharp
Logo de C#

Lenguaje de programación desarrollado por Microsoft, orientado a objetos y utilizado principalmente en el desarrollo de aplicaciones de escritorio, videojuegos con Unity y software empresarial en el ecosistema .NET.

suma.cs
using System;
class Program
{
static void Main()
{
int num1 = 5;
int num2 = 10;
int suma = num1 + num2;
Console.WriteLine($"La suma de {num1} y {num2} es: {suma}");
}
}
  • Java
Logo de Java

Lenguaje de propósito general, orientado a objetos y ampliamente utilizado en aplicaciones empresariales, desarrollo móvil (Android) y sistemas distribuidos. Se caracteriza por su portabilidad gracias a la máquina virtual de Java (JVM).

suma.java
public class Suma {
public static void main(String[] args) {
int num1 = 5;
int num2 = 10;
int suma = num1 + num2;
System.out.println("La suma de " + num1 + " y " + num2 + " es: " + suma);
}
}
  • Python
Logo de Python

Lenguaje de alto nivel, fácil de aprender con una sintaxis clara. Se utiliza para desarrollo web, ciencia de datos, inteligencia artificial, automatización y más. Su versatilidad y la disponibilidad de una gran variedad de bibliotecas lo hacen muy popular.

suma.py
num1 = 5
num2 = 10
suma = num1 + num2
print(f"La suma de {num1} y {num2} es: {suma}")
  • JavaScript
Logo de Javascript

Lenguaje de programación esencial para el desarrollo web, utilizado principalmente en el lado del cliente para crear interfaces dinámicas. Con Node.js, también se usa en el backend.

suma.js
let num1 = 5;
let num2 = 10;
let suma = num1 + num2;
console.log(`La suma de ${num1} y ${num2} es: ${suma}`);
  • PHP
Logo de PHP

Lenguaje de scripting ampliamente utilizado en desarrollo web para la creación de sitios y aplicaciones dinámicas. Es el motor de muchas plataformas como WordPress y Laravel.

suma.php
<?php
$num1 = 5;
$num2 = 10;
$suma = $num1 + $num2;
echo "La suma de $num1 y $num2 es: $suma";
?>

3.4. Lenguaje de aprendizaje (Pseudocódigo)

Cuando empezamos a aprender a programar o diseñamos una solución antes de escribir código, nuestro objetivo principal es estructurar y planificar la lógica para resolver un problema sin preocuparnos por la sintaxis específica de un lenguaje de programación. En esta etapa inicial, no utilizamos lenguajes formales que requieren un conocimiento detallado de reglas, estructuras y símbolos, sino que empleamos una forma de comunicación más cercana a nuestro lenguaje natural.

Este lenguaje intermedio se llama pseudocódigo. El pseudocódigo nos permite describir la lógica de un programa de forma clara y sencilla, usando palabras y expresiones fáciles de entender para los humanos, pero sin las estrictas reglas de un lenguaje de programación real. Así, podemos enfocarnos en pensar qué pasos debe seguir el programa para cumplir su función, sin preocuparnos todavía por detalles técnicos o sintácticos.

Es importante destacar que el pseudocódigo no se puede ejecutar directamente en una computadora, ya que no tiene una traducción directa a código binario. En cambio, actúa como un puente entre la idea o el algoritmo que queremos implementar y el lenguaje de programación concreto que usaremos para escribir el código real. Una vez definido el pseudocódigo, se realiza una traducción hacia el lenguaje elegido, adaptando las instrucciones para que la computadora pueda procesarlas y ejecutarlas correctamente.

A continuación, se muestra un ejemplo sencillo de pseudocódigo para sumar dos números:

suma.txt
Inicio
Definir num1 como Entero;
Definir num2 como Entero;
Definir suma como Entero;
Asignar 5 a num1;
Asignar 10 a num2;
suma ← num1 + num2;
Mostrar "La suma de ", num1, " y ", num2, " es: ", suma;
Fin

Este ejemplo refleja cómo, mediante pseudocódigo, podemos expresar la lógica del programa de manera comprensible y ordenada antes de pasar a la fase de programación propiamente dicha.

4. Diagramas de flujo

Los diagramas de flujo son una herramienta gráfica que nos permite representar visualmente la secuencia lógica y el flujo de un algoritmo o proceso. Consisten en símbolos conectados por flechas que indican el orden en que se ejecutan las instrucciones o decisiones dentro del programa.

Al utilizar diagramas de flujo, podemos visualizar de forma clara y sencilla cómo se resuelve un problema, facilitando la comprensión y planificación antes de comenzar a escribir código en un lenguaje de programación concreto. Esta representación gráfica ayuda a detectar errores lógicos o pasos innecesarios de manera temprana.

Relación del pseudocódigo y los diagramas de flujo

Ambos son formas de expresar la lógica de un algoritmo sin depender de la sintaxis específica de un lenguaje de programación. Mientras el pseudocódigo utiliza una notación escrita cercana al lenguaje natural para describir los pasos del algoritmo, el diagrama de flujo ofrece una representación visual de esos mismos pasos.

En esta primera unidad, aprender a diseñar tanto pseudocódigo como diagramas de flujo es necesario, ya que constituyen la base para comprender cómo estructurar y organizar algoritmos antes de traducirlos a un código de un lenguaje de programación concreto que la computadora pueda ejecutar.

5. Herramientas y entornos para el desarrollo de programas

Para crear programas de manera eficiente y ordenada, los desarrolladores no escriben código directamente en un bloc de nota, si no, que utilizan diversas herramientas y entornos que facilitan la escritura, prueba, depuración y mantenimiento del código. Estas herramientas no solo agilizan el proceso de desarrollo, sino que también contribuyen a mejorar la calidad del software producido.

Entre las herramientas más comunes destacan:

  • Editores de texto: Son aplicaciones que permiten escribir y modificar código fuente de forma sencilla. Algunos editores populares son NotePad++, Visual Studio Code (VS Code), Sublime Text y Atom. Estos editores suelen incluir funcionalidades como resaltado de sintaxis, autocompletado y extensiones que amplían sus capacidades.

  • Entornos de desarrollo integrados (IDEs): Son plataformas más completas que, además de la edición de código, integran herramientas para compilar, ejecutar y depurar programas. Algunos ejemplos:

    • Eclipse, IntelliJ IDEA y NetBeans: IDEs populares para Java y otros lenguajes basados en la JVM.
    • Visual Studio: Muy utilizado para desarrollo en C#, .NET, C++ y aplicaciones web, especialmente en entornos Windows.
    • PyCharm: IDE especializado para Python, con funcionalidades avanzadas para desarrollo científico y web.
    • Xcode: IDE oficial de Apple para desarrollo en Swift, Objective-C y aplicaciones para iOS, macOS, watchOS y tvOS.
    • Android Studio: Basado en IntelliJ IDEA, es el entorno oficial para desarrollar aplicaciones Android con Java o Kotlin.
    • RubyMine: IDE para Ruby y Ruby on Rails, facilitando el desarrollo rápido de aplicaciones web con este lenguaje.
    • WebStorm: Orientado a desarrollo web con JavaScript, TypeScript, React, Angular, entre otros.
    • CLion: IDE para desarrollo en C y C++, con soporte para CMake y depuración avanzada.
  • Sistemas de control de versiones: Herramientas como Git o SVN permiten llevar un seguimiento detallado de los cambios realizados en el código, facilitando el trabajo colaborativo y la gestión de diferentes versiones del software.

  • Depuradores: Son herramientas que ayudan a identificar y corregir errores durante la ejecución de un programa. Permiten detener la ejecución, inspeccionar variables y seguir el flujo del código para encontrar fallos lógicos o de comportamiento. La gran mayoria de IDES, ya lo incorporan.

  • Gestores de paquetes: Estos sistemas facilitan la instalación, actualización y gestión de bibliotecas o dependencias que utiliza un proyecto. Algunos ejemplos son npm para JavaScript, pip para Python y Maven para Java.

Estas herramientas se trabajarán con profundidad en otras unidades o asignaturas.

6. Calidad de los programas

Cuando desarrollamos programas o algoritmos, no basta con que simplemente funcionen para resolver un problema. Es necesario que el software tenga una calidad adecuada, lo que significa que esté libre de errores, sea eficiente en el uso de recursos, fácil de mantener y comprender, y que cuente con una buena documentación para facilitar el trabajo de otros desarrolladores en el futuro.

Un programa de buena calidad aporta varios beneficios importantes. Ayuda a reducir la cantidad de errores y fallos que pueden afectar su funcionamiento, facilita la tarea de mantener y modificar el código a medida que cambian los requisitos, mejora la experiencia del usuario evitando comportamientos inesperados y genera mayor confianza en que el software cumple correctamente su propósito.

Tipos de errores

Los errores, también llamados bugs, son uno de los principales enemigos de la calidad del software. Se pueden clasificar en tres tipos básicos:

  • Errores de sintaxis: Ocurren cuando el código no respeta las reglas del lenguaje de programación, como olvidarse de un punto y coma o escribir mal una palabra reservada. Estos errores impiden que el programa se compile o interprete adecuadamente. Estos errores suelen ser detectados rápidamente por las herramientas de desarrollo.

  • Errores de ejecución: Aparecen mientras el programa está corriendo, como intentar dividir un número por cero o acceder a una variable que no tiene valor asignado (null). Estos errores pueden hacer que el programa se detenga de forma inesperada o que genere resultados incorrectos.

  • Errores lógicos: Son más difíciles de detectar porque el programa se ejecuta sin fallos, pero no realiza correctamente la tarea para la que fue diseñado. Esto sucede cuando la lógica implementada no es la adecuada para resolver el problema planteado.

Cómo mejorar la calidad

Para conseguir un software de calidad, se recomienda seguir ciertas prácticas que ayudan a prevenir y corregir errores:

  • Realizar pruebas constantes: Es importante aplicar diferentes tipos de pruebas, como pruebas unitarias (para cada parte pequeña del código), pruebas de integración (para verificar que las partes funcionan bien juntas) y pruebas funcionales (para validar que el programa cumple con los requisitos).

  • Revisión de código: Revisar el código ayuda a detectar errores, mejorar la lógica y aprender mejores formas de resolver problemas.

  • Adoptar buenas prácticas de programación: Escribir código claro, modular (dividido en partes pequeñas y reutilizables) y bien documentado facilita la comprensión y el mantenimiento a largo plazo.

7. Ejercicios

Ejercicio 1: Algoritmos vs Programas

🔍 Objetivo: Comprender la diferencia entre un algoritmo y un programa.

✏️ Instrucciones:

  1. Explica con tus propias palabras qué es un algoritmo y qué es un programa.
  2. Indica cuál es la principal diferencia entre ambos.
  3. ✨ Da un ejemplo práctico de un algoritmo cotidiano (por ejemplo, cómo preparar un café).
  4. Explica cómo ese algoritmo podría convertirse en un programa informático.
Ejercicio 2: Código espagueti

🔍 Objetivo: Investigar y comprender qué es el código espagueti y su relación con los paradigmas de programación.

✏️ Instrucciones:

  1. Investiga y define qué es el código espagueti.
  2. Explica por qué suele aparecer con mayor frecuencia en ciertos paradigmas o estilos de programación.
  3. Justifica en qué paradigma es más común encontrarlo y por qué ocurre.
Ejercicio 3: Lenguajes de programación

🔍 Objetivo: Conocer distintos lenguajes de programación, su historia y su popularidad actual.

✏️ Instrucciones:

  1. Haz una tabla con al menos 10 lenguajes de programación, incluyendo para cada uno:
      • 📝 Nombre del lenguaje
      • 👤 Creador/a
      • 📅 Año de creación
      • 🧭 Paradigmas que soporta (imperativo, orientado a objetos, funcional, etc.)
  1. Investiga en una fuente de referencia cuáles son los lenguajes más utilizados actualmente.

  2. 📈 Análisis final:

      • Elige el lenguaje más popular de la lista y analiza:
        • Sus características principales
        • Ventajas y usos comunes
        • Por qué ocupa el primer lugar en popularidad
Ejercicio 4: La importancia de aprender programación en la era de la Inteligencia Artificial

🔍 Objetivo: Reflexionar sobre la relevancia de la programación en un mundo cada vez más automatizado por la inteligencia artificial.

✏️ Instrucciones:

  1. Explica por qué sigue siendo necesario aprender a programar aunque la IA sea cada vez más presente en nuestras vidas y trabajos.
  2. Reflexiona sobre aspectos como:
    • 🛠️ Control sobre la tecnología
    • 💡 Capacidad de adaptar soluciones
    • 🧠 Desarrollo del pensamiento lógico y crítico
    • 🤝 Colaboración entre hombre-máquina
  3. Da ejemplos concretos de cómo la programación complementa el uso de la IA en diferentes ámbitos, como:
    • Ciencia de datos
    • Educación
    • Salud
    • Negocios
    • Entretenimiento