Converte código Delégua no assembly LLVM (ou representação intermediária de código LLVM), que pode ser usada para gerar executáveis, seja em qualquer sistema operacional, seja em certos dispositivos específicos.
Funciona apenas com Node.js.
É possível fazer funcionar em Windows (roteiro abaixo), mas recomendamos um ecossistema baseado em Unix, como Linux e MacOS, que são mais fáceis de obter essas dependências.
Após instalar qualquer versão do Node.js, o Yarn pode ser instalado usando o seguinte comando:
npm i -g yarn
O script de instalação abaixo supõe uma distribuição Linux compatível com Ubuntu e Debian:
# Descarregar o script de instalação do LLVM
wget https://apt.llvm.org/llvm.sh
sudo chmod +x llvm.sh
sudo ./llvm.sh 14
# Instalar bibliotecas dependentes
sudo apt-get install cmake zlib1g-dev
# Após clonar este projeto, navegar para o diretório raiz e usar o comando
yarn
# O comando abaixo supõe que o Homebrew está instalado.
# Se você não sabe o que é o Homebrew, acesse: https://brew.sh/
brew install cmake llvm@14
# O Homebrew deve pedir para executar os comandos abaixo:
echo 'export PATH="/opt/homebrew/opt/llvm@14/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
# Após clonar este projeto, navegar para o diretório raiz e usar o comando
yarn
A biblioteca llvm-bindings, parte essencial deste projeto, funciona até a versão 14 do LLVM. A versão 14.0.6 compila sem problemas.
Você precisará baixar os fontes do projeto (link direto aqui), o instalador do CMake, que pode ser a versão mais recente com todas as opções padrão marcadas no instalador, e algum Visual Studio versões 2019 ou mais recente. Há uma versão Community que é gratuita. Ao executar o instalador do Visual Studio, marque a opção "Desenvolvimento em Desktop com C++" (ou, em inglês, "Desktop Development with C++").
Baixados os fontes do projeto, descompacte o arquivo em um diretório qualquer (por exemplo, C:\Estudos
). Feito isso, abra um prompt de comando (ou uma janela do PowerShell), navegue até o diretório descompactado do LLVM (por exemplo, C:\Estudos\llvm-project-llvmorg-14.0.6
) e dentro deve haver um diretório llvm
, ou seja, C:\Estudos\llvm-project-llvmorg-14.0.6\llvm
. Neste diretório, execute os seguintes comandos:
mkdir build
cd build
# Compila para x64
cmake -Thost=x64 -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_INCLUDE_TESTS=OFF ..
cmake --build . --config Release
Após esses comandos, uma versão funcional do LLVM estará no diretório C:\Estudos\llvm-project-llvmorg-14.0.6\llvm\build\Release\bin
.
Adicione o diretório na sua variável de ambiente PATH
, e crie uma outra variável de ambiente chamada CMAKE_PREFIX_PATH
. Esta variável guarda o diretório que contém os arquivos .cmake
necessários para que llvm-bindings
saiba como construir o pacote no ambiente local. Considerando os fontes do LLVN que baixamos, estes arquivos vivem dentro do subdiretório llvm\build\lib\cmake\llvm
. No nosso exemplo, C:\Estudos\llvm-project-llvmorg-14.0.6\llvm\build\lib\cmake\llvm
.
Finalmente, execute:
yarn
A instalação e construção de pacotes deve ocorrer sem erros.
Para compilar seu código para código de máquina, utilizamos o Clang, que é o compilador do LLVM para C e C++.
O comando para compilar seu programa Delégua já convertido para LLVM é:
clang meu_programa.ll -o meu_programa
Todo código Delégua que passa por este compilador precisa ser fortemente tipado. Diferentemente do interpretador Delégua, que deduz o tipo de variável em tempo de execução, a arquitetura de LLVM nos obriga a ter tipos definidos, que são mapeados para os tipos correspondentes em LLVM.
Delégua por definição não possui um ponto de entrada, ou seja, uma função main()
, mas LLVM requer este ponto de entrada, que é criado automaticamente. Este ponto de entrada chama as demais funções, classes, etc.
Todo o código gerado por esta biblioteca não é otimizado, e nem precisa ser. A otimização do código pode ser feita pelo comando opt
do LLVM, usando, por exemplo:
opt -S meu_programa.ll > meu_programa.otimizado.ll