TEI – Tema 18. Lenguajes de programación. Características. Fundamentos. Traductores, compiladores, ensambladores e intérpretes. Estado del arte de las técnicas, herramientas y entornos de desarrollo: entornos visuales, JAVA, .NET, Python, lenguajes de scripting

Técnico/a Especialista Informática Servicio Andaluz de Salud JUNTA DE ANDALUCÍA
Tema 18 – Lenguajes de Programación | Oposición TFA-STI SAS

📚 TEMA 18

Lenguajes de Programación: Fundamentos, Características y Tecnologías Actuales

Oposición Técnico/a Especialista en Informática | Servicio Andaluz de Salud

👨‍🏫 Preparado por: Esteban Castro
Preparador de Oposiciones TFA-STI SAS | 15+ años de experiencia
«Cada línea de código que entiendes te acerca un paso más a tu plaza»

🎯 1. Introducción y Relevancia del Tema

Mira, este tema es de los que me encantan porque es puro núcleo duro de informática, ¿verdad? No hay medias tintas aquí. O sabes cómo funciona un compilador, o no lo sabes. Y te aseguro que en el examen van a ir a por ti con preguntas técnicas de las buenas.

¿Por qué es tan importante este tema para tu futuro en el SAS? Pues verás, en el Servicio Andaluz de Salud no solo usamos lenguajes de programación… ¡vivimos rodeados de ellos! Diraya está desarrollado en Java, muchos de nuestros scripts de automatización están en Python, las aplicaciones web usan JavaScript masivamente, y cuando tengas que integrar sistemas heterogéneos (que créeme, será a menudo), necesitarás entender perfectamente qué lenguaje usar y por qué.

💡 Perla de Examen: Las preguntas sobre JVM (Java Virtual Machine), la diferencia entre compilación e interpretación, y las características de Python son FIJAS en prácticamente todos los exámenes. He visto al menos 2-3 preguntas sobre esto en cada convocatoria de los últimos 5 años.

1.1. Relevancia para el Técnico Especialista en Informática del SAS

En tu día a día como TFA-STI del SAS, te vas a encontrar con situaciones como estas:

Escenario Real 1: Integración de Sistemas – Llega un nuevo sistema de gestión de citas que está desarrollado en .NET, y necesitas integrarlo con Diraya (Java). Tienes que entender las diferencias entre la plataforma .NET y la JVM, cómo se comunican, qué formato de datos usar (XML, JSON), y las limitaciones de cada entorno.

Escenario Real 2: Automatización de Procesos – El Jefe de Servicio te pide que automatices la generación de informes mensuales de actividad asistencial. Podrías hacerlo en Python (interpretado, rápido de desarrollar, excelente para scripts), en PowerShell (si es Windows), o incluso en Bash. Tienes que elegir el lenguaje adecuado y justificar tu decisión.

Escenario Real 3: Desarrollo de Microservicios – Estás participando en la evolución de Diraya hacia una arquitectura de microservicios. Algunos servicios se desarrollan en Java (Spring Boot), otros en Python (Flask/Django), y el frontend en JavaScript (Angular/React). Necesitas entender perfectamente cómo se compilan, ejecutan y despliegan estos lenguajes.

1.2. Importancia en la Oposición

Este tema es de los que tienen un peso específico alto en el examen. Te van a preguntar tanto conceptos teóricos puros (¿qué es un compilador?, ¿diferencias con un intérprete?) como aplicaciones prácticas (¿qué lenguaje usarías para X?, ¿cómo funciona la JVM?).

📊 Estadística de Exámenes Anteriores:
• Pregunta sobre JVM y Java: 85% de probabilidad
• Pregunta sobre Python (tipado dinámico, interpretado): 75%
• Pregunta sobre compiladores vs intérpretes: 70%
• Pregunta sobre lenguajes de scripting: 60%
• Pregunta sobre POO (Programación Orientada a Objetos): 80%

1.3. Esquema del Tema

Vamos a abordar este tema con la siguiente estructura lógica:

Parte 1: Fundamentos – Qué es un lenguaje de programación, paradigmas, niveles de abstracción.

Parte 2: Traductores – Compiladores, intérpretes, ensambladores, preprocesadores. Aquí es donde más preguntas caen.

Parte 3: Estado del Arte – Java, .NET, Python, lenguajes de scripting. Aplicaciones en el SAS.

Parte 4: Entornos de Desarrollo – IDEs, herramientas, Git.

🔧 2. Lenguajes de Programación: Conceptos Fundamentales

2.1. Definición y Características

Un lenguaje de programación es, en esencia, un sistema de comunicación entre el ser humano y la máquina. Pero ojo, no es una comunicación cualquiera, es una comunicación formal, con reglas sintácticas y semánticas muy estrictas.

Piensa en ello como un idioma, pero mucho más riguroso que el español o el inglés. Si en español puedes decir «voy a la tienda» o «a la tienda voy» y ambas son correctas, en un lenguaje de programación el orden importa, cada símbolo importa, cada espacio puede importar (¡Python, te estoy mirando a ti!).

2.1.1. Características Fundamentales

Característica Descripción Ejemplo Práctico SAS
Sintaxis Conjunto de reglas que definen la estructura válida del código En Java: if (condición) { ... }
En Python: if condición:
Semántica Significado de las construcciones sintácticas Un bucle while siempre ejecuta mientras la condición sea verdadera
Expresividad Capacidad de expresar conceptos de forma natural Python permite: pacientes = [p for p in lista if p.edad > 65]
Abstracción Nivel de alejamiento del hardware Ensamblador (bajo nivel) vs Python (alto nivel)
Portabilidad Capacidad de ejecutarse en diferentes plataformas Java: «Write Once, Run Anywhere» (WORA) gracias a la JVM

2.2. Clasificación de Lenguajes de Programación

2.2.1. Por Nivel de Abstracción

Lenguajes de Bajo Nivel – Están muy próximos al hardware. El ejemplo clásico es el ensamblador (Assembly). Cada instrucción se traduce casi directamente a una instrucción del procesador. Ventaja: máximo control y eficiencia. Desventaja: complejidad brutal, dependiente de la arquitectura del procesador.

; Ejemplo de código Ensamblador (x86) MOV AX, 5 ; Mueve el valor 5 al registro AX ADD AX, 3 ; Suma 3 al registro AX MOV resultado, AX ; Guarda el resultado en memoria

Lenguajes de Nivel Medio – Como C o C++. Ofrecen un equilibrio entre control del hardware (punteros, gestión manual de memoria) y abstracción (funciones, estructuras). Son los lenguajes preferidos para desarrollar sistemas operativos, drivers, y software de alto rendimiento.

// Ejemplo en C int suma(int a, int b) { return a + b; } int main() { int resultado = suma(5, 3); printf(«Resultado: %d\n», resultado); return 0; }

Lenguajes de Alto Nivel – Como Java, Python, C#, JavaScript. Están muy alejados del hardware y muy cerca del lenguaje humano. Ofrecen gestión automática de memoria (garbage collection), abstracción de tipos de datos complejos, y portabilidad.

# Ejemplo en Python – mucho más expresivo def calcular_media_edad(pacientes): «»»Calcula la edad media de una lista de pacientes»»» return sum(p.edad for p in pacientes) / len(pacientes) # Uso edad_media = calcular_media_edad(lista_pacientes) print(f»Edad media: {edad_media:.1f} años»)

2.2.2. Por Paradigma de Programación

Esto es importante porque en el examen suelen preguntar sobre paradigmas, especialmente sobre Programación Orientada a Objetos (POO).

Programación Imperativa – El código es una secuencia de instrucciones que modifican el estado del programa. Es el paradigma más tradicional y natural.

// Ejemplo imperativo en Java int[] numeros = {1, 2, 3, 4, 5}; int suma = 0; for (int i = 0; i < numeros.length; i++) { suma += numeros[i]; } System.out.println("Suma: " + suma);

Programación Declarativa – El código describe QUÉ se quiere obtener, no CÓMO obtenerlo. SQL es el ejemplo clásico.

— Ejemplo declarativo en SQL SELECT AVG(edad) as edad_media FROM pacientes WHERE provincia = ‘Córdoba’;

Programación Orientada a Objetos (POO) – El código se organiza en objetos que encapsulan datos (atributos) y comportamiento (métodos). Java, C#, Python, Ruby son lenguajes orientados a objetos.

🎓 Conceptos Clave de POO (Pregunta SEGURA en Examen):
Encapsulación: Ocultar detalles internos, exponer solo interfaz pública
Herencia: Una clase «hija» adquiere propiedades de clase «padre»
Polimorfismo: Usar objetos de diferentes tipos con una interfaz común
Abstracción: Simplificar realidad compleja mediante modelos
// Ejemplo POO en Java – Sistema de citas SAS public class Paciente { private String cip; // Encapsulación: atributos privados private String nombre; private int edad; // Constructor public Paciente(String cip, String nombre, int edad) { this.cip = cip; this.nombre = nombre; this.edad = edad; } // Métodos públicos (interfaz) public boolean esMayorEdad() { return edad >= 18; } public String getCip() { return cip; } } // Herencia public class PacienteCronico extends Paciente { private String[] patologias; public PacienteCronico(String cip, String nombre, int edad, String[] patologias) { super(cip, nombre, edad); // Llama al constructor padre this.patologias = patologias; } }

