Introducción a la Programación
¡Buenas a todos, futuros cracks del código! Bienvenidos al primer asalto en vuestra carrera como desarrolladores. Antes de que empecemos a escribir código que podría dominar el mundo (o al menos, entregar una práctica a tiempo), tenemos que entender la base de todo: ¿qué narices es programar?
Imaginad que sois chefs de talla mundial y queréis preparar una paella valenciana que haga llorar de emoción. ¿Qué necesitáis? Una receta. Esa receta son los pasos exactos, en orden, sin ambigüedades: "sofreír el pollo", "añadir el tomate", "echar el arroz"... Si seguís la receta al pie de la letra, el resultado será una paella espectacular. Si os saltáis un paso o lo hacéis en el orden incorrecto, acabaréis con algo que en Valencia llaman "arroz con cosas", y eso, amigos míos, es un crimen culinario.
En nuestro mundo, esa receta es un algoritmo. Es la idea, la secuencia lógica de pasos para resolver un problema. El programa es esa misma receta, pero traducida a un idioma que nuestro "cocinero" particular, el ordenador, pueda entender. Y el lenguaje que usaremos para escribir esa receta será JAVA.
Nuestro objetivo en este tema es aprender a pensar como un programador: a coger un problema grande y abstracto, descomponerlo en pequeños pasos lógicos (la receta) y luego aprender las reglas del idioma (JAVA) para escribirlo de forma que la máquina haga exactamente lo que queremos. ¡Vamos a encender los fogones!
1. Algoritmos y Programas
Aunque a menudo se usan como sinónimos, es crucial entender la diferencia entre un algoritmo y un programa. Es la diferencia entre la idea y la ejecución, entre el plano y el edificio.
Definición: Algoritmo
Un algoritmo es una secuencia de pasos lógicos, ordenados, finitos y no ambiguos, diseñados para resolver un problema específico o realizar una tarea. Es la estrategia, el "cómo" vamos a solucionar algo, independientemente del lenguaje de programación.
Pensemos en el algoritmo para "llegar a clase por la mañana":
- Sonar el despertador.
- Apagar el despertador (posiblemente varias veces).
- Levantarse.
- Ducharse.
- Vestirse.
- ...y así sucesivamente.
Este algoritmo funciona sin importar si lo piensas en español, inglés o klingon. Es una idea universal.
Definición: Programa
Un programa es la implementación de uno o más algoritmos en un lenguaje de programación específico. Es el conjunto de instrucciones que un ordenador puede interpretar y ejecutar para llevar a cabo las tareas definidas en el algoritmo.
Siguiendo la analogía, un programa sería nuestra receta de paella escrita para un robot de cocina Thermomix (nuestro ordenador), usando el lenguaje de programación específico que ese robot entiende.
Un buen algoritmo debe cumplir tres reglas de oro:
- Preciso: Cada paso debe estar definido de forma clara y sin ambigüedad. No vale un "echar un poco de sal". ¿Cuánto es "un poco"? Hay que ser específicos.
- Definido: Si sigues el algoritmo dos veces con los mismos datos de entrada, el resultado debe ser siempre el mismo. Dos recetas idénticas deben producir dos paellas idénticas.
- Finito: El algoritmo debe tener un número limitado de pasos y terminar en algún momento. No puede quedarse en un bucle infinito de "sofreír el pollo".
Reflexión
- Describe con tus propias palabras el algoritmo que sigues para hacer una compra online. ¿Es preciso, definido y finito?
- Piensa en una app que uses a diario (Instagram, TikTok, WhatsApp). ¿Qué crees que hace el algoritmo principal de esa app?
- ¿Cuál es la diferencia fundamental entre el algoritmo de "calcular la ruta más corta en Google Maps" y el programa que se ejecuta en tu móvil?
2. Paradigmas de Programación
Un paradigma de programación es como una filosofía o un estilo de construir software. No es un lenguaje, sino una forma de pensar y estructurar el código. Imagina que quieres construir una casa: puedes usar un paradigma de "ladrillo y cemento" (tradicional) o un paradigma de "casas prefabricadas" (modular). Ambos sirven para construir una casa, pero el enfoque, las herramientas y las reglas son completamente diferentes.
En programación pasa lo mismo. Dependiendo del problema, un paradigma puede ser más adecuado que otro. Lo interesante es que muchos lenguajes modernos, como JAVA, son multiparadigma, lo que significa que nos permiten mezclar estilos según nos convenga.
¡No te cases con uno solo!
Ser un buen desarrollador no significa dominar un solo paradigma, sino entender cuál es la mejor herramienta para cada trabajo. A veces necesitarás un martillo (imperativo) y otras, un destornillador de precisión (funcional).
A lo largo de tu carrera te toparás con varios, pero estos son los más importantes:
En este curso nos centraremos casi exclusivamente en la Programación Orientada a Objetos (POO), ya que es el alma de JAVA y el paradigma más demandado en el desarrollo de aplicaciones empresariales.
Reflexión
- Una consulta SQL como
SELECT nombre FROM usuarios WHERE edad > 18¿A qué paradigma pertenece? ¿Por qué? - Cuando escribes una hoja de estilos CSS para una web, estás describiendo cómo debería verse la página, no los pasos para dibujarla pixel por pixel. ¿Qué tipo de paradigma es?
- ¿Por qué crees que la Programación Orientada a Objetos es tan popular para construir aplicaciones grandes y complejas?
3. Fases de Programación
Crear software no es solo sentarse a teclear como un poseso mientras bebes café (aunque esa parte es importante). Es un proceso estructurado, un ciclo de vida que asegura que lo que construimos funciona, resuelve el problema real y no se desmorona a la primera de cambio. Piénsalo como construir un edificio: no empiezas a poner ladrillos al azar.
graph LR
A[1. Análisis del Problema] --> B[2. Diseño del Algoritmo];
B --> C[3. Codificación/Implementación];
C --> D[4. Pruebas y Depuración];
D --> E[5. Documentación];
E --> F[6. Mantenimiento y Explotación];
subgraph "Fase de Resolución"
A
B
end
subgraph "Fase de Implementación"
C
D
end
subgraph "Fase de Explotación"
E
F
end
- Análisis del Problema: Es la fase más crucial. Aquí te reúnes con el cliente (o tu jefe) y te enteras de qué problema hay que resolver. Tienes que entender los requisitos a la perfección. Preguntar, preguntar y volver a preguntar. Si no entiendes el problema, cualquier solución que programes será inútil.
- Diseño del Algoritmo: Una vez que entiendes el "qué", diseñas el "cómo". Aquí es donde creas la receta. Dibujas diagramas, escribes pseudocódigo... planeas la estructura de tu programa antes de escribir una sola línea de código real. Un buen diseño te ahorrará semanas de sufrimiento en el futuro.
- Codificación (Implementación): ¡Ahora sí! Es el momento de traducir tu algoritmo a un lenguaje de programación, en nuestro caso, JAVA. Abres tu IDE (Entorno de Desarrollo Integrado) y te pones a teclear.
- Pruebas y Depuración: Ningún programa (o casi ninguno) funciona bien a la primera. En esta fase, te pones el sombrero de "villano" y tratas de romper tu propio código. Pruebas todos los casos posibles, buscas errores (
bugs) y los corriges (depuración). - Documentación: No solo se trata de comentar el código. También incluye manuales de usuario, documentación técnica, etc. Un código sin documentar es como un mapa del tesoro sin leyenda: inútil para quien venga después (que podrías ser tú mismo dentro de 6 meses).
- Mantenimiento: El software, una vez entregado, sigue vivo. Hay que corregir errores que aparecen con el uso, añadir nuevas funcionalidades, adaptarlo a nuevos sistemas operativos... Esta fase puede durar años y consumir la mayor parte del coste total del proyecto.
¡No te saltes el análisis y el diseño!
La tentación de saltar directamente a la codificación es enorme, especialmente al principio. ¡No lo hagas! Es como empezar a construir un edificio sin planos. Dedicar tiempo al análisis y al diseño es la marca de un verdadero profesional.
Reflexión
- ¿Qué crees que pasa si un equipo de desarrollo interpreta mal los requisitos en la fase de análisis? Pon un ejemplo.
- ¿Por qué es importante la fase de pruebas? ¿No basta con que el programa "parezca" que funciona?
- Imagina que heredas un proyecto de un programador que se fue de la empresa y no dejó nada de documentación. ¿Cuáles serían los principales problemas a los que te enfrentarías?
4. Tipos de Lenguajes
No todos los lenguajes de programación son iguales. Se pueden clasificar de muchas maneras, pero dos de las más comunes son según su nivel de abstracción (cercanía al hardware) y su evolución histórica (generaciones).
4.1. Cercanía al programador
Esto mide cómo de lejos o cerca está un lenguaje del "idioma" que hablan los microprocesadores (unos y ceros).
-
Lenguajes de Bajo Nivel: Son los más cercanos al hardware. Son muy rápidos y potentes, pero también increíblemente difíciles de leer, escribir y depurar. Es como intentar dar instrucciones a un motor hablando directamente con los pistones.
- Lenguaje Máquina: Son literalmente unos y ceros (
10110010 11010111...). Es el único idioma que el procesador entiende de forma nativa. - Lenguaje Ensamblador: Usa mnemotécnicos (palabras cortas como
MOV,ADD,JMP) para representar las instrucciones de máquina. Es un poco más legible, pero sigue estando atado a la arquitectura de un procesador específico.
- Lenguaje Máquina: Son literalmente unos y ceros (
-
Lenguajes de Alto Nivel: Son los que usamos el 99.9% del tiempo. Están diseñados para ser entendidos por los humanos. Usan una sintaxis parecida al inglés y nos abstraen de la complejidad del hardware. JAVA, Python, C++, C#, JavaScript... todos son lenguajes de alto nivel.
La abstracción es tu amiga
Un lenguaje de alto nivel te permite escribir System.out.println("Hola"); en lugar de miles de instrucciones en binario para decirle a la pantalla qué píxeles encender. ¡Bendita abstracción!
4.2. Generaciones
Esta es una clasificación más histórica, que muestra la evolución del pensamiento en programación.
| Generación | Descripción | Ejemplos |
|---|---|---|
| Primera (1GL) | Lenguaje máquina. Instrucciones directamente en binario para una CPU específica. | Código binario |
| Segunda (2GL) | Lenguaje ensamblador. Se introduce el uso de mnemotécnicos. Se necesita un programa "ensamblador". | Assembly (ASM) |
| Tercera (3GL) | Lenguajes de alto nivel. Son independientes de la máquina y mucho más legibles. Aquí vivimos nosotros. | JAVA, C, C++, Python |
| Cuarta (4GL) | Diseñados para un propósito específico, como la gestión de bases de datos. Son más declarativos. | SQL, MATLAB |
| Quinta (5GL) | Orientados a la inteligencia artificial y la resolución de problemas basada en restricciones. | Prolog, LISP |
Generaciones vs. Paradigmas
Hoy en día, la clasificación por generaciones es más bien una curiosidad histórica. Es mucho más útil y práctico clasificar los lenguajes por sus paradigmas (POO, Funcional, etc.), ya que eso define cómo vas a trabajar con ellos realmente.
Reflexión
- ¿Qué ventajas crees que tiene un lenguaje de alto nivel sobre uno de bajo nivel para desarrollar una aplicación web compleja?
- ¿Y qué desventajas? ¿En qué casos muy específicos podría ser útil usar un lenguaje de bajo nivel hoy en día? (Pista: piensa en videojuegos, sistemas operativos, drivers...).
- SQL se considera un lenguaje de 4ª generación. ¿Por qué crees que encaja en esa descripción?
5. Traductores: Compiladores e Intérpretes
Hemos dicho que los ordenadores solo entienden lenguaje máquina (binario), pero nosotros escribimos en lenguajes de alto nivel como JAVA. ¿Cómo se cierra esa brecha? Con programas especiales llamados traductores. Su trabajo es convertir nuestro código legible por humanos en código ejecutable por la máquina.
Existen dos tipos principales de traductores: los compiladores y los intérpretes.
5.1. Lenguaje compilado
Un compilador es como un traductor que coge una novela entera en inglés y la traduce completamente al español antes de que tú empieces a leerla.
graph LR
subgraph "Fase de Desarrollo (1-vez)<br/>"
A[Código Fuente en C++] --> B{Compilador}
B --> C[Fichero Ejecutable]
end
subgraph "Fase de Ejecución (muchas veces)"
C --> D{Sistema Operativo}
D --> E[Ejecución del Programa]
end
style C fill:#f9f,stroke:#333,stroke-width:2px
- Proceso: El compilador lee todo tu código fuente, lo analiza en busca de errores de sintaxis y, si todo está correcto, lo traduce a un fichero ejecutable en lenguaje máquina.
- Ventajas: La ejecución es muy rápida, porque la traducción ya está hecha. El fichero ejecutable es independiente, no necesita el código fuente para funcionar.
- Desventajas: El proceso de compilación puede ser lento. Si encuentras un error, tienes que corregir, recompilar todo y volver a probar. El ejecutable solo funciona en el sistema operativo y arquitectura para el que fue compilado (un
.exede Windows no funciona en Linux). - Ejemplos: C, C++, Go, Rust.
5.2. Lenguaje interpretado
Un intérprete es como un traductor simultáneo en una conversación. Traduce cada frase en el momento en que se dice.
graph TD
subgraph "Fase de Ejecución(cada vez)"
A[Código Fuente en Python] --> B{Intérprete};
B -- "Línea 1" --> C[Ejecución];
B -- "Línea 2" --> C;
B -- "..." --> C;
end
style A fill:#ccf,stroke:#333,stroke-width:2px
- Proceso: El intérprete lee tu código fuente línea por línea. Traduce una línea, la ejecuta, traduce la siguiente, la ejecuta, y así sucesivamente.
- Ventajas: Es muy flexible y rápido para prototipar. No hay un paso de compilación largo. El mismo código puede funcionar en cualquier sistema que tenga el intérprete instalado (gran portabilidad).
- Desventajas: La ejecución es más lenta que en un lenguaje compilado, porque la traducción se hace en tiempo real cada vez que se ejecuta el programa.
- Ejemplos: Python, JavaScript, PHP, Ruby.
5.3. Lenguaje mixto o intermedio
Y entonces... llegó JAVA y dijo: "¿Por qué no tener lo mejor de ambos mundos?". Los lenguajes mixtos, como JAVA, usan una combinación de compilador e intérprete.
El Bytecode de JAVA
Este código intermedio es una de las claves del famoso lema de Java: "Write Once, Run Anywhere" (Escribe una vez, ejecuta en cualquier parte).
El proceso es el siguiente:
- Compilación: Primero, el compilador de JAVA (
javac) coge tu código fuente (.java) y lo compila, pero no a código máquina nativo, sino a un código intermedio llamado Bytecode (.class). Este bytecode es universal e independiente de la plataforma. - Interpretación/Ejecución: Luego, la Máquina Virtual de Java (JVM), que es un intérprete específico para cada sistema operativo (hay una JVM para Windows, una para Linux, etc.), coge ese bytecode y lo traduce a código máquina nativo para ejecutarlo.
graph LR
subgraph "Fase de Desarrollo (1-vez)"
A[MiPrograma.java] -- javac --> B[MiPrograma.class];
end
subgraph "Fase de Ejecución*"
subgraph "Máquina 1 (Windows)"
B --> C1[JVM para Windows];
C1 --> D1[Ejecución Nativa];
end
subgraph "Máquina 2 (Linux)"
B --> C2[JVM para Linux];
C2 --> D2[Ejecución Nativa];
end
end
style B fill:#f96,stroke:#333,stroke-width:2px
B --> |"(Bytecode)"| B
* (en cualquier máquina) Este enfoque combina la portabilidad de los lenguajes interpretados (el mismo .class funciona en todas partes) con una velocidad muy cercana a la de los lenguajes compilados, gracias a optimizaciones avanzadas de la JVM como el compilador JIT (Just-In-Time).
Ejemplo Práctico: ¡Hola Mundo en JAVA!
// Archivo: HolaMundo.java
public class HolaMundo {
public static void main(String[] args) {
// 1. El compilador (javac) convierte este archivo .java en HolaMundo.class (bytecode).
// 2. La JVM (java) ejecuta el bytecode, y esta línea imprime un mensaje en la consola.
System.out.println("¡Hola, futuro desarrollador de DAW!");
}
}
Reflexión
- Si estás desarrollando un videojuego AAA que necesita el máximo rendimiento gráfico, ¿qué tipo de lenguaje (compilado o interpretado) elegirías y por qué?
- Si estás creando un pequeño script para automatizar una tarea en tu ordenador, ¿qué tipo de lenguaje sería más práctico?
- Explica con tus propias palabras la ventaja del enfoque "mixto" de JAVA. ¿Por qué crees que fue una idea tan revolucionaria?
6. El Lenguaje Java
Entre las características más destacadas de Java se encuentran:
- Se trata de un lenguaje basado en la programación orientada a objetos.
- En Java, cada aplicación se desarrolla y se compila solo una vez. Los programas pueden ejecutarse en cualquier entorno sin depender de la plataforma específica, siguiendo el principio de "escribe una vez, ejecuta en cualquier lugar".
- Su amplia adaptabilidad se debe a la Máquina Virtual de Java (JVM), que actúa como una capa adicional sobre el sistema operativo real. Esto permite correr el código compilado de un programa Java en distintos entornos, sin importar la arquitectura subyacente.
- Para correr aplicaciones creadas en Java, es esencial contar con una JVM instalada en el dispositivo o sistema donde se vaya a usar.
6.1. ¿Cómo opera Java?
El mecanismo funciona de esta manera:
Primero, se genera un fichero con extensión .java, que contiene el código fuente del programa. Luego, este código se compila, resultando en un fichero con extensión .class, conocido como bytecode de Java.
Posteriormente, el bytecode de Java es procesado por la Máquina Virtual de Java, que lo transforma en código máquina a través de un compilador Just-In-Time (JIT). Finalmente, este código máquina se ejecuta directamente en el hardware del equipo.
El fichero .class con el bytecode de Java permanece idéntico en todas las plataformas. Es la JVM la responsable de traducir ese bytecode y adaptarlo al código máquina adecuado para el hardware particular (como el dispositivo o su arquitectura).
De esta forma, cada tipo de hardware recibe un código máquina personalizado.
6.2. Programar en JAVA
● ¿Qué necesitamos falta para EJECUTAR un programa creado en Java?
→ Java Runtime Environment (JRE)
→ Máquina virtual JAVA (JVM)
→ El compilador Just-In-Time (JIT)
● ¿Qué nos hace falta para CREAR un programa en Java?
→ Java Development Kit (JDK)
→ Editor de código: IntelliJ IDEA, VSCode, Eclipse...
JIT es un componente del entorno de ejecución que mejora el rendimiento de las aplicaciones Java™ compilando códigos de bytes en código de máquina nativo en tiempo de ejecución.
6.3. Primer programa - "Hola Mundo!"
- Crear una estructura de carpetas:
-
Comienza creando una carpeta principal para almacenar tu código Java, por ejemplo,
CursoJava. Dentro de esta, organiza subcarpetas por cada tema. Para este caso, crea una subcarpeta llamadaIntroduccionAJava. -
Abrir la carpeta en tu editor:
-
Usa la opción
Abrir carpeta...en tu editor de código (como Visual Studio Code) para seleccionar la carpetaIntroduccionAJava. -
Crear un nuevo archivo Java:
-
Ve al menú
Archivo > Nuevo archivopara crear un fichero nuevo. Luego, guárdalo conArchivo > Guardar como...y nómbraloHolaMundo.java. El nombre del fichero java debe coincidir con el nombre de la clase. -
Escribir el código Java:
- Copia el código Java proporcionado en el curso dentro del archivo
HolaMundo.java.
- Abrir una terminal:
-
Accede a la terminal integrada en tu editor mediante la opción
Terminal > Nueva Terminal. -
Compilar el programa:
- En la terminal, ejecuta el siguiente comando para compilar el código:
javac HolaMundo.java -
Esto generará un archivo
HolaMundo.class, que contiene el bytecode de Java. -
Ejecutar el programa:
- Para correr el programa, usa el comando:
java HolaMundo - Al ejecutarlo, verás el mensaje
Hola Mundo!en la consola.
7. Elementos de un Lenguaje de Programación
Todo lenguaje, ya sea humano o de programación, tiene un conjunto de reglas y elementos que lo componen. No puedes escribir una frase en español poniendo las palabras en cualquier orden; necesitas seguir unas reglas gramaticales. En programación, es igual. Estos son los ladrillos con los que construiremos todos nuestros programas.
- Sintaxis: Son las reglas gramaticales del lenguaje. Definen la estructura correcta de las sentencias. Por ejemplo, en JAVA, cada instrucción debe terminar con un punto y coma (
;). Si lo omites, el compilador se quejará con un error de sintaxis. - Semántica: Es el significado de las instrucciones. La sintaxis puede ser correcta, pero la semántica puede estar mal. Por ejemplo,
int x = "hola";tiene una sintaxis casi correcta, pero su semántica es un desastre: estás intentando meter un texto en una caja (variable) diseñada solo para números enteros. - Variables: Son como cajas con etiquetas donde guardamos datos. Cada caja tiene un nombre (el identificador de la variable) y solo puede contener un tipo de dato específico.
- Tipos de Datos: Definen qué tipo de información puede almacenar una variable. No es lo mismo guardar un número entero que un texto. JAVA tiene tipos de datos primitivos (los básicos) y tipos de objeto.
| Tipo Primitivo | Descripción | Ejemplo |
|---|---|---|
int |
Números enteros | 42, -100 |
double |
Números con decimales | 3.14159 |
char |
Un único carácter | 'A', '€' |
boolean |
Verdadero o falso | true, false |
String (Objeto) |
Secuencia de caracteres | "Hola Mundo" |
- Operadores: Son símbolos que realizan operaciones sobre las variables y los valores.
- Aritméticos:
+(suma),-(resta),*(multiplicación),/(división). - De comparación:
==(igual a),!=(distinto de),<(menor que),>(mayor que). - Lógicos:
&&(Y lógico),||(O lógico),!(NO lógico).
- Aritméticos:
- Control de Flujo: Son las estructuras que nos permiten alterar el orden secuencial de ejecución. En lugar de ejecutar línea tras línea, podemos tomar decisiones o repetir acciones.
- Condicionales:
if-else,switch. Permiten ejecutar un bloque de código u otro dependiendo de si una condición es verdadera o falsa. - Bucles:
for,while,do-while. Permiten repetir un bloque de código múltiples veces.
- Condicionales:
- Funciones/Métodos: Son bloques de código reutilizables que realizan una tarea específica. En lugar de escribir el mismo código una y otra vez, lo encapsulas en un método y lo llamas cuando lo necesitas.
- Comentarios: Son notas que dejamos en el código para nosotros o para otros programadores. El traductor (compilador o intérprete) los ignora por completo. Son vitales para mantener el código legible.
Ejemplo Práctico: Elementos en Acción
// Archivo: CalculadoraSimple.java
/**
* Esto es un comentario de bloque.
* Este programa demuestra varios elementos básicos de JAVA.
*/
public class CalculadoraSimple {
public static void main(String[] args) {
// Declaración de variables con sus tipos de datos
int numeroA = 10; // Un número entero
int numeroB = 5;
String operacion = "suma";
// Estructura de control de flujo: condicional if-else
if (operacion.equals("suma")) {
// Operador aritmético +
int resultado = numeroA + numeroB;
System.out.println("El resultado de la suma es: " + resultado);
} else {
System.out.println("Operación no reconocida.");
}
// Bucle 'for' para mostrar una cuenta
for (int i = 1; i <= 3; i++) {
System.out.println("Contando... " + i);
}
}
}
Reflexión
- En el código anterior, identifica un ejemplo de: variable, tipo de dato, operador, control de flujo y comentario.
- ¿Qué pasaría si en la línea
int numeroA = 10;olvidamos el punto y coma final? ¿Sería un error de sintaxis o de semántica? - ¿Y si intentáramos hacer
int resultado = numeroA / 0;? El programa compilaría (la sintaxis es correcta), pero fallaría al ejecutarse. ¿Qué tipo de error es este? - ¿Por qué crees que es importante que las variables tengan un tipo de dato definido? ¿Qué problemas podría causar si una misma variable pudiera contener un número, luego un texto y luego un valor booleano?
Aplicación en el Mundo Real
Entender estos conceptos fundamentales no es un ejercicio académico; es la base sobre la que se construyen todas las aplicaciones que usas cada día.
- Algoritmos en Redes Sociales: El feed de TikTok o Instagram no es aleatorio. Un complejo algoritmo analiza tus "me gusta", el tiempo que pasas viendo cada vídeo, a quién sigues, etc., para decidir qué mostrarte a continuación. El programa es la app de TikTok/Instagram que implementa ese algoritmo.
- Paradigmas en el Desarrollo de Videojuegos: Los grandes motores de videojuegos como Unity o Unreal Engine utilizan masivamente la Programación Orientada a Objetos (POO). Un "enemigo" es un objeto con atributos (vida, velocidad, daño) y métodos (atacar(), moverse(), morir()). Cada enemigo en la pantalla es una "instancia" de ese objeto.
- Compiladores e Intérpretes en la Web: Cuando navegas por una página web, tu navegador (Chrome, Firefox) actúa como un intérprete de JavaScript. Ejecuta el código JS que la página descarga línea por línea para hacerla interactiva. Por otro lado, el backend de esa web (la parte que se ejecuta en el servidor), si está hecho en JAVA, fue compilado a bytecode para un rendimiento óptimo.
Comprender esta base te permite no solo escribir código, sino entender por qué ciertas tecnologías se eligen para ciertos trabajos y cómo encajan todas las piezas del puzzle del desarrollo de software.
Para Saber Más
Para seguir profundizando en estos conceptos, aquí tienes algunos recursos de alta calidad:
- Roadmap.sh - Computer Science: Un mapa interactivo y muy visual sobre todos los conceptos fundamentales de la informática, desde algoritmos hasta sistemas operativos. Ideal para tener una visión global.
- CS50's Introduction to Computer Science (Harvard University): Uno de los mejores cursos de introducción a la programación del mundo, disponible gratis en YouTube. Los primeros vídeos explican estos conceptos con una claridad magistral. (Está en inglés, pero tiene subtítulos de alta calidad).
- PSeInt - Documentación y Ejemplos: La herramienta que usaremos para pseudocódigo. Su página de documentación tiene muchísimos ejemplos para practicar la lógica de los algoritmos antes de saltar a un lenguaje formal como JAVA.






