Skip to content
← Todos os posts

KMP 101 · Parte 2

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

Por 4 min de leitura Atualizado

↗ Código-fonte

Nesta página

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.


Referencias

O que você achou?

↩ Voltar à visão geral da série

Comentários