Programación Funcional – El código se basa en funciones matemáticas puras, sin efectos secundarios. Haskell es puramente funcional, pero Python y JavaScript soportan programación funcional.

# Ejemplo funcional en Python from functools import reduce numeros = [1, 2, 3, 4, 5] # Usar funciones de orden superior suma = reduce(lambda x, y: x + y, numeros) cuadrados = list(map(lambda x: x**2, numeros)) pares = list(filter(lambda x: x % 2 == 0, numeros))

2.2.3. Por Tipado

El tipado determina cómo se gestionan los tipos de datos en el lenguaje. Esta es otra área de preguntas frecuentes.

Tipo de Tipado Descripción Lenguajes Ejemplo
Tipado Estático Los tipos se verifican en tiempo de compilación Java, C, C# int edad = 30; (tipo explícito)
Tipado Dinámico Los tipos se verifican en tiempo de ejecución Python, JavaScript, Ruby edad = 30 (tipo inferido)
Tipado Fuerte No permite operaciones entre tipos incompatibles Python, Java Python: "3" + 5 → Error
Tipado Débil Permite conversiones implícitas entre tipos JavaScript, PHP JS: "3" + 5 → «35»
⚠️ Error Común en Examen: Confundir tipado estático/dinámico con tipado fuerte/débil. Son conceptos ortogonales:
• Python es dinámico y fuerte
• Java es estático y fuerte
• JavaScript es dinámico y débil
• C es estático y débil

⚙️ 3. Traductores de Lenguajes: Compiladores, Intérpretes y Ensambladores

Aquí viene la parte que MÁS cae en examen. He visto este tema en prácticamente todas las convocatoriones desde 2015. Así que, respira hondo y vamos a dejarlo cristalino.

3.1. El Problema de la Traducción

Verás, los procesadores (CPU) solo entienden un lenguaje: código máquina binario. Es decir, secuencias de 0s y 1s que representan instrucciones muy básicas (suma dos números, mueve datos de un sitio a otro, salta a otra instrucción si se cumple una condición, etc.).

Pero nosotros, los humanos, no queremos programar en binario. Queremos escribir código legible, expresivo, mantenible. Por eso necesitamos «traductores» que conviertan nuestro código de alto nivel a código máquina que el procesador pueda ejecutar.

3.2. Compiladores

Un compilador es un programa que traduce TODO el código fuente de un lenguaje de alto nivel (como C, C++, Go) a código máquina ANTES de ejecutarlo. El proceso completo ocurre en varias fases.

3.2.1. Fases de la Compilación

┌─────────────────────────────────────────────────────────────────┐ │ PROCESO DE COMPILACIÓN │ └─────────────────────────────────────────────────────────────────┘ [Código Fuente] → ejemplo.c ↓ ┌──────────────────────┐ │ 1. ANÁLISIS LÉXICO │ → Convierte texto en tokens └──────────────────────┘ (palabras clave, identificadores, operadores) ↓ ┌──────────────────────┐ │ 2. ANÁLISIS SINTÁCTICO│ → Construye árbol sintáctico (AST) └──────────────────────┘ Verifica gramática del lenguaje ↓ ┌──────────────────────┐ │ 3. ANÁLISIS SEMÁNTICO│ → Verifica coherencia de tipos └──────────────────────┘ Verifica declaraciones de variables ↓ ┌──────────────────────┐ │ 4. OPTIMIZACIÓN │ → Mejora el código (elimina redundancias) └──────────────────────┘ Optimiza bucles, constantes, etc. ↓ ┌──────────────────────┐ │ 5. GENERACIÓN CÓDIGO │ → Produce código máquina └──────────────────────┘ ↓ [Ejecutable Binario] → ejemplo.exe (Windows) / ejemplo (Linux)

3.2.2. Características de los Compiladores

Ventajas Desventajas
Mayor velocidad de ejecución – El código ya está traducido a máquina Proceso de compilación lento – Hay que compilar antes de probar
Detección temprana de errores – Muchos errores se detectan en compilación Menos portabilidad – El ejecutable es específico de la plataforma
Optimización del código – El compilador puede optimizar agresivamente Ciclo de desarrollo más lento – Codificar → Compilar → Probar → Repetir
No necesita el código fuente para ejecutarse – Distribuyes solo el binario Dificulta la depuración – El código máquina es ilegible
# Ejemplo de compilación en C # 1. Escribes el código fuente $ cat suma.c #include <stdio.h> int main() { int a = 5, b = 3; printf(«Suma: %d\n», a + b); return 0; } # 2. Compilas con GCC $ gcc suma.c -o suma # Este comando genera el ejecutable «suma» # 3. Ejecutas el binario $ ./suma Suma: 8 # El archivo «suma» es código máquina puro, específico de tu procesador
💡 Pregunta Típica de Examen: «¿Qué se ejecuta más rápidamente, un programa compilado o interpretado?»
Respuesta: El compilado, porque ya está traducido completamente a código máquina antes de ejecutarse. El interpretado debe traducir cada instrucción durante la ejecución.

3.3. Intérpretes

Un intérprete es un programa que traduce y ejecuta el código fuente LÍNEA A LÍNEA, instrucción por instrucción, en tiempo de ejecución. No genera un ejecutable independiente.

3.3.1. Funcionamiento de un Intérprete

┌─────────────────────────────────────────────────────────────────┐ │ PROCESO DE INTERPRETACIÓN │ └─────────────────────────────────────────────────────────────────┘ [Código Fuente Python] ↓ ┌──────────────────────┐ │ INTÉRPRETE PYTHON │ │ │ │ 1. Lee línea 1 │ ──→ Traduce ──→ Ejecuta ──→ Resultado 1 │ 2. Lee línea 2 │ ──→ Traduce ──→ Ejecuta ──→ Resultado 2 │ 3. Lee línea 3 │ ──→ Traduce ──→ Ejecuta ──→ Resultado 3 │ … │ └──────────────────────┘ ↓ [Salida del Programa] NO se genera un ejecutable independiente

3.3.2. Características de los Intérpretes

Ventajas Desventajas
Desarrollo rápido – No hay fase de compilación Ejecución más lenta – Traduce en tiempo real
Mayor portabilidad – El mismo código fuente funciona en cualquier plataforma con intérprete Necesita el intérprete instalado – No puedes distribuir solo el código
Depuración más sencilla – Puedes ver el código fuente original Errores en tiempo de ejecución – Un error en línea 1000 no se detecta hasta llegar ahí
Ciclo de desarrollo ágil – Modificas y pruebas inmediatamente Mayor consumo de memoria – El intérprete debe estar en memoria
# Ejemplo de interpretación en Python # 1. Escribes el código $ cat suma.py a = 5 b = 3 print(f»Suma: {a + b}») # 2. Lo ejecutas DIRECTAMENTE con el intérprete $ python suma.py Suma: 8 # NO se genera ningún ejecutable binario # Python traduce y ejecuta cada línea al vuelo

Lenguajes Interpretados Comunes: Python, JavaScript, Ruby, PHP, Perl, Bash

3.4. Ensambladores

Un ensamblador es un tipo especial de traductor que convierte código en lenguaje ensamblador (Assembly) a código máquina. Es el traductor más simple porque hay una correspondencia casi 1:1 entre instrucciones en ensamblador e instrucciones en código máquina.

; Código Ensamblador (x86 – Intel syntax) section .data mensaje db ‘Hola SAS’, 0Ah section .text global _start _start: ; Escribir mensaje en pantalla (syscall write) mov eax, 4 ; syscall número 4 (sys_write) mov ebx, 1 ; file descriptor 1 (stdout) mov ecx, mensaje ; dirección del mensaje mov edx, 9 ; longitud del mensaje int 80h ; llamada al sistema ; Salir del programa mov eax, 1 ; syscall número 1 (sys_exit) xor ebx, ebx ; código de salida 0 int 80h ; El ensamblador convierte esto a código máquina binario

Hoy en día, casi nadie programa directamente en ensamblador, salvo para casos muy específicos: drivers de bajo nivel, optimizaciones críticas de rendimiento, malware (los investigadores de seguridad lo analizan), o programación de sistemas embebidos.

3.5. Soluciones Híbridas: Bytecode y Máquinas Virtuales

Aquí es donde Java entra en juego, y créeme que esto ES PREGUNTA FIJA en el examen del SAS.

3.5.1. Java y la JVM (Java Virtual Machine)

Java usa un enfoque híbrido genial que combina lo mejor de compilación e interpretación.

┌─────────────────────────────────────────────────────────────────┐ │ PROCESO DE COMPILACIÓN Y EJECUCIÓN EN JAVA │ └─────────────────────────────────────────────────────────────────┘ [Código Fuente Java] → MiPrograma.java ↓ ┌──────────────────────┐ │ COMPILADOR JAVAC │ Compila a BYTECODE (no a código máquina) └──────────────────────┘ ↓ [Archivo .class] → MiPrograma.class (BYTECODE) ↓ ┌──────────────────────────────────────────────────────────────┐ │ JAVA VIRTUAL MACHINE (JVM) │ │ │ │ El BYTECODE es interpretado/compilado JIT por la JVM │ │ La JVM traduce BYTECODE → Código Máquina específico │ │ │ │ ✅ Windows → JVM para Windows → Ejecuta el .class │ │ ✅ Linux → JVM para Linux → Ejecuta el .class │ │ ✅ MacOS → JVM para MacOS → Ejecuta el .class │ └──────────────────────────────────────────────────────────────┘ ↓ [Ejecución del Programa] 🎯 Write Once, Run Anywhere (WORA) El mismo archivo .class funciona en cualquier plataforma con JVM
🎓 Pregunta SEGURA de Examen: «¿Qué es la JVM (Java Virtual Machine)?»

