{"id":28471939,"url":"https://github.com/designliquido/delegua-llvm","last_synced_at":"2026-03-11T03:05:19.006Z","repository":{"id":262057621,"uuid":"886035987","full_name":"DesignLiquido/delegua-llvm","owner":"DesignLiquido","description":"Biblioteca de conversão de código Delégua na representação intermediária de código LLVM.","archived":false,"fork":false,"pushed_at":"2026-03-09T00:34:56.000Z","size":356,"stargazers_count":6,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"principal","last_synced_at":"2026-03-09T04:42:38.415Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DesignLiquido.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-11-10T02:38:04.000Z","updated_at":"2026-03-09T00:34:59.000Z","dependencies_parsed_at":"2026-02-19T02:03:08.227Z","dependency_job_id":null,"html_url":"https://github.com/DesignLiquido/delegua-llvm","commit_stats":null,"previous_names":["designliquido/delegua-llvm"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/DesignLiquido/delegua-llvm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DesignLiquido%2Fdelegua-llvm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DesignLiquido%2Fdelegua-llvm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DesignLiquido%2Fdelegua-llvm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DesignLiquido%2Fdelegua-llvm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DesignLiquido","download_url":"https://codeload.github.com/DesignLiquido/delegua-llvm/tar.gz/refs/heads/principal","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DesignLiquido%2Fdelegua-llvm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30340117,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T15:03:31.997Z","status":"ssl_error","status_checked_at":"2026-03-10T15:01:30.431Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-07T11:09:27.535Z","updated_at":"2026-03-11T03:05:18.980Z","avatar_url":"https://github.com/DesignLiquido.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Biblioteca de Compilação Delégua para LLVM\n\nConverte código Delégua no _assembly_ [LLVM](https://pt.wikipedia.org/wiki/LLVM) (ou representação intermediária de código [LLVM](https://pt.wikipedia.org/wiki/LLVM)), que pode ser usada para gerar executáveis, seja em qualquer sistema operacional, seja em certos dispositivos específicos. \n\nFunciona apenas com Node.js.\n\n## Pré-requisitos\n\n- [Node.js](https://nodejs.org/pt), pelo menos a versão LTS;\n- [Yarn](https://yarnpkg.com/);\n- [CMake](https://cmake.org/);\n- [LLVM](https://llvm.org/);\n\nÉ 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 e configurar essas dependências.\n\nApós instalar qualquer versão do Node.js, o Yarn pode ser instalado usando o seguinte comando:\n\n```sh\nnpm i -g yarn\n```\n\n### Instalação para Linux\n\nO script de instalação abaixo supõe uma distribuição Linux compatível com Ubuntu e Debian:\n\n```sh\n# Descarregar o script de instalação do LLVM\nwget https://apt.llvm.org/llvm.sh\nsudo chmod +x llvm.sh\nsudo ./llvm.sh 17\n\n# Instalar bibliotecas dependentes\nsudo apt-get install cmake zlib1g-dev\n\n# Após clonar este projeto, navegar para o diretório raiz e usar o comando\nyarn\n```\n\n### Instalação para Mac\n\n```sh\n# O comando abaixo supõe que o Homebrew está instalado.\n# Se você não sabe o que é o Homebrew, acesse: https://brew.sh/\nbrew install cmake llvm@17\n\n# O Homebrew deve pedir para executar os comandos abaixo:\necho 'export PATH=\"/opt/homebrew/opt/llvm@17/bin:$PATH\"' \u003e\u003e ~/.zshrc\nsource ~/.zshrc\n\n# Após clonar este projeto, navegar para o diretório raiz e usar o comando\nyarn\n```\n\n### Instalação para Windows\n\nTemos dois outros projetos, [`llvm-bindings`](https://github.com/DesignLiquido/llvm-bindings) e [`llvm-windows`](https://github.com/DesignLiquido/llvm-windows), justamente para suportar essa instalação para Windows. Todo lançamento de versão em `llvm-windows` é feito a partir de uma versão do LLVM compilada no GitHub, e o `llvm-bindings` é atualizado para suportar essa versão. Por isso, é importante [seguir a paridade de versões entre os dois projetos](https://github.com/DesignLiquido/llvm-bindings?tab=readme-ov-file#compatibility). Toda versão maior deste projeto segue a mesma versão maior do `llvm-bindings`, e toda versão menor deste projeto segue a mesma versão menor do `llvm-bindings`.\n\nComo exemplo, digamos que você quer instalar a versão 4 deste pacote, cuja paridade com `llvm-bindings` também é a versão 4. `llvm-bindings` na versão 4 utiliza o LLVM 17. A versão correspondente do `llvm-windows` é a versão 17.0.6, [listada aqui](https://github.com/DesignLiquido/llvm-windows/releases). Baixe o arquivo zip correspondente e descompacte o arquivo em um diretório qualquer (por exemplo, `C:\\Estudos`). No exemplo do LLVM 17, o diretório descompactado deve ser `C:\\Estudos\\LLVM-17.0.6-win64`. Dentro deste diretório, deve haver um subdiretório `bin`, ou seja, `C:\\Estudos\\LLVM-17.0.6-win64\\bin`, que contém os arquivos executáveis do LLVM, como `clang.exe` e `opt.exe`.\n\nAdicione 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 o diretório do `llvm-windows` que baixamos, estes arquivos vivem dentro do subdiretório `lib\\cmake\\llvm`. No nosso exemplo, `C:\\Estudos\\LLVM-17.0.6-win64\\lib\\cmake\\llvm`.\n\n#### Alternativa: compilando fontes do LLVM\n\nVocê precisará baixar os fontes do projeto ([link direto aqui](https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-17.0.6.zip)), o instalador do CMake, que [pode ser a versão mais recente](https://cmake.org/download/) com todas as opções padrão marcadas no instalador, e algum Visual Studio versões 2022 ou mais recente. [Há uma versão Community que é gratuita](https://visualstudio.microsoft.com/vs/community/). Ao executar o instalador do Visual Studio, marque a opção \"Desenvolvimento em Desktop com C++\" (ou, em inglês, _\"Desktop Development with C++\"_).\n\nBaixado o LLVM e instalados Visual Studio Code e CMake, 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-17.0.6`) e dentro deve haver um diretório `llvm`, ou seja, `C:\\Estudos\\llvm-project-llvmorg-17.0.6\\llvm`. Neste diretório, execute os seguintes comandos:\n\n```powershell\nmkdir build\ncd build\n# Compila para x64\ncmake -Thost=x64 -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_INCLUDE_TESTS=OFF ..\ncmake --build . --config Release\n```\n\nApós esses comandos, uma versão funcional do LLVM estará no diretório `C:\\Estudos\\llvm-project-llvmorg-17.0.6\\llvm\\build\\Release\\bin`.\n\nAdicione 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 LLVM que baixamos, estes arquivos vivem dentro do subdiretório `llvm\\build\\lib\\cmake\\llvm`. No nosso exemplo, `C:\\Estudos\\llvm-project-llvmorg-17.0.6\\llvm\\build\\lib\\cmake\\llvm`.\n\n#### Verificando a instalação\n\nSeja qual for a forma que você escolheu para instalar o LLVM, é importante verificar se a instalação foi bem-sucedida. Para isso, abra um terminal (Prompt de Comando ou PowerShell) e execute os seguintes comandos:\n\n```powershell\nclang --version\nopt --version\n```\n\nSe ambos imprimirem informações sobre a versão do LLVM, então a instalação foi bem-sucedida e o `PATH` do sistema está configurado corretamente.\n\nO `cmake-js` precisa estar instalado globalmente e visível no `PATH` do sistema para que o CMake consiga localizá-lo durante a construção do pacote nativo (`llvm-bindings.node`). Após instalar com `yarn global add cmake-js`, certifique-se de que o diretório de binários globais do Yarn (ex.: `%LOCALAPPDATA%\\Yarn\\bin`) esteja no `PATH` do sistema.\n\n```powershell\nyarn global add cmake-js\nyarn\n```\n\nA instalação e construção de pacotes deve ocorrer sem erros.\n\n## Compilando seu programa para código de máquina\n\nPara compilar seu código para código de máquina, utilizamos o [Clang](https://clang.llvm.org/), que é o compilador do LLVM para C e C++.\n\nO comando para compilar seu programa Delégua já convertido para LLVM é:\n\n```sh\nclang meu_programa.ll -o meu_programa\n```\n\n## Considerações na compilação\n\nTodo 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. Certos literais, como números, têm o tipo deduzido de acordo com o local onde são usados, e algumas conversões são implícitas: por exemplo, `1` pode ser um número inteiro ou um número real (com parte decimal). \n\nDelé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.\n\nTodo 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](https://llvm.org/docs/CommandGuide/opt.html), usando, por exemplo:\n\n```sh\nopt -S meu_programa.ll \u003e meu_programa.otimizado.ll\n```\n\n## Contribuindo\n\n- Nomes de variáveis, comentários e documentação devem estar em português, pois o projeto é em português.\n- Utilize o Yarn como gerenciador de pacotes. Não utilize o `npm` diretamente.\n\n## Inspiração\n\n- https://mcyoung.xyz/2023/08/01/llvm-ir/ (em inglês)\n- https://mukulrathi.com/create-your-own-programming-language/llvm-ir-cpp-api-tutorial/ (em inglês)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdesignliquido%2Fdelegua-llvm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdesignliquido%2Fdelegua-llvm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdesignliquido%2Fdelegua-llvm/lists"}