Todos los lenguajes en los que se puede poner una tarea

Una tarea se pone en un lenguaje, y el lenguaje determina cómo es el editor y cómo se ejecuta el trabajo. Hay veintiuno, y ninguno requiere instalar nada.

Los que son un programa

Python, Java, Go, C, C++, C#, Haskell, OCaml, R, Ruby, PHP, Rust, Kotlin, Prolog, Node con JavaScript, Node con TypeScript y Bash. Cada uno tiene un editor, un botón «Ejecutar» y un espacio para la salida, y cada uno se compila o se interpreta de verdad: una tarea de Java que no compila te muestra el mensaje del compilador.

Todos pueden llevar pruebas ocultas, que muestra una pestaña «Pruebas», y un archivo de datos que lee el programa. El marco de pruebas es el propio de cada lenguaje: pytest para Python, JUnit 5 para Java, go test para Go y el ejecutor de pruebas de Node para los dos lenguajes de Node. En Bash, una prueba es un script que se supera cuando termina sin errores. En C y C++, una prueba es una función cuyo nombre empieza por test_: se supera si termina y falla si se cuelga o falla un assert. En C#, es un método público estático cuyo nombre empieza por Test, que se supera mientras no lance una excepción. En Haskell, una prueba es una definición de nivel superior cuyo nombre empieza por test_ y cuyo tipo es IO () o Bool: se supera si la acción termina o el valor es True. En OCaml es una función de unit cuyo nombre empieza por test_, que se supera si termina; en R, una función sin argumentos cuyo nombre empieza por test_, que se supera si termina, y stopifnot() sirve para hacerla fallar. En Ruby, una prueba es un método de nivel superior cuyo nombre empieza por test_, en PHP una función cuyo nombre empieza por test_, y en Kotlin una función de nivel superior del mismo nombre, todas sin parámetros y que se superan si terminan. En Rust es cualquier función marcada con #[test], ejecutada por el marco de pruebas de Rust, y en Prolog un predicado test_ sin argumentos, que se supera si su objetivo tiene éxito. Todas fallan al lanzar un error o una excepción.

Una aplicación web en Python, Node, Go, Java y sitios estáticos en HTML, CSS y JavaScript también se puede desplegar desde un repositorio público de GitHub en una dirección propia, y eso tiene su propia página en este manual.

Un editor de Java en el navegador con una clase abierta y un botón «Ejecutar»
Java, compilado y ejecutado en nuestras máquinas. El mismo editor y el mismo botón «Ejecutar», sea cual sea el lenguaje de la tarea.

En qué se diferencian los lenguajes de programación

Los paquetes salen del archivo de paquetes del propio proyecto, en la raíz del árbol de archivos y marcado como «Paquetes»: requirements.txt o pyproject.toml en Python, pom.xml en Java, go.mod en Go y package.json en Node y TypeScript en Node, con las versiones indicadas exactamente. Se descargan en un contenedor aparte y se entregan a la ejecución de solo lectura, y la ejecución en sí no tiene red. Una tarea nueva se abre con un pequeño ejemplo para sustituir. Los alumnos siempre ven el archivo y solo pueden cambiarlo si la tarea lo permite. Bash, SQL, C, C++, C#, Haskell, OCaml, R, Ruby, PHP, Rust, Kotlin y Prolog no tienen archivo de paquetes, porque no hay red a la que un gestor de paquetes pueda acudir.

Para usar un archivo de paquetes que ya tengas, súbelo a la raíz del árbol o crea allí un archivo con ese nombre: pasa a ser la lista de paquetes de la tarea y no un archivo más. Una tarea tiene una sola, así que para pasar una tarea de Python de requirements.txt a pyproject.toml, cambia el nombre del archivo. Del pom.xml de Java se leen sus propiedades, la gestión de dependencias, el padre, los BOM importados y los ámbitos, y un paquete de ámbito test solo se usa en las pruebas; solo se puede acceder a Maven Central. Una tarea de Java creada antes de pom.xml conserva su antiguo dependencies.xml, que sigue funcionando; pega un pom en él o cámbiale el nombre a pom.xml para pasarte. Los archivos de paquetes tienen su propia página en este manual, con lo que puede nombrar cada uno y cómo se instalan los paquetes.