Respuesta Correcta: La JVM es un entorno de ejecución que convierte el código BYTECODE de Java (.class) en instrucciones que el hardware puede interpretar. Actúa como una capa de abstracción entre el bytecode y el sistema operativo/hardware, permitiendo que el mismo código Java se ejecute en cualquier plataforma que tenga una JVM instalada.

❌ NO ES:
• El compilador que convierte .java a .class (eso es javac)
• La biblioteca de clases de Java (eso es la Java API)
• Un sistema operativo específico para Java
// Ejemplo completo en Java // 1. Código fuente: HolaSAS.java public class HolaSAS { public static void main(String[] args) { System.out.println(«Hola desde el SAS»); } } // 2. Compilación $ javac HolaSAS.java # Genera: HolaSAS.class (bytecode) // 3. Ejecución $ java HolaSAS Hola desde el SAS // La JVM interpreta el bytecode y lo ejecuta

3.5.2. Compilación JIT (Just-In-Time)

La JVM moderna no solo interpreta el bytecode, sino que usa una técnica llamada compilación JIT. Durante la ejecución, identifica las partes del código que se ejecutan frecuentemente (hot spots) y las compila a código máquina nativo. Así obtienes lo mejor de ambos mundos: portabilidad del bytecode y velocidad del código nativo.

3.5.3. Python y el Bytecode

Python también usa bytecode, aunque de forma más transparente.

# Cuando ejecutas un script Python $ python mi_script.py # Internamente: # 1. Python compila mi_script.py a bytecode (.pyc) # 2. El intérprete Python ejecuta el bytecode # 3. Los archivos .pyc se guardan en __pycache__/ # Puedes verlo: $ python -m py_compile mi_script.py # Genera __pycache__/mi_script.cpython-39.pyc

3.6. Preprocesadores

Un preprocesador realiza transformaciones textuales en el código ANTES de que se compile. El ejemplo clásico es el preprocesador de C.

// Ejemplo de preprocesador en C #include <stdio.h> // Incluye el archivo de cabecera stdio.h #define MAX_PACIENTES 1000 // Define una constante #ifdef DEBUG #define LOG(msg) printf(«DEBUG: %s\n», msg) #else #define LOG(msg) // En producción, los logs no hacen nada #endif int main() { LOG(«Iniciando sistema»); int pacientes[MAX_PACIENTES]; // … return 0; } // El preprocesador: // 1. Reemplaza #include con el contenido del archivo // 2. Reemplaza MAX_PACIENTES con 1000 en todo el código // 3. Evalúa las directivas #ifdef, #else, #endif // 4. El código resultante es lo que ve el compilador

3.7. Cuadro Comparativo: Compilación vs Interpretación

Aspecto Compilación Interpretación Híbrido (Java)
Velocidad de Ejecución ⭐⭐⭐⭐⭐ Muy rápida ⭐⭐ Más lenta ⭐⭐⭐⭐ Rápida (con JIT)
Velocidad de Desarrollo ⭐⭐ Lenta (compilar cada cambio) ⭐⭐⭐⭐⭐ Muy rápida ⭐⭐⭐ Media
Portabilidad ⭐⭐ Baja (binario específico) ⭐⭐⭐⭐⭐ Alta (mismo código) ⭐⭐⭐⭐⭐ Alta (WORA)
Detección de Errores ⭐⭐⭐⭐⭐ Temprana ⭐⭐ Tardía (runtime) ⭐⭐⭐⭐ Media-Temprana
Uso de Memoria ⭐⭐⭐⭐ Bajo ⭐⭐⭐ Medio-Alto ⭐⭐⭐ Medio
Ejemplos C, C++, Go, Rust Python, Ruby, PHP Java, C#, Kotlin

🚀 4. Estado del Arte: Lenguajes y Tecnologías Actuales

Ahora vamos con la parte práctica y aplicada al SAS. Aquí es donde tienes que conocer los lenguajes que realmente se usan en producción.

4.1. Java: El Pilar de las Aplicaciones Empresariales del SAS

Java es EL lenguaje por excelencia en el SAS. Diraya está desarrollado en Java (con framework Spring), muchos de los sistemas corporativos usan Java EE, y es el estándar para aplicaciones empresariales robustas y escalables.

4.1.1. Características Principales de Java

1. Orientado a Objetos – Todo en Java es un objeto (excepto tipos primitivos). Soporta encapsulación, herencia, polimorfismo y abstracción.

2. Multiplataforma (WORA) – «Write Once, Run Anywhere». Gracias a la JVM, el mismo .class funciona en Windows, Linux, MacOS, Solaris…

3. Gestión Automática de Memoria – El Garbage Collector (GC) libera automáticamente la memoria de objetos no utilizados.

4. Robusto y Seguro – Fuertemente tipado, manejo de excepciones obligatorio, sin punteros directos (previene errores de memoria).

5. Multihilo – Soporte nativo para programación concurrente y paralela.

// Ejemplo de código Java en contexto SAS // Sistema de gestión de citas – Diraya simplificado public class Paciente { private String cip; private String nombre; private LocalDate fechaNacimiento; public Paciente(String cip, String nombre, LocalDate fechaNacimiento) { this.cip = cip; this.nombre = nombre; this.fechaNacimiento = fechaNacimiento; } public int getEdad() { return Period.between(fechaNacimiento, LocalDate.now()).getYears(); } public String getCip() { return cip; } } public class Cita { private Paciente paciente; private LocalDateTime fecha; private String especialidad; private EstadoCita estado; public void confirmar() { if (estado == EstadoCita.PENDIENTE) { this.estado = EstadoCita.CONFIRMADA; notificarPaciente(); } else { throw new IllegalStateException(«La cita no está en estado pendiente»); } } private void notificarPaciente() { // Enviar SMS o email al paciente System.out.println(«Notificación enviada a » + paciente.getCip()); } } enum EstadoCita { PENDIENTE, CONFIRMADA, CANCELADA, REALIZADA }

4.1.2. Ecosistema Java en el SAS

Frameworks Principales:

Spring Framework – Framework de desarrollo empresarial. Diraya lo usa extensivamente.

Spring Boot – Para microservicios. Usado en las nuevas arquitecturas del SAS.

Hibernate – ORM (Object-Relational Mapping) para persistencia de datos.

Servidores de Aplicaciones:

• Apache Tomcat – Contenedor de servlets ligero

• WildFly (antes JBoss) – Servidor de aplicaciones Java EE completo

• WebLogic – Usado en algunos sistemas legacy del SAS

4.2. Plataforma .NET y C#

Aunque Java domina en el SAS, también hay sistemas en .NET, especialmente aplicaciones Windows y herramientas de escritorio.

4.2.1. Características de .NET

