Este temario no se imprime
El temario de LaPlazaFija se estudia en la web, sección a sección, con tu progreso al lado. Si quieres practicar en papel, usa el cuadernillo de Simulacros oficiales: está hecho para imprimirse, con el formato del examen real.
E15
Lenguajes: C/C++, Java, Python
DES
Cuatro lenguajes comparados: C y su gestión manual de memoria, C++ y la POO, Java y su máquina virtual, y Python, con la sintaxis que suele caer.
En este tema · 10 secciones
- Objetivos
- Sección 1 · Panorama comparativo
- Sección 2 · C
- Sección 3 · C++
- Sección 4 · Java
- Sección 5 · Python
- Errores frecuentes
- Resumen exprés
- Esquema de repaso
- Mapa mental del tema
Objetivos
Al terminar este tema sabrás: (1) comparar C, C++, Java y Python (paradigma, tipado, compilación, gestión de memoria, usos); (2) leer código C (punteros, memoria manual); (3) reconocer C++ (OO sobre C, STL); (4) manejar Java (JVM, colecciones, recolección de basura); y (5) escribir Python (tipado dinámico, listas/diccionarios). Además, dominar los conceptos comunes (estructuras de control, funciones, recursividad, complejidad) que el práctico pregunta con fragmentos de código.
⚠ Cae en examen. E15 tiene poco peso en el teórico pero 4 preguntas del práctico con fragmentos de código a interpretar (predecir la salida, detectar el error, elegir la sintaxis correcta). Memorístico en las diferencias entre lenguajes; de razonamiento al leer código.
Sección 1 · Panorama comparativo
| C | C++ | Java | Python | |
|---|---|---|---|---|
| Año / autor | 1972, Ritchie | 1985, Stroustrup | 1995, Sun Microsystems (Oracle, propietario posterior) | 1991, van Rossum |
| Paradigma | Estructurado | Multiparadigma (OO) | Orientado a objetos | Multiparadigma |
| Tipado | Estático, débil | Estático | Estático, fuerte | Dinámico, fuerte |
| Ejecución | Compilado a nativo | Compilado a nativo | Bytecode → JVM | Interpretado |
| Memoria | Manual (malloc/free) | Manual + RAII/smart pointers | Automática (GC) | Automática (GC) |
| Usos típicos | Sistemas, embebido, kernels | Sistemas, juegos, alto rendimiento | Empresarial, Android, web | Scripting, datos, IA, web |
El modelo de ejecución de cada lenguaje se resume en este esquema:
Conceptos comunes a todos (los que caen en el práctico):
- Estructuras de control: secuencia, selección (
if/else,switch), iteración (for,while,do-while). - Funciones: parámetros por valor vs por referencia; recursividad.
- Operadores: aritméticos (como el módulo
%, el resto de la división, que sirve para comprobar si un número es par o impar: en Python,if num % 2 == 0:es verdadero cuandonumes par; la división entera es7 // 2 = 3, mientras que7 / 2 = 3.5; en C,7 / 2entre enteros ya da3. Con negativos difieren:-7 // 2en Python da-4(redondea hacia menos infinito) y-7 / 2en C da-3(trunca hacia 0)), relacionales, lógicos (&&,||,!en C, C++ y Java;and,or,noten Python), asignación. - Paso por valor y por referencia: por valor, la función recibe una copia y no puede cambiar el original (en C,
void inc(int x) { x = x + 1; }deja intacta la variable del que llama); por referencia (en C++ existe la referencia real,void inc(int &x) { x = x + 1; }), la función modifica el original. Rigurosamente, C solo tiene paso por valor: lo que se copia es el valor de un puntero (void inc(int *p) { *p = *p + 1; }y se llamainc(&a)), y por eso se puede modificar el dato apuntado, pero no el puntero del que llama. Java copia el valor de la referencia y Python pasa «por asignación»: con listas oArrayList,lista.append(4)dentro de la función cambia la lista del que llama, pero reasignarlista = [0]solo cambia la variable local. Unswapque intercambia solo copias falla en C; funciona con punteros o con referencias de C++. - Bucles y acumuladores (qué cae en el práctico): se traza con una tabla de valores. En Python,
range(5)produce 0, 1, 2, 3, 4 (el final no se incluye) yrange(1, 6), de 1 a 5.
total = 0
for i in range(1, 6):
if i % 2 == 1: # solo los impares
total += i # acumulador
print(total) # 1 + 3 + 5 = 9
- Complejidad (Big-O): O(1), O(log n), O(n), O(n log n), O(n²) — la eficiencia de un algoritmo. Se mide sobre un tipo de operación y el tamaño de la entrada
n, y distingue casos (mejor, medio y peor): por ejemplo, la búsqueda lineal es O(n) en el peor caso, y la binaria, O(log n) sobre datos ordenados. - Lambdas en Java: una lambda (
x -> x * 2) es una función anónima que implementa una interfaz funcional (con un único método abstracto, comoRunnableoFunction); permite pasar comportamiento como argumento, p. ej.lista.forEach(x -> System.out.println(x));. - Recursión: debe alcanzar siempre el caso base; no basta con declararlo, hay que validar el dominio (el factorial de un negativo nunca lo alcanza) y vigilar el desbordamiento (el factorial en C con
intdesborda a partir de 13!).
⚠ Cae en examen. C compilado y memoria manual; Java bytecode + GC; Python interpretado y tipado dinámico. Estructuras de control comunes. En el práctico, predecir la salida de un bucle o una recursión.
Bibliotecas estáticas y dinámicas
- Biblioteca estática (
.lib,.a): su código se copia dentro del ejecutable al enlazar; el programa es más grande y, para actualizar la biblioteca, hay que reenlazar (no necesariamente recompilar todo); no hace autónomo a cualquier ejecutable, y solo se copia lo que se usa. - Biblioteca dinámica (DLL en Windows,
.soen Linux,.dyliben macOS): el código se carga en tiempo de ejecución y se comparte entre programas. Ventajas del enlazado dinámico: menos memoria y disco (una copia para todos), arquitectura modular, instalación y actualización más sencillas (basta cambiar la biblioteca, sin recompilar los programas que la usan, siempre que se mantenga la compatibilidad ABI/de versión). Las bibliotecas dinámicas comparten el código, no necesariamente todos los datos entre procesos.
Código nativo en Android: NDK y JNI
El Android NDK (Native Development Kit) es un conjunto de herramientas para implementar partes de una aplicación Android en C y C++. Genera bibliotecas binarias para cada arquitectura de procesador que la parte Java o Kotlin invoca mediante JNI (Java Native Interface; es la vía habitual, no la única: también hay aplicaciones totalmente nativas). El código Java de Android no se ejecuta en la misma JVM de escritorio sino en ART (formato DEX). Se recomienda para código intensivo en cálculo (juegos, procesamiento de imagen o audio) y permite reutilizar código y bibliotecas de terceros en C/C++.
Otros lenguajes que han caído en examen
- Swift: creado por Apple (2014) y de código abierto (licencia Apache 2.0); sustituye a Objective-C en iOS y macOS, pero no es exclusivo de iOS: se usa también en macOS, watchOS, tvOS y en servidores. Tipos básicos:
String,Int,Double,Bool. - F#: lenguaje funcional de la plataforma .NET (con rasgos imperativos y orientados a objetos).
letenlaza un nombre a un valor o a una función (los valores son inmutables por defecto;let mutablepara variables mutables); los comentarios de varias líneas son(* … *)y los de línea//. - Perl, Ruby, Lua y Python son lenguajes de script (interpretados): Perl (texto y administración), Ruby (Ruby on Rails) y Lua (ligero, embebido en juegos). Java y C++ no se consideran de script, y HTML es de marcado.
Sigue leyendo cuando abramos
Apúntate a la lista de espera y te avisamos en cuanto abramos: podrás leer los temas de muestra completos, guardar tu progreso y entrenar con tests del formato real. Te quedan 8 secciones de este tema por delante.