DEV Community

Rodrigo Sicarelli
Rodrigo Sicarelli

Posted on • Edited on

KMP 101: Entendendo como o Kotlin compila para múltiplas plataformas

No último post (🔗 KMP 101: Introdução ao paradigma da multiplataforma), exploramos o paradigma multiplataforma e como o KMP se destaca no ecossistema.

Neste artigo, vamos desvendar os conceitos básicos do compilador Kotlin e sua capacidade de compilar para múltiplas plataformas.


Introdução ao compilador do Kotlin

Um compilador é um software que converte código de uma linguagem de programação para outra. Frequentemente, os compiladores são utilizados para transformar programas de linguagens de alto nível em linguagens de baixo nível.

O Kotlin, assim como alguns outros compiladores como LLVM e GCC, possui uma arquitetura dividida em frontend e backend, comunicando-se por uma Representação Intermediária (IR).

Entendendo o Frontend do compilador do Kotlin

Responsável por analisar e preparar o código-fonte .kt para a compilação, o Kotlin apresenta duas versões de frontends: o K1 e o K2.

K1: codinome FE10 (Frontend 1.0)

O frontend K1, também conhecido como FE10, é o frontend original do compilador Kotlin e é o padrão utilizado na atualidade.

Principais características:

  • Análise Léxica (Lexer): divide o código-fonte Kotlin em tokens, elementos fundamentais para a construção da linguagem.
  • Análise Sintática (Parser): organiza os tokens em uma estrutura sintática, geralmente uma árvore de análise sintática (AST), que representa a estrutura lógica do código.
  • Árvores PSI/AST: utiliza a Abstract Syntax Tree (AST) e a Program Structure Interface (PSI) para representar e manipular a estrutura do código, essencial para análises subsequentes.
  • Análise Semântica: verifica a corretude do uso dos elementos da linguagem, como tipos e escopos, garantindo que o código segue as regras semânticas do Kotlin.

Frontend K1

K2: codinome FIR (Frontend Intermediate Representation)

O K2, também conhecido como FIR, é a próxima grande atualização do compilador do Kotlin e promete ser o substituto do K1/FE10.

A primeira versão beta do K2 chegou com o Kotlin 1.9.20, lançada em novembro de 2023, e a versão final está planejada para o Kotlin 2.0.0, que esperamos para 2024. Esse novo sistema traz várias melhorias importantes, como mais velocidade, uma estrutura mais organizada e uma maneira mais clara de entender o código.

KotlinConf2023 K1 vs K2

Dados do KotlinConf’23 - Keynote

Listando algumas dessas melhorias:

  • Totalmente renovado: o K2 foi feito do zero, pensando em ser rápido e fácil de atualizar no futuro.
  • Melhor análise de código: possui um método mais avançado para verificar o código, ajudando a identificar e usar informações importantes de maneira mais inteligente.
  • Suporte a plugins: inclui suporte a uma variedade de plugins, como kapt, serialization, all-open, e outros.
  • Compatibilidade entre plataformas: suporta JVM, Native, Wasm, e JS, otimizado para projetos multiplataforma.

Frontend K2 FIR

Entendendo o Backend do compilador do Kotlin

Após o processamento e preparação do código-fonte pelo frontend de um compilador, o backend assume um papel crucial.

O backend é responsável por converter a representação intermediária (IR) em código de máquina, realizando otimizações e gerando a saída específica para a plataforma alvo (como *.class, *.js, *.so, *.wasm).

Projetado para ser multiplataforma, o Kotlin pode ser compilado para funcionar em diversos dispositivos e sistemas operacionais. Cada backend do compilador Kotlin é especialmente otimizado para uma plataforma-alvo, possibilitando que devs escrevam um código que pode ser executado em variados ambientes.

  • Kotlin/JVM: este backend é o mais tradicional e gera bytecode compatível com a Máquina Virtual Java (JVM). É ideal para aplicações que serão executadas em ambientes que suportam a JVM, incluindo Android, Desktop e aplicações de servidor.
  • Kotlin/Native: utilizando a toolchain do LLVM, este backend compila o código Kotlin diretamente para código de máquina nativo. Ele suporta uma ampla gama de plataformas, como iOS, macOS, Windows, Linux e sistemas embarcados, permitindo que aplicações sejam executadas diretamente no hardware.
  • Kotlin/JS: especializado para o desenvolvimento web, este backend converte o código Kotlin em JavaScript, tornando-o compatível com navegadores web e ambientes de servidor baseados em JavaScript, como Node.js.
  • Kotlin/Wasm: uma adição mais recente ainda em fase de desenvolvimento, este backend permite a compilação de Kotlin para WebAssembly (Wasm), facilitando a execução de aplicações Kotlin com alto desempenho em navegadores web.

Desenvolvimento nativo

Representação Intermediária ou Intermediary Representation (IR)

O IR é uma forma de representar o código-fonte dentro do compilador que é independente tanto da linguagem de programação de origem quanto da arquitetura da máquina de destino. Ela serve como um meio-termo entre o código de alto nível e o código de máquina de baixo nível.

Essa estrutura de dados permite que o compilador Kotlin manipule o código de maneira mais abstrata, facilitando a geração de código para múltiplas plataformas. Isso é particularmente benéfico para Kotlin, projetado para ser multiplataforma.

Conclusões

Entender como o Kotlin compila para diferentes plataformas não é nada que você precise fazer diariamente ou memorizar. No entanto, ter uma visão geral desse processo tem suas vantagens.

Esse entendimento fornece uma perspectiva sobre a versatilidade e a eficiência do Kotlin, oferecendo a você a confiança de que seu código pode operar em vários ecossistemas. Além disso, uma apreciação básica do que acontece "por debaixo dos panos" pode ser incrivelmente útil ao depurar o código e compreender mensagens de erro, economizando horas de frustração.


🤖 Artigo foi escrito com o auxílio do ChatGPT 4, utilizando o plugin Web.

As fontes e o conteúdo são revisados para garantir a relevância das informações fornecidas, assim como as fontes utilizadas em cada prompt.

No entanto, caso encontre alguma informação incorreta ou acredite que algum crédito está faltando, por favor, entre em contato!


Referencias

Top comments (0)