1. Plataforma Completa – No es solo un lenguaje, es toda una plataforma de desarrollo que incluye lenguajes (C#, VB.NET, F#), runtime (CLR), librerías (BCL), y frameworks (ASP.NET, WPF, etc.).

2. CLR (Common Language Runtime) – Equivalente a la JVM de Java. Ejecuta código en formato IL (Intermediate Language).

3. .NET Core / .NET 5+ – Versión moderna, multiplataforma (Windows, Linux, MacOS), open source.

// Ejemplo en C# – Sistema de registro de incidencias SAS using System; using System.Collections.Generic; public class Incidencia { public string Id { get; set; } public string Titulo { get; set; } public PrioridadIncidencia Prioridad { get; set; } public DateTime FechaCreacion { get; set; } public EstadoIncidencia Estado { get; set; } public Incidencia(string titulo, PrioridadIncidencia prioridad) { Id = Guid.NewGuid().ToString(); Titulo = titulo; Prioridad = prioridad; FechaCreacion = DateTime.Now; Estado = EstadoIncidencia.Abierta; } public void Resolver() { if (Estado == EstadoIncidencia.Abierta) { Estado = EstadoIncidencia.Resuelta; Console.WriteLine($»Incidencia {Id} resuelta»); } } } public enum PrioridadIncidencia { Baja, Media, Alta, Critica } public enum EstadoIncidencia { Abierta, EnProgreso, Resuelta, Cerrada }

Comparación Java vs .NET/C#:

Aspecto Java C# / .NET
Portabilidad Excelente (JVM en todas partes) Buena (.NET Core es multiplataforma)
Ecosistema Muy maduro, muchas librerías Muy rico, excelente integración Microsoft
Curva de Aprendizaje Media Media (más fácil si vienes de Java)
Uso en SAS ⭐⭐⭐⭐⭐ Muy alto (Diraya, BPS, etc.) ⭐⭐⭐ Medio (aplicaciones Windows)
IDEs IntelliJ IDEA, Eclipse, NetBeans Visual Studio, VS Code, Rider

4.3. Python: El Lenguaje Multiusos

Python es mi lenguaje favorito para scripts, automatización, análisis de datos, IA/ML. En el SAS se usa mucho para:

• Scripts de automatización de tareas

• Procesamiento de datos y ETL

• Análisis de datos y Business Intelligence

• Desarrollo de APIs REST ligeras (Flask, FastAPI)

4.3.1. Características de Python

🎓 Pregunta SEGURA de Examen: «¿Cuál de las siguientes es una característica principal de Python?»

Respuesta Correcta: Es un lenguaje interpretado y de tipado dinámico.

Explicación:
Interpretado: Se ejecuta línea a línea sin compilación previa a ejecutable
Tipado dinámico: No declaras el tipo de las variables explícitamente
Tipado fuerte: No permite operaciones entre tipos incompatibles
# Ejemplo Python – Análisis de actividad asistencial SAS import pandas as pd from datetime import datetime, timedelta # Tipado dinámico: no declaramos el tipo pacientes_atendidos = [ {«cip»: «12345», «edad»: 45, «especialidad»: «Cardiología»}, {«cip»: «67890», «edad»: 62, «especialidad»: «Traumatología»}, {«cip»: «11111», «edad»: 38, «especialidad»: «Cardiología»} ] # Crear DataFrame (librería pandas para análisis de datos) df = pd.DataFrame(pacientes_atendidos) # Análisis: edad media por especialidad edad_media = df.groupby(‘especialidad’)[‘edad’].mean() print(edad_media) # List comprehension – muy Pythonic mayores_60 = [p for p in pacientes_atendidos if p[‘edad’] > 60] # Tipado fuerte: esto da ERROR # resultado = «3» + 5 # TypeError: can’t concatenate str and int # En JavaScript (tipado débil) esto daría «35»

4.3.2. Librerías Esenciales de Python

Para Análisis de Datos (muy usado en BI del SAS):

Pandas – Manipulación y análisis de datos tabulares

NumPy – Computación numérica, arrays multidimensionales

Matplotlib / Seaborn – Visualización de datos

Para Desarrollo Web:

Django – Framework web completo (MVC)

Flask – Microframework ligero para APIs

FastAPI – Framework moderno para APIs REST de alto rendimiento

Para IA/Machine Learning:

scikit-learn – Machine Learning clásico

TensorFlow / PyTorch – Deep Learning

4.4. Lenguajes de Scripting

Los lenguajes de scripting son ideales para automatización, tareas del sistema, y gluing (pegar sistemas). Los más importantes:

4.4.1. JavaScript

JavaScript es EL lenguaje de la web. En el SAS, todas las aplicaciones web (Diraya Web, ClicSalud+, portales corporativos) usan JavaScript masivamente en el frontend.

💡 Pregunta Típica de Examen: «El lenguaje de scripting recomendado para manipular el DOM (Document Object Model) en páginas web es:»
Respuesta: JavaScript

Por qué: JavaScript es el lenguaje estándar para programación del lado del cliente en navegadores web. Permite manipular dinámicamente el DOM, responder a eventos del usuario, y crear interfaces interactivas.
// JavaScript – Ejemplo de manipulación del DOM // Supongamos la web de citas del SAS // Seleccionar elemento del DOM const botonConfirmar = document.getElementById(‘btnConfirmarCita’); // Añadir evento click botonConfirmar.addEventListener(‘click’, function() { const citaId = document.getElementById(‘citaId’).value; // Llamada AJAX para confirmar cita (sin recargar página) fetch(`/api/citas/${citaId}/confirmar`, { method: ‘POST’, headers: { ‘Content-Type’: ‘application/json’ } }) .then(response => response.json()) .then(data => { // Actualizar interfaz dinámicamente document.getElementById(‘estadoCita’).textContent = ‘CONFIRMADA’; mostrarNotificacion(‘Cita confirmada correctamente’); }) .catch(error => { console.error(‘Error:’, error); mostrarError(‘No se pudo confirmar la cita’); }); }); // Tipado débil de JavaScript console.log(«3» + 5); // «35» (concatenación de strings) console.log(«3» – 5); // -2 (conversión a número)

Frameworks JavaScript Modernos (pregunta posible en examen):

Framework Tipo Características Uso en SAS
Angular Frontend Framework completo, TypeScript, MVC Usado en aplicaciones web corporativas
React Frontend Librería de componentes, Virtual DOM Usado en portales y SPAs modernas
Vue.js Frontend Framework progresivo, curva suave Usado en aplicaciones web ligeras
Node.js Backend JavaScript en servidor, asíncrono Usado para APIs REST, microservicios
⚠️ Pregunta Trampa: «¿Cuál de los siguientes es un framework de desarrollo frontend?»
A) ASP.NET (Backend – Microsoft)
B) Angular (✅ Frontend – Google)
C) Django (Backend – Python)
D) Spring (Backend – Java)

4.4.2. Bash Scripting

En servidores Linux del SAS (que son la mayoría), Bash es fundamental para automatización, mantenimiento, backups, y tareas administrativas.

#!/bin/bash # Script de backup de base de datos Diraya (ejemplo simplificado) # Variables FECHA=$(date +%Y%m%d_%H%M%S) BACKUP_DIR=»/backups/diraya» DB_NAME=»diraya_prod» DB_USER=»backup_user» LOG_FILE=»/var/log/backup_diraya.log» # Función para logging log() { echo «[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1» | tee -a «$LOG_FILE» } # Crear directorio de backup si no existe mkdir -p «$BACKUP_DIR» # Realizar backup log «Iniciando backup de $DB_NAME» if mysqldump -u «$DB_USER» -p «$DB_NAME» > «$BACKUP_DIR/diraya_$FECHA.sql»; then log «Backup completado: diraya_$FECHA.sql» # Comprimir gzip «$BACKUP_DIR/diraya_$FECHA.sql» log «Backup comprimido» # Eliminar backups antiguos (más de 30 días) find «$BACKUP_DIR» -name «*.sql.gz» -mtime +30 -delete log «Backups antiguos eliminados» else log «ERROR: Fallo en el backup» exit 1 fi log «Proceso finalizado correctamente»

4.4.3. PowerShell

En entornos Windows Server del SAS, PowerShell es la herramienta de automatización y administración por excelencia.

# PowerShell – Gestión de usuarios en Active Directory del SAS # Crear usuario para nuevo profesional $apellidos = «García López» $nombre = «María» $usuario = «maria.garcia» $email = «maria.garcia@juntadeandalucia.es» $unidadOrganizativa = «OU=Usuarios,OU=SAS_Córdoba,DC=sspa,DC=juntadeandalucia,DC=es» # Crear usuario en AD New-ADUser -Name «$nombre $apellidos» ` -GivenName $nombre ` -Surname $apellidos ` -SamAccountName $usuario ` -UserPrincipalName «$usuario@sspa.juntadeandalucia.es» ` -EmailAddress $email ` -Path $unidadOrganizativa ` -AccountPassword (ConvertTo-SecureString «P@ssw0rd123!» -AsPlainText -Force) ` -Enabled $true # Añadir a grupo de Diraya Add-ADGroupMember -Identity «GG_Diraya_Usuarios» -Members $usuario Write-Host «Usuario $usuario creado correctamente» -ForegroundColor Green

4.5. Otros Lenguajes Relevantes

4.5.1. SQL (Structured Query Language)

SQL no es un lenguaje de programación de propósito general, sino un lenguaje declarativo para gestión de bases de datos relacionales. Es FUNDAMENTAL en el SAS porque todos los sistemas corporativos (Diraya, BPS, GERHONTE, etc.) usan bases de datos relacionales.

— SQL – Consulta de pacientes crónicos en Diraya (ejemplo simplificado) SELECT p.cip, p.nombre, p.apellidos, p.fecha_nacimiento, TIMESTAMPDIFF(YEAR, p.fecha_nacimiento, CURDATE()) AS edad, GROUP_CONCAT(d.diagnostico SEPARATOR ‘, ‘) AS patologias FROM pacientes p INNER JOIN diagnosticos d ON p.cip = d.cip_paciente WHERE d.cronico = 1 AND p.provincia = ‘Córdoba’ GROUP BY p.cip, p.nombre, p.apellidos, p.fecha_nacimiento HAVING COUNT(d.diagnostico) >= 2 ORDER BY edad DESC LIMIT 100; — Esta consulta es DECLARATIVA: describes QUÉ quieres, no CÓMO obtenerlo — El motor de BD optimiza la ejecución automáticamente

4.5.2. Lenguajes Emergentes

Go (Golang) – Desarrollado por Google, ideal para microservicios de alto rendimiento, sistemas distribuidos. Compilado, muy rápido, concurrencia nativa. Empieza a usarse en el SAS para servicios críticos de backend.

Rust – Lenguaje de sistemas, seguridad de memoria sin garbage collector, rendimiento comparable a C/C++. Ideal para software de infraestructura crítica.

TypeScript – Superconjunto de JavaScript con tipado estático. Cada vez más usado en desarrollo web del SAS porque reduce errores y mejora mantenibilidad.

