Build do SciPy para Windows no Python 3.12 é considerada um pequeno milagre
(labs.quansight.org)- O build do SciPy para Windows no conda-forge foi disponibilizado dois dias após o lançamento do Python 3.12.0, fazendo com que a migração do SciPy para o Python 3.12 avançasse com apenas alguns dias de atraso, em vez de ficar parada por meses
- Com a remoção do distutils da biblioteca padrão no Python 3.12, o SciPy decidiu migrar do
numpy.distutilspara a ferramenta de build Meson - O Meson estava prestes a rejeitar a combinação MSVC+gfortran usada pelo conda-forge, e no Windows não havia um compilador Fortran gratuito compatível em ABI que o conda-forge pudesse usar
- O conda-forge previa que, se não conseguisse reconstruir o SciPy no Windows, a migração de pelo menos cerca de 1.000 pacotes que dependem do SciPy seria atrasada em todas as plataformas, ou então o Windows teria de ser excluído da migração do Python
- O LLVM 17.0 foi a primeira versão a remover a flag
-flang-experimental-execno Flang, que é estimado em um nível de maturidade “0.8 level maturity” - Depois de adicionar o tratamento de llvm-flang no Meson, foi possível compilar e instalar o SciPy com sucesso, e os testes passaram 100% com
54,987 passed,2,866 skipped,245 xfailed,11 xpassed,1 warning{p:100}
3 comentários
Opiniões do Hacker News
Foi um texto realmente excelente e agora entendo por que o
pip installfalhava no Python 3.12, mas daqui para frente o cenário parece mais promissorGosto de Python, mas isso também ajuda a entender por que o empacotamento em Python é uma bagunça ainda administrável
A causa não é o Python em si, mas a falta de padronização das ferramentas de build em C/C++/Fortran e o tamanho gigantesco do ecossistema; em certa medida, é uma complexidade impossível de eliminar
O simples fato de isso funcionar já é quase um milagre
O sucesso do Python se deve, em grande parte, ao fato de ter sido possível usar pacotes essenciais de linguagens mistas, e os gerenciadores de pacotes de outras linguagens populares quase não lidam com esse tipo de problema
Por exemplo, o
cargodo Rust é excelente, mas em geral pode pressupor o empacotamento de código exclusivamente em Rust; além disso, embora Rust seja uma linguagem compilada, a própria linguagem “possui” o compilador, então uma estratégia de distribuição por build a partir do código-fonte funcionaNão sei como o
cargolida com Fortran por padrão, mas, se pacotescargoimportantes exigissem código Fortran no Windows, acho que dificilmente funcionaria bemA maior melhoria no ecossistema Python foi a padronização do formato de pacote binário wheel, e só então o ecossistema científico de Python começou a prosperar de verdade no Windows
Ainda assim, compatibilidade binária é uma enorme dor de cabeça, especialmente quando atravessa linguagens e CPUs
A complexidade do ecossistema de software parece crescer exponencialmente, e fico curioso sobre o que, no fim das contas, impede que tudo caminhe para um colapso ao estilo Torre de Babel
Claro que não é um problema exclusivo de software, mas é um bom exemplo
Vejo com frequência pessoas compararem seu gerenciador de pacotes favorito com o do Python e concluírem que o Python é péssimo, mas na prática não é bem assim
O que eu não entendo muito bem, porém, é por que o pessoal do Python não usa bibliotecas matemáticas em C/C++ em vez de Fortran
É uma bagunça em cima de outra bagunça
Quando o Linux era um caso periférico meio rangente, mantido por hackers com coordenação frouxa e às vezes com restrições ideológicas pouco práticas, era fantástico ver pessoas brilhantes se esforçando enormemente para dar suporte a ele
Mas agora que esse caso periférico rangente virou um sistema proprietário em que as restrições são praticamente hostis, operado por senhores feudais cibernéticos, é difícil ver o trabalho de dar suporte a isso de forma tão positiva quanto antes
Por um lado, é realmente admirável a profunda consideração de tentar tornar essas ferramentas acessíveis a todos, e aplaudo esse trabalho
Não estou de forma alguma dizendo para mudarem de direção; é só algo que me faz refletir
Antes eu pensava “uau, ainda bem que esse trabalho está sendo feito”; agora penso mais “uau, o que essas pessoas brilhantes poderiam ter realizado se não precisassem se dedicar a esse tipo de coisa”
Como já foi dito várias vezes, os desenvolvedores do SciPy são voluntários
Boa parte da história explica por que o SciPy não teve alternativa a não ser torcer para que alguém criasse um compilador Fortran open source para Windows, e a salvação parece ter vindo principalmente de desenvolvedores da NVIDIA
O SciPy está pagando o preço da decisão tola e extremamente enviesada dos principais desenvolvedores do Python de escolher MSVC em vez de MinGW como toolchain para Python no Windows
Acredito que a motivação tenha vindo do patrocínio da Microsoft
Há bastantes funcionários da Microsoft na lista de core developers; eles são pagos pela Microsoft para participar dessa lista e, além disso, a Microsoft também banca os custos dos servidores de CI do projeto CPython
Se Python não usasse ferramentas proprietárias em sua toolchain, todo esse problema poderia ter sido evitado
A afirmação de que “o Meson tentou rejeitar a combinação MSVC+gfortran usada no conda-forge” soa como bug
Acho que o objetivo de uma ferramenta de build é executar os comandos que mandaram executar, não barrar dizendo “desculpe, Dave”
O problema é que os runtimes C usados pelo MSVC e pelo gfortran, em especial a própria biblioteca de runtime do gfortran, que é escrita em C, não são compatíveis em ABI
A solução de contorno usada pelo NumPy era linkar os objetos Fortran em uma DLL, acrescentar uma camada indireta via biblioteca de importação e assim apaziguar o MSVC
Por isso era necessário trabalho extra para criar essa DLL
Isso precisava ser feito no arquivo de descrição do build ou no Meson, mas o pessoal do SciPy não queria implementar essa camada indireta em nenhum dos dois lugares, e os desenvolvedores do Meson também não estavam muito dispostos a ajudar ativamente
Claro que os desenvolvedores do Meson ajudaram em coisas gerais, como suporte a Fortran e Cython, mas não queriam fornecer um apoio perigoso
Na prática, isso era quase um hack e, por exemplo, só funcionava porque o lado Fortran não usava arquivos abertos pelo lado Python/C
https://web.archive.org/web/20180711144501/https://pav.iki.f...
Pessoalmente, vi Bazel com mais frequência do que Meson
Como o Meson é escrito em Python, parece ter parecido uma boa escolha para o SciPy e, no fim, deu certo, então é algo a comemorar
Ainda assim, apesar de várias esquisitices, complexidades e problemas, acho que o CMake continua sendo algo próximo do padrão
Ele também pode sintetizar os próprios comandos para dar suporte a MSVC/gcc/clang
Se você pede para ele sintetizar comandos para uma combinação que ele não conhece, é natural que ele não tenha escolha a não ser dizer “desculpe, Dave”
Deixo claro que sou o autor de um sistema de build concorrente do Meson que será divulgado em breve
Dito isso, um pequeno rant pouco conhecido que me fez perceber exatamente o que acabei de dizer é o [1]
Em resumo, um sistema de build deve executar os comandos que o usuário mandou executar, ponto
Porque, às vezes, o programador realmente sabe o que está fazendo
Tenho vergonha de admitir, mas antes de ler aquele comentário eu estava pensando em tornar meu sistema de build algo mágico
Depois de lê-lo, porém, percebi que o motivo pelo qual as pessoas odeiam sistemas de build é justamente essa “mágica”
[1]: https://ofekshilon.com/2016/08/30/cmake-rants/#comment-29273
Achei que, nesses casos, todo mundo simplesmente usasse WSL2 e pronto
Qual seria o motivo para querer compilar uma versão nativa para Windows?
Trabalhar em uma máquina virtual é inconveniente e tem menos integração
Estudantes também
Especialmente quando dá para usar o Docker Desktop em cima disso
É tirar o melhor de uma situação longe do ideal
O
καταemκαταστροφήnão significa “subitaneidade”, mas algo mais próximo de “para baixo” ou “de acordo com”, com uma forte implicação de virar para uma direção ruimO oposto de
καταnormalmente éανα, masαναστροφήsignifica literalmente “virar para cima” ou inversãoPortanto
ευστροφη, isto é, eustrophe, talvez seja uma cunhagem melhor para significar “boa virada”Ainda assim, se você vencer uma discussão com JRR Tolkien sobre criação de palavras, isso seria
ευκαταστροφη, ou seja, boa sorteNo geral, gosto de como capta uma graça transbordante, algo que traz alegria e felicidade ao mundo
kataemkatastrofina verdade é mais próximo de “against”, então katastrofi corresponde a algo que “vira as costas”Tenho a impressão de que os melhores BLAS em geral são em C
Coisas como MKL, BLIS e OpenBLAS
Fico curioso até onde teria sido possível chegar só com C e Python
Também fico curioso se, começando hoje, talvez simplesmente escolhessem
libflameClaro que o SciPy tem muitos outros recursos, como métodos iterativos e matrizes esparsas, então talvez fosse difícil evitar Fortran
Ainda assim, Fortran é uma ótima linguagem, e é bom ver que a situação das ferramentas no Windows pelo menos começou a melhorar
O próprio SciPy também contém muito código Fortran, e reescrevê-lo exigiria anos de trabalho
Depois que isso se tornou possível, algumas partes centrais que usavam Fortran chegaram a ser removidas
Por exemplo, as partes relacionadas a FFT
Excelente texto
Passei muito tempo este ano modernizando um projeto C++ com CMake que tem bindings para Python e, depois de conseguir adicioná-lo com sucesso ao conda-forge como um novo feedstock, posso dizer com confiança
Se eu me tornasse o Imperador-Deus, minha primeira medida relacionada a TI seria erradicar o Windows de todos os universos para sempre
Uma pergunta bem ingênua, mas a semântica de Fortran é tão diferente assim a ponto de não dar para primeiro converter para C e depois compilar com um compilador C?
Depois disso, não seria possível fazer a manutenção em C?
Não parece que haja muita gente de Fortran mantendo bibliotecas tão antigas, mas ainda assim a manutenção não é necessária?
Fortran não tem ponteiros, só arrays, e os argumentos de função não podem ter aliases; então, deixando de lado por enquanto o horror dos blocos
COMMON, fica mais fácil fazer otimizações agressivas e vetorizaçãoAs bibliotecas matemáticas padrão em Fortran simplesmente funcionam bem e são rápidas
Em C/C++ também é possível escrever código com velocidade equivalente, especialmente usando a palavra-chave
restrictde CMas, ao converter código existente por uma etapa com
f2c, em muitos casos o desempenho piora bastanteTambém há bastante desenvolvedores Fortran
Para desenvolvimento de aplicações ela é horrível, mas esse não é o principal campo de uso de Fortran
f2c existe há décadas
Tenho uma curiosidade pequena: pelo que sei,
aarch64earm64são a mesma coisaEstou entendendo errado?
[1] https://www.phoronix.com/news/MTY5ODk
aarch64normalmente se refere a Linux, earm64normalmente se refere a macOS ARMNão conheço essa área o suficiente para entender por que os nomes são diferentes
As mudanças no sistema de build do Python são realmente difíceis de acompanhar
Também tenho curiosidade sobre os números de desempenho no Windows
Mas talvez isso não seja importante em primeiro lugar
Porque trabalhos sérios provavelmente vão rodar em máquinas Linux
A grande transição foi fazer todo mundo adotar a PEP 517, especialmente converter projetos Setuptools existentes
Porque 99,9% do tempo é executado código do usuário, não o sistema operacional
Isso expõe de forma bem crua a nossa maldita dependência de linguagens compiladas para binário.
Não resolveram no Python, mas não foi resolvido em outros ecossistemas, certo? Por isso devem fornecer binários pré-compilados.