{"content_id":"zkrgx4ojs2","slug":"vibe-coding-programming-language-basics","locale":"es","schema_type":"TechArticle","category":"knowledge_base","category_name":"Base de conocimiento","title":"Vibe coding: lenguajes de programación para principiantes","summary":"En el vibe coding, es más útil entender dónde se ejecuta el código y cómo se procesan los datos que conocer los nombres de los lenguajes. Se explican los fundamentos de programación, los criterios para elegir un lenguaje y qué se debe verificar en el código generado por IA.","sponsorship_disclosure":null,"affiliate_disclosure":null,"commerce_disclosure":null,"author":{"name":"Equipo editorial de Injoys","url":"https://injoys.com/ko/about"},"key_points":["El desarrollo web empieza por distinguir las funciones de HTML, CSS y JavaScript.","TypeScript comprueba los tipos antes de la ejecución, pero no valida automáticamente los datos de entrada externos.","El sistema de propiedad de Rust establece reglas para gestionar la memoria; no es un mecanismo que impida todos los fallos de seguridad.","Mojo es un lenguaje orientado al cálculo de alto rendimiento en CPU y GPU.","Hay que ejecutar y probar el código generado por IA para comprobar si cumple los requisitos."],"content_markdown":"El vibe coding requiere una base para distinguir la función de cada lenguaje y dónde se ejecuta el código. En la web, JavaScript y TypeScript son el punto de partida. Para el procesamiento de datos, considera Python. Rust y Mojo se usan en el desarrollo de sistemas y en cálculos de alto rendimiento.\n\nLas cifras de rendimiento se basan en el anuncio de Microsoft del 11 de marzo de 2025.\n\n## Por qué hacen falta conocimientos básicos de lenguajes en el vibe coding\n\nEl vibe coding es una forma de desarrollo en la que se crea código con IA a partir de peticiones en lenguaje natural. Las peticiones se ajustan al observar los resultados de ejecutar el programa generado. Las peticiones en lenguaje natural también deben convertirse en código que se ejecute de verdad.\n\nLos conocimientos básicos de lenguajes sirven para describir con precisión la función que quieres. También ayudan a localizar dónde se ha producido un error. Al empezar, distingue primero las funciones de los lenguajes en lugar de memorizar la sintaxis de todos ellos.\n\n- Lugar de ejecución: navegador, servidor, teléfono móvil, interior del sistema operativo\n- Entrada: valores que introduce el usuario o datos recibidos del exterior\n- Procesamiento: tareas que hará el programa, como calcular, buscar o clasificar\n- Salida: visualización en pantalla, creación de archivos, almacenamiento de datos\n- Condiciones de fallo: entrada vacía, formato incorrecto, pérdida de conexión\n\n## Conceptos básicos que debes conocer, empezando por variables y tipos\n\nLas variables y los tipos son la base para describir qué datos maneja un programa. Los condicionales y los bucles determinan el orden del procesamiento. Las funciones agrupan tareas relacionadas para poder reutilizarlas.\n\n| Concepto | Definición sencilla | Ejemplo al describir una función |\n| --- | --- | --- |\n| Variable | Medio para dar un nombre a un valor y hacer referencia a él | Nombre que almacena el término de búsqueda |\n| Tipo | Reglas sobre la clase de valor y las operaciones permitidas | La cantidad es un número y el título, una cadena |\n| Condicional | Construcción que elige qué tarea ejecutar según una condición | Rechazar el guardado si el título está vacío |\n| Bucle | Construcción que aplica la misma tarea a varios elementos | Mostrar en pantalla cada elemento de una lista |\n| Función | Código agrupado para hacer una tarea concreta | Función que comprueba la entrada |\n| Estructura de datos | Forma de organizar los datos | Lista ordenada, valor que se busca por su nombre |\n| Objeto | Unidad que agrupa estados y comportamientos relacionados | Título de una publicación y función para editarla |\n| Gestión de excepciones | Forma de responder a errores que surgen durante la ejecución | Aviso de error cuando no se puede leer un archivo |\n| API | Acuerdo para intercambiar funciones o datos entre programas | Solicitar resultados de búsqueda al servidor |\n| Dependencia | Código o herramienta externa que utiliza un programa | Biblioteca para manejar fechas |\n\nLa comprobación estática de tipos revisa el uso de los tipos antes de la ejecución. Los lenguajes de tipado dinámico también distinguen los tipos de los valores. Que el tipado sea dinámico no significa que no existan clases de datos.\n\n## Por qué se pasó del lenguaje máquina a los lenguajes de alto nivel\n\nLa evolución de los lenguajes ha ido reduciendo las tareas detalladas que las personas tienen que expresar. El lenguaje máquina representa las instrucciones que ejecuta el procesador. El lenguaje ensamblador asigna a esas instrucciones símbolos que las personas pueden leer.\n\nEl ensamblador está estrechamente vinculado al conjunto de instrucciones del procesador. Cambiar un componente no significa tener que reescribir todo el código. El esfuerzo de modificación aumenta al pasar a un conjunto de instrucciones incompatible.\n\n| Lenguaje o corriente | Problema que buscaba resolver | Concepto que conviene recordar |\n| --- | --- | --- |\n| Lenguaje máquina y ensamblador | Indicar al hardware las tareas que debe hacer | Vínculo directo con el conjunto de instrucciones |\n| Fortran | Expresar cálculos científicos de forma cercana a las fórmulas | Cálculo numérico y compiladores |\n| COBOL | Procesar datos empresariales en un formato fácil de leer | Expresión centrada en libros contables y transacciones |\n| Lisp | Cálculo mediante símbolos y listas | Primeras investigaciones en IA y expresión centrada en funciones |\n| C | Escribir software de sistemas de forma eficiente | Control de memoria y portabilidad |\n| SQL | Procesar datos de bases de datos relacionales | Consultas que declaran el resultado deseado |\n| C++ | Estructurar programas grandes y gestionar recursos | Clases y diversas formas de programación |\n| Java | Portabilidad entre sistemas con distintos entornos de ejecución | JVM y bytecode |\n\nFortran apareció en IBM en 1957. Lisp evolucionó junto con la investigación en IA a finales de la década de 1950. COBOL surgió de un trabajo de diseño conjunto iniciado en 1959.\n\nC es un lenguaje que evolucionó junto con el desarrollo de Unix. Contribuyó a trasladar software entre distintos tipos de máquinas. Sin embargo, el código que depende del sistema operativo y del hardware necesita modificaciones específicas.\n\nLa orientación a objetos organiza los datos y comportamientos relacionados en objetos. C++ es un lenguaje que admite la orientación a objetos. C++ no creó el concepto de orientación a objetos.\n\n## Diferencia entre compilador e intérprete\n\nUn compilador es un programa que transforma el código en otra representación. El resultado puede ser lenguaje máquina. También puede ser un formato intermedio de ejecución, como el bytecode.\n\nUn intérprete ejecuta el código o una representación intermedia mientras lo interpreta. Las implementaciones reales de los lenguajes también pueden combinar compilación e interpretación. Es inexacto dividir los lenguajes únicamente en compilados rápidos e interpretados lentos.\n\n| Concepto relacionado con la ejecución | Función | Ejemplo representativo |\n| --- | --- | --- |\n| Compilación anticipada | Generar el código de destino antes de la ejecución | Generación habitual de archivos ejecutables en C y Rust |\n| Bytecode | Formato de instrucciones intermedias que procesa el entorno de ejecución | Bytecode de Java, bytecode de CPython |\n| Intérprete | Ejecutar el código o las instrucciones intermedias mientras los interpreta | Ejecución del bytecode en CPython |\n| Compilación JIT | Convertir el código necesario a lenguaje máquina durante la ejecución | Diversas JVM y motores de JavaScript |\n| Entorno de ejecución | Proporcionar las funciones necesarias para ejecutar el programa | JVM, Node.js |\n\nCPython es una implementación de Python de uso extendido. Compila el código fuente a bytecode y lo ejecuta. Es incorrecto describir Python solo como un lenguaje que traduce el código fuente línea por línea en cada ejecución.\n\nLa JVM de Java es un entorno que ejecuta bytecode. Esta estructura ayuda a ejecutar el código en distintos sistemas operativos. La compatibilidad real también depende de la versión de la JVM y de las bibliotecas externas.\n\n## ¿En qué se diferencian la interfaz web y el servidor?\n\nEl frontend se encarga de la interfaz y las interacciones que encuentra el usuario. El backend procesa las peticiones en el servidor. La base de datos almacena y consulta los datos necesarios.\n\nHTML es un lenguaje de marcado que expresa la estructura de los documentos. CSS define el estilo y la distribución visual. JavaScript implementa la evaluación de condiciones y la gestión de las acciones del usuario.\n\n| Nombre | Clasificación | Función principal |\n| --- | --- | --- |\n| HTML | Lenguaje de marcado | Estructura del documento, como títulos, párrafos y campos de entrada |\n| CSS | Lenguaje de hojas de estilo | Colores, espaciado y distribución visual |\n| JavaScript | Lenguaje de programación | Interacciones en el navegador y procesamiento en el servidor |\n| TypeScript | Lenguaje que añade un sistema de tipos a JavaScript | Detección de errores antes de la ejecución y gestión del código |\n| React | Biblioteca de interfaces de usuario | Crear interfaces con componentes reutilizables |\n| Node.js | Entorno de ejecución de JavaScript | Ejecutar JavaScript fuera del navegador |\n| Next.js | Framework basado en React | Organización de páginas y funciones de servidor para aplicaciones web |\n| PHP | Lenguaje de programación | Generar respuestas web dinámicas en el servidor |\n| SQL | Lenguaje de bases de datos | Consultar, añadir, modificar y eliminar datos |\n\nReact, Node.js y Next.js no son herramientas del mismo tipo. Una biblioteca es un conjunto de código del que se toman las funciones necesarias. Un framework también ofrece una forma de organizar la aplicación. Un entorno de ejecución es el entorno en el que se ejecuta el código.\n\n## Comparación de lenguajes según el objetivo\n\nElige el lenguaje según lo que quieras crear y el entorno de ejecución existente. La siguiente tabla ofrece un punto de partida habitual para considerar cada lenguaje. Un lenguaje no se limita a las tareas que figuran en la tabla.\n\n| Qué quieres crear | Lenguajes que considerar primero | Qué comprobar antes de elegir |\n| --- | --- | --- |\n| Aplicación web que se usa en el navegador | JavaScript, TypeScript | Fundamentos de HTML y CSS y herramientas para crear interfaces |\n| Organización de archivos y automatización de tareas | Python | Formato de los archivos de entrada y entorno de despliegue |\n| Análisis de datos y uso de modelos de IA | Python | Bibliotecas de análisis y modelos necesarias |\n| Servidores de red y herramientas de operación | Go | Estructura de procesamiento concurrente e integración con sistemas existentes |\n| Sistemas empresariales basados en JVM | Java, Kotlin | Compatibilidad con el código y las bibliotecas existentes |\n| Aplicaciones centradas en iOS | Swift | Herramientas de desarrollo de Apple y funciones de la plataforma |\n| Aplicaciones centradas en Android | Kotlin | Herramientas de desarrollo de Android y estructura de la aplicación existente |\n| Sistemas que necesitan control de memoria | C, C++, Rust | Requisitos de rendimiento y capacidad para verificar la seguridad |\n| Optimización de cálculos en CPU y GPU | Mojo | Hardware compatible y funciones de cálculo necesarias |\n| Procesamiento de datos relacionales | SQL | Diferencias de sintaxis entre productos de bases de datos |\n\nLa utilidad de Python también está relacionada con su ecosistema de bibliotecas. NumPy usa código compilado para ganar velocidad. No todos los cálculos escritos en Python se ejecutan solo con código Python.\n\nGo incluye soporte para la concurrencia en el diseño del lenguaje. La concurrencia consiste en organizar varias tareas para que avancen de forma conjunta. El paralelismo es el estado en el que varias tareas se ejecutan realmente al mismo tiempo. Escribir código concurrente no acelera automáticamente los cálculos.\n\n## Diferencias entre TypeScript, Rust y Mojo\n\nTypeScript, Rust y Mojo buscan resolver problemas distintos. TypeScript ayuda a comprobar los tipos en el código JavaScript. Rust impone reglas estrictas para la gestión de memoria. Mojo se orienta a los cálculos de alto rendimiento y al aprovechamiento del hardware.\n\n| Criterio de comparación | TypeScript | Rust | Mojo |\n| --- | --- | --- | --- |\n| Enfoque principal | Comprobación de tipos y gestión del código | Seguridad de memoria y control del sistema | Cálculos de alto rendimiento en CPU y GPU |\n| Usos representativos | Aplicaciones web y de servidor | Herramientas de sistemas y componentes centrados en el rendimiento | Infraestructura de IA y núcleos de cálculo |\n| Conceptos que conviene entender primero | JavaScript y tipos de datos | Propiedad, préstamos y tiempos de vida | Tipos, memoria y cálculo paralelo |\n| Aspectos que deben comprobarse aparte | Entradas externas y reglas de negocio | Código unsafe y errores lógicos | Integración con Python y compatibilidad con el hardware |\n\n### Comprobación de tipos en TypeScript\n\nTypeScript añade comprobación estática de tipos a JavaScript. Ayuda a encontrar código que usa mal los tipos antes de ejecutarlo. La inferencia de tipos permite deducir automáticamente algunas declaraciones.\n\nNo hace falta escribir el tipo de cada variable. Las anotaciones de tipo se eliminan durante la conversión habitual a JavaScript. Las declaraciones de tipos por sí solas no generan comprobaciones de entrada durante la ejecución.\n\n### Propiedad y seguridad de memoria en Rust\n\nLa propiedad es el conjunto de reglas que determina quién gestiona la memoria de un valor. El préstamo permite hacer referencia a un valor sin transferir su propiedad. El compilador comprueba las reglas correspondientes para prevenir errores de memoria.\n\nLas garantías de seguridad de Rust parten de una implementación correcta. En el código unsafe, quien lo escribe se responsabiliza de algunas condiciones de seguridad. El lenguaje no impide automáticamente los errores en fórmulas de cálculo o permisos de acceso.\n\n### Relación entre Mojo y Python\n\nMojo es un lenguaje independiente que usa una sintaxis parecida a la de Python. Permite escribir código de alto rendimiento para CPU y GPU. También ofrece funciones de interoperabilidad para conectarse con código Python.\n\nNo debes suponer que puedes trasladar el código Python existente sin cambios. Comprueba las funciones que necesitas en la documentación de la versión de Mojo que vayas a instalar. Para usar una GPU, también deben cumplirse los requisitos de dispositivos compatibles y controladores.\n\n## Errores frecuentes al explicar los lenguajes\n\nLas presentaciones breves de lenguajes suelen omitir las condiciones de aplicación. También hay que distinguir los hechos históricos de las funciones actuales. Los siguientes malentendidos pueden dificultar la elección de un lenguaje.\n\n| Explicación habitual | Qué hay que entender con precisión |\n| --- | --- |\n| JavaScript es la versión web de Java | Son lenguajes distintos |\n| HTML y CSS aparecieron en 1991 | La recomendación de CSS1 del W3C es del 17 de diciembre de 1996 |\n| Kotlin es un lenguaje creado por Google | Lo desarrolla JetBrains; Google ofrece soporte en Android |\n| El código C se ejecuta en cualquier lugar si se vuelve a compilar | Las partes que dependen del sistema operativo o del hardware pueden necesitar cambios |\n| Python ocupa hoy el puesto 1 en popularidad | Para valorarlo hay que conocer la entidad que hace el estudio, la fecha y el método de cálculo |\n| Usar Rust resuelve todos los problemas de seguridad | La seguridad de memoria y la verificación de permisos de acceso son cuestiones distintas |\n| Usar Mojo acelera todas las tareas de Python | Hay que medir según la tarea, la implementación y el hardware |\n| La palabra bug nació del incidente del insecto | Ese incidente popularizó un término que ya se usaba |\n\nEl famoso registro en el que se encontró un insecto corresponde al caso de Harvard Mark II en 1947. Smithsonian explica que este incidente contribuyó a popularizar el término. Es inexacto presentarlo como un caso de ENIAC o como el origen del término.\n\n## ¿Cómo deben interpretarse las cifras de rendimiento?\n\nLas cifras de rendimiento deben interpretarse solo para la tarea medida. El tiempo de compilación y la velocidad de ejecución de la aplicación terminada son métricas distintas. Que una herramienta de desarrollo sea más rápida no significa que una página web se acelere en la misma proporción.\n\nMicrosoft anunció la transición de las herramientas de TypeScript a una implementación nativa. El anuncio del 11 de marzo de 2025 incluye mediciones por proyecto. A continuación se muestra el caso de la base de código de VS Code incluido en ese anuncio.\n\n| Tarea medida | Implementación anterior | Implementación nativa | Aumento de velocidad anunciado |\n| --- | --- | --- | --- |\n| Compilación de TypeScript de la base de código de VS Code | 77.8 segundos | 7.5 segundos | 10.4 veces |\n\nEn las condiciones del anuncio, el tiempo de procesamiento se redujo a **7.5 segundos**. Al calcular la diferencia, se trata de una reducción de 70.3 segundos en una ejecución de la tarea. Esto no significa que todos los proyectos obtengan el mismo resultado.\n\nAplica el mismo principio al comparar la velocidad de Python y C. Hay que comprobar si se han ejecutado con la misma entrada y el mismo algoritmo. Las opciones de compilación y las bibliotecas utilizadas también forman parte de las condiciones de comparación. Es difícil usar cifras sin información sobre el entorno de ejecución como un factor general de velocidad.\n\n## Comprobación de tipos y validación de entradas externas\n\nAunque se supere la comprobación de tipos, el contenido de los datos externos debe comprobarse aparte. Esta diferencia se pasa por alto con frecuencia al revisar código generado por IA. Las declaraciones de tipos expresan la forma de los valores que espera el programa.\n\nPiensa en una aplicación web que declara una cantidad con un tipo numérico. Una API externa podría enviar en realidad una cadena. Añadir un nombre de tipo o hacer una aserción de tipo no valida el valor. Hace falta código que compruebe los datos durante la ejecución.\n\n| Etapa de comprobación | Qué se comprueba | Problema que queda aunque se supere |\n| --- | --- | --- |\n| Comprobación de tipos | Uso de los tipos dentro del código | Valores que llegan realmente del exterior |\n| Validación de entradas | Formato de los datos y rango permitido | Si el usuario tiene permitido hacer la acción |\n| Comprobación de permisos | Permisos de acceso de quien hace la petición | Si el resultado cumple las reglas de negocio |\n| Pruebas funcionales | Resultado real con las entradas previstas | Condiciones que no se han probado |\n\nEsta tabla es un marco de revisión que tiene en cuenta la eliminación de tipos y el alcance de la seguridad de memoria. Separa lo que garantiza el lenguaje de lo que debe comprobar el servicio. Pide a la IA que distinga las comprobaciones de cada etapa.\n\n## Cómo explicar una función a la IA\n\nAl pedir una función, escribe tanto la entrada como el resultado esperado. Si solo defines el nombre del programa, es fácil que falten las condiciones de funcionamiento. Si ya existe un proyecto, indica también el lenguaje y la versión que utiliza.\n\n1. Escribe el entorno que se usará.\n2. Describe la forma de la entrada que se procesará.\n3. Define el resultado para una entrada válida.\n4. Define cómo tratar los valores vacíos y las entradas incorrectas.\n5. Pide también el motivo de los cambios y cómo comprobarlos.\n\nEl siguiente ejemplo de prompt divide los requisitos. Adapta el contenido real de los archivos al proyecto. Debes ejecutar por tu cuenta el resultado generado para comprobarlo.\n\n```text\nComprueba primero el lenguaje y el entorno de ejecución del proyecto existente.\nLee las filas que tengan título de un archivo CSV y muéstralas en una lista.\nSi falta una columna obligatoria, muestra un mensaje de error.\nInforma por separado de las filas cuyo título esté vacío.\nSepara el código de validación de entradas externas del código de visualización.\nComprueba primero si se puede implementar con las dependencias existentes.\nExplica los cambios y cómo probarlos.\n```\n\nSi surge un error, indica también las condiciones para reproducirlo. Los mensajes de error contienen pistas para acotar dónde se ha producido. La documentación de Copilot de GitHub también exige revisar el código generado. Antes de adoptar el código, es necesario comprobar los resultados de su ejecución.\n\n## Criterios para empezar a aprender y elegir una formación\n\nPuedes empezar a aprender con un alcance reducido y centrado en la tarea que quieres crear. Si se trata de desarrollo web, prueba primero a conectar la estructura de la interfaz con su comportamiento. Si se trata de automatización, conviene empezar por comprobar la entrada de archivos y el guardado de resultados.\n\n1. Elige un lenguaje adecuado para lo que quieres crear.\n2. Aprende variables, tipos, condicionales, bucles y funciones.\n3. Escribe una función pequeña y compara los resultados de ejecución.\n4. Introduce datos incorrectos para comprobar el comportamiento ante fallos.\n5. Intenta explicar con tus propias palabras por qué has modificado el código.\n\nAl elegir un curso, comprueba qué se enseña a verificar, además de ver la pantalla del resultado. Puedes revisar si incluye ejercicios para reproducir y corregir errores. También conviene comprobar si especifica las versiones y el entorno de ejecución utilizados.\n\n- Explicación del código: proceso para explicar las entradas y salidas de las funciones generadas\n- Gestión de errores: ejercicios para leer mensajes de error y acotar la causa\n- Validación de datos: ejemplos para tratar las entradas externas y las condiciones de fallo\n- Reproducibilidad: instrucciones para volver a ejecutar el código en el mismo entorno\n\nPuedes consultar la definición de cada lenguaje en la documentación oficial de su proyecto. TypeScript Handbook incluye una explicación sobre la eliminación de tipos. El libro oficial de Rust explica por separado la propiedad y unsafe. En Mojo Manual, consulta las funciones del lenguaje y el alcance de la integración con Python.","content_html":"\u003cp\u003eEl vibe coding requiere una base para distinguir la función de cada lenguaje y dónde se ejecuta el código. En la web, JavaScript y TypeScript son el punto de partida. Para el procesamiento de datos, considera Python. Rust y Mojo se usan en el desarrollo de sistemas y en cálculos de alto rendimiento.\u003c/p\u003e\n\u003cp\u003eLas cifras de rendimiento se basan en el anuncio de Microsoft del 11 de marzo de 2025.\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#por-qu%C3%A9-hacen-falta-conocimientos-b%C3%A1sicos-de-lenguajes-en-el-vibe-coding\" class=\"anchor\" id=\"por-qué-hacen-falta-conocimientos-básicos-de-lenguajes-en-el-vibe-coding\"\u003e\u003c/a\u003ePor qué hacen falta conocimientos básicos de lenguajes en el vibe coding\u003c/h2\u003e\n\u003cp\u003eEl vibe coding es una forma de desarrollo en la que se crea código con IA a partir de peticiones en lenguaje natural. Las peticiones se ajustan al observar los resultados de ejecutar el programa generado. Las peticiones en lenguaje natural también deben convertirse en código que se ejecute de verdad.\u003c/p\u003e\n\u003cp\u003eLos conocimientos básicos de lenguajes sirven para describir con precisión la función que quieres. También ayudan a localizar dónde se ha producido un error. Al empezar, distingue primero las funciones de los lenguajes en lugar de memorizar la sintaxis de todos ellos.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLugar de ejecución: navegador, servidor, teléfono móvil, interior del sistema operativo\u003c/li\u003e\n\u003cli\u003eEntrada: valores que introduce el usuario o datos recibidos del exterior\u003c/li\u003e\n\u003cli\u003eProcesamiento: tareas que hará el programa, como calcular, buscar o clasificar\u003c/li\u003e\n\u003cli\u003eSalida: visualización en pantalla, creación de archivos, almacenamiento de datos\u003c/li\u003e\n\u003cli\u003eCondiciones de fallo: entrada vacía, formato incorrecto, pérdida de conexión\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e\n\u003ca href=\"#conceptos-b%C3%A1sicos-que-debes-conocer-empezando-por-variables-y-tipos\" class=\"anchor\" id=\"conceptos-básicos-que-debes-conocer-empezando-por-variables-y-tipos\"\u003e\u003c/a\u003eConceptos básicos que debes conocer, empezando por variables y tipos\u003c/h2\u003e\n\u003cp\u003eLas variables y los tipos son la base para describir qué datos maneja un programa. Los condicionales y los bucles determinan el orden del procesamiento. Las funciones agrupan tareas relacionadas para poder reutilizarlas.\u003c/p\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eConcepto\u003c/th\u003e\n\u003cth\u003eDefinición sencilla\u003c/th\u003e\n\u003cth\u003eEjemplo al describir una función\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto\"\u003eVariable\u003c/td\u003e\n\u003ctd data-label=\"Definición sencilla\"\u003eMedio para dar un nombre a un valor y hacer referencia a él\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo al describir una función\"\u003eNombre que almacena el término de búsqueda\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto\"\u003eTipo\u003c/td\u003e\n\u003ctd data-label=\"Definición sencilla\"\u003eReglas sobre la clase de valor y las operaciones permitidas\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo al describir una función\"\u003eLa cantidad es un número y el título, una cadena\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto\"\u003eCondicional\u003c/td\u003e\n\u003ctd data-label=\"Definición sencilla\"\u003eConstrucción que elige qué tarea ejecutar según una condición\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo al describir una función\"\u003eRechazar el guardado si el título está vacío\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto\"\u003eBucle\u003c/td\u003e\n\u003ctd data-label=\"Definición sencilla\"\u003eConstrucción que aplica la misma tarea a varios elementos\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo al describir una función\"\u003eMostrar en pantalla cada elemento de una lista\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto\"\u003eFunción\u003c/td\u003e\n\u003ctd data-label=\"Definición sencilla\"\u003eCódigo agrupado para hacer una tarea concreta\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo al describir una función\"\u003eFunción que comprueba la entrada\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto\"\u003eEstructura de datos\u003c/td\u003e\n\u003ctd data-label=\"Definición sencilla\"\u003eForma de organizar los datos\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo al describir una función\"\u003eLista ordenada, valor que se busca por su nombre\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto\"\u003eObjeto\u003c/td\u003e\n\u003ctd data-label=\"Definición sencilla\"\u003eUnidad que agrupa estados y comportamientos relacionados\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo al describir una función\"\u003eTítulo de una publicación y función para editarla\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto\"\u003eGestión de excepciones\u003c/td\u003e\n\u003ctd data-label=\"Definición sencilla\"\u003eForma de responder a errores que surgen durante la ejecución\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo al describir una función\"\u003eAviso de error cuando no se puede leer un archivo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto\"\u003eAPI\u003c/td\u003e\n\u003ctd data-label=\"Definición sencilla\"\u003eAcuerdo para intercambiar funciones o datos entre programas\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo al describir una función\"\u003eSolicitar resultados de búsqueda al servidor\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto\"\u003eDependencia\u003c/td\u003e\n\u003ctd data-label=\"Definición sencilla\"\u003eCódigo o herramienta externa que utiliza un programa\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo al describir una función\"\u003eBiblioteca para manejar fechas\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003cp\u003eLa comprobación estática de tipos revisa el uso de los tipos antes de la ejecución. Los lenguajes de tipado dinámico también distinguen los tipos de los valores. Que el tipado sea dinámico no significa que no existan clases de datos.\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#por-qu%C3%A9-se-pas%C3%B3-del-lenguaje-m%C3%A1quina-a-los-lenguajes-de-alto-nivel\" class=\"anchor\" id=\"por-qué-se-pasó-del-lenguaje-máquina-a-los-lenguajes-de-alto-nivel\"\u003e\u003c/a\u003ePor qué se pasó del lenguaje máquina a los lenguajes de alto nivel\u003c/h2\u003e\n\u003cp\u003eLa evolución de los lenguajes ha ido reduciendo las tareas detalladas que las personas tienen que expresar. El lenguaje máquina representa las instrucciones que ejecuta el procesador. El lenguaje ensamblador asigna a esas instrucciones símbolos que las personas pueden leer.\u003c/p\u003e\n\u003cp\u003eEl ensamblador está estrechamente vinculado al conjunto de instrucciones del procesador. Cambiar un componente no significa tener que reescribir todo el código. El esfuerzo de modificación aumenta al pasar a un conjunto de instrucciones incompatible.\u003c/p\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eLenguaje o corriente\u003c/th\u003e\n\u003cth\u003eProblema que buscaba resolver\u003c/th\u003e\n\u003cth\u003eConcepto que conviene recordar\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Lenguaje o corriente\"\u003eLenguaje máquina y ensamblador\u003c/td\u003e\n\u003ctd data-label=\"Problema que buscaba resolver\"\u003eIndicar al hardware las tareas que debe hacer\u003c/td\u003e\n\u003ctd data-label=\"Concepto que conviene recordar\"\u003eVínculo directo con el conjunto de instrucciones\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Lenguaje o corriente\"\u003eFortran\u003c/td\u003e\n\u003ctd data-label=\"Problema que buscaba resolver\"\u003eExpresar cálculos científicos de forma cercana a las fórmulas\u003c/td\u003e\n\u003ctd data-label=\"Concepto que conviene recordar\"\u003eCálculo numérico y compiladores\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Lenguaje o corriente\"\u003eCOBOL\u003c/td\u003e\n\u003ctd data-label=\"Problema que buscaba resolver\"\u003eProcesar datos empresariales en un formato fácil de leer\u003c/td\u003e\n\u003ctd data-label=\"Concepto que conviene recordar\"\u003eExpresión centrada en libros contables y transacciones\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Lenguaje o corriente\"\u003eLisp\u003c/td\u003e\n\u003ctd data-label=\"Problema que buscaba resolver\"\u003eCálculo mediante símbolos y listas\u003c/td\u003e\n\u003ctd data-label=\"Concepto que conviene recordar\"\u003ePrimeras investigaciones en IA y expresión centrada en funciones\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Lenguaje o corriente\"\u003eC\u003c/td\u003e\n\u003ctd data-label=\"Problema que buscaba resolver\"\u003eEscribir software de sistemas de forma eficiente\u003c/td\u003e\n\u003ctd data-label=\"Concepto que conviene recordar\"\u003eControl de memoria y portabilidad\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Lenguaje o corriente\"\u003eSQL\u003c/td\u003e\n\u003ctd data-label=\"Problema que buscaba resolver\"\u003eProcesar datos de bases de datos relacionales\u003c/td\u003e\n\u003ctd data-label=\"Concepto que conviene recordar\"\u003eConsultas que declaran el resultado deseado\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Lenguaje o corriente\"\u003eC++\u003c/td\u003e\n\u003ctd data-label=\"Problema que buscaba resolver\"\u003eEstructurar programas grandes y gestionar recursos\u003c/td\u003e\n\u003ctd data-label=\"Concepto que conviene recordar\"\u003eClases y diversas formas de programación\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Lenguaje o corriente\"\u003eJava\u003c/td\u003e\n\u003ctd data-label=\"Problema que buscaba resolver\"\u003ePortabilidad entre sistemas con distintos entornos de ejecución\u003c/td\u003e\n\u003ctd data-label=\"Concepto que conviene recordar\"\u003eJVM y bytecode\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003cp\u003eFortran apareció en IBM en 1957. Lisp evolucionó junto con la investigación en IA a finales de la década de 1950. COBOL surgió de un trabajo de diseño conjunto iniciado en 1959.\u003c/p\u003e\n\u003cp\u003eC es un lenguaje que evolucionó junto con el desarrollo de Unix. Contribuyó a trasladar software entre distintos tipos de máquinas. Sin embargo, el código que depende del sistema operativo y del hardware necesita modificaciones específicas.\u003c/p\u003e\n\u003cp\u003eLa orientación a objetos organiza los datos y comportamientos relacionados en objetos. C++ es un lenguaje que admite la orientación a objetos. C++ no creó el concepto de orientación a objetos.\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#diferencia-entre-compilador-e-int%C3%A9rprete\" class=\"anchor\" id=\"diferencia-entre-compilador-e-intérprete\"\u003e\u003c/a\u003eDiferencia entre compilador e intérprete\u003c/h2\u003e\n\u003cp\u003eUn compilador es un programa que transforma el código en otra representación. El resultado puede ser lenguaje máquina. También puede ser un formato intermedio de ejecución, como el bytecode.\u003c/p\u003e\n\u003cp\u003eUn intérprete ejecuta el código o una representación intermedia mientras lo interpreta. Las implementaciones reales de los lenguajes también pueden combinar compilación e interpretación. Es inexacto dividir los lenguajes únicamente en compilados rápidos e interpretados lentos.\u003c/p\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eConcepto relacionado con la ejecución\u003c/th\u003e\n\u003cth\u003eFunción\u003c/th\u003e\n\u003cth\u003eEjemplo representativo\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto relacionado con la ejecución\"\u003eCompilación anticipada\u003c/td\u003e\n\u003ctd data-label=\"Función\"\u003eGenerar el código de destino antes de la ejecución\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo representativo\"\u003eGeneración habitual de archivos ejecutables en C y Rust\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto relacionado con la ejecución\"\u003eBytecode\u003c/td\u003e\n\u003ctd data-label=\"Función\"\u003eFormato de instrucciones intermedias que procesa el entorno de ejecución\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo representativo\"\u003eBytecode de Java, bytecode de CPython\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto relacionado con la ejecución\"\u003eIntérprete\u003c/td\u003e\n\u003ctd data-label=\"Función\"\u003eEjecutar el código o las instrucciones intermedias mientras los interpreta\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo representativo\"\u003eEjecución del bytecode en CPython\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto relacionado con la ejecución\"\u003eCompilación JIT\u003c/td\u003e\n\u003ctd data-label=\"Función\"\u003eConvertir el código necesario a lenguaje máquina durante la ejecución\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo representativo\"\u003eDiversas JVM y motores de JavaScript\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Concepto relacionado con la ejecución\"\u003eEntorno de ejecución\u003c/td\u003e\n\u003ctd data-label=\"Función\"\u003eProporcionar las funciones necesarias para ejecutar el programa\u003c/td\u003e\n\u003ctd data-label=\"Ejemplo representativo\"\u003eJVM, Node.js\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003cp\u003eCPython es una implementación de Python de uso extendido. Compila el código fuente a bytecode y lo ejecuta. Es incorrecto describir Python solo como un lenguaje que traduce el código fuente línea por línea en cada ejecución.\u003c/p\u003e\n\u003cp\u003eLa JVM de Java es un entorno que ejecuta bytecode. Esta estructura ayuda a ejecutar el código en distintos sistemas operativos. La compatibilidad real también depende de la versión de la JVM y de las bibliotecas externas.\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#en-qu%C3%A9-se-diferencian-la-interfaz-web-y-el-servidor\" class=\"anchor\" id=\"en-qué-se-diferencian-la-interfaz-web-y-el-servidor\"\u003e\u003c/a\u003e¿En qué se diferencian la interfaz web y el servidor?\u003c/h2\u003e\n\u003cp\u003eEl frontend se encarga de la interfaz y las interacciones que encuentra el usuario. El backend procesa las peticiones en el servidor. La base de datos almacena y consulta los datos necesarios.\u003c/p\u003e\n\u003cp\u003eHTML es un lenguaje de marcado que expresa la estructura de los documentos. CSS define el estilo y la distribución visual. JavaScript implementa la evaluación de condiciones y la gestión de las acciones del usuario.\u003c/p\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eNombre\u003c/th\u003e\n\u003cth\u003eClasificación\u003c/th\u003e\n\u003cth\u003eFunción principal\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Nombre\"\u003eHTML\u003c/td\u003e\n\u003ctd data-label=\"Clasificación\"\u003eLenguaje de marcado\u003c/td\u003e\n\u003ctd data-label=\"Función principal\"\u003eEstructura del documento, como títulos, párrafos y campos de entrada\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Nombre\"\u003eCSS\u003c/td\u003e\n\u003ctd data-label=\"Clasificación\"\u003eLenguaje de hojas de estilo\u003c/td\u003e\n\u003ctd data-label=\"Función principal\"\u003eColores, espaciado y distribución visual\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Nombre\"\u003eJavaScript\u003c/td\u003e\n\u003ctd data-label=\"Clasificación\"\u003eLenguaje de programación\u003c/td\u003e\n\u003ctd data-label=\"Función principal\"\u003eInteracciones en el navegador y procesamiento en el servidor\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Nombre\"\u003eTypeScript\u003c/td\u003e\n\u003ctd data-label=\"Clasificación\"\u003eLenguaje que añade un sistema de tipos a JavaScript\u003c/td\u003e\n\u003ctd data-label=\"Función principal\"\u003eDetección de errores antes de la ejecución y gestión del código\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Nombre\"\u003eReact\u003c/td\u003e\n\u003ctd data-label=\"Clasificación\"\u003eBiblioteca de interfaces de usuario\u003c/td\u003e\n\u003ctd data-label=\"Función principal\"\u003eCrear interfaces con componentes reutilizables\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Nombre\"\u003eNode.js\u003c/td\u003e\n\u003ctd data-label=\"Clasificación\"\u003eEntorno de ejecución de JavaScript\u003c/td\u003e\n\u003ctd data-label=\"Función principal\"\u003eEjecutar JavaScript fuera del navegador\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Nombre\"\u003eNext.js\u003c/td\u003e\n\u003ctd data-label=\"Clasificación\"\u003eFramework basado en React\u003c/td\u003e\n\u003ctd data-label=\"Función principal\"\u003eOrganización de páginas y funciones de servidor para aplicaciones web\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Nombre\"\u003ePHP\u003c/td\u003e\n\u003ctd data-label=\"Clasificación\"\u003eLenguaje de programación\u003c/td\u003e\n\u003ctd data-label=\"Función principal\"\u003eGenerar respuestas web dinámicas en el servidor\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Nombre\"\u003eSQL\u003c/td\u003e\n\u003ctd data-label=\"Clasificación\"\u003eLenguaje de bases de datos\u003c/td\u003e\n\u003ctd data-label=\"Función principal\"\u003eConsultar, añadir, modificar y eliminar datos\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003cp\u003eReact, Node.js y Next.js no son herramientas del mismo tipo. Una biblioteca es un conjunto de código del que se toman las funciones necesarias. Un framework también ofrece una forma de organizar la aplicación. Un entorno de ejecución es el entorno en el que se ejecuta el código.\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#comparaci%C3%B3n-de-lenguajes-seg%C3%BAn-el-objetivo\" class=\"anchor\" id=\"comparación-de-lenguajes-según-el-objetivo\"\u003e\u003c/a\u003eComparación de lenguajes según el objetivo\u003c/h2\u003e\n\u003cp\u003eElige el lenguaje según lo que quieras crear y el entorno de ejecución existente. La siguiente tabla ofrece un punto de partida habitual para considerar cada lenguaje. Un lenguaje no se limita a las tareas que figuran en la tabla.\u003c/p\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eQué quieres crear\u003c/th\u003e\n\u003cth\u003eLenguajes que considerar primero\u003c/th\u003e\n\u003cth\u003eQué comprobar antes de elegir\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Qué quieres crear\"\u003eAplicación web que se usa en el navegador\u003c/td\u003e\n\u003ctd data-label=\"Lenguajes que considerar primero\"\u003eJavaScript, TypeScript\u003c/td\u003e\n\u003ctd data-label=\"Qué comprobar antes de elegir\"\u003eFundamentos de HTML y CSS y herramientas para crear interfaces\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Qué quieres crear\"\u003eOrganización de archivos y automatización de tareas\u003c/td\u003e\n\u003ctd data-label=\"Lenguajes que considerar primero\"\u003ePython\u003c/td\u003e\n\u003ctd data-label=\"Qué comprobar antes de elegir\"\u003eFormato de los archivos de entrada y entorno de despliegue\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Qué quieres crear\"\u003eAnálisis de datos y uso de modelos de IA\u003c/td\u003e\n\u003ctd data-label=\"Lenguajes que considerar primero\"\u003ePython\u003c/td\u003e\n\u003ctd data-label=\"Qué comprobar antes de elegir\"\u003eBibliotecas de análisis y modelos necesarias\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Qué quieres crear\"\u003eServidores de red y herramientas de operación\u003c/td\u003e\n\u003ctd data-label=\"Lenguajes que considerar primero\"\u003eGo\u003c/td\u003e\n\u003ctd data-label=\"Qué comprobar antes de elegir\"\u003eEstructura de procesamiento concurrente e integración con sistemas existentes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Qué quieres crear\"\u003eSistemas empresariales basados en JVM\u003c/td\u003e\n\u003ctd data-label=\"Lenguajes que considerar primero\"\u003eJava, Kotlin\u003c/td\u003e\n\u003ctd data-label=\"Qué comprobar antes de elegir\"\u003eCompatibilidad con el código y las bibliotecas existentes\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Qué quieres crear\"\u003eAplicaciones centradas en iOS\u003c/td\u003e\n\u003ctd data-label=\"Lenguajes que considerar primero\"\u003eSwift\u003c/td\u003e\n\u003ctd data-label=\"Qué comprobar antes de elegir\"\u003eHerramientas de desarrollo de Apple y funciones de la plataforma\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Qué quieres crear\"\u003eAplicaciones centradas en Android\u003c/td\u003e\n\u003ctd data-label=\"Lenguajes que considerar primero\"\u003eKotlin\u003c/td\u003e\n\u003ctd data-label=\"Qué comprobar antes de elegir\"\u003eHerramientas de desarrollo de Android y estructura de la aplicación existente\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Qué quieres crear\"\u003eSistemas que necesitan control de memoria\u003c/td\u003e\n\u003ctd data-label=\"Lenguajes que considerar primero\"\u003eC, C++, Rust\u003c/td\u003e\n\u003ctd data-label=\"Qué comprobar antes de elegir\"\u003eRequisitos de rendimiento y capacidad para verificar la seguridad\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Qué quieres crear\"\u003eOptimización de cálculos en CPU y GPU\u003c/td\u003e\n\u003ctd data-label=\"Lenguajes que considerar primero\"\u003eMojo\u003c/td\u003e\n\u003ctd data-label=\"Qué comprobar antes de elegir\"\u003eHardware compatible y funciones de cálculo necesarias\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Qué quieres crear\"\u003eProcesamiento de datos relacionales\u003c/td\u003e\n\u003ctd data-label=\"Lenguajes que considerar primero\"\u003eSQL\u003c/td\u003e\n\u003ctd data-label=\"Qué comprobar antes de elegir\"\u003eDiferencias de sintaxis entre productos de bases de datos\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003cp\u003eLa utilidad de Python también está relacionada con su ecosistema de bibliotecas. NumPy usa código compilado para ganar velocidad. No todos los cálculos escritos en Python se ejecutan solo con código Python.\u003c/p\u003e\n\u003cp\u003eGo incluye soporte para la concurrencia en el diseño del lenguaje. La concurrencia consiste en organizar varias tareas para que avancen de forma conjunta. El paralelismo es el estado en el que varias tareas se ejecutan realmente al mismo tiempo. Escribir código concurrente no acelera automáticamente los cálculos.\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#diferencias-entre-typescript-rust-y-mojo\" class=\"anchor\" id=\"diferencias-entre-typescript-rust-y-mojo\"\u003e\u003c/a\u003eDiferencias entre TypeScript, Rust y Mojo\u003c/h2\u003e\n\u003cp\u003eTypeScript, Rust y Mojo buscan resolver problemas distintos. TypeScript ayuda a comprobar los tipos en el código JavaScript. Rust impone reglas estrictas para la gestión de memoria. Mojo se orienta a los cálculos de alto rendimiento y al aprovechamiento del hardware.\u003c/p\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eCriterio de comparación\u003c/th\u003e\n\u003cth\u003eTypeScript\u003c/th\u003e\n\u003cth\u003eRust\u003c/th\u003e\n\u003cth\u003eMojo\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Criterio de comparación\"\u003eEnfoque principal\u003c/td\u003e\n\u003ctd data-label=\"TypeScript\"\u003eComprobación de tipos y gestión del código\u003c/td\u003e\n\u003ctd data-label=\"Rust\"\u003eSeguridad de memoria y control del sistema\u003c/td\u003e\n\u003ctd data-label=\"Mojo\"\u003eCálculos de alto rendimiento en CPU y GPU\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Criterio de comparación\"\u003eUsos representativos\u003c/td\u003e\n\u003ctd data-label=\"TypeScript\"\u003eAplicaciones web y de servidor\u003c/td\u003e\n\u003ctd data-label=\"Rust\"\u003eHerramientas de sistemas y componentes centrados en el rendimiento\u003c/td\u003e\n\u003ctd data-label=\"Mojo\"\u003eInfraestructura de IA y núcleos de cálculo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Criterio de comparación\"\u003eConceptos que conviene entender primero\u003c/td\u003e\n\u003ctd data-label=\"TypeScript\"\u003eJavaScript y tipos de datos\u003c/td\u003e\n\u003ctd data-label=\"Rust\"\u003ePropiedad, préstamos y tiempos de vida\u003c/td\u003e\n\u003ctd data-label=\"Mojo\"\u003eTipos, memoria y cálculo paralelo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Criterio de comparación\"\u003eAspectos que deben comprobarse aparte\u003c/td\u003e\n\u003ctd data-label=\"TypeScript\"\u003eEntradas externas y reglas de negocio\u003c/td\u003e\n\u003ctd data-label=\"Rust\"\u003eCódigo unsafe y errores lógicos\u003c/td\u003e\n\u003ctd data-label=\"Mojo\"\u003eIntegración con Python y compatibilidad con el hardware\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003ch3\u003e\n\u003ca href=\"#comprobaci%C3%B3n-de-tipos-en-typescript\" class=\"anchor\" id=\"comprobación-de-tipos-en-typescript\"\u003e\u003c/a\u003eComprobación de tipos en TypeScript\u003c/h3\u003e\n\u003cp\u003eTypeScript añade comprobación estática de tipos a JavaScript. Ayuda a encontrar código que usa mal los tipos antes de ejecutarlo. La inferencia de tipos permite deducir automáticamente algunas declaraciones.\u003c/p\u003e\n\u003cp\u003eNo hace falta escribir el tipo de cada variable. Las anotaciones de tipo se eliminan durante la conversión habitual a JavaScript. Las declaraciones de tipos por sí solas no generan comprobaciones de entrada durante la ejecución.\u003c/p\u003e\n\u003ch3\u003e\n\u003ca href=\"#propiedad-y-seguridad-de-memoria-en-rust\" class=\"anchor\" id=\"propiedad-y-seguridad-de-memoria-en-rust\"\u003e\u003c/a\u003ePropiedad y seguridad de memoria en Rust\u003c/h3\u003e\n\u003cp\u003eLa propiedad es el conjunto de reglas que determina quién gestiona la memoria de un valor. El préstamo permite hacer referencia a un valor sin transferir su propiedad. El compilador comprueba las reglas correspondientes para prevenir errores de memoria.\u003c/p\u003e\n\u003cp\u003eLas garantías de seguridad de Rust parten de una implementación correcta. En el código unsafe, quien lo escribe se responsabiliza de algunas condiciones de seguridad. El lenguaje no impide automáticamente los errores en fórmulas de cálculo o permisos de acceso.\u003c/p\u003e\n\u003ch3\u003e\n\u003ca href=\"#relaci%C3%B3n-entre-mojo-y-python\" class=\"anchor\" id=\"relación-entre-mojo-y-python\"\u003e\u003c/a\u003eRelación entre Mojo y Python\u003c/h3\u003e\n\u003cp\u003eMojo es un lenguaje independiente que usa una sintaxis parecida a la de Python. Permite escribir código de alto rendimiento para CPU y GPU. También ofrece funciones de interoperabilidad para conectarse con código Python.\u003c/p\u003e\n\u003cp\u003eNo debes suponer que puedes trasladar el código Python existente sin cambios. Comprueba las funciones que necesitas en la documentación de la versión de Mojo que vayas a instalar. Para usar una GPU, también deben cumplirse los requisitos de dispositivos compatibles y controladores.\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#errores-frecuentes-al-explicar-los-lenguajes\" class=\"anchor\" id=\"errores-frecuentes-al-explicar-los-lenguajes\"\u003e\u003c/a\u003eErrores frecuentes al explicar los lenguajes\u003c/h2\u003e\n\u003cp\u003eLas presentaciones breves de lenguajes suelen omitir las condiciones de aplicación. También hay que distinguir los hechos históricos de las funciones actuales. Los siguientes malentendidos pueden dificultar la elección de un lenguaje.\u003c/p\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eExplicación habitual\u003c/th\u003e\n\u003cth\u003eQué hay que entender con precisión\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Explicación habitual\"\u003eJavaScript es la versión web de Java\u003c/td\u003e\n\u003ctd data-label=\"Qué hay que entender con precisión\"\u003eSon lenguajes distintos\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Explicación habitual\"\u003eHTML y CSS aparecieron en 1991\u003c/td\u003e\n\u003ctd data-label=\"Qué hay que entender con precisión\"\u003eLa recomendación de CSS1 del W3C es del 17 de diciembre de 1996\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Explicación habitual\"\u003eKotlin es un lenguaje creado por Google\u003c/td\u003e\n\u003ctd data-label=\"Qué hay que entender con precisión\"\u003eLo desarrolla JetBrains; Google ofrece soporte en Android\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Explicación habitual\"\u003eEl código C se ejecuta en cualquier lugar si se vuelve a compilar\u003c/td\u003e\n\u003ctd data-label=\"Qué hay que entender con precisión\"\u003eLas partes que dependen del sistema operativo o del hardware pueden necesitar cambios\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Explicación habitual\"\u003ePython ocupa hoy el puesto 1 en popularidad\u003c/td\u003e\n\u003ctd data-label=\"Qué hay que entender con precisión\"\u003ePara valorarlo hay que conocer la entidad que hace el estudio, la fecha y el método de cálculo\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Explicación habitual\"\u003eUsar Rust resuelve todos los problemas de seguridad\u003c/td\u003e\n\u003ctd data-label=\"Qué hay que entender con precisión\"\u003eLa seguridad de memoria y la verificación de permisos de acceso son cuestiones distintas\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Explicación habitual\"\u003eUsar Mojo acelera todas las tareas de Python\u003c/td\u003e\n\u003ctd data-label=\"Qué hay que entender con precisión\"\u003eHay que medir según la tarea, la implementación y el hardware\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Explicación habitual\"\u003eLa palabra bug nació del incidente del insecto\u003c/td\u003e\n\u003ctd data-label=\"Qué hay que entender con precisión\"\u003eEse incidente popularizó un término que ya se usaba\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003cp\u003eEl famoso registro en el que se encontró un insecto corresponde al caso de Harvard Mark II en 1947. Smithsonian explica que este incidente contribuyó a popularizar el término. Es inexacto presentarlo como un caso de ENIAC o como el origen del término.\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#c%C3%B3mo-deben-interpretarse-las-cifras-de-rendimiento\" class=\"anchor\" id=\"cómo-deben-interpretarse-las-cifras-de-rendimiento\"\u003e\u003c/a\u003e¿Cómo deben interpretarse las cifras de rendimiento?\u003c/h2\u003e\n\u003cp\u003eLas cifras de rendimiento deben interpretarse solo para la tarea medida. El tiempo de compilación y la velocidad de ejecución de la aplicación terminada son métricas distintas. Que una herramienta de desarrollo sea más rápida no significa que una página web se acelere en la misma proporción.\u003c/p\u003e\n\u003cp\u003eMicrosoft anunció la transición de las herramientas de TypeScript a una implementación nativa. El anuncio del 11 de marzo de 2025 incluye mediciones por proyecto. A continuación se muestra el caso de la base de código de VS Code incluido en ese anuncio.\u003c/p\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eTarea medida\u003c/th\u003e\n\u003cth\u003eImplementación anterior\u003c/th\u003e\n\u003cth\u003eImplementación nativa\u003c/th\u003e\n\u003cth\u003eAumento de velocidad anunciado\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Tarea medida\"\u003eCompilación de TypeScript de la base de código de VS Code\u003c/td\u003e\n\u003ctd data-label=\"Implementación anterior\"\u003e77.8 segundos\u003c/td\u003e\n\u003ctd data-label=\"Implementación nativa\"\u003e7.5 segundos\u003c/td\u003e\n\u003ctd data-label=\"Aumento de velocidad anunciado\"\u003e10.4 veces\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003cp\u003eEn las condiciones del anuncio, el tiempo de procesamiento se redujo a \u003cstrong\u003e7.5 segundos\u003c/strong\u003e. Al calcular la diferencia, se trata de una reducción de 70.3 segundos en una ejecución de la tarea. Esto no significa que todos los proyectos obtengan el mismo resultado.\u003c/p\u003e\n\u003cp\u003eAplica el mismo principio al comparar la velocidad de Python y C. Hay que comprobar si se han ejecutado con la misma entrada y el mismo algoritmo. Las opciones de compilación y las bibliotecas utilizadas también forman parte de las condiciones de comparación. Es difícil usar cifras sin información sobre el entorno de ejecución como un factor general de velocidad.\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#comprobaci%C3%B3n-de-tipos-y-validaci%C3%B3n-de-entradas-externas\" class=\"anchor\" id=\"comprobación-de-tipos-y-validación-de-entradas-externas\"\u003e\u003c/a\u003eComprobación de tipos y validación de entradas externas\u003c/h2\u003e\n\u003cp\u003eAunque se supere la comprobación de tipos, el contenido de los datos externos debe comprobarse aparte. Esta diferencia se pasa por alto con frecuencia al revisar código generado por IA. Las declaraciones de tipos expresan la forma de los valores que espera el programa.\u003c/p\u003e\n\u003cp\u003ePiensa en una aplicación web que declara una cantidad con un tipo numérico. Una API externa podría enviar en realidad una cadena. Añadir un nombre de tipo o hacer una aserción de tipo no valida el valor. Hace falta código que compruebe los datos durante la ejecución.\u003c/p\u003e\n\u003cdiv class=\"overflow-x-auto\"\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eEtapa de comprobación\u003c/th\u003e\n\u003cth\u003eQué se comprueba\u003c/th\u003e\n\u003cth\u003eProblema que queda aunque se supere\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Etapa de comprobación\"\u003eComprobación de tipos\u003c/td\u003e\n\u003ctd data-label=\"Qué se comprueba\"\u003eUso de los tipos dentro del código\u003c/td\u003e\n\u003ctd data-label=\"Problema que queda aunque se supere\"\u003eValores que llegan realmente del exterior\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Etapa de comprobación\"\u003eValidación de entradas\u003c/td\u003e\n\u003ctd data-label=\"Qué se comprueba\"\u003eFormato de los datos y rango permitido\u003c/td\u003e\n\u003ctd data-label=\"Problema que queda aunque se supere\"\u003eSi el usuario tiene permitido hacer la acción\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Etapa de comprobación\"\u003eComprobación de permisos\u003c/td\u003e\n\u003ctd data-label=\"Qué se comprueba\"\u003ePermisos de acceso de quien hace la petición\u003c/td\u003e\n\u003ctd data-label=\"Problema que queda aunque se supere\"\u003eSi el resultado cumple las reglas de negocio\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd data-label=\"Etapa de comprobación\"\u003ePruebas funcionales\u003c/td\u003e\n\u003ctd data-label=\"Qué se comprueba\"\u003eResultado real con las entradas previstas\u003c/td\u003e\n\u003ctd data-label=\"Problema que queda aunque se supere\"\u003eCondiciones que no se han probado\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/div\u003e\n\u003cp\u003eEsta tabla es un marco de revisión que tiene en cuenta la eliminación de tipos y el alcance de la seguridad de memoria. Separa lo que garantiza el lenguaje de lo que debe comprobar el servicio. Pide a la IA que distinga las comprobaciones de cada etapa.\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#c%C3%B3mo-explicar-una-funci%C3%B3n-a-la-ia\" class=\"anchor\" id=\"cómo-explicar-una-función-a-la-ia\"\u003e\u003c/a\u003eCómo explicar una función a la IA\u003c/h2\u003e\n\u003cp\u003eAl pedir una función, escribe tanto la entrada como el resultado esperado. Si solo defines el nombre del programa, es fácil que falten las condiciones de funcionamiento. Si ya existe un proyecto, indica también el lenguaje y la versión que utiliza.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eEscribe el entorno que se usará.\u003c/li\u003e\n\u003cli\u003eDescribe la forma de la entrada que se procesará.\u003c/li\u003e\n\u003cli\u003eDefine el resultado para una entrada válida.\u003c/li\u003e\n\u003cli\u003eDefine cómo tratar los valores vacíos y las entradas incorrectas.\u003c/li\u003e\n\u003cli\u003ePide también el motivo de los cambios y cómo comprobarlos.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eEl siguiente ejemplo de prompt divide los requisitos. Adapta el contenido real de los archivos al proyecto. Debes ejecutar por tu cuenta el resultado generado para comprobarlo.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e\u003cspan\u003eComprueba primero el lenguaje y el entorno de ejecución del proyecto existente.\n\u003c/span\u003e\u003cspan\u003eLee las filas que tengan título de un archivo CSV y muéstralas en una lista.\n\u003c/span\u003e\u003cspan\u003eSi falta una columna obligatoria, muestra un mensaje de error.\n\u003c/span\u003e\u003cspan\u003eInforma por separado de las filas cuyo título esté vacío.\n\u003c/span\u003e\u003cspan\u003eSepara el código de validación de entradas externas del código de visualización.\n\u003c/span\u003e\u003cspan\u003eComprueba primero si se puede implementar con las dependencias existentes.\n\u003c/span\u003e\u003cspan\u003eExplica los cambios y cómo probarlos.\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eSi surge un error, indica también las condiciones para reproducirlo. Los mensajes de error contienen pistas para acotar dónde se ha producido. La documentación de Copilot de GitHub también exige revisar el código generado. Antes de adoptar el código, es necesario comprobar los resultados de su ejecución.\u003c/p\u003e\n\u003ch2\u003e\n\u003ca href=\"#criterios-para-empezar-a-aprender-y-elegir-una-formaci%C3%B3n\" class=\"anchor\" id=\"criterios-para-empezar-a-aprender-y-elegir-una-formación\"\u003e\u003c/a\u003eCriterios para empezar a aprender y elegir una formación\u003c/h2\u003e\n\u003cp\u003ePuedes empezar a aprender con un alcance reducido y centrado en la tarea que quieres crear. Si se trata de desarrollo web, prueba primero a conectar la estructura de la interfaz con su comportamiento. Si se trata de automatización, conviene empezar por comprobar la entrada de archivos y el guardado de resultados.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eElige un lenguaje adecuado para lo que quieres crear.\u003c/li\u003e\n\u003cli\u003eAprende variables, tipos, condicionales, bucles y funciones.\u003c/li\u003e\n\u003cli\u003eEscribe una función pequeña y compara los resultados de ejecución.\u003c/li\u003e\n\u003cli\u003eIntroduce datos incorrectos para comprobar el comportamiento ante fallos.\u003c/li\u003e\n\u003cli\u003eIntenta explicar con tus propias palabras por qué has modificado el código.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eAl elegir un curso, comprueba qué se enseña a verificar, además de ver la pantalla del resultado. Puedes revisar si incluye ejercicios para reproducir y corregir errores. También conviene comprobar si especifica las versiones y el entorno de ejecución utilizados.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eExplicación del código: proceso para explicar las entradas y salidas de las funciones generadas\u003c/li\u003e\n\u003cli\u003eGestión de errores: ejercicios para leer mensajes de error y acotar la causa\u003c/li\u003e\n\u003cli\u003eValidación de datos: ejemplos para tratar las entradas externas y las condiciones de fallo\u003c/li\u003e\n\u003cli\u003eReproducibilidad: instrucciones para volver a ejecutar el código en el mismo entorno\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuedes consultar la definición de cada lenguaje en la documentación oficial de su proyecto. TypeScript Handbook incluye una explicación sobre la eliminación de tipos. El libro oficial de Rust explica por separado la propiedad y unsafe. En Mojo Manual, consulta las funciones del lenguaje y el alcance de la integración con Python.\u003c/p\u003e\n","tags":["IA generativa","Ingeniería de prompts","Desarrollo de IA","Programación con IA","Herramientas de desarrollo"],"faqs":[{"question":"¿Tengo que aprender todos los lenguajes antes de empezar con el vibe coding?","answer":"No es necesario aprender todos los lenguajes. Elige primero el lenguaje adecuado para lo que quieras crear. Entender las variables, los tipos, las funciones y dónde se ejecuta el código te permite concretar las peticiones."},{"question":"¿Con qué debería empezar en desarrollo web: JavaScript o Python?","answer":"Para crear el comportamiento de la interfaz en el navegador, JavaScript es el punto de partida. Aprende también qué papel tienen HTML y CSS. Puedes considerar Python como punto de partida para automatizar tareas con archivos y procesar datos."},{"question":"Si uso TypeScript, ¿no necesito saber JavaScript?","answer":"Para entender cómo se ejecuta TypeScript, necesitas conocimientos básicos de JavaScript. TypeScript añade un sistema de tipos a JavaScript. Distingue entre la comprobación de tipos y la ejecución real."},{"question":"¿En TypeScript hay que indicar el tipo de todas las variables?","answer":"No hace falta indicar el tipo donde sea posible inferirlo. La herramienta determina el tipo a partir del valor asignado y del contexto. Decide si necesitas un tipo explícito según la función del código."},{"question":"¿React y Node.js también son lenguajes de programación?","answer":"React es una biblioteca de interfaces de usuario. Node.js es un entorno de ejecución de JavaScript. Next.js se clasifica como un framework basado en React."},{"question":"¿Python traduce y ejecuta el código fuente línea por línea?","answer":"CPython, la implementación de referencia, compila el código fuente a bytecode. Después ejecuta ese bytecode. Es difícil explicar este proceso diciendo solo que el código fuente se traduce línea por línea."},{"question":"Si uso Rust, ¿no hace falta revisar la seguridad?","answer":"La seguridad de memoria de Rust no implica la seguridad del servicio en su conjunto. Los permisos de acceso y las reglas de negocio deben comprobarse por separado. También deben revisarse las condiciones de seguridad del código unsafe."},{"question":"¿Mojo es una nueva versión de Python?","answer":"Mojo es un lenguaje independiente con una sintaxis similar a la de Python. Ofrece funciones de integración con Python. Comprueba la compatibilidad del código existente en la documentación oficial de la versión que vayas a usar."},{"question":"¿Es imprescindible tener una GPU para usar Mojo?","answer":"Mojo también permite escribir código para CPU. La GPU no es un requisito para todos los programas. Si usas funciones de GPU, comprueba qué dispositivos y controladores son compatibles."},{"question":"¿La concurrencia de Go significa lo mismo que el procesamiento en paralelo?","answer":"La concurrencia consiste en organizar varias tareas para que avancen de forma conjunta. El paralelismo es el estado en el que varias tareas se ejecutan realmente al mismo tiempo. La concurrencia por sí sola no garantiza una mayor velocidad de ejecución."},{"question":"¿Google desarrolló Kotlin?","answer":"JetBrains es quien desarrolla Kotlin. Google ofrece soporte para Kotlin en el desarrollo de Android. Hay que distinguir entre quien creó el lenguaje y quien le da soporte en la plataforma."},{"question":"Si el compilador de TypeScript se vuelve más rápido, ¿la aplicación también será más rápida en la misma proporción?","answer":"El tiempo de compilación y el tiempo de ejecución de la aplicación son métricas distintas. Los ejemplos de rendimiento de Microsoft se refieren al tiempo de procesamiento de las herramientas de desarrollo. La velocidad de respuesta de la aplicación debe medirse por separado."},{"question":"Si el código creado por la IA pasa la comprobación de tipos, ¿ya está terminado?","answer":"La comprobación de tipos por sí sola no permite determinar si una función está completa. Hay que comprobar las entradas externas y los permisos de acceso. Haz pruebas para verificar que se obtienen los resultados esperados en condiciones normales y de fallo."},{"question":"¿Qué criterios hay que seguir para elegir una formación en vibe coding?","answer":"Comprueba si hay ejercicios prácticos para explicar y modificar el código generado. También puedes ver si se tratan la reproducción de errores y la validación de entradas. Los cursos que indican la versión utilizada y el entorno de ejecución permiten comprobar fácilmente las condiciones de reproducción."}],"sources":[{"url":"https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html","title":"Documentación oficial de TypeScript: TypeScript for JavaScript Programmers","type":"source"},{"url":"https://www.typescriptlang.org/docs/handbook/2/basic-types","title":"TypeScript Handbook: The Basics, comprobación y eliminación de tipos","type":"source"},{"url":"https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html","title":"The Rust Programming Language: What Is Ownership?","type":"source"},{"url":"https://doc.rust-lang.org/book/ch20-01-unsafe-rust.html","title":"The Rust Programming Language: Unsafe Rust","type":"source"},{"url":"https://docs.modular.com/mojo/manual/","title":"Mojo Manual: descripción general del lenguaje e integración con Python","type":"source"},{"url":"https://docs.modular.com/mojo/requirements/","title":"Mojo System Requirements: requisitos de compatibilidad con CPU y GPU","type":"source"},{"url":"https://docs.python.org/3/glossary.html","title":"Glosario oficial de Python: bytecode y conceptos relacionados con la ejecución","type":"source"},{"url":"https://numpy.org/doc/2.0/building/index.html","title":"NumPy 2.0 Manual: Building from source","type":"source"},{"url":"https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Scripting/What_is_JavaScript","title":"MDN: What is JavaScript?","type":"source"},{"url":"https://nodejs.org/learn/getting-started/introduction-to-nodejs","title":"Documentación oficial de Node.js: Introduction to Node.js","type":"source"},{"url":"https://react.dev/","title":"Documentación oficial de React: biblioteca de interfaces de usuario","type":"source"},{"url":"https://nextjs.org/docs","title":"Documentación oficial de Next.js","type":"source"},{"url":"https://www.php.net/manual/en/introduction.php","title":"PHP Manual: Introduction","type":"source"},{"url":"https://go.dev/doc/faq","title":"Preguntas frecuentes oficiales de Go: objetivos de diseño y características de ejecución","type":"source"},{"url":"https://go.dev/blog/waza-talk","title":"Blog oficial de Go: Concurrency is not parallelism","type":"source"},{"url":"https://kotlinlang.org/docs/faq.html","title":"Preguntas frecuentes oficiales de Kotlin: responsables del desarrollo y plataformas de destino","type":"source"},{"url":"https://developer.android.com/kotlin","title":"Android Developers: Kotlin and Android","type":"source"},{"url":"https://www.swift.org/about/","title":"Swift.org: About Swift","type":"source"},{"url":"https://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html","title":"Oracle Java Tutorials: About the Java Technology","type":"source"},{"url":"https://www.ibm.com/history/fortran","title":"IBM History: Fortran","type":"source"},{"url":"https://www-formal.stanford.edu/jmc/history/lisp/node2.html","title":"John McCarthy: LISP prehistory","type":"source"},{"url":"https://bitsavers.computerhistory.org/magazines/Datamation/196703.pdf","title":"Howard Bromberg: The COBOL Conclusion, Datamation, marzo de 1967","type":"source"},{"url":"https://www.nokia.com/bell-labs/about/dennis-m-ritchie/chist.html","title":"Dennis Ritchie: The Development of the C Language","type":"source"},{"url":"https://www.stroustrup.com/bs_faq.html","title":"Bjarne Stroustrup FAQ: C++ y orientación a objetos","type":"source"},{"url":"https://www.ibm.com/think/topics/structured-query-language","title":"IBM: What Is Structured Query Language?","type":"source"},{"url":"https://www.w3.org/standards/history/CSS1/","title":"W3C: Historial de publicación de Cascading Style Sheets, nivel 1","type":"data_point"},{"url":"https://americanhistory.si.edu/collections/object/nmah_334663","title":"Smithsonian National Museum of American History: Libro de registro con un fallo informático","type":"source"},{"url":"https://devblogs.microsoft.com/typescript/typescript-native-port/","title":"Microsoft: Un TypeScript 10x más rápido, 11 de marzo de 2025","type":"data_point"},{"url":"https://docs.github.com/en/copilot/responsible-use/inline-suggestions","title":"GitHub Docs: Limitaciones de las sugerencias en línea de Copilot y responsabilidad de verificación","type":"source"}],"images":[{"id":2241,"url":"https://injoys.com/rails/active_storage/blobs/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzQ0NjEsInB1ciI6ImJsb2JfaWQifX0=--aa435b9d954b7e3cf19dca343a0d0fc5333fe68f/ai-73cc4d9e.webp","is_representative":true,"generation_method":"ai_photo","license":"ai_generated","mime_type":"image/webp","width":1536,"height":1024,"translations":{"ko":{"alt":"실습 교실에서 중년 남성이 노트북을 사용하고 옆의 여성이 탁자 위 스마트폰을 가리키고 있다.","caption":"AI가 생성한 코드는 실행과 테스트로 요구사항에 맞는지 확인해야 합니다.","description":null},"en":{"alt":"A middle-aged man uses a laptop in a classroom while a woman beside him points to a smartphone on the table.","caption":"AI-generated code must be run and tested to verify that it meets the requirements.","description":null},"ja":{"alt":"実習教室で中年の男性がノートパソコンを操作し、隣の女性が机の上のスマートフォンを指さしている。","caption":"AIが生成したコードは、実行とテストで要件を満たしているか確認する必要があります。","description":null},"es":{"alt":"Un hombre de mediana edad usa un portátil en clase mientras una mujer señala un móvil sobre la mesa.","caption":"El código generado por IA debe ejecutarse y probarse para comprobar que cumple los requisitos.","description":null},"id":{"alt":"Pria paruh baya menggunakan laptop di kelas, sementara perempuan di sebelahnya menunjuk ponsel di meja.","caption":"Kode buatan AI harus dijalankan dan diuji untuk memastikan kesesuaiannya dengan kebutuhan.","description":null},"pt":{"alt":"Um homem de meia-idade usa um notebook em aula enquanto uma mulher aponta para um celular sobre a mesa.","caption":"O código gerado por IA deve ser executado e testado para verificar se atende aos requisitos.","description":null},"zh-hant":{"alt":"實作教室裡，一名中年男子操作筆記型電腦，身旁的女子指著桌上的智慧型手機。","caption":"AI 生成的程式碼必須透過執行與測試，確認是否符合需求。","description":null},"de":{"alt":"Ein Mann mittleren Alters nutzt im Kurs einen Laptop, während eine Frau neben ihm auf ein Smartphone zeigt.","caption":"KI-generierter Code muss ausgeführt und getestet werden, um zu prüfen, ob er die Anforderungen erfüllt.","description":null}}},{"id":2242,"url":"https://injoys.com/rails/active_storage/blobs/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzQ0NjcsInB1ciI6ImJsb2JfaWQifX0=--0a47db349b5b04ebfcd192a40d156aec0886d68c/ai-3af1935f.webp","is_representative":false,"generation_method":"ai_semi","license":"ai_generated","mime_type":"image/webp","width":1536,"height":1024,"translations":{"ko":{"alt":"서버실에서 CPU 방열판과 GPU 카드가 드러난 서버 내부를 살펴보는 여성","caption":"Mojo는 CPU와 GPU의 고성능 연산을 겨냥한 언어입니다.","description":null},"en":{"alt":"A woman inspects an open server with exposed CPU heatsinks and a GPU card in a server room.","caption":"Mojo targets high-performance computing on CPUs and GPUs.","description":null},"ja":{"alt":"サーバールームで、CPUヒートシンクとGPUカードが見えるサーバー内部を確認する女性","caption":"MojoはCPUとGPUでの高性能な演算を目指した言語です。","description":null},"es":{"alt":"Una mujer revisa un servidor abierto con disipadores de CPU y una tarjeta GPU en una sala de servidores.","caption":"Mojo está orientado a la computación de alto rendimiento en CPU y GPU.","description":null},"id":{"alt":"Seorang perempuan memeriksa server terbuka dengan heatsink CPU dan kartu GPU di ruang server.","caption":"Mojo ditujukan untuk komputasi berkinerja tinggi pada CPU dan GPU.","description":null},"pt":{"alt":"Uma mulher examina um servidor aberto com dissipadores de CPU e uma placa GPU em uma sala de servidores.","caption":"Mojo é voltada à computação de alto desempenho em CPUs e GPUs.","description":null},"zh-hant":{"alt":"一名女性在伺服器機房檢查打開的伺服器，內部可見 CPU 散熱器與 GPU 卡","caption":"Mojo 是以 CPU 與 GPU 高效能運算為目標的程式語言。","description":null},"de":{"alt":"Eine Frau prüft einen geöffneten Server mit CPU-Kühlkörpern und GPU-Karte im Serverraum.","caption":"Mojo ist auf Hochleistungsberechnungen mit CPUs und GPUs ausgerichtet.","description":null}}}],"published_at":"2026-10-29T14:25:12+09:00","updated_at":"2026-10-29T14:25:12+09:00","license":"cc_by","translation_status":"reviewed","available_locales":["ko","en","ja","es"],"data_locales":["ko","en","ja","es","id","pt","zh-hant","de"],"url":"https://injoys.com/es/articles/vibe-coding-programming-language-basics"}