// TypeScript – Modelo de datos tipado para Diraya Web interface Paciente { cip: string; nombre: string; apellidos: string; fechaNacimiento: Date; provincia: ‘Almería’ | ‘Cádiz’ | ‘Córdoba’ | ‘Granada’ | ‘Huelva’ | ‘Jaén’ | ‘Málaga’ | ‘Sevilla’; } interface Cita { id: number; paciente: Paciente; fecha: Date; especialidad: string; estado: ‘PENDIENTE’ | ‘CONFIRMADA’ | ‘REALIZADA’ | ‘CANCELADA’; } // Función con tipos estrictos function calcularEdad(paciente: Paciente): number { const hoy = new Date(); const nacimiento = new Date(paciente.fechaNacimiento); let edad = hoy.getFullYear() – nacimiento.getFullYear(); const mes = hoy.getMonth() – nacimiento.getMonth(); if (mes < 0 || (mes === 0 && hoy.getDate() < nacimiento.getDate())) { edad--; } return edad; } // El compilador TypeScript verifica los tipos en tiempo de compilación // y genera JavaScript estándar

🛠️ 5. Entornos de Desarrollo Integrados (IDEs) y Herramientas

5.1. Entornos Visuales

Los IDEs modernos son mucho más que editores de texto. Son entornos completos que integran edición, compilación, depuración, control de versiones, y mucho más.

IDE Lenguajes Características Destacadas Uso en SAS
IntelliJ IDEA Java, Kotlin, Scala Refactoring inteligente, análisis de código ⭐⭐⭐⭐⭐ Principal para desarrollo Java
Eclipse Java, C++, PHP Open source, extensible con plugins ⭐⭐⭐⭐ Usado en proyectos legacy
Visual Studio .NET (C#, VB, F#) Integración total con ecosistema Microsoft ⭐⭐⭐ Aplicaciones Windows
VS Code Todos (con extensiones) Ligero, multiplataforma, muy extensible ⭐⭐⭐⭐⭐ Muy popular para Python, JS, etc.
PyCharm Python Excelente para desarrollo Python profesional ⭐⭐⭐⭐ Principal para Python

5.2. Control de Versiones: Git

Git es LA herramienta de control de versiones en el SAS (y en todo el mundo del desarrollo). Es fundamental que lo domines.

🎓 Pregunta SEGURA de Examen: «¿Qué comando de Git se usa para subir los cambios locales al repositorio remoto?»

Respuesta: git push

Otros comandos importantes:
git clone – Clonar repositorio remoto
git pull – Descargar y fusionar cambios remotos
git commit – Guardar cambios en historial local
git add – Añadir archivos al área de staging
git branch – Gestionar ramas
# Flujo típico de trabajo con Git en el SAS # 1. Clonar repositorio del proyecto (primera vez) $ git clone https://gitlab.sspa.es/diraya/modulo-citas.git $ cd modulo-citas # 2. Crear rama para nueva funcionalidad $ git checkout -b feature/confirmacion-sms # 3. Hacer cambios en el código $ vim src/main/java/es/juntadeandalucia/sas/citas/NotificacionService.java # 4. Ver estado de cambios $ git status On branch feature/confirmacion-sms Changes not staged for commit: modified: src/main/java/es/juntadeandalucia/sas/citas/NotificacionService.java # 5. Añadir cambios al área de staging $ git add src/main/java/es/juntadeandalucia/sas/citas/NotificacionService.java # 6. Hacer commit con mensaje descriptivo $ git commit -m «feat: añadir confirmación de citas por SMS» # 7. Subir cambios al repositorio remoto $ git push origin feature/confirmacion-sms # 8. Crear Pull Request (Merge Request) en GitLab # (se hace desde la interfaz web)

📊 6. Aplicación Práctica en el SAS

6.1. Casos de Uso Reales

Caso 1: Desarrollo de Microservicio para Integración con Receta XXI

Contexto: Necesitas desarrollar un microservicio que integre Diraya con el sistema de Receta XXI para sincronizar prescripciones.

Decisión de tecnología:

Lenguaje: Java 17 (LTS) con Spring Boot 3.0

Por qué: Ecosistema consolidado en SAS, compatibilidad con infraestructura existente, soporte a largo plazo, excelente para APIs REST

Alternativas consideradas: Python (descartado por rendimiento), Node.js (descartado por falta de experiencia del equipo), Go (descartado por curva de aprendizaje)

Caso 2: Script de Migración de Datos entre Bases de Datos

Contexto: Migrar datos históricos de pacientes desde base de datos Oracle legacy a PostgreSQL.

Decisión de tecnología:

Lenguaje: Python 3.11 con librerías cx_Oracle y psycopg2

Por qué: Rápido de desarrollar, excelente para ETL, librerías maduras para ambas BDs, fácil manejo de errores y logging

Caso 3: Interfaz Web de Consulta de Citas

Contexto: Portal web para que pacientes consulten sus citas.

Decisión de tecnología:

Frontend: Angular 15 + TypeScript

Backend: Java Spring Boot (API REST)

Por qué: Angular es el estándar en aplicaciones corporativas SAS, TypeScript mejora mantenibilidad, Spring Boot ya usado en otros sistemas

6.2. Selección de Lenguaje según Requisitos

Requisito Lenguaje Recomendado Justificación
Aplicación empresarial crítica Java, C# Robustez, escalabilidad, soporte empresarial
Script de automatización Python, Bash, PowerShell Desarrollo rápido, expresividad
Interfaz web interactiva JavaScript (React, Angular, Vue) Estándar de facto para frontend web
Análisis de datos / BI Python, R Ecosistema de librerías científicas
Microservicio de alto rendimiento Go, Rust, Java Rendimiento, concurrencia, bajo overhead
Aplicación de escritorio Windows C# (.NET WPF/WinForms) Integración nativa con Windows
Procesamiento de texto / logs Python, Perl, awk/sed Expresiones regulares, manipulación strings

🎯 7. Mapa Conceptual del Tema

LENGUAJES DE PROGRAMACIÓN | ┌───────────────────────────┼───────────────────────────┐ | | | FUNDAMENTOS TRADUCTORES ESTADO DEL ARTE | | | | | | ┌──┴──┐ ┌───┴───┐ ┌───┴───┐ | | | | | | NIVELES PARADIGMAS COMPILADORES INTÉRPRETES JAVA PYTHON | | | | | | | | | | | | Alto POO ┌────┴────┐ | ┌────┴────┐ | Medio Funcional | | | | | | Bajo Imperativo Fases de Optimización JVM Frameworks Declarativo Compilación | | | Bytecode Django | WORA Flask Código Máquina NumPy Pandas ┌──────────────────────────────────────────────────────┐ | CARACTERÍSTICAS | | | | • Sintaxis y Semántica | | • Tipado (Estático/Dinámico, Fuerte/Débil) | | • Portabilidad | | • Expresividad | | • Rendimiento | └──────────────────────────────────────────────────────┘ ┌──────────────────────────────────────────────────────┐ | APLICACIÓN EN EL SAS | | | | Diraya → Java (Spring Boot) | | Scripts → Python, Bash, PowerShell | | Frontend Web → JavaScript (Angular, React) | | APIs REST → Java, Python, Node.js | | BI/Analytics → Python (Pandas), SQL | | Integración → Java, .NET | └──────────────────────────────────────────────────────┘

📝 8. Cuestionario de Preguntas (35 Preguntas)

Aquí tienes 35 preguntas tipo test basadas en el tema Y en preguntas reales de exámenes anteriores del SAS. Practica con ellas hasta que las domines.

Pregunta 1
¿Qué es la máquina JVM en el contexto del lenguaje de programación Java?
  • A) El compilador que convierte los ficheros .java a .class (BYTECODE).
  • B) Un entorno de ejecución que convierte el código BYTECODE en instrucciones que el hardware puede interpretar.
  • C) La biblioteca de clases para desarrollar aplicaciones Java.
  • D) Un sistema operativo diseñado específicamente para ejecutar programas Java.
✅ Respuesta Correcta: B
Explicación: La JVM (Java Virtual Machine) es el entorno de ejecución que toma el bytecode generado por el compilador javac y lo interpreta/compila (JIT) a instrucciones nativas del procesador. Es la capa de abstracción que permite la portabilidad de Java («Write Once, Run Anywhere»).

Por qué las otras son incorrectas:
A) El compilador es javac, no la JVM.
C) La biblioteca de clases es la Java API, no la JVM.
D) La JVM no es un sistema operativo, sino un proceso que se ejecuta sobre un SO.
Pregunta 2
¿Cuál de las siguientes es una de las principales características de Python?
  • A) Es un lenguaje de bajo nivel.
  • B) Es un lenguaje interpretado y de tipado dinámico.
  • C) Solo permite programación orientada a objetos.
  • D) Requiere la compilación previa de código antes de ejecutarse.
✅ Respuesta Correcta: B
Explicación: Python es interpretado (ejecuta código directamente sin generar ejecutable) y de tipado dinámico (no declaras tipos explícitamente, se infieren en tiempo de ejecución). También es de tipado fuerte (no permite operaciones entre tipos incompatibles).

Por qué las otras son incorrectas:
A) Python es de alto nivel, muy alejado del hardware.
C) Python es multiparadigma: soporta POO, funcional, imperativo, etc.
D) No requiere compilación previa (aunque genera bytecode .pyc internamente).
Pregunta 3
En general, ¿qué se ejecuta más rápidamente, un programa interpretado o compilado?
  • A) El compilado porque está totalmente traducido antes de ser ejecutado.
  • B) El interpretado porque ocupa menos memoria.
  • C) Si resuelven el mismo problema, tardan lo mismo.
  • D) Ninguna de las anteriores es correcta.
