- La compilación de SciPy para Windows en conda-forge estuvo disponible dos días después del lanzamiento de Python 3.12.0, por lo que la migración a Python 3.12 en la rama de SciPy avanzó con unos pocos días de retraso, en lugar de quedar estancada durante meses
- Como en Python 3.12 se eliminó distutils de la biblioteca estándar, SciPy decidió migrar a la herramienta de compilación Meson en lugar de
numpy.distutils - Se esperaba que Meson rechazara la combinación MSVC+gfortran que usaba conda-forge, y en Windows no había un compilador Fortran gratuito con ABI compatible que conda-forge pudiera usar
- conda-forge preveía que, si no lograba recompilar SciPy en Windows, la migración de al menos unas 1,000 dependencias de paquetes de SciPy se retrasaría en todas las plataformas, o que habría que excluir Windows de la migración de Python
- LLVM 17.0 fue la primera versión que eliminó la bandera
-flang-experimental-execen Flang, y se estimaba que Flang estaba en un nivel de madurez de “0.8” - Tras agregar a Meson el manejo de llvm-flang, se logró compilar e instalar SciPy con éxito, y las pruebas terminaron con
54,987 passed,2,866 skipped,245 xfailed,11 xpassed,1 warning, con un 100% de aprobación {p:100}
3 comentarios
Opiniones de Hacker News
Fue un artículo realmente excelente, y ahora entiendo por qué fallaba
pip installen Python 3.12, pero el futuro se ve más prometedor.Me gusta Python, pero también me ayudó a entender por qué el empaquetado de Python es un desastre manejable.
La causa no es Python en sí, sino la falta de estandarización de las herramientas de compilación de C/C++/Fortran y lo enorme del ecosistema; hasta cierto punto, es una complejidad irreducible.
Que esto funcione ya es casi un milagro.
El éxito de Python se debe en gran parte a que pudo usar paquetes clave de lenguajes mixtos, y otros gestores de paquetes de lenguajes populares casi no lidian con este tipo de problemas.
Por ejemplo,
cargode Rust es excelente, pero en su mayoría puede asumir el empaquetado de código solo en Rust; y aunque es un lenguaje compilado, el lenguaje “posee” el compilador, así que funciona una estrategia de distribución basada en compilación desde código fuente.No sé cómo maneja
cargoFortran de forma predeterminada, pero si los paquetes principales decargoen Windows requirieran código Fortran, sospecho que sería difícil que funcionara bien.La mayor mejora del ecosistema de Python fue la estandarización de wheel, el formato de paquetes binarios, y solo entonces el ecosistema científico de Python empezó a prosperar de verdad en Windows.
Aun así, la compatibilidad binaria es un enorme dolor de cabeza, sobre todo cuando se cruza entre lenguajes y CPU.
La complejidad del ecosistema de software parece crecer exponencialmente, y me pregunto qué impide que termine en un colapso estilo Torre de Babel.
Claro que no es un problema exclusivo del software, pero es un buen ejemplo.
A menudo veo gente que compara su gestor de paquetes favorito con el de Python y concluye que Python es pésimo, pero en realidad no es así.
Lo que no termino de entender es por qué la gente de Python no usa bibliotecas matemáticas en C/C++ en lugar de Fortran.
Es un desastre apilado encima de otro desastre.
Cuando Linux era un caso marginal chirriante, operado por hackers coordinados de forma laxa y a veces con restricciones ideológicas poco prácticas, era fantástico que gente brillante dedicara enormes esfuerzos a darle soporte.
Pero ahora que ese caso marginal chirriante se convirtió en un sistema propietario cuyas restricciones son básicamente hostiles y que está operado por ciberterratenientes, es más difícil ver con el mismo optimismo el trabajo de darle soporte.
Por otro lado, es realmente admirable la profunda consideración de querer que todos puedan usar estas herramientas, y aplaudo ese trabajo.
No digo en absoluto que cambien de rumbo; simplemente me deja pensando.
Antes pensaba: “guau, qué bueno que este trabajo se esté haciendo”; ahora pienso más bien: “guau, qué habrían logrado esas personas brillantes si no tuvieran que estar dedicadas a esto”.
Como se ha dicho varias veces, los desarrolladores de SciPy son voluntarios.
Gran parte de la historia explica por qué SciPy no tenía más opción que esperar a que alguien creara un compilador Fortran open source para Windows, y parece que el rescate vino principalmente de desarrolladores de NVIDIA.
SciPy está pagando el precio de la decisión tonta y muy sesgada de los desarrolladores principales de Python de elegir MSVC en lugar de MinGW como toolchain para Python en Windows.
Creo que la motivación provino del patrocinio de Microsoft.
En la lista de desarrolladores principales hay bastantes empleados de Microsoft, a quienes Microsoft les paga por participar en esa lista; además, Microsoft también cubre los costos de los servidores de CI del proyecto CPython.
Todo este problema podría haberse evitado si Python no hubiera usado herramientas propietarias en su toolchain.
Que “Meson haya intentado rechazar la combinación MSVC+gfortran que se usaba en conda-forge” suena como un bug
Creo que el propósito de una herramienta de compilación es ejecutar las órdenes que se le dan, no bloquearte con un “lo siento, Dave”
El problema es que el runtime de C que usan MSVC y gfortran, en particular las propias bibliotecas de runtime de gfortran, que están escritas en C, no son compatibles a nivel de ABI
La solución alternativa que usaba NumPy consistía en enlazar los objetos Fortran como DLL para agregar una capa indirecta mediante una import library y así calmar a MSVC
Por eso hacía falta trabajo adicional para crear esas DLL
Había que hacerlo ya fuera en el archivo de descripción de build o en Meson, pero el lado de SciPy no quería implementar esa capa indirecta en ninguno de los dos, y los desarrolladores de Meson tampoco tenían muchas ganas de ayudar activamente
Claro que los desarrolladores de Meson sí ayudaron con cosas generales como el soporte de Fortran y Cython, pero no querían proporcionar un andamio peligroso
En la práctica, esto era casi un hack y, por ejemplo, solo funcionaba porque el lado Fortran no usaba archivos abiertos desde el lado Python/C
https://web.archive.org/web/20180711144501/https://pav.iki.f...
Personalmente he visto Bazel con más frecuencia que Meson
Supongo que, al estar escrito en Python, Meson parecía una buena opción para SciPy, y al final salió bien, así que es algo para celebrar
Aun así, pese a sus muchas rarezas, complejidades y problemas, creo que CMake sigue siendo prácticamente el estándar
También puede sintetizar las órdenes para dar soporte a MSVC/gcc/clang
Si le pides que sintetice órdenes para una combinación que no conoce, naturalmente no le queda otra que decir “lo siento, Dave”
Dejo claro que soy autor de un sistema de build competidor de Meson que se publicará pronto
Dicho eso, [1] es una pequeña joya poco conocida, una rant que me hizo darme cuenta de lo que acabo de decir
En resumen, un sistema de build debe ejecutar las órdenes que el usuario le dijo que ejecutara, y ya
Porque a veces el programador de verdad sabe lo que está haciendo
Me da vergüenza admitirlo, pero antes de leer ese comentario pensaba hacer que mi sistema de build fuera mágico
Pero después de leerlo, entendí que justamente esa “magia” es la razón por la que la gente odia los sistemas de build
[1]: https://ofekshilon.com/2016/08/30/cmake-rants/#comment-29273
Pensé que para estas cosas todos usaban WSL2 y listo
¿Cuál es la razón para querer compilar una versión nativa de Windows?
Trabajar en una máquina virtual es incómodo y tiene menos integración
También los estudiantes
Sobre todo cuando puedes usar Docker Desktop encima
Es sacarle lo mejor posible a una situación que no es ideal
El
καταdeκαταστροφήno significa “repentinidad”, sino más bien “hacia abajo” o “según”, con una fuerte implicación de torcerse en una mala direcciónLo contrario de
καταsuele serανα, peroαναστροφήliteralmente significa “giro hacia arriba” o inversiónAsí que
ευστροφη, es decir, eustrophe, quizá sea un mejor neologismo para “buen giro”Aun así, si le ganas una discusión a JRR Tolkien sobre acuñación de palabras, eso sería
ευκαταστροφη, es decir, buena fortunaEn general me gusta que capture una gracia desbordante, algo que trae alegría y felicidad al mundo
katadekatastrofien realidad se acerca más a “against”, así que katastrofi corresponde a que las cosas “den la espalda”Tengo la impresión de que los mejores BLAS en general están hechos en C
Cosas como MKL, BLIS y OpenBLAS
Me pregunto hasta dónde se habría podido llegar solo con C y Python
También me pregunto si, de empezar hoy, simplemente habrían elegido
libflameClaro que SciPy tiene muchas otras funciones, como métodos iterativos y matrices dispersas, así que quizá sea difícil evitar Fortran
Aun así, Fortran es un lenguaje excelente, y me alegra que la situación de herramientas en Windows al menos haya empezado a mejorar
SciPy en sí también contiene mucho código Fortran, y reescribirlo requeriría años-persona de trabajo
Una vez que fue posible, se eliminaron algunas partes centrales que usaban Fortran
Por ejemplo, las relacionadas con FFT
Excelente artículo
Este año pasé mucho tiempo modernizando un proyecto C++ con CMake que tiene bindings de Python, y después de haberlo agregado con éxito a conda-forge como un feedstock nuevo, puedo decir con confianza:
si me convierto en el nuevo emperador-dios, mi primera medida relacionada con TI será erradicar Windows de todo el universo para siempre
Es una pregunta muy ingenua, pero ¿la semántica de Fortran es tan distinta que no se puede convertir primero a C y luego compilar con un compilador de C?
Después, ¿no se podría mantener en C?
No parece que haya mucha gente de Fortran manteniendo estas bibliotecas antiguas, pero aun así necesitan mantenimiento, ¿no?
Fortran no tiene punteros y solo tiene arreglos; como los argumentos de las funciones no pueden tener alias, dejando de lado por un momento el horror de los bloques
COMMON, es más fácil hacer optimizaciones agresivas y vectorizaciónLas bibliotecas matemáticas estándar de Fortran simplemente funcionan bien y son rápidas
En C/C++ también se puede escribir código con velocidad equivalente, sobre todo usando la palabra clave
restrictde CPero si conviertes código existente con un paso de
f2c, en muchos casos el rendimiento empeora muchoTambién hay suficientes desarrolladores de Fortran
Es terrible para el desarrollo de aplicaciones, pero ese no es el campo principal de Fortran
f2c existe desde hace décadas
Tengo una pequeña duda: según entiendo,
aarch64yarm64son lo mismo¿Estoy equivocado?
[1] https://www.phoronix.com/news/MTY5ODk
aarch64normalmente se refiere a Linux, yarm64normalmente se refiere a macOS ARMNo conozco lo suficiente este campo como para entender por qué los nombres son distintos
Es realmente difícil seguir los cambios en el sistema de build de Python
También me dan curiosidad las cifras de rendimiento en Windows
Aunque quizá no sean importantes en primera instancia
Porque el trabajo serio probablemente se ejecute en máquinas Linux
La gran transición fue lograr que todos adoptaran PEP 517, especialmente migrar proyectos existentes de Setuptools
Porque el 99.9% del tiempo se ejecuta código de usuario, no el sistema operativo
Vaya, aquí quedó brutalmente expuesta la miserable dependencia de los lenguajes compilados a binarios.
¿No es que lo resolvieron para Python, pero no para otros ecosistemas? Por eso seguramente ofrecerán binarios precompilados.