La computación científica se había asentado en un flujo de trabajo de dos lenguajes: los investigadores creaban prototipos y analizaban en un lenguaje dinámico como Python, MATLAB o R, y luego reescribían las partes lentas en C o Fortran. Un reportaje de Ars Technica de 2020 y su discusión en Hacker News pusieron de manifiesto el costo de esa costura: la capa de scripting no puede expresar alto rendimiento, mientras que la capa rápida es penosa de escribir y difícil de mantener.
La apuesta de Julia fue eliminar la costura por completo. Su compilador usa inferencia de tipos y un JIT construido sobre LLVM para compilar cada función para los tipos concretos de argumentos con los que realmente se llama, de modo que un lenguaje dinámico y de aspecto matemático puede ejecutarse cerca de C bien escrito. El despacho múltiple —elegir un método por todos los tipos de argumentos en lugar de por un solo receptor— permite que los paquetes extiendan las funciones genéricas de otros, que es cómo las bibliotecas independientes se componen en lugar de que cada una envuelva su propio núcleo en C.
Para 2020 el diseño ya mostraba resultados de producción, no solo benchmarks. RelationalAI dijo que su base de datos de grafos de conocimiento en la nube estaba escrita 100% en Julia; la plataforma de modelado Pumas se estaba distribuyendo a empresas farmacéuticas y se usaba en presentaciones a la FDA; y los comentaristas señalaron ecosistemas completos, desde ecuaciones diferenciales hasta optimización matemática, donde las bibliotecas de Julia se habían vuelto de primer nivel. La versión 1.5 era la vigente, y los desarrolladores principales sostenían que no había habido cambios disruptivos reales desde la 1.0.
Los críticos también tuvieron su sayo: primeras gráficas lentas y latencia de arranque, herramientas inmaduras y menos bibliotecas probadas en batalla que Python. Los defensores respondieron que el desarrollo iterativo con Revise.jl, más la capacidad de parchear un punto caliente con un solo método nuevo, hacía que el mismo código sirviera para exploración y producción, que era exactamente el objetivo del diseño.
Hacer que el propio lenguaje dinámico compile a velocidad nativa
La inferencia de tipos más la especialización JIT hace rápido el código genérico y expresivo sin que el programador cambie de dialecto para las rutas críticas.
El despacho múltiple permite que los paquetes añadan métodos a las funciones de otros paquetes, de modo que ecosistemas como los solucionadores de EDO y la optimización se componen en lugar de duplicar los núcleos en C de los demás.
Los científicos conservan el modelo mental de su problema en lugar de reformularlo primero para ajustarlo a un paradigma de rendimiento, lo que elimina toda una clase de errores de reescritura.
Una sola base de código sirve para exploración y producción, así que el prototipo no puede desviarse del sistema que realmente se ejecuta.
Para eliminar un paso de reescritura, no construyas un mejor puente entre dos lenguajes; construye un solo lenguaje cuya capa expresiva sea también su capa de producción.
El reportaje de Ars Technica se publicó en octubre de 2020 y su hilo de Hacker News atrajo 284 puntos con 212 comentarios, y los propios desarrolladores de Julia se sumaron al debate. La justificación del diseño ya había sido expuesta por sus autores en el artículo de 2018 «Julia: Dynamism and Performance Reconciled by Design», y el hilo de 2020 mostró despliegues en RelationalAI y en modelado farmacéutico, no solo prototipos de investigación. Las contrapartidas que el hilo señaló —latencia de arranque, madurez de las herramientas y cobertura de bibliotecas— siguieron siendo la agenda pendiente del ecosistema.
CONSULTA LAS PRUEBAS
Las fuentes
- The unreasonable effectiveness of the Julia programming language Ars Technica · arstechnica.com
- The unreasonable effectiveness of the Julia programming language (Hacker News discussion) Hacker News · news.ycombinator.com ·