✅ Respuesta Correcta: A
Explicación: Los programas compilados son más rápidos en ejecución porque ya están traducidos completamente a código máquina nativo antes de ejecutarse. Los interpretados deben traducir cada instrucción durante la ejecución, lo que añade overhead.

Matiz importante: Con técnicas modernas como JIT (Just-In-Time compilation) en Java o PyPy en Python, la diferencia se reduce, pero en general, el código compilado sigue siendo más rápido.
Pregunta 4
Un programa informático que procesa el código fuente de un proyecto de software durante su tiempo de ejecución y actúa como una interfaz entre ese proyecto y el procesador, se llama:
  • A) Compilador.
  • B) Preprocesador.
  • C) Ensamblador.
  • D) Intérprete.
✅ Respuesta Correcta: D
Explicación: Un intérprete procesa y ejecuta el código fuente DURANTE el tiempo de ejecución, línea a línea. Actúa como interfaz entre el código de alto nivel y el procesador.

Por qué las otras son incorrectas:
A) Un compilador traduce TODO el código ANTES de la ejecución, no durante.
B) Un preprocesador realiza transformaciones textuales previas a la compilación.
C) Un ensamblador traduce ensamblador a código máquina, pero no durante la ejecución.
Pregunta 5
Indique cuál de los siguientes lenguajes de programación NO es orientado a objetos:
  • A) Java.
  • B) Ruby.
  • C) Python.
  • D) C.
✅ Respuesta Correcta: D
Explicación: C es un lenguaje de programación estructurado/imperativo, NO orientado a objetos. No tiene clases, herencia, polimorfismo ni encapsulación.

Java, Ruby y Python sí son lenguajes orientados a objetos (aunque Python y Ruby también soportan otros paradigmas).

Nota: C++ sí es orientado a objetos (extensión de C con POO).
Pregunta 6
El lenguaje de scripting recomendado y usado más comúnmente para manipular el DOM (Modelo de Objetos del Documento) en páginas Web es:
  • A) JavaScript.
  • B) Python.
  • C) Ruby.
  • D) Perl.
✅ Respuesta Correcta: A
Explicación: JavaScript es EL lenguaje estándar para manipular el DOM en el navegador. Es el único lenguaje que ejecutan nativamente todos los navegadores web modernos para programación del lado del cliente.

Python, Ruby y Perl son lenguajes de servidor principalmente, no se ejecutan en el navegador (aunque existen proyectos experimentales como Brython o Pyodide).
Pregunta 7
¿Cuál de los siguientes es un framework de desarrollo front-end?
  • A) ASP.NET.
  • B) Angular.
  • C) Django.
  • D) Spring.
✅ Respuesta Correcta: B
Explicación: Angular es un framework frontend de Google basado en TypeScript para construir aplicaciones web SPA (Single Page Applications).

Por qué las otras son incorrectas:
A) ASP.NET es framework backend de Microsoft para .NET.
C) Django es framework backend de Python.
D) Spring es framework backend de Java.
Pregunta 8
En la fase de implementación es posible que tengan que instalar la máquina virtual java (JVM) para el funcionamiento del sistema final. ¿Cuál de las siguientes características describe mejor la portabilidad de las aplicaciones Java proporcionada por la JVM?
  • A) Las aplicaciones Java solo se pueden ejecutar en sistemas operativos Windows.
  • B) Las aplicaciones Java se compilan directamente en código máquina específico del sistema operativo.
  • C) Las aplicaciones Java se ejecutan en cualquier plataforma que tenga una JVM instalada.
  • D) Las aplicaciones Java requieren una recompilación completa para cada sistema operativo.
✅ Respuesta Correcta: C
Explicación: Esta es la esencia del principio «Write Once, Run Anywhere» (WORA) de Java. Compilas una vez a bytecode (.class) y ese mismo bytecode se ejecuta en cualquier plataforma (Windows, Linux, MacOS, Solaris, etc.) que tenga una JVM compatible.

Por qué las otras son incorrectas:
A) Java es multiplataforma, no solo Windows.
B) Java compila a bytecode, no a código máquina específico.
D) No requiere recompilación, el bytecode es universal.
Pregunta 9
¿Qué operador se utiliza para la concatenación de 2 cadenas de caracteres en Python?
  • A) *
  • B) +
  • C) &
  • D) .
✅ Respuesta Correcta: B
Explicación: En Python, el operador + se usa para concatenar strings.
Ejemplo: "Hola" + " " + "SAS" → «Hola SAS»

Nota: El operador * se usa para repetir strings:
"A" * 3 → «AAA»
Pregunta 10
¿Cuál de las siguientes siglas corresponden al Lenguaje de Marcado de Hipertexto?
  • A) HMTL.
  • B) HLMT.
  • C) HLTM.
  • D) HTML.
✅ Respuesta Correcta: D
Explicación: HTML = HyperText Markup Language (Lenguaje de Marcado de Hipertexto). Es el lenguaje estándar para crear páginas web. Las otras opciones son anagramas incorrectos.
Pregunta 11
En el concepto de Programación Orientada a Objetos, ¿qué principio permite que diferentes objetos de distintos tipos puedan ser tratados a través de una interfaz común?
  • A) Abstracción.
  • B) Herencia.
  • C) Polimorfismo.
  • D) Encapsulación.
✅ Respuesta Correcta: C
Explicación: El polimorfismo permite tratar objetos de diferentes clases a través de una interfaz común (superclase o interfaz). Por ejemplo, todas las clases que implementan la interfaz «Notificable» pueden recibir el método enviarNotificacion() aunque cada una lo implemente de forma diferente (SMS, email, push).

Diferencias:
Herencia: Una clase adquiere propiedades de otra.
Encapsulación: Ocultar detalles internos.
Abstracción: Simplificar la complejidad.
Pregunta 12
¿Cuál de las siguientes afirmaciones sobre tipado de lenguajes es CORRECTA?
  • A) Python es de tipado estático y débil.
  • B) JavaScript es de tipado dinámico y débil.
  • C) Java es de tipado dinámico y fuerte.
  • D) C es de tipado dinámico y fuerte.
✅ Respuesta Correcta: B
Explicación: JavaScript es de tipado dinámico (no declaras tipos) y débil (permite conversiones implícitas entre tipos). Por ejemplo: "3" + 5 → «35» (convierte número a string).

Por qué las otras son incorrectas:
A) Python es dinámico y FUERTE.
C) Java es ESTÁTICO y fuerte.
D) C es ESTÁTICO y débil.
Pregunta 13
¿Qué comando de Git se utiliza para subir los cambios locales al repositorio remoto?
  • A) git push.
  • B) git pull.
  • C) git commit.
  • D) git upload.
✅ Respuesta Correcta: A
Explicación: git push sube (push) los commits locales al repositorio remoto.

Diferencias:
git pull: Descarga y fusiona cambios desde el remoto.
git commit: Guarda cambios en el historial LOCAL.
git upload: No existe este comando en Git.
Pregunta 14
¿Cuál es la principal ventaja de usar un lenguaje interpretado como Python en lugar de uno compilado como C++?
  • A) Mayor velocidad de ejecución.
  • B) Desarrollo más rápido y ciclo de pruebas más ágil.
  • C) Mayor control sobre el hardware.
  • D) Detección de errores en tiempo de compilación.
✅ Respuesta Correcta: B
Explicación: Los lenguajes interpretados permiten un ciclo de desarrollo más rápido: modificas el código y lo ejecutas inmediatamente, sin fase de compilación. Ideal para scripts, prototipos, y desarrollo ágil.

Por qué las otras son incorrectas:
A) La velocidad de ejecución es MENOR en interpretados.
C) C++ ofrece MAYOR control sobre hardware (punteros, gestión manual de memoria).
D) La detección temprana de errores es ventaja de lenguajes COMPILADOS.
Pregunta 15
En Java, ¿qué archivo contiene el bytecode compilado?
  • A) .java
  • B) .class
  • C) .jar
  • D) .exe
✅ Respuesta Correcta: B
Explicación: El compilador javac compila archivos .java (código fuente) a archivos .class (bytecode).

Aclaraciones:
• .java → Código fuente
• .class → Bytecode compilado
• .jar → Archivo comprimido que contiene múltiples .class
• .exe → Ejecutable de Windows (Java no genera .exe directamente)
Pregunta 16
¿Cuál de las siguientes afirmaciones sobre el paradigma funcional es CORRECTA?
  • A) Se basa en la modificación de estado mediante variables mutables.
  • B) Usa funciones puras sin efectos secundarios.
  • C) Es exclusivo de lenguajes como C y C++.
  • D) No permite el uso de funciones de orden superior.
✅ Respuesta Correcta: B
Explicación: El paradigma funcional se basa en funciones puras (mismo input → mismo output) sin efectos secundarios (no modifican estado externo). Promueve inmutabilidad y composición de funciones.

Lenguajes funcionales puros: Haskell, Elm
Lenguajes que soportan programación funcional: Python, JavaScript, Scala, F#
Pregunta 17
¿Qué es un preprocesador en el contexto de lenguajes de programación?
  • A) Un programa que ejecuta código en tiempo de ejecución.
  • B) Un programa que realiza transformaciones textuales en el código antes de la compilación.
  • C) Un tipo de intérprete para lenguajes de scripting.
  • D) Un componente de la JVM que optimiza bytecode.