Los editores no son igual de listos, y conviene saberlo antes de elegir. Python tiene subrayado rojo de errores, autocompletado, ayuda al pasar el ratón y firmas de funciones, todo calculado leyendo el código y sin ejecutarlo nunca. JavaScript y TypeScript en Node subrayan los errores de sintaxis mientras escribes, mientras que un error de tipos de TypeScript aparece al pulsar «Ejecutar», porque lo decide el compilador. Java, Go, C, C++, C#, OCaml, R, Ruby, PHP, Rust, Kotlin y Bash solo tienen el coloreado de la sintaxis, nada más inteligente, y Haskell y Prolog se muestran como texto plano, porque el editor no tiene modo para ellos.

Algunos detalles que preguntan los profesores. En Java la clase pública es siempre Main, y el código inicial la muestra. Todo archivo de Go es package main. Bash es bash de verdad, así que funcionan los arrays y [[ ]]. La entrada estándar es un cuadro bajo el código, y como read -p no muestra nada sin un terminal, el código inicial de Bash imprime primero su propio mensaje. C y C++ se compilan como C17 y C++20 con los avisos activados, y un aviso se muestra sin impedir nunca que el programa se ejecute. Un programa en C# puede escribirse con un método Main o con instrucciones de nivel superior. Las pruebas se añaden al final del programa y el programa se carga para ejecutarlas, así que los códigos iniciales leen su entrada con una alternativa para el final del archivo. OCaml no tiene guarda de main: un let () = de nivel superior se ejecuta también durante las pruebas. Un programa en R protege su main con if (sys.nframe() == 0) main(), como el código inicial, algo que es falso cuando las pruebas cargan el archivo; en R, readline() no lee la entrada estándar en un script, hay que usar readLines(file("stdin")). Un archivo de pruebas de Haskell puede llevar sus propios imports. Ruby y PHP protegen su main con if __FILE__ == $0 y una comparación de realpath, como sus códigos iniciales, y Prolog con :- initialization(main, main), así que ninguno se ejecuta durante las pruebas. Una prueba de Rust atascada en un bucle solo la detiene el límite de tiempo de toda la ejecución. C#, Haskell, OCaml, R, Ruby, PHP, Rust, Kotlin y Prolog se ejecutan en una máquina dedicada y no en todas: si no está disponible, la ejecución lo indica en lugar de empezar, y volver a intentarlo un poco después funciona.

Un programa que escribe archivos, un informe o un gráfico, los ve ofrecidos bajo la salida en cuanto termina la ejecución, hasta cinco archivos en total. Los de texto pueden pesar hasta 64 KB, y una imagen PNG, JPEG o WebP de hasta 1 MB se muestra además bajo la salida, así que un gráfico dibujado con matplotlib aparece sin más. Lo que escribió el programa se juzga por su contenido y no por su nombre, un SVG nunca se muestra como imagen, y todo lo que se deja fuera aparece con el motivo. Los enlaces duran media hora y siempre descargan, nunca se abren en la pestaña.

Los que son más que un archivo

Una página web es HTML, CSS y JavaScript en tres paneles con una vista previa en directo. Una tarea de SQL es una consulta y la base de datos sobre la que se ejecuta, en dos pestañas. Para un shell de verdad, plantea un laboratorio de contenedores o un laboratorio de máquina virtual.

Cada una tiene su propia página en este manual, porque lo que pone el profesor y lo que hace el alumno es distinto en cada caso.

Los que no son código

Un trabajo escrito, un cuestionario y dos tipos de diagrama. Todos se ponen igual que un programa, pero se califican de otra manera.

Preguntas frecuentes

¿Puedo mezclar lenguajes en un mismo módulo?
Sí. Un módulo contiene las tareas que pongas en él, en cualquier lenguaje.
¿Qué versión de Python?
Python 3.13, que aparece en el propio editor para que nadie tenga que preguntarlo.
¿Pueden los alumnos instalar paquetes?
En cualquier tarea que tenga archivo de paquetes, es decir, todos los lenguajes de programación salvo Bash, C, C++, C#, Haskell, OCaml, R, Ruby, PHP, Rust, Kotlin y Prolog, siempre que lo hayas permitido. Los alumnos siempre pueden ver la lista; la tarea decide si pueden cambiarla.