Pesquisa

Todos os tópicos que abrangem as grandes áreas de compiladores e arquitetura de computadores são bem vindos. Podemos trabalhar em vários níveis de abstração, desde o algoritmo e sistema até o dispositivo e unidades funcionais.

Caso tenha interesse em propor um novo tópico de pesquisa, correlato aos tópicos atuais, ou não, entre em contato.


Compiladores

A pesquisa em compiladores é essencial para o avanço da infraestrutura de software que sustenta sistemas computacionais modernos, atuando como elo entre linguagens de alto nível e arquiteturas de execução cada vez mais heterogêneas. O desenvolvimento de novas técnicas de análise estática, otimização e geração de código permite explorar de forma eficiente recursos de processadores multicore, aceleradores especializados e arquiteturas emergentes, além de garantir corretude, portabilidade e desempenho. Nesse contexto, a investigação de novas metodologias e representações intermediárias contribui para ampliar a capacidade dos compiladores de atender às demandas de aplicações de alto desempenho, inteligência artificial, sistemas embarcados e computação de larga escala.

Alguns tópicos que podemos listar são:

  • infraestrutura LLVM e MLIR
  • Otimizações em linguagens atuais
  • Aperfeiçoar linguagens de programação com features que incluem, por exemplo, segurança (safe languages)
  • Explorar novos conceitos em linguagens de programação
  • Aplicar conceitos de um paradigma de programação a outro (funcional para imperativo)

Computação de Alto Desempenho

Computação de alto desempenho é agregar poder computacional, seja por aceleradores como GPUs ou apenas multicore/manycore, de maneira que o sistema final possa resolver problemas computacionais de grande escala (ou extremamente complexos).

Aplicações científicas, por exemplo, precisam resolver problemas cada vez maiores e mais difíceis. Por outro lado, aplicações como carros autônomos precisam processar uma grande quantidade de dados, de sensores e câmeras, em tempo real.

Entre os principais tópicos, podemos listar os seguintes:

  • Arquiteturas avançadas/paralelas: GPU, FPGA, TPU, ...
  • Linguagens de programação paralela
  • Frameworks de programação paralela
  • Análise/Modelagem de desempenho (tempo de execução, consumo energético, taxa de falhas)
  • Resiliência e correção de erros

Ideias de projetos para Trabalho de Conclusão de Curso (TCC) ou Iniciação Científica (IC)

  • Criar uma Domain Specific Language (DSL), escolher um domínio que goste e simplificar e otimizar a programação nesse domínio
  • Fazer um compilador para uma arquitetura alvo (target) específica, que pode ser exótica, inovadora, educacional e etc.
  • Implementar algumas análises no código, como liveness
  • Implementar algumas otimizações, como Dead Code Elimination e Common Subexpression Elimination
  • Explorar otimizações de cauda (tail-call), detecção e otimização
  • Explorar inferência de tipos e enrobustecer o sistema de tipos de alguma linguagem
  • Explorar otimizações sobre paralelismo e ambientes de execução de alto desempenho
  • Estudar Just in Time (JIT) ou compilar linguagens interpretadas
  • Estudar a infraestrutura LLVM e MLIR (otimizações, ambientes heterogêneos, ...)
  • Explorar outras formas de representação intermediária (IR) e o impacto nas fases de compilação
  • Comparar e explorar Static Single-Assignment (SSA) versus outras formas
  • Incorporar ideias de linguagens de outros paradigmas, como funcional em imperativas