✅ Respuesta Correcta: B
Explicación: Un preprocesador realiza transformaciones textuales ANTES de la compilación. El ejemplo clásico es el preprocesador de C, que procesa directivas como #include, #define, #ifdef, etc.

El código resultante del preprocesador es lo que ve el compilador.
Pregunta 18
¿Cuál de los siguientes lenguajes es el más adecuado para crear una API (Application Programming Interface) que interactúe con bases de datos desde una aplicación web?
  • A) Python.
  • B) HTML.
  • C) CSS.
  • D) SQL (exclusivamente).
✅ Respuesta Correcta: A
Explicación: Python (con frameworks como Flask, Django, FastAPI) es excelente para crear APIs REST que interactúen con bases de datos. Tiene excelentes ORMs (SQLAlchemy, Django ORM) y librerías para conectarse a BDs.

Por qué las otras son incorrectas:
B) HTML es lenguaje de marcado para estructura web.
C) CSS es lenguaje de estilos para presentación.
D) SQL es para consultas a BD, pero no para crear APIs completas.
Pregunta 19
En el contexto de DevOps, ¿cuál de las siguientes características es CORRECTA?
  • A) Los equipos lanzan versiones de software en ciclos cortos y frecuentes.
  • B) Cada equipo trabaja internamente sin necesidad de compartir ni dar visibilidad.
  • C) Están perfectamente separados los procesos de desarrollo y operaciones.
  • D) En el proceso de entrega de software se evita el uso de automatización.
✅ Respuesta Correcta: A
Explicación: DevOps promueve entregas frecuentes y continuas (Continuous Integration / Continuous Deployment), con ciclos cortos de desarrollo que permiten feedback rápido.

Por qué las otras son incorrectas:
B) DevOps promueve colaboración y transparencia entre equipos.
C) DevOps INTEGRA desarrollo y operaciones, no los separa.
D) La automatización es FUNDAMENTAL en DevOps (CI/CD pipelines).
Pregunta 20
¿Cuál de los siguientes NO es un lenguaje de programación orientado a objetos?
  • A) Java.
  • B) Scratch.
  • C) Ruby.
  • D) C#.
✅ Respuesta Correcta: B
Explicación: Scratch es un lenguaje de programación visual educativo para niños, basado en bloques. No está fundamentalmente basado en POO.

Java, Ruby y C# son lenguajes orientados a objetos profesionales.
Pregunta 21
¿Qué significa el acrónimo WORA en el contexto de Java?
  • A) Write Once, Read Always.
  • B) Write Once, Run Anywhere.
  • C) Windows Operating Runtime Application.
  • D) Web Object Runtime Architecture.
✅ Respuesta Correcta: B
Explicación: WORA = «Write Once, Run Anywhere» (Escribe una vez, ejecuta en cualquier lugar). Es el principio fundamental de Java: escribes el código una vez, lo compilas a bytecode, y ese bytecode se ejecuta en cualquier plataforma con JVM.
Pregunta 22
En el desarrollo de sistemas del SAS, ¿cuál sería el lenguaje más apropiado para desarrollar un script que automatice el backup diario de bases de datos en servidores Linux?
  • A) Java.
  • B) Bash.
  • C) C#.
  • D) HTML.
✅ Respuesta Correcta: B
Explicación: Bash es el lenguaje de scripting nativo de Linux, ideal para tareas de administración del sistema como backups, automatización, mantenimiento, etc. Tiene acceso directo a comandos del sistema y es estándar en todos los sistemas Unix/Linux.

Alternativas: Python también sería válido, pero Bash es más directo para scripts de sistema en Linux.
Pregunta 23
¿Cuál de las siguientes afirmaciones sobre la compilación JIT (Just-In-Time) es CORRECTA?
  • A) Compila todo el código a máquina antes de la ejecución.
  • B) Compila partes del bytecode a código nativo durante la ejecución para optimizar rendimiento.
  • C) Es exclusiva de lenguajes interpretados puros como Python.
  • D) Genera ejecutables .exe en Windows.
✅ Respuesta Correcta: B
Explicación: JIT (Just-In-Time) es una técnica que compila partes del bytecode a código máquina nativo DURANTE la ejecución, especialmente las partes que se ejecutan frecuentemente (hot spots). Así se obtiene un equilibrio entre portabilidad y rendimiento.

Usado en: JVM (Java), CLR (.NET), PyPy (Python), V8 (JavaScript)
Pregunta 24
¿Cuál es la principal diferencia entre un compilador y un ensamblador?
  • A) El compilador traduce código de alto nivel a código máquina; el ensamblador traduce código ensamblador a código máquina.
  • B) El compilador genera bytecode; el ensamblador genera código fuente.
  • C) No hay diferencia, son el mismo tipo de herramienta.
  • D) El ensamblador es más rápido que el compilador.
✅ Respuesta Correcta: A
Explicación: Un compilador traduce lenguajes de alto nivel (C, C++, Java) a código máquina o bytecode. Un ensamblador traduce lenguaje ensamblador (muy bajo nivel, casi 1:1 con instrucciones de procesador) a código máquina binario.

El ensamblador es más simple porque hay correspondencia directa entre instrucciones.
Pregunta 25
En el contexto del SAS, Diraya está desarrollado principalmente en:
  • A) Python con Django.
  • B) Java con Spring Framework.
  • C) C# con .NET.
  • D) PHP con Laravel.
✅ Respuesta Correcta: B
Explicación: Diraya (Historia de Salud Digital del SAS) está desarrollado en Java utilizando el framework Spring, que es el estándar para aplicaciones empresariales en el SAS. Usa arquitectura de microservicios con Spring Boot, bases de datos Oracle/PostgreSQL, y frontend con JavaScript (Angular).

Esta pregunta es muy probable en el examen porque evalúa conocimiento específico del SAS.
Pregunta 26
¿Qué característica de Python lo hace especialmente adecuado para análisis de datos en el SAS?
  • A) Su compilación a código máquina nativo.
  • B) Su rico ecosistema de librerías científicas (NumPy, Pandas, Matplotlib).
  • C) Su tipado estático fuerte.
  • D) Su exclusiva orientación a objetos.
✅ Respuesta Correcta: B
Explicación: Python tiene un ecosistema excepcional para análisis de datos y ciencia de datos: NumPy (cálculo numérico), Pandas (manipulación de datos tabulares), Matplotlib/Seaborn (visualización), scikit-learn (machine learning), etc.

Por eso se usa mucho en BI corporativo del SAS, análisis de datos asistenciales, y proyectos de IA.
Pregunta 27
En Java, ¿qué componente se encarga de liberar automáticamente la memoria de objetos no utilizados?
  • A) El Garbage Collector.
  • B) El Compilador JIT.
  • C) El ClassLoader.
  • D) El Bytecode Verifier.
✅ Respuesta Correcta: A
Explicación: El Garbage Collector (GC) es el componente de la JVM que gestiona automáticamente la memoria, liberando los objetos que ya no son referenciados por el programa. Esto evita fugas de memoria y simplifica el desarrollo.

Otros componentes de la JVM:
• JIT Compiler: Optimiza bytecode a código nativo
• ClassLoader: Carga clases dinámicamente
• Bytecode Verifier: Verifica seguridad del bytecode
Pregunta 28
¿Cuál de los siguientes NO es un IDE (Integrated Development Environment)?
  • A) IntelliJ IDEA.
  • B) Visual Studio Code.
  • C) Git.
  • D) Eclipse.
✅ Respuesta Correcta: C
Explicación: Git es un sistema de control de versiones, no un IDE. Los IDEs son entornos de desarrollo que integran editor, compilador, depurador, etc.

IntelliJ IDEA, VS Code y Eclipse son IDEs.
Git es una herramienta que se INTEGRA en los IDEs, pero no es un IDE en sí mismo.
Pregunta 29
En el contexto de programación web, ¿qué es TypeScript?
  • A) Un framework JavaScript para backend.
  • B) Un superconjunto de JavaScript con tipado estático.
  • C) Un lenguaje de bajo nivel para sistemas embebidos.
  • D) Una base de datos NoSQL.
✅ Respuesta Correcta: B
Explicación: TypeScript es un superconjunto de JavaScript desarrollado por Microsoft que añade tipado estático opcional. Se compila a JavaScript estándar. Mejora la mantenibilidad y reduce errores en proyectos grandes.

Cada vez más usado en el SAS para desarrollo web (Angular está escrito en TypeScript).
Pregunta 30
¿Cuál de los siguientes lenguajes es más adecuado para el desarrollo de sistemas operativos o drivers de hardware?
  • A) Python.
  • B) JavaScript.
  • C) C.
  • D) SQL.
✅ Respuesta Correcta: C
Explicación: C es el lenguaje de sistemas por excelencia. Linux, Windows, MacOS, la mayoría de drivers, sistemas embebidos, etc. están escritos en C (o C++). Razones:
• Muy bajo nivel, acceso directo al hardware
• Gestión manual de memoria (punteros)
• Alto rendimiento
• Portabilidad (con precauciones)

Python y JavaScript son demasiado alto nivel. SQL es para bases de datos.
Pregunta 31
¿Qué lenguaje de programación utiliza principalmente PowerShell?
  • A) Python.
  • B) Su propio lenguaje de scripting basado en .NET.
  • C) Bash.
  • D) JavaScript.
✅ Respuesta Correcta: B
Explicación: PowerShell tiene su propio lenguaje de scripting construido sobre .NET Framework/Core. Tiene acceso directo a objetos .NET, lo que lo hace mucho más potente que Bash para administración de Windows.

Es el estándar para automatización en entornos Windows Server del SAS.
Pregunta 32
¿Cuál de las siguientes NO es una fase típica del proceso de compilación?
  • A) Análisis léxico.
  • B) Análisis sintáctico.
  • C) Interpretación de bytecode.
  • D) Generación de código.
✅ Respuesta Correcta: C
Explicación: La interpretación de bytecode es propia de INTÉRPRETES o JVMs, no del proceso de compilación clásico.

Fases típicas de compilación:
1. Análisis léxico (tokenización)
2. Análisis sintáctico (AST)
3. Análisis semántico (verificación de tipos)
4. Optimización
5. Generación de código
Pregunta 33
En el desarrollo de microservicios para el SAS, ¿qué ventaja ofrece usar Spring Boot (Java) sobre desarrollo tradicional Java EE?
  • A) Spring Boot requiere servidores de aplicaciones pesados como WebLogic.
  • B) Spring Boot facilita la configuración con «convention over configuration» y servidor embebido.
  • C) Spring Boot solo funciona en Windows.
  • D) Spring Boot no soporta arquitectura de microservicios.
✅ Respuesta Correcta: B
Explicación: Spring Boot simplifica enormemente el desarrollo de aplicaciones Java con:
• Configuración mínima (convention over configuration)
• Servidor embebido (Tomcat, Jetty) – no necesitas servidor externo
• Arranque rápido de microservicios
• Autoconfiguración inteligente

Por eso es el estándar en el SAS para nuevos desarrollos.
Pregunta 34
¿Cuál de los siguientes lenguajes NO se considera un lenguaje de scripting?
  • A) Python.
  • B) JavaScript.
  • C) Java.
  • D) Bash.
✅ Respuesta Correcta: C
Explicación: Java NO es un lenguaje de scripting. Es un lenguaje compilado (a bytecode) de propósito general orientado a aplicaciones empresariales.

Los lenguajes de scripting son interpretados, de desarrollo rápido, típicamente usados para automatización, gluing de sistemas, y tareas específicas (Python, JavaScript, Bash, Perl, Ruby, etc.).
Pregunta 35
En el contexto de desarrollo web en el SAS, ¿qué tecnología es más adecuada para crear una API REST que exponga datos de Diraya?
  • A) HTML5 con CSS3.
  • B) Java con Spring Boot y Spring MVC.
  • C) SQL con procedimientos almacenados.
  • D) Bash scripting.
✅ Respuesta Correcta: B
Explicación: Java con Spring Boot y Spring MVC (o Spring WebFlux) es la tecnología estándar en el SAS para crear APIs REST robustas, escalables y seguras. Permite:
• Definir endpoints REST fácilmente con anotaciones
• Integración con seguridad (OAuth2, JWT)
• Validación de datos
• Documentación automática (Swagger/OpenAPI)
• Integración con bases de datos (JPA/Hibernate)

Las otras opciones no son apropiadas para APIs REST.

📚 9. Referencias Normativas y Bibliográficas

Documentación Técnica Oficial:

  • Oracle Java Documentation – https://docs.oracle.com/en/java/
  • Python Documentation – https://docs.python.org/
  • JavaScript MDN Web Docs – https://developer.mozilla.org/
  • Microsoft .NET Documentation – https://docs.microsoft.com/dotnet/
  • Spring Framework Documentation – https://spring.io/projects/spring-framework
  • Git Documentation – https://git-scm.com/doc

Bibliografía Recomendada:

  • «Effective Java» (3rd Edition) – Joshua Bloch
  • «Clean Code» – Robert C. Martin
  • «The Pragmatic Programmer» – Andrew Hunt, David Thomas
  • «Python for Data Analysis» – Wes McKinney
  • «You Don’t Know JS» – Kyle Simpson
  • «Pro Git» – Scott Chacon, Ben Straub

Recursos Online del SAS:

  • Portal de Desarrollo SAS (acceso interno)
  • GitLab Corporativo SSPA
  • Documentación técnica de Diraya (Wiki interna)
  • Guías de desarrollo del SAS (Confluence)

🎓 10. Conclusiones y Estrategia de Estudio

Mira, hemos cubierto MUCHO terreno en este tema. Si has llegado hasta aquí, ya tienes una base sólida. Pero déjame darte algunos consejos finales basados en mi experiencia preparando opositores…

10.1. Ideas Clave para Recordar (The Big Five)

1. JVM y Portabilidad de Java – Esta pregunta cae SIEMPRE. Tienes que tener clarísimo qué es la JVM, cómo funciona el bytecode, y qué significa WORA. Si te preguntan «¿Qué es la JVM?», la respuesta es: «Un entorno de ejecución que convierte bytecode a instrucciones nativas del procesador».

2. Compilación vs Interpretación – Domina las diferencias. Los compilados son más rápidos en ejecución pero más lentos en desarrollo. Los interpretados son al revés. Y no olvides las soluciones híbridas (Java con JIT).

3. Tipado: Estático/Dinámico y Fuerte/Débil – Son conceptos ortogonales. Python es dinámico y fuerte. Java es estático y fuerte. JavaScript es dinámico y débil. C es estático y débil.

4. POO: Los 4 Pilares – Encapsulación, Herencia, Polimorfismo, Abstracción. Sobre todo, entiende el polimorfismo (interfaz común para objetos diferentes).

5. Tecnologías del SAS – Diraya = Java Spring. Scripts = Python/Bash. Frontend = JavaScript (Angular). APIs = Spring Boot. Esto es conocimiento aplicado que demuestra que sabes del SAS.

10.2. Estrategia de Memorización

Para Conceptos Teóricos: Usa tarjetas Anki o flashcards. Una cara: «¿Qué es un intérprete?». Otra cara: «Programa que traduce y ejecuta código línea a línea en tiempo de ejecución». Repasa espaciadamente.

Para Lenguajes y Características: Crea una tabla comparativa en Excel o Google Sheets con columnas: Lenguaje, Tipado, Paradigma, Compilado/Interpretado, Uso en SAS. Rellénala y revísala regularmente.

Para Código: No basta con leer código, tienes que ESCRIBIRLO. Instala Java, Python, y practica ejemplos básicos. Entender cómo funciona el ciclo compilar-ejecutar en Java te ayudará a responder preguntas.

10.3. Aplicabilidad Práctica en tu Futuro Puesto

Como TFA-STI del SAS, vas a:

Dar soporte a Diraya – Necesitas entender Java, Spring, bases de datos Oracle/PostgreSQL.

Automatizar tareas – Python y Bash serán tus mejores amigos para scripts de mantenimiento, backups, procesamiento de logs, etc.

Integrar sistemas – Entender cómo se comunican aplicaciones en Java con aplicaciones en .NET, o cómo exponer APIs REST.

Resolver incidencias – Cuando un sistema falla, saber leer stack traces de Java, entender errores de tipado en JavaScript, o depurar scripts de Python es crucial.

Participar en desarrollos – Aunque no seas desarrollador full-time, participarás en proyectos de evolución de sistemas, y necesitas hablar el mismo idioma que los developers.

10.4. Últimos Consejos

Este tema es TÉCNICO y PRÁCTICO. No es de los que puedes estudiar solo leyendo, necesitas ENTENDER los conceptos. Mi recomendación:

1. Instala un entorno de desarrollo – Bájate IntelliJ IDEA Community (gratis), instala Java 17, y haz el «Hola Mundo». Compila con javac, ejecuta con java, y mira los archivos .class generados. Eso te quedará grabado para siempre.

2. Practica con las 35 preguntas – Hazlas hasta que las domines. Luego busca exámenes de otros años y haz las preguntas de lenguajes de programación que encuentres.

3. Conecta con otros temas – Este tema se relaciona con el Tema 14 (Ciclo de vida del software), Tema 15 (Metodologías ágiles), Tema 17 (Herramientas de desarrollo y Git). Estudiarlos juntos refuerza el aprendizaje.

4. No te agobies con los detalles – Es imposible saber TODO de TODOS los lenguajes. Céntrate en los conceptos fundamentales y en los lenguajes más usados en el SAS (Java, Python, JavaScript).

💪 Mensaje Final:
Has trabajado duro para llegar hasta aquí. Este tema es denso, pero si lo dominas, tienes una ventaja competitiva enorme en el examen. La mayoría de opositores estudia de forma superficial, memorizando sin entender. Tú no. Tú ENTIENDES cómo funciona un compilador, qué es la JVM, por qué Python es interpretado, y cuándo usar cada lenguaje en el SAS.

Eso te convierte en un técnico de verdad, no solo en un opositor.

Sigue así. La plaza está cerca.

– Esteban Castro

Tema 18 – Lenguajes de Programación

Oposición Técnico/a Especialista en Informática | Servicio Andaluz de Salud

Preparado por: Esteban Castro | © 2025

«El código es poesía. La compilación es arte. La ejecución es magia.»