Chris Lattner, fundador e arquiteto principal do LLVM, bem como criador da linguagem de programação Swift, e Tim Davis, ex-líder de projetos de IA do Google, como Tensorflow e JAX, apresentaram uma nova linguagem de programação chamada Mojo, que combina a simplicidade para desenvolvimento de pesquisas e a criação rápida de protótipos com a adequação para a formação de produtos finais de alto desempenho. Isso é alcançado graças ao uso da sintaxe familiar da linguagem Python e à capacidade de compilação em código de máquina, mecanismos de segurança de memória e a utilização de recursos para aceleração de hardware nas computações.
O projeto é focado em desenvolvimentos na área de aprendizado de máquina, mas é apresentado como uma linguagem de propósito geral, ampliando as capacidades da linguagem Python com recursos de programação de sistemas e adequada para uma ampla gama de tarefas. Por exemplo, a linguagem pode ser aplicada em áreas como computação de alto desempenho, processamento e transformação de dados. Uma característica interessante do Mojo é a possibilidade de usar o símbolo emoji "🔥" como extensão para arquivos de código (por exemplo, "helloworld.🔥"), além da extensão textual ".mojo".
Atualmente, a linguagem está em fase de desenvolvimento intenso e, para testes, apenas uma interface online foi disponibilizada. Versões isoladas para execução em sistemas locais estão prometidas para publicação posteriormente, após a coleta de feedback sobre o funcionamento do ambiente web interativo. Os códigos fontes do compilador, JIT e outras desenvolvimentos relacionados ao projeto estão planejados para serem abertos após a conclusão do design da arquitetura interna (o modelo de desenvolvimento de um protótipo funcional por trás de portas fechadas lembra a fase inicial de desenvolvimento do LLVM, Clang e Swift). Como a sintaxe do Mojo é baseada na linguagem Python, e o sistema de tipos é semelhante ao C/C++, no futuro, planejam desenvolver ferramentas para simplificar a transição de projetos existentes escritos em C/C++ e Python para Mojo, além de desenvolver projetos híbridos que combinam códigos em Python e Mojo.
O projeto é voltado para a utilização de recursos de hardware disponíveis em sistemas heterogêneos para a realização de cálculos. Por exemplo, para executar aplicações na linguagem Mojo e paralelizar cálculos, podem ser utilizados GPUs, aceleradores especializados para aprendizado de máquina e instruções de processador vetorial (SIMD). A escolha de desenvolver um subconjunto separado da linguagem Python, em vez de otimizar o CPython existente, é motivada pela ênfase na compilação, integração de recursos de programação de sistemas e uso de uma arquitetura interna fundamentalmente diferente, que permite a execução de código em GPUs e diversos aceleradores de hardware. Os desenvolvedores de Mojo pretendem manter a compatibilidade com o CPython sempre que possível.
O Mojo pode ser utilizado tanto em modo de interpretação com JIT quanto para compilação em arquivos executáveis (AOT, ahead-of-time). O compilador incorpora tecnologias modernas de otimização automática, cache e compilação distribuída. O código-fonte em Mojo é transformado em código intermediário de baixo nível MLIR (Multi-Level Intermediate Representation), desenvolvido pelo projeto LLVM, que oferece oportunidades adicionais para otimização do processamento do gráfico do fluxo de dados. O compilador permite a aplicação de diferentes backends, que suportam MLIR, para a geração de código de máquina.
A utilização de mecanismos de hardware adicionais para acelerar cálculos possibilita o alcance de desempenho que, em cálculos intensivos, supera aplicações em C/C++. Por exemplo, em testes de um aplicativo para gerar um conjunto de Mandelbrot, o aplicativo compilado em Mojo, quando executado na nuvem AWS (r7iz.metal-16xl), foi 6 vezes mais rápido do que a implementação em C++ (0,03 s contra 0,20 s), além de ser 35 mil vezes mais rápido do que o aplicativo em Python usando o CPython 3.10.9 (0,03 s contra 1027 s) e 1500 vezes mais rápido ao usar o PYPY (0,03 s contra 46,1 s).
Ao avaliar o desempenho em tarefas de aprendizado de máquina, o stack AI Modular Inference Engine, escrito na linguagem Mojo, mostrou-se 3 vezes mais rápido em um sistema com processador Intel ao processar um modelo de linguagem, 6.4 vezes mais rápido ao executar um modelo de recomendação e 2.1 vezes mais rápido ao trabalhar com modelos de processamento visual em comparação com uma solução baseada na biblioteca TensorFlow. Ao usar processadores AMD, o ganho com Mojo foi de 3.2, 5 e 2.2 vezes, enquanto com processadores ARM foi de 5.3, 7.5 e 1.7 vezes, respectivamente. A solução baseada em PyTorch ficou atrás do Mojo em 1.4, 1.1 e 1.5 vezes em CPU Intel, 2.1, 1.2 e 1.5 vezes em CPU AMD e 4, 4.3 e 1.3 vezes em CPU ARM.

A linguagem suporta tipagem estática e recursos para manipulação segura de memória em nível baixo, semelhantes às capacidades da linguagem Rust, como o rastreamento do tempo de vida de referências e a verificação de empréstimo de variáveis (borrow checker). Além dos recursos para manipulação segura de ponteiros, a linguagem oferece funcionalidades para trabalho em nível baixo, como acesso direto à memória em modo unsafe usando o tipo Pointer, chamada de instruções SIMD individuais ou acesso a extensões de hardware, como TensorCores e AMX.

Para simplificar a separação entre o código Python clássico e o otimizado para funções com tipos explicitamente definidos para todas as variáveis, foi proposto o uso de uma palavra-chave separada "fn" em vez de "def". Da mesma forma, para classes, ao se necessitar de empacotamento de dados em memória durante a compilação (como em C), em vez de "class", pode-se usar o tipo "struct". Também é possível importar módulos de linguagens C/C++, por exemplo, para importar a função cos da biblioteca math, pode-se especificar "from 'math.h' import cos".
Fonte: opennet.ru
