L1: Entorno Agnóstico y Hola Mundo
El propósito de los compiladores
Sección titulada «El propósito de los compiladores»Si alguna vez has intentado ejecutar un programa .exe (de Windows) en una Mac, o una aplicación de iOS en un teléfono Android, te habrás dado cuenta de que simplemente no funcionan.
Esto sucede porque históricamente, los lenguajes de programación (como C o C++) se compilan directamente a código máquina. Es decir, se traducen al lenguaje físico y específico del procesador y sistema operativo de esa computadora en particular. Si compilas para Windows, la Mac no entiende ni una palabra.
¿Te imaginas tener que reescribir y recompilar tu aplicación del Chat de IA para que tus amigos con Mac, Linux y Windows puedan usarla? Aquí es donde entra la magia del ecosistema Java y Kotlin.
La Analogía del Traductor Universal
Sección titulada «La Analogía del Traductor Universal»Imagina que eres un aclamado guionista de cine y acabas de escribir una obra maestra (tu código en Kotlin). Quieres que esta obra se actúe en teatros de todo el mundo: en Japón, en Francia y en México (Windows, Mac y Linux).
Tienes dos opciones:
- La vía tradicional (C++): Traduces y adaptas el guion manualmente a cada idioma y cultura antes de enviarlo. (Un esfuerzo titánico).
- La vía de la JVM: Traduces tu guion a un idioma inventado, un idioma universal que nadie habla de forma nativa, pero que es perfecto. Luego, en cada teatro del mundo, contratas a un director de orquesta que sí entiende este idioma universal y dirige a los actores locales en tiempo real.
En el desarrollo de software:
- El “idioma universal” se llama Bytecode.
- El “director de orquesta” instalado en cada computadora se llama Máquina Virtual de Java (JVM).
Bajo el capó: ¿Por qué Kotlin es “Agnóstico”?
Sección titulada «Bajo el capó: ¿Por qué Kotlin es “Agnóstico”?»Kotlin (cuando se compila para la JVM) no crea programas ejecutables directos (.exe o .app). Cuando escribes código en Kotlin y presionas “Compilar”, el compilador de Kotlin (kotlinc) lee tu código y genera archivos con extensión .class llenos de Bytecode.
Para que este código agnóstico corra, la computadora destino debe tener instalada la JVM. La JVM toma ese bytecode, lo lee sobre la marcha y le da las instrucciones nativas al procesador. Es por esto que la filosofía principal de este ecosistema es: “Escribe una vez, ejecuta en cualquier lugar”.
Anatomía de un Proyecto Kotlin: Desmitificando Gradle
Sección titulada «Anatomía de un Proyecto Kotlin: Desmitificando Gradle»Cuando un desarrollador abre por primera vez un proyecto de Kotlin, suele encontrarse con archivos como build.gradle.kts, settings.gradle.kts o carpetas llamadas gradle/wrapper/. Para muchos, esto parece una “caja negra” mágica e intimidante. Vamos a desmitificarla paso a paso.
En proyectos profesionales, no compilamos ejecutando comandos manuales archivo por archivo en la terminal. Usamos una herramienta de construcción (Build Tool) y automatización. En el ecosistema Kotlin y Android, el estándar de la industria es Gradle.
¿Qué hace cada archivo de configuración?
Sección titulada «¿Qué hace cada archivo de configuración?»settings.gradle.kts: Es el primer archivo que Gradle lee. Define el nombre de tu proyecto raíz (rootProject.name = "ai-chat-cli") y declara de qué repositorios descargar los plugins necesarios.build.gradle.kts: Es el manifiesto principal de construcción. Aquí declaramos qué plugins aplicamos (por ejemplo,kotlin("jvm")), qué versión de Java usamos (JavaVersion.VERSION_17), y qué librerías externas necesita nuestra aplicación.gradle/libs.versions.toml: Conocido como el Version Catalog. Es una tabla centralizada donde definimos versiones de plugins y dependencias en un solo lugar, evitando números de versión repetidos o desincronizados.- Kotlin DSL (
.kts) vs Groovy (.gradle): Históricamente Gradle usaba Groovy (un lenguaje dinámico). Hoy en día usamos Kotlin DSL (archivos terminados en.kts). La gran ventaja es que tu archivo de configuración está escrito en el mismo Kotlin que estás aprendiendo: tiene autocompletado en el IDE, detección de errores de sintaxis en tiempo real y tipado estático seguro.
🧠 Puente Conceptual: ¿Cómo se compara Gradle con tu lenguaje?
Sección titulada «🧠 Puente Conceptual: ¿Cómo se compara Gradle con tu lenguaje?»Si vienes de Node.js o el mundo web:
build.gradle.ktses el equivalente directo a tupackage.json. Allí declaras scripts de ejecución y dependencias externas.gradle/libs.versions.tomlcumple una función similar a los bloques de versiones fijas en monorrepositorios conpnpm-workspace.yaml.- La tarea
./gradlew runequivale a ejecutarnpm run devopnpm start. - Los plugins de Gradle (
kotlin("jvm")) son como tus herramientas de compilación (esbuild,tscovite).
Si vienes de Python o ciencia de datos:
build.gradle.ktsequivale a tupyproject.toml(gestionado por herramientas modernas como Poetry o Flit).gradle/libs.versions.tomlactúa como el archivo de bloqueopoetry.lock, asegurando que todo el equipo use versiones reproducibles.- Ejecutar
./gradlew runequivale a correr tu entorno virtual mediantepoetry run python main.py. - Gradle no solo descarga paquetes: compila el código a Bytecode, valida dependencias circulares y empaqueta el ejecutable en un archivo
.jar.
Si vienes del ecosistema de Microsoft:
build.gradle.ktsequivale directamente al archivo de proyecto.csprojprocesado por MSBuild.- Los repositorios de Maven (
mavenCentral()) son el equivalente a los feeds de NuGet. gradle/libs.versions.tomlequivale a la gestión centralizada de paquetes conDirectory.Packages.propsde NuGet.- Ejecutar
./gradlew runes exactamente lo mismo que ejecutardotnet rundesde la terminal.
Si vienes de Java clásico:
build.gradle.ktsreemplaza al verbosopom.xmlde Maven.- En lugar de miles de líneas de XML con
<dependency>,<groupId>y<artifactId>, en Kotlin DSL defines tus dependencias de forma concisa y con autocompletado total:implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0").
¿Dónde se guardan las dependencias? (Caché Global vs node_modules)
Sección titulada «¿Dónde se guardan las dependencias? (Caché Global vs node_modules)»Una de las mayores sorpresas para desarrolladores que vienen de JavaScript o Python es abrir la carpeta de su proyecto en Kotlin y preguntarse: “¿Dónde están las librerías que descargó Gradle? ¡No veo ninguna carpeta node_modules ni .venv!”.
El Rol del Gradle Wrapper (./gradlew)
Sección titulada «El Rol del Gradle Wrapper (./gradlew)»En la raíz del proyecto encontrarás dos archivos clave: ./gradlew (para macOS y Linux) y gradlew.bat (para Windows).
¿Por qué existen y por qué nunca debes borrarlos? El Gradle Wrapper es un ejecutable mínimo y portátil. Su propósito es garantizar la reproducibilidad total del software:
- No necesitas instalar Gradle globalmente en tu sistema operativo con Homebrew, SDKMAN o instaladores de Windows.
- Cuando ejecutas
./gradlew runpor primera vez, el wrapper lee el archivogradle/wrapper/gradle-wrapper.properties, descarga automáticamente la versión exacta de Gradle que requiere el proyecto, la guarda en caché y ejecuta la tarea. - Esto garantiza que todos los integrantes de un equipo de ingeniería o estudiantes de este curso compilen con exactamente el mismo comportamiento, sin el clásico “en mi máquina sí compila”.
Laboratorio Incremental: El Cascarón del Chat
Sección titulada «Laboratorio Incremental: El Cascarón del Chat»A lo largo de este curso, no haremos ejercicios aislados. Construiremos paso a paso un Chat de IA interactivo en la Terminal (CLI). Hoy, nuestra misión es preparar el terreno, instalar las herramientas profesionales y levantar el estandarte de nuestro proyecto con un “Hola Mundo”.
Entregables del Laboratorio
Sección titulada «Entregables del Laboratorio»Clona el repositorio oficial del curso. Usaremos un sistema de Tags de Git para que puedas viajar en el tiempo a cualquier lección.
Paso 1: Abrir el proyecto en tu Entorno de Desarrollo (IDE)
Sección titulada «Paso 1: Abrir el proyecto en tu Entorno de Desarrollo (IDE)»En la industria profesional de Kotlin y Java, contamos con múltiples alternativas según tus preferencias de flujo de trabajo y los recursos de tu computadora:
Es la opción recomendada por JetBrains y el estándar de la industria.
- Descarga e instala IntelliJ IDEA Community Edition (gratuito) o Android Studio.
- Selecciona Open y elige la carpeta raíz del repositorio clonado.
- Espera unos segundos a que la ventana de herramientas de Gradle (en el lateral derecho) termine de sincronizar e indexar el proyecto.
- Asegúrate de configurar el proyecto con un JDK 17 o superior (File -> Project Structure -> Project SDK).
Ideal si tu computadora tiene memoria RAM ajustada (e.g. 8 GB) o prefieres editores ligeros:
- Abre la carpeta del proyecto en Visual Studio Code o Cursor.
- Instala la extensión oficial Kotlin de JetBrains (Kotlin Language Server).
- Asegúrate de tener instalado Java 17 en tu sistema (
java -version). - Abre la terminal integrada de VS Code para interactuar directamente con el proyecto.
Si trabajas directamente desde la consola o un entorno asistido por agentes como Antigravity:
- Navega hasta el directorio del repositorio en tu terminal:
Ventana de terminal cd kotlin-course-2-lab - Verifica que el wrapper de Gradle esté listo para usarse:
Ventana de terminal ./gradlew --version
Paso 2: El punto de entrada
Sección titulada «Paso 2: El punto de entrada»Todo programa necesita un “punto de entrada”, el lugar exacto donde la JVM sabe que debe comenzar a leer. En Kotlin, esto es simplemente una función llamada main.
Abre el archivo src/main/kotlin/Main.kt que se generó y borra su contenido. Vamos a escribir el banner de bienvenida de nuestro Chat.
/** * Punto de entrada principal de nuestra aplicación Kotlin. * * La JVM buscará exactamente esta función 'main' en todo nuestro proyecto * para comenzar la ejecución. */fun main() { // println es una función de la librería estándar de Kotlin. // Lo que hace es imprimir el texto en la consola de la computadora // y añadir un salto de línea (Enter) invisible al final.
println("===============================") println("🤖 Welcome to AI Chat CLI") println("===============================")}Paso 3: Ejecutar la aplicación
Sección titulada «Paso 3: Ejecutar la aplicación»Elige tu método favorito de ejecución según tu entorno:
Abre src/main/kotlin/Main.kt y, justo al lado izquierdo de la palabra fun main(), verás un pequeño botón verde de Play (▶️) en el margen. Haz clic ahí y selecciona Run ‘MainKt’.
El IDE llamará al compilador de Kotlin, transformará este texto en Bytecode y la JVM lo ejecutará en tu panel inferior.
En la raíz del proyecto, ejecuta el siguiente comando:
./gradlew run(En Windows CMD / PowerShell usa gradlew.bat run).
Gradle compilará automáticamente los archivos modificados y correrá la función main en tu terminal.
Si ves el banner de bienvenida… ¡Felicidades! Tienes tu entorno agnóstico configurado, dominas el rol de Gradle y estás listo para empezar a programar la lógica interactiva en la siguiente lección.
Fuentes y Lecturas Recomendadas
Sección titulada «Fuentes y Lecturas Recomendadas»Para profundizar en el funcionamiento interno de la JVM y el ecosistema Kotlin, revisa la documentación oficial:
Feedback y Dudas de la Lección
Sección titulada «Feedback y Dudas de la Lección»¿Tuviste problemas configurando Gradle o tu JDK, o tienes alguna sugerencia sobre